diff --git a/.gitignore b/.gitignore index 778db6f..3bd5872 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ settings.json **/db.sqlite3 **/node_modules/** **/dist/** -spoiler.json \ No newline at end of file +spoiler.json +**/dotnet-tools.json \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 30e4534..2421536 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ asgiref==3.7.2 +autopep8==2.0.4 certifi==2024.2.2 charset-normalizer==3.3.2 click==8.1.7 @@ -6,6 +7,9 @@ colorama==0.4.6 cssbeautifier==1.15.1 Django==5.0.3 django-browser-reload==1.12.1 +django-tailwind==3.8.0 +djangorestframework==3.15.1 +djlint==1.34.1 EditorConfig==0.12.4 gunicorn==21.2.0 html-tag-names==0.1.2 @@ -16,7 +20,10 @@ json5==0.9.22 numpy==1.26.4 packaging==23.2 pathspec==0.12.1 +pillow==10.3.0 +pyarrow==15.0.1 pycodestyle==2.11.1 +pylance==0.10.2 PyYAML==6.0.1 regex==2023.12.25 requests==2.31.0 diff --git a/tunictracker/empty_doors.json b/tunictracker/empty_doors.json new file mode 100644 index 0000000..5066451 --- /dev/null +++ b/tunictracker/empty_doors.json @@ -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" } + } + } + } +} diff --git a/tunictracker/empty_hints.json b/tunictracker/empty_hints.json new file mode 100644 index 0000000..8f3df37 --- /dev/null +++ b/tunictracker/empty_hints.json @@ -0,0 +1,3 @@ +{ + "???": "There is no spoon (but in trunic)" +} \ No newline at end of file diff --git a/tunictracker/empty_items.json b/tunictracker/empty_items.json new file mode 100644 index 0000000..b4acc54 --- /dev/null +++ b/tunictracker/empty_items.json @@ -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": "" } + } + } + } +} diff --git a/tunictracker/empty_overview.json b/tunictracker/empty_overview.json new file mode 100644 index 0000000..1eccc59 --- /dev/null +++ b/tunictracker/empty_overview.json @@ -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 + } + } +} diff --git a/tunictracker/empty_spoiler.json b/tunictracker/empty_spoiler.json deleted file mode 100644 index 6586a19..0000000 --- a/tunictracker/empty_spoiler.json +++ /dev/null @@ -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": "" - } - } -} diff --git a/tunictracker/less_fun_doors.json b/tunictracker/less_fun_doors.json new file mode 100644 index 0000000..c8aa6cb --- /dev/null +++ b/tunictracker/less_fun_doors.json @@ -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": "" } + } + } + } +} diff --git a/tunictracker/less_fun_hints.json b/tunictracker/less_fun_hints.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/tunictracker/less_fun_hints.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/tunictracker/less_fun_items.json b/tunictracker/less_fun_items.json new file mode 100644 index 0000000..ef4ee51 --- /dev/null +++ b/tunictracker/less_fun_items.json @@ -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": {} } + } +} diff --git a/tunictracker/less_fun_overview.json b/tunictracker/less_fun_overview.json new file mode 100644 index 0000000..1c4463c --- /dev/null +++ b/tunictracker/less_fun_overview.json @@ -0,0 +1,8 @@ +{ + "scene": "Overworld", + "seed": 98135423, + "items": 0, + "entrances": 0, + "hints": 0, + "codes": {} +} diff --git a/tunictracker/requirements.txt b/tunictracker/requirements.txt deleted file mode 100644 index 964581e..0000000 --- a/tunictracker/requirements.txt +++ /dev/null @@ -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 diff --git a/tunictracker/tracker/data/hints.json b/tunictracker/tracker/data/hints.json new file mode 100644 index 0000000..cb9b801 --- /dev/null +++ b/tunictracker/tracker/data/hints.json @@ -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>...\"" +} diff --git a/tunictracker/tracker/forms.py b/tunictracker/tracker/forms.py index d902d38..dff66d7 100644 --- a/tunictracker/tracker/forms.py +++ b/tunictracker/tracker/forms.py @@ -5,7 +5,7 @@ from json import loads class ServerAddressForm(forms.Form): server_address_form = forms.URLField( 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): diff --git a/tunictracker/tracker/static/tracker/assets/button-functions.js b/tunictracker/tracker/static/tracker/assets/button-functions.js new file mode 100644 index 0000000..fb69598 --- /dev/null +++ b/tunictracker/tracker/static/tracker/assets/button-functions.js @@ -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"); +} diff --git a/tunictracker/tracker/static/tracker/assets/fetch-updates.js b/tunictracker/tracker/static/tracker/assets/fetch-updates.js new file mode 100644 index 0000000..9c93329 --- /dev/null +++ b/tunictracker/tracker/static/tracker/assets/fetch-updates.js @@ -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, +}; diff --git a/tunictracker/tracker/static/tracker/assets/initialize.js b/tunictracker/tracker/static/tracker/assets/initialize.js new file mode 100644 index 0000000..e69de29 diff --git a/tunictracker/tracker/static/tracker/assets/main.js b/tunictracker/tracker/static/tracker/assets/main.js new file mode 100644 index 0000000..6f3e33d --- /dev/null +++ b/tunictracker/tracker/static/tracker/assets/main.js @@ -0,0 +1,1061 @@ +import translate from "./translate-hints.js"; +import update from "./fetch-updates.js"; + +// Global state for overview +var current_scene = ""; +var current_seed = Number.MAX_VALUE; +var current_checks = 0; +var current_entrances = 0; +var current_codes = Number.MAX_VALUE; +var current_hints = 0; + +// Global state internal +var server_address = "localhost:51111/"; +var can_access_api_server = false; +var is_timeout = false; +var hide_completed_areas = false; +var cross_codes = {}; +var total_checks = 0; +var total_entrances = 0; +var all_scenes = []; + +window.onload = async () => { + await get_updated_server_address(); + await parse_cross_codes(); + await initialize_elements(); + await refresh_elements(); +}; + +async function parse_cross_codes() { + fetch(`${document.URL}static/tracker/data/holy_cross_codes.json`) + .then((response) => response.json()) + .then( + (data) => { + cross_codes = JSON.parse(JSON.stringify(data)); + }, + (error) => { + console.error(error); + } + ); +} + +async function get_updated_server_address() { + fetch(`${document.URL}get/address`) + .then( + (response) => response.json(), + (error) => { + console.error(error); + } + ) + .then( + (data) => { + const parsed_data = JSON.parse(JSON.stringify(data)); + server_address = parsed_data["listen_address"]; + }, + (error) => { + console.error(error); + } + ); +} + +// A function to call when the page loads to ensure that we have the correct data when we connect to the server. +async function initialize_elements() { + // Grab all updates from the backend. + let overview = await update.refresh_overview(server_address); + if (!overview) { + return; + } + // console.log(overview) + const checks = await update.refresh_checks(server_address); + if (!checks) { + return; + } + const entrances = await update.refresh_entrances(server_address); + if (!entrances) { + return; + } + const hints = await update.refresh_hints(server_address); + if (!hints) { + return; + } + + // Initialize global state + current_checks = parseInt(checks.collected) + parseInt(checks.found); + current_entrances = entrances.found; + total_checks = checks.total; + total_entrances = entrances.total; + all_scenes = Array.from(Object.keys(checks.scenes)); + await update_overview(overview, false); + + // Initialize breakdown list + let breakdown_list = document + .getElementById("breakdown-list") + .cloneNode(true); + let summary_list = document.getElementById("summary-list").cloneNode(true); + + // Initialize the breakdown and summary lists + breakdown_list = await initialize_breakdown_list( + breakdown_list, + checks, + entrances + ); + summary_list = await initialize_summary_list(summary_list, checks, entrances); + + // Replace breakdown list + document + .getElementById("breakdown-list") + .replaceWith(breakdown_list.cloneNode(true)); + + // Replace summary list + document + .getElementById("summary-list") + .replaceWith(summary_list.cloneNode(true)); + + // Update codes list + update_codes(overview.codes); + + // Update hints list + update_hints(hints); + return; +} + +async function refresh_elements() { + try { + const response = await update.fetch_api(server_address, "overview"); + + // Check if the "Hide completed areas" option is checked + hide_completed_areas = document.getElementById("hideDone").checked; + + if (response.data) { + if (!can_access_api_server) { + console.info("I found the server!"); + document.getElementById("status-block").classList.add("hidden"); + can_access_api_server = true; + await initialize_elements(); + } + is_timeout = false; + await update_if_changes(response.data); + setTimeout(refresh_elements, 500); + } else if (response.error) { + setTimeout(refresh_elements, 1100); + if (response.error.error) { + if (!is_timeout) { + is_timeout = true; + console.debug("Received timeout from API server."); + } + if (!can_access_api_server) { + console.info("I found the server!"); + document.getElementById("status-block").classList.add("hidden"); + can_access_api_server = true; + } + } else { + if (can_access_api_server) { + console.debug("Could not access the API server."); + document.getElementById("status-block").classList.remove("hidden"); + } + can_access_api_server = false; + } + } else { + if (can_access_api_server) { + console.debug("Could not access the API server."); + document.getElementById("status-block").classList.remove("hidden"); + } + can_access_api_server = false; + setTimeout(refresh_elements, 1100); + } + } catch (error) { + setTimeout(refresh_elements, 1100); + } +} + +async function update_if_changes(overview) { + const changed_seed = overview.seed != current_seed; + const changed_scene = overview.scene != current_scene; + const changed_checks = overview.items != current_checks; + const changed_entrances = overview.entrances != current_entrances; + const changed_hints = overview.hints != current_hints; + const any_change = + changed_seed || + changed_scene || + changed_checks || + changed_entrances || + changed_hints; + + if (any_change) { + await perform_updates( + changed_seed, + changed_checks, + changed_entrances, + changed_hints + ); + await update_overview(overview, changed_scene); + } + await update_codes(overview.codes); +} + +async function perform_updates( + changed_seed, + changed_checks, + changed_entrances, + changed_hints +) { + if (changed_seed) { + initialize_elements(); + console.debug(`Seed set to: ${current_seed}`); + } else { + if (changed_checks) { + update.refresh_checks(server_address).then((data) => { + if (data) { + update_breakdown_list(data, { entrances: false, checks: true }); + update_summary_list(data, { entrances: false, checks: true }); + } + }); + } + if (changed_entrances) { + update.refresh_entrances(server_address).then((data) => { + if (data) { + update_breakdown_list(data, { entrances: true, checks: false }); + update_summary_list(data, { entrances: true, checks: false }); + } + }); + } + if (changed_hints) { + update.refresh_hints(server_address).then((data) => { + if (data) { + update_hints(data); + } + }); + } + } +} + +async function update_overview(overview, changed_scene) { + let overview_checks_title = document + .getElementById("overview-totals") + .querySelector(".overview-checks"); + let overview_entrances_title = document + .getElementById("overview-totals") + .querySelector(".overview-entrances"); + + // Set content to updated data. + overview_checks_title.textContent = `${overview.items}/${total_checks} (${ + total_checks - overview.items + } left)`; + overview_entrances_title.textContent = `${ + overview.entrances * 2 + }/${total_entrances} (${total_entrances - overview.entrances * 2} left)`; + + // Set global state + current_seed = overview.seed; + current_scene = overview.scene; + current_checks = overview.items; + current_entrances = overview.entrances; + current_hints = overview.hints; + + if (changed_scene && all_scenes.some((scene) => scene == overview.scene)) { + await update_scene(overview.scene); + } +} + +async function update_codes(codes) { + // Codes that are always active + const default_cross_codes = cross_codes.Default; + + 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 = ""; + new_cross_codes_block_list.appendChild( + cross_codes_block_list_item.cloneNode(true) + ); + cross_codes_block_list_item.classList.remove("hidden"); + const codes_length = Array.from(Object.keys(codes)).length; + + if (current_codes != Array.from(Object.keys(codes)).length) { + Object.keys(codes) + .sort((i, j) => { + return codes[i].Distance - codes[j].Distance; + }) + .forEach((codename, index) => { + cross_codes_block_list_item.querySelector( + ".codes-list-item-title" + ).textContent = codename; + if (codes[codename].Global) { + cross_codes_block_list_item.querySelector( + ".codes-list-item-code" + ).firstElementChild.alt = cross_codes["Global"][codename] + .replace(/U/g, "⬆️") + .replace(/R/g, "➡️") + .replace(/D/g, "⬇️") + .replace(/L/g, "⬅️"); + cross_codes_block_list_item.querySelector( + ".codes-list-item-code" + ).firstElementChild.src = `/static/tracker/images/cross_codes/Global/${codename}.png`; + } else { + cross_codes_block_list_item.querySelector( + ".codes-list-item-code" + ).firstElementChild.alt = cross_codes[current_scene][codename] + .replace(/U/g, "⬆️") + .replace(/R/g, "➡️") + .replace(/D/g, "⬇️") + .replace(/L/g, "⬅️"); + cross_codes_block_list_item.querySelector( + ".codes-list-item-code" + ).firstElementChild.src = `/static/tracker/images/cross_codes/${current_scene}/${codename}.png`; + } + cross_codes_block_list_item.dataset.codename = codename; + cross_codes_block_list_item.dataset.order = index; + new_cross_codes_block_list.appendChild( + cross_codes_block_list_item.cloneNode(true) + ); + }); + 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" + ).firstElementChild.alt = default_cross_codes[code] + .replace(/U/g, "⬆️") + .replace(/R/g, "➡️") + .replace(/D/g, "⬇️") + .replace(/L/g, "⬅️"); + cross_codes_block_list_item.querySelector( + ".codes-list-item-code" + ).firstElementChild.src = `/static/tracker/images/cross_codes/Default/${code}.png`; + new_cross_codes_block_list.appendChild( + cross_codes_block_list_item.cloneNode(true) + ); + }); + document + .getElementById("codes-list") + .replaceWith(new_cross_codes_block_list); + + // Change the number of current codes if it's different + current_codes = codes_length; + } else { + Object.keys(codes) + .sort((i, j) => { + return codes[i].Distance - codes[j].Distance; + }) + .forEach((code, index) => { + const classes = Array.from( + document + .getElementById("codes-list") + .querySelector(`[data-codename="${code}"]`).classList + ).filter((classname) => classname.startsWith("order-")); + if (classes.length > 0) { + document + .getElementById("codes-list") + .querySelector(`[data-codename="${code}"]`) + .classList.remove(classes); + } + if (codes[code].Global) { + document + .getElementById("codes-list") + .querySelector(`[data-codename="${code}"]`) + .classList.add(`order-last`); + } else { + document + .getElementById("codes-list") + .querySelector(`[data-codename="${code}"]`) + .classList.add(`order-${index + 1}`); + } + if (codes[code].InRange) { + document + .getElementById("codes-list") + .querySelector(`[data-codename="${code}"]`) + .classList.add(`bg-[#ffe28558]`); + } else { + document + .getElementById("codes-list") + .querySelector(`[data-codename="${code}"]`) + .classList.remove(`bg-[#ffe28558]`); + } + document + .getElementById("codes-list") + .querySelector(`[data-codename="${code}"]`).dataset.order = index + 1; + }); + } +} + +async function apply_summary_colors(summary) { + // Apply color coding to summary block + summary.element.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 (summary.entrances_total > 0) { + if (summary.checks_total > 0) { + if (summary.checks_remaining > 0 || summary.entrances_remaining > 0) { + if (summary.checks_remaining <= 0 || summary.entrances_remaining <= 0) { + if (summary.checks_remaining == 0) { + summary.element.classList.add( + "from-highlight-entrances-light", + "to-highlight-entrances-dark", + "text-highlight-entrances-text" + ); + } else { + summary.element.classList.add( + "from-highlight-checks-light", + "to-highlight-checks-dark", + "text-highlight-checks-text" + ); + } + } else { + if (summary.entrances_found <= 0) { + summary.element.classList.add( + "from-highlight-undiscovered-light", + "to-highlight-undiscovered-dark", + "text-highlight-undiscovered-text" + ); + } + summary.element.classList.add( + "from-highlight-both-light", + "to-highlight-both-dark", + "text-highlight-both-text" + ); + } + } else { + summary.element.classList.add( + "from-highlight-empty-light", + "to-highlight-empty-dark", + "text-highlight-empty-text" + ); + } + } else { + if (summary.entrances_remaining > 0) { + if (summary.entrances_found <= 0) { + summary.element.classList.add( + "from-highlight-undiscovered-light", + "to-highlight-undiscovered-dark", + "text-highlight-undiscovered-text" + ); + } else { + summary.element.classList.add( + "from-highlight-entrances-light", + "to-highlight-entrances-dark", + "text-highlight-entrances-text" + ); + } + } else { + summary.element.classList.add( + "from-highlight-empty-light", + "to-highlight-empty-dark", + "text-highlight-empty-text" + ); + } + } + } else { + if (summary.checks_total > 0 && summary.checks_remaining > 0) { + summary.element.classList.add( + "from-highlight-checks-light", + "to-highlight-checks-dark", + "text-highlight-checks-text" + ); + } else { + summary.element.classList.add( + "from-highlight-empty-light", + "to-highlight-empty-dark", + "text-highlight-empty-text" + ); + } + } + + return summary.element; +} + +async function initialize_breakdown_list(breakdown_list, checks, entrances) { + // Initialize breakdown list + let breakdown_list_item = breakdown_list.firstElementChild.cloneNode(true); + breakdown_list.innerHTML = ""; + breakdown_list.appendChild(breakdown_list_item.cloneNode(true)); + breakdown_list_item.classList.remove("hidden"); + + for (const scene of Object.keys(checks.scenes)) { + // Initialize breakdown element + breakdown_list_item = await initialize_breakdown( + breakdown_list_item, + scene, + checks.scenes[scene], + entrances.scenes[scene] + ); + + // Add breakdown element to breakdown list + breakdown_list.appendChild(breakdown_list_item.cloneNode(true)); + } + + // Return initialized breakdown list + return breakdown_list; +} + +async function initialize_breakdown( + breakdown_element, + scene, + checks, + entrances +) { + // Initialize breakdown data + breakdown_element.dataset.scene = scene; + breakdown_element.querySelector(".breakdown-block-title").textContent = scene; + + // Populate breakdown lists + const breakdown_checks_list = + breakdown_element.querySelector(".breakdown-checks"); + const breakdown_entrances_list = breakdown_element.querySelector( + ".breakdown-entrances" + ); + const breakdown_mapped_list = breakdown_element.querySelector( + ".breakdown-block-mapped-list" + ); + const new_breakdown_checks_list = await initialize_checks_list( + breakdown_checks_list, + checks + ); + const new_entrances_lists = await initialize_entrances_list( + breakdown_entrances_list, + breakdown_mapped_list, + entrances + ); + + // Replace checks, entrances, and mapped lists + breakdown_element + .querySelector(".breakdown-checks") + .replaceWith(new_breakdown_checks_list); + breakdown_element + .querySelector(".breakdown-entrances") + .replaceWith(new_entrances_lists.entrances_list); + breakdown_element + .querySelector(".breakdown-block-mapped-list") + .replaceWith(new_entrances_lists.mapped_list); + + // Hide breakdowns that aren't for the current scene + if (current_scene == scene) { + breakdown_element.classList.add("order-first"); + breakdown_element.classList.remove("hidden", "order-last"); + breakdown_element.dataset.current = true; + } else { + breakdown_element.classList.add("hidden", "order-last"); + breakdown_element.classList.remove("order-first"); + breakdown_element.dataset.current = false; + } + + // Return initialized breakdown + return breakdown_element; +} + +async function initialize_checks_list(checks_list, checks) { + // Initialize new checks list for the breakdown + let new_breakdown_block_checks_list = checks_list + .querySelector(".breakdown-block-checks-list") + .cloneNode(true); + let breakdown_block_checks_list_item = + new_breakdown_block_checks_list.firstElementChild.cloneNode(true); + + // Clear new checks list and append blank entry + new_breakdown_block_checks_list.innerHTML = ""; + new_breakdown_block_checks_list.appendChild( + breakdown_block_checks_list_item.cloneNode(true) + ); + breakdown_block_checks_list_item.classList.remove("hidden"); + + // Update the check totals + checks_list.querySelector( + ".breakdown-block-checks-title" + ).textContent = `Checks: ${ + parseInt(checks.collected) + parseInt(checks.found) + }/${checks.total} (${checks.remaining} left)`; + checks_list.querySelector( + ".breakdown-block-checks-title" + ).dataset.checksCollected = + parseInt(checks.collected) + parseInt(checks.found); + checks_list.querySelector( + ".breakdown-block-checks-title" + ).dataset.checksRemaining = checks.remaining; + checks_list.querySelector( + ".breakdown-block-checks-title" + ).dataset.checksTotal = checks.total; + + // Populate new checks list + Object.keys(checks.checks).forEach((check) => { + if (checks.checks[check].name == "") { + breakdown_block_checks_list_item.classList.remove("hidden"); + } else { + breakdown_block_checks_list_item.classList.add("hidden"); + } + breakdown_block_checks_list_item.textContent = `❌ ${check}`; + breakdown_block_checks_list_item.dataset.check = check; + new_breakdown_block_checks_list.appendChild( + breakdown_block_checks_list_item.cloneNode(true) + ); + }); + + // Replace checks list + checks_list + .querySelector(".breakdown-block-checks-list") + .replaceWith(new_breakdown_block_checks_list); + + return checks_list; +} + +async function initialize_entrances_list( + entrances_list, + mapped_list, + entrances +) { + // Create new entrances and mapped lists and append empty entrance and mapped element + let new_breakdown_block_entrances_list = entrances_list + .querySelector(".breakdown-block-entrances-list") + .cloneNode(true); + let breakdown_block_entrances_list_item = + new_breakdown_block_entrances_list.firstElementChild.cloneNode(true); + new_breakdown_block_entrances_list.innerHTML = ""; + new_breakdown_block_entrances_list.appendChild( + breakdown_block_entrances_list_item.cloneNode(true) + ); + breakdown_block_entrances_list_item.classList.remove("hidden"); + + let new_breakdown_block_mapped_list = mapped_list.cloneNode(true); + let breakdown_block_mapped_list_item = + new_breakdown_block_mapped_list.firstElementChild.cloneNode(true); + new_breakdown_block_mapped_list.innerHTML = ""; + new_breakdown_block_mapped_list.appendChild( + breakdown_block_mapped_list_item.cloneNode(true) + ); + breakdown_block_mapped_list_item.classList.remove("hidden"); + + // Update the entrance totals + entrances_list.querySelector( + ".breakdown-block-entrances-title" + ).textContent = `Entrances: ${entrances.found}/${entrances.total} (${entrances.remaining} left)`; + entrances_list.querySelector( + ".breakdown-block-entrances-title" + ).dataset.entrancesFound = entrances.found; + entrances_list.querySelector( + ".breakdown-block-entrances-title" + ).dataset.entrancesRemaining = entrances.remaining; + entrances_list.querySelector( + ".breakdown-block-entrances-title" + ).dataset.entrancesTotal = entrances.total; + + // Populate new entrances and mapped lists + Object.keys(entrances.doors).forEach((entrance) => { + breakdown_block_entrances_list_item.dataset.entrance = entrance; + breakdown_block_entrances_list_item.textContent = `❌ ${entrance}`; + breakdown_block_mapped_list_item.dataset.mapped = entrance; + if (entrances.doors[entrance].door == "") { + breakdown_block_entrances_list_item.classList.remove("hidden"); + new_breakdown_block_entrances_list.appendChild( + breakdown_block_entrances_list_item.cloneNode(true) + ); + breakdown_block_mapped_list_item.textContent = `✔️ ${entrance} -> `; + breakdown_block_mapped_list_item.dataset.scene = ""; + breakdown_block_mapped_list_item.classList.add("hidden"); + new_breakdown_block_mapped_list.appendChild( + breakdown_block_mapped_list_item.cloneNode(true) + ); + } else { + breakdown_block_entrances_list_item.classList.add("hidden"); + new_breakdown_block_entrances_list.appendChild( + breakdown_block_entrances_list_item.cloneNode(true) + ); + breakdown_block_mapped_list_item.textContent = `✔️ ${entrance} -> ${entrances.doors[entrance].door}`; + breakdown_block_mapped_list_item.dataset.scene = + entrances.doors[entrance].scene; + breakdown_block_mapped_list_item.classList.remove("hidden"); + new_breakdown_block_mapped_list.appendChild( + breakdown_block_mapped_list_item.cloneNode(true) + ); + } + }); + + entrances_list + .querySelector(".breakdown-block-entrances-list") + .replaceWith(new_breakdown_block_entrances_list); + + // Return entrance and mapped list elements + return { + entrances_list: entrances_list, + mapped_list: new_breakdown_block_mapped_list, + }; +} + +async function initialize_summary_list(summary_list, checks, entrances) { + // Initialize summary list + let summary_list_item = + summary_list.firstElementChild.firstElementChild.cloneNode(true); + summary_list.firstElementChild.innerHTML = ""; + summary_list.firstElementChild.appendChild(summary_list_item.cloneNode(true)); + summary_list_item.classList.remove("hidden"); + + for (const scene of Object.keys(checks.scenes)) { + // Initialize summary element + summary_list_item = await initialize_summary( + summary_list_item, + scene, + checks.scenes[scene], + entrances.scenes[scene] + ); + + // Add summary element to summary list + summary_list.firstElementChild.appendChild( + summary_list_item.cloneNode(true) + ); + } + + // Return initialized summary list + return summary_list; +} + +async function initialize_summary(summary_element, scene, checks, entrances) { + // Initialize summary data + summary_element.dataset.scene = scene; + summary_element.querySelector(".summary-title").textContent = scene; + + const summary_checks = summary_element.querySelector(".summary-checks"); + summary_checks.dataset.checksCollected = + parseInt(checks.collected) + parseInt(checks.found); + summary_checks.dataset.checksRemaining = checks.remaining; + summary_checks.dataset.checksTotal = checks.total; + summary_checks.textContent = `Checks: ${ + parseInt(checks.collected) + parseInt(checks.found) + }/${checks.total} (${checks.remaining})`; + + const summary_entrances = summary_element.querySelector(".summary-entrances"); + summary_entrances.dataset.entrancesFound = entrances.found; + summary_entrances.dataset.entrancesRemaining = entrances.remaining; + summary_entrances.dataset.entrancesTotal = entrances.total; + summary_entrances.textContent = `Entrances: ${entrances.found}/${entrances.total} (${entrances.remaining})`; + + // Apply summary color coding + summary_element.firstElementChild.replaceWith( + await apply_summary_colors({ + element: summary_element.firstElementChild, + checks_collected: parseInt(checks.collected) + parseInt(checks.found), + checks_remaining: checks.remaining, + checks_total: checks.total, + entrances_found: entrances.found, + entrances_remaining: entrances.remaining, + entrances_total: entrances.total, + }) + ); + + // Hide summaries for scenes with no entrances and the current scene and completed areas if "Hide completed areas" is checked + if ((entrances.total <= 0 && checks.total <= 0) || current_scene == scene) { + summary_element.dataset.current = current_scene == scene; + summary_element.classList.add("hidden"); + } else { + if (hide_completed_areas) { + if (checks.remaining > 0 && entrances.remaining > 0) { + summary_element.classList.remove("hidden"); + } else { + summary_element.classList.add("hidden"); + } + } else { + summary_element.dataset.current = false; + summary_element.classList.remove("hidden"); + } + } + + // Return initialized summary + return summary_element; +} + +async function update_summary(scene, checks, entrances) { + // Grab summary checks and entrances + const summary_checks = document.querySelector( + `.summary[data-scene="${scene}"] .summary-checks` + ); + const summary_entrances = document.querySelector( + `.summary[data-scene="${scene}"] .summary-entrances` + ); + + // Make variables for whether checks or entrances updated + const checks_changed = + parseInt(summary_checks.dataset.checksCollected) != + parseInt(checks.collected) + parseInt(checks.found); + const entrances_changed = + parseInt(summary_entrances.dataset.entrancesFound) != + parseInt(entrances.found); + + // Check for changes, and if so, update + if (checks_changed) { + summary_checks.dataset.checksCollected = + parseInt(checks.collected) + parseInt(checks.found); + summary_checks.dataset.checksRemaining = checks.remaining; + summary_checks.dataset.checksTotal = checks.total; + summary_checks.textContent = `Checks: ${ + parseInt(checks.collected) + parseInt(checks.found) + }/${checks.total} (${checks.remaining})`; + } + if (entrances_changed) { + summary_entrances.dataset.entrancesFound = entrances.found; + summary_entrances.dataset.entrancesRemaining = entrances.remaining; + summary_entrances.dataset.entrancesTotal = entrances.total; + summary_entrances.textContent = `Entrances: ${entrances.found}/${entrances.total} (${entrances.remaining})`; + } + + // Apply color coding + if (checks_changed || entrances_changed) { + document + .querySelector(`.summary[data-scene="${scene}"]`) + .firstElementChild.replaceWith( + await apply_summary_colors({ + element: document.querySelector(`.summary[data-scene="${scene}"]`) + .firstElementChild, + checks_collected: parseInt(checks.collected) + parseInt(checks.found), + checks_remaining: checks.remaining, + checks_total: checks.total, + entrances_found: entrances.found, + entrances_remaining: entrances.remaining, + entrances_total: entrances.total, + }) + ); + } +} + +async function update_summary_list(data, changed) { + // Check whether entrances or checks changed + if (changed.checks && current_checks > 0) { + Object.keys(data.scenes).forEach((scene) => + update_summary(scene, data.scenes[scene], { + found: document.querySelector( + `.summary[data-scene="${scene}"] .summary-entrances` + ).dataset.entrancesFound, + remaining: document.querySelector( + `.summary[data-scene="${scene}"] .summary-entrances` + ).dataset.entrancesRemaining, + total: document.querySelector( + `.summary[data-scene="${scene}"] .summary-entrances` + ).dataset.entrancesTotal, + }) + ); + } else if (changed.entrances && current_entrances > 0) { + Object.keys(data.scenes).forEach((scene) => + update_summary( + scene, + { + collected: document.querySelector( + `.summary[data-scene="${scene}"] .summary-checks` + ).dataset.checksCollected, + found: 0, + remaining: document.querySelector( + `.summary[data-scene="${scene}"] .summary-checks` + ).dataset.checksRemaining, + total: document.querySelector( + `.summary[data-scene="${scene}"] .summary-checks` + ).dataset.checksTotal, + }, + data.scenes[scene] + ) + ); + } +} + +async function update_breakdown_checks(scene, checks) { + // Update the check totals + document.querySelector( + `.breakdown[data-scene="${scene}"] .breakdown-block-checks-title` + ).textContent = `Checks: ${ + parseInt(checks.collected) + parseInt(checks.found) + }/${checks.total} (${checks.remaining} left)`; + document.querySelector( + `.breakdown[data-scene="${scene}"] .breakdown-block-checks-title` + ).dataset.checksCollected = + parseInt(checks.collected) + parseInt(checks.found); + document.querySelector( + `.breakdown[data-scene="${scene}"] .breakdown-block-checks-title` + ).dataset.checksRemaining = checks.remaining; + document.querySelector( + `.breakdown[data-scene="${scene}"] .breakdown-block-checks-title` + ).dataset.checksTotal = checks.total; + + // Hide collected checks + for (const check of Object.keys(checks.checks)) { + const check_item = document.querySelector( + `.breakdown[data-scene="${scene}"] [data-check="${check}"]` + ); + if (checks.checks[check].name == "") { + check_item.classList.remove("hidden"); + } else { + check_item.classList.add("hidden"); + } + } +} + +async function update_breakdown_entrances(scene, entrances) { + // Update the entrance totals + document.querySelector( + `.breakdown[data-scene="${scene}"] .breakdown-block-entrances-title` + ).textContent = `Entrances: ${entrances.found}/${entrances.total} (${entrances.remaining} left)`; + document.querySelector( + `.breakdown[data-scene="${scene}"] .breakdown-block-entrances-title` + ).dataset.entrancesFound = entrances.found; + document.querySelector( + `.breakdown[data-scene="${scene}"] .breakdown-block-entrances-title` + ).dataset.entrancesRemaining = entrances.remaining; + document.querySelector( + `.breakdown[data-scene="${scene}"] .breakdown-block-entrances-title` + ).dataset.entrancesTotal = entrances.total; + + // Map found entrances + for (const entrance of Object.keys(entrances.doors)) { + const entrance_item = document.querySelector( + `.breakdown[data-scene="${scene}"] [data-entrance="${entrance}"]` + ); + const mapped_item = document.querySelector( + `.breakdown[data-scene="${scene}"] [data-mapped="${entrance}"]` + ); + if (entrances.doors[entrance].door == "") { + entrance_item.classList.remove("hidden"); + mapped_item.classList.add("hidden"); + } else { + entrance_item.classList.add("hidden"); + mapped_item.classList.remove("hidden"); + mapped_item.dataset.scene = entrances.doors[entrance].scene; + mapped_item.textContent = `✔️ ${entrance} -> ${entrances.doors[entrance].door}`; + } + } +} + +async function update_breakdown(scene, checks, entrances) { + // Grab breakdown checks and entrances + const breakdown_checks = document.querySelector( + `.breakdown[data-scene="${scene}"] .breakdown-block-checks-title` + ); + const breakdown_entrances = document.querySelector( + `.breakdown[data-scene="${scene}"] .breakdown-block-entrances-title` + ); + + // Check for changes, and if so, update + if ( + parseInt(breakdown_checks.dataset.checksCollected) != + parseInt(checks.collected) + parseInt(checks.found) + ) { + update_breakdown_checks(scene, checks); + } + if (parseInt(breakdown_entrances.dataset.entrancesFound) != entrances.found) { + update_breakdown_entrances(scene, entrances); + } +} + +async function update_breakdown_list(data, changed) { + // Check whether entrances or checks changed + if (changed.checks) { + Object.keys(data.scenes).forEach((scene) => + update_breakdown(scene, data.scenes[scene], { + found: parseInt( + document.querySelector( + `.breakdown[data-scene="${scene}"] .breakdown-block-entrances-title` + ).dataset.entrancesFound + ), + }) + ); + } else if (changed.entrances) { + Object.keys(data.scenes).forEach((scene) => + update_breakdown( + scene, + { + collected: parseInt( + document.querySelector( + `.breakdown[data-scene="${scene}"] .breakdown-block-checks-title` + ).dataset.checksCollected + ), + found: 0, + }, + data.scenes[scene] + ) + ); + } +} + +async function update_hints(hints) { + let hints_list = document.getElementById("hints-list").cloneNode(true); + let hints_list_item = hints_list.firstElementChild.cloneNode(true); + hints_list.innerHTML = ""; + hints_list.appendChild(hints_list_item.cloneNode(true)); + hints_list_item.classList.remove("hidden"); + for (const hint_index of Object.keys(hints)) { + hints[hint_index] = await translate.parse_hints(hints[hint_index]); + hints_list_item.firstElementChild.innerHTML = hints[hint_index]; + hints_list.appendChild(hints_list_item.cloneNode(true)); + } + document.getElementById("hints-list").replaceWith(hints_list); +} + +async function update_scene(scene) { + // Grab current scene and updated scene breakdown/summary elements + const current_breakdown_old = document.querySelector( + `.breakdown[data-current="true"]` + ); + const current_breakdown = document.querySelector( + `.breakdown[data-scene="${scene}"]` + ); + const current_summary_old = document.querySelector( + `.summary[data-current="true"]` + ); + const current_summary = document.querySelector( + `.summary[data-scene="${scene}"]` + ); + + // Update the current breakdown + current_breakdown_old.dataset.current = false; + current_breakdown_old.classList.add("hidden", "order-last"); + current_breakdown_old.classList.remove("order-first"); + current_breakdown.dataset.current = true; + current_breakdown.classList.add("order-first"); + current_breakdown.classList.remove("hidden", "order-last"); + const old_checks_remaining = parseInt( + current_summary_old.querySelector(".summary-checks").dataset.checksRemaining + ); + const old_entrances_remaining = parseInt( + current_summary_old.querySelector(".summary-entrances").dataset + .entrancesRemaining + ); + const old_checks_total = parseInt( + current_summary_old.querySelector(".summary-checks").dataset.checksTotal + ); + const old_entrances_total = parseInt( + current_summary_old.querySelector(".summary-entrances").dataset + .entrancesTotal + ); + + // Update the current summary + current_summary_old.dataset.current = false; + if (hide_completed_areas) { + if (old_checks_remaining > 0 && old_entrances_remaining > 0) { + current_summary_old.classList.remove("hidden"); + } else { + current_summary_old.classList.add("hidden"); + if (old_entrances_total <= 0 && old_checks_total <= 0) { + current_summary_old.classList.add("hidden"); + } else { + current_summary_old.classList.remove("hidden"); + } + } + } else { + if (old_entrances_total <= 0 && old_checks_total <= 0) { + current_summary_old.classList.add("hidden"); + } else { + current_summary_old.classList.remove("hidden"); + } + } + current_summary.dataset.current = true; + current_summary.classList.add("hidden"); +} diff --git a/tunictracker/tracker/static/tracker/assets/refresh.js b/tunictracker/tracker/static/tracker/assets/refresh.js deleted file mode 100644 index e19a439..0000000 --- a/tunictracker/tracker/static/tracker/assets/refresh.js +++ /dev/null @@ -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); - } - } -} diff --git a/tunictracker/tracker/static/tracker/assets/test.js b/tunictracker/tracker/static/tracker/assets/test.js new file mode 100644 index 0000000..e69de29 diff --git a/tunictracker/tracker/static/tracker/assets/translate-hints.js b/tunictracker/tracker/static/tracker/assets/translate-hints.js new file mode 100644 index 0000000..7685a8d --- /dev/null +++ b/tunictracker/tracker/static/tracker/assets/translate-hints.js @@ -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 = `${color_tags[0][1]}`; + 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, + `` + ); + } + + 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) + + " " + + 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 + // // 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 += ``; + 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 `${payload}`; +}; + +export default { parse_hints }; diff --git a/tunictracker/tracker/static/tracker/data/holy_cross_codes.json b/tunictracker/tracker/static/tracker/data/holy_cross_codes.json index 99b6fcb..c4ae08b 100644 --- a/tunictracker/tracker/static/tracker/data/holy_cross_codes.json +++ b/tunictracker/tracker/static/tracker/data/holy_cross_codes.json @@ -2,23 +2,27 @@ "Default": { "Speedrunner Code": "RULDDRULU", "Seeking Spell": "ULURDR", - "Healing Spell": "DRDLURU" + "Healing Spell": "DRDLURU", + "Plushie Code": "URRDLDRURRDLDRULDRDLLULDRDLLL" }, "Cathedral": { "Secret Legend Door": "LULURULURDRRURDLDRDLDL" }, + "Swamp": { + "Secret Legend Door": "LULURULURDRRURDLDRDLDL" + }, "Caustic Light Cave": { - "Casting Light Fairy": "RULURDRURDLDR" + "Holy Cross Chest": "RULURDRURDLDR" }, "Cube Cave": { - "Cube Fairy": "RRRRUUUURRRUUURRUURU" + "Holy Cross Chest": "RRRRUUUURRRUUURRUURU" }, "East Forest": { - "Dancer Fairy": "UDUDLRLRDLUR", - "Obelisk Fairy": "DRDLULDLURULURURULURDRDRDLDRDLU" + "Dancing Fox Spirit Holy Cross": "UDUDLRLRDLUR", + "Golden Obelisk Holy Cross": "DRDLULDLURULURURULURDRDRDLDRDLU" }, "Eastern Vault Fortress": { - "Candles Fairy": "RLDRUL" + "Candles Holy Cross": "RLDRUL" }, "Global": { "Firebomb": "LURDRURDRURDL", @@ -26,54 +30,57 @@ "Icebomb": "LDRURDRURDRUL" }, "Hourglass Cave": { - "Hourglass Door": "RULURULUURDLDRDLDR", - "Hourglass Fairy": "LURURDRURULLLURU" + "Holy Cross Door": "RULURULUURDLDRDLDR", + "Holy Cross Chest": "LURURDRURULLLURU" }, "Library Hall": { - "Library Fairy": "URDRULURULURDLDRURDRULURULULDRDLDRDL" + "Holy Cross Chest": "URDRULURULURDLDRURDRULURULULDRDLDRDL" }, "Lower Mountain": { "Top Of Mountain Door": "ULDLULDLURURULURDRULULURULDLURUULURDRDRURDLDRURRDRURDRURRDLDLDRDRDLLDRDLDRURDRURRDDLURULDLULULURRULU" }, "Maze Cave": { - "Maze Fairy": "ULDLURDRURDLULU" + "Maze Room Holy Cross": "ULDLURDRURDLULU" }, "Old House": { - "Old House Door": "ULDRDL", - "Old House Fairy": "UURDDRUURDDD" + "Holy Cross Door": "ULDRDL", + "Holy Cross Chest": "UURDDRUURDDD" }, "Overworld": { - "Back To Work Treasure": "RDLULLDRRDD", - "Compass Fairy": "LRDUUDRLURDLUDRL", - "Fire Wand Obelisk Page": "URDLDRUL", + "Starting Platform Holy Cross": "RDLULLDRRDD", + "Weathervane Holy Cross": "LRDUUDRLURDLUDRL", + "Golden Obelisk Page": "URDLDRUL", "Fountain Cross Door": "DRULUR", - "Fountain Fairy": "DLLDURD", - "Lower Flower Fairy": "URDLDLDLDLU", - "Moss Fairy": "URULDLULURDRDRULURDRD", - "Power Up Treasure": "UDRUDLUDLRDLRU", - "Sacred Geometry Treasure": "DLLUURRLDRUD", + "Fountain Holy Cross": "DLLDURD", + "Southwest Flowers Holy Cross": "URDLDLDLDLU", + "Moss Wall Holy Cross": "URULDLULURDRDRULURDRD", + "Windchimes Holy Cross": "UDRUDLUDLRDLRU", + "Windmill Holy Cross": "DLLUURRLDRUD", "Southeast Cross Door": "DRULUR", - "Upper Flowers Fairy": "ULDLDLDLURDRRDR", - "Vintage Treasure": "DRRRRRRRRRRRLLLLLLLLLLLL" + "Northeast Flowers Holy Cross": "ULDLDLDLURDRRDR", + "Haiku Holy Cross": "DRRRRRRRRRRRLLLLLLLLLLLL" }, "Patrol Cave": { - "Patrol Fairy": "DDRURDLDRURDD" + "Holy Cross Chest": "DDRURDLDRURDD" }, "Quarry": { - "Quarry Fairy": "URDLURULDLURRD" + "Bushes Holy Cross": "URDLURULDLURRD" }, "Ruined Passage": { - "Ruined Passage Door": "LURULDLURDRULURD" + "Holy Cross Door": "LURULDLURDRULURD" }, "Sealed Temple": { - "Temple Fairy": "URULURULURDRUUL" + "Holy Cross Chest": "URULURULURDRUUL" }, "Secret Gathering Place": { - "Waterfall Fairy": "DRURURULULURURULDLDLDRDLDRDRUR" + "Holy Cross Chest": "DRURURULULURURULDLDLDRDLDRDRUR" }, "West Garden": { - "Sword Door": "DRULUR", - "Tiles Fairy": "URULURULURDRULDLURULURULU", - "Tree Fairy": "LDRLUD" + "Holy Cross Door": "DRULUR", + "Holy Cross (Blue Lines)": "URULURULURDRULDLURULURULU", + "Tree Holy Cross Chest": "LDRLUD" + }, + "mystery": { + "it is a mystery": "UDLR" } } diff --git a/tunictracker/tracker/static/tracker/fonts/Trunic-Regular.otf b/tunictracker/tracker/static/tracker/fonts/Trunic-Regular.otf new file mode 100644 index 0000000..da4a6e8 Binary files /dev/null and b/tunictracker/tracker/static/tracker/fonts/Trunic-Regular.otf differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Cathedral/Secret Legend Door.png b/tunictracker/tracker/static/tracker/images/cross_codes/Cathedral/Secret Legend Door.png new file mode 100644 index 0000000..e8ea1ed Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Cathedral/Secret Legend Door.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Caustic Light Cave/Holy Cross Chest.png b/tunictracker/tracker/static/tracker/images/cross_codes/Caustic Light Cave/Holy Cross Chest.png new file mode 100644 index 0000000..b8fdb50 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Caustic Light Cave/Holy Cross Chest.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Cube Cave/Holy Cross Chest.png b/tunictracker/tracker/static/tracker/images/cross_codes/Cube Cave/Holy Cross Chest.png new file mode 100644 index 0000000..1a68b8b Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Cube Cave/Holy Cross Chest.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Default/Healing Spell.png b/tunictracker/tracker/static/tracker/images/cross_codes/Default/Healing Spell.png new file mode 100644 index 0000000..3cbaf37 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Default/Healing Spell.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Default/Plushie Code.png b/tunictracker/tracker/static/tracker/images/cross_codes/Default/Plushie Code.png new file mode 100644 index 0000000..fe9a94a Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Default/Plushie Code.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Default/Seeking Spell.png b/tunictracker/tracker/static/tracker/images/cross_codes/Default/Seeking Spell.png new file mode 100644 index 0000000..15abe62 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Default/Seeking Spell.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Default/Speedrunner Code.png b/tunictracker/tracker/static/tracker/images/cross_codes/Default/Speedrunner Code.png new file mode 100644 index 0000000..9a94330 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Default/Speedrunner Code.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/East Forest/Dancing Fox Spirit Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/East Forest/Dancing Fox Spirit Holy Cross.png new file mode 100644 index 0000000..4a700b4 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/East Forest/Dancing Fox Spirit Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/East Forest/Golden Obelisk Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/East Forest/Golden Obelisk Holy Cross.png new file mode 100644 index 0000000..fc35c52 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/East Forest/Golden Obelisk Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Eastern Vault Fortress/Candles Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/Eastern Vault Fortress/Candles Holy Cross.png new file mode 100644 index 0000000..029917a Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Eastern Vault Fortress/Candles Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Global/Firebomb.png b/tunictracker/tracker/static/tracker/images/cross_codes/Global/Firebomb.png new file mode 100644 index 0000000..9b07476 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Global/Firebomb.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Global/Firecracker.png b/tunictracker/tracker/static/tracker/images/cross_codes/Global/Firecracker.png new file mode 100644 index 0000000..9f90754 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Global/Firecracker.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Global/Icebomb.png b/tunictracker/tracker/static/tracker/images/cross_codes/Global/Icebomb.png new file mode 100644 index 0000000..07bd5d5 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Global/Icebomb.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Hourglass Cave/Holy Cross Chest.png b/tunictracker/tracker/static/tracker/images/cross_codes/Hourglass Cave/Holy Cross Chest.png new file mode 100644 index 0000000..5b6457c Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Hourglass Cave/Holy Cross Chest.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Hourglass Cave/Holy Cross Door.png b/tunictracker/tracker/static/tracker/images/cross_codes/Hourglass Cave/Holy Cross Door.png new file mode 100644 index 0000000..e10d51d Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Hourglass Cave/Holy Cross Door.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Library Hall/Holy Cross Chest.png b/tunictracker/tracker/static/tracker/images/cross_codes/Library Hall/Holy Cross Chest.png new file mode 100644 index 0000000..f8d6ed4 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Library Hall/Holy Cross Chest.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Lower Mountain/Top Of Mountain Door.png b/tunictracker/tracker/static/tracker/images/cross_codes/Lower Mountain/Top Of Mountain Door.png new file mode 100644 index 0000000..3aefebf Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Lower Mountain/Top Of Mountain Door.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Maze Cave/Maze Room Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/Maze Cave/Maze Room Holy Cross.png new file mode 100644 index 0000000..b8efc66 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Maze Cave/Maze Room Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Misc/Misc_EastForest_OneDollar.png b/tunictracker/tracker/static/tracker/images/cross_codes/Misc/Misc_EastForest_OneDollar.png new file mode 100644 index 0000000..7eee268 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Misc/Misc_EastForest_OneDollar.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Old House/Holy Cross Chest.png b/tunictracker/tracker/static/tracker/images/cross_codes/Old House/Holy Cross Chest.png new file mode 100644 index 0000000..e621225 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Old House/Holy Cross Chest.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Old House/Holy Cross Door.png b/tunictracker/tracker/static/tracker/images/cross_codes/Old House/Holy Cross Door.png new file mode 100644 index 0000000..909a490 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Old House/Holy Cross Door.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Fountain Cross Door.png b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Fountain Cross Door.png new file mode 100644 index 0000000..b239c49 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Fountain Cross Door.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Fountain Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Fountain Holy Cross.png new file mode 100644 index 0000000..dc14acb Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Fountain Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Golden Obelisk Page.png b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Golden Obelisk Page.png new file mode 100644 index 0000000..b244101 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Golden Obelisk Page.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Haiku Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Haiku Holy Cross.png new file mode 100644 index 0000000..202b543 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Haiku Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Moss Wall Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Moss Wall Holy Cross.png new file mode 100644 index 0000000..544b328 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Moss Wall Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Northeast Flowers Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Northeast Flowers Holy Cross.png new file mode 100644 index 0000000..0b55c8e Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Northeast Flowers Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Southeast Cross Door.png b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Southeast Cross Door.png new file mode 100644 index 0000000..b239c49 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Southeast Cross Door.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Southwest Flowers Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Southwest Flowers Holy Cross.png new file mode 100644 index 0000000..b10ed8f Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Southwest Flowers Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Starting Platform Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Starting Platform Holy Cross.png new file mode 100644 index 0000000..c9fa03f Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Starting Platform Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Weathervane Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Weathervane Holy Cross.png new file mode 100644 index 0000000..2caa57e Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Weathervane Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Windchimes Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Windchimes Holy Cross.png new file mode 100644 index 0000000..d61f1d5 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Windchimes Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Windmill Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Windmill Holy Cross.png new file mode 100644 index 0000000..43c9fdb Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Overworld/Windmill Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Patrol Cave/Holy Cross Chest.png b/tunictracker/tracker/static/tracker/images/cross_codes/Patrol Cave/Holy Cross Chest.png new file mode 100644 index 0000000..9b622fc Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Patrol Cave/Holy Cross Chest.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Quarry/Bushes Holy Cross.png b/tunictracker/tracker/static/tracker/images/cross_codes/Quarry/Bushes Holy Cross.png new file mode 100644 index 0000000..7524195 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Quarry/Bushes Holy Cross.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Ruined Passage/Holy Cross Door.png b/tunictracker/tracker/static/tracker/images/cross_codes/Ruined Passage/Holy Cross Door.png new file mode 100644 index 0000000..92a3ebc Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Ruined Passage/Holy Cross Door.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Sealed Temple/Holy Cross Chest.png b/tunictracker/tracker/static/tracker/images/cross_codes/Sealed Temple/Holy Cross Chest.png new file mode 100644 index 0000000..a0fcc6c Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Sealed Temple/Holy Cross Chest.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Secret Gathering Place/Holy Cross Chest.png b/tunictracker/tracker/static/tracker/images/cross_codes/Secret Gathering Place/Holy Cross Chest.png new file mode 100644 index 0000000..cac3096 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Secret Gathering Place/Holy Cross Chest.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/Swamp/Secret Legend Door.png b/tunictracker/tracker/static/tracker/images/cross_codes/Swamp/Secret Legend Door.png new file mode 100644 index 0000000..e8ea1ed Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/Swamp/Secret Legend Door.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/West Garden/Holy Cross (Blue Lines).png b/tunictracker/tracker/static/tracker/images/cross_codes/West Garden/Holy Cross (Blue Lines).png new file mode 100644 index 0000000..8910516 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/West Garden/Holy Cross (Blue Lines).png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/West Garden/Holy Cross Door.png b/tunictracker/tracker/static/tracker/images/cross_codes/West Garden/Holy Cross Door.png new file mode 100644 index 0000000..b239c49 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/West Garden/Holy Cross Door.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/West Garden/Tree Holy Cross Chest.png b/tunictracker/tracker/static/tracker/images/cross_codes/West Garden/Tree Holy Cross Chest.png new file mode 100644 index 0000000..1f74dbd Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/West Garden/Tree Holy Cross Chest.png differ diff --git a/tunictracker/tracker/static/tracker/images/cross_codes/mystery/it is a mystery.png b/tunictracker/tracker/static/tracker/images/cross_codes/mystery/it is a mystery.png new file mode 100644 index 0000000..51cb40b Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/cross_codes/mystery/it is a mystery.png differ diff --git a/tunictracker/tracker/static/tracker/images/question_mark.png b/tunictracker/tracker/static/tracker/images/question_mark.png new file mode 100644 index 0000000..9a3d021 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/question_mark.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/3333FF_hexagram.png b/tunictracker/tracker/static/tracker/images/sprites/3333FF_hexagram.png new file mode 100644 index 0000000..6c694e6 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/3333FF_hexagram.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/33FF33_hexagram.png b/tunictracker/tracker/static/tracker/images/sprites/33FF33_hexagram.png new file mode 100644 index 0000000..354ac2c Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/33FF33_hexagram.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/FF3333_hexagram.png b/tunictracker/tracker/static/tracker/images/sprites/FF3333_hexagram.png new file mode 100644 index 0000000..5b0d1d5 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/FF3333_hexagram.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/anklet.png b/tunictracker/tracker/static/tracker/images/sprites/anklet.png new file mode 100644 index 0000000..18be0c8 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/anklet.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/archipelago.png b/tunictracker/tracker/static/tracker/images/sprites/archipelago.png new file mode 100644 index 0000000..147c94a Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/archipelago.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/att.png b/tunictracker/tracker/static/tracker/images/sprites/att.png new file mode 100644 index 0000000..4b194ae Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/att.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/attrelic.png b/tunictracker/tracker/static/tracker/images/sprites/attrelic.png new file mode 100644 index 0000000..1e624d6 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/attrelic.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/aurasgem.png b/tunictracker/tracker/static/tracker/images/sprites/aurasgem.png new file mode 100644 index 0000000..6ac4bec Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/aurasgem.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/backtowork.png b/tunictracker/tracker/static/tracker/images/sprites/backtowork.png new file mode 100644 index 0000000..39b2004 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/backtowork.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/bluehex.png b/tunictracker/tracker/static/tracker/images/sprites/bluehex.png new file mode 100644 index 0000000..1278568 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/bluehex.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/bonecard.png b/tunictracker/tracker/static/tracker/images/sprites/bonecard.png new file mode 100644 index 0000000..bdf2ad2 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/bonecard.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/book.png b/tunictracker/tracker/static/tracker/images/sprites/book.png new file mode 100644 index 0000000..bfa61c1 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/book.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/bracer.png b/tunictracker/tracker/static/tracker/images/sprites/bracer.png new file mode 100644 index 0000000..dc5c658 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/bracer.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/btsr.png b/tunictracker/tracker/static/tracker/images/sprites/btsr.png new file mode 100644 index 0000000..fabc594 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/btsr.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/coin.png b/tunictracker/tracker/static/tracker/images/sprites/coin.png new file mode 100644 index 0000000..24c88d7 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/coin.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/dagger.png b/tunictracker/tracker/static/tracker/images/sprites/dagger.png new file mode 100644 index 0000000..b1304a1 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/dagger.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/daggerstrap.png b/tunictracker/tracker/static/tracker/images/sprites/daggerstrap.png new file mode 100644 index 0000000..35f9504 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/daggerstrap.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/dath.png b/tunictracker/tracker/static/tracker/images/sprites/dath.png new file mode 100644 index 0000000..59661cc Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/dath.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/def.png b/tunictracker/tracker/static/tracker/images/sprites/def.png new file mode 100644 index 0000000..6f62071 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/def.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/defrelic.png b/tunictracker/tracker/static/tracker/images/sprites/defrelic.png new file mode 100644 index 0000000..b841c18 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/defrelic.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/dusty.png b/tunictracker/tracker/static/tracker/images/sprites/dusty.png new file mode 100644 index 0000000..51d7edf Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/dusty.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/effigy.png b/tunictracker/tracker/static/tracker/images/sprites/effigy.png new file mode 100644 index 0000000..b2909d8 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/effigy.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/fairy.png b/tunictracker/tracker/static/tracker/images/sprites/fairy.png new file mode 100644 index 0000000..a72a055 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/fairy.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/firebomb.png b/tunictracker/tracker/static/tracker/images/sprites/firebomb.png new file mode 100644 index 0000000..c7f9515 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/firebomb.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/firecracker.png b/tunictracker/tracker/static/tracker/images/sprites/firecracker.png new file mode 100644 index 0000000..1d1e87f Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/firecracker.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/flask.png b/tunictracker/tracker/static/tracker/images/sprites/flask.png new file mode 100644 index 0000000..5c91181 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/flask.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/fooltrap.png b/tunictracker/tracker/static/tracker/images/sprites/fooltrap.png new file mode 100644 index 0000000..f0abd92 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/fooltrap.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/foreverfriend.png b/tunictracker/tracker/static/tracker/images/sprites/foreverfriend.png new file mode 100644 index 0000000..385633f Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/foreverfriend.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/glasscannon.png b/tunictracker/tracker/static/tracker/images/sprites/glasscannon.png new file mode 100644 index 0000000..5ad4205 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/glasscannon.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/goldhex.png b/tunictracker/tracker/static/tracker/images/sprites/goldhex.png new file mode 100644 index 0000000..25c38e5 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/goldhex.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/greenhex.png b/tunictracker/tracker/static/tracker/images/sprites/greenhex.png new file mode 100644 index 0000000..9cb85a9 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/greenhex.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/gun.png b/tunictracker/tracker/static/tracker/images/sprites/gun.png new file mode 100644 index 0000000..fd6e12f Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/gun.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/heirsword.png b/tunictracker/tracker/static/tracker/images/sprites/heirsword.png new file mode 100644 index 0000000..93f7e5f Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/heirsword.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/hexagram.png b/tunictracker/tracker/static/tracker/images/sprites/hexagram.png new file mode 100644 index 0000000..ff62f1a Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/hexagram.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/hourglass.png b/tunictracker/tracker/static/tracker/images/sprites/hourglass.png new file mode 100644 index 0000000..1af6bbb Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/hourglass.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/housekey.png b/tunictracker/tracker/static/tracker/images/sprites/housekey.png new file mode 100644 index 0000000..c5204cd Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/housekey.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/hp.png b/tunictracker/tracker/static/tracker/images/sprites/hp.png new file mode 100644 index 0000000..8553f2a Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/hp.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/hpberry.png b/tunictracker/tracker/static/tracker/images/sprites/hpberry.png new file mode 100644 index 0000000..0238739 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/hpberry.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/hprelic.png b/tunictracker/tracker/static/tracker/images/sprites/hprelic.png new file mode 100644 index 0000000..163191c Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/hprelic.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/icebomb.png b/tunictracker/tracker/static/tracker/images/sprites/icebomb.png new file mode 100644 index 0000000..daa2adf Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/icebomb.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/invertedash.png b/tunictracker/tracker/static/tracker/images/sprites/invertedash.png new file mode 100644 index 0000000..5925240 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/invertedash.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/ivy.png b/tunictracker/tracker/static/tracker/images/sprites/ivy.png new file mode 100644 index 0000000..0917c98 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/ivy.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/justsomepals.png b/tunictracker/tracker/static/tracker/images/sprites/justsomepals.png new file mode 100644 index 0000000..954b8ab Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/justsomepals.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/ladder.png b/tunictracker/tracker/static/tracker/images/sprites/ladder.png new file mode 100644 index 0000000..ecf1663 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/ladder.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/lantern.png b/tunictracker/tracker/static/tracker/images/sprites/lantern.png new file mode 100644 index 0000000..aa715e0 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/lantern.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/laurels.png b/tunictracker/tracker/static/tracker/images/sprites/laurels.png new file mode 100644 index 0000000..41fc8d4 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/laurels.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/librariansword.png b/tunictracker/tracker/static/tracker/images/sprites/librariansword.png new file mode 100644 index 0000000..e38a553 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/librariansword.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/louderecho.png b/tunictracker/tracker/static/tracker/images/sprites/louderecho.png new file mode 100644 index 0000000..5465ea8 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/louderecho.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/luckycup.png b/tunictracker/tracker/static/tracker/images/sprites/luckycup.png new file mode 100644 index 0000000..3bd22df Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/luckycup.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/lure.png b/tunictracker/tracker/static/tracker/images/sprites/lure.png new file mode 100644 index 0000000..21c2932 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/lure.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/magicecho.png b/tunictracker/tracker/static/tracker/images/sprites/magicecho.png new file mode 100644 index 0000000..bb2eb25 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/magicecho.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/mayor.png b/tunictracker/tracker/static/tracker/images/sprites/mayor.png new file mode 100644 index 0000000..331d38c Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/mayor.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/mp.png b/tunictracker/tracker/static/tracker/images/sprites/mp.png new file mode 100644 index 0000000..7b35080 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/mp.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/mpberry.png b/tunictracker/tracker/static/tracker/images/sprites/mpberry.png new file mode 100644 index 0000000..a4b0bd2 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/mpberry.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/mprelic.png b/tunictracker/tracker/static/tracker/images/sprites/mprelic.png new file mode 100644 index 0000000..94a1413 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/mprelic.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/mrmayor.png b/tunictracker/tracker/static/tracker/images/sprites/mrmayor.png new file mode 100644 index 0000000..331d38c Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/mrmayor.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/mufflingbell.png b/tunictracker/tracker/static/tracker/images/sprites/mufflingbell.png new file mode 100644 index 0000000..e490c05 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/mufflingbell.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/orb.png b/tunictracker/tracker/static/tracker/images/sprites/orb.png new file mode 100644 index 0000000..a56a5e6 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/orb.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/pepper.png b/tunictracker/tracker/static/tracker/images/sprites/pepper.png new file mode 100644 index 0000000..9859e58 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/pepper.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/perfume.png b/tunictracker/tracker/static/tracker/images/sprites/perfume.png new file mode 100644 index 0000000..9b7fe7c Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/perfume.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/phonomath.png b/tunictracker/tracker/static/tracker/images/sprites/phonomath.png new file mode 100644 index 0000000..ad042dc Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/phonomath.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/potion.png b/tunictracker/tracker/static/tracker/images/sprites/potion.png new file mode 100644 index 0000000..ebec870 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/potion.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/potionrelic.png b/tunictracker/tracker/static/tracker/images/sprites/potionrelic.png new file mode 100644 index 0000000..4aca7cc Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/potionrelic.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/powerup.png b/tunictracker/tracker/static/tracker/images/sprites/powerup.png new file mode 100644 index 0000000..893d6aa Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/powerup.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/realmoney.png b/tunictracker/tracker/static/tracker/images/sprites/realmoney.png new file mode 100644 index 0000000..4ed5489 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/realmoney.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/realsword.png b/tunictracker/tracker/static/tracker/images/sprites/realsword.png new file mode 100644 index 0000000..222204c Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/realsword.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/redhex.png b/tunictracker/tracker/static/tracker/images/sprites/redhex.png new file mode 100644 index 0000000..c86fa3f Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/redhex.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/regalweasel.png b/tunictracker/tracker/static/tracker/images/sprites/regalweasel.png new file mode 100644 index 0000000..acfb773 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/regalweasel.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/rtsr.png b/tunictracker/tracker/static/tracker/images/sprites/rtsr.png new file mode 100644 index 0000000..46a95fc Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/rtsr.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/sacredgeometry.png b/tunictracker/tracker/static/tracker/images/sprites/sacredgeometry.png new file mode 100644 index 0000000..57d80b0 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/sacredgeometry.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/scavengermask.png b/tunictracker/tracker/static/tracker/images/sprites/scavengermask.png new file mode 100644 index 0000000..cc97761 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/scavengermask.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/secretlegend.png b/tunictracker/tracker/static/tracker/images/sprites/secretlegend.png new file mode 100644 index 0000000..988e86b Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/secretlegend.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/shard.png b/tunictracker/tracker/static/tracker/images/sprites/shard.png new file mode 100644 index 0000000..a2a4740 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/shard.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/shield.png b/tunictracker/tracker/static/tracker/images/sprites/shield.png new file mode 100644 index 0000000..eabf954 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/shield.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/sp.png b/tunictracker/tracker/static/tracker/images/sprites/sp.png new file mode 100644 index 0000000..bc47659 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/sp.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/sprelic.png b/tunictracker/tracker/static/tracker/images/sprites/sprelic.png new file mode 100644 index 0000000..8d1a592 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/sprelic.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/springfalls.png b/tunictracker/tracker/static/tracker/images/sprites/springfalls.png new file mode 100644 index 0000000..1415ccd Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/springfalls.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/square.png b/tunictracker/tracker/static/tracker/images/sprites/square.png new file mode 100644 index 0000000..ea8a466 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/square.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/stick.png b/tunictracker/tracker/static/tracker/images/sprites/stick.png new file mode 100644 index 0000000..d989861 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/stick.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/tincture.png b/tunictracker/tracker/static/tracker/images/sprites/tincture.png new file mode 100644 index 0000000..2bdbba5 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/tincture.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/torch.png b/tunictracker/tracker/static/tracker/images/sprites/torch.png new file mode 100644 index 0000000..46faa09 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/torch.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/triangle.png b/tunictracker/tracker/static/tracker/images/sprites/triangle.png new file mode 100644 index 0000000..52a994c Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/triangle.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/trinket.png b/tunictracker/tracker/static/tracker/images/sprites/trinket.png new file mode 100644 index 0000000..144a5db Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/trinket.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/vaultkey.png b/tunictracker/tracker/static/tracker/images/sprites/vaultkey.png new file mode 100644 index 0000000..6ebb13c Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/vaultkey.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/vintage.png b/tunictracker/tracker/static/tracker/images/sprites/vintage.png new file mode 100644 index 0000000..a5dd96a Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/vintage.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/wand.png b/tunictracker/tracker/static/tracker/images/sprites/wand.png new file mode 100644 index 0000000..7c79a24 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/wand.png differ diff --git a/tunictracker/tracker/static/tracker/images/sprites/yellowkey.png b/tunictracker/tracker/static/tracker/images/sprites/yellowkey.png new file mode 100644 index 0000000..bf1326a Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/sprites/yellowkey.png differ diff --git a/tunictracker/tracker/static/tracker/images/trading_cards/alice.png b/tunictracker/tracker/static/tracker/images/trading_cards/alice.png new file mode 100644 index 0000000..1510a7d Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/trading_cards/alice.png differ diff --git a/tunictracker/tracker/static/tracker/images/trading_cards/fletcher.png b/tunictracker/tracker/static/tracker/images/trading_cards/fletcher.png new file mode 100644 index 0000000..3a65e3a Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/trading_cards/fletcher.png differ diff --git a/tunictracker/tracker/static/tracker/images/trading_cards/glace.png b/tunictracker/tracker/static/tracker/images/trading_cards/glace.png new file mode 100644 index 0000000..5c5eb4b Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/trading_cards/glace.png differ diff --git a/tunictracker/tracker/static/tracker/images/trunic.svg b/tunictracker/tracker/static/tracker/images/trunic.svg deleted file mode 100644 index 5a8edca..0000000 --- a/tunictracker/tracker/static/tracker/images/trunic.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tunictracker/tracker/static/tracker/images/trunic_title.png b/tunictracker/tracker/static/tracker/images/trunic_title.png deleted file mode 100644 index 104f935..0000000 Binary files a/tunictracker/tracker/static/tracker/images/trunic_title.png and /dev/null differ diff --git a/tunictracker/tracker/static/tracker/images/x_mark.png b/tunictracker/tracker/static/tracker/images/x_mark.png new file mode 100644 index 0000000..beb3214 Binary files /dev/null and b/tunictracker/tracker/static/tracker/images/x_mark.png differ diff --git a/tunictracker/tracker/templates/index.html b/tunictracker/tracker/templates/index.html index 2a547fb..9c6feaa 100644 --- a/tunictracker/tracker/templates/index.html +++ b/tunictracker/tracker/templates/index.html @@ -11,9 +11,13 @@ {% load static tailwind_tags %} {% tailwind_css %} - + + + + + - + {% block content %} {% endblock content %} diff --git a/tunictracker/tracker/templates/tracker/about/index.html b/tunictracker/tracker/templates/tracker/about/index.html new file mode 100644 index 0000000..c62f034 --- /dev/null +++ b/tunictracker/tracker/templates/tracker/about/index.html @@ -0,0 +1,19 @@ +{% load static %} +
+
+ + About this tracker + + +
+

