plugin-backend #1

Merged
ada merged 34 commits from plugin-backend into main 2024-05-01 00:21:12 -05:00
184 changed files with 3631 additions and 1159 deletions

1
.gitignore vendored
View File

@ -7,3 +7,4 @@ settings.json
**/node_modules/** **/node_modules/**
**/dist/** **/dist/**
spoiler.json spoiler.json
**/dotnet-tools.json

View File

@ -1,4 +1,5 @@
asgiref==3.7.2 asgiref==3.7.2
autopep8==2.0.4
certifi==2024.2.2 certifi==2024.2.2
charset-normalizer==3.3.2 charset-normalizer==3.3.2
click==8.1.7 click==8.1.7
@ -6,6 +7,9 @@ colorama==0.4.6
cssbeautifier==1.15.1 cssbeautifier==1.15.1
Django==5.0.3 Django==5.0.3
django-browser-reload==1.12.1 django-browser-reload==1.12.1
django-tailwind==3.8.0
djangorestframework==3.15.1
djlint==1.34.1
EditorConfig==0.12.4 EditorConfig==0.12.4
gunicorn==21.2.0 gunicorn==21.2.0
html-tag-names==0.1.2 html-tag-names==0.1.2
@ -16,7 +20,10 @@ json5==0.9.22
numpy==1.26.4 numpy==1.26.4
packaging==23.2 packaging==23.2
pathspec==0.12.1 pathspec==0.12.1
pillow==10.3.0
pyarrow==15.0.1
pycodestyle==2.11.1 pycodestyle==2.11.1
pylance==0.10.2
PyYAML==6.0.1 PyYAML==6.0.1
regex==2023.12.25 regex==2023.12.25
requests==2.31.0 requests==2.31.0

View File

@ -0,0 +1,23 @@
{
"found": 0,
"remaining": 0,
"total": 1312,
"scenes": {
"mystery": {
"found": 0,
"remaining": 0,
"total": 0,
"doors": {
"Door To Light": { "scene": "???", "door": "Door To Darkness" }
}
},
"Another One": {
"found": 69,
"remaining": 0,
"total": 420,
"doors": {
"Door To Darkness": { "scene": "???", "door": "Door To Light" }
}
}
}
}

View File

@ -0,0 +1,3 @@
{
"???": "There is no spoon (but in trunic)"
}

View File

@ -0,0 +1,26 @@
{
"collected": 0,
"found": 0,
"remaining": 0,
"total": 1312,
"scenes": {
"mystery": {
"collected": 0,
"found": 0,
"remaining": 0,
"total": 0,
"checks": {
"It is a mystery": { "name": "", "owner": "" }
}
},
"Another One": {
"collected": 69,
"found": 0,
"remaining": 0,
"total": 420,
"checks": {
"nini time mister the missile": { "name": "", "owner": "" }
}
}
}
}

View File

@ -0,0 +1,14 @@
{
"scene": "mystery",
"seed": 0,
"items": 1312,
"entrances": 1312,
"hints": 0,
"codes": {
"it is a mystery": {
"Distance": 0,
"Global": false,
"InRange": false
}
}
}

View File

@ -1,38 +0,0 @@
{
"Debug": {
"Name": "",
"Seed": "",
"SpoilerSeed": "",
"Archipelago": false,
"Randomized": false,
"HexQuest": false,
"EntranceRando": false,
"FixedShops": false
},
"Totals": {
"Entrances": { "Total": 0, "Undiscovered": 0 },
"Checks": { "Total": 0, "Undiscovered": 0 }
},
"Current": {
"Scene": "No Scene",
"Respawn": "",
"Dath": "",
"HasLaurels": false,
"HasDath": false
},
"Scenes": {
"No Scene": {
"Totals": {
"Entrances": { "Total": 0, "Undiscovered": 0 },
"Checks": { "Total": 0, "Undiscovered": 0 }
},
"Checks": {},
"Entrances": {}
}
},
"Codes": {
"None": {
"None": ""
}
}
}

View File

