Many styling changes, reoganized elements to be at the bottom, styled buttons to look proper. Added hints list.
This commit is contained in:
parent
08ed4c494c
commit
835869deea
23
tunictracker/empty_doors.json
Normal file
23
tunictracker/empty_doors.json
Normal file
@ -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" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
tunictracker/empty_hints.json
Normal file
3
tunictracker/empty_hints.json
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"???": "There is no spoon (but in trunic)"
|
||||||
|
}
|
23
tunictracker/empty_items.json
Normal file
23
tunictracker/empty_items.json
Normal file
@ -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": "" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
10
tunictracker/empty_overview.json
Normal file
10
tunictracker/empty_overview.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"scene": "???",
|
||||||
|
"seed": 0,
|
||||||
|
"items": 1312,
|
||||||
|
"entrances": 1312,
|
||||||
|
"hints": 0,
|
||||||
|
"codes": {
|
||||||
|
"empty": 0
|
||||||
|
}
|
||||||
|
}
|
@ -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": ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
643
tunictracker/less_fun_doors.json
Normal file
643
tunictracker/less_fun_doors.json
Normal file
@ -0,0 +1,643 @@
|
|||||||
|
{
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 216,
|
||||||
|
"total": 216,
|
||||||
|
"scenes": {
|
||||||
|
"Beneath the Fortress": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Beneath the Earth to Fortress Courtyard": { "scene": "", "door": "" },
|
||||||
|
"Beneath the Earth to Fortress Interior": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Beneath the Well": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"doors": {
|
||||||
|
"Well Exit towards Furnace": { "scene": "", "door": "" },
|
||||||
|
"Well Ladder Exit": { "scene": "", "door": "" },
|
||||||
|
"Well to Well Boss": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Cathedral": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"doors": {
|
||||||
|
"Cathedral Elevator": { "scene": "", "door": "" },
|
||||||
|
"Cathedral Main Exit": { "scene": "", "door": "" },
|
||||||
|
"Cathedral Secret Legend Room Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Cathedral Gauntlet": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"doors": {
|
||||||
|
"Gauntlet Elevator": { "scene": "", "door": "" },
|
||||||
|
"Gauntlet Shop": { "scene": "", "door": "" },
|
||||||
|
"Gauntlet to Swamp": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Caustic Light Cave": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Caustic Light Cave Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Changing Room": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Changing Room Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Coins in the Well": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 0,
|
||||||
|
"total": 0,
|
||||||
|
"doors": {}
|
||||||
|
},
|
||||||
|
"Cube Cave": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Cube Cave Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Dark Tomb": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"doors": {
|
||||||
|
"Dark Tomb to Checkpoint": { "scene": "", "door": "" },
|
||||||
|
"Dark Tomb to Furnace": { "scene": "", "door": "" },
|
||||||
|
"Dark Tomb to Overworld": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Dark Tomb Checkpoint": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Checkpoint to Dark Tomb": { "scene": "", "door": "" },
|
||||||
|
"Well Boss to Well": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"East Forest": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 9,
|
||||||
|
"total": 9,
|
||||||
|
"doors": {
|
||||||
|
"Forest Dance Fox Outside Doorway": { "scene": "", "door": "" },
|
||||||
|
"Forest Grave Path Lower Entrance": { "scene": "", "door": "" },
|
||||||
|
"Forest Grave Path Upper Entrance": { "scene": "", "door": "" },
|
||||||
|
"Forest Guard House 1 Gate Entrance": { "scene": "", "door": "" },
|
||||||
|
"Forest Guard House 1 Lower Entrance": { "scene": "", "door": "" },
|
||||||
|
"Forest Guard House 2 Lower Entrance": { "scene": "", "door": "" },
|
||||||
|
"Forest Guard House 2 Upper Entrance": { "scene": "", "door": "" },
|
||||||
|
"Forest to Belltower": { "scene": "", "door": "" },
|
||||||
|
"Forest to Far Shore": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Eastern Vault Fortress": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 6,
|
||||||
|
"total": 6,
|
||||||
|
"doors": {
|
||||||
|
"Fortress Interior Main Exit": { "scene": "", "door": "" },
|
||||||
|
"Fortress Interior Shop": { "scene": "", "door": "" },
|
||||||
|
"Fortress Interior to Beneath the Earth": { "scene": "", "door": "" },
|
||||||
|
"Fortress Interior to East Fortress Lower": { "scene": "", "door": "" },
|
||||||
|
"Fortress Interior to East Fortress Upper": { "scene": "", "door": "" },
|
||||||
|
"Fortress Interior to Siege Engine Arena": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Far Shore": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 10,
|
||||||
|
"total": 10,
|
||||||
|
"doors": {
|
||||||
|
"Far Shore to Atoll": { "scene": "", "door": "" },
|
||||||
|
"Far Shore to East Forest": { "scene": "", "door": "" },
|
||||||
|
"Far Shore to Fortress": { "scene": "", "door": "" },
|
||||||
|
"Far Shore to Heir": { "scene": "", "door": "" },
|
||||||
|
"Far Shore to Library": { "scene": "", "door": "" },
|
||||||
|
"Far Shore to Quarry": { "scene": "", "door": "" },
|
||||||
|
"Far Shore to Spawn": { "scene": "", "door": "" },
|
||||||
|
"Far Shore to Town": { "scene": "", "door": "" },
|
||||||
|
"Far Shore to West Garden": { "scene": "", "door": "" },
|
||||||
|
"Far Shore to Ziggurat": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Forest Belltower": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 4,
|
||||||
|
"total": 4,
|
||||||
|
"doors": {
|
||||||
|
"Forest Belltower to Forest": { "scene": "", "door": "" },
|
||||||
|
"Forest Belltower to Fortress": { "scene": "", "door": "" },
|
||||||
|
"Forest Belltower to Guard Captain Room": { "scene": "", "door": "" },
|
||||||
|
"Forest Belltower to Overworld": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Forest Boss Room": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Guard Captain Room Gate Exit": { "scene": "", "door": "" },
|
||||||
|
"Guard Captain Room Non-Gate Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Forest Grave Path": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"doors": {
|
||||||
|
"East Forest Hero's Grave": { "scene": "", "door": "" },
|
||||||
|
"Forest Grave Path Lower Exit": { "scene": "", "door": "" },
|
||||||
|
"Forest Grave Path Upper Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Fortress Arena": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Fortress to Far Shore": { "scene": "", "door": "" },
|
||||||
|
"Siege Engine Arena to Fortress": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Fortress Courtyard": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 8,
|
||||||
|
"total": 8,
|
||||||
|
"doors": {
|
||||||
|
"Fortress Courtyard Shop": { "scene": "", "door": "" },
|
||||||
|
"Fortress Courtyard to Beneath the Earth": { "scene": "", "door": "" },
|
||||||
|
"Fortress Courtyard to East Fortress": { "scene": "", "door": "" },
|
||||||
|
"Fortress Courtyard to Forest Belltower": { "scene": "", "door": "" },
|
||||||
|
"Fortress Courtyard to Fortress Grave Path Lower": {
|
||||||
|
"scene": "",
|
||||||
|
"door": ""
|
||||||
|
},
|
||||||
|
"Fortress Courtyard to Fortress Grave Path Upper": {
|
||||||
|
"scene": "",
|
||||||
|
"door": ""
|
||||||
|
},
|
||||||
|
"Fortress Courtyard to Fortress Interior": { "scene": "", "door": "" },
|
||||||
|
"Fortress Courtyard to Overworld": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Fortress East Shortcut": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"doors": {
|
||||||
|
"East Fortress to Courtyard": { "scene": "", "door": "" },
|
||||||
|
"East Fortress to Interior Lower": { "scene": "", "door": "" },
|
||||||
|
"East Fortress to Interior Upper": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Fortress Grave Path": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 4,
|
||||||
|
"total": 4,
|
||||||
|
"doors": {
|
||||||
|
"Fortress Grave Path Dusty Entrance": { "scene": "", "door": "" },
|
||||||
|
"Fortress Grave Path Lower Exit": { "scene": "", "door": "" },
|
||||||
|
"Fortress Grave Path Upper Exit": { "scene": "", "door": "" },
|
||||||
|
"Fortress Hero's Grave": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Fortress Leaf Piles": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Dusty Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Fountain Cross Room": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Fountain HC Room Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Frog Stairway": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 4,
|
||||||
|
"total": 4,
|
||||||
|
"doors": {
|
||||||
|
"Frog Stairs Eye Exit": { "scene": "", "door": "" },
|
||||||
|
"Frog Stairs Mouth Exit": { "scene": "", "door": "" },
|
||||||
|
"Frog Stairs to Frog's Domain's Entrance": { "scene": "", "door": "" },
|
||||||
|
"Frog Stairs to Frog's Domain's Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Frog's Domain": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Frog's Domain Ladder Exit": { "scene": "", "door": "" },
|
||||||
|
"Frog's Domain Orb Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Glyph Tower": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Glyph Tower Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Guardhouse 1": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 4,
|
||||||
|
"total": 4,
|
||||||
|
"doors": {
|
||||||
|
"Guard House 1 Dance Fox Exit": { "scene": "", "door": "" },
|
||||||
|
"Guard House 1 Lower Exit": { "scene": "", "door": "" },
|
||||||
|
"Guard House 1 to Guard Captain Room": { "scene": "", "door": "" },
|
||||||
|
"Guard House 1 Upper Forest Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Guardhouse 2": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Guard House 2 Lower Exit": { "scene": "", "door": "" },
|
||||||
|
"Guard House 2 Upper Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Hero's Grave": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 6,
|
||||||
|
"total": 6,
|
||||||
|
"doors": {
|
||||||
|
"Hero's Grave to East Forest": { "scene": "", "door": "" },
|
||||||
|
"Hero's Grave to Fortress": { "scene": "", "door": "" },
|
||||||
|
"Hero's Grave to Library": { "scene": "", "door": "" },
|
||||||
|
"Hero's Grave to Monastery": { "scene": "", "door": "" },
|
||||||
|
"Hero's Grave to Swamp": { "scene": "", "door": "" },
|
||||||
|
"Hero's Grave to West Garden": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Hourglass Cave": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Hourglass Cave Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Librarian": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Librarian Arena Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Library Exterior": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Library Exterior Ladder": { "scene": "", "door": "" },
|
||||||
|
"Library Exterior Tree": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Library Hall": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"doors": {
|
||||||
|
"Library Hall Bookshelf Exit": { "scene": "", "door": "" },
|
||||||
|
"Library Hall to Rotunda": { "scene": "", "door": "" },
|
||||||
|
"Library Hero's Grave": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Library Lab": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"doors": {
|
||||||
|
"Library Lab to Librarian Arena": { "scene": "", "door": "" },
|
||||||
|
"Library Lab to Rotunda": { "scene": "", "door": "" },
|
||||||
|
"Library to Far Shore": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Library Rotunda": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Library Rotunda Lower Exit": { "scene": "", "door": "" },
|
||||||
|
"Library Rotunda Upper Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Loading": { "found": 0, "remaining": 0, "total": 0, "doors": {} },
|
||||||
|
"Lower Mountain": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"doors": {
|
||||||
|
"Mountain to Overworld": { "scene": "", "door": "" },
|
||||||
|
"Mountain to Quarry": { "scene": "", "door": "" },
|
||||||
|
"Stairs to Top of the Mountain": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Maze Cave": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Maze Cave Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Monastery": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"doors": {
|
||||||
|
"Monastery Front Exit": { "scene": "", "door": "" },
|
||||||
|
"Monastery Hero's Grave": { "scene": "", "door": "" },
|
||||||
|
"Monastery Rear Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Old House": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"doors": {
|
||||||
|
"Old House Door Exit": { "scene": "", "door": "" },
|
||||||
|
"Old House to Glyph Tower": { "scene": "", "door": "" },
|
||||||
|
"Old House Waterfall Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Overworld": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 39,
|
||||||
|
"total": 39,
|
||||||
|
"doors": {
|
||||||
|
"Atoll Lower Entrance": { "scene": "", "door": "" },
|
||||||
|
"Atoll Upper Entrance": { "scene": "", "door": "" },
|
||||||
|
"Caustic Light Cave Entrance": { "scene": "", "door": "" },
|
||||||
|
"Changing Room Entrance": { "scene": "", "door": "" },
|
||||||
|
"Cube Cave Entrance": { "scene": "", "door": "" },
|
||||||
|
"Dark Tomb Main Entrance": { "scene": "", "door": "" },
|
||||||
|
"Entrance to Furnace from Beach": { "scene": "", "door": "" },
|
||||||
|
"Entrance to Furnace from Well Rail": { "scene": "", "door": "" },
|
||||||
|
"Entrance to Furnace near West Garden": { "scene": "", "door": "" },
|
||||||
|
"Entrance to Furnace under Windmill": { "scene": "", "door": "" },
|
||||||
|
"Entrance to Well from Well Rail": { "scene": "", "door": "" },
|
||||||
|
"Fountain HC Door Entrance": { "scene": "", "door": "" },
|
||||||
|
"Hourglass Cave Entrance": { "scene": "", "door": "" },
|
||||||
|
"Maze Cave Entrance": { "scene": "", "door": "" },
|
||||||
|
"Old House Door Entrance": { "scene": "", "door": "" },
|
||||||
|
"Old House Waterfall Entrance": { "scene": "", "door": "" },
|
||||||
|
"Overworld to Forest Belltower": { "scene": "", "door": "" },
|
||||||
|
"Overworld to Fortress": { "scene": "", "door": "" },
|
||||||
|
"Overworld to Quarry Connector": { "scene": "", "door": "" },
|
||||||
|
"Patrol Cave Entrance": { "scene": "", "door": "" },
|
||||||
|
"Ruined Passage Door Entrance": { "scene": "", "door": "" },
|
||||||
|
"Ruined Passage Not-Door Entrance": { "scene": "", "door": "" },
|
||||||
|
"Ruined Shop Entrance": { "scene": "", "door": "" },
|
||||||
|
"Secret Gathering Place Entrance": { "scene": "", "door": "" },
|
||||||
|
"Southeast HC Door Entrance": { "scene": "", "door": "" },
|
||||||
|
"Spawn to Far Shore": { "scene": "", "door": "" },
|
||||||
|
"Special Shop Entrance": { "scene": "", "door": "" },
|
||||||
|
"Stairs from Overworld to Mountain": { "scene": "", "door": "" },
|
||||||
|
"Stick House Entrance": { "scene": "", "door": "" },
|
||||||
|
"Swamp Lower Entrance": { "scene": "", "door": "" },
|
||||||
|
"Swamp Upper Entrance": { "scene": "", "door": "" },
|
||||||
|
"Temple Door Entrance": { "scene": "", "door": "" },
|
||||||
|
"Temple Rafters Entrance": { "scene": "", "door": "" },
|
||||||
|
"Town to Far Shore": { "scene": "", "door": "" },
|
||||||
|
"Well Ladder Entrance": { "scene": "", "door": "" },
|
||||||
|
"West Garden Entrance from Furnace": { "scene": "", "door": "" },
|
||||||
|
"West Garden Entrance near Belltower": { "scene": "", "door": "" },
|
||||||
|
"West Garden Laurels Entrance": { "scene": "", "door": "" },
|
||||||
|
"Windmill Entrance": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Patrol Cave": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Guard Patrol Cave Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Posterity": { "found": 0, "remaining": 0, "total": 0, "doors": {} },
|
||||||
|
"Purgatory": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Purgatory Bottom Exit": { "scene": "", "door": "" },
|
||||||
|
"Purgatory Top Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Quarry": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 7,
|
||||||
|
"total": 7,
|
||||||
|
"doors": {
|
||||||
|
"Quarry Shop": { "scene": "", "door": "" },
|
||||||
|
"Quarry to Far Shore": { "scene": "", "door": "" },
|
||||||
|
"Quarry to Monastery Back": { "scene": "", "door": "" },
|
||||||
|
"Quarry to Monastery Front": { "scene": "", "door": "" },
|
||||||
|
"Quarry to Mountain": { "scene": "", "door": "" },
|
||||||
|
"Quarry to Overworld Exit": { "scene": "", "door": "" },
|
||||||
|
"Quarry to Ziggurat": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Quarry Entryway": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Quarry Connector to Overworld": { "scene": "", "door": "" },
|
||||||
|
"Quarry Connector to Quarry": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Resurrection": { "found": 0, "remaining": 0, "total": 0, "doors": {} },
|
||||||
|
"Rooted Ziggurat Entrance": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Ziggurat Entry Hallway to Quarry": { "scene": "", "door": "" },
|
||||||
|
"Ziggurat Entry Hallway to Ziggurat Upper": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Rooted Ziggurat Lower": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Ziggurat Lower to Ziggurat Tower": { "scene": "", "door": "" },
|
||||||
|
"Ziggurat Portal Room Entrance": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Rooted Ziggurat Teleporter": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Ziggurat Portal Room Exit": { "scene": "", "door": "" },
|
||||||
|
"Ziggurat to Far Shore": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Rooted Ziggurat Tower": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Ziggurat Tower to Ziggurat Lower": { "scene": "", "door": "" },
|
||||||
|
"Ziggurat Tower to Ziggurat Upper": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Rooted Ziggurat Upper": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Ziggurat Upper to Ziggurat Entry Hallway": { "scene": "", "door": "" },
|
||||||
|
"Ziggurat Upper to Ziggurat Tower": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Ruined Atoll": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 7,
|
||||||
|
"total": 7,
|
||||||
|
"doors": {
|
||||||
|
"Atoll Lower Exit": { "scene": "", "door": "" },
|
||||||
|
"Atoll Shop": { "scene": "", "door": "" },
|
||||||
|
"Atoll Statue Teleporter": { "scene": "", "door": "" },
|
||||||
|
"Atoll to Far Shore": { "scene": "", "door": "" },
|
||||||
|
"Atoll Upper Exit": { "scene": "", "door": "" },
|
||||||
|
"Frog Stairs Eye Entrance": { "scene": "", "door": "" },
|
||||||
|
"Frog Stairs Mouth Entrance": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Ruined Passage": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Ruined Passage Door Exit": { "scene": "", "door": "" },
|
||||||
|
"Ruined Passage Not-Door Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Ruined Shop": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Ruined Shop Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Sealed Temple": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Temple Door Exit": { "scene": "", "door": "" },
|
||||||
|
"Temple Rafters Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Secret Gathering Place": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Secret Gathering Place Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Shop": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": { "Shop Portal": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Southeast Cross Room": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Southeast HC Room Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Special Shop": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Special Shop Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Stick House": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Stick House Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Swamp": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 7,
|
||||||
|
"total": 7,
|
||||||
|
"doors": {
|
||||||
|
"Swamp Hero's Grave": { "scene": "", "door": "" },
|
||||||
|
"Swamp Lower Exit": { "scene": "", "door": "" },
|
||||||
|
"Swamp Shop": { "scene": "", "door": "" },
|
||||||
|
"Swamp to Cathedral Main Entrance": { "scene": "", "door": "" },
|
||||||
|
"Swamp to Cathedral Secret Legend Room Entrance": {
|
||||||
|
"scene": "",
|
||||||
|
"door": ""
|
||||||
|
},
|
||||||
|
"Swamp to Gauntlet": { "scene": "", "door": "" },
|
||||||
|
"Swamp Upper Exit": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"The Heir": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Heir Arena Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Top of the Mountain": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Top of the Mountain Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"West Furnace": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 5,
|
||||||
|
"total": 5,
|
||||||
|
"doors": {
|
||||||
|
"Furnace Exit to Beach": { "scene": "", "door": "" },
|
||||||
|
"Furnace Exit to Dark Tomb": { "scene": "", "door": "" },
|
||||||
|
"Furnace Exit towards Well": { "scene": "", "door": "" },
|
||||||
|
"Furnace Exit towards West Garden": { "scene": "", "door": "" },
|
||||||
|
"Furnace Exit under Windmill": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"West Garden": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 7,
|
||||||
|
"total": 7,
|
||||||
|
"doors": {
|
||||||
|
"West Garden Exit after Boss": { "scene": "", "door": "" },
|
||||||
|
"West Garden Exit near Hero's Grave": { "scene": "", "door": "" },
|
||||||
|
"West Garden Hero's Grave": { "scene": "", "door": "" },
|
||||||
|
"West Garden Laurels Exit": { "scene": "", "door": "" },
|
||||||
|
"West Garden Shop": { "scene": "", "door": "" },
|
||||||
|
"West Garden to Far Shore": { "scene": "", "door": "" },
|
||||||
|
"West Garden to Magic Dagger House": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"West Garden House": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"doors": { "Magic Dagger House Exit": { "scene": "", "door": "" } }
|
||||||
|
},
|
||||||
|
"Windmill": {
|
||||||
|
"found": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"doors": {
|
||||||
|
"Windmill Exit": { "scene": "", "door": "" },
|
||||||
|
"Windmill Shop": { "scene": "", "door": "" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1
tunictracker/less_fun_hints.json
Normal file
1
tunictracker/less_fun_hints.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
752
tunictracker/less_fun_items.json
Normal file
752
tunictracker/less_fun_items.json
Normal file
@ -0,0 +1,752 @@
|
|||||||
|
{
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 302,
|
||||||
|
"total": 302,
|
||||||
|
"scenes": {
|
||||||
|
"Beneath the Fortress": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 5,
|
||||||
|
"total": 5,
|
||||||
|
"checks": {
|
||||||
|
"Back Room Chest": { "name": "", "owner": "" },
|
||||||
|
"Bridge": { "name": "", "owner": "" },
|
||||||
|
"Cell Chest 1": { "name": "", "owner": "" },
|
||||||
|
"Cell Chest 2": { "name": "", "owner": "" },
|
||||||
|
"Obscured Behind Waterfall": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Beneath the Well": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 14,
|
||||||
|
"total": 14,
|
||||||
|
"checks": {
|
||||||
|
"[Back Corridor] Left Secret": { "name": "", "owner": "" },
|
||||||
|
"[Back Corridor] Right Secret": { "name": "", "owner": "" },
|
||||||
|
"[Entryway] Chest": { "name": "", "owner": "" },
|
||||||
|
"[Entryway] Obscured Behind Waterfall": { "name": "", "owner": "" },
|
||||||
|
"[Powered Secret Room] Chest": { "name": "", "owner": "" },
|
||||||
|
"[Save Room] Upper Floor Chest 1": { "name": "", "owner": "" },
|
||||||
|
"[Save Room] Upper Floor Chest 2": { "name": "", "owner": "" },
|
||||||
|
"[Second Room] Obscured Behind Waterfall": { "name": "", "owner": "" },
|
||||||
|
"[Second Room] Page": { "name": "", "owner": "" },
|
||||||
|
"[Second Room] Underwater Chest": { "name": "", "owner": "" },
|
||||||
|
"[Side Room] Chest By Phrends": { "name": "", "owner": "" },
|
||||||
|
"[Side Room] Chest By Pots": { "name": "", "owner": "" },
|
||||||
|
"[Third Room] Beneath Platform Chest": { "name": "", "owner": "" },
|
||||||
|
"[Third Room] Tentacle Chest": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Cathedral": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 10,
|
||||||
|
"total": 10,
|
||||||
|
"checks": {
|
||||||
|
"[1F] Guarded By Lasers": { "name": "", "owner": "" },
|
||||||
|
"[1F] Library": { "name": "", "owner": "" },
|
||||||
|
"[1F] Library Secret": { "name": "", "owner": "" },
|
||||||
|
"[1F] Near Spikes": { "name": "", "owner": "" },
|
||||||
|
"[2F] Bird Room": { "name": "", "owner": "" },
|
||||||
|
"[2F] Bird Room Secret": { "name": "", "owner": "" },
|
||||||
|
"[2F] Entryway Upper Walkway": { "name": "", "owner": "" },
|
||||||
|
"[2F] Guarded By Lasers": { "name": "", "owner": "" },
|
||||||
|
"[2F] Library": { "name": "", "owner": "" },
|
||||||
|
"Secret Legend Trophy Chest": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Cathedral Gauntlet": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Gauntlet Reward": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Caustic Light Cave": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Holy Cross Chest": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Changing Room": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Normal Chest": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Coins in the Well": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 4,
|
||||||
|
"total": 4,
|
||||||
|
"checks": {
|
||||||
|
"10 Coins": { "name": "", "owner": "" },
|
||||||
|
"15 Coins": { "name": "", "owner": "" },
|
||||||
|
"3 Coins": { "name": "", "owner": "" },
|
||||||
|
"6 Coins": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Cube Cave": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Holy Cross Chest": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Dark Tomb": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 7,
|
||||||
|
"total": 7,
|
||||||
|
"checks": {
|
||||||
|
"1st Laser Room": { "name": "", "owner": "" },
|
||||||
|
"1st Laser Room Obscured": { "name": "", "owner": "" },
|
||||||
|
"2nd Laser Room": { "name": "", "owner": "" },
|
||||||
|
"Skulls Chest": { "name": "", "owner": "" },
|
||||||
|
"Spike Maze Near Exit": { "name": "", "owner": "" },
|
||||||
|
"Spike Maze Near Stairs": { "name": "", "owner": "" },
|
||||||
|
"Spike Maze Upper Walkway": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Dark Tomb Checkpoint": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": {
|
||||||
|
"[Passage To Dark Tomb] Page Pickup": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"East Forest": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 14,
|
||||||
|
"total": 14,
|
||||||
|
"checks": {
|
||||||
|
"Above Save Point": { "name": "", "owner": "" },
|
||||||
|
"Above Save Point Obscured": { "name": "", "owner": "" },
|
||||||
|
"Beneath Spider Chest": { "name": "", "owner": "" },
|
||||||
|
"Bombable Wall": { "name": "", "owner": "" },
|
||||||
|
"Dancing Fox Spirit Holy Cross": { "name": "", "owner": "" },
|
||||||
|
"From Guardhouse 1 Chest": { "name": "", "owner": "" },
|
||||||
|
"Golden Obelisk Holy Cross": { "name": "", "owner": "" },
|
||||||
|
"Ice Rod Grapple Chest": { "name": "", "owner": "" },
|
||||||
|
"Lower Dash Chest": { "name": "", "owner": "" },
|
||||||
|
"Lower Grapple Chest": { "name": "", "owner": "" },
|
||||||
|
"Near Save Point": { "name": "", "owner": "" },
|
||||||
|
"Near Telescope": { "name": "", "owner": "" },
|
||||||
|
"Page On Teleporter": { "name": "", "owner": "" },
|
||||||
|
"Spider Chest": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Eastern Vault Fortress": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 5,
|
||||||
|
"total": 5,
|
||||||
|
"checks": {
|
||||||
|
"[East Wing] Bombable Wall": { "name": "", "owner": "" },
|
||||||
|
"[West Wing] Candles Holy Cross": { "name": "", "owner": "" },
|
||||||
|
"[West Wing] Dark Room Chest 1": { "name": "", "owner": "" },
|
||||||
|
"[West Wing] Dark Room Chest 2": { "name": "", "owner": "" },
|
||||||
|
"[West Wing] Page Pickup": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Far Shore": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"checks": {
|
||||||
|
"Page Pickup": { "name": "", "owner": "" },
|
||||||
|
"Secret Chest": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Forest Belltower": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 5,
|
||||||
|
"total": 5,
|
||||||
|
"checks": {
|
||||||
|
"After Guard Captain": { "name": "", "owner": "" },
|
||||||
|
"Near Save Point": { "name": "", "owner": "" },
|
||||||
|
"Obscured Beneath Bell Bottom Floor": { "name": "", "owner": "" },
|
||||||
|
"Obscured Near Bell Top Floor": { "name": "", "owner": "" },
|
||||||
|
"Page Pickup": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Forest Boss Room": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 0,
|
||||||
|
"total": 0,
|
||||||
|
"checks": {}
|
||||||
|
},
|
||||||
|
"Forest Grave Path": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 5,
|
||||||
|
"total": 5,
|
||||||
|
"checks": {
|
||||||
|
"Above Gate": { "name": "", "owner": "" },
|
||||||
|
"Holy Cross Code by Grave": { "name": "", "owner": "" },
|
||||||
|
"Obscured Chest": { "name": "", "owner": "" },
|
||||||
|
"Sword Pickup": { "name": "", "owner": "" },
|
||||||
|
"Upper Walkway": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Fortress Arena": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"checks": {
|
||||||
|
"Hexagon Red": { "name": "", "owner": "" },
|
||||||
|
"Siege Engine/Vault Key Pickup": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Fortress Courtyard": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 5,
|
||||||
|
"total": 5,
|
||||||
|
"checks": {
|
||||||
|
"Below Walkway": { "name": "", "owner": "" },
|
||||||
|
"Chest Near Cave": { "name": "", "owner": "" },
|
||||||
|
"From East Belltower": { "name": "", "owner": "" },
|
||||||
|
"Near Fuse": { "name": "", "owner": "" },
|
||||||
|
"Page Near Cave": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Fortress East Shortcut": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Chest Near Slimes": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Fortress Grave Path": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"checks": {
|
||||||
|
"Chest Right of Grave": { "name": "", "owner": "" },
|
||||||
|
"Obscured Chest Left of Grave": { "name": "", "owner": "" },
|
||||||
|
"Upper Walkway": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Fortress Leaf Piles": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Secret Chest": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Fountain Cross Room": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Page Pickup": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Frog Stairway": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 0,
|
||||||
|
"total": 0,
|
||||||
|
"checks": {}
|
||||||
|
},
|
||||||
|
"Frog's Domain": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 11,
|
||||||
|
"total": 11,
|
||||||
|
"checks": {
|
||||||
|
"Above Vault": { "name": "", "owner": "" },
|
||||||
|
"Escape Chest": { "name": "", "owner": "" },
|
||||||
|
"Grapple Above Hot Tub": { "name": "", "owner": "" },
|
||||||
|
"Magic Orb Pickup": { "name": "", "owner": "" },
|
||||||
|
"Main Room Bottom Floor": { "name": "", "owner": "" },
|
||||||
|
"Main Room Top Floor": { "name": "", "owner": "" },
|
||||||
|
"Near Vault": { "name": "", "owner": "" },
|
||||||
|
"Side Room Chest": { "name": "", "owner": "" },
|
||||||
|
"Side Room Grapple Secret": { "name": "", "owner": "" },
|
||||||
|
"Side Room Secret Passage": { "name": "", "owner": "" },
|
||||||
|
"Slorm Room": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Glyph Tower": { "collected": 0, "remaining": 0, "total": 0, "checks": {} },
|
||||||
|
"Guardhouse 1": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"checks": {
|
||||||
|
"Upper Floor": { "name": "", "owner": "" },
|
||||||
|
"Upper Floor Obscured": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Guardhouse 2": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"checks": {
|
||||||
|
"Bottom Floor Secret": { "name": "", "owner": "" },
|
||||||
|
"Upper Floor": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Hero's Grave": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 6,
|
||||||
|
"total": 6,
|
||||||
|
"checks": {
|
||||||
|
"Ash Relic": { "name": "", "owner": "" },
|
||||||
|
"Effigy Relic": { "name": "", "owner": "" },
|
||||||
|
"Feathers Relic": { "name": "", "owner": "" },
|
||||||
|
"Flowers Relic": { "name": "", "owner": "" },
|
||||||
|
"Mushroom Relic": { "name": "", "owner": "" },
|
||||||
|
"Tooth Relic": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Hourglass Cave": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"checks": {
|
||||||
|
"Holy Cross Chest": { "name": "", "owner": "" },
|
||||||
|
"Hourglass Chest": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Librarian": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Hexagon Green": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Library Exterior": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 0,
|
||||||
|
"total": 0,
|
||||||
|
"checks": {}
|
||||||
|
},
|
||||||
|
"Library Hall": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Holy Cross Chest": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Library Lab": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 7,
|
||||||
|
"total": 7,
|
||||||
|
"checks": {
|
||||||
|
"Behind Chalkboard by Fuse": { "name": "", "owner": "" },
|
||||||
|
"Chest By Shrine 1": { "name": "", "owner": "" },
|
||||||
|
"Chest By Shrine 2": { "name": "", "owner": "" },
|
||||||
|
"Chest By Shrine 3": { "name": "", "owner": "" },
|
||||||
|
"Page 1": { "name": "", "owner": "" },
|
||||||
|
"Page 2": { "name": "", "owner": "" },
|
||||||
|
"Page 3": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Library Rotunda": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 0,
|
||||||
|
"total": 0,
|
||||||
|
"checks": {}
|
||||||
|
},
|
||||||
|
"Loading": { "collected": 0, "remaining": 0, "total": 0, "checks": {} },
|
||||||
|
"Lower Mountain": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Page Before Door": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Maze Cave": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"checks": {
|
||||||
|
"Maze Room Chest": { "name": "", "owner": "" },
|
||||||
|
"Maze Room Holy Cross": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Monastery": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Monastery Chest": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Old House": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 4,
|
||||||
|
"total": 4,
|
||||||
|
"checks": {
|
||||||
|
"Holy Cross Chest": { "name": "", "owner": "" },
|
||||||
|
"Holy Cross Door Page": { "name": "", "owner": "" },
|
||||||
|
"Normal Chest": { "name": "", "owner": "" },
|
||||||
|
"Shield Pickup": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Overworld": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 50,
|
||||||
|
"total": 50,
|
||||||
|
"checks": {
|
||||||
|
"[Central] Bombable Wall": { "name": "", "owner": "" },
|
||||||
|
"[Central] Chest Across From Well": { "name": "", "owner": "" },
|
||||||
|
"[East] Between Ladders Near Ruined Passage": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[East] Chest In Trees": { "name": "", "owner": "" },
|
||||||
|
"[East] Chest Near Pots": { "name": "", "owner": "" },
|
||||||
|
"[East] Grapple Chest": { "name": "", "owner": "" },
|
||||||
|
"[East] Page Near Secret Shop": { "name": "", "owner": "" },
|
||||||
|
"[East] Weathervane Holy Cross": { "name": "", "owner": "" },
|
||||||
|
"[Northeast] Chest Above Patrol Cave": { "name": "", "owner": "" },
|
||||||
|
"[Northeast] Flowers Holy Cross": { "name": "", "owner": "" },
|
||||||
|
"[Northwest] Chest Beneath Quarry Gate": { "name": "", "owner": "" },
|
||||||
|
"[Northwest] Chest Near Golden Obelisk": { "name": "", "owner": "" },
|
||||||
|
"[Northwest] Chest Near Quarry Gate": { "name": "", "owner": "" },
|
||||||
|
"[Northwest] Chest Near Turret": { "name": "", "owner": "" },
|
||||||
|
"[Northwest] Fire Wand Pickup": { "name": "", "owner": "" },
|
||||||
|
"[Northwest] Golden Obelisk Page": { "name": "", "owner": "" },
|
||||||
|
"[Northwest] Page By Well": { "name": "", "owner": "" },
|
||||||
|
"[Northwest] Page on Pillar by Dark Tomb": { "name": "", "owner": "" },
|
||||||
|
"[Northwest] Shadowy Corner Chest": { "name": "", "owner": "" },
|
||||||
|
"[South] Beach Chest": { "name": "", "owner": "" },
|
||||||
|
"[South] Beach Page": { "name": "", "owner": "" },
|
||||||
|
"[South] Starting Platform Holy Cross": { "name": "", "owner": "" },
|
||||||
|
"[Southeast] Chest Near Swamp": { "name": "", "owner": "" },
|
||||||
|
"[Southeast] Page on Pillar by Swamp": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Beach Chest Beneath Guard": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Beach Chest Near Flowers": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Bombable Wall Near Fountain": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Chest Guarded By Turret": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Flowers Holy Cross": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Fountain Holy Cross": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Fountain Page": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] From West Garden": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Grapple Chest Over Walkway": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Haiku Holy Cross": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Key Pickup": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Obscured In Tunnel To Beach": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] South Chest Near Guard": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Tunnel Guarded By Turret": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] West Beach Guarded By Turret": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] West Beach Guarded By Turret 2": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[West] Chest After Bell": { "name": "", "owner": "" },
|
||||||
|
"[West] Chest Behind Moss Wall": { "name": "", "owner": "" },
|
||||||
|
"[West] Key Pickup": { "name": "", "owner": "" },
|
||||||
|
"[West] Moss Wall Holy Cross": { "name": "", "owner": "" },
|
||||||
|
"[West] Near West Garden Entrance": { "name": "", "owner": "" },
|
||||||
|
"[West] Obscured Behind Windmill": { "name": "", "owner": "" },
|
||||||
|
"[West] Obscured Near Well": { "name": "", "owner": "" },
|
||||||
|
"[West] Page On Teleporter": { "name": "", "owner": "" },
|
||||||
|
"[West] Windchimes Holy Cross": { "name": "", "owner": "" },
|
||||||
|
"[West] Windmill Holy Cross": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Patrol Cave": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"checks": {
|
||||||
|
"Holy Cross Chest": { "name": "", "owner": "" },
|
||||||
|
"Normal Chest": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Posterity": { "collected": 0, "remaining": 0, "total": 0, "checks": {} },
|
||||||
|
"Purgatory": { "collected": 0, "remaining": 0, "total": 0, "checks": {} },
|
||||||
|
"Quarry": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 28,
|
||||||
|
"total": 28,
|
||||||
|
"checks": {
|
||||||
|
"[Back Entrance] Bushes Holy Cross": { "name": "", "owner": "" },
|
||||||
|
"[Back Entrance] Chest": { "name": "", "owner": "" },
|
||||||
|
"[Back Entrance] Obscured Behind Wall": { "name": "", "owner": "" },
|
||||||
|
"[Central] Above Ladder": { "name": "", "owner": "" },
|
||||||
|
"[Central] Above Ladder Dash Chest": { "name": "", "owner": "" },
|
||||||
|
"[Central] Below Entry Walkway": { "name": "", "owner": "" },
|
||||||
|
"[Central] Near Shortcut Ladder": { "name": "", "owner": "" },
|
||||||
|
"[Central] Obscured Behind Staircase": { "name": "", "owner": "" },
|
||||||
|
"[Central] Obscured Below Entry Walkway": { "name": "", "owner": "" },
|
||||||
|
"[Central] Top Floor Overhang": { "name": "", "owner": "" },
|
||||||
|
"[East] Bombable Wall": { "name": "", "owner": "" },
|
||||||
|
"[East] Near Bridge": { "name": "", "owner": "" },
|
||||||
|
"[East] Near Telescope": { "name": "", "owner": "" },
|
||||||
|
"[East] Obscured Beneath Scaffolding": { "name": "", "owner": "" },
|
||||||
|
"[East] Obscured Near Telescope": { "name": "", "owner": "" },
|
||||||
|
"[East] Obscured Near Winding Staircase": { "name": "", "owner": "" },
|
||||||
|
"[East] Upper Floor": { "name": "", "owner": "" },
|
||||||
|
"[Lowlands] Below Broken Ladder": { "name": "", "owner": "" },
|
||||||
|
"[Lowlands] Near Elevator": { "name": "", "owner": "" },
|
||||||
|
"[Lowlands] Upper Walkway": { "name": "", "owner": "" },
|
||||||
|
"[West] Below Shooting Range": { "name": "", "owner": "" },
|
||||||
|
"[West] Lower Area After Bridge": { "name": "", "owner": "" },
|
||||||
|
"[West] Lower Area Below Bridge": { "name": "", "owner": "" },
|
||||||
|
"[West] Lower Area Isolated Chest": { "name": "", "owner": "" },
|
||||||
|
"[West] Near Shooting Range": { "name": "", "owner": "" },
|
||||||
|
"[West] Shooting Range Secret Path": { "name": "", "owner": "" },
|
||||||
|
"[West] Upper Area Bombable Wall": { "name": "", "owner": "" },
|
||||||
|
"[West] Upper Area Near Waterfall": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Quarry Entryway": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 0,
|
||||||
|
"total": 0,
|
||||||
|
"checks": {}
|
||||||
|
},
|
||||||
|
"Resurrection": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 0,
|
||||||
|
"total": 0,
|
||||||
|
"checks": {}
|
||||||
|
},
|
||||||
|
"Rooted Ziggurat Entrance": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 0,
|
||||||
|
"total": 0,
|
||||||
|
"checks": {}
|
||||||
|
},
|
||||||
|
"Rooted Ziggurat Lower": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 8,
|
||||||
|
"total": 8,
|
||||||
|
"checks": {
|
||||||
|
"After 2nd Double Turret Chest": { "name": "", "owner": "" },
|
||||||
|
"After Guarded Fuse": { "name": "", "owner": "" },
|
||||||
|
"Guarded By Double Turrets": { "name": "", "owner": "" },
|
||||||
|
"Guarded By Double Turrets 2": { "name": "", "owner": "" },
|
||||||
|
"Hexagon Blue": { "name": "", "owner": "" },
|
||||||
|
"Left Of Checkpoint Before Fuse": { "name": "", "owner": "" },
|
||||||
|
"Near Corpses": { "name": "", "owner": "" },
|
||||||
|
"Spider Ambush": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Rooted Ziggurat Teleporter": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 0,
|
||||||
|
"total": 0,
|
||||||
|
"checks": {}
|
||||||
|
},
|
||||||
|
"Rooted Ziggurat Tower": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Inside Tower": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Rooted Ziggurat Upper": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"checks": {
|
||||||
|
"Beneath Bridge To Administrator": { "name": "", "owner": "" },
|
||||||
|
"Near Bridge Switch": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Ruined Atoll": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 17,
|
||||||
|
"total": 17,
|
||||||
|
"checks": {
|
||||||
|
"[East] Locked Room Lower Chest": { "name": "", "owner": "" },
|
||||||
|
"[East] Locked Room Upper Chest": { "name": "", "owner": "" },
|
||||||
|
"[North] From Lower Overworld Entrance": { "name": "", "owner": "" },
|
||||||
|
"[North] Guarded By Bird": { "name": "", "owner": "" },
|
||||||
|
"[North] Obscured Beneath Bridge": { "name": "", "owner": "" },
|
||||||
|
"[Northeast] Chest Beneath Brick Walkway": { "name": "", "owner": "" },
|
||||||
|
"[Northeast] Chest On Brick Walkway": { "name": "", "owner": "" },
|
||||||
|
"[Northeast] Key Pickup": { "name": "", "owner": "" },
|
||||||
|
"[Northwest] Behind Envoy": { "name": "", "owner": "" },
|
||||||
|
"[Northwest] Bombable Wall": { "name": "", "owner": "" },
|
||||||
|
"[South] Chest Near Big Crabs": { "name": "", "owner": "" },
|
||||||
|
"[South] Near Birds": { "name": "", "owner": "" },
|
||||||
|
"[South] Upper Floor On Bricks": { "name": "", "owner": "" },
|
||||||
|
"[South] Upper Floor On Power Line": { "name": "", "owner": "" },
|
||||||
|
"[Southeast] Chest Near Fuse": { "name": "", "owner": "" },
|
||||||
|
"[Southwest] Obscured Behind Fuse": { "name": "", "owner": "" },
|
||||||
|
"[West] Near Kevin Block": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Ruined Passage": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"checks": {
|
||||||
|
"Holy Cross Chest": { "name": "", "owner": "" },
|
||||||
|
"Page Pickup": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Ruined Shop": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"checks": {
|
||||||
|
"Chest 1": { "name": "", "owner": "" },
|
||||||
|
"Chest 2": { "name": "", "owner": "" },
|
||||||
|
"Chest 3": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Sealed Temple": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"checks": {
|
||||||
|
"Holy Cross Chest": { "name": "", "owner": "" },
|
||||||
|
"Page Pickup": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Secret Gathering Place": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"checks": {
|
||||||
|
"10 Fairy Reward": { "name": "", "owner": "" },
|
||||||
|
"20 Fairy Reward": { "name": "", "owner": "" },
|
||||||
|
"Holy Cross Chest": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Shop": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 4,
|
||||||
|
"total": 4,
|
||||||
|
"checks": {
|
||||||
|
"Coin 1": { "name": "", "owner": "" },
|
||||||
|
"Coin 2": { "name": "", "owner": "" },
|
||||||
|
"Potion 1": { "name": "", "owner": "" },
|
||||||
|
"Potion 2": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Southeast Cross Room": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 3,
|
||||||
|
"total": 3,
|
||||||
|
"checks": {
|
||||||
|
"Chest 1": { "name": "", "owner": "" },
|
||||||
|
"Chest 2": { "name": "", "owner": "" },
|
||||||
|
"Chest 3": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Special Shop": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Secret Page Pickup": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Stick House": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Stick Chest": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"Swamp": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 22,
|
||||||
|
"total": 22,
|
||||||
|
"checks": {
|
||||||
|
"[Central] Beneath Memorial": { "name": "", "owner": "" },
|
||||||
|
"[Central] Near Ramps Up": { "name": "", "owner": "" },
|
||||||
|
"[Central] Obscured Behind Northern Mountain": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[Central] South Secret Passage": { "name": "", "owner": "" },
|
||||||
|
"[Entrance] Above Entryway": { "name": "", "owner": "" },
|
||||||
|
"[Entrance] North Small Island": { "name": "", "owner": "" },
|
||||||
|
"[Entrance] Obscured Inside Watchtower": { "name": "", "owner": "" },
|
||||||
|
"[Entrance] South Near Fence": { "name": "", "owner": "" },
|
||||||
|
"[Outside Cathedral] Near Moonlight Bridge Door": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[Outside Cathedral] Obscured Behind Memorial": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[South Graveyard] 4 Orange Skulls": { "name": "", "owner": "" },
|
||||||
|
"[South Graveyard] Above Big Skeleton": { "name": "", "owner": "" },
|
||||||
|
"[South Graveyard] Chest Near Graves": { "name": "", "owner": "" },
|
||||||
|
"[South Graveyard] Guarded By Big Skeleton": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[South Graveyard] Guarded By Tentacles": { "name": "", "owner": "" },
|
||||||
|
"[South Graveyard] Obscured Behind Ridge": { "name": "", "owner": "" },
|
||||||
|
"[South Graveyard] Obscured Beneath Telescope": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[South Graveyard] Upper Walkway Dash Chest": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[South Graveyard] Upper Walkway On Pedestal": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[Upper Graveyard] Near Shield Fleemers": { "name": "", "owner": "" },
|
||||||
|
"[Upper Graveyard] Near Telescope": { "name": "", "owner": "" },
|
||||||
|
"[Upper Graveyard] Obscured Behind Hill": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"The Heir": { "collected": 0, "remaining": 0, "total": 0, "checks": {} },
|
||||||
|
"Top of the Mountain": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": { "Page At The Peak": { "name": "", "owner": "" } }
|
||||||
|
},
|
||||||
|
"West Furnace": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 2,
|
||||||
|
"total": 2,
|
||||||
|
"checks": {
|
||||||
|
"Chest": { "name": "", "owner": "" },
|
||||||
|
"Lantern Pickup": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"West Garden": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 20,
|
||||||
|
"total": 20,
|
||||||
|
"checks": {
|
||||||
|
"[Central Highlands] After Garden Knight": { "name": "", "owner": "" },
|
||||||
|
"[Central Highlands] Behind Guard Captain": { "name": "", "owner": "" },
|
||||||
|
"[Central Highlands] Holy Cross (Blue Lines)": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[Central Highlands] Top of Ladder Before Boss": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[Central Lowlands] Below Left Walkway": { "name": "", "owner": "" },
|
||||||
|
"[Central Lowlands] Chest Beneath Faeries": { "name": "", "owner": "" },
|
||||||
|
"[Central Lowlands] Chest Beneath Save Point": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[Central Lowlands] Chest Near Shortcut Bridge": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[Central Lowlands] Passage Beneath Bridge": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[East Lowlands] Page Behind Ice Dagger House": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[North] Across From Page Pickup": { "name": "", "owner": "" },
|
||||||
|
"[North] Behind Holy Cross Door": { "name": "", "owner": "" },
|
||||||
|
"[North] Obscured Beneath Hero's Memorial": { "name": "", "owner": "" },
|
||||||
|
"[North] Page Pickup": { "name": "", "owner": "" },
|
||||||
|
"[South Highlands] Secret Chest Beneath Fuse": {
|
||||||
|
"name": "",
|
||||||
|
"owner": ""
|
||||||
|
},
|
||||||
|
"[Southeast Lowlands] Outside Cave": { "name": "", "owner": "" },
|
||||||
|
"[West Highlands] Upper Left Walkway": { "name": "", "owner": "" },
|
||||||
|
"[West Lowlands] Tree Holy Cross Chest": { "name": "", "owner": "" },
|
||||||
|
"[West] In Flooded Walkway": { "name": "", "owner": "" },
|
||||||
|
"[West] Past Flooded Walkway": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"West Garden House": {
|
||||||
|
"collected": 0,
|
||||||
|
"remaining": 1,
|
||||||
|
"total": 1,
|
||||||
|
"checks": {
|
||||||
|
"[Southeast Lowlands] Ice Dagger Pickup": { "name": "", "owner": "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Windmill": { "collected": 0, "remaining": 0, "total": 0, "checks": {} }
|
||||||
|
}
|
||||||
|
}
|
8
tunictracker/less_fun_overview.json
Normal file
8
tunictracker/less_fun_overview.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"scene": "Overworld",
|
||||||
|
"seed": 98135423,
|
||||||
|
"items": 0,
|
||||||
|
"entrances": 0,
|
||||||
|
"hints": 0,
|
||||||
|
"codes": {}
|
||||||
|
}
|
@ -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");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
624
tunictracker/tracker/static/tracker/assets/refresh_elements.js
Normal file
624
tunictracker/tracker/static/tracker/assets/refresh_elements.js
Normal file
@ -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,
|
||||||
|
`<span style="color: ${matches[0][1]};">${matches[0][2]}</span>`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
@ -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 <text in carats>
|
||||||
|
// // no whitespace concerns (eg., "sehz <#FF00FF>sohm%i^" becomes "sehz sohm%i^")
|
||||||
|
// input = input.replace(/<.+?>/gm, "");
|
||||||
|
// input = input.trim();
|
||||||
|
|
||||||
|
while (cursor < input.length) {
|
||||||
|
// get what one character and two characters ahead would be
|
||||||
|
const one = input[cursor];
|
||||||
|
const two = input.slice(cursor, cursor + 2);
|
||||||
|
// things in between quotes are in english, ignore it and set span accordingly
|
||||||
|
if (one == '"') {
|
||||||
|
payload += `</span><span class="${inQuote ? "font-trunic" : "english"}">`;
|
||||||
|
inQuote = !inQuote;
|
||||||
|
cursor++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// if we're in an english quote, add it in and move on
|
||||||
|
if (inQuote) {
|
||||||
|
payload += one;
|
||||||
|
cursor++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// check if this is a skipped character
|
||||||
|
if (skip.includes(one)) {
|
||||||
|
payload += one;
|
||||||
|
// check if we have a translation for this character
|
||||||
|
} else if (lookup.hasOwnProperty(one)) {
|
||||||
|
payload += lookup[one];
|
||||||
|
// check if we have a translation for two characters ahead
|
||||||
|
// if so, advance the cursor head extra to make up for using two
|
||||||
|
} else if (lookup.hasOwnProperty(two)) {
|
||||||
|
payload += lookup[two];
|
||||||
|
cursor++;
|
||||||
|
// uh oh
|
||||||
|
} else {
|
||||||
|
// console.log(input[cursor], "UNKNOWN", input[cursor].charCodeAt(0));
|
||||||
|
}
|
||||||
|
// advance the cursor head to the next character
|
||||||
|
cursor++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return `<span class="inline-block pt-0.5 font-trunic text-md sm:text-xl h-full align-bottom">${payload} </span>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default translate;
|
@ -8,18 +8,21 @@
|
|||||||
"Cathedral": {
|
"Cathedral": {
|
||||||
"Secret Legend Door": "LULURULURDRRURDLDRDLDL"
|
"Secret Legend Door": "LULURULURDRRURDLDRDLDL"
|
||||||
},
|
},
|
||||||
|
"Swamp": {
|
||||||
|
"Secret Legend Door": "LULURULURDRRURDLDRDLDL"
|
||||||
|
},
|
||||||
"Caustic Light Cave": {
|
"Caustic Light Cave": {
|
||||||
"Casting Light Fairy": "RULURDRURDLDR"
|
"Holy Cross Chest": "RULURDRURDLDR"
|
||||||
},
|
},
|
||||||
"Cube Cave": {
|
"Cube Cave": {
|
||||||
"Cube Fairy": "RRRRUUUURRRUUURRUURU"
|
"Holy Cross Chest": "RRRRUUUURRRUUURRUURU"
|
||||||
},
|
},
|
||||||
"East Forest": {
|
"East Forest": {
|
||||||
"Dancer Fairy": "UDUDLRLRDLUR",
|
"Dancing Fox Spirit Holy Cross": "UDUDLRLRDLUR",
|
||||||
"Obelisk Fairy": "DRDLULDLURULURURULURDRDRDLDRDLU"
|
"Golden Obelisk Holy Cross": "DRDLULDLURULURURULURDRDRDLDRDLU"
|
||||||
},
|
},
|
||||||
"Eastern Vault Fortress": {
|
"Eastern Vault Fortress": {
|
||||||
"Candles Fairy": "RLDRUL"
|
"Candles Holy Cross": "RLDRUL"
|
||||||
},
|
},
|
||||||
"Global": {
|
"Global": {
|
||||||
"Firebomb": "LURDRURDRURDL",
|
"Firebomb": "LURDRURDRURDL",
|
||||||
@ -27,54 +30,54 @@
|
|||||||
"Icebomb": "LDRURDRURDRUL"
|
"Icebomb": "LDRURDRURDRUL"
|
||||||
},
|
},
|
||||||
"Hourglass Cave": {
|
"Hourglass Cave": {
|
||||||
"Hourglass Door": "RULURULUURDLDRDLDR",
|
"Holy Cross Door": "RULURULUURDLDRDLDR",
|
||||||
"Hourglass Fairy": "LURURDRURULLLURU"
|
"Holy Cross Chest": "LURURDRURULLLURU"
|
||||||
},
|
},
|
||||||
"Library Hall": {
|
"Library Hall": {
|
||||||
"Library Fairy": "URDRULURULURDLDRURDRULURULULDRDLDRDL"
|
"Holy Cross Chest": "URDRULURULURDLDRURDRULURULULDRDLDRDL"
|
||||||
},
|
},
|
||||||
"Lower Mountain": {
|
"Lower Mountain": {
|
||||||
"Top Of Mountain Door": "ULDLULDLURURULURDRULULURULDLURUULURDRDRURDLDRURRDRURDRURRDLDLDRDRDLLDRDLDRURDRURRDDLURULDLULULURRULU"
|
"Top Of Mountain Door": "ULDLULDLURURULURDRULULURULDLURUULURDRDRURDLDRURRDRURDRURRDLDLDRDRDLLDRDLDRURDRURRDDLURULDLULULURRULU"
|
||||||
},
|
},
|
||||||
"Maze Cave": {
|
"Maze Cave": {
|
||||||
"Maze Fairy": "ULDLURDRURDLULU"
|
"Maze Room Holy Cross": "ULDLURDRURDLULU"
|
||||||
},
|
},
|
||||||
"Old House": {
|
"Old House": {
|
||||||
"Old House Door": "ULDRDL",
|
"Holy Cross Door": "ULDRDL",
|
||||||
"Old House Fairy": "UURDDRUURDDD"
|
"Holy Cross Chest": "UURDDRUURDDD"
|
||||||
},
|
},
|
||||||
"Overworld": {
|
"Overworld": {
|
||||||
"Back To Work Treasure": "RDLULLDRRDD",
|
"Starting Platform Holy Cross": "RDLULLDRRDD",
|
||||||
"Compass Fairy": "LRDUUDRLURDLUDRL",
|
"Weathervane Holy Cross": "LRDUUDRLURDLUDRL",
|
||||||
"Fire Wand Obelisk Page": "URDLDRUL",
|
"Golden Obelisk Page": "URDLDRUL",
|
||||||
"Fountain Cross Door": "DRULUR",
|
"Fountain Cross Door": "DRULUR",
|
||||||
"Fountain Fairy": "DLLDURD",
|
"Fountain Holy Cross": "DLLDURD",
|
||||||
"Lower Flowers Fairy": "URDLDLDLDLU",
|
"Southwest Flowers Holy Cross": "URDLDLDLDLU",
|
||||||
"Moss Fairy": "URULDLULURDRDRULURDRD",
|
"Moss Wall Holy Cross": "URULDLULURDRDRULURDRD",
|
||||||
"Power Up Treasure": "UDRUDLUDLRDLRU",
|
"Windchimes Holy Cross": "UDRUDLUDLRDLRU",
|
||||||
"Sacred Geometry Treasure": "DLLUURRLDRUD",
|
"Windmill Holy Cross": "DLLUURRLDRUD",
|
||||||
"Southeast Cross Door": "DRULUR",
|
"Southeast Cross Door": "DRULUR",
|
||||||
"Upper Flowers Fairy": "ULDLDLDLURDRRDR",
|
"Northeast Flowers Holy Cross": "ULDLDLDLURDRRDR",
|
||||||
"Vintage Treasure": "DRRRRRRRRRRRLLLLLLLLLLLL"
|
"Haiku Holy Cross": "DRRRRRRRRRRRLLLLLLLLLLLL"
|
||||||
},
|
},
|
||||||
"Patrol Cave": {
|
"Patrol Cave": {
|
||||||
"Patrol Fairy": "DDRURDLDRURDD"
|
"Holy Cross Chest": "DDRURDLDRURDD"
|
||||||
},
|
},
|
||||||
"Quarry": {
|
"Quarry": {
|
||||||
"Quarry Fairy": "URDLURULDLURRD"
|
"Bushes Holy Cross": "URDLURULDLURRD"
|
||||||
},
|
},
|
||||||
"Ruined Passage": {
|
"Ruined Passage": {
|
||||||
"Ruined Passage Door": "LURULDLURDRULURD"
|
"Holy Cross Door": "LURULDLURDRULURD"
|
||||||
},
|
},
|
||||||
"Sealed Temple": {
|
"Sealed Temple": {
|
||||||
"Temple Fairy": "URULURULURDRUUL"
|
"Holy Cross Chest": "URULURULURDRUUL"
|
||||||
},
|
},
|
||||||
"Secret Gathering Place": {
|
"Secret Gathering Place": {
|
||||||
"Waterfall Fairy": "DRURURULULURURULDLDLDRDLDRDRUR"
|
"Holy Cross Chest": "DRURURULULURURULDLDLDRDLDRDRUR"
|
||||||
},
|
},
|
||||||
"West Garden": {
|
"West Garden": {
|
||||||
"Sword Door": "DRULUR",
|
"Holy Cross Door": "DRULUR",
|
||||||
"Tiles Fairy": "URULURULURDRULDLURULURULU",
|
"Holy Cross (Blue Lines)": "URULURULURDRULDLURULURULU",
|
||||||
"Tree Fairy": "LDRLUD"
|
"Tree Holy Cross Chest": "LDRLUD"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BIN
tunictracker/tracker/static/tracker/fonts/Trunic-Regular.otf
Normal file
BIN
tunictracker/tracker/static/tracker/fonts/Trunic-Regular.otf
Normal file
Binary file not shown.
@ -11,9 +11,12 @@
|
|||||||
<link rel="shortcut icon" href="{% static "tracker/images/neofox_flag_trans_256.png" %}">
|
<link rel="shortcut icon" href="{% static "tracker/images/neofox_flag_trans_256.png" %}">
|
||||||
{% load static tailwind_tags %}
|
{% load static tailwind_tags %}
|
||||||
{% tailwind_css %}
|
{% tailwind_css %}
|
||||||
<script src="{% static "tracker/assets/refresh.js" %}"></script>
|
<link rel="stylesheet" href="https://csshake.surge.sh/csshake-default.css">
|
||||||
|
<script src="{% static "tracker/assets/button_functions.js" %}"></script>
|
||||||
|
<script type="module" src="{% static "tracker/assets/refresh_elements.js" %}"></script>
|
||||||
|
<script type="module" src="{% static "tracker/assets/translate-hints.js" %}"></script>
|
||||||
</head>
|
</head>
|
||||||
<body class="font-nerd min-h-screen bg-gradient-to-br from-bluelight-background-dark to-bluelight-background">
|
<body class="min-h-screen font-nerd bg-gradient-to-br from-bluelight-background-dark to-bluelight-background">
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
</body>
|
</body>
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
<div class="flex flex-col my-2 space-y-2">
|
<div class="flex flex-col my-2 space-y-2">
|
||||||
<div class="text-md breakdown-block-checks-title"
|
<div class="text-md breakdown-block-checks-title"
|
||||||
data-checks="{{ scene_data.checks.collected }}">
|
data-checks="{{ scene_data.checks.collected }}">
|
||||||
Checks: {{ scene_data.checks.collected }}/{{ scene_data.checks.total }}
|
Checks: {{ scene_data.checks.collected }}/{{ scene_data.checks.total }} ({{ scene_data.checks.remaining }} left)
|
||||||
</div>
|
</div>
|
||||||
<hr class="border-2 border-bluelight-translucent-dark rounded-xl" />
|
<hr class="border-2 border-bluelight-translucent-dark rounded-xl" />
|
||||||
</div>
|
</div>
|
||||||
@ -28,7 +28,7 @@
|
|||||||
<div class="flex flex-col my-2 space-y-2">
|
<div class="flex flex-col my-2 space-y-2">
|
||||||
<div class="text-md breakdown-block-entrances-title"
|
<div class="text-md breakdown-block-entrances-title"
|
||||||
data-entrances="{{ scene_data.entrances.found }}">
|
data-entrances="{{ scene_data.entrances.found }}">
|
||||||
Entrances: {{ scene_data.entrances.found }}/{{ scene_data.entrances.total }}
|
Entrances: {{ scene_data.entrances.found }}/{{ scene_data.entrances.total }} ({{ scene_data.entrances.remaining }} left)
|
||||||
</div>
|
</div>
|
||||||
<hr class="border-2 border-bluelight-translucent-dark rounded-xl" />
|
<hr class="border-2 border-bluelight-translucent-dark rounded-xl" />
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<details class="py-2 px-2 mt-2 flex flex-col space-y-4 max-w-full text-holy-cross text-base [text-shadow:_1px_1px_4px_rgb(0_0_0_/_100%)] rounded-xl bg-gradient-to-br from-[#ffe28530] to-[#ffffff30] drop-shadow-[0px_0px_4px_rgba(255,255,255,1)] justify-start">
|
<details class="py-2 px-2 mt-2 flex flex-col space-y-4 max-w-full text-holy-cross text-base [text-shadow:_1px_1px_4px_rgb(0_0_0_/_100%)] rounded-xl bg-gradient-to-br from-[#ffe28558] to-[#ffffff58] shadow-sm shadow-[#242424] justify-start">{% comment %} drop-shadow-[0px_0px_4px_rgba(255,255,255,1)]"> {% endcomment %}
|
||||||
<summary>Holy Cross Codes</summary>
|
<summary>Holy Cross Codes</summary>
|
||||||
<hr class="border-2 border-holy-cross opacity-30 rounded-xl" />
|
<hr class="border-2 border-holy-cross opacity-30 rounded-xl" />
|
||||||
<div class="flex flex-col space-y-2 overflow-y-scroll max-h-96 rounded-xl">
|
<div class="flex flex-col space-y-2 overflow-y-scroll max-h-96 rounded-xl">
|
||||||
|
3
tunictracker/tracker/templates/tracker/hints/index.html
Normal file
3
tunictracker/tracker/templates/tracker/hints/index.html
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<div class="h-full min-w-full p-2 rounded-md bg-[rgb(36,36,36)] bg-opacity-35">
|
||||||
|
<div class="inline align-top text-md {% comment "" %}inline-block{% endcomment %}">{{ value }}</div>
|
||||||
|
</div>
|
@ -1,8 +1,8 @@
|
|||||||
<details class="py-2 px-4 flex flex-col space-y-2 max-w-full text-md rounded-lg bg-gradient-to-br from-bluelight-background-light to-bluelight-background">
|
<details class="py-2 px-4 flex flex-col space-y-2 max-w-full text-md rounded-lg bg-gradient-to-br from-bluelight-background-light to-bluelight-background shadow-sm shadow-[#242424]">
|
||||||
<summary class="justify-start">How To Use This Tracker</summary>
|
<summary class="justify-start">How To Use This Tracker</summary>
|
||||||
<hr class="mt-2 border-2 border-bluelight-dark rounded-xl" />
|
<hr class="mt-2 border-2 border-bluelight-dark rounded-xl" />
|
||||||
<div class="text-lg px-2">Setup</div>
|
<div class="px-2 text-lg">Setup</div>
|
||||||
<ul class="flex flex-col space-y-1 px-4 ml-4 list-decimal text-sm break-all">
|
<ul class="flex flex-col px-4 ml-4 space-y-1 text-sm break-all list-decimal">
|
||||||
<li>
|
<li>
|
||||||
Download the latest release at <a href="https://github.com/spaceglace/TunicTransitionTracker/releases"
|
Download the latest release at <a href="https://github.com/spaceglace/TunicTransitionTracker/releases"
|
||||||
class="underline text-bluelight-link">https://github.com/spaceglace/TunicTransitionTracker/releases</a> for your OS.
|
class="underline text-bluelight-link">https://github.com/spaceglace/TunicTransitionTracker/releases</a> for your OS.
|
||||||
@ -28,8 +28,8 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="text-md px-2">Usage</div>
|
<div class="px-2 text-md">Usage</div>
|
||||||
<ul class="flex flex-col space-y-2 px-4 list-inside list-disc text-sm">
|
<ul class="flex flex-col px-4 space-y-2 text-sm list-disc list-inside">
|
||||||
<li>
|
<li>
|
||||||
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.
|
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.
|
||||||
</li>
|
</li>
|
||||||
@ -72,7 +72,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<hr class="mt-2 border-2 border-bluelight-dark rounded-xl" />
|
<hr class="mt-2 border-2 border-bluelight-dark rounded-xl" />
|
||||||
<div class="flex flex-col px-2 pb-2 list-none text-sm">
|
<div class="flex flex-col px-2 pb-2 text-sm list-none">
|
||||||
<li>
|
<li>
|
||||||
* 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.
|
* 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.
|
||||||
</li>
|
</li>
|
||||||
|
@ -6,39 +6,49 @@
|
|||||||
{% if debug != '' %}
|
{% if debug != '' %}
|
||||||
<div class="px-2 space-y-2">
|
<div class="px-2 space-y-2">
|
||||||
<div class="flex flex-col align-middle max-w-fit">
|
<div class="flex flex-col align-middle max-w-fit">
|
||||||
<div class="flex flex-row h-12 space-x-2 align-middle max-w-fit">
|
<div class="flex flex-row space-x-2 align-middle sm:h-12 max-w-fit">
|
||||||
<span class="flex flex-shrink-0 object-contain w-8 h-8 my-auto align-middle backdrop-blur">
|
<span class="flex flex-shrink-0 object-contain w-8 h-8 my-auto align-middle shake backdrop-blur">
|
||||||
<img src="{% static 'tracker/images/neofox_flag_trans_256.png' %}"
|
<img src="{% static 'tracker/images/neofox_flag_trans_256.png' %}"
|
||||||
alt="A trans pride fox emoji."
|
alt="A trans pride fox emoji."
|
||||||
width="32"
|
width="32"
|
||||||
height="32" />
|
height="32" />
|
||||||
</span>
|
</span>
|
||||||
<img class="w-[15.5rem] h-11 align-middle invert drop-shadow-[1px_2px_2px_rgba(0,0,0,1)]"
|
<div class="min-w-0 my-auto text-xl align-middle overflow-clip sm:text-3xl">Tunic Transition Tracker</div>
|
||||||
src="{% static 'tracker/images/trunic.svg' %}"
|
</div>
|
||||||
alt="A trans pride fox emoji."
|
<div class="flex-row pb-2 space-y-1 text-lg sm:text-2xl max-w-fit font-trunic">
|
||||||
width=""
|
(
|
||||||
height="" />
|
<div class="pt-1.5 text-sm sm:text-lg"> tuniik' t'raan'ziishuun' t'raakx </div>
|
||||||
|
)
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-auto text-sm max-w-fit">(Tunic Transition Tracker)</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="space-y-1">
|
<div class="space-y-1">
|
||||||
{% include "tracker/howto/index.html" %}
|
<hr class="border-2 border-bluelight-dark rounded-xl" />
|
||||||
<hr class="mt-2 border-2 border-bluelight-dark rounded-xl" />
|
|
||||||
<div class="flex flex-col px-2 space-y-2 text-lg rounded-sm md:flex-row md:space-x-4 md:space-y-0 bg-gradient-to-r from-bluelight-light to-bluelight-dark"
|
<div class="flex flex-col px-2 space-y-2 text-lg rounded-sm md:flex-row md:space-x-4 md:space-y-0 bg-gradient-to-r from-bluelight-light to-bluelight-dark"
|
||||||
id="overview-totals">
|
id="overview-totals">
|
||||||
<div class="flex basis-1/2 overview-checks">Checks: {{ totals.Checks.Undiscovered }}/{{ totals.Checks.Total }}</div>
|
<div class="flex basis-1/2">
|
||||||
<div class="flex basis-1/2 overview-entrances">
|
<div class="flex-col min-w-full">
|
||||||
Entrances: {{ totals.Entrances.Undiscovered }}/{{ totals.Entrances.Total }}
|
<div>
|
||||||
|
Checks
|
||||||
|
<hr class="border-2 border-bluelight-dark rounded-xl" />
|
||||||
|
</div>
|
||||||
|
<div class="overview-checks">
|
||||||
|
{{ totals.Checks.Undiscovered }}/{{ totals.Checks.Total }} ({{ totals.Checks.Remaining }} left)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex basis-1/2">
|
||||||
|
<div class="flex-col min-w-full">
|
||||||
|
<div>
|
||||||
|
Entrances
|
||||||
|
<hr class="border-2 border-bluelight-dark rounded-xl" />
|
||||||
|
</div>
|
||||||
|
<div class="overview-entrances">
|
||||||
|
{{ totals.Entrances.Undiscovered }}/{{ totals.Entrances.Total }} ({{ totals.Entrances.Remaining }} left)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<details class="flex flex-col rounded-lg group bg-gradient-to-br from-bluelight-background-light to-bluelight-background">
|
|
||||||
<summary class="justify-start px-4 py-2">Summary</summary>
|
|
||||||
<div class="px-2 rounded-xl">
|
|
||||||
<hr class="border-2 border-bluelight-translucent-dark rounded-xl" />
|
|
||||||
<div class="py-2" id="summary-list">{% include "tracker/summary/list.html" %}</div>
|
|
||||||
</div>
|
|
||||||
</details>
|
|
||||||
<hr class="mb-2 border-2 border-bluelight-dark rounded-xl" />
|
<hr class="mb-2 border-2 border-bluelight-dark rounded-xl" />
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col space-y-2">
|
<div class="flex flex-col space-y-2">
|
||||||
@ -48,20 +58,36 @@
|
|||||||
{% include "tracker/breakdown/block.html" with extra_classes="hidden" is_current_scene="false" %}
|
{% include "tracker/breakdown/block.html" with extra_classes="hidden" is_current_scene="false" %}
|
||||||
{% for scene_title, scene_data in scenes.items %}
|
{% for scene_title, scene_data in scenes.items %}
|
||||||
{% if scene_title == current_scene %}
|
{% 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 %}
|
{% 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 %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% comment %} <div id="breakdown-current">
|
|
||||||
{% include "tracker/breakdown/block.html" with scene_title=current_scene.title scene_data=current_scene.data %}
|
|
||||||
</div> {% endcomment %}
|
|
||||||
{% include "tracker/codes/index.html" %}
|
|
||||||
</div>
|
</div>
|
||||||
<details class="flex flex-col max-w-full px-4 py-2 space-y-2 rounded-lg text-md bg-gradient-to-br from-bluelight-background-light to-bluelight-background">
|
<details class="flex flex-col rounded-lg group bg-gradient-to-br from-bluelight-background-light to-bluelight-background shadow-sm shadow-[#242424]">
|
||||||
|
<summary class="justify-start px-4 py-2">Summary</summary>
|
||||||
|
<div class="px-2 rounded-xl">
|
||||||
|
<hr class="border-2 border-bluelight-translucent-dark rounded-xl" />
|
||||||
|
<div class="py-2" id="summary-list">{% include "tracker/summary/list.html" %}</div>
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
{% include "tracker/codes/index.html" %}
|
||||||
|
<details class="rounded-lg group bg-gradient-to-br from-bluelight-background-light to-bluelight-background shadow-sm shadow-[#242424]">
|
||||||
|
<summary class="justify-start px-4 py-2">Hints</summary>
|
||||||
|
<div class="px-2 rounded-xl">
|
||||||
|
<hr class="border-2 border-bluelight-translucent-dark rounded-xl" />
|
||||||
|
<div class="flex-col py-2 space-y-1 *:text-wrap *:break-words"
|
||||||
|
id="hints-list">
|
||||||
|
{% include "tracker/hints/index.html" with value="" %}
|
||||||
|
{% for name, value in hints.items %}
|
||||||
|
{% include "tracker/hints/index.html" %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
<details class="flex flex-col max-w-full px-4 py-2 space-y-2 rounded-lg text-md bg-gradient-to-br from-bluelight-background-light to-bluelight-background shadow-sm shadow-[#242424]">
|
||||||
<summary class="justify-start">Settings</summary>
|
<summary class="justify-start">Settings</summary>
|
||||||
{% comment %} {% include "tracker/settings/index.html" %} {% endcomment %}
|
|
||||||
{% include "tracker/address/index.html" %}
|
{% include "tracker/address/index.html" %}
|
||||||
<div class="flex flex-row justify-center p-2 m-auto space-x-2 align-middle">
|
<div class="flex flex-row justify-center p-2 m-auto space-x-2 align-middle">
|
||||||
<input onclick="hide_empty_summaries()"
|
<input onclick="hide_empty_summaries()"
|
||||||
@ -84,6 +110,7 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
|
{% include "tracker/howto/index.html" %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<div id="no_data" />{% endif %}</div>
|
<div id="no_data" />{% endif %}</div>
|
||||||
|
@ -7,12 +7,12 @@
|
|||||||
<div class="summary-checks"
|
<div class="summary-checks"
|
||||||
data-checks-undiscovered="{{ scene_data.checks.collected }}"
|
data-checks-undiscovered="{{ scene_data.checks.collected }}"
|
||||||
data-checks-total="{{ scene_data.checks.total }}">
|
data-checks-total="{{ scene_data.checks.total }}">
|
||||||
Checks: {{ scene_data.checks.collected }}/{{ scene_data.checks.total }}
|
Checks: {{ scene_data.checks.collected }}/{{ scene_data.checks.total }} ({{ scene_data.checks.remaining }})
|
||||||
</div>
|
</div>
|
||||||
<div class="summary-entrances"
|
<div class="summary-entrances"
|
||||||
data-entrances-undiscovered="{{ scene_data.entrances.found }}"
|
data-entrances-undiscovered="{{ scene_data.entrances.found }}"
|
||||||
data-entrances-total="{{ scene_data.entrances.total }}">
|
data-entrances-total="{{ scene_data.entrances.total }}">
|
||||||
Entrances: {{ scene_data.entrances.found }}/{{ scene_data.entrances.total }}
|
Entrances: {{ scene_data.entrances.found }}/{{ scene_data.entrances.total }} ({{ scene_data.entrances.remaining }})
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
|
@ -4,7 +4,7 @@ from django.template import loader
|
|||||||
from json import loads, dumps
|
from json import loads, dumps
|
||||||
from math import floor
|
from math import floor
|
||||||
import requests
|
import requests
|
||||||
from .forms import ServerAddressForm # , BackendFilepathForm
|
from .forms import ServerAddressForm
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
@ -12,8 +12,6 @@ import logging
|
|||||||
# Debug and defaults.
|
# Debug and defaults.
|
||||||
defaults = {
|
defaults = {
|
||||||
"listen_address": "http://localhost:51111/",
|
"listen_address": "http://localhost:51111/",
|
||||||
# 'backend_filepath': '',
|
|
||||||
# 'backend_filepath_updated': False,
|
|
||||||
}
|
}
|
||||||
logging.basicConfig(encoding="utf-8", level=logging.DEBUG)
|
logging.basicConfig(encoding="utf-8", level=logging.DEBUG)
|
||||||
|
|
||||||
@ -35,7 +33,6 @@ def session_key(session, key):
|
|||||||
|
|
||||||
def index(request):
|
def index(request):
|
||||||
listen_address = session_key(request.session, "listen_address")
|
listen_address = session_key(request.session, "listen_address")
|
||||||
# backend_filepath = session_key(request.session, 'backend_filepath')
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
request_overview_data = requests.get(
|
request_overview_data = requests.get(
|
||||||
@ -50,31 +47,19 @@ def index(request):
|
|||||||
request_hints_data = requests.get(
|
request_hints_data = requests.get(
|
||||||
f"{listen_address}hints", timeout=5, verify=True
|
f"{listen_address}hints", timeout=5, verify=True
|
||||||
).text
|
).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_overview_data = loads(request_overview_data)
|
||||||
tracker_items_data = loads(request_items_data)
|
tracker_items_data = loads(request_items_data)
|
||||||
tracker_doors_data = loads(request_doors_data)
|
tracker_doors_data = loads(request_doors_data)
|
||||||
tracker_hints_data = loads(request_hints_data)
|
tracker_hints_data = loads(request_hints_data)
|
||||||
except:
|
except:
|
||||||
with open("empty_spoiler.json", "r") as t:
|
with open("less_fun_overview.json", "r") as t:
|
||||||
try:
|
tracker_overview_data = loads(t.read())
|
||||||
tracker_output = loads(t.read())
|
with open("less_fun_items.json", "r") as t:
|
||||||
except:
|
tracker_items_data = loads(t.read())
|
||||||
return
|
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:
|
with open("tracker/static/tracker/data/holy_cross_codes.json", "r") as t:
|
||||||
try:
|
try:
|
||||||
temp_codes = loads(t.read())
|
temp_codes = loads(t.read())
|
||||||
@ -92,13 +77,6 @@ def index(request):
|
|||||||
except:
|
except:
|
||||||
return
|
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
|
# Data from the /overview API call
|
||||||
tracker_current_scene = tracker_overview_data["scene"]
|
tracker_current_scene = tracker_overview_data["scene"]
|
||||||
tracker_seed = tracker_overview_data["seed"]
|
tracker_seed = tracker_overview_data["seed"]
|
||||||
@ -107,10 +85,12 @@ def index(request):
|
|||||||
|
|
||||||
# Data from the /doors API call
|
# Data from the /doors API call
|
||||||
tracker_entrances_total = tracker_doors_data["total"]
|
tracker_entrances_total = tracker_doors_data["total"]
|
||||||
|
tracker_entrances_remaining = tracker_doors_data["remaining"]
|
||||||
tracker_entrances_mapped_total = tracker_doors_data["found"]
|
tracker_entrances_mapped_total = tracker_doors_data["found"]
|
||||||
|
|
||||||
# Data from the /items API call
|
# Data from the /items API call
|
||||||
tracker_checks_total = tracker_items_data["total"]
|
tracker_checks_total = tracker_items_data["total"]
|
||||||
|
tracker_checks_remaining = tracker_items_data["remaining"]
|
||||||
tracker_checks_cleared_total = tracker_items_data["collected"]
|
tracker_checks_cleared_total = tracker_items_data["collected"]
|
||||||
|
|
||||||
active_codes = {}
|
active_codes = {}
|
||||||
@ -121,16 +101,6 @@ def index(request):
|
|||||||
}
|
}
|
||||||
logging.debug(active_codes)
|
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 = {}
|
scene_data = {}
|
||||||
for scene in tracker_doors_data["scenes"].keys():
|
for scene in tracker_doors_data["scenes"].keys():
|
||||||
scene_data[scene] = {
|
scene_data[scene] = {
|
||||||
@ -141,64 +111,34 @@ def index(request):
|
|||||||
template = loader.get_template("tracker/index.html")
|
template = loader.get_template("tracker/index.html")
|
||||||
server_address_form = ServerAddressForm()
|
server_address_form = ServerAddressForm()
|
||||||
server_address_form.fields["server_address_form"].initial = listen_address
|
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))
|
logging.debug(format_overview_output(tracker_overview_data))
|
||||||
context = {
|
context = {
|
||||||
# 'backend_filepath': backend_filepath,
|
|
||||||
"server_address": listen_address,
|
"server_address": listen_address,
|
||||||
# 'is_hidden': is_hidden,
|
|
||||||
"debug": {},
|
"debug": {},
|
||||||
"default_codes": cross_codes["Default"],
|
"default_codes": cross_codes["Default"],
|
||||||
"totals": {
|
"totals": {
|
||||||
"Checks": {
|
"Checks": {
|
||||||
"Undiscovered": tracker_checks_cleared_total,
|
"Undiscovered": tracker_checks_cleared_total,
|
||||||
|
"Remaining": tracker_checks_remaining,
|
||||||
"Total": tracker_checks_total,
|
"Total": tracker_checks_total,
|
||||||
},
|
},
|
||||||
"Entrances": {
|
"Entrances": {
|
||||||
"Undiscovered": tracker_entrances_mapped_total,
|
"Undiscovered": tracker_entrances_mapped_total,
|
||||||
|
"Remaining": tracker_entrances_remaining,
|
||||||
"Total": tracker_entrances_total,
|
"Total": tracker_entrances_total,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"scenes": scene_data,
|
"scenes": scene_data,
|
||||||
"current_scene": tracker_current_scene,
|
"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,
|
"codes": active_codes,
|
||||||
# },
|
|
||||||
"server_address_form": server_address_form,
|
"server_address_form": server_address_form,
|
||||||
# 'backend_filepath_form': backend_filepath_form
|
"hints": tracker_hints_data,
|
||||||
}
|
}
|
||||||
return HttpResponse(template.render(context, request))
|
return HttpResponse(template.render(context, request))
|
||||||
|
|
||||||
|
|
||||||
def get_address(request):
|
def get_address(request):
|
||||||
if request.method == "GET":
|
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(
|
return HttpResponse(
|
||||||
dumps({"listen_address": request.session["listen_address"]}),
|
dumps({"listen_address": request.session["listen_address"]}),
|
||||||
content_type="application/json",
|
content_type="application/json",
|
||||||
@ -218,26 +158,6 @@ def set_address(request):
|
|||||||
return render(request, "tracker/index.html", {"server_address_form": form})
|
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):
|
def format_overview_output(overview):
|
||||||
overview_string = "\nReceived Overview Data:\n"
|
overview_string = "\nReceived Overview Data:\n"
|
||||||
for key, value in overview.items():
|
for key, value in overview.items():
|
||||||
|
@ -28,6 +28,7 @@ DEBUG = True
|
|||||||
ALLOWED_HOSTS = [
|
ALLOWED_HOSTS = [
|
||||||
"localhost",
|
"localhost",
|
||||||
"127.0.0.1",
|
"127.0.0.1",
|
||||||
|
"100.64.0.4",
|
||||||
"tunic.werefox.cafe"
|
"tunic.werefox.cafe"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
BIN
tunictracker/werefoxtheme/static/fonts/Trunic-Regular.otf
Normal file
BIN
tunictracker/werefoxtheme/static/fonts/Trunic-Regular.otf
Normal file
Binary file not shown.
Binary file not shown.
@ -3,6 +3,10 @@
|
|||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "DejaVuSansMono";
|
font-family: "DejaVuSansMono";
|
||||||
src: url("/static/fonts/DejaVuSansMono.ttf");
|
src: url("/static/fonts/DejaVuSansMono.ttf");
|
||||||
}
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: "Trunic-Regular";
|
||||||
|
src: url("/static/fonts/Trunic-Regular.otf");
|
||||||
|
}
|
||||||
|
@ -52,6 +52,7 @@ module.exports = {
|
|||||||
extend: {
|
extend: {
|
||||||
fontFamily: {
|
fontFamily: {
|
||||||
nerd: ["DejaVuSansMono"],
|
nerd: ["DejaVuSansMono"],
|
||||||
|
trunic: ["Trunic-Regular"],
|
||||||
},
|
},
|
||||||
colors: {
|
colors: {
|
||||||
bluelight: {
|
bluelight: {
|
||||||
@ -118,6 +119,109 @@ module.exports = {
|
|||||||
DEFAULT: "fffae0",
|
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: [
|
plugins: [
|
||||||
|
Loading…
Reference in New Issue
Block a user