About

+
+
+
+ {% include "tracker/howto/index.html" %} + {% include "tracker/settings/block.html" %} + {% include "tracker/credits/index.html" %} + {% include "tracker/src/index.html" with tracker_fe_link="https://gitea.werefox.cafe/ada/tunic-tracker-redux/src/branch/plugin-backend" tracker_be_link="https://github.com/spaceglace/tunic-randomizer/" %} +
+
+
diff --git a/tunictracker/tracker/templates/tracker/address/index.html b/tunictracker/tracker/templates/tracker/address/index.html index 9ae569b..814bea1 100644 --- a/tunictracker/tracker/templates/tracker/address/index.html +++ b/tunictracker/tracker/templates/tracker/address/index.html @@ -1,13 +1,13 @@
- {% csrf_token %} + class="justify-center my-auto align-top min-w-fit text-md text-nowrap">Backend {% for field in server_address_form %}{{ field }}{% endfor %}
diff --git a/tunictracker/tracker/templates/tracker/breakdown/block.html b/tunictracker/tracker/templates/tracker/breakdown/block.html index 052d05a..bd20c31 100644 --- a/tunictracker/tracker/templates/tracker/breakdown/block.html +++ b/tunictracker/tracker/templates/tracker/breakdown/block.html @@ -1,67 +1,75 @@ -
-
-
{{ scene_title }}
-
-
-
-
- Checks: {{ scene_data.Totals.Checks.Undiscovered }}/{{ scene_data.Totals.Checks.Total }} +
+
+
+
{{ scene_title }}
+
+
+
+
+
+
+
+ Checks: {{ scene_data.checks.collected }}/{{ scene_data.checks.total }} ({{ scene_data.checks.remaining }} left) +
+
+
+
+ + {% for check_name, check in scene_data.checks.checks.items %} + {% if not check.name %} +
    + ❌ {{ check_name }} +
+ {% endif %} + {% endfor %}
-
-
-
- - {% for check_name, check in scene_data.Checks.items %} - {% if not check %} -
    - ❌ {{ check_name }} -
- {% endif %} - {% endfor %}
-
-
-
- Entrances: {{ scene_data.Totals.Entrances.Undiscovered }}/{{ scene_data.Totals.Entrances.Total }} +
+
+
+
+ Entrances: {{ scene_data.entrances.found }}/{{ scene_data.entrances.total }} ({{ scene_data.entrances.remaining }} left) +
+
+
+
+ + {% for entrance_origin, entrance_destination in scene_data.entrances.doors.items %} + {% if entrance_destination.door == "" %} +
    + ❌ {{ entrance_origin }} +
+ {% endif %} + {% endfor %}
-
-
-
- - {% for entrance_origin, entrance_destination in scene_data.Entrances.items %} - {% if entrance_destination.Door == "" %} -
    - ❌ {{ entrance_origin }} -
- {% else %} - - {% endif %} - {% endfor %}
-
-
- - {% for entrance_origin, entrance_destination in scene_data.Entrances.items %} - {% if entrance_destination %} - - {% endif %} - {% endfor %} +
+
+
+ + {% for entrance_origin, entrance_destination in scene_data.entrances.doors.items %} + {% if entrance_destination.door %} + + {% endif %} + {% endfor %} +
diff --git a/tunictracker/tracker/templates/tracker/codes/block.html b/tunictracker/tracker/templates/tracker/codes/block.html index 93c75e4..518117d 100644 --- a/tunictracker/tracker/templates/tracker/codes/block.html +++ b/tunictracker/tracker/templates/tracker/codes/block.html @@ -1,9 +1,23 @@ +{% load static %} {% if not is_entered %} -
    -
    {{ name }}
    +
      +
      {{ name }}

      -
      -
      {{ code }}
      +
      + {% if is_global %} + + {% with "tracker/images/cross_codes/"|add:"Global/"|add:name|add:".png" as code_image %} + {{ code }} + {% endwith %} + + {% else %} + + {% with "tracker/images/cross_codes/"|add:current_scene|add:"/"|add:name|add:".png" as code_image %} + {{ code }} + {% endwith %} + + {% endif %} + {% comment %}
      {{ code }}
      {% endcomment %}
    {% endif %} diff --git a/tunictracker/tracker/templates/tracker/codes/index.html b/tunictracker/tracker/templates/tracker/codes/index.html index 78acca9..fd2b491 100644 --- a/tunictracker/tracker/templates/tracker/codes/index.html +++ b/tunictracker/tracker/templates/tracker/codes/index.html @@ -1,21 +1,16 @@ -
    +
    + {% comment %} drop-shadow-[0px_0px_4px_rgba(255,255,255,1)]"> {% endcomment %} Holy Cross Codes
    -
    -
    +
    +
    + {% include "tracker/codes/block.html" with is_entered=False name="it is a mystery" current_scene="mystery" code="" extra_classes="order-last hidden" %} {% for name, code in default_codes.items %} - {% include "tracker/codes/block.html" with is_entered=False %} + {% include "tracker/codes/block.html" with is_entered=False current_scene="Default" extra_classes="order-last" %} {% endfor %} - {% for scene, codes in tracked_codes.items %} - {% if scene == "Global" %} - {% for name, code_tuple in codes.items %} - {% include "tracker/codes/block.html" with code=code_tuple.0 is_entered=code_tuple.1 %} - {% endfor %} - {% elif scene == scene_title %} - {% for name, code_tuple in codes.items %} - {% include "tracker/codes/block.html" with code=code_tuple.0 is_entered=code_tuple.1 %} - {% endfor %} - {% endif %} + {% for name, values in codes.items %} + {% include "tracker/codes/block.html" with code=values.code is_entered=False is_global=values.global extra_classes="" %} {% endfor %}
    diff --git a/tunictracker/tracker/templates/tracker/credits/index.html b/tunictracker/tracker/templates/tracker/credits/index.html new file mode 100644 index 0000000..704b516 --- /dev/null +++ b/tunictracker/tracker/templates/tracker/credits/index.html @@ -0,0 +1,43 @@ +{% load static %} +
    + Credits +
    +
    +
    +
    +
    + +
    +
    +
    +
    + This tracker was created by + Alice Werefox and + glace with special help from + Fletcher whom provided the custom art assets. +
    +
    +
    +
    diff --git a/tunictracker/tracker/templates/tracker/hints/block.html b/tunictracker/tracker/templates/tracker/hints/block.html new file mode 100644 index 0000000..762932e --- /dev/null +++ b/tunictracker/tracker/templates/tracker/hints/block.html @@ -0,0 +1,3 @@ +
    +
    {{ value }}
    +
    diff --git a/tunictracker/tracker/templates/tracker/hints/list.html b/tunictracker/tracker/templates/tracker/hints/list.html new file mode 100644 index 0000000..a54f71b --- /dev/null +++ b/tunictracker/tracker/templates/tracker/hints/list.html @@ -0,0 +1,13 @@ +
    + Hints +
    +
    +
    + {% include "tracker/hints/block.html" with value="" extra_classes="hidden" %} + {% for name, value in hints.items %} + {% include "tracker/hints/block.html" %} + {% endfor %} +
    +
    +
    diff --git a/tunictracker/tracker/templates/tracker/howto/index.html b/tunictracker/tracker/templates/tracker/howto/index.html index 45b7b24..88219b6 100644 --- a/tunictracker/tracker/templates/tracker/howto/index.html +++ b/tunictracker/tracker/templates/tracker/howto/index.html @@ -1,83 +1,67 @@ -
    +
    How To Use This Tracker -
    -
    Setup
    -
      -
    • - Download the latest release at https://github.com/spaceglace/TunicTransitionTracker/releases for your OS. -
    • -
    • Run the program you just downloaded.
    • -
    • - Click/tap "Settings" and in the "AppData Path" section, enter the path to your "SAVES" directory. -
        +
        +
        + Setup +
        +
        +
        • - It should look something like: -
          - C:\\users\[username]\AppData\LocalLow\Andrew Shouldice\Secret Legend\ -
          - Or, on linux: -
          - /home/[username]/.steam/steam/steamapps/compatdata/553420/pfx/drive_c/users/steamuser/AppData/LocalLow/Andrew Shouldice/Secret Legend/ + Download the latest release at https://github.com/spaceglace/tunic-randomizer/releases, install it how you would the normal randomizer. (which you can refer to here)
        • - If you aren't sure where it is on Windows, open a file explorer window and type: -
          - %AppData%\LocalLow\Andrew Shouldice\Secret Legend\ + Run TUNIC, there should now be an "API Server" button on the quick settings panel. + Turn this on, and optionally set it to autoconnect on launch. +
        • +
        • You should be done, and the tracker should start tracking your game once you start one.
        • +
        +
        +
        +
        + Usage +
        +
        +
          +
        • + You will always be shown the current, total, and remaining checks/entrances in the game left to discover, and a breakdown of the current area you're in. +
        • +
        • + Click/tap "Summary" to look at all the totals for each area, which get color coded depending on what you still need. +
            +
          • + Gray: You haven't discovered this area +
          • +
          • + Green: You know where this is, and there are entrances and checks still left +
          • +
          • + Purple: You know where this is, and all the entrances, but there are still checks left +
          • +
          • + Orange: You know where this is, and all the checks, but there are still entrances left +
          • +
          • + Clear: You've fully discovered this area +
          • +
          +
        • +
        • + Click/tap "Holy Cross Codes" to see the codes you can do in the current area, ordered by distance. Codes will highlight when you are in range to do them, and disappear when you've input them. + Spells will always be at the bottom. +
        • +
        • + Click/tap any "Summary" block to get a breakdown of that area alongside your current area. + You can also click/tap any mapped entrance to get a breakdown of the scene that entrance would take you to. + This acts as a way to traverse the discovered areas in your game. For example, if I want to find how to get to "The Heir", I can click/tap that summary block to get a breakdown of that area, + and then click the mapped entrances until I get to the Overworld.*
        - -
      -
      Usage
      -
        -
      • - The ratios count down, so if you have 3 out of 5 total checks, that means you still need to get 3 checks out of the 5 that are in the area. -
      • -
      • - Click/tap "Summary" to look at all the totals for each area, which get color coded depending on what you still need. -
          -
        • - Gray: You haven't discovered this area -
        • -
        • - Green: You know where this is, and there are entrances and checks still left -
        • -
        • - Purple: You know where this is, and all the entrances, but there are still checks left -
        • -
        • - Orange: You know where this is, and all the checks, but there are still entrances left -
        • -
        • - Clear: You've fully discovered this area -
        • -
        -
      • -
      • - Click/tap "Holy Cross Codes" to see the codes you can do in the current area, this includes one-time spells. Codes/spells will be removed as you use them.* -
      • -
      • - Breakdown: You will always be shown the ratios of entrances and checks in the game left to discover, and a breakdown of the current area you're in. - In the breakdown, you'll be shown the ratio of totals for that area, a list of the checks and a list of the entrances still needed, and a list of the entrances that have already been discovered, alongside where they lead. -
      • -
      • - Traversal: Click/tap any mapped entrance, or any of the "Summary" blocks for an area to get another breakdown of that area alongside your current one. - This acts as a way to traverse the discovered areas in your game. For example, if I want to find how to get to "The Heir", I can click/tap that summary block to get a breakdown of that area, - and then click the mapped entrances until I get to the Overworld.** -
      • -
      • - Settings: You may have noticed there are buttons in the "Settings" section that aren't used in setup. - You can click/tap "Hide completed areas" to hide areas in the "Summary" section that have been fully cleared. - You can click/tap "Sh-OwO Debug" to show a panel that gives some debug information... if you want to. -
      • -
      -
      -
      -
    • - * Since tunic doesn't save when you do a code, it won't update until you do something that causes the game to make a new save, like pausing, going to another area, or clearing a check. -
    • -
    • - ** Ideally, this would eventually be something more straightforward, like simply listing the path to an area. That will hopefully be added later down the line. -
    • -
    +
    +
    + * Ideally, this would eventually be something more straightforward, like simply listing the path to an area. That will hopefully be added later down the line. +
    +
    +
    diff --git a/tunictracker/tracker/templates/tracker/index.html b/tunictracker/tracker/templates/tracker/index.html index 31fa58c..60e0c1b 100644 --- a/tunictracker/tracker/templates/tracker/index.html +++ b/tunictracker/tracker/templates/tracker/index.html @@ -1,107 +1,80 @@ {% extends "index.html" %} {% load static %} {% block content %} -
    -
    - {% if debug != '' %} -
    -
    -
    - - A trans pride fox emoji. - - A trans pride fox emoji. -
    -
    (Tunic Transition Tracker)
    -
    -
    -
    - {% include "tracker/howto/index.html" %} -
    -
    -
    Checks: {{ totals.Checks.Undiscovered }}/{{ totals.Checks.Total }}
    -
    - Entrances: {{ totals.Entrances.Undiscovered }}/{{ totals.Entrances.Total }} +
    +
    + {% include "tracker/about/index.html" %} +
    + {% if debug != '' %} +
    +
    +
    + + A trans pride fox emoji. + +
    Tunic Transition Tracker
    +
    +
    + ( +
     tuniik' t'raan'ziishuun' t'raakx 
    + ) +
    -
    - Summary -
    -
    -
    {% include "tracker/summary/list.html" %}
    -
    -
    -
    -
    -
    {% include "tracker/status/index.html" %} -
    -
    - {% include "tracker/breakdown/block.html" with extra_classes="hidden" %} - {% for scene_title, scene_data in scenes.items %} - {% include "tracker/breakdown/block.html" with extra_classes="hidden" %} - {% endfor %} +
    +
    +
    +
    +
    +
    + Checks +
    +
    +
    + {{ totals.Checks.Undiscovered }}/{{ totals.Checks.Total }} ({{ totals.Checks.Remaining }} left) +
    +
    +
    +
    +
    +
    + Entrances +
    +
    +
    + {{ totals.Entrances.Undiscovered }}/{{ totals.Entrances.Total }} ({{ totals.Entrances.Remaining }} left) +
    +
    +
    -
    - {% include "tracker/breakdown/block.html" with scene_title=current_scene.title scene_data=current_scene.data %} +
    +
    +
    +
    +
    + {% include "tracker/breakdown/block.html" with extra_classes="hidden" is_current_scene="false" %} + {% for scene_title, scene_data in scenes.items %} + {% if scene_title == current_scene %} + {% include "tracker/breakdown/block.html" with extra_classes="order-first" is_current_scene="true" %} + {% else %} + {% include "tracker/breakdown/block.html" with extra_classes="order-last hidden" is_current_scene="false" %} + {% endif %} + {% endfor %} +
    + {% include "tracker/summary/list.html" %} {% include "tracker/codes/index.html" %} + {% include "tracker/hints/list.html" %}
    -
    - Settings - {% include "tracker/settings/index.html" %} - {% include "tracker/address/index.html" %} -
    - - -
    -
    - - -
    -
    -
    - {% else %} -
    {% endif %}
    - - {% include "tracker/src/index.html" with tracker_fe_link="https://gitea.werefox.cafe/ada/tunic-tracker-redux" tracker_be_link="https://github.com/spaceglace/TunicTransitionTracker" %}
    {% endblock content %} diff --git a/tunictracker/tracker/templates/tracker/settings/block.html b/tunictracker/tracker/templates/tracker/settings/block.html new file mode 100644 index 0000000..0741aeb --- /dev/null +++ b/tunictracker/tracker/templates/tracker/settings/block.html @@ -0,0 +1,19 @@ +
    + Settings +
    +
    + {% include "tracker/address/index.html" %} +
    + + +
    + {% comment %}
    + + +
    {% endcomment %} +
    +
    diff --git a/tunictracker/tracker/templates/tracker/settings/index.html b/tunictracker/tracker/templates/tracker/settings/index.html index 66769c9..88b9d1b 100644 --- a/tunictracker/tracker/templates/tracker/settings/index.html +++ b/tunictracker/tracker/templates/tracker/settings/index.html @@ -1,13 +1,13 @@
    - - {% csrf_token %} - - {% for field in backend_filepath_form %}{{ field }}{% endfor %} - + + {% csrf_token %} + + {% for field in backend_filepath_form %}{{ field }}{% endfor %} +
    diff --git a/tunictracker/tracker/templates/tracker/src/index.html b/tunictracker/tracker/templates/tracker/src/index.html index e001aff..458725f 100644 --- a/tunictracker/tracker/templates/tracker/src/index.html +++ b/tunictracker/tracker/templates/tracker/src/index.html @@ -1,4 +1,4 @@ -
    + diff --git a/tunictracker/tracker/templates/tracker/status/index.html b/tunictracker/tracker/templates/tracker/status/index.html index 7aa2c97..dc703f4 100644 --- a/tunictracker/tracker/templates/tracker/status/index.html +++ b/tunictracker/tracker/templates/tracker/status/index.html @@ -1,4 +1,4 @@ -