Compare commits

..

35 Commits

Author SHA1 Message Date
cad0292529 Merge pull request 'plugin-backend' (#1) from plugin-backend into main
Reviewed-on: #1
2024-05-01 00:21:11 -05:00
d24cde159a Fixed a formatting issue with the parseInt statements that was sometimes causing strings of "#collected" and "#found" to be concatenated instead of parsed and added. 2024-04-26 02:42:00 -05:00
9f37ae967c Rename the West Garden tree holy cross chest so that it will be indexed appropriately by the tracker. 2024-04-26 00:20:50 -05:00
fe983f30e6 Added a few more parseInt cases where I am fairly certain they would have been needed, fixed an issue where dummy data objects were not being given a "found" attribute, which would sometimes cause the resulting output to be "undefined" in the summary block. 2024-04-26 00:06:05 -05:00
76ead448a6 I think maybe this is fixing an issue with needing parseInt in places I don't think it should need to but fuck it. 2024-04-25 23:10:03 -05:00
d805fec9b9 Added some stability improvements (hopefully), when receiving bad or null data from the server when not expecting it. 2024-04-25 22:40:22 -05:00
db17504ea0 Fixed an error where checks were being compared against "Undefined" due to lack of integer parsing in the update_breakdown() function. 2024-04-25 22:02:57 -05:00
25f664ee4e Hotfix to keep from checks breaking when entering a new scene. 2024-04-23 00:17:23 -05:00
b8c4dbe022 Added update so that collected checks will show up as collected if users have items anto-collected. Minor UI changes to allow more codes/summaries to be displayed at once. 2024-04-22 15:48:14 -05:00
4d91341c1f Minor update to allow more holy cross codes to show up based on screen size. 2024-04-19 22:57:10 -05:00
6c51d7c2fc More theming updates. Changed translucent background layers to be more accessibly legible against text and to match the rest of the theme. 2024-04-17 01:04:36 -05:00
5e3115fb23 Attempted to add some more error handling, there is now a manual timeout for if the API server is not sending any response, but is still up. 2024-04-16 18:01:42 -05:00
09cdc465c4 Updated seeking spell. 2024-04-16 15:58:29 -05:00
e36ed72309 Added some code so that the initial fetch of data from the django server will not produce a timeout if the user isn't running on the host machine. 2024-04-16 15:41:49 -05:00
57ec06efb5 Updated cross codes with corrected art, and in corrected places. cleaned up breakdown formatting / theming. 2024-04-16 15:36:54 -05:00
ca447d9888 updated the front end source code link to point to the correct branch. 2024-04-15 20:42:33 -05:00
34757ac461 Added an about section that is accessible through a menu button in the top right and filled it, moved source, settings, and how-to into the about section. Fixed minor issue where summary divs were not displaying the right color coding if they had no checks and were undiscovered. 2024-04-15 20:40:12 -05:00
157763876b Make the menu have an x button and do a shakey 2024-04-14 23:33:36 -05:00
fe94dfeb3b Moved settings and how-to into a top-right menu that displays over the tracker. 2024-04-14 18:47:39 -05:00
852a591684 Holy cross code images provided by Fletcher now show up in the holy cross codes section, alongside some temporary placeholders. Fixed summary colors being assigned incorrectly, and summaries without entrances/checks showing up. 2024-04-14 13:36:57 -05:00
df8555d4aa Hints now format properly, with correct coloring, and clean spacing. All possible hint images accounted for. 2024-04-13 15:51:54 -05:00
97d7b3ec8c beginning to fix hints to show icons. 2024-04-11 19:32:51 -05:00
f024e1a1cf Better error handling for when the server is inaccessible/down. 2024-04-09 03:41:51 -05:00
c44506dbec Extended timeout more. 2024-04-09 01:32:31 -05:00
4737740e48 Extended the timeout to match the API server. 2024-04-09 01:32:06 -05:00
a7313a27ce fixed a typo that sometimes caused mapped entrances to display the scene they would go to instead of the entrance they are mapped to. 2024-04-09 01:08:16 -05:00
035c97869f Fixed the "hide completed areas" option not working. 2024-04-08 23:38:55 -05:00
08cae8765e Refactored all of the javscript code. Updates, refreshes, and initializations are in their own separated functions now. 2024-04-08 22:22:32 -05:00
f15f125630 Created an initialization function for when the page loads, and/or we need to populate data after recovering from the API server being down. Removed console log error messages for when API server is down. Fixed Summary coloring for scenes with no entrances. 2024-04-07 20:13:07 -05:00
171c491497 fixed a typo on line 500 2024-04-06 23:39:44 -05:00
a79ed28dc2 Cross codes now highlight when you are in range to input them. 2024-04-06 23:13:36 -05:00
9fea6e1d95 Updated cross codes to now be ordered by how far away they are. 2024-04-06 22:48:16 -05:00
835869deea Many styling changes, reoganized elements to be at the bottom, styled buttons to look proper. Added hints list. 2024-04-06 19:23:44 -05:00
08ed4c494c Tracker with the plugin now has feature parity with the previous iteration of the backend. 2024-04-05 19:59:22 -05:00
b7cce37c93 Page refresh should update with current information. Scene and checks lists update properly in javascript. 2024-04-05 12:06:07 -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