diff --git a/tunictracker/empty_doors.json b/tunictracker/empty_doors.json new file mode 100644 index 0000000..8ba9873 --- /dev/null +++ b/tunictracker/empty_doors.json @@ -0,0 +1,23 @@ +{ + "found": 0, + "remaining": 0, + "total": 1312, + "scenes": { + "???": { + "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..aca2d19 --- /dev/null +++ b/tunictracker/empty_items.json @@ -0,0 +1,23 @@ +{ + "collected": 0, + "remaining": 0, + "total": 1312, + "scenes": { + "???": { + "collected": 0, + "remaining": 0, + "total": 0, + "checks": { + "It's a mystery": { "name": "", "owner": "" } + } + }, + "Another One": { + "collected": 69, + "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..87d9dbb --- /dev/null +++ b/tunictracker/empty_overview.json @@ -0,0 +1,10 @@ +{ + "scene": "???", + "seed": 0, + "items": 1312, + "entrances": 1312, + "hints": 0, + "codes": { + "empty": 0 + } +} 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/tracker/static/tracker/assets/button_functions.js b/tunictracker/tracker/static/tracker/assets/button_functions.js new file mode 100644 index 0000000..142247e --- /dev/null +++ b/tunictracker/tracker/static/tracker/assets/button_functions.js @@ -0,0 +1,40 @@ +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_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"); + } + }); +} diff --git a/tunictracker/tracker/static/tracker/assets/refresh.js b/tunictracker/tracker/static/tracker/assets/refresh.js deleted file mode 100644 index 0e7873f..0000000 --- a/tunictracker/tracker/static/tracker/assets/refresh.js +++ /dev/null @@ -1,973 +0,0 @@ -// Global state for overview -var current_scene = ""; -var current_seed = Number.MAX_VALUE; -var current_checks = 0; -var current_entrances = 0; -var current_hints = 0; -var current_codes = 0; -var total_checks = 0; -var total_entrances = 0; - -// Global state for all entrances -// This should hold numbers for how many entrances are mapped/total per scene. -var current_entrances_list = {}; - -// Global state for all checks -// This should hold numbers for how many checks are cleared/total per scene. -var current_checks_list = {}; - -// Global state internal -var server_address = ""; -var cross_codes = {}; - -window.onload = () => { - get_updated_server_address(); - fetch(`${document.URL}static/tracker/data/holy_cross_codes.json`) - .then((response) => response.json()) - .then( - (data) => { - cross_codes = JSON.parse(JSON.stringify(data)); - const refresh_interval = setInterval(refresh_elements, 500); - }, - (error) => { - console.log(error); - } - ); -}; - -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_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_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_overview() { - const response = await fetch(`${server_address}overview`); - const data = await response.json(); - return data; -} - -async function refresh_hints() { - const response = await fetch(`${server_address}hints`); - const data = await response.json(); - return data; -} - -async function refresh_checks() { - const response = await fetch(`${server_address}items`); - const data = await response.json(); - return data; -} - -async function refresh_entrances() { - const response = await fetch(`${server_address}doors`); - const data = await response.json(); - return data; -} - -async function update_overview(overview, changed_scene, changed_codes) { - 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 = `Checks: ${overview.items}/${total_checks}`; - overview_entrances_title.textContent = `Entrances: ${ - overview.entrances * 2 - }/${total_entrances}`; - - current_seed = overview.seed; - current_scene = overview.scene; - current_checks = overview.items; - current_entrances = overview.entrances; - current_hints = overview.hints; - current_codes = Object.keys(overview.codes).length; - - if (changed_scene) { - await update_scene(overview.scene); - } - if (changed_codes) { - console.log(Object.keys(overview.codes).length); - await update_codes(overview.codes); - } -} - -async function update_codes(codes) { - // Codes that are always active - const default_cross_codes = cross_codes.Default; - - // One time codes independent of scene - const global_cross_codes = cross_codes.Global; - - 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"); - - 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, "⬅️"); - new_cross_codes_block_list.appendChild( - cross_codes_block_list_item.cloneNode(true) - ); - }); - Object.keys(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 = cross_codes[current_scene][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) - ); - }); - console.log(codes); - document.getElementById("codes-list").replaceWith(new_cross_codes_block_list); -} - -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" - ); - - console.log(summary); - if (summary.checks_total > 0 && summary.entrances_total > 0) { - if ( - summary.checks_collected == summary.checks_total && - summary.entrances_found == summary.entrances_total - ) { - summary.element.classList.add( - "from-highlight-empty-light", - "to-highlight-empty-dark", - "text-highlight-empty-text" - ); - } else if ( - summary.checks_collected <= 0 && - summary.entrances_found <= 0 && - summary.entrances_total > 0 - ) { - summary.element.classList.add( - "from-highlight-undiscovered-light", - "to-highlight-undiscovered-dark", - "text-highlight-undiscovered-text" - ); - } else if (summary.checks_collected >= summary.checks_total) { - summary.element.classList.add( - "from-highlight-checks-light", - "to-highlight-checks-dark", - "text-highlight-checks-text" - ); - } else if (summary.entrances_found >= summary.entrances_total) { - summary.element.classList.add( - "from-highlight-entrances-light", - "to-highlight-entrances-dark", - "text-highlight-entrances-text" - ); - } else { - summary.element.classList.add( - "from-highlight-both-light", - "to-highlight-both-dark", - "text-highlight-both-text" - ); - } - } -} - -async function update_summary(updates) { - if ("checks" in updates) { - const summary_checks = document - .getElementById("summary-list") - .querySelector(`[data-scene="${updates.scene}"]`) - .querySelector(".summary-checks"); - summary_checks.textContent = `Checks: ${updates.checks}/${summary_checks.dataset.checksTotal}`; - summary_checks.dataset.checksUndiscovered = updates.checks; - apply_summary_colors({ - element: document - .getElementById("summary-list") - .querySelector(`[data-scene="${updates.scene}"]`).firstElementChild, - checks_collected: updates.checks, - checks_total: summary_checks.dataset.checksTotal, - entrances_found: document - .getElementById("summary-list") - .querySelector(`[data-scene="${updates.scene}"]`) - .querySelector(".summary-entrances").dataset.entrancesUndiscovered, - entrances_total: document - .getElementById("summary-list") - .querySelector(`[data-scene="${updates.scene}"]`) - .querySelector(".summary-entrances").dataset.entrancesTotal, - }); - } else if ("entrances" in updates) { - console.log( - `scene: ${document - .getElementById("summary-list") - .querySelector(`[data-scene="${updates.scene}"]`)}\n${ - updates.entrances - }` - ); - const summary_entrances = document - .getElementById("summary-list") - .querySelector(`[data-scene="${updates.scene}"]`) - .querySelector(".summary-entrances"); - summary_entrances.textContent = `Entrances: ${updates.entrances}/${summary_entrances.dataset.entrancesTotal}`; - summary_entrances.dataset.entrancesUndiscovered = updates.entrances; - apply_summary_colors({ - element: document - .getElementById("summary-list") - .querySelector(`[data-scene="${updates.scene}"]`).firstElementChild, - checks_collected: document - .getElementById("summary-list") - .querySelector(`[data-scene="${updates.scene}"]`) - .querySelector(".summary-checks").dataset.checksUndiscovered, - checks_total: document - .getElementById("summary-list") - .querySelector(`[data-scene="${updates.scene}"]`) - .querySelector(".summary-checks").dataset.checksTotal, - entrances_found: updates.entrances, - entrances_total: summary_entrances.dataset.entrancesTotal, - }); - } else { - console.log("What the heck is this"); - } -} - -async function update_checks(checks) { - total_checks = checks.total; - - let new_breakdown_block_checks_list = document - .getElementById("breakdown-list") - .firstElementChild.querySelector(".breakdown-block-checks-list") - .cloneNode(true); - let breakdown_block_checks_list_item = document - .getElementById("breakdown-list") - .firstElementChild.querySelector(".breakdown-block-checks-list") - .firstElementChild.cloneNode(true); - - // Create new lists with updated data. - let breakdown_list = Array.from( - document.getElementById("breakdown-list").children - ); - breakdown_list.forEach((scene) => { - // Create variables for element pointers. - let scene_title = scene.querySelector(".breakdown-block-title").textContent; - if (scene_title) { - const scene_checks = parseInt( - scene.querySelector(".breakdown-block-checks-title").dataset.checks - ); - if (scene_checks != checks.scenes[scene_title].collected) { - scene.querySelector(".breakdown-block-checks-title").dataset.checks = - scene_checks; - update_summary({ - scene: scene_title, - checks: checks.scenes[scene_title].collected, - }); - scene.querySelector( - ".breakdown-block-checks-title" - ).textContent = `Checks: ${checks.scenes[scene_title].collected}/${checks.scenes[scene_title].total}`; - - new_breakdown_block_checks_list.innerHTML = ""; - breakdown_block_checks_list_item.classList.remove("hidden"); - Object.keys(checks.scenes[scene_title].checks).forEach((check) => { - if (checks.scenes[scene_title].checks[check].name == "") { - breakdown_block_checks_list_item.textContent = `❌ ${check}`; - new_breakdown_block_checks_list.appendChild( - breakdown_block_checks_list_item.cloneNode(true) - ); - } - }); - document - .getElementById("breakdown-list") - .querySelector(`[data-breakdown-scene="${scene_title}"]`) - .querySelector(".breakdown-block-checks-list").innerHTML = ""; - document - .getElementById("breakdown-list") - .querySelector(`[data-breakdown-scene="${scene_title}"]`) - .querySelector(".breakdown-block-checks-list") - .replaceWith(new_breakdown_block_checks_list.cloneNode(true)); - } - } - }); - // current_checks = checks.collected; -} - -async function update_entrances(entrances) { - total_entrances = entrances.total; - - let new_breakdown_block_entrances_list = document - .getElementById("breakdown-list") - .firstElementChild.querySelector(".breakdown-block-entrances-list") - .cloneNode(true); - let breakdown_block_entrances_list_item = document - .getElementById("breakdown-list") - .firstElementChild.querySelector(".breakdown-block-entrances-list") - .firstElementChild.cloneNode(true); - let new_breakdown_block_mapped_list = document - .getElementById("breakdown-list") - .firstElementChild.querySelector(".breakdown-block-mapped-list") - .cloneNode(true); - let breakdown_block_mapped_list_item = document - .getElementById("breakdown-list") - .firstElementChild.querySelector(".breakdown-block-mapped-list") - .firstElementChild.cloneNode(true); - // Create new lists with updated data. - let breakdown_list = Array.from( - document.getElementById("breakdown-list").children - ); - breakdown_list.forEach((scene) => { - // Create variables for element pointers. - let scene_title = scene.querySelector(".breakdown-block-title").textContent; - if (scene_title) { - const scene_entrances = parseInt( - scene.querySelector(".breakdown-block-entrances-title").dataset - .entrances - ); - if (scene_entrances != entrances.scenes[scene_title].found) { - scene.querySelector(".breakdown-block-checks-title").dataset.entrances = - scene_entrances; - update_summary({ - scene: scene_title, - entrances: entrances.scenes[scene_title].found, - }); - scene.querySelector( - ".breakdown-block-entrances-title" - ).textContent = `Entrances: ${entrances.scenes[scene_title].found}/${entrances.scenes[scene_title].total}`; - - new_breakdown_block_entrances_list.innerHTML = ""; - breakdown_block_entrances_list_item.classList.remove("hidden"); - new_breakdown_block_mapped_list.innerHTML = ""; - breakdown_block_mapped_list_item.classList.remove("hidden"); - - Object.keys(entrances.scenes[scene_title].doors).forEach((entrance) => { - if (entrances.scenes[scene_title].doors[entrance].door == "") { - breakdown_block_entrances_list_item.textContent = `❌ ${entrance}`; - new_breakdown_block_entrances_list.appendChild( - breakdown_block_entrances_list_item.cloneNode(true) - ); - } else { - breakdown_block_mapped_list_item.textContent = `✔️ ${entrance} -> ${entrances.scenes[scene_title].doors[entrance].door}`; - breakdown_block_mapped_list_item.id = `${entrance}-mapped`; - breakdown_block_mapped_list_item.dataset.scene = - entrances.scenes[scene_title].doors[entrance].scene; - new_breakdown_block_mapped_list.appendChild( - breakdown_block_mapped_list_item.cloneNode(true) - ); - } - }); - document - .getElementById("breakdown-list") - .querySelector(`[data-breakdown-scene="${scene_title}"]`) - .querySelector(".breakdown-block-entrances-list").innerHTML = ""; - document - .getElementById("breakdown-list") - .querySelector(`[data-breakdown-scene="${scene_title}"]`) - .querySelector(".breakdown-block-entrances-list") - .replaceWith(new_breakdown_block_entrances_list.cloneNode(true)); - document - .getElementById("breakdown-list") - .querySelector(`[data-breakdown-scene="${scene_title}"]`) - .querySelector(".breakdown-block-mapped-list").innerHTML = ""; - document - .getElementById("breakdown-list") - .querySelector(`[data-breakdown-scene="${scene_title}"]`) - .querySelector(".breakdown-block-mapped-list") - .replaceWith(new_breakdown_block_mapped_list.cloneNode(true)); - } - } - }); -} - -async function update_hints(hints) { - return; -} - -async function update_scene(scene) { - Array.from(document.getElementById("breakdown-list").children).forEach( - (breakdown) => { - const breakdown_title = breakdown.querySelector( - ".breakdown-block-title" - ).textContent; - if (breakdown_title == scene) { - document - .getElementById("breakdown-list") - .querySelector(`[data-breakdown-scene="${scene}"]`) - .classList.remove("hidden"); - document - .getElementById("breakdown-list") - .querySelector(`[data-breakdown-scene="${scene}"]`).dataset.current = - "true"; - document - .getElementById("breakdown-list") - .querySelector(`[data-breakdown-scene="${scene}"]`) - .classList.add("order-last"); - } else { - document - .getElementById("breakdown-list") - .querySelector( - `[data-breakdown-scene="${breakdown_title}"]` - ).dataset.current = "false"; - - document - .getElementById("breakdown-list") - .querySelector(`[data-breakdown-scene="${breakdown_title}"]`) - .classList.add("hidden"); - document - .getElementById("breakdown-list") - .querySelector(`[data-breakdown-scene="${breakdown_title}"]`) - .classList.remove("order-last"); - } - } - ); - Array.from( - document.getElementById("summary-list").firstElementChild.children - ).forEach((summary) => { - const summary_scene = summary.dataset.scene; - if (summary_scene == scene) { - document - .getElementById("summary-list") - .firstElementChild.querySelector(`[data-scene="${scene}"]`) - .classList.add("hidden"); - } else if (!(summary_scene == "")) { - document - .getElementById("summary-list") - .firstElementChild.querySelector(`[data-scene="${summary_scene}"]`) - .classList.remove("hidden"); - } - }); -} - -async function perform_updates( - changed_seed, - changed_checks, - changed_entrances, - changed_hints -) { - if (changed_seed) { - console.log("Seed changed."); - update_checks(await refresh_checks()); - update_entrances(await refresh_entrances()); - update_hints(await refresh_hints()); - } else { - if (changed_checks) { - refresh_checks().then((data) => update_checks(data)); - } - if (changed_entrances) { - refresh_entrances().then((data) => update_entrances(data)); - } - if (changed_hints) { - refresh_hints().then((data) => update_hints(data)); - } - } -} - -async function refresh_elements() { - const overview = await refresh_overview(); - - document.getElementById("status-block").classList.add("hidden"); - - 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_codes = Object.keys(overview.codes).length != current_codes; - const changed_hints = overview.hints != current_hints; - const any_change = - changed_seed || - changed_scene || - changed_checks || - changed_entrances || - changed_codes || - changed_hints; - - if (any_change) { - await perform_updates( - changed_seed, - changed_checks, - changed_entrances, - changed_hints - ); - update_overview(overview, changed_scene, changed_codes); - } - // refresh_overview().then( - // (overview) => { - - // 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 = ""; - - // Create new lists with updated data. - // Object.keys(current_entrances_list).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 = 0; - // // all_items[scene]; - // let scene_checks_total = 0; //all_scenes[scene].Totals.Checks.Total; - // let scene_entrances_undiscovered = 0; - // // all_scenes[scene].Totals.Entrances.Undiscovered; - // let scene_entrances_total = 0; //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/refresh_elements.js b/tunictracker/tracker/static/tracker/assets/refresh_elements.js new file mode 100644 index 0000000..94aafbb --- /dev/null +++ b/tunictracker/tracker/static/tracker/assets/refresh_elements.js @@ -0,0 +1,624 @@ +import translate from "./translate-hints.js"; + +// Global state for overview +var current_scene = ""; +var current_seed = Number.MAX_VALUE; +var current_checks = 0; +var current_entrances = 0; +var current_hints = 0; +var current_codes = Number.MAX_VALUE; +var total_checks = 0; +var total_entrances = 0; + +// Global state for all entrances +// This should hold numbers for how many entrances are mapped/total per scene. +var current_entrances_list = {}; + +// Global state for all checks +// This should hold numbers for how many checks are cleared/total per scene. +var current_checks_list = {}; + +// Global state internal +var server_address = ""; +var cross_codes = {}; + +window.onload = () => { + get_updated_server_address(); + fetch(`${document.URL}static/tracker/data/holy_cross_codes.json`) + .then((response) => response.json()) + .then( + (data) => { + cross_codes = JSON.parse(JSON.stringify(data)); + refresh_overview().then((overview) => { + perform_updates(true, true, true, true); + update_overview(overview, true, true); + }); + refresh_elements(); + }, + (error) => { + console.log(error); + } + ); +}; + +async function refresh_elements() { + const overview = await refresh_overview().catch(() => + console.log("Could not access the API server.") + ); + + if (overview) { + document.getElementById("status-block").classList.add("hidden"); + + 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_codes = Object.keys(overview.codes).length != current_codes; + const changed_hints = overview.hints != current_hints; + const any_change = + changed_seed || + changed_scene || + changed_checks || + changed_entrances || + changed_codes || + changed_hints; + + if (any_change) { + await perform_updates( + changed_seed, + changed_checks, + changed_entrances, + changed_hints + ); + update_overview(overview, changed_scene, changed_codes); + } + } + setTimeout(refresh_elements, 500); +} + +async function perform_updates( + changed_seed, + changed_checks, + changed_entrances, + changed_hints +) { + if (changed_seed) { + // TODO: this at some point *needs* to initialize all the data when the seed changes, instead of relying on the initial HTML. + update_checks(await refresh_checks()); + update_entrances(await refresh_entrances()); + update_hints(await refresh_hints()); + console.log(`Seed changed to: ${current_seed}`); + } else { + if (changed_checks) { + refresh_checks().then((data) => update_checks(data)); + } + if (changed_entrances) { + refresh_entrances().then((data) => update_entrances(data)); + } + if (changed_hints) { + refresh_hints().then((data) => update_hints(data)); + } + } +} + +function notices_ur_debug() { + document.getElementById("debug-block").classList.toggle("hidden"); +} + +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) => { + const 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_overview() { + const response = await fetch(`${server_address}overview`); + const data = await response.json(); + return data; +} + +async function refresh_hints() { + const response = await fetch(`${server_address}hints`); + const data = await response.json(); + return data; +} + +async function refresh_checks() { + const response = await fetch(`${server_address}items`); + const data = await response.json(); + return data; +} + +async function refresh_entrances() { + const response = await fetch(`${server_address}doors`); + const data = await response.json(); + return data; +} + +async function update_overview(overview, changed_scene, changed_codes) { + 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)`; + + current_seed = overview.seed; + current_scene = overview.scene; + current_checks = overview.items; + current_entrances = overview.entrances; + current_hints = overview.hints; + current_codes = Object.keys(overview.codes).length; + + if (changed_scene) { + await update_scene(overview.scene); + } + if (changed_codes) { + await update_codes(overview.codes); + } +} + +async function update_codes(codes) { + // Codes that are always active + const default_cross_codes = cross_codes.Default; + + // One time codes independent of scene + const global_cross_codes = cross_codes.Global; + + 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"); + + 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, "⬅️"); + new_cross_codes_block_list.appendChild( + cross_codes_block_list_item.cloneNode(true) + ); + }); + Object.keys(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 = cross_codes[current_scene][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) + ); + }); + document.getElementById("codes-list").replaceWith(new_cross_codes_block_list); +} + +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.checks_total > 0 && summary.entrances_total > 0) { + if ( + summary.checks_collected == summary.checks_total && + summary.entrances_found == summary.entrances_total + ) { + summary.element.classList.add( + "from-highlight-empty-light", + "to-highlight-empty-dark", + "text-highlight-empty-text" + ); + } else if ( + summary.checks_collected <= 0 && + summary.entrances_found <= 0 && + summary.entrances_total > 0 + ) { + summary.element.classList.add( + "from-highlight-undiscovered-light", + "to-highlight-undiscovered-dark", + "text-highlight-undiscovered-text" + ); + } else if (summary.checks_collected >= summary.checks_total) { + summary.element.classList.add( + "from-highlight-checks-light", + "to-highlight-checks-dark", + "text-highlight-checks-text" + ); + } else if (summary.entrances_found >= summary.entrances_total) { + summary.element.classList.add( + "from-highlight-entrances-light", + "to-highlight-entrances-dark", + "text-highlight-entrances-text" + ); + } else { + summary.element.classList.add( + "from-highlight-both-light", + "to-highlight-both-dark", + "text-highlight-both-text" + ); + } + } +} + +async function update_summary(updates) { + if ("checks" in updates) { + const summary_checks = document + .getElementById("summary-list") + .querySelector(`[data-scene="${updates.scene}"]`) + .querySelector(".summary-checks"); + summary_checks.textContent = `Checks: ${updates.checks.collected}/${summary_checks.dataset.checksTotal} (${updates.checks.remaining} left)`; + summary_checks.dataset.checksUndiscovered = updates.checks.collected; + apply_summary_colors({ + element: document + .getElementById("summary-list") + .querySelector(`[data-scene="${updates.scene}"]`).firstElementChild, + checks_collected: updates.checks.collected, + checks_total: summary_checks.dataset.checksTotal, + entrances_found: document + .getElementById("summary-list") + .querySelector(`[data-scene="${updates.scene}"]`) + .querySelector(".summary-entrances").dataset.entrancesUndiscovered, + entrances_total: document + .getElementById("summary-list") + .querySelector(`[data-scene="${updates.scene}"]`) + .querySelector(".summary-entrances").dataset.entrancesTotal, + }); + } else if ("entrances" in updates) { + const summary_entrances = document + .getElementById("summary-list") + .querySelector(`[data-scene="${updates.scene}"]`) + .querySelector(".summary-entrances"); + summary_entrances.textContent = `Entrances: ${updates.entrances.found}/${summary_entrances.dataset.entrancesTotal} (${updates.entrances.remaining})`; + summary_entrances.dataset.entrancesUndiscovered = updates.entrances.found; + apply_summary_colors({ + element: document + .getElementById("summary-list") + .querySelector(`[data-scene="${updates.scene}"]`).firstElementChild, + checks_collected: document + .getElementById("summary-list") + .querySelector(`[data-scene="${updates.scene}"]`) + .querySelector(".summary-checks").dataset.checksUndiscovered, + checks_total: document + .getElementById("summary-list") + .querySelector(`[data-scene="${updates.scene}"]`) + .querySelector(".summary-checks").dataset.checksTotal, + entrances_found: updates.entrances.found, + entrances_total: summary_entrances.dataset.entrancesTotal, + }); + } else { + console.log("What the heck is this"); + } +} + +async function update_checks(checks) { + total_checks = checks.total; + + let new_breakdown_block_checks_list = document + .getElementById("breakdown-list") + .firstElementChild.querySelector(".breakdown-block-checks-list") + .cloneNode(true); + let breakdown_block_checks_list_item = document + .getElementById("breakdown-list") + .firstElementChild.querySelector(".breakdown-block-checks-list") + .firstElementChild.cloneNode(true); + + // Create new lists with updated data. + let breakdown_list = Array.from( + document.getElementById("breakdown-list").children + ); + breakdown_list.forEach((scene) => { + // Create variables for element pointers. + let scene_title = scene.querySelector(".breakdown-block-title").textContent; + if (scene_title) { + const scene_checks = parseInt( + scene.querySelector(".breakdown-block-checks-title").dataset.checks + ); + if (scene_checks != checks.scenes[scene_title].collected) { + scene.querySelector(".breakdown-block-checks-title").dataset.checks = + scene_checks; + update_summary({ + scene: scene_title, + checks: { + collected: checks.scenes[scene_title].collected, + remaining: checks.scenes[scene_title].remaining, + }, + }); + scene.querySelector( + ".breakdown-block-checks-title" + ).textContent = `Checks: ${checks.scenes[scene_title].collected}/${checks.scenes[scene_title].total} (${checks.scenes[scene_title].remaining})`; + + new_breakdown_block_checks_list.innerHTML = ""; + breakdown_block_checks_list_item.classList.remove("hidden"); + Object.keys(checks.scenes[scene_title].checks).forEach((check) => { + if (checks.scenes[scene_title].checks[check].name == "") { + breakdown_block_checks_list_item.textContent = `❌ ${check}`; + new_breakdown_block_checks_list.appendChild( + breakdown_block_checks_list_item.cloneNode(true) + ); + } + }); + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${scene_title}"]`) + .querySelector(".breakdown-block-checks-list").innerHTML = ""; + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${scene_title}"]`) + .querySelector(".breakdown-block-checks-list") + .replaceWith(new_breakdown_block_checks_list.cloneNode(true)); + } + } + }); + // current_checks = checks.collected; +} + +async function update_entrances(entrances) { + total_entrances = entrances.total; + + let new_breakdown_block_entrances_list = document + .getElementById("breakdown-list") + .firstElementChild.querySelector(".breakdown-block-entrances-list") + .cloneNode(true); + let breakdown_block_entrances_list_item = document + .getElementById("breakdown-list") + .firstElementChild.querySelector(".breakdown-block-entrances-list") + .firstElementChild.cloneNode(true); + let new_breakdown_block_mapped_list = document + .getElementById("breakdown-list") + .firstElementChild.querySelector(".breakdown-block-mapped-list") + .cloneNode(true); + let breakdown_block_mapped_list_item = document + .getElementById("breakdown-list") + .firstElementChild.querySelector(".breakdown-block-mapped-list") + .firstElementChild.cloneNode(true); + // Create new lists with updated data. + let breakdown_list = Array.from( + document.getElementById("breakdown-list").children + ); + breakdown_list.forEach((scene) => { + // Create variables for element pointers. + let scene_title = scene.querySelector(".breakdown-block-title").textContent; + if (scene_title) { + const scene_entrances = parseInt( + scene.querySelector(".breakdown-block-entrances-title").dataset + .entrances + ); + if (scene_entrances != entrances.scenes[scene_title].found) { + scene.querySelector(".breakdown-block-checks-title").dataset.entrances = + scene_entrances; + update_summary({ + scene: scene_title, + entrances: { + found: entrances.scenes[scene_title].found, + remaining: entrance.scenes[scene_title].remaining, + }, + }); + scene.querySelector( + ".breakdown-block-entrances-title" + ).textContent = `Entrances: ${entrances.scenes[scene_title].found}/${entrances.scenes[scene_title].total} (${entrances.scenes[scene_title].remaining})`; + + new_breakdown_block_entrances_list.innerHTML = ""; + breakdown_block_entrances_list_item.classList.remove("hidden"); + new_breakdown_block_mapped_list.innerHTML = ""; + breakdown_block_mapped_list_item.classList.remove("hidden"); + + Object.keys(entrances.scenes[scene_title].doors).forEach((entrance) => { + if (entrances.scenes[scene_title].doors[entrance].door == "") { + breakdown_block_entrances_list_item.textContent = `❌ ${entrance}`; + new_breakdown_block_entrances_list.appendChild( + breakdown_block_entrances_list_item.cloneNode(true) + ); + } else { + breakdown_block_mapped_list_item.textContent = `✔️ ${entrance} -> ${entrances.scenes[scene_title].doors[entrance].door}`; + breakdown_block_mapped_list_item.id = `${entrance}-mapped`; + breakdown_block_mapped_list_item.dataset.scene = + entrances.scenes[scene_title].doors[entrance].scene; + new_breakdown_block_mapped_list.appendChild( + breakdown_block_mapped_list_item.cloneNode(true) + ); + } + }); + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${scene_title}"]`) + .querySelector(".breakdown-block-entrances-list").innerHTML = ""; + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${scene_title}"]`) + .querySelector(".breakdown-block-entrances-list") + .replaceWith(new_breakdown_block_entrances_list.cloneNode(true)); + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${scene_title}"]`) + .querySelector(".breakdown-block-mapped-list").innerHTML = ""; + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${scene_title}"]`) + .querySelector(".breakdown-block-mapped-list") + .replaceWith(new_breakdown_block_mapped_list.cloneNode(true)); + } + } + }); +} + +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 = ""; + Object.keys(hints).forEach((hint_index) => { + let hint = hints[hint_index].split( + /(\[[\w\s]+?\]|\"[\w \d\>\<#.\-\']+\"|\<[\w\d#]+\>)/gm + ); + hint = hint.map((segment) => { + segment = segment.trim(); + if (segment) { + if ( + !( + segment.startsWith("[") || + segment.startsWith("<") || + segment.startsWith('"') + ) + ) { + segment = translate(segment.trim()); + } else if (segment.startsWith("[")) { + segment = segment.trim(); + } else { + segment = ` ${segment.trim()} `; + } + return segment; + } + }); + hints[hint_index] = hint.join(""); + }); + Object.keys(hints).forEach((hint_index) => { + let hint = hints[hint_index]; + let matches = Array.from( + hint.matchAll(/\<([\w\d#]+)\>(.*)(\<[\w\d#]+\>)/gm) + ); + if (matches.length >= 1) { + hint = hint.replace( + /(\<[\w\d#]+\>.*\<[\w\d#]+\>)/gm, + `${matches[0][2]}` + ); + } + hint = hint.replace(/ "|" /gm, " "); + hints_list_item.firstElementChild.innerHTML = hint; + hints_list.appendChild(hints_list_item.cloneNode(true)); + }); + document.getElementById("hints-list").innerHTML = ""; + document.getElementById("hints-list").replaceWith(hints_list); +} + +async function update_scene(scene) { + Array.from(document.getElementById("breakdown-list").children).forEach( + (breakdown) => { + const breakdown_title = breakdown.querySelector( + ".breakdown-block-title" + ).textContent; + if (breakdown_title == scene) { + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${scene}"]`) + .classList.remove("hidden"); + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${scene}"]`).dataset.current = + "true"; + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${scene}"]`) + .classList.remove("order-last"); + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${scene}"]`) + .classList.add("order-first"); + } else { + document + .getElementById("breakdown-list") + .querySelector( + `[data-breakdown-scene="${breakdown_title}"]` + ).dataset.current = "false"; + + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${breakdown_title}"]`) + .classList.add("hidden"); + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${scene}"]`) + .classList.add("order-last"); + document + .getElementById("breakdown-list") + .querySelector(`[data-breakdown-scene="${breakdown_title}"]`) + .classList.remove("order-first"); + } + } + ); + Array.from( + document.getElementById("summary-list").firstElementChild.children + ).forEach((summary) => { + const summary_scene = summary.dataset.scene; + if (summary_scene == scene) { + document + .getElementById("summary-list") + .firstElementChild.querySelector(`[data-scene="${scene}"]`) + .classList.add("hidden"); + } else if (!(summary_scene == "")) { + document + .getElementById("summary-list") + .firstElementChild.querySelector(`[data-scene="${summary_scene}"]`) + .classList.remove("hidden"); + } + }); +} 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..26fae1a --- /dev/null +++ b/tunictracker/tracker/static/tracker/assets/translate-hints.js @@ -0,0 +1,99 @@ +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 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 translate; diff --git a/tunictracker/tracker/static/tracker/data/holy_cross_codes.json b/tunictracker/tracker/static/tracker/data/holy_cross_codes.json index 595a04e..e8667d6 100644 --- a/tunictracker/tracker/static/tracker/data/holy_cross_codes.json +++ b/tunictracker/tracker/static/tracker/data/holy_cross_codes.json @@ -8,18 +8,21 @@ "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", @@ -27,54 +30,54 @@ "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 Flowers 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" } } 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/templates/index.html b/tunictracker/tracker/templates/index.html index 2a547fb..a855253 100644 --- a/tunictracker/tracker/templates/index.html +++ b/tunictracker/tracker/templates/index.html @@ -11,9 +11,12 @@ {% load static tailwind_tags %} {% tailwind_css %} - + + + + - + {% block content %} {% endblock content %} diff --git a/tunictracker/tracker/templates/tracker/breakdown/block.html b/tunictracker/tracker/templates/tracker/breakdown/block.html index 612cac8..aee0432 100644 --- a/tunictracker/tracker/templates/tracker/breakdown/block.html +++ b/tunictracker/tracker/templates/tracker/breakdown/block.html @@ -8,7 +8,7 @@
- Checks: {{ scene_data.checks.collected }}/{{ scene_data.checks.total }} + Checks: {{ scene_data.checks.collected }}/{{ scene_data.checks.total }} ({{ scene_data.checks.remaining }} left)