@ -0,0 +1,643 @@
{
"found": 0,
"remaining": 216,
"total": 216,
"scenes": {
"Beneath the Fortress": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Beneath the Earth to Fortress Courtyard": { "scene": "", "door": "" },
"Beneath the Earth to Fortress Interior": { "scene": "", "door": "" }
}
},
"Beneath the Well": {
"found": 0,
"remaining": 3,
"total": 3,
"doors": {
"Well Exit towards Furnace": { "scene": "", "door": "" },
"Well Ladder Exit": { "scene": "", "door": "" },
"Well to Well Boss": { "scene": "", "door": "" }
}
},
"Cathedral": {
"found": 0,
"remaining": 3,
"total": 3,
"doors": {
"Cathedral Elevator": { "scene": "", "door": "" },
"Cathedral Main Exit": { "scene": "", "door": "" },
"Cathedral Secret Legend Room Exit": { "scene": "", "door": "" }
}
},
"Cathedral Gauntlet": {
"found": 0,
"remaining": 3,
"total": 3,
"doors": {
"Gauntlet Elevator": { "scene": "", "door": "" },
"Gauntlet Shop": { "scene": "", "door": "" },
"Gauntlet to Swamp": { "scene": "", "door": "" }
}
},
"Caustic Light Cave": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Caustic Light Cave Exit": { "scene": "", "door": "" } }
},
"Changing Room": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Changing Room Exit": { "scene": "", "door": "" } }
},
"Coins in the Well": {
"found": 0,
"remaining": 0,
"total": 0,
"doors": {}
},
"Cube Cave": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Cube Cave Exit": { "scene": "", "door": "" } }
},
"Dark Tomb": {
"found": 0,
"remaining": 3,
"total": 3,
"doors": {
"Dark Tomb to Checkpoint": { "scene": "", "door": "" },
"Dark Tomb to Furnace": { "scene": "", "door": "" },
"Dark Tomb to Overworld": { "scene": "", "door": "" }
}
},
"Dark Tomb Checkpoint": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Checkpoint to Dark Tomb": { "scene": "", "door": "" },
"Well Boss to Well": { "scene": "", "door": "" }
}
},
"East Forest": {
"found": 0,
"remaining": 9,
"total": 9,
"doors": {
"Forest Dance Fox Outside Doorway": { "scene": "", "door": "" },
"Forest Grave Path Lower Entrance": { "scene": "", "door": "" },
"Forest Grave Path Upper Entrance": { "scene": "", "door": "" },
"Forest Guard House 1 Gate Entrance": { "scene": "", "door": "" },
"Forest Guard House 1 Lower Entrance": { "scene": "", "door": "" },
"Forest Guard House 2 Lower Entrance": { "scene": "", "door": "" },
"Forest Guard House 2 Upper Entrance": { "scene": "", "door": "" },
"Forest to Belltower": { "scene": "", "door": "" },
"Forest to Far Shore": { "scene": "", "door": "" }
}
},
"Eastern Vault Fortress": {
"found": 0,
"remaining": 6,
"total": 6,
"doors": {
"Fortress Interior Main Exit": { "scene": "", "door": "" },
"Fortress Interior Shop": { "scene": "", "door": "" },
"Fortress Interior to Beneath the Earth": { "scene": "", "door": "" },
"Fortress Interior to East Fortress Lower": { "scene": "", "door": "" },
"Fortress Interior to East Fortress Upper": { "scene": "", "door": "" },
"Fortress Interior to Siege Engine Arena": { "scene": "", "door": "" }
}
},
"Far Shore": {
"found": 0,
"remaining": 10,
"total": 10,
"doors": {
"Far Shore to Atoll": { "scene": "", "door": "" },
"Far Shore to East Forest": { "scene": "", "door": "" },
"Far Shore to Fortress": { "scene": "", "door": "" },
"Far Shore to Heir": { "scene": "", "door": "" },
"Far Shore to Library": { "scene": "", "door": "" },
"Far Shore to Quarry": { "scene": "", "door": "" },
"Far Shore to Spawn": { "scene": "", "door": "" },
"Far Shore to Town": { "scene": "", "door": "" },
"Far Shore to West Garden": { "scene": "", "door": "" },
"Far Shore to Ziggurat": { "scene": "", "door": "" }
}
},
"Forest Belltower": {
"found": 0,
"remaining": 4,
"total": 4,
"doors": {
"Forest Belltower to Forest": { "scene": "", "door": "" },
"Forest Belltower to Fortress": { "scene": "", "door": "" },
"Forest Belltower to Guard Captain Room": { "scene": "", "door": "" },
"Forest Belltower to Overworld": { "scene": "", "door": "" }
}
},
"Forest Boss Room": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Guard Captain Room Gate Exit": { "scene": "", "door": "" },
"Guard Captain Room Non-Gate Exit": { "scene": "", "door": "" }
}
},
"Forest Grave Path": {
"found": 0,
"remaining": 3,
"total": 3,
"doors": {
"East Forest Hero's Grave": { "scene": "", "door": "" },
"Forest Grave Path Lower Exit": { "scene": "", "door": "" },
"Forest Grave Path Upper Exit": { "scene": "", "door": "" }
}
},
"Fortress Arena": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Fortress to Far Shore": { "scene": "", "door": "" },
"Siege Engine Arena to Fortress": { "scene": "", "door": "" }
}
},
"Fortress Courtyard": {
"found": 0,
"remaining": 8,
"total": 8,
"doors": {
"Fortress Courtyard Shop": { "scene": "", "door": "" },
"Fortress Courtyard to Beneath the Earth": { "scene": "", "door": "" },
"Fortress Courtyard to East Fortress": { "scene": "", "door": "" },
"Fortress Courtyard to Forest Belltower": { "scene": "", "door": "" },
"Fortress Courtyard to Fortress Grave Path Lower": {
"scene": "",
"door": ""
},
"Fortress Courtyard to Fortress Grave Path Upper": {
"scene": "",
"door": ""
},
"Fortress Courtyard to Fortress Interior": { "scene": "", "door": "" },
"Fortress Courtyard to Overworld": { "scene": "", "door": "" }
}
},
"Fortress East Shortcut": {
"found": 0,
"remaining": 3,
"total": 3,
"doors": {
"East Fortress to Courtyard": { "scene": "", "door": "" },
"East Fortress to Interior Lower": { "scene": "", "door": "" },
"East Fortress to Interior Upper": { "scene": "", "door": "" }
}
},
"Fortress Grave Path": {
"found": 0,
"remaining": 4,
"total": 4,
"doors": {
"Fortress Grave Path Dusty Entrance": { "scene": "", "door": "" },
"Fortress Grave Path Lower Exit": { "scene": "", "door": "" },
"Fortress Grave Path Upper Exit": { "scene": "", "door": "" },
"Fortress Hero's Grave": { "scene": "", "door": "" }
}
},
"Fortress Leaf Piles": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Dusty Exit": { "scene": "", "door": "" } }
},
"Fountain Cross Room": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Fountain HC Room Exit": { "scene": "", "door": "" } }
},
"Frog Stairway": {
"found": 0,
"remaining": 4,
"total": 4,
"doors": {
"Frog Stairs Eye Exit": { "scene": "", "door": "" },
"Frog Stairs Mouth Exit": { "scene": "", "door": "" },
"Frog Stairs to Frog's Domain's Entrance": { "scene": "", "door": "" },
"Frog Stairs to Frog's Domain's Exit": { "scene": "", "door": "" }
}
},
"Frog's Domain": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Frog's Domain Ladder Exit": { "scene": "", "door": "" },
"Frog's Domain Orb Exit": { "scene": "", "door": "" }
}
},
"Glyph Tower": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Glyph Tower Exit": { "scene": "", "door": "" } }
},
"Guardhouse 1": {
"found": 0,
"remaining": 4,
"total": 4,
"doors": {
"Guard House 1 Dance Fox Exit": { "scene": "", "door": "" },
"Guard House 1 Lower Exit": { "scene": "", "door": "" },
"Guard House 1 to Guard Captain Room": { "scene": "", "door": "" },
"Guard House 1 Upper Forest Exit": { "scene": "", "door": "" }
}
},
"Guardhouse 2": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Guard House 2 Lower Exit": { "scene": "", "door": "" },
"Guard House 2 Upper Exit": { "scene": "", "door": "" }
}
},
"Hero's Grave": {
"found": 0,
"remaining": 6,
"total": 6,
"doors": {
"Hero's Grave to East Forest": { "scene": "", "door": "" },
"Hero's Grave to Fortress": { "scene": "", "door": "" },
"Hero's Grave to Library": { "scene": "", "door": "" },
"Hero's Grave to Monastery": { "scene": "", "door": "" },
"Hero's Grave to Swamp": { "scene": "", "door": "" },
"Hero's Grave to West Garden": { "scene": "", "door": "" }
}
},
"Hourglass Cave": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Hourglass Cave Exit": { "scene": "", "door": "" } }
},
"Librarian": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Librarian Arena Exit": { "scene": "", "door": "" } }
},
"Library Exterior": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Library Exterior Ladder": { "scene": "", "door": "" },
"Library Exterior Tree": { "scene": "", "door": "" }
}
},
"Library Hall": {
"found": 0,
"remaining": 3,
"total": 3,
"doors": {
"Library Hall Bookshelf Exit": { "scene": "", "door": "" },
"Library Hall to Rotunda": { "scene": "", "door": "" },
"Library Hero's Grave": { "scene": "", "door": "" }
}
},
"Library Lab": {
"found": 0,
"remaining": 3,
"total": 3,
"doors": {
"Library Lab to Librarian Arena": { "scene": "", "door": "" },
"Library Lab to Rotunda": { "scene": "", "door": "" },
"Library to Far Shore": { "scene": "", "door": "" }
}
},
"Library Rotunda": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Library Rotunda Lower Exit": { "scene": "", "door": "" },
"Library Rotunda Upper Exit": { "scene": "", "door": "" }
}
},
"Loading": { "found": 0, "remaining": 0, "total": 0, "doors": {} },
"Lower Mountain": {
"found": 0,
"remaining": 3,
"total": 3,
"doors": {
"Mountain to Overworld": { "scene": "", "door": "" },
"Mountain to Quarry": { "scene": "", "door": "" },
"Stairs to Top of the Mountain": { "scene": "", "door": "" }
}
},
"Maze Cave": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Maze Cave Exit": { "scene": "", "door": "" } }
},
"Monastery": {
"found": 0,
"remaining": 3,
"total": 3,
"doors": {
"Monastery Front Exit": { "scene": "", "door": "" },
"Monastery Hero's Grave": { "scene": "", "door": "" },
"Monastery Rear Exit": { "scene": "", "door": "" }
}
},
"Old House": {
"found": 0,
"remaining": 3,
"total": 3,
"doors": {
"Old House Door Exit": { "scene": "", "door": "" },
"Old House to Glyph Tower": { "scene": "", "door": "" },
"Old House Waterfall Exit": { "scene": "", "door": "" }
}
},
"Overworld": {
"found": 0,
"remaining": 39,
"total": 39,
"doors": {
"Atoll Lower Entrance": { "scene": "", "door": "" },
"Atoll Upper Entrance": { "scene": "", "door": "" },
"Caustic Light Cave Entrance": { "scene": "", "door": "" },
"Changing Room Entrance": { "scene": "", "door": "" },
"Cube Cave Entrance": { "scene": "", "door": "" },
"Dark Tomb Main Entrance": { "scene": "", "door": "" },
"Entrance to Furnace from Beach": { "scene": "", "door": "" },
"Entrance to Furnace from Well Rail": { "scene": "", "door": "" },
"Entrance to Furnace near West Garden": { "scene": "", "door": "" },
"Entrance to Furnace under Windmill": { "scene": "", "door": "" },
"Entrance to Well from Well Rail": { "scene": "", "door": "" },
"Fountain HC Door Entrance": { "scene": "", "door": "" },
"Hourglass Cave Entrance": { "scene": "", "door": "" },
"Maze Cave Entrance": { "scene": "", "door": "" },
"Old House Door Entrance": { "scene": "", "door": "" },
"Old House Waterfall Entrance": { "scene": "", "door": "" },
"Overworld to Forest Belltower": { "scene": "", "door": "" },
"Overworld to Fortress": { "scene": "", "door": "" },
"Overworld to Quarry Connector": { "scene": "", "door": "" },
"Patrol Cave Entrance": { "scene": "", "door": "" },
"Ruined Passage Door Entrance": { "scene": "", "door": "" },
"Ruined Passage Not-Door Entrance": { "scene": "", "door": "" },
"Ruined Shop Entrance": { "scene": "", "door": "" },
"Secret Gathering Place Entrance": { "scene": "", "door": "" },
"Southeast HC Door Entrance": { "scene": "", "door": "" },
"Spawn to Far Shore": { "scene": "", "door": "" },
"Special Shop Entrance": { "scene": "", "door": "" },
"Stairs from Overworld to Mountain": { "scene": "", "door": "" },
"Stick House Entrance": { "scene": "", "door": "" },
"Swamp Lower Entrance": { "scene": "", "door": "" },
"Swamp Upper Entrance": { "scene": "", "door": "" },
"Temple Door Entrance": { "scene": "", "door": "" },
"Temple Rafters Entrance": { "scene": "", "door": "" },
"Town to Far Shore": { "scene": "", "door": "" },
"Well Ladder Entrance": { "scene": "", "door": "" },
"West Garden Entrance from Furnace": { "scene": "", "door": "" },
"West Garden Entrance near Belltower": { "scene": "", "door": "" },
"West Garden Laurels Entrance": { "scene": "", "door": "" },
"Windmill Entrance": { "scene": "", "door": "" }
}
},
"Patrol Cave": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Guard Patrol Cave Exit": { "scene": "", "door": "" } }
},
"Posterity": { "found": 0, "remaining": 0, "total": 0, "doors": {} },
"Purgatory": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Purgatory Bottom Exit": { "scene": "", "door": "" },
"Purgatory Top Exit": { "scene": "", "door": "" }
}
},
"Quarry": {
"found": 0,
"remaining": 7,
"total": 7,
"doors": {
"Quarry Shop": { "scene": "", "door": "" },
"Quarry to Far Shore": { "scene": "", "door": "" },
"Quarry to Monastery Back": { "scene": "", "door": "" },
"Quarry to Monastery Front": { "scene": "", "door": "" },
"Quarry to Mountain": { "scene": "", "door": "" },
"Quarry to Overworld Exit": { "scene": "", "door": "" },
"Quarry to Ziggurat": { "scene": "", "door": "" }
}
},
"Quarry Entryway": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Quarry Connector to Overworld": { "scene": "", "door": "" },
"Quarry Connector to Quarry": { "scene": "", "door": "" }
}
},
"Resurrection": { "found": 0, "remaining": 0, "total": 0, "doors": {} },
"Rooted Ziggurat Entrance": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Ziggurat Entry Hallway to Quarry": { "scene": "", "door": "" },
"Ziggurat Entry Hallway to Ziggurat Upper": { "scene": "", "door": "" }
}
},
"Rooted Ziggurat Lower": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Ziggurat Lower to Ziggurat Tower": { "scene": "", "door": "" },
"Ziggurat Portal Room Entrance": { "scene": "", "door": "" }
}
},
"Rooted Ziggurat Teleporter": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Ziggurat Portal Room Exit": { "scene": "", "door": "" },
"Ziggurat to Far Shore": { "scene": "", "door": "" }
}
},
"Rooted Ziggurat Tower": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Ziggurat Tower to Ziggurat Lower": { "scene": "", "door": "" },
"Ziggurat Tower to Ziggurat Upper": { "scene": "", "door": "" }
}
},
"Rooted Ziggurat Upper": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Ziggurat Upper to Ziggurat Entry Hallway": { "scene": "", "door": "" },
"Ziggurat Upper to Ziggurat Tower": { "scene": "", "door": "" }
}
},
"Ruined Atoll": {
"found": 0,
"remaining": 7,
"total": 7,
"doors": {
"Atoll Lower Exit": { "scene": "", "door": "" },
"Atoll Shop": { "scene": "", "door": "" },
"Atoll Statue Teleporter": { "scene": "", "door": "" },
"Atoll to Far Shore": { "scene": "", "door": "" },
"Atoll Upper Exit": { "scene": "", "door": "" },
"Frog Stairs Eye Entrance": { "scene": "", "door": "" },
"Frog Stairs Mouth Entrance": { "scene": "", "door": "" }
}
},
"Ruined Passage": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Ruined Passage Door Exit": { "scene": "", "door": "" },
"Ruined Passage Not-Door Exit": { "scene": "", "door": "" }
}
},
"Ruined Shop": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Ruined Shop Exit": { "scene": "", "door": "" } }
},
"Sealed Temple": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Temple Door Exit": { "scene": "", "door": "" },
"Temple Rafters Exit": { "scene": "", "door": "" }
}
},
"Secret Gathering Place": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Secret Gathering Place Exit": { "scene": "", "door": "" } }
},
"Shop": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": { "Shop Portal": { "scene": "", "door": "" } }
},
"Southeast Cross Room": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Southeast HC Room Exit": { "scene": "", "door": "" } }
},
"Special Shop": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Special Shop Exit": { "scene": "", "door": "" } }
},
"Stick House": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Stick House Exit": { "scene": "", "door": "" } }
},
"Swamp": {
"found": 0,
"remaining": 7,
"total": 7,
"doors": {
"Swamp Hero's Grave": { "scene": "", "door": "" },
"Swamp Lower Exit": { "scene": "", "door": "" },
"Swamp Shop": { "scene": "", "door": "" },
"Swamp to Cathedral Main Entrance": { "scene": "", "door": "" },
"Swamp to Cathedral Secret Legend Room Entrance": {
"scene": "",
"door": ""
},
"Swamp to Gauntlet": { "scene": "", "door": "" },
"Swamp Upper Exit": { "scene": "", "door": "" }
}
},
"The Heir": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Heir Arena Exit": { "scene": "", "door": "" } }
},
"Top of the Mountain": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Top of the Mountain Exit": { "scene": "", "door": "" } }
},
"West Furnace": {
"found": 0,
"remaining": 5,
"total": 5,
"doors": {
"Furnace Exit to Beach": { "scene": "", "door": "" },
"Furnace Exit to Dark Tomb": { "scene": "", "door": "" },
"Furnace Exit towards Well": { "scene": "", "door": "" },
"Furnace Exit towards West Garden": { "scene": "", "door": "" },
"Furnace Exit under Windmill": { "scene": "", "door": "" }
}
},
"West Garden": {
"found": 0,
"remaining": 7,
"total": 7,
"doors": {
"West Garden Exit after Boss": { "scene": "", "door": "" },
"West Garden Exit near Hero's Grave": { "scene": "", "door": "" },
"West Garden Hero's Grave": { "scene": "", "door": "" },
"West Garden Laurels Exit": { "scene": "", "door": "" },
"West Garden Shop": { "scene": "", "door": "" },
"West Garden to Far Shore": { "scene": "", "door": "" },
"West Garden to Magic Dagger House": { "scene": "", "door": "" }
}
},
"West Garden House": {
"found": 0,
"remaining": 1,
"total": 1,
"doors": { "Magic Dagger House Exit": { "scene": "", "door": "" } }
},
"Windmill": {
"found": 0,
"remaining": 2,
"total": 2,
"doors": {
"Windmill Exit": { "scene": "", "door": "" },
"Windmill Shop": { "scene": "", "door": "" }
}
}
}
}

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1,752 @@
{
"collected": 0,
"remaining": 302,
"total": 302,
"scenes": {
"Beneath the Fortress": {
"collected": 0,
"remaining": 5,
"total": 5,
"checks": {
"Back Room Chest": { "name": "", "owner": "" },
"Bridge": { "name": "", "owner": "" },
"Cell Chest 1": { "name": "", "owner": "" },
"Cell Chest 2": { "name": "", "owner": "" },
"Obscured Behind Waterfall": { "name": "", "owner": "" }
}
},
"Beneath the Well": {
"collected": 0,
"remaining": 14,
"total": 14,
"checks": {
"[Back Corridor] Left Secret": { "name": "", "owner": "" },
"[Back Corridor] Right Secret": { "name": "", "owner": "" },
"[Entryway] Chest": { "name": "", "owner": "" },
"[Entryway] Obscured Behind Waterfall": { "name": "", "owner": "" },
"[Powered Secret Room] Chest": { "name": "", "owner": "" },
"[Save Room] Upper Floor Chest 1": { "name": "", "owner": "" },
"[Save Room] Upper Floor Chest 2": { "name": "", "owner": "" },
"[Second Room] Obscured Behind Waterfall": { "name": "", "owner": "" },
"[Second Room] Page": { "name": "", "owner": "" },
"[Second Room] Underwater Chest": { "name": "", "owner": "" },
"[Side Room] Chest By Phrends": { "name": "", "owner": "" },
"[Side Room] Chest By Pots": { "name": "", "owner": "" },
"[Third Room] Beneath Platform Chest": { "name": "", "owner": "" },
"[Third Room] Tentacle Chest": { "name": "", "owner": "" }
}
},
"Cathedral": {
"collected": 0,
"remaining": 10,
"total": 10,
"checks": {
"[1F] Guarded By Lasers": { "name": "", "owner": "" },
"[1F] Library": { "name": "", "owner": "" },
"[1F] Library Secret": { "name": "", "owner": "" },
"[1F] Near Spikes": { "name": "", "owner": "" },
"[2F] Bird Room": { "name": "", "owner": "" },
"[2F] Bird Room Secret": { "name": "", "owner": "" },
"[2F] Entryway Upper Walkway": { "name": "", "owner": "" },
"[2F] Guarded By Lasers": { "name": "", "owner": "" },
"[2F] Library": { "name": "", "owner": "" },
"Secret Legend Trophy Chest": { "name": "", "owner": "" }
}
},
"Cathedral Gauntlet": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Gauntlet Reward": { "name": "", "owner": "" } }
},
"Caustic Light Cave": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Holy Cross Chest": { "name": "", "owner": "" } }
},
"Changing Room": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Normal Chest": { "name": "", "owner": "" } }
},
"Coins in the Well": {
"collected": 0,
"remaining": 4,
"total": 4,
"checks": {
"10 Coins": { "name": "", "owner": "" },
"15 Coins": { "name": "", "owner": "" },
"3 Coins": { "name": "", "owner": "" },
"6 Coins": { "name": "", "owner": "" }
}
},
"Cube Cave": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Holy Cross Chest": { "name": "", "owner": "" } }
},
"Dark Tomb": {
"collected": 0,
"remaining": 7,
"total": 7,
"checks": {
"1st Laser Room": { "name": "", "owner": "" },
"1st Laser Room Obscured": { "name": "", "owner": "" },
"2nd Laser Room": { "name": "", "owner": "" },
"Skulls Chest": { "name": "", "owner": "" },
"Spike Maze Near Exit": { "name": "", "owner": "" },
"Spike Maze Near Stairs": { "name": "", "owner": "" },
"Spike Maze Upper Walkway": { "name": "", "owner": "" }
}
},
"Dark Tomb Checkpoint": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": {
"[Passage To Dark Tomb] Page Pickup": { "name": "", "owner": "" }
}
},
"East Forest": {
"collected": 0,
"remaining": 14,
"total": 14,
"checks": {
"Above Save Point": { "name": "", "owner": "" },
"Above Save Point Obscured": { "name": "", "owner": "" },
"Beneath Spider Chest": { "name": "", "owner": "" },
"Bombable Wall": { "name": "", "owner": "" },
"Dancing Fox Spirit Holy Cross": { "name": "", "owner": "" },
"From Guardhouse 1 Chest": { "name": "", "owner": "" },
"Golden Obelisk Holy Cross": { "name": "", "owner": "" },
"Ice Rod Grapple Chest": { "name": "", "owner": "" },
"Lower Dash Chest": { "name": "", "owner": "" },
"Lower Grapple Chest": { "name": "", "owner": "" },
"Near Save Point": { "name": "", "owner": "" },
"Near Telescope": { "name": "", "owner": "" },
"Page On Teleporter": { "name": "", "owner": "" },
"Spider Chest": { "name": "", "owner": "" }
}
},
"Eastern Vault Fortress": {
"collected": 0,
"remaining": 5,
"total": 5,
"checks": {
"[East Wing] Bombable Wall": { "name": "", "owner": "" },
"[West Wing] Candles Holy Cross": { "name": "", "owner": "" },
"[West Wing] Dark Room Chest 1": { "name": "", "owner": "" },
"[West Wing] Dark Room Chest 2": { "name": "", "owner": "" },
"[West Wing] Page Pickup": { "name": "", "owner": "" }
}
},
"Far Shore": {
"collected": 0,
"remaining": 2,
"total": 2,
"checks": {
"Page Pickup": { "name": "", "owner": "" },
"Secret Chest": { "name": "", "owner": "" }
}
},
"Forest Belltower": {
"collected": 0,
"remaining": 5,
"total": 5,
"checks": {
"After Guard Captain": { "name": "", "owner": "" },
"Near Save Point": { "name": "", "owner": "" },
"Obscured Beneath Bell Bottom Floor": { "name": "", "owner": "" },
"Obscured Near Bell Top Floor": { "name": "", "owner": "" },
"Page Pickup": { "name": "", "owner": "" }
}
},
"Forest Boss Room": {
"collected": 0,
"remaining": 0,
"total": 0,
"checks": {}
},
"Forest Grave Path": {
"collected": 0,
"remaining": 5,
"total": 5,
"checks": {
"Above Gate": { "name": "", "owner": "" },
"Holy Cross Code by Grave": { "name": "", "owner": "" },
"Obscured Chest": { "name": "", "owner": "" },
"Sword Pickup": { "name": "", "owner": "" },
"Upper Walkway": { "name": "", "owner": "" }
}
},
"Fortress Arena": {
"collected": 0,
"remaining": 2,
"total": 2,
"checks": {
"Hexagon Red": { "name": "", "owner": "" },
"Siege Engine/Vault Key Pickup": { "name": "", "owner": "" }
}
},
"Fortress Courtyard": {
"collected": 0,
"remaining": 5,
"total": 5,
"checks": {
"Below Walkway": { "name": "", "owner": "" },
"Chest Near Cave": { "name": "", "owner": "" },
"From East Belltower": { "name": "", "owner": "" },
"Near Fuse": { "name": "", "owner": "" },
"Page Near Cave": { "name": "", "owner": "" }
}
},
"Fortress East Shortcut": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Chest Near Slimes": { "name": "", "owner": "" } }
},
"Fortress Grave Path": {
"collected": 0,
"remaining": 3,
"total": 3,
"checks": {
"Chest Right of Grave": { "name": "", "owner": "" },
"Obscured Chest Left of Grave": { "name": "", "owner": "" },
"Upper Walkway": { "name": "", "owner": "" }
}
},
"Fortress Leaf Piles": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Secret Chest": { "name": "", "owner": "" } }
},
"Fountain Cross Room": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Page Pickup": { "name": "", "owner": "" } }
},
"Frog Stairway": {
"collected": 0,
"remaining": 0,
"total": 0,
"checks": {}
},
"Frog's Domain": {
"collected": 0,
"remaining": 11,
"total": 11,
"checks": {
"Above Vault": { "name": "", "owner": "" },
"Escape Chest": { "name": "", "owner": "" },
"Grapple Above Hot Tub": { "name": "", "owner": "" },
"Magic Orb Pickup": { "name": "", "owner": "" },
"Main Room Bottom Floor": { "name": "", "owner": "" },
"Main Room Top Floor": { "name": "", "owner": "" },
"Near Vault": { "name": "", "owner": "" },
"Side Room Chest": { "name": "", "owner": "" },
"Side Room Grapple Secret": { "name": "", "owner": "" },
"Side Room Secret Passage": { "name": "", "owner": "" },
"Slorm Room": { "name": "", "owner": "" }
}
},
"Glyph Tower": { "collected": 0, "remaining": 0, "total": 0, "checks": {} },
"Guardhouse 1": {
"collected": 0,
"remaining": 2,
"total": 2,
"checks": {
"Upper Floor": { "name": "", "owner": "" },
"Upper Floor Obscured": { "name": "", "owner": "" }
}
},
"Guardhouse 2": {
"collected": 0,
"remaining": 2,
"total": 2,
"checks": {
"Bottom Floor Secret": { "name": "", "owner": "" },
"Upper Floor": { "name": "", "owner": "" }
}
},
"Hero's Grave": {
"collected": 0,
"remaining": 6,
"total": 6,
"checks": {
"Ash Relic": { "name": "", "owner": "" },
"Effigy Relic": { "name": "", "owner": "" },
"Feathers Relic": { "name": "", "owner": "" },
"Flowers Relic": { "name": "", "owner": "" },
"Mushroom Relic": { "name": "", "owner": "" },
"Tooth Relic": { "name": "", "owner": "" }
}
},
"Hourglass Cave": {
"collected": 0,
"remaining": 2,
"total": 2,
"checks": {
"Holy Cross Chest": { "name": "", "owner": "" },
"Hourglass Chest": { "name": "", "owner": "" }
}
},
"Librarian": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Hexagon Green": { "name": "", "owner": "" } }
},
"Library Exterior": {
"collected": 0,
"remaining": 0,
"total": 0,
"checks": {}
},
"Library Hall": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Holy Cross Chest": { "name": "", "owner": "" } }
},
"Library Lab": {
"collected": 0,
"remaining": 7,
"total": 7,
"checks": {
"Behind Chalkboard by Fuse": { "name": "", "owner": "" },
"Chest By Shrine 1": { "name": "", "owner": "" },
"Chest By Shrine 2": { "name": "", "owner": "" },
"Chest By Shrine 3": { "name": "", "owner": "" },
"Page 1": { "name": "", "owner": "" },
"Page 2": { "name": "", "owner": "" },
"Page 3": { "name": "", "owner": "" }
}
},
"Library Rotunda": {
"collected": 0,
"remaining": 0,
"total": 0,
"checks": {}
},
"Loading": { "collected": 0, "remaining": 0, "total": 0, "checks": {} },
"Lower Mountain": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Page Before Door": { "name": "", "owner": "" } }
},
"Maze Cave": {
"collected": 0,
"remaining": 2,
"total": 2,
"checks": {
"Maze Room Chest": { "name": "", "owner": "" },
"Maze Room Holy Cross": { "name": "", "owner": "" }
}
},
"Monastery": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Monastery Chest": { "name": "", "owner": "" } }
},
"Old House": {
"collected": 0,
"remaining": 4,
"total": 4,
"checks": {
"Holy Cross Chest": { "name": "", "owner": "" },
"Holy Cross Door Page": { "name": "", "owner": "" },
"Normal Chest": { "name": "", "owner": "" },
"Shield Pickup": { "name": "", "owner": "" }
}
},
"Overworld": {
"collected": 0,
"remaining": 50,
"total": 50,
"checks": {
"[Central] Bombable Wall": { "name": "", "owner": "" },
"[Central] Chest Across From Well": { "name": "", "owner": "" },
"[East] Between Ladders Near Ruined Passage": {
"name": "",
"owner": ""
},
"[East] Chest In Trees": { "name": "", "owner": "" },
"[East] Chest Near Pots": { "name": "", "owner": "" },
"[East] Grapple Chest": { "name": "", "owner": "" },
"[East] Page Near Secret Shop": { "name": "", "owner": "" },
"[East] Weathervane Holy Cross": { "name": "", "owner": "" },
"[Northeast] Chest Above Patrol Cave": { "name": "", "owner": "" },
"[Northeast] Flowers Holy Cross": { "name": "", "owner": "" },
"[Northwest] Chest Beneath Quarry Gate": { "name": "", "owner": "" },
"[Northwest] Chest Near Golden Obelisk": { "name": "", "owner": "" },
"[Northwest] Chest Near Quarry Gate": { "name": "", "owner": "" },
"[Northwest] Chest Near Turret": { "name": "", "owner": "" },
"[Northwest] Fire Wand Pickup": { "name": "", "owner": "" },
"[Northwest] Golden Obelisk Page": { "name": "", "owner": "" },
"[Northwest] Page By Well": { "name": "", "owner": "" },
"[Northwest] Page on Pillar by Dark Tomb": { "name": "", "owner": "" },
"[Northwest] Shadowy Corner Chest": { "name": "", "owner": "" },
"[South] Beach Chest": { "name": "", "owner": "" },
"[South] Beach Page": { "name": "", "owner": "" },
"[South] Starting Platform Holy Cross": { "name": "", "owner": "" },
"[Southeast] Chest Near Swamp": { "name": "", "owner": "" },
"[Southeast] Page on Pillar by Swamp": { "name": "", "owner": "" },
"[Southwest] Beach Chest Beneath Guard": { "name": "", "owner": "" },
"[Southwest] Beach Chest Near Flowers": { "name": "", "owner": "" },
"[Southwest] Bombable Wall Near Fountain": { "name": "", "owner": "" },
"[Southwest] Chest Guarded By Turret": { "name": "", "owner": "" },
"[Southwest] Flowers Holy Cross": { "name": "", "owner": "" },
"[Southwest] Fountain Holy Cross": { "name": "", "owner": "" },
"[Southwest] Fountain Page": { "name": "", "owner": "" },
"[Southwest] From West Garden": { "name": "", "owner": "" },
"[Southwest] Grapple Chest Over Walkway": { "name": "", "owner": "" },
"[Southwest] Haiku Holy Cross": { "name": "", "owner": "" },
"[Southwest] Key Pickup": { "name": "", "owner": "" },
"[Southwest] Obscured In Tunnel To Beach": { "name": "", "owner": "" },
"[Southwest] South Chest Near Guard": { "name": "", "owner": "" },
"[Southwest] Tunnel Guarded By Turret": { "name": "", "owner": "" },
"[Southwest] West Beach Guarded By Turret": { "name": "", "owner": "" },
"[Southwest] West Beach Guarded By Turret 2": {
"name": "",
"owner": ""
},
"[West] Chest After Bell": { "name": "", "owner": "" },
"[West] Chest Behind Moss Wall": { "name": "", "owner": "" },
"[West] Key Pickup": { "name": "", "owner": "" },
"[West] Moss Wall Holy Cross": { "name": "", "owner": "" },
"[West] Near West Garden Entrance": { "name": "", "owner": "" },
"[West] Obscured Behind Windmill": { "name": "", "owner": "" },
"[West] Obscured Near Well": { "name": "", "owner": "" },
"[West] Page On Teleporter": { "name": "", "owner": "" },
"[West] Windchimes Holy Cross": { "name": "", "owner": "" },
"[West] Windmill Holy Cross": { "name": "", "owner": "" }
}
},
"Patrol Cave": {
"collected": 0,
"remaining": 2,
"total": 2,
"checks": {
"Holy Cross Chest": { "name": "", "owner": "" },
"Normal Chest": { "name": "", "owner": "" }
}
},
"Posterity": { "collected": 0, "remaining": 0, "total": 0, "checks": {} },
"Purgatory": { "collected": 0, "remaining": 0, "total": 0, "checks": {} },
"Quarry": {
"collected": 0,
"remaining": 28,
"total": 28,
"checks": {
"[Back Entrance] Bushes Holy Cross": { "name": "", "owner": "" },
"[Back Entrance] Chest": { "name": "", "owner": "" },
"[Back Entrance] Obscured Behind Wall": { "name": "", "owner": "" },
"[Central] Above Ladder": { "name": "", "owner": "" },
"[Central] Above Ladder Dash Chest": { "name": "", "owner": "" },
"[Central] Below Entry Walkway": { "name": "", "owner": "" },
"[Central] Near Shortcut Ladder": { "name": "", "owner": "" },
"[Central] Obscured Behind Staircase": { "name": "", "owner": "" },
"[Central] Obscured Below Entry Walkway": { "name": "", "owner": "" },
"[Central] Top Floor Overhang": { "name": "", "owner": "" },
"[East] Bombable Wall": { "name": "", "owner": "" },
"[East] Near Bridge": { "name": "", "owner": "" },
"[East] Near Telescope": { "name": "", "owner": "" },
"[East] Obscured Beneath Scaffolding": { "name": "", "owner": "" },
"[East] Obscured Near Telescope": { "name": "", "owner": "" },
"[East] Obscured Near Winding Staircase": { "name": "", "owner": "" },
"[East] Upper Floor": { "name": "", "owner": "" },
"[Lowlands] Below Broken Ladder": { "name": "", "owner": "" },
"[Lowlands] Near Elevator": { "name": "", "owner": "" },
"[Lowlands] Upper Walkway": { "name": "", "owner": "" },
"[West] Below Shooting Range": { "name": "", "owner": "" },
"[West] Lower Area After Bridge": { "name": "", "owner": "" },
"[West] Lower Area Below Bridge": { "name": "", "owner": "" },
"[West] Lower Area Isolated Chest": { "name": "", "owner": "" },
"[West] Near Shooting Range": { "name": "", "owner": "" },
"[West] Shooting Range Secret Path": { "name": "", "owner": "" },
"[West] Upper Area Bombable Wall": { "name": "", "owner": "" },
"[West] Upper Area Near Waterfall": { "name": "", "owner": "" }
}
},
"Quarry Entryway": {
"collected": 0,
"remaining": 0,
"total": 0,
"checks": {}
},
"Resurrection": {
"collected": 0,
"remaining": 0,
"total": 0,
"checks": {}
},
"Rooted Ziggurat Entrance": {
"collected": 0,
"remaining": 0,
"total": 0,
"checks": {}
},
"Rooted Ziggurat Lower": {
"collected": 0,
"remaining": 8,
"total": 8,
"checks": {
"After 2nd Double Turret Chest": { "name": "", "owner": "" },
"After Guarded Fuse": { "name": "", "owner": "" },
"Guarded By Double Turrets": { "name": "", "owner": "" },
"Guarded By Double Turrets 2": { "name": "", "owner": "" },
"Hexagon Blue": { "name": "", "owner": "" },
"Left Of Checkpoint Before Fuse": { "name": "", "owner": "" },
"Near Corpses": { "name": "", "owner": "" },
"Spider Ambush": { "name": "", "owner": "" }
}
},
"Rooted Ziggurat Teleporter": {
"collected": 0,
"remaining": 0,
"total": 0,
"checks": {}
},
"Rooted Ziggurat Tower": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Inside Tower": { "name": "", "owner": "" } }
},
"Rooted Ziggurat Upper": {
"collected": 0,
"remaining": 2,
"total": 2,
"checks": {
"Beneath Bridge To Administrator": { "name": "", "owner": "" },
"Near Bridge Switch": { "name": "", "owner": "" }
}
},
"Ruined Atoll": {
"collected": 0,
"remaining": 17,
"total": 17,
"checks": {
"[East] Locked Room Lower Chest": { "name": "", "owner": "" },
"[East] Locked Room Upper Chest": { "name": "", "owner": "" },
"[North] From Lower Overworld Entrance": { "name": "", "owner": "" },
"[North] Guarded By Bird": { "name": "", "owner": "" },
"[North] Obscured Beneath Bridge": { "name": "", "owner": "" },
"[Northeast] Chest Beneath Brick Walkway": { "name": "", "owner": "" },
"[Northeast] Chest On Brick Walkway": { "name": "", "owner": "" },
"[Northeast] Key Pickup": { "name": "", "owner": "" },
"[Northwest] Behind Envoy": { "name": "", "owner": "" },
"[Northwest] Bombable Wall": { "name": "", "owner": "" },
"[South] Chest Near Big Crabs": { "name": "", "owner": "" },
"[South] Near Birds": { "name": "", "owner": "" },
"[South] Upper Floor On Bricks": { "name": "", "owner": "" },
"[South] Upper Floor On Power Line": { "name": "", "owner": "" },
"[Southeast] Chest Near Fuse": { "name": "", "owner": "" },
"[Southwest] Obscured Behind Fuse": { "name": "", "owner": "" },
"[West] Near Kevin Block": { "name": "", "owner": "" }
}
},
"Ruined Passage": {
"collected": 0,
"remaining": 2,
"total": 2,
"checks": {
"Holy Cross Chest": { "name": "", "owner": "" },
"Page Pickup": { "name": "", "owner": "" }
}
},
"Ruined Shop": {
"collected": 0,
"remaining": 3,
"total": 3,
"checks": {
"Chest 1": { "name": "", "owner": "" },
"Chest 2": { "name": "", "owner": "" },
"Chest 3": { "name": "", "owner": "" }
}
},
"Sealed Temple": {
"collected": 0,
"remaining": 2,
"total": 2,
"checks": {
"Holy Cross Chest": { "name": "", "owner": "" },
"Page Pickup": { "name": "", "owner": "" }
}
},
"Secret Gathering Place": {
"collected": 0,
"remaining": 3,
"total": 3,
"checks": {
"10 Fairy Reward": { "name": "", "owner": "" },
"20 Fairy Reward": { "name": "", "owner": "" },
"Holy Cross Chest": { "name": "", "owner": "" }
}
},
"Shop": {
"collected": 0,
"remaining": 4,
"total": 4,
"checks": {
"Coin 1": { "name": "", "owner": "" },
"Coin 2": { "name": "", "owner": "" },
"Potion 1": { "name": "", "owner": "" },
"Potion 2": { "name": "", "owner": "" }
}
},
"Southeast Cross Room": {
"collected": 0,
"remaining": 3,
"total": 3,
"checks": {
"Chest 1": { "name": "", "owner": "" },
"Chest 2": { "name": "", "owner": "" },
"Chest 3": { "name": "", "owner": "" }
}
},
"Special Shop": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Secret Page Pickup": { "name": "", "owner": "" } }
},
"Stick House": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Stick Chest": { "name": "", "owner": "" } }
},
"Swamp": {
"collected": 0,
"remaining": 22,
"total": 22,
"checks": {
"[Central] Beneath Memorial": { "name": "", "owner": "" },
"[Central] Near Ramps Up": { "name": "", "owner": "" },
"[Central] Obscured Behind Northern Mountain": {
"name": "",
"owner": ""
},
"[Central] South Secret Passage": { "name": "", "owner": "" },
"[Entrance] Above Entryway": { "name": "", "owner": "" },
"[Entrance] North Small Island": { "name": "", "owner": "" },
"[Entrance] Obscured Inside Watchtower": { "name": "", "owner": "" },
"[Entrance] South Near Fence": { "name": "", "owner": "" },
"[Outside Cathedral] Near Moonlight Bridge Door": {
"name": "",
"owner": ""
},
"[Outside Cathedral] Obscured Behind Memorial": {
"name": "",
"owner": ""
},
"[South Graveyard] 4 Orange Skulls": { "name": "", "owner": "" },
"[South Graveyard] Above Big Skeleton": { "name": "", "owner": "" },
"[South Graveyard] Chest Near Graves": { "name": "", "owner": "" },
"[South Graveyard] Guarded By Big Skeleton": {
"name": "",
"owner": ""
},
"[South Graveyard] Guarded By Tentacles": { "name": "", "owner": "" },
"[South Graveyard] Obscured Behind Ridge": { "name": "", "owner": "" },
"[South Graveyard] Obscured Beneath Telescope": {
"name": "",
"owner": ""
},
"[South Graveyard] Upper Walkway Dash Chest": {
"name": "",
"owner": ""
},
"[South Graveyard] Upper Walkway On Pedestal": {
"name": "",
"owner": ""
},
"[Upper Graveyard] Near Shield Fleemers": { "name": "", "owner": "" },
"[Upper Graveyard] Near Telescope": { "name": "", "owner": "" },
"[Upper Graveyard] Obscured Behind Hill": { "name": "", "owner": "" }
}
},
"The Heir": { "collected": 0, "remaining": 0, "total": 0, "checks": {} },
"Top of the Mountain": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": { "Page At The Peak": { "name": "", "owner": "" } }
},
"West Furnace": {
"collected": 0,
"remaining": 2,
"total": 2,
"checks": {
"Chest": { "name": "", "owner": "" },
"Lantern Pickup": { "name": "", "owner": "" }
}
},
"West Garden": {
"collected": 0,
"remaining": 20,
"total": 20,
"checks": {
"[Central Highlands] After Garden Knight": { "name": "", "owner": "" },
"[Central Highlands] Behind Guard Captain": { "name": "", "owner": "" },
"[Central Highlands] Holy Cross (Blue Lines)": {
"name": "",
"owner": ""
},
"[Central Highlands] Top of Ladder Before Boss": {
"name": "",
"owner": ""
},
"[Central Lowlands] Below Left Walkway": { "name": "", "owner": "" },
"[Central Lowlands] Chest Beneath Faeries": { "name": "", "owner": "" },
"[Central Lowlands] Chest Beneath Save Point": {
"name": "",
"owner": ""
},
"[Central Lowlands] Chest Near Shortcut Bridge": {
"name": "",
"owner": ""
},
"[Central Lowlands] Passage Beneath Bridge": {
"name": "",
"owner": ""
},
"[East Lowlands] Page Behind Ice Dagger House": {
"name": "",
"owner": ""
},
"[North] Across From Page Pickup": { "name": "", "owner": "" },
"[North] Behind Holy Cross Door": { "name": "", "owner": "" },
"[North] Obscured Beneath Hero's Memorial": { "name": "", "owner": "" },
"[North] Page Pickup": { "name": "", "owner": "" },
"[South Highlands] Secret Chest Beneath Fuse": {
"name": "",
"owner": ""
},
"[Southeast Lowlands] Outside Cave": { "name": "", "owner": "" },
"[West Highlands] Upper Left Walkway": { "name": "", "owner": "" },
"[West Lowlands] Tree Holy Cross Chest": { "name": "", "owner": "" },
"[West] In Flooded Walkway": { "name": "", "owner": "" },
"[West] Past Flooded Walkway": { "name": "", "owner": "" }
}
},
"West Garden House": {
"collected": 0,
"remaining": 1,
"total": 1,
"checks": {
"[Southeast Lowlands] Ice Dagger Pickup": { "name": "", "owner": "" }
}
},
"Windmill": { "collected": 0, "remaining": 0, "total": 0, "checks": {} }
}
}

View File

@ -0,0 +1,8 @@
{
"scene": "Overworld",
"seed": 98135423,
"items": 0,
"entrances": 0,
"hints": 0,
"codes": {}
}

View File

@ -1,31 +0,0 @@
asgiref==3.7.2
autopep8==2.0.4
certifi==2024.2.2
charset-normalizer==3.3.2
click==8.1.7
colorama==0.4.6
cssbeautifier==1.15.1
Django==5.0.3
django-browser-reload==1.12.1
django-tailwind==3.8.0
djlint==1.34.1
EditorConfig==0.12.4
gunicorn==21.2.0
html-tag-names==0.1.2
html-void-elements==0.1.0
idna==3.6
jsbeautifier==1.15.1
json5==0.9.22
numpy==1.26.4
packaging==23.2
pathspec==0.12.1
pyarrow==15.0.1
pycodestyle==2.11.1
pylance==0.10.2
PyYAML==6.0.1
regex==2023.12.25
requests==2.31.0
six==1.16.0
sqlparse==0.4.4
tqdm==4.66.2
urllib3==2.2.1

View File

@ -0,0 +1,14 @@
{
"Hint Ghost Overworld Before Garden": "bI #uh wA, I hurd #aht \"FOUR SKULLS\" R gRdi^ [archipelago] \"FAXERYNTHIA'S OINTMENT.\" ",
"Hint Ghost Windmill": "bI #uh wA, I hurd #aht \"EAST FOREST SLIME\" iz gRdi^ [icebomb] \"TOASTERMANUAL'S ICE BOMB X3.\" ",
"Hint Ghost Purgatory": "bI #uh wA, I hurd #aht \"CATHEDRAL GAUNTLET\" iz gRdi^ [archipelago] \"PAPER LIME'S LYRICS.\" ",
"Hint Ghost Sword Cave": "bI #uh wA, I saw A [gun] \"GUN\" #uh lahst tIm I wuhs aht #uh \"CATHEDRAL.\" ",
"Hint Ghost Mountain": "bI #uh wA, I hurd #aht \"20 FAIRIES\" R gRdi^ [archipelago] \"PAPER LIME'S DEEPFOCUS2.\" ",
"Hint Ghost Changing Room 1": "bI #uh wA, I hurd #aht \"VAULT KEY PLINTH\" iz gRdi^ [archipelago] \"CHAIAMON EMERALD'S NUGGET.\" ",
"Hint Ghost Waterfall": "bI #uh wA, I saw A [potionrelic] \"HERO RELIC - POTION\" #uh lahst tIm I wuhs aht #uh \"STICK HOUSE.\" ",
"Mailbox": "lehjehnd sehz #uh \"CATHEDRAL\" kuhntAnz wuhn uhv mehnE \"<#00FFFF>FIRST STEPS<#ffffff>\" ahn yor jurnE.",
"West Garden Relic - Path": "lehjehnd sehz \"TOASTERMANUAL'S LIBRARY LAB\" iz lOkAtid awn #uh \"<#ffd700>PATH OF THE HERO<#ffffff>...\"",
"Library Relic - Path": "#A sA #uh \"LIBRARIAN\" iz wAr #uh <#33FF33>kwehstuhgawn [hexagram]<#FFFFFF> iz fownd\"...\"",
"Swamp Relic - Path": "#A sA #uh \"FORTRESS ARENA\" iz wAr #uh <#FF3333>kwehstuhgawn [hexagram]<#FFFFFF> iz fownd\"...\"",
"Fortress Relic - Path": "lehjehnd sehz \"CHAIAMON EMERALD'S WORLD\" aht \"ROUTE 111 - ITEM DESERT SOUTH\" iz lOkAtid awn #uh \"<#ffd700>PATH OF THE HERO<#ffffff>...\""
}

View File

@ -5,7 +5,7 @@ from json import loads
class ServerAddressForm(forms.Form): class ServerAddressForm(forms.Form):
server_address_form = forms.URLField( server_address_form = forms.URLField(
max_length=1312, initial="http://localhost:8000/", empty_value="http://localhost:8000/", label="") max_length=1312, initial="http://localhost:8000/", empty_value="http://localhost:8000/", label="")
server_address_form.widget.attrs["class"] = "w-full rounded-xl border-none shadow-inner shadow-[#242424] bg-white bg-opacity-10" server_address_form.widget.attrs["class"] = "w-full rounded-xl border-none shadow-inner shadow-[#242424] bg-charcoal-translucent-light"
class BackendFilepathForm(forms.Form): class BackendFilepathForm(forms.Form):

View File

@ -0,0 +1,43 @@
function open_breakdown(event) {
let scene = event.dataset.scene;
Array.from(document.getElementById("breakdown-list").children).forEach(
(breakdown) => {
let breakdown_scene_title = breakdown.querySelector(
".breakdown-block-title"
).textContent;
if (
breakdown_scene_title == scene ||
breakdown.dataset.current == "true"
) {
breakdown.classList.remove("hidden");
} else {
breakdown.classList.add("hidden");
}
}
);
}
function hide_empty_summaries() {
let summary_divs =
document.getElementById("summary-list").firstElementChild.children;
Array.from(summary_divs).forEach((summary) => {
let checks_remaining =
summary.querySelector(".summary-checks").dataset.checksRemaining;
let entrances_remaining =
summary.querySelector(".summary-entrances").dataset.entrancesRemaining;
if (
summary.dataset.scene != "Posterity" &&
summary.dataset.scene != "Resurrection" &&
summary.dataset.scene != "Loading" &&
checks_remaining <= 0 &&
entrances_remaining <= 0 &&
summary.dataset.current == "false"
) {
summary.classList.toggle("hidden");
}
});
}
function notices_ur_debug() {
document.getElementById("debug-block").classList.toggle("hidden");
}

View File

@ -0,0 +1,73 @@
async function refresh_overview(server_address) {
const response = await fetch_api(server_address, "overview");
if (response.data) {
return response.data;
} else {
if (response.error) {
return response.error;
} else {
return null;
}
}
}
async function refresh_hints(server_address) {
const response = await fetch_api(server_address, "hints");
if (response.data) {
return response.data;
} else {
return null;
}
}
async function refresh_checks(server_address) {
const response = await fetch_api(server_address, "items");
if (response.data) {
return response.data;
} else {
return null;
}
}
async function refresh_entrances(server_address) {
const response = await fetch_api(server_address, "doors");
if (response.data) {
return response.data;
} else {
return null;
}
}
async function fetch_api(server_address, uri) {
try {
const response = await fetch(`${server_address}${uri}`, {
signal: AbortSignal.timeout(1100),
});
if (response.ok) {
const data = await response.json();
if (!("error" in data)) {
return { data: data, error: null };
} else {
return { data: null, error: data };
}
} else {
return { data: null, error: null };
}
} catch (e) {
return { data: null, error: e };
}
}
AbortSignal.timeout ??= function timeout(ms) {
const ctrl = new AbortController();
setTimeout(() => ctrl.abort(), ms);
return ctrl.signal;
};
export default {
refresh_overview,
refresh_checks,
refresh_entrances,
refresh_hints,
fetch_api,
};

File diff suppressed because it is too large Load Diff

View File

@ -1,521 +0,0 @@
var current_hash = "";
var server_address = "";
window.onload = () => {
get_updated_server_address();
fetch(`${document.URL}static/tracker/data/holy_cross_codes.json`)
.then((response) => response.json())
.then(
(data) => {
const cross_codes = JSON.parse(JSON.stringify(data));
const refresh_interval = setInterval(
refresh_elements,
500,
cross_codes
);
},
(error) => {
console.log(error);
}
);
};
function open_breakdown(event) {
let scene = event.dataset.scene;
Array.from(document.getElementById("breakdown-list").children).forEach(
(breakdown) => {
if (breakdown.id == `${scene}-breakdown`) {
if (
!(
document
.getElementById("breakdown-current")
.querySelector(".breakdown-block-title").textContent == scene
)
) {
breakdown.classList.remove("hidden");
}
} else {
breakdown.classList.add("hidden");
}
}
);
}
function hide_empty_summaries() {
let summary_divs =
document.getElementById("summary-list").firstElementChild.children;
Array.from(summary_divs).forEach((summary) => {
let checks_undiscovered =
summary.querySelector(".summary-checks").dataset.checksUndiscovered;
let entrances_undiscovered =
summary.querySelector(".summary-entrances").dataset.entrancesUndiscovered;
if (
!(
summary.querySelector(".summary-title").textContent == "Posterity" ||
summary.querySelector(".summary-title").textContent == "Resurrection"
) &&
(checks_undiscovered <= 0 &&
entrances_undiscovered <= 0)
) {
console.log(`${checks_undiscovered} and ${entrances_undiscovered}`)
summary.classList.toggle("hidden");
}
});
}
function notices_ur_debug() {
document.getElementById("debug-block").classList.toggle("hidden");
}
async function get_updated_filepath() {
fetch(`${document.URL}get/settings`)
.then((response) => response.json())
.then(
(data) => {
backend_filepath = JSON.parse(JSON.stringify(data));
fetch(`${server_address}settings`, {
method: "post",
headers: { "Content-type": "application/json" },
body: JSON.stringify({
secretLegend: backend_filepath,
address: ":8000",
}),
});
},
(error) => {
console.log(error);
}
);
}
async function get_updated_server_address() {
fetch(`${document.URL}get/address`)
.then(
(response) => response.json(),
(error) => {
console.log("Are you sure the front end is up?");
}
)
.then(
(data) => {
parsed_data = JSON.parse(JSON.stringify(data));
server_address = parsed_data["listen_address"];
if (parsed_data["backend_filepath_updated"]) {
get_updated_filepath();
}
},
(error) => {
console.log(error);
}
);
}
async function refresh_elements(cross_codes) {
fetch(`${server_address}spoiler`)
.then((response) => response.json())
.then(
(data) => {
// Attempt to receive response JSON.
const response_object = JSON.parse(JSON.stringify(data));
document.getElementById("status-block").classList.add("hidden");
if (response_object.Debug.Hash == current_hash) {
return;
} else {
current_hash = response_object.Debug.Hash;
get_updated_server_address();
}
// Parse out data from the back-end into variables.
const overview_checks_undiscovered =
response_object.Totals.Checks.Undiscovered;
const overview_checks_total = response_object.Totals.Checks.Total;
const overview_entrances_undiscovered =
response_object.Totals.Entrances.Undiscovered;
const overview_entrances_total = response_object.Totals.Entrances.Total;
const current_scene_name = response_object.Current.Scene;
const all_scenes = response_object.Scenes;
const debug_info = response_object.Debug;
const cross_codes_entered = response_object.Codes;
const default_cross_codes = cross_codes.Default;
const global_cross_codes = cross_codes.Global;
// Refresh elements with new data from the back end.
// Clone all the needed elements for updating.
let overview_checks_title = document
.getElementById("overview-totals")
.querySelector(".overview-checks");
let overview_entrances_title = document
.getElementById("overview-totals")
.querySelector(".overview-entrances");
let summary_block = document
.getElementById("summary-list")
.firstElementChild.firstElementChild.cloneNode(true);
let breakdown_block = document
.getElementById("breakdown-list")
.firstElementChild.cloneNode(true);
breakdown_block.id = "";
breakdown_block.classList.remove("hidden");
let debug_item = document
.getElementById("debug-block")
.querySelector(".debug-list")
.firstElementChild.cloneNode(true);
debug_item.classList.remove("hidden");
let new_breakdown_list = document
.getElementById("breakdown-list")
.cloneNode(true);
let new_summary_list = document
.getElementById("summary-list")
.cloneNode(true);
let new_debug_block = document
.getElementById("debug-block")
.querySelector(".debug-list")
.cloneNode(true);
let current_open_breakdown = "";
Array.from(new_breakdown_list.children).forEach((scene) => {
if (!Array.from(scene.classList).includes("hidden")) {
current_open_breakdown = scene.id;
}
});
// Clear out the current lists.
new_breakdown_list.innerHTML = "";
new_summary_list.firstElementChild.innerHTML = "";
new_debug_block.innerHTML = "";
// Set content to updated data.
overview_checks_title.textContent = `Checks: ${overview_checks_undiscovered}/${overview_checks_total}`;
overview_entrances_title.textContent = `Entrances: ${overview_entrances_undiscovered}/${overview_entrances_total}`;
// Create new lists with updated data.
Object.keys(all_scenes).forEach((scene) => {
// Create variables for element pointers.
summary_block = document
.getElementById("summary-list")
.firstElementChild.firstElementChild.cloneNode(true);
summary_block.classList.remove("hidden");
let summary_title = summary_block.querySelector(".summary-title");
let summary_checks = summary_block.querySelector(".summary-checks");
let summary_entrances =
summary_block.querySelector(".summary-entrances");
breakdown_block = document
.getElementById("breakdown-list")
.firstElementChild.cloneNode(true);
let breakdown_block_title = breakdown_block.querySelector(
".breakdown-block-title"
);
let breakdown_block_checks_title = breakdown_block.querySelector(
".breakdown-block-checks-title"
);
let new_breakdown_block_checks_list = breakdown_block
.querySelector(".breakdown-block-checks-list")
.cloneNode(true);
let breakdown_block_checks_list_item = breakdown_block
.querySelector(".breakdown-block-checks-list")
.firstElementChild.cloneNode(true);
let breakdown_block_entrances_title = breakdown_block.querySelector(
".breakdown-block-entrances-title"
);
let new_breakdown_block_entrances_list = breakdown_block
.querySelector(".breakdown-block-entrances-list")
.cloneNode(true);
let breakdown_block_entrances_list_item = breakdown_block
.querySelector(".breakdown-block-entrances-list")
.firstElementChild.cloneNode(true);
let new_breakdown_block_mapped_list = breakdown_block
.querySelector(".breakdown-block-mapped-list")
.cloneNode(true);
let breakdown_block_mapped_list_item = breakdown_block
.querySelector(".breakdown-block-mapped-list")
.firstElementChild.cloneNode(true);
// Clear out current list content.
new_breakdown_block_checks_list.innerHTML = "";
new_breakdown_block_entrances_list.innerHTML = "";
new_breakdown_block_mapped_list.innerHTML = "";
new_breakdown_block_checks_list.appendChild(
breakdown_block_checks_list_item.cloneNode(true)
);
breakdown_block_checks_list_item.classList.remove("hidden");
new_breakdown_block_entrances_list.appendChild(
breakdown_block_entrances_list_item.cloneNode(true)
);
breakdown_block_entrances_list_item.classList.remove("hidden");
new_breakdown_block_mapped_list.appendChild(
breakdown_block_mapped_list_item.cloneNode(true)
);
breakdown_block_mapped_list_item.classList.remove("hidden");
// Create variables for commonly used values.
let scene_checks_undiscovered =
all_scenes[scene].Totals.Checks.Undiscovered;
let scene_checks_total = all_scenes[scene].Totals.Checks.Total;
let scene_entrances_undiscovered =
all_scenes[scene].Totals.Entrances.Undiscovered;
let scene_entrances_total = all_scenes[scene].Totals.Entrances.Total;
let scene_has_codes = Object.keys(cross_codes).includes(scene);
// Set textContent.
summary_title.textContent = scene;
summary_checks.textContent = `Checks: ${scene_checks_undiscovered}/${scene_checks_total}`;
summary_checks.dataset.checksUndiscovered = scene_checks_undiscovered;
summary_checks.dataset.checksTotal = scene_checks_undiscovered;
summary_entrances.textContent = `Entrances: ${scene_entrances_undiscovered}/${scene_entrances_total}`;
summary_entrances.dataset.entrancesUndiscovered =
scene_entrances_undiscovered;
summary_entrances.dataset.entrancesTotal = scene_entrances_total;
breakdown_block_title.textContent = scene;
breakdown_block_checks_title.textContent = `Checks: ${all_scenes[scene].Totals.Checks.Undiscovered}/${all_scenes[scene].Totals.Checks.Total}`;
breakdown_block_entrances_title.textContent = `Entrances: ${all_scenes[scene].Totals.Entrances.Undiscovered}/${all_scenes[scene].Totals.Entrances.Total}`;
// Create checks, entrances, mapped entrances, and cross code lists.
Object.keys(all_scenes[scene].Checks).forEach((check) => {
if (!all_scenes[scene].Checks[check]) {
breakdown_block_checks_list_item.textContent = `${check}`;
new_breakdown_block_checks_list.appendChild(
breakdown_block_checks_list_item.cloneNode(true)
);
}
});
Object.keys(all_scenes[scene].Entrances).forEach((entrances) => {
if (all_scenes[scene].Entrances[entrances].Door == "") {
breakdown_block_entrances_list_item.textContent = `${entrances}`;
new_breakdown_block_entrances_list.appendChild(
breakdown_block_entrances_list_item.cloneNode(true)
);
} else {
breakdown_block_mapped_list_item.textContent = `✔️ ${entrances} -> ${all_scenes[scene].Entrances[entrances].Door}`;
breakdown_block_mapped_list_item.id = `${entrances}-mapped`;
breakdown_block_mapped_list_item.dataset.scene =
all_scenes[scene].Entrances[entrances].Scene;
new_breakdown_block_mapped_list.appendChild(
breakdown_block_mapped_list_item.cloneNode(true)
);
}
});
// Apply color coding to summary block
summary_block.firstElementChild.classList.remove(
"from-highlight-both-light",
"from-highlight-checks-light",
"from-highlight-entrances-light",
"from-highlight-empty-light",
"from-highlight-undiscovered-light",
"to-highlight-both-dark",
"to-highlight-checks-dark",
"to-highlight-entrances-dark",
"to-highlight-empty-dark",
"to-highlight-undiscovered-dark",
"text-highlight-both-text",
"text-highlight-checks-text",
"text-highlight-entrances-text",
"text-highlight-empty-text",
"text-highlight-undiscovered-text"
);
if (
scene_checks_undiscovered > 0 &&
scene_entrances_undiscovered > 0
) {
if (
scene_checks_total == scene_checks_undiscovered &&
scene_entrances_total == scene_entrances_undiscovered
) {
summary_block.firstElementChild.classList.add(
"from-highlight-undiscovered-light",
"to-highlight-undiscovered-dark",
"text-highlight-undiscovered-text"
);
} else {
summary_block.firstElementChild.classList.add(
"from-highlight-both-light",
"to-highlight-both-dark",
"text-highlight-both-text"
);
}
} else if (scene_checks_undiscovered > 0) {
summary_block.firstElementChild.classList.add(
"from-highlight-checks-light",
"to-highlight-checks-dark",
"text-highlight-checks-text"
);
} else if (scene_entrances_undiscovered > 0) {
summary_block.firstElementChild.classList.add(
"from-highlight-entrances-light",
"to-highlight-entrances-dark",
"text-highlight-entrances-text"
);
} else {
summary_block.firstElementChild.classList.add(
"from-highlight-empty-light",
"to-highlight-empty-dark",
"text-highlight-empty-text"
);
}
// Replace lists
breakdown_block
.querySelector(".breakdown-block-checks-list")
.replaceWith(new_breakdown_block_checks_list);
breakdown_block
.querySelector(".breakdown-block-entrances-list")
.replaceWith(new_breakdown_block_entrances_list);
breakdown_block
.querySelector(".breakdown-block-mapped-list")
.replaceWith(new_breakdown_block_mapped_list);
breakdown_block.id = `${
breakdown_block.querySelector(".breakdown-block-title").textContent
}-breakdown`;
breakdown_block.classList.add("hidden");
// Append relevant elements to lists.
if (current_open_breakdown == breakdown_block.id) {
breakdown_block.classList.remove("hidden");
}
if (scene == current_scene_name) {
summary_block.classList.add("hidden");
breakdown_block.classList.remove("hidden");
document
.getElementById("breakdown-current")
.firstElementChild.replaceWith(breakdown_block.cloneNode(true));
breakdown_block.classList.add("hidden");
} else if (
scene_checks_undiscovered <= 0 &&
scene_entrances_total <= 0
) {
summary_block.classList.add("hidden");
}
if (document.getElementById("hideDone").checked) {
if (
scene_checks_undiscovered <= 0 &&
scene_entrances_undiscovered <= 0
) {
summary_block.classList.add("hidden");
}
}
summary_block.dataset.scene = scene;
new_summary_list.firstElementChild.appendChild(
summary_block.cloneNode(true)
);
new_breakdown_list.appendChild(breakdown_block.cloneNode(true));
});
let new_cross_codes_block_list = document
.getElementById("codes-list")
.cloneNode(true);
let cross_codes_block_list_item = document
.getElementById("codes-list")
.firstElementChild.cloneNode(true);
new_cross_codes_block_list.innerHTML = "";
Object.keys(default_cross_codes).forEach((code) => {
cross_codes_block_list_item.querySelector(
".codes-list-item-title"
).textContent = code;
cross_codes_block_list_item.querySelector(
".codes-list-item-code"
).textContent = default_cross_codes[code]
.replace(/U/g, "⬆️")
.replace(/R/g, "➡️")
.replace(/D/g, "⬇️")
.replace(/L/g, "⬅️");
new_cross_codes_block_list.appendChild(
cross_codes_block_list_item.cloneNode(true)
);
});
Object.keys(global_cross_codes).forEach((code) => {
cross_codes_block_list_item.querySelector(
".codes-list-item-title"
).textContent = code;
cross_codes_block_list_item.querySelector(
".codes-list-item-code"
).textContent = global_cross_codes[code]
.replace(/U/g, "⬆️")
.replace(/R/g, "➡️")
.replace(/D/g, "⬇️")
.replace(/L/g, "⬅️");
if (cross_codes_entered.Global[code]) {
cross_codes_block_list_item.classList.add("hidden");
} else {
cross_codes_block_list_item.classList.remove("hidden");
}
new_cross_codes_block_list.appendChild(
cross_codes_block_list_item.cloneNode(true)
);
});
if (!(typeof cross_codes[current_scene_name] === "undefined")) {
Object.keys(cross_codes[current_scene_name]).forEach((code) => {
cross_codes_block_list_item.querySelector(
".codes-list-item-title"
).textContent = code;
cross_codes_block_list_item.querySelector(
".codes-list-item-code"
).textContent = cross_codes[current_scene_name][code]
.replace(/U/g, "⬆️")
.replace(/R/g, "➡️")
.replace(/D/g, "⬇️")
.replace(/L/g, "⬅️");
if (cross_codes_entered[current_scene_name][code]) {
cross_codes_block_list_item.classList.add("hidden");
} else {
cross_codes_block_list_item.classList.remove("hidden");
}
new_cross_codes_block_list.appendChild(
cross_codes_block_list_item.cloneNode(true)
);
});
}
document
.getElementById("codes-list")
.replaceWith(new_cross_codes_block_list);
Object.keys(debug_info).forEach((item) => {
debug_item.querySelector(
".debug-item"
).textContent = `${item}: ${debug_info[item]}`;
new_debug_block.appendChild(debug_item.cloneNode(true));
});
// Replace with new data.
document
.getElementById("summary-list")
.replaceWith(new_summary_list.cloneNode(true));
document
.getElementById("breakdown-list")
.replaceWith(new_breakdown_list.cloneNode(true));
document
.getElementById("debug-block")
.querySelector(".debug-list")
.replaceWith(new_debug_block.cloneNode(true));
},
(error) => {
document.getElementById("status-block").classList.remove("hidden");
get_updated_server_address();
return error;
}
);
}
// Outdated funcion to log the data gathered from the backend.
function log_elements() {
console.log(overview.checks.textContent);
console.log(overview.entrances.textContent);
console.log(current_scene.name.textContent);
console.log(current_scene.checks.title.textContent);
for (i in current_scene.checks.list.children) {
if (current_scene.checks.list.children[i].textContent) {
console.log(current_scene.checks.list.children[i].textContent);
}
}
console.log(current_scene.entrances.title.textContent);
for (i in current_scene.entrances.list.children) {
if (current_scene.entrances.list.children[i].textContent) {
console.log(current_scene.entrances.list.children[i].textContent);
}
}
for (i in current_scene.entrances.mapped.children) {
if (current_scene.entrances.mapped.children[i].textContent) {
console.log(current_scene.entrances.mapped.children[i].textContent);
}
}
}

View File

@ -0,0 +1,178 @@
const lookup = {
ah: "aa",
R: "ax",
aw: "a",
A: "ei",
eh: "e",
E: "i",
Er: "ix",
uh: "uu",
Ar: "ex",
i: "ii",
I: "ai",
ur: "x",
O: "o",
oi: "oi",
oo: "u",
ou: "oo",
ow: "au",
or: "ox",
b: "b",
J: "ch",
d: "d",
f: "f",
g: "g",
h: "h",
j: "j",
k: "k",
l: "l",
m: "m",
n: "n",
"^": "ng",
p: "p",
r: "r",
s: "s",
$: "sh",
t: "t",
"%": "th",
"#": "tz",
v: "v",
w: "w",
y: "y",
z: "z",
"&": "zh",
};
const skip = [" ", ",", "."];
const re =
/(\\"[\w\s\.\-']*\\")|\<(#[a-fA-F0-9]*)\>(.*)\<#[a-fA-F0-9]*\>|(\[[\w]*\])/gm;
async function parse_hints(hint) {
let new_hint = hint;
const color_tags = [
...hint.matchAll(/\<[^\>]+\>(.*)\<[^\>]+\>/gm),
...hint.matchAll(/\<([^\>]+)\>/gm),
];
let color_tag_value = "";
if (color_tags) {
if (color_tags[1]) {
if (color_tag_value == "") {
color_tag_value = color_tags[1][1];
}
const color_tags_text = `<span style="color: ${color_tags[1][1]}">${color_tags[0][1]}</span>`;
new_hint = new_hint.replace(
/\<[^\>]+\>[^\<]+\<[^\>]+\>/gm,
color_tags_text
);
}
}
const image_text = [...new_hint.matchAll(/\[[^\]]+\]/gm)];
if (image_text && image_text[0]) {
let translated_image = image_text[0][0].replace(/\[|\]/g, "");
if (translated_image == "hexagram") {
translated_image = `${color_tag_value
.substring(1)
.toUpperCase()}_${translated_image}`;
}
new_hint = new_hint.replace(
/\[[^\]]+\]/gm,
`<img class="inline-block w-8 h-8 my-auto align-middle drop-shadow-[2px_2px_0px_rgba(36,36,36,0.8)]" src="/static/tracker/images/sprites/${translated_image}.png">`
);
}
let trunic_hint = new_hint;
const tag_matches = [...new_hint.matchAll(/\<[^\>]*\>/gm)].map((x) => x[0]);
for (const matched in tag_matches) {
trunic_hint = trunic_hint.replace(
tag_matches[matched],
"*".repeat(tag_matches[matched].length)
);
}
const quote_matches = [...trunic_hint.matchAll(/\"[^\"]*\"/gm)].map(
(x) => x[0]
);
for (const matched in quote_matches) {
trunic_hint = trunic_hint.replace(
quote_matches[matched],
"*".repeat(quote_matches[matched].length)
);
}
let current_index = 0;
new_hint = [...trunic_hint.matchAll(/\*+/gm)]
.map((x, index) => {
let points = [];
if (index != 0) {
points = [current_index, x.index];
} else {
points = [0, x.index];
}
current_index = x.index + x[0].length;
const to_translate = trunic_hint.substring(points[0], points[1]).trim();
if (to_translate.length > 0) {
return (
translate(to_translate) +
"&nbsp;" +
new_hint.substring(x.index, current_index).trim()
);
} else {
return new_hint.substring(x.index, current_index).trim();
}
})
.join(" ");
return new_hint;
}
const translate = (input) => {
let payload = "";
let inQuote = false;
let cursor = 0;
// // remove [text in square brackets]
// // remove extra whitespace (eg., "I saw A [hourglass] "HOURGLASS"" becomes "I saw A "HOURGLASS"")
// input = input.replace(/\s+\[.+?\]\s+/gm, " ");
// // remove <text in carats>
// // no whitespace concerns (eg., "sehz <#FF00FF>sohm%i^" becomes "sehz sohm%i^")
// input = input.replace(/<.+?>/gm, "");
// input = input.trim();
while (cursor < input.length) {
// get what one character and two characters ahead would be
const one = input[cursor];
const two = input.slice(cursor, cursor + 2);
// things in between quotes are in english, ignore it and set span accordingly
if (one == '"') {
payload += `</span><span class="${inQuote ? "font-trunic" : "english"}">`;
inQuote = !inQuote;
cursor++;
continue;
}
// if we're in an english quote, add it in and move on
if (inQuote) {
payload += one;
cursor++;
continue;
}
// check if this is a skipped character
if (skip.includes(one)) {
payload += one;
// check if we have a translation for this character
} else if (lookup.hasOwnProperty(one)) {
payload += lookup[one];
// check if we have a translation for two characters ahead
// if so, advance the cursor head extra to make up for using two
} else if (lookup.hasOwnProperty(two)) {
payload += lookup[two];
cursor++;
// uh oh
} else {
// console.log(input[cursor], "UNKNOWN", input[cursor].charCodeAt(0));
}
// advance the cursor head to the next character
cursor++;
}
return `<span class="inline-block pt-0.5 font-trunic text-md sm:text-xl h-full align-bottom">${payload}</span>`;
};
export default { parse_hints };