@@ -28,7 +28,7 @@
- Entrances: {{ scene_data.entrances.found }}/{{ scene_data.entrances.total }} + Entrances: {{ scene_data.entrances.found }}/{{ scene_data.entrances.total }} ({{ scene_data.entrances.remaining }} left)

diff --git a/tunictracker/tracker/templates/tracker/codes/index.html b/tunictracker/tracker/templates/tracker/codes/index.html index ee33f89..23d583a 100644 --- a/tunictracker/tracker/templates/tracker/codes/index.html +++ b/tunictracker/tracker/templates/tracker/codes/index.html @@ -1,4 +1,4 @@ -
+
{% comment %} drop-shadow-[0px_0px_4px_rgba(255,255,255,1)]"> {% endcomment %} Holy Cross Codes
diff --git a/tunictracker/tracker/templates/tracker/hints/index.html b/tunictracker/tracker/templates/tracker/hints/index.html new file mode 100644 index 0000000..5ee37cb --- /dev/null +++ b/tunictracker/tracker/templates/tracker/hints/index.html @@ -0,0 +1,3 @@ +
+
{{ value }}
+
diff --git a/tunictracker/tracker/templates/tracker/howto/index.html b/tunictracker/tracker/templates/tracker/howto/index.html index 45b7b24..b7617d2 100644 --- a/tunictracker/tracker/templates/tracker/howto/index.html +++ b/tunictracker/tracker/templates/tracker/howto/index.html @@ -1,8 +1,8 @@ -
+
How To Use This Tracker
-
Setup
- -
Usage
-
    +
    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.
    • @@ -72,7 +72,7 @@

    -
    +
  • * 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.
  • diff --git a/tunictracker/tracker/templates/tracker/index.html b/tunictracker/tracker/templates/tracker/index.html index e6036b8..8095f85 100644 --- a/tunictracker/tracker/templates/tracker/index.html +++ b/tunictracker/tracker/templates/tracker/index.html @@ -6,39 +6,49 @@ {% if debug != '' %}
    -
    - +
    + A trans pride fox emoji. - A trans pride fox emoji. +
    Tunic Transition Tracker
    +
    +
    + ( +
     tuniik' t'raan'ziishuun' t'raakx 
    + )
    -
    (Tunic Transition Tracker)
    - {% include "tracker/howto/index.html" %} -
    +
    -
    Checks: {{ totals.Checks.Undiscovered }}/{{ totals.Checks.Total }}
    -
    - Entrances: {{ totals.Entrances.Undiscovered }}/{{ totals.Entrances.Total }} +
    +
    +
    + Checks +
    +
    +
    + {{ totals.Checks.Undiscovered }}/{{ totals.Checks.Total }} ({{ totals.Checks.Remaining }} left) +
    +
    +
    +
    +
    +
    + Entrances +
    +
    +
    + {{ totals.Entrances.Undiscovered }}/{{ totals.Entrances.Total }} ({{ totals.Entrances.Remaining }} left) +
    +
    -
    - Summary -
    -
    -
    {% include "tracker/summary/list.html" %}
    -
    -

    @@ -48,20 +58,36 @@ {% 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-last" is_current_scene="true" %} + {% include "tracker/breakdown/block.html" with extra_classes="order-first" is_current_scene="true" %} {% else %} - {% include "tracker/breakdown/block.html" with extra_classes="hidden" is_current_scene="false" %} + {% include "tracker/breakdown/block.html" with extra_classes="order-last hidden" is_current_scene="false" %} {% endif %} {% endfor %}
    - {% comment %}
    - {% include "tracker/breakdown/block.html" with scene_title=current_scene.title scene_data=current_scene.data %} -
    {% endcomment %} - {% include "tracker/codes/index.html" %}
    -
    +
    + Summary +
    +
    +
    {% include "tracker/summary/list.html" %}
    +
    +
    + {% include "tracker/codes/index.html" %} +
    + Hints +
    +
    +
    + {% include "tracker/hints/index.html" with value="" %} + {% for name, value in hints.items %} + {% include "tracker/hints/index.html" %} + {% endfor %} +
    +
    +
    +
    Settings - {% comment %} {% include "tracker/settings/index.html" %} {% endcomment %} {% include "tracker/address/index.html" %}
    + {% include "tracker/howto/index.html" %}
    {% else %}
    {% endif %}
    diff --git a/tunictracker/tracker/templates/tracker/summary/block.html b/tunictracker/tracker/templates/tracker/summary/block.html index f7869c6..64de2ab 100644 --- a/tunictracker/tracker/templates/tracker/summary/block.html +++ b/tunictracker/tracker/templates/tracker/summary/block.html @@ -7,12 +7,12 @@
    - Checks: {{ scene_data.checks.collected }}/{{ scene_data.checks.total }} + Checks: {{ scene_data.checks.collected }}/{{ scene_data.checks.total }} ({{ scene_data.checks.remaining }})
    - Entrances: {{ scene_data.entrances.found }}/{{ scene_data.entrances.total }} + Entrances: {{ scene_data.entrances.found }}/{{ scene_data.entrances.total }} ({{ scene_data.entrances.remaining }})
    diff --git a/tunictracker/tracker/views.py b/tunictracker/tracker/views.py index 1d90d1a..c8c390e 100644 --- a/tunictracker/tracker/views.py +++ b/tunictracker/tracker/views.py @@ -4,7 +4,7 @@ from django.template import loader from json import loads, dumps from math import floor import requests -from .forms import ServerAddressForm # , BackendFilepathForm +from .forms import ServerAddressForm import logging # Create your views here. @@ -12,8 +12,6 @@ import logging # Debug and defaults. defaults = { "listen_address": "http://localhost:51111/", - # 'backend_filepath': '', - # 'backend_filepath_updated': False, } logging.basicConfig(encoding="utf-8", level=logging.DEBUG) @@ -35,7 +33,6 @@ def session_key(session, key): def index(request): listen_address = session_key(request.session, "listen_address") - # backend_filepath = session_key(request.session, 'backend_filepath') try: request_overview_data = requests.get( @@ -50,31 +47,19 @@ def index(request): request_hints_data = requests.get( f"{listen_address}hints", timeout=5, verify=True ).text - # if (loads(request_data)['Scenes'] == None): - # with open('empty_spoiler.json', 'r') as t: - # try: - # request_data = t.read() - - # except: - # return - except: - with open("empty_spoiler.json", "r") as t: - try: - tracker_output = loads(t.read()) - - except: - return - try: tracker_overview_data = loads(request_overview_data) tracker_items_data = loads(request_items_data) tracker_doors_data = loads(request_doors_data) tracker_hints_data = loads(request_hints_data) except: - with open("empty_spoiler.json", "r") as t: - try: - tracker_output = loads(t.read()) - except: - return + with open("less_fun_overview.json", "r") as t: + tracker_overview_data = loads(t.read()) + with open("less_fun_items.json", "r") as t: + tracker_items_data = loads(t.read()) + with open("less_fun_doors.json", "r") as t: + tracker_doors_data = loads(t.read()) + with open("less_fun_hints.json", "r") as t: + tracker_hints_data = loads(t.read()) with open("tracker/static/tracker/data/holy_cross_codes.json", "r") as t: try: temp_codes = loads(t.read()) @@ -92,13 +77,6 @@ def index(request): except: return - # tracker_debug = tracker_output['Debug'] - # tracker_totals = tracker_output['Totals'] - # tracker_current_scene = tracker_output['Current']['Scene'] - # tracker_current_scene_data = tracker_output['Scenes'][tracker_current_scene] - # tracker_scenes = tracker_output['Scenes'] - # entered_codes = tracker_output['Codes'] - # Data from the /overview API call tracker_current_scene = tracker_overview_data["scene"] tracker_seed = tracker_overview_data["seed"] @@ -107,10 +85,12 @@ def index(request): # Data from the /doors API call tracker_entrances_total = tracker_doors_data["total"] + tracker_entrances_remaining = tracker_doors_data["remaining"] tracker_entrances_mapped_total = tracker_doors_data["found"] # Data from the /items API call tracker_checks_total = tracker_items_data["total"] + tracker_checks_remaining = tracker_items_data["remaining"] tracker_checks_cleared_total = tracker_items_data["collected"] active_codes = {} @@ -121,16 +101,6 @@ def index(request): } logging.debug(active_codes) - # try: - # tracker_codes = cross_codes - # for scene in entered_codes: - # for k, v in cross_codes[scene].items(): - # tracker_codes[scene][k] = ( - # v, entered_codes[scene][k]) - # except Exception as e: - # current_cross_codes = {} - # # print(e) - scene_data = {} for scene in tracker_doors_data["scenes"].keys(): scene_data[scene] = { @@ -141,64 +111,34 @@ def index(request): template = loader.get_template("tracker/index.html") server_address_form = ServerAddressForm() server_address_form.fields["server_address_form"].initial = listen_address - # backend_filepath_form = BackendFilepathForm() - # backend_filepath_form.fields['backend_filepath_form'].initial = backend_filepath logging.debug(format_overview_output(tracker_overview_data)) context = { - # 'backend_filepath': backend_filepath, "server_address": listen_address, - # 'is_hidden': is_hidden, "debug": {}, "default_codes": cross_codes["Default"], "totals": { "Checks": { "Undiscovered": tracker_checks_cleared_total, + "Remaining": tracker_checks_remaining, "Total": tracker_checks_total, }, "Entrances": { "Undiscovered": tracker_entrances_mapped_total, + "Remaining": tracker_entrances_remaining, "Total": tracker_entrances_total, }, }, "scenes": scene_data, "current_scene": tracker_current_scene, - # "current_scene": { - # "title": tracker_current_scene, - # "data": { - # "checks": tracker_items_data["scenes"][tracker_current_scene], - # "entrances": tracker_doors_data["scenes"][tracker_current_scene], - # "Totals": { - # "Checks": { - # "Undiscovered": tracker_items_data["scenes"][ - # tracker_current_scene - # ]["collected"], - # "Total": tracker_items_data["scenes"][tracker_current_scene][ - # "total" - # ], - # }, - # "Entrances": { - # "Undiscovered": tracker_doors_data["scenes"][ - # tracker_current_scene - # ]["found"], - # "Total": tracker_doors_data["scenes"][tracker_current_scene][ - # "total" - # ], - # }, - # }, - # "Codes": tracker_current_scene_codes, - # }, "codes": active_codes, - # }, "server_address_form": server_address_form, - # 'backend_filepath_form': backend_filepath_form + "hints": tracker_hints_data, } return HttpResponse(template.render(context, request)) def get_address(request): if request.method == "GET": - # session_key(request.session, 'backend_filepath_updated') - # 'backend_filepath_updated': request.session['backend_filepath_updated']}), content_type="application/json") return HttpResponse( dumps({"listen_address": request.session["listen_address"]}), content_type="application/json", @@ -218,26 +158,6 @@ def set_address(request): return render(request, "tracker/index.html", {"server_address_form": form}) -# def set_settings(request): -# if request.method == 'POST': -# form = BackendFilepathForm(request.POST) -# if form.is_valid(): -# request.session['backend_filepath'] = form.cleaned_data['backend_filepath_form'] -# request.session['backend_filepath_updated'] = True -# return HttpResponseRedirect('/') -# else: -# form = BackendFilepathForm() -# return render(request, 'tracker/index.html', {'backend_filepath_form': form}) - - -# def get_settings(request): -# if request.method == 'GET': -# request.session['backend_filepath_updated'] = False -# return HttpResponse(dumps(request.session['backend_filepath']), content_type="application/json") -# else: -# return render(request, 'tracker/index.html') - - def format_overview_output(overview): overview_string = "\nReceived Overview Data:\n" for key, value in overview.items(): diff --git a/tunictracker/tunictracker/settings.py b/tunictracker/tunictracker/settings.py index 90d1551..ecc1e33 100644 --- a/tunictracker/tunictracker/settings.py +++ b/tunictracker/tunictracker/settings.py @@ -28,6 +28,7 @@ DEBUG = True ALLOWED_HOSTS = [ "localhost", "127.0.0.1", + "100.64.0.4", "tunic.werefox.cafe" ] diff --git a/tunictracker/werefoxtheme/static/fonts/Trunic-Regular.otf b/tunictracker/werefoxtheme/static/fonts/Trunic-Regular.otf new file mode 100644 index 0000000..da4a6e8 Binary files /dev/null and b/tunictracker/werefoxtheme/static/fonts/Trunic-Regular.otf differ diff --git a/tunictracker/werefoxtheme/static_src/src/fonts/Trunic-Regular.otf b/tunictracker/werefoxtheme/static_src/src/fonts/Trunic-Regular.otf new file mode 100644 index 0000000..da4a6e8 Binary files /dev/null and b/tunictracker/werefoxtheme/static_src/src/fonts/Trunic-Regular.otf differ diff --git a/tunictracker/werefoxtheme/static_src/src/styles.css b/tunictracker/werefoxtheme/static_src/src/styles.css index 391d723..71bfc11 100644 --- a/tunictracker/werefoxtheme/static_src/src/styles.css +++ b/tunictracker/werefoxtheme/static_src/src/styles.css @@ -3,6 +3,10 @@ @tailwind utilities; @font-face { - font-family: "DejaVuSansMono"; - src: url("/static/fonts/DejaVuSansMono.ttf"); -} \ No newline at end of file + font-family: "DejaVuSansMono"; + src: url("/static/fonts/DejaVuSansMono.ttf"); +} +@font-face { + font-family: "Trunic-Regular"; + src: url("/static/fonts/Trunic-Regular.otf"); +} diff --git a/tunictracker/werefoxtheme/static_src/tailwind.config.js b/tunictracker/werefoxtheme/static_src/tailwind.config.js index 7732a61..310824d 100644 --- a/tunictracker/werefoxtheme/static_src/tailwind.config.js +++ b/tunictracker/werefoxtheme/static_src/tailwind.config.js @@ -52,6 +52,7 @@ module.exports = { extend: { fontFamily: { nerd: ["DejaVuSansMono"], + trunic: ["Trunic-Regular"], }, colors: { bluelight: { @@ -118,6 +119,109 @@ module.exports = { DEFAULT: "fffae0", }, }, + keyframes: { + shake: { + "2%": { transform: "translate(-0.5px, 2.5px) " }, + "2%": { transform: "rotate(-0.5deg)" }, + "4%": { transform: "translate(0.5px, -1.5px) " }, + "4%": { transform: "rotate(-0.5deg)" }, + "6%": { transform: "translate(1.5px, -1.5px) " }, + "6%": { transform: "rotate(1.5deg)" }, + "8%": { transform: "translate(0.5px, 2.5px) " }, + "8%": { transform: "rotate(-0.5deg)" }, + "10%": { transform: "translate(-1.5px, 2.5px) " }, + "10%": { transform: "rotate(1.5deg)" }, + "12%": { transform: "translate(2.5px, -0.5px) " }, + "12%": { transform: "rotate(-0.5deg)" }, + "14%": { transform: "translate(2.5px, 2.5px) " }, + "14%": { transform: "rotate(1.5deg)" }, + "16%": { transform: "translate(1.5px, 1.5px) " }, + "16%": { transform: "rotate(0.5deg)" }, + "18%": { transform: "translate(0.5px, 2.5px) " }, + "18%": { transform: "rotate(1.5deg)" }, + "20%": { transform: "translate(1.5px, -1.5px) " }, + "20%": { transform: "rotate(-0.5deg)" }, + "22%": { transform: "translate(0.5px, 1.5px) " }, + "22%": { transform: "rotate(1.5deg)" }, + "24%": { transform: "translate(-0.5px, 1.5px) " }, + "24%": { transform: "rotate(0.5deg)" }, + "26%": { transform: "translate(-1.5px, -1.5px) " }, + "26%": { transform: "rotate(0.5deg)" }, + "28%": { transform: "translate(1.5px, 2.5px) " }, + "28%": { transform: "rotate(1.5deg)" }, + "30%": { transform: "translate(2.5px, -1.5px) " }, + "30%": { transform: "rotate(1.5deg)" }, + "32%": { transform: "translate(1.5px, 1.5px) " }, + "32%": { transform: "rotate(1.5deg)" }, + "34%": { transform: "translate(2.5px, 0.5px) " }, + "34%": { transform: "rotate(-0.5deg)" }, + "36%": { transform: "translate(2.5px, -0.5px) " }, + "36%": { transform: "rotate(-0.5deg)" }, + "38%": { transform: "translate(0.5px, 0.5px) " }, + "38%": { transform: "rotate(0.5deg)" }, + "40%": { transform: "translate(1.5px, -1.5px) " }, + "40%": { transform: "rotate(1.5deg)" }, + "42%": { transform: "translate(0.5px, -0.5px) " }, + "42%": { transform: "rotate(0.5deg)" }, + "44%": { transform: "translate(-0.5px, -0.5px) " }, + "44%": { transform: "rotate(-0.5deg)" }, + "46%": { transform: "translate(1.5px, 2.5px) " }, + "46%": { transform: "rotate(-0.5deg)" }, + "48%": { transform: "translate(2.5px, 2.5px) " }, + "48%": { transform: "rotate(1.5deg)" }, + "50%": { transform: "translate(0.5px, 2.5px) " }, + "50%": { transform: "rotate(1.5deg)" }, + "52%": { transform: "translate(1.5px, -1.5px) " }, + "52%": { transform: "rotate(1.5deg)" }, + "54%": { transform: "translate(0.5px, 0.5px) " }, + "54%": { transform: "rotate(1.5deg)" }, + "56%": { transform: "translate(1.5px, 1.5px) " }, + "56%": { transform: "rotate(0.5deg)" }, + "58%": { transform: "translate(0.5px, 0.5px) " }, + "58%": { transform: "rotate(1.5deg)" }, + "60%": { transform: "translate(-0.5px, 0.5px) " }, + "60%": { transform: "rotate(-0.5deg)" }, + "62%": { transform: "translate(2.5px, -1.5px) " }, + "62%": { transform: "rotate(1.5deg)" }, + "64%": { transform: "translate(2.5px, -0.5px) " }, + "64%": { transform: "rotate(0.5deg)" }, + "66%": { transform: "translate(0.5px, 0.5px) " }, + "66%": { transform: "rotate(1.5deg)" }, + "68%": { transform: "translate(-1.5px, -0.5px) " }, + "68%": { transform: "rotate(0.5deg)" }, + "70%": { transform: "translate(2.5px, 0.5px) " }, + "70%": { transform: "rotate(-0.5deg)" }, + "72%": { transform: "translate(1.5px, 0.5px) " }, + "72%": { transform: "rotate(1.5deg)" }, + "74%": { transform: "translate(0.5px, 0.5px) " }, + "74%": { transform: "rotate(1.5deg)" }, + "76%": { transform: "translate(-1.5px, -0.5px) " }, + "76%": { transform: "rotate(0.5deg)" }, + "78%": { transform: "translate(-1.5px, -1.5px) " }, + "78%": { transform: "rotate(-0.5deg)" }, + "80%": { transform: "translate(-0.5px, -0.5px) " }, + "80%": { transform: "rotate(0.5deg)" }, + "82%": { transform: "translate(-0.5px, 1.5px) " }, + "82%": { transform: "rotate(1.5deg)" }, + "84%": { transform: "translate(-1.5px, 2.5px) " }, + "84%": { transform: "rotate(-0.5deg)" }, + "86%": { transform: "translate(-1.5px, -0.5px) " }, + "86%": { transform: "rotate(-0.5deg)" }, + "88%": { transform: "translate(2.5px, -0.5px) " }, + "88%": { transform: "rotate(-0.5deg)" }, + "90%": { transform: "translate(2.5px, -1.5px) " }, + "90%": { transform: "rotate(-0.5deg)" }, + "92%": { transform: "translate(2.5px, 0.5px) " }, + "92%": { transform: "rotate(-0.5deg)" }, + "94%": { transform: "translate(0.5px, 1.5px) " }, + "94%": { transform: "rotate(-0.5deg)" }, + "96%": { transform: "translate(1.5px, 2.5px) " }, + "96%": { transform: "rotate(0.5deg)" }, + "98%": { transform: "translate(2.5px, -0.5px) " }, + "98%": { transform: "rotate(1.5deg)" }, + "0%, 100%": { transform: "translate(0, 0) rotate(0)" }, + }, + }, }, }, plugins: [