View File

@ -2,23 +2,27 @@
"Default": { "Default": {
"Speedrunner Code": "RULDDRULU", "Speedrunner Code": "RULDDRULU",
"Seeking Spell": "ULURDR", "Seeking Spell": "ULURDR",
"Healing Spell": "DRDLURU" "Healing Spell": "DRDLURU",
"Plushie Code": "URRDLDRURRDLDRULDRDLLULDRDLLL"
}, },
"Cathedral": { "Cathedral": {
"Secret Legend Door": "LULURULURDRRURDLDRDLDL" "Secret Legend Door": "LULURULURDRRURDLDRDLDL"
}, },
"Swamp": {
"Secret Legend Door": "LULURULURDRRURDLDRDLDL"
},
"Caustic Light Cave": { "Caustic Light Cave": {
"Casting Light Fairy": "RULURDRURDLDR" "Holy Cross Chest": "RULURDRURDLDR"
}, },
"Cube Cave": { "Cube Cave": {
"Cube Fairy": "RRRRUUUURRRUUURRUURU" "Holy Cross Chest": "RRRRUUUURRRUUURRUURU"
}, },
"East Forest": { "East Forest": {
"Dancer Fairy": "UDUDLRLRDLUR", "Dancing Fox Spirit Holy Cross": "UDUDLRLRDLUR",
"Obelisk Fairy": "DRDLULDLURULURURULURDRDRDLDRDLU" "Golden Obelisk Holy Cross": "DRDLULDLURULURURULURDRDRDLDRDLU"
}, },
"Eastern Vault Fortress": { "Eastern Vault Fortress": {
"Candles Fairy": "RLDRUL" "Candles Holy Cross": "RLDRUL"
}, },
"Global": { "Global": {
"Firebomb": "LURDRURDRURDL", "Firebomb": "LURDRURDRURDL",
@ -26,54 +30,57 @@
"Icebomb": "LDRURDRURDRUL" "Icebomb": "LDRURDRURDRUL"
}, },
"Hourglass Cave": { "Hourglass Cave": {
"Hourglass Door": "RULURULUURDLDRDLDR", "Holy Cross Door": "RULURULUURDLDRDLDR",
"Hourglass Fairy": "LURURDRURULLLURU" "Holy Cross Chest": "LURURDRURULLLURU"
}, },
"Library Hall": { "Library Hall": {
"Library Fairy": "URDRULURULURDLDRURDRULURULULDRDLDRDL" "Holy Cross Chest": "URDRULURULURDLDRURDRULURULULDRDLDRDL"
}, },
"Lower Mountain": { "Lower Mountain": {
"Top Of Mountain Door": "ULDLULDLURURULURDRULULURULDLURUULURDRDRURDLDRURRDRURDRURRDLDLDRDRDLLDRDLDRURDRURRDDLURULDLULULURRULU" "Top Of Mountain Door": "ULDLULDLURURULURDRULULURULDLURUULURDRDRURDLDRURRDRURDRURRDLDLDRDRDLLDRDLDRURDRURRDDLURULDLULULURRULU"
}, },
"Maze Cave": { "Maze Cave": {
"Maze Fairy": "ULDLURDRURDLULU" "Maze Room Holy Cross": "ULDLURDRURDLULU"
}, },
"Old House": { "Old House": {
"Old House Door": "ULDRDL", "Holy Cross Door": "ULDRDL",
"Old House Fairy": "UURDDRUURDDD" "Holy Cross Chest": "UURDDRUURDDD"
}, },
"Overworld": { "Overworld": {
"Back To Work Treasure": "RDLULLDRRDD", "Starting Platform Holy Cross": "RDLULLDRRDD",
"Compass Fairy": "LRDUUDRLURDLUDRL", "Weathervane Holy Cross": "LRDUUDRLURDLUDRL",
"Fire Wand Obelisk Page": "URDLDRUL", "Golden Obelisk Page": "URDLDRUL",
"Fountain Cross Door": "DRULUR", "Fountain Cross Door": "DRULUR",
"Fountain Fairy": "DLLDURD", "Fountain Holy Cross": "DLLDURD",
"Lower Flower Fairy": "URDLDLDLDLU", "Southwest Flowers Holy Cross": "URDLDLDLDLU",
"Moss Fairy": "URULDLULURDRDRULURDRD", "Moss Wall Holy Cross": "URULDLULURDRDRULURDRD",
"Power Up Treasure": "UDRUDLUDLRDLRU", "Windchimes Holy Cross": "UDRUDLUDLRDLRU",
"Sacred Geometry Treasure": "DLLUURRLDRUD", "Windmill Holy Cross": "DLLUURRLDRUD",
"Southeast Cross Door": "DRULUR", "Southeast Cross Door": "DRULUR",
"Upper Flowers Fairy": "ULDLDLDLURDRRDR", "Northeast Flowers Holy Cross": "ULDLDLDLURDRRDR",
"Vintage Treasure": "DRRRRRRRRRRRLLLLLLLLLLLL" "Haiku Holy Cross": "DRRRRRRRRRRRLLLLLLLLLLLL"
}, },
"Patrol Cave": { "Patrol Cave": {
"Patrol Fairy": "DDRURDLDRURDD" "Holy Cross Chest": "DDRURDLDRURDD"
}, },
"Quarry": { "Quarry": {
"Quarry Fairy": "URDLURULDLURRD" "Bushes Holy Cross": "URDLURULDLURRD"
}, },
"Ruined Passage": { "Ruined Passage": {
"Ruined Passage Door": "LURULDLURDRULURD" "Holy Cross Door": "LURULDLURDRULURD"
}, },
"Sealed Temple": { "Sealed Temple": {
"Temple Fairy": "URULURULURDRUUL" "Holy Cross Chest": "URULURULURDRUUL"
}, },
"Secret Gathering Place": { "Secret Gathering Place": {
"Waterfall Fairy": "DRURURULULURURULDLDLDRDLDRDRUR" "Holy Cross Chest": "DRURURULULURURULDLDLDRDLDRDRUR"
}, },
"West Garden": { "West Garden": {
"Sword Door": "DRULUR", "Holy Cross Door": "DRULUR",
"Tiles Fairy": "URULURULURDRULDLURULURULU", "Holy Cross (Blue Lines)": "URULURULURDRULDLURULURULU",
"Tree Fairy": "LDRLUD" "Tree Holy Cross Chest": "LDRLUD"
},
"mystery": {
"it is a mystery": "UDLR"
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 533 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 789 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 823 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 511 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 543 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Some files were not shown because too many files have changed in this diff Show More