Compare commits
	
		
			35 commits
		
	
	
		
			b2651e6277
			...
			cad0292529
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| cad0292529 | |||
| d24cde159a | |||
| 9f37ae967c | |||
| fe983f30e6 | |||
| 76ead448a6 | |||
| d805fec9b9 | |||
| db17504ea0 | |||
| 25f664ee4e | |||
| b8c4dbe022 | |||
| 4d91341c1f | |||
| 6c51d7c2fc | |||
| 5e3115fb23 | |||
| 09cdc465c4 | |||
| e36ed72309 | |||
| 57ec06efb5 | |||
| ca447d9888 | |||
| 34757ac461 | |||
| 157763876b | |||
| fe94dfeb3b | |||
| 852a591684 | |||
| df8555d4aa | |||
| 97d7b3ec8c | |||
| f024e1a1cf | |||
| c44506dbec | |||
| 4737740e48 | |||
| a7313a27ce | |||
| 035c97869f | |||
| 08cae8765e | |||
| f15f125630 | |||
| 171c491497 | |||
| a79ed28dc2 | |||
| 9fea6e1d95 | |||
| 835869deea | |||
| 08ed4c494c | |||
| b7cce37c93 | 
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
						 | 
				
			
			@ -6,4 +6,5 @@ settings.json
 | 
			
		|||
**/db.sqlite3
 | 
			
		||||
**/node_modules/**
 | 
			
		||||
**/dist/**
 | 
			
		||||
spoiler.json
 | 
			
		||||
spoiler.json
 | 
			
		||||
**/dotnet-tools.json
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
asgiref==3.7.2
 | 
			
		||||
autopep8==2.0.4
 | 
			
		||||
certifi==2024.2.2
 | 
			
		||||
charset-normalizer==3.3.2
 | 
			
		||||
click==8.1.7
 | 
			
		||||
| 
						 | 
				
			
			@ -6,6 +7,9 @@ colorama==0.4.6
 | 
			
		|||
cssbeautifier==1.15.1
 | 
			
		||||
Django==5.0.3
 | 
			
		||||
django-browser-reload==1.12.1
 | 
			
		||||
django-tailwind==3.8.0
 | 
			
		||||
djangorestframework==3.15.1
 | 
			
		||||
djlint==1.34.1
 | 
			
		||||
EditorConfig==0.12.4
 | 
			
		||||
gunicorn==21.2.0
 | 
			
		||||
html-tag-names==0.1.2
 | 
			
		||||
| 
						 | 
				
			
			@ -16,7 +20,10 @@ json5==0.9.22
 | 
			
		|||
numpy==1.26.4
 | 
			
		||||
packaging==23.2
 | 
			
		||||
pathspec==0.12.1
 | 
			
		||||
pillow==10.3.0
 | 
			
		||||
pyarrow==15.0.1
 | 
			
		||||
pycodestyle==2.11.1
 | 
			
		||||
pylance==0.10.2
 | 
			
		||||
PyYAML==6.0.1
 | 
			
		||||
regex==2023.12.25
 | 
			
		||||
requests==2.31.0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										23
									
								
								tunictracker/empty_doors.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
{
 | 
			
		||||
	"found": 0,
 | 
			
		||||
	"remaining": 0,
 | 
			
		||||
	"total": 1312,
 | 
			
		||||
	"scenes": {
 | 
			
		||||
		"mystery": {
 | 
			
		||||
			"found": 0,
 | 
			
		||||
			"remaining": 0,
 | 
			
		||||
			"total": 0,
 | 
			
		||||
			"doors": {
 | 
			
		||||
				"Door To Light": { "scene": "???", "door": "Door To Darkness" }
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		"Another One": {
 | 
			
		||||
			"found": 69,
 | 
			
		||||
			"remaining": 0,
 | 
			
		||||
			"total": 420,
 | 
			
		||||
			"doors": {
 | 
			
		||||
				"Door To Darkness": { "scene": "???", "door": "Door To Light" }
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								tunictracker/empty_hints.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
{
 | 
			
		||||
	"???": "There is no spoon (but in trunic)"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										26
									
								
								tunictracker/empty_items.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
{
 | 
			
		||||
	"collected": 0,
 | 
			
		||||
	"found": 0,
 | 
			
		||||
	"remaining": 0,
 | 
			
		||||
	"total": 1312,
 | 
			
		||||
	"scenes": {
 | 
			
		||||
		"mystery": {
 | 
			
		||||
			"collected": 0,
 | 
			
		||||
			"found": 0,
 | 
			
		||||
			"remaining": 0,
 | 
			
		||||
			"total": 0,
 | 
			
		||||
			"checks": {
 | 
			
		||||
				"It is a mystery": { "name": "", "owner": "" }
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		"Another One": {
 | 
			
		||||
			"collected": 69,
 | 
			
		||||
			"found": 0,
 | 
			
		||||
			"remaining": 0,
 | 
			
		||||
			"total": 420,
 | 
			
		||||
			"checks": {
 | 
			
		||||
				"nini time mister the missile": { "name": "", "owner": "" }
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								tunictracker/empty_overview.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
{
 | 
			
		||||
	"scene": "mystery",
 | 
			
		||||
	"seed": 0,
 | 
			
		||||
	"items": 1312,
 | 
			
		||||
	"entrances": 1312,
 | 
			
		||||
	"hints": 0,
 | 
			
		||||
	"codes": {
 | 
			
		||||
		"it is a mystery": {
 | 
			
		||||
			"Distance": 0,
 | 
			
		||||
			"Global": false,
 | 
			
		||||
			"InRange": false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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
									
								
							
							
						
						| 
						 | 
				
			
			@ -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
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
{}
 | 
			
		||||
							
								
								
									
										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
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
{
 | 
			
		||||
	"scene": "Overworld",
 | 
			
		||||
	"seed": 98135423,
 | 
			
		||||
	"items": 0,
 | 
			
		||||
	"entrances": 0,
 | 
			
		||||
	"hints": 0,
 | 
			
		||||
	"codes": {}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,31 +0,0 @@
 | 
			
		|||
asgiref==3.7.2
 | 
			
		||||
autopep8==2.0.4
 | 
			
		||||
certifi==2024.2.2
 | 
			
		||||
charset-normalizer==3.3.2
 | 
			
		||||
click==8.1.7
 | 
			
		||||
colorama==0.4.6
 | 
			
		||||
cssbeautifier==1.15.1
 | 
			
		||||
Django==5.0.3
 | 
			
		||||
django-browser-reload==1.12.1
 | 
			
		||||
django-tailwind==3.8.0
 | 
			
		||||
djlint==1.34.1
 | 
			
		||||
EditorConfig==0.12.4
 | 
			
		||||
gunicorn==21.2.0
 | 
			
		||||
html-tag-names==0.1.2
 | 
			
		||||
html-void-elements==0.1.0
 | 
			
		||||
idna==3.6
 | 
			
		||||
jsbeautifier==1.15.1
 | 
			
		||||
json5==0.9.22
 | 
			
		||||
numpy==1.26.4
 | 
			
		||||
packaging==23.2
 | 
			
		||||
pathspec==0.12.1
 | 
			
		||||
pyarrow==15.0.1
 | 
			
		||||
pycodestyle==2.11.1
 | 
			
		||||
pylance==0.10.2
 | 
			
		||||
PyYAML==6.0.1
 | 
			
		||||
regex==2023.12.25
 | 
			
		||||
requests==2.31.0
 | 
			
		||||
six==1.16.0
 | 
			
		||||
sqlparse==0.4.4
 | 
			
		||||
tqdm==4.66.2
 | 
			
		||||
urllib3==2.2.1
 | 
			
		||||
							
								
								
									
										14
									
								
								tunictracker/tracker/data/hints.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
{
 | 
			
		||||
	"Hint Ghost Overworld Before Garden": "bI #uh wA, I hurd #aht \"FOUR SKULLS\" R gRdi^  [archipelago]  \"FAXERYNTHIA'S OINTMENT.\" ",
 | 
			
		||||
	"Hint Ghost Windmill": "bI #uh wA, I hurd #aht \"EAST FOREST SLIME\" iz gRdi^  [icebomb]  \"TOASTERMANUAL'S ICE BOMB X3.\" ",
 | 
			
		||||
	"Hint Ghost Purgatory": "bI #uh wA, I hurd #aht \"CATHEDRAL GAUNTLET\" iz gRdi^  [archipelago]  \"PAPER LIME'S LYRICS.\" ",
 | 
			
		||||
	"Hint Ghost Sword Cave": "bI #uh wA, I saw A  [gun]  \"GUN\" #uh lahst tIm I wuhs aht #uh \"CATHEDRAL.\" ",
 | 
			
		||||
	"Hint Ghost Mountain": "bI #uh wA, I hurd #aht \"20 FAIRIES\" R gRdi^  [archipelago]  \"PAPER LIME'S DEEPFOCUS2.\" ",
 | 
			
		||||
	"Hint Ghost Changing Room 1": "bI #uh wA, I hurd #aht \"VAULT KEY PLINTH\" iz gRdi^  [archipelago]  \"CHAIAMON EMERALD'S NUGGET.\" ",
 | 
			
		||||
	"Hint Ghost Waterfall": "bI #uh wA, I saw A  [potionrelic]  \"HERO RELIC - POTION\" #uh lahst tIm I wuhs aht #uh \"STICK HOUSE.\" ",
 | 
			
		||||
	"Mailbox": "lehjehnd sehz #uh \"CATHEDRAL\" kuhntAnz wuhn uhv mehnE \"<#00FFFF>FIRST STEPS<#ffffff>\" ahn yor jurnE.",
 | 
			
		||||
	"West Garden Relic - Path": "lehjehnd sehz \"TOASTERMANUAL'S LIBRARY LAB\" iz lOkAtid awn #uh \"<#ffd700>PATH OF THE HERO<#ffffff>...\"",
 | 
			
		||||
	"Library Relic - Path": "#A sA #uh \"LIBRARIAN\" iz wAr #uh <#33FF33>kwehstuhgawn [hexagram]<#FFFFFF> iz fownd\"...\"",
 | 
			
		||||
	"Swamp Relic - Path": "#A sA #uh \"FORTRESS ARENA\" iz wAr #uh <#FF3333>kwehstuhgawn [hexagram]<#FFFFFF> iz fownd\"...\"",
 | 
			
		||||
	"Fortress Relic - Path": "lehjehnd sehz \"CHAIAMON EMERALD'S WORLD\" aht \"ROUTE 111 - ITEM DESERT SOUTH\"  iz lOkAtid awn #uh \"<#ffd700>PATH OF THE HERO<#ffffff>...\""
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -5,7 +5,7 @@ from json import loads
 | 
			
		|||
class ServerAddressForm(forms.Form):
 | 
			
		||||
    server_address_form = forms.URLField(
 | 
			
		||||
        max_length=1312, initial="http://localhost:8000/", empty_value="http://localhost:8000/", label="")
 | 
			
		||||
    server_address_form.widget.attrs["class"] = "w-full rounded-xl border-none shadow-inner shadow-[#242424] bg-white bg-opacity-10"
 | 
			
		||||
    server_address_form.widget.attrs["class"] = "w-full rounded-xl border-none shadow-inner shadow-[#242424] bg-charcoal-translucent-light"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BackendFilepathForm(forms.Form):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
function open_breakdown(event) {
 | 
			
		||||
	let scene = event.dataset.scene;
 | 
			
		||||
	Array.from(document.getElementById("breakdown-list").children).forEach(
 | 
			
		||||
		(breakdown) => {
 | 
			
		||||
			let breakdown_scene_title = breakdown.querySelector(
 | 
			
		||||
				".breakdown-block-title"
 | 
			
		||||
			).textContent;
 | 
			
		||||
			if (
 | 
			
		||||
				breakdown_scene_title == scene ||
 | 
			
		||||
				breakdown.dataset.current == "true"
 | 
			
		||||
			) {
 | 
			
		||||
				breakdown.classList.remove("hidden");
 | 
			
		||||
			} else {
 | 
			
		||||
				breakdown.classList.add("hidden");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function hide_empty_summaries() {
 | 
			
		||||
	let summary_divs =
 | 
			
		||||
		document.getElementById("summary-list").firstElementChild.children;
 | 
			
		||||
	Array.from(summary_divs).forEach((summary) => {
 | 
			
		||||
		let checks_remaining =
 | 
			
		||||
			summary.querySelector(".summary-checks").dataset.checksRemaining;
 | 
			
		||||
		let entrances_remaining =
 | 
			
		||||
			summary.querySelector(".summary-entrances").dataset.entrancesRemaining;
 | 
			
		||||
		if (
 | 
			
		||||
			summary.dataset.scene != "Posterity" &&
 | 
			
		||||
			summary.dataset.scene != "Resurrection" &&
 | 
			
		||||
			summary.dataset.scene != "Loading" &&
 | 
			
		||||
			checks_remaining <= 0 &&
 | 
			
		||||
			entrances_remaining <= 0 &&
 | 
			
		||||
			summary.dataset.current == "false"
 | 
			
		||||
		) {
 | 
			
		||||
			summary.classList.toggle("hidden");
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function notices_ur_debug() {
 | 
			
		||||
	document.getElementById("debug-block").classList.toggle("hidden");
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										73
									
								
								tunictracker/tracker/static/tracker/assets/fetch-updates.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,73 @@
 | 
			
		|||
async function refresh_overview(server_address) {
 | 
			
		||||
	const response = await fetch_api(server_address, "overview");
 | 
			
		||||
	if (response.data) {
 | 
			
		||||
		return response.data;
 | 
			
		||||
	} else {
 | 
			
		||||
		if (response.error) {
 | 
			
		||||
			return response.error;
 | 
			
		||||
		} else {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function refresh_hints(server_address) {
 | 
			
		||||
	const response = await fetch_api(server_address, "hints");
 | 
			
		||||
	if (response.data) {
 | 
			
		||||
		return response.data;
 | 
			
		||||
	} else {
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function refresh_checks(server_address) {
 | 
			
		||||
	const response = await fetch_api(server_address, "items");
 | 
			
		||||
	if (response.data) {
 | 
			
		||||
		return response.data;
 | 
			
		||||
	} else {
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function refresh_entrances(server_address) {
 | 
			
		||||
	const response = await fetch_api(server_address, "doors");
 | 
			
		||||
	if (response.data) {
 | 
			
		||||
		return response.data;
 | 
			
		||||
	} else {
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function fetch_api(server_address, uri) {
 | 
			
		||||
	try {
 | 
			
		||||
		const response = await fetch(`${server_address}${uri}`, {
 | 
			
		||||
			signal: AbortSignal.timeout(1100),
 | 
			
		||||
		});
 | 
			
		||||
		if (response.ok) {
 | 
			
		||||
			const data = await response.json();
 | 
			
		||||
			if (!("error" in data)) {
 | 
			
		||||
				return { data: data, error: null };
 | 
			
		||||
			} else {
 | 
			
		||||
				return { data: null, error: data };
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			return { data: null, error: null };
 | 
			
		||||
		}
 | 
			
		||||
	} catch (e) {
 | 
			
		||||
		return { data: null, error: e };
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AbortSignal.timeout ??= function timeout(ms) {
 | 
			
		||||
	const ctrl = new AbortController();
 | 
			
		||||
	setTimeout(() => ctrl.abort(), ms);
 | 
			
		||||
	return ctrl.signal;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
	refresh_overview,
 | 
			
		||||
	refresh_checks,
 | 
			
		||||
	refresh_entrances,
 | 
			
		||||
	refresh_hints,
 | 
			
		||||
	fetch_api,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										0
									
								
								tunictracker/tracker/static/tracker/assets/initialize.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1061
									
								
								tunictracker/tracker/static/tracker/assets/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -1,521 +0,0 @@
 | 
			
		|||
var current_hash = "";
 | 
			
		||||
var server_address = "";
 | 
			
		||||
 | 
			
		||||
window.onload = () => {
 | 
			
		||||
	get_updated_server_address();
 | 
			
		||||
	fetch(`${document.URL}static/tracker/data/holy_cross_codes.json`)
 | 
			
		||||
		.then((response) => response.json())
 | 
			
		||||
		.then(
 | 
			
		||||
			(data) => {
 | 
			
		||||
				const cross_codes = JSON.parse(JSON.stringify(data));
 | 
			
		||||
				const refresh_interval = setInterval(
 | 
			
		||||
					refresh_elements,
 | 
			
		||||
					500,
 | 
			
		||||
					cross_codes
 | 
			
		||||
				);
 | 
			
		||||
			},
 | 
			
		||||
			(error) => {
 | 
			
		||||
				console.log(error);
 | 
			
		||||
			}
 | 
			
		||||
		);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function open_breakdown(event) {
 | 
			
		||||
	let scene = event.dataset.scene;
 | 
			
		||||
	Array.from(document.getElementById("breakdown-list").children).forEach(
 | 
			
		||||
		(breakdown) => {
 | 
			
		||||
			if (breakdown.id == `${scene}-breakdown`) {
 | 
			
		||||
				if (
 | 
			
		||||
					!(
 | 
			
		||||
						document
 | 
			
		||||
							.getElementById("breakdown-current")
 | 
			
		||||
							.querySelector(".breakdown-block-title").textContent == scene
 | 
			
		||||
					)
 | 
			
		||||
				) {
 | 
			
		||||
					breakdown.classList.remove("hidden");
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				breakdown.classList.add("hidden");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function hide_empty_summaries() {
 | 
			
		||||
	let summary_divs =
 | 
			
		||||
		document.getElementById("summary-list").firstElementChild.children;
 | 
			
		||||
	Array.from(summary_divs).forEach((summary) => {
 | 
			
		||||
		let checks_undiscovered =
 | 
			
		||||
			summary.querySelector(".summary-checks").dataset.checksUndiscovered;
 | 
			
		||||
		let entrances_undiscovered =
 | 
			
		||||
			summary.querySelector(".summary-entrances").dataset.entrancesUndiscovered;
 | 
			
		||||
		if (
 | 
			
		||||
			!(
 | 
			
		||||
				summary.querySelector(".summary-title").textContent == "Posterity" ||
 | 
			
		||||
				summary.querySelector(".summary-title").textContent == "Resurrection"
 | 
			
		||||
			) &&
 | 
			
		||||
			(checks_undiscovered <= 0 &&
 | 
			
		||||
			entrances_undiscovered <= 0)
 | 
			
		||||
		) {
 | 
			
		||||
			console.log(`${checks_undiscovered} and ${entrances_undiscovered}`)
 | 
			
		||||
			summary.classList.toggle("hidden");
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function notices_ur_debug() {
 | 
			
		||||
	document.getElementById("debug-block").classList.toggle("hidden");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function get_updated_filepath() {
 | 
			
		||||
	fetch(`${document.URL}get/settings`)
 | 
			
		||||
		.then((response) => response.json())
 | 
			
		||||
		.then(
 | 
			
		||||
			(data) => {
 | 
			
		||||
				backend_filepath = JSON.parse(JSON.stringify(data));
 | 
			
		||||
				fetch(`${server_address}settings`, {
 | 
			
		||||
					method: "post",
 | 
			
		||||
					headers: { "Content-type": "application/json" },
 | 
			
		||||
					body: JSON.stringify({
 | 
			
		||||
						secretLegend: backend_filepath,
 | 
			
		||||
						address: ":8000",
 | 
			
		||||
					}),
 | 
			
		||||
				});
 | 
			
		||||
			},
 | 
			
		||||
			(error) => {
 | 
			
		||||
				console.log(error);
 | 
			
		||||
			}
 | 
			
		||||
		);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function get_updated_server_address() {
 | 
			
		||||
	fetch(`${document.URL}get/address`)
 | 
			
		||||
		.then(
 | 
			
		||||
			(response) => response.json(),
 | 
			
		||||
			(error) => {
 | 
			
		||||
				console.log("Are you sure the front end is up?");
 | 
			
		||||
			}
 | 
			
		||||
		)
 | 
			
		||||
		.then(
 | 
			
		||||
			(data) => {
 | 
			
		||||
				parsed_data = JSON.parse(JSON.stringify(data));
 | 
			
		||||
				server_address = parsed_data["listen_address"];
 | 
			
		||||
				if (parsed_data["backend_filepath_updated"]) {
 | 
			
		||||
					get_updated_filepath();
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
			(error) => {
 | 
			
		||||
				console.log(error);
 | 
			
		||||
			}
 | 
			
		||||
		);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function refresh_elements(cross_codes) {
 | 
			
		||||
	fetch(`${server_address}spoiler`)
 | 
			
		||||
		.then((response) => response.json())
 | 
			
		||||
		.then(
 | 
			
		||||
			(data) => {
 | 
			
		||||
				// Attempt to receive response JSON.
 | 
			
		||||
				const response_object = JSON.parse(JSON.stringify(data));
 | 
			
		||||
				document.getElementById("status-block").classList.add("hidden");
 | 
			
		||||
				if (response_object.Debug.Hash == current_hash) {
 | 
			
		||||
					return;
 | 
			
		||||
				} else {
 | 
			
		||||
					current_hash = response_object.Debug.Hash;
 | 
			
		||||
					get_updated_server_address();
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// Parse out data from the back-end into variables.
 | 
			
		||||
				const overview_checks_undiscovered =
 | 
			
		||||
					response_object.Totals.Checks.Undiscovered;
 | 
			
		||||
				const overview_checks_total = response_object.Totals.Checks.Total;
 | 
			
		||||
				const overview_entrances_undiscovered =
 | 
			
		||||
					response_object.Totals.Entrances.Undiscovered;
 | 
			
		||||
				const overview_entrances_total = response_object.Totals.Entrances.Total;
 | 
			
		||||
				const current_scene_name = response_object.Current.Scene;
 | 
			
		||||
				const all_scenes = response_object.Scenes;
 | 
			
		||||
				const debug_info = response_object.Debug;
 | 
			
		||||
				const cross_codes_entered = response_object.Codes;
 | 
			
		||||
				const default_cross_codes = cross_codes.Default;
 | 
			
		||||
				const global_cross_codes = cross_codes.Global;
 | 
			
		||||
 | 
			
		||||
				// Refresh elements with new data from the back end.
 | 
			
		||||
 | 
			
		||||
				//  Clone all the needed elements for updating.
 | 
			
		||||
				let overview_checks_title = document
 | 
			
		||||
					.getElementById("overview-totals")
 | 
			
		||||
					.querySelector(".overview-checks");
 | 
			
		||||
				let overview_entrances_title = document
 | 
			
		||||
					.getElementById("overview-totals")
 | 
			
		||||
					.querySelector(".overview-entrances");
 | 
			
		||||
				let summary_block = document
 | 
			
		||||
					.getElementById("summary-list")
 | 
			
		||||
					.firstElementChild.firstElementChild.cloneNode(true);
 | 
			
		||||
				let breakdown_block = document
 | 
			
		||||
					.getElementById("breakdown-list")
 | 
			
		||||
					.firstElementChild.cloneNode(true);
 | 
			
		||||
				breakdown_block.id = "";
 | 
			
		||||
				breakdown_block.classList.remove("hidden");
 | 
			
		||||
				let debug_item = document
 | 
			
		||||
					.getElementById("debug-block")
 | 
			
		||||
					.querySelector(".debug-list")
 | 
			
		||||
					.firstElementChild.cloneNode(true);
 | 
			
		||||
				debug_item.classList.remove("hidden");
 | 
			
		||||
				let new_breakdown_list = document
 | 
			
		||||
					.getElementById("breakdown-list")
 | 
			
		||||
					.cloneNode(true);
 | 
			
		||||
				let new_summary_list = document
 | 
			
		||||
					.getElementById("summary-list")
 | 
			
		||||
					.cloneNode(true);
 | 
			
		||||
				let new_debug_block = document
 | 
			
		||||
					.getElementById("debug-block")
 | 
			
		||||
					.querySelector(".debug-list")
 | 
			
		||||
					.cloneNode(true);
 | 
			
		||||
				let current_open_breakdown = "";
 | 
			
		||||
				Array.from(new_breakdown_list.children).forEach((scene) => {
 | 
			
		||||
					if (!Array.from(scene.classList).includes("hidden")) {
 | 
			
		||||
						current_open_breakdown = scene.id;
 | 
			
		||||
					}
 | 
			
		||||
				});
 | 
			
		||||
 | 
			
		||||
				// Clear out the current lists.
 | 
			
		||||
				new_breakdown_list.innerHTML = "";
 | 
			
		||||
				new_summary_list.firstElementChild.innerHTML = "";
 | 
			
		||||
				new_debug_block.innerHTML = "";
 | 
			
		||||
 | 
			
		||||
				// Set content to updated data.
 | 
			
		||||
				overview_checks_title.textContent = `Checks: ${overview_checks_undiscovered}/${overview_checks_total}`;
 | 
			
		||||
				overview_entrances_title.textContent = `Entrances: ${overview_entrances_undiscovered}/${overview_entrances_total}`;
 | 
			
		||||
 | 
			
		||||
				// Create new lists with updated data.
 | 
			
		||||
				Object.keys(all_scenes).forEach((scene) => {
 | 
			
		||||
					// Create variables for element pointers.
 | 
			
		||||
					summary_block = document
 | 
			
		||||
						.getElementById("summary-list")
 | 
			
		||||
						.firstElementChild.firstElementChild.cloneNode(true);
 | 
			
		||||
					summary_block.classList.remove("hidden");
 | 
			
		||||
					let summary_title = summary_block.querySelector(".summary-title");
 | 
			
		||||
					let summary_checks = summary_block.querySelector(".summary-checks");
 | 
			
		||||
					let summary_entrances =
 | 
			
		||||
						summary_block.querySelector(".summary-entrances");
 | 
			
		||||
 | 
			
		||||
					breakdown_block = document
 | 
			
		||||
						.getElementById("breakdown-list")
 | 
			
		||||
						.firstElementChild.cloneNode(true);
 | 
			
		||||
					let breakdown_block_title = breakdown_block.querySelector(
 | 
			
		||||
						".breakdown-block-title"
 | 
			
		||||
					);
 | 
			
		||||
					let breakdown_block_checks_title = breakdown_block.querySelector(
 | 
			
		||||
						".breakdown-block-checks-title"
 | 
			
		||||
					);
 | 
			
		||||
					let new_breakdown_block_checks_list = breakdown_block
 | 
			
		||||
						.querySelector(".breakdown-block-checks-list")
 | 
			
		||||
						.cloneNode(true);
 | 
			
		||||
					let breakdown_block_checks_list_item = breakdown_block
 | 
			
		||||
						.querySelector(".breakdown-block-checks-list")
 | 
			
		||||
						.firstElementChild.cloneNode(true);
 | 
			
		||||
					let breakdown_block_entrances_title = breakdown_block.querySelector(
 | 
			
		||||
						".breakdown-block-entrances-title"
 | 
			
		||||
					);
 | 
			
		||||
					let new_breakdown_block_entrances_list = breakdown_block
 | 
			
		||||
						.querySelector(".breakdown-block-entrances-list")
 | 
			
		||||
						.cloneNode(true);
 | 
			
		||||
					let breakdown_block_entrances_list_item = breakdown_block
 | 
			
		||||
						.querySelector(".breakdown-block-entrances-list")
 | 
			
		||||
						.firstElementChild.cloneNode(true);
 | 
			
		||||
					let new_breakdown_block_mapped_list = breakdown_block
 | 
			
		||||
						.querySelector(".breakdown-block-mapped-list")
 | 
			
		||||
						.cloneNode(true);
 | 
			
		||||
					let breakdown_block_mapped_list_item = breakdown_block
 | 
			
		||||
						.querySelector(".breakdown-block-mapped-list")
 | 
			
		||||
						.firstElementChild.cloneNode(true);
 | 
			
		||||
 | 
			
		||||
					// Clear out current list content.
 | 
			
		||||
					new_breakdown_block_checks_list.innerHTML = "";
 | 
			
		||||
					new_breakdown_block_entrances_list.innerHTML = "";
 | 
			
		||||
					new_breakdown_block_mapped_list.innerHTML = "";
 | 
			
		||||
					new_breakdown_block_checks_list.appendChild(
 | 
			
		||||
						breakdown_block_checks_list_item.cloneNode(true)
 | 
			
		||||
					);
 | 
			
		||||
					breakdown_block_checks_list_item.classList.remove("hidden");
 | 
			
		||||
					new_breakdown_block_entrances_list.appendChild(
 | 
			
		||||
						breakdown_block_entrances_list_item.cloneNode(true)
 | 
			
		||||
					);
 | 
			
		||||
					breakdown_block_entrances_list_item.classList.remove("hidden");
 | 
			
		||||
					new_breakdown_block_mapped_list.appendChild(
 | 
			
		||||
						breakdown_block_mapped_list_item.cloneNode(true)
 | 
			
		||||
					);
 | 
			
		||||
					breakdown_block_mapped_list_item.classList.remove("hidden");
 | 
			
		||||
 | 
			
		||||
					// Create variables for commonly used values.
 | 
			
		||||
					let scene_checks_undiscovered =
 | 
			
		||||
						all_scenes[scene].Totals.Checks.Undiscovered;
 | 
			
		||||
					let scene_checks_total = all_scenes[scene].Totals.Checks.Total;
 | 
			
		||||
					let scene_entrances_undiscovered =
 | 
			
		||||
						all_scenes[scene].Totals.Entrances.Undiscovered;
 | 
			
		||||
					let scene_entrances_total = all_scenes[scene].Totals.Entrances.Total;
 | 
			
		||||
					let scene_has_codes = Object.keys(cross_codes).includes(scene);
 | 
			
		||||
 | 
			
		||||
					// Set textContent.
 | 
			
		||||
					summary_title.textContent = scene;
 | 
			
		||||
					summary_checks.textContent = `Checks: ${scene_checks_undiscovered}/${scene_checks_total}`;
 | 
			
		||||
					summary_checks.dataset.checksUndiscovered = scene_checks_undiscovered;
 | 
			
		||||
					summary_checks.dataset.checksTotal = scene_checks_undiscovered;
 | 
			
		||||
					summary_entrances.textContent = `Entrances: ${scene_entrances_undiscovered}/${scene_entrances_total}`;
 | 
			
		||||
					summary_entrances.dataset.entrancesUndiscovered =
 | 
			
		||||
						scene_entrances_undiscovered;
 | 
			
		||||
					summary_entrances.dataset.entrancesTotal = scene_entrances_total;
 | 
			
		||||
					breakdown_block_title.textContent = scene;
 | 
			
		||||
					breakdown_block_checks_title.textContent = `Checks: ${all_scenes[scene].Totals.Checks.Undiscovered}/${all_scenes[scene].Totals.Checks.Total}`;
 | 
			
		||||
					breakdown_block_entrances_title.textContent = `Entrances: ${all_scenes[scene].Totals.Entrances.Undiscovered}/${all_scenes[scene].Totals.Entrances.Total}`;
 | 
			
		||||
 | 
			
		||||
					// Create checks, entrances, mapped entrances, and cross code lists.
 | 
			
		||||
					Object.keys(all_scenes[scene].Checks).forEach((check) => {
 | 
			
		||||
						if (!all_scenes[scene].Checks[check]) {
 | 
			
		||||
							breakdown_block_checks_list_item.textContent = `❌ ${check}`;
 | 
			
		||||
							new_breakdown_block_checks_list.appendChild(
 | 
			
		||||
								breakdown_block_checks_list_item.cloneNode(true)
 | 
			
		||||
							);
 | 
			
		||||
						}
 | 
			
		||||
					});
 | 
			
		||||
					Object.keys(all_scenes[scene].Entrances).forEach((entrances) => {
 | 
			
		||||
						if (all_scenes[scene].Entrances[entrances].Door == "") {
 | 
			
		||||
							breakdown_block_entrances_list_item.textContent = `❌ ${entrances}`;
 | 
			
		||||
							new_breakdown_block_entrances_list.appendChild(
 | 
			
		||||
								breakdown_block_entrances_list_item.cloneNode(true)
 | 
			
		||||
							);
 | 
			
		||||
						} else {
 | 
			
		||||
							breakdown_block_mapped_list_item.textContent = `✔️ ${entrances} -> ${all_scenes[scene].Entrances[entrances].Door}`;
 | 
			
		||||
							breakdown_block_mapped_list_item.id = `${entrances}-mapped`;
 | 
			
		||||
							breakdown_block_mapped_list_item.dataset.scene =
 | 
			
		||||
								all_scenes[scene].Entrances[entrances].Scene;
 | 
			
		||||
							new_breakdown_block_mapped_list.appendChild(
 | 
			
		||||
								breakdown_block_mapped_list_item.cloneNode(true)
 | 
			
		||||
							);
 | 
			
		||||
						}
 | 
			
		||||
					});
 | 
			
		||||
 | 
			
		||||
					// Apply color coding to summary block
 | 
			
		||||
					summary_block.firstElementChild.classList.remove(
 | 
			
		||||
						"from-highlight-both-light",
 | 
			
		||||
						"from-highlight-checks-light",
 | 
			
		||||
						"from-highlight-entrances-light",
 | 
			
		||||
						"from-highlight-empty-light",
 | 
			
		||||
						"from-highlight-undiscovered-light",
 | 
			
		||||
						"to-highlight-both-dark",
 | 
			
		||||
						"to-highlight-checks-dark",
 | 
			
		||||
						"to-highlight-entrances-dark",
 | 
			
		||||
						"to-highlight-empty-dark",
 | 
			
		||||
						"to-highlight-undiscovered-dark",
 | 
			
		||||
						"text-highlight-both-text",
 | 
			
		||||
						"text-highlight-checks-text",
 | 
			
		||||
						"text-highlight-entrances-text",
 | 
			
		||||
						"text-highlight-empty-text",
 | 
			
		||||
						"text-highlight-undiscovered-text"
 | 
			
		||||
					);
 | 
			
		||||
					if (
 | 
			
		||||
						scene_checks_undiscovered > 0 &&
 | 
			
		||||
						scene_entrances_undiscovered > 0
 | 
			
		||||
					) {
 | 
			
		||||
						if (
 | 
			
		||||
							scene_checks_total == scene_checks_undiscovered &&
 | 
			
		||||
							scene_entrances_total == scene_entrances_undiscovered
 | 
			
		||||
						) {
 | 
			
		||||
							summary_block.firstElementChild.classList.add(
 | 
			
		||||
								"from-highlight-undiscovered-light",
 | 
			
		||||
								"to-highlight-undiscovered-dark",
 | 
			
		||||
								"text-highlight-undiscovered-text"
 | 
			
		||||
							);
 | 
			
		||||
						} else {
 | 
			
		||||
							summary_block.firstElementChild.classList.add(
 | 
			
		||||
								"from-highlight-both-light",
 | 
			
		||||
								"to-highlight-both-dark",
 | 
			
		||||
								"text-highlight-both-text"
 | 
			
		||||
							);
 | 
			
		||||
						}
 | 
			
		||||
					} else if (scene_checks_undiscovered > 0) {
 | 
			
		||||
						summary_block.firstElementChild.classList.add(
 | 
			
		||||
							"from-highlight-checks-light",
 | 
			
		||||
							"to-highlight-checks-dark",
 | 
			
		||||
							"text-highlight-checks-text"
 | 
			
		||||
						);
 | 
			
		||||
					} else if (scene_entrances_undiscovered > 0) {
 | 
			
		||||
						summary_block.firstElementChild.classList.add(
 | 
			
		||||
							"from-highlight-entrances-light",
 | 
			
		||||
							"to-highlight-entrances-dark",
 | 
			
		||||
							"text-highlight-entrances-text"
 | 
			
		||||
						);
 | 
			
		||||
					} else {
 | 
			
		||||
						summary_block.firstElementChild.classList.add(
 | 
			
		||||
							"from-highlight-empty-light",
 | 
			
		||||
							"to-highlight-empty-dark",
 | 
			
		||||
							"text-highlight-empty-text"
 | 
			
		||||
						);
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					// Replace lists
 | 
			
		||||
					breakdown_block
 | 
			
		||||
						.querySelector(".breakdown-block-checks-list")
 | 
			
		||||
						.replaceWith(new_breakdown_block_checks_list);
 | 
			
		||||
					breakdown_block
 | 
			
		||||
						.querySelector(".breakdown-block-entrances-list")
 | 
			
		||||
						.replaceWith(new_breakdown_block_entrances_list);
 | 
			
		||||
					breakdown_block
 | 
			
		||||
						.querySelector(".breakdown-block-mapped-list")
 | 
			
		||||
						.replaceWith(new_breakdown_block_mapped_list);
 | 
			
		||||
 | 
			
		||||
					breakdown_block.id = `${
 | 
			
		||||
						breakdown_block.querySelector(".breakdown-block-title").textContent
 | 
			
		||||
					}-breakdown`;
 | 
			
		||||
					breakdown_block.classList.add("hidden");
 | 
			
		||||
 | 
			
		||||
					// Append relevant elements to lists.
 | 
			
		||||
					if (current_open_breakdown == breakdown_block.id) {
 | 
			
		||||
						breakdown_block.classList.remove("hidden");
 | 
			
		||||
					}
 | 
			
		||||
					if (scene == current_scene_name) {
 | 
			
		||||
						summary_block.classList.add("hidden");
 | 
			
		||||
						breakdown_block.classList.remove("hidden");
 | 
			
		||||
						document
 | 
			
		||||
							.getElementById("breakdown-current")
 | 
			
		||||
							.firstElementChild.replaceWith(breakdown_block.cloneNode(true));
 | 
			
		||||
						breakdown_block.classList.add("hidden");
 | 
			
		||||
					} else if (
 | 
			
		||||
						scene_checks_undiscovered <= 0 &&
 | 
			
		||||
						scene_entrances_total <= 0
 | 
			
		||||
					) {
 | 
			
		||||
						summary_block.classList.add("hidden");
 | 
			
		||||
					}
 | 
			
		||||
					if (document.getElementById("hideDone").checked) {
 | 
			
		||||
						if (
 | 
			
		||||
							scene_checks_undiscovered <= 0 &&
 | 
			
		||||
							scene_entrances_undiscovered <= 0
 | 
			
		||||
						) {
 | 
			
		||||
							summary_block.classList.add("hidden");
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					summary_block.dataset.scene = scene;
 | 
			
		||||
					new_summary_list.firstElementChild.appendChild(
 | 
			
		||||
						summary_block.cloneNode(true)
 | 
			
		||||
					);
 | 
			
		||||
					new_breakdown_list.appendChild(breakdown_block.cloneNode(true));
 | 
			
		||||
				});
 | 
			
		||||
				let new_cross_codes_block_list = document
 | 
			
		||||
					.getElementById("codes-list")
 | 
			
		||||
					.cloneNode(true);
 | 
			
		||||
				let cross_codes_block_list_item = document
 | 
			
		||||
					.getElementById("codes-list")
 | 
			
		||||
					.firstElementChild.cloneNode(true);
 | 
			
		||||
				new_cross_codes_block_list.innerHTML = "";
 | 
			
		||||
 | 
			
		||||
				Object.keys(default_cross_codes).forEach((code) => {
 | 
			
		||||
					cross_codes_block_list_item.querySelector(
 | 
			
		||||
						".codes-list-item-title"
 | 
			
		||||
					).textContent = code;
 | 
			
		||||
					cross_codes_block_list_item.querySelector(
 | 
			
		||||
						".codes-list-item-code"
 | 
			
		||||
					).textContent = default_cross_codes[code]
 | 
			
		||||
						.replace(/U/g, "⬆️")
 | 
			
		||||
						.replace(/R/g, "➡️")
 | 
			
		||||
						.replace(/D/g, "⬇️")
 | 
			
		||||
						.replace(/L/g, "⬅️");
 | 
			
		||||
					new_cross_codes_block_list.appendChild(
 | 
			
		||||
						cross_codes_block_list_item.cloneNode(true)
 | 
			
		||||
					);
 | 
			
		||||
				});
 | 
			
		||||
				Object.keys(global_cross_codes).forEach((code) => {
 | 
			
		||||
					cross_codes_block_list_item.querySelector(
 | 
			
		||||
						".codes-list-item-title"
 | 
			
		||||
					).textContent = code;
 | 
			
		||||
					cross_codes_block_list_item.querySelector(
 | 
			
		||||
						".codes-list-item-code"
 | 
			
		||||
					).textContent = global_cross_codes[code]
 | 
			
		||||
						.replace(/U/g, "⬆️")
 | 
			
		||||
						.replace(/R/g, "➡️")
 | 
			
		||||
						.replace(/D/g, "⬇️")
 | 
			
		||||
						.replace(/L/g, "⬅️");
 | 
			
		||||
					if (cross_codes_entered.Global[code]) {
 | 
			
		||||
						cross_codes_block_list_item.classList.add("hidden");
 | 
			
		||||
					} else {
 | 
			
		||||
						cross_codes_block_list_item.classList.remove("hidden");
 | 
			
		||||
					}
 | 
			
		||||
					new_cross_codes_block_list.appendChild(
 | 
			
		||||
						cross_codes_block_list_item.cloneNode(true)
 | 
			
		||||
					);
 | 
			
		||||
				});
 | 
			
		||||
				if (!(typeof cross_codes[current_scene_name] === "undefined")) {
 | 
			
		||||
					Object.keys(cross_codes[current_scene_name]).forEach((code) => {
 | 
			
		||||
						cross_codes_block_list_item.querySelector(
 | 
			
		||||
							".codes-list-item-title"
 | 
			
		||||
						).textContent = code;
 | 
			
		||||
						cross_codes_block_list_item.querySelector(
 | 
			
		||||
							".codes-list-item-code"
 | 
			
		||||
						).textContent = cross_codes[current_scene_name][code]
 | 
			
		||||
							.replace(/U/g, "⬆️")
 | 
			
		||||
							.replace(/R/g, "➡️")
 | 
			
		||||
							.replace(/D/g, "⬇️")
 | 
			
		||||
							.replace(/L/g, "⬅️");
 | 
			
		||||
						if (cross_codes_entered[current_scene_name][code]) {
 | 
			
		||||
							cross_codes_block_list_item.classList.add("hidden");
 | 
			
		||||
						} else {
 | 
			
		||||
							cross_codes_block_list_item.classList.remove("hidden");
 | 
			
		||||
						}
 | 
			
		||||
						new_cross_codes_block_list.appendChild(
 | 
			
		||||
							cross_codes_block_list_item.cloneNode(true)
 | 
			
		||||
						);
 | 
			
		||||
					});
 | 
			
		||||
				}
 | 
			
		||||
				document
 | 
			
		||||
					.getElementById("codes-list")
 | 
			
		||||
					.replaceWith(new_cross_codes_block_list);
 | 
			
		||||
 | 
			
		||||
				Object.keys(debug_info).forEach((item) => {
 | 
			
		||||
					debug_item.querySelector(
 | 
			
		||||
						".debug-item"
 | 
			
		||||
					).textContent = `${item}: ${debug_info[item]}`;
 | 
			
		||||
					new_debug_block.appendChild(debug_item.cloneNode(true));
 | 
			
		||||
				});
 | 
			
		||||
 | 
			
		||||
				// Replace with new data.
 | 
			
		||||
				document
 | 
			
		||||
					.getElementById("summary-list")
 | 
			
		||||
					.replaceWith(new_summary_list.cloneNode(true));
 | 
			
		||||
				document
 | 
			
		||||
					.getElementById("breakdown-list")
 | 
			
		||||
					.replaceWith(new_breakdown_list.cloneNode(true));
 | 
			
		||||
				document
 | 
			
		||||
					.getElementById("debug-block")
 | 
			
		||||
					.querySelector(".debug-list")
 | 
			
		||||
					.replaceWith(new_debug_block.cloneNode(true));
 | 
			
		||||
			},
 | 
			
		||||
			(error) => {
 | 
			
		||||
				document.getElementById("status-block").classList.remove("hidden");
 | 
			
		||||
				get_updated_server_address();
 | 
			
		||||
				return error;
 | 
			
		||||
			}
 | 
			
		||||
		);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Outdated funcion to log the data gathered from the backend.
 | 
			
		||||
function log_elements() {
 | 
			
		||||
	console.log(overview.checks.textContent);
 | 
			
		||||
	console.log(overview.entrances.textContent);
 | 
			
		||||
	console.log(current_scene.name.textContent);
 | 
			
		||||
	console.log(current_scene.checks.title.textContent);
 | 
			
		||||
	for (i in current_scene.checks.list.children) {
 | 
			
		||||
		if (current_scene.checks.list.children[i].textContent) {
 | 
			
		||||
			console.log(current_scene.checks.list.children[i].textContent);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	console.log(current_scene.entrances.title.textContent);
 | 
			
		||||
	for (i in current_scene.entrances.list.children) {
 | 
			
		||||
		if (current_scene.entrances.list.children[i].textContent) {
 | 
			
		||||
			console.log(current_scene.entrances.list.children[i].textContent);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	for (i in current_scene.entrances.mapped.children) {
 | 
			
		||||
		if (current_scene.entrances.mapped.children[i].textContent) {
 | 
			
		||||
			console.log(current_scene.entrances.mapped.children[i].textContent);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										0
									
								
								tunictracker/tracker/static/tracker/assets/test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										178
									
								
								tunictracker/tracker/static/tracker/assets/translate-hints.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
				
			
			@ -0,0 +1,178 @@
 | 
			
		|||
const lookup = {
 | 
			
		||||
	ah: "aa",
 | 
			
		||||
	R: "ax",
 | 
			
		||||
	aw: "a",
 | 
			
		||||
	A: "ei",
 | 
			
		||||
	eh: "e",
 | 
			
		||||
	E: "i",
 | 
			
		||||
	Er: "ix",
 | 
			
		||||
	uh: "uu",
 | 
			
		||||
	Ar: "ex",
 | 
			
		||||
	i: "ii",
 | 
			
		||||
	I: "ai",
 | 
			
		||||
	ur: "x",
 | 
			
		||||
	O: "o",
 | 
			
		||||
	oi: "oi",
 | 
			
		||||
	oo: "u",
 | 
			
		||||
	ou: "oo",
 | 
			
		||||
	ow: "au",
 | 
			
		||||
	or: "ox",
 | 
			
		||||
	b: "b",
 | 
			
		||||
	J: "ch",
 | 
			
		||||
	d: "d",
 | 
			
		||||
	f: "f",
 | 
			
		||||
	g: "g",
 | 
			
		||||
	h: "h",
 | 
			
		||||
	j: "j",
 | 
			
		||||
	k: "k",
 | 
			
		||||
	l: "l",
 | 
			
		||||
	m: "m",
 | 
			
		||||
	n: "n",
 | 
			
		||||
	"^": "ng",
 | 
			
		||||
	p: "p",
 | 
			
		||||
	r: "r",
 | 
			
		||||
	s: "s",
 | 
			
		||||
	$: "sh",
 | 
			
		||||
	t: "t",
 | 
			
		||||
	"%": "th",
 | 
			
		||||
	"#": "tz",
 | 
			
		||||
	v: "v",
 | 
			
		||||
	w: "w",
 | 
			
		||||
	y: "y",
 | 
			
		||||
	z: "z",
 | 
			
		||||
	"&": "zh",
 | 
			
		||||
};
 | 
			
		||||
const skip = [" ", ",", "."];
 | 
			
		||||
const re =
 | 
			
		||||
	/(\\"[\w\s\.\-']*\\")|\<(#[a-fA-F0-9]*)\>(.*)\<#[a-fA-F0-9]*\>|(\[[\w]*\])/gm;
 | 
			
		||||
 | 
			
		||||
async function parse_hints(hint) {
 | 
			
		||||
	let new_hint = hint;
 | 
			
		||||
	const color_tags = [
 | 
			
		||||
		...hint.matchAll(/\<[^\>]+\>(.*)\<[^\>]+\>/gm),
 | 
			
		||||
		...hint.matchAll(/\<([^\>]+)\>/gm),
 | 
			
		||||
	];
 | 
			
		||||
	let color_tag_value = "";
 | 
			
		||||
	if (color_tags) {
 | 
			
		||||
		if (color_tags[1]) {
 | 
			
		||||
			if (color_tag_value == "") {
 | 
			
		||||
				color_tag_value = color_tags[1][1];
 | 
			
		||||
			}
 | 
			
		||||
			const color_tags_text = `<span style="color: ${color_tags[1][1]}">${color_tags[0][1]}</span>`;
 | 
			
		||||
			new_hint = new_hint.replace(
 | 
			
		||||
				/\<[^\>]+\>[^\<]+\<[^\>]+\>/gm,
 | 
			
		||||
				color_tags_text
 | 
			
		||||
			);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const image_text = [...new_hint.matchAll(/\[[^\]]+\]/gm)];
 | 
			
		||||
	if (image_text && image_text[0]) {
 | 
			
		||||
		let translated_image = image_text[0][0].replace(/\[|\]/g, "");
 | 
			
		||||
		if (translated_image == "hexagram") {
 | 
			
		||||
			translated_image = `${color_tag_value
 | 
			
		||||
				.substring(1)
 | 
			
		||||
				.toUpperCase()}_${translated_image}`;
 | 
			
		||||
		}
 | 
			
		||||
		new_hint = new_hint.replace(
 | 
			
		||||
			/\[[^\]]+\]/gm,
 | 
			
		||||
			`<img class="inline-block w-8 h-8 my-auto align-middle drop-shadow-[2px_2px_0px_rgba(36,36,36,0.8)]" src="/static/tracker/images/sprites/${translated_image}.png">`
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let trunic_hint = new_hint;
 | 
			
		||||
	const tag_matches = [...new_hint.matchAll(/\<[^\>]*\>/gm)].map((x) => x[0]);
 | 
			
		||||
	for (const matched in tag_matches) {
 | 
			
		||||
		trunic_hint = trunic_hint.replace(
 | 
			
		||||
			tag_matches[matched],
 | 
			
		||||
			"*".repeat(tag_matches[matched].length)
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
	const quote_matches = [...trunic_hint.matchAll(/\"[^\"]*\"/gm)].map(
 | 
			
		||||
		(x) => x[0]
 | 
			
		||||
	);
 | 
			
		||||
	for (const matched in quote_matches) {
 | 
			
		||||
		trunic_hint = trunic_hint.replace(
 | 
			
		||||
			quote_matches[matched],
 | 
			
		||||
			"*".repeat(quote_matches[matched].length)
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let current_index = 0;
 | 
			
		||||
	new_hint = [...trunic_hint.matchAll(/\*+/gm)]
 | 
			
		||||
		.map((x, index) => {
 | 
			
		||||
			let points = [];
 | 
			
		||||
			if (index != 0) {
 | 
			
		||||
				points = [current_index, x.index];
 | 
			
		||||
			} else {
 | 
			
		||||
				points = [0, x.index];
 | 
			
		||||
			}
 | 
			
		||||
			current_index = x.index + x[0].length;
 | 
			
		||||
			const to_translate = trunic_hint.substring(points[0], points[1]).trim();
 | 
			
		||||
			if (to_translate.length > 0) {
 | 
			
		||||
				return (
 | 
			
		||||
					translate(to_translate) +
 | 
			
		||||
					" " +
 | 
			
		||||
					new_hint.substring(x.index, current_index).trim()
 | 
			
		||||
				);
 | 
			
		||||
			} else {
 | 
			
		||||
				return new_hint.substring(x.index, current_index).trim();
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
		.join(" ");
 | 
			
		||||
	return new_hint;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const translate = (input) => {
 | 
			
		||||
	let payload = "";
 | 
			
		||||
	let inQuote = false;
 | 
			
		||||
	let cursor = 0;
 | 
			
		||||
 | 
			
		||||
	// // remove [text in square brackets]
 | 
			
		||||
	// // remove extra whitespace (eg., "I saw A  [hourglass]  "HOURGLASS"" becomes "I saw A "HOURGLASS"")
 | 
			
		||||
	// input = input.replace(/\s+\[.+?\]\s+/gm, " ");
 | 
			
		||||
	// // remove <text in carats>
 | 
			
		||||
	// // no whitespace concerns (eg., "sehz <#FF00FF>sohm%i^" becomes "sehz sohm%i^")
 | 
			
		||||
	// input = input.replace(/<.+?>/gm, "");
 | 
			
		||||
	// input = input.trim();
 | 
			
		||||
 | 
			
		||||
	while (cursor < input.length) {
 | 
			
		||||
		// get what one character and two characters ahead would be
 | 
			
		||||
		const one = input[cursor];
 | 
			
		||||
		const two = input.slice(cursor, cursor + 2);
 | 
			
		||||
		// things in between quotes are in english, ignore it and set span accordingly
 | 
			
		||||
		if (one == '"') {
 | 
			
		||||
			payload += `</span><span class="${inQuote ? "font-trunic" : "english"}">`;
 | 
			
		||||
			inQuote = !inQuote;
 | 
			
		||||
			cursor++;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		// if we're in an english quote, add it in and move on
 | 
			
		||||
		if (inQuote) {
 | 
			
		||||
			payload += one;
 | 
			
		||||
			cursor++;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		// check if this is a skipped character
 | 
			
		||||
		if (skip.includes(one)) {
 | 
			
		||||
			payload += one;
 | 
			
		||||
			// check if we have a translation for this character
 | 
			
		||||
		} else if (lookup.hasOwnProperty(one)) {
 | 
			
		||||
			payload += lookup[one];
 | 
			
		||||
			// check if we have a translation for two characters ahead
 | 
			
		||||
			// if so, advance the cursor head extra to make up for using two
 | 
			
		||||
		} else if (lookup.hasOwnProperty(two)) {
 | 
			
		||||
			payload += lookup[two];
 | 
			
		||||
			cursor++;
 | 
			
		||||
			// uh oh
 | 
			
		||||
		} else {
 | 
			
		||||
			// console.log(input[cursor], "UNKNOWN", input[cursor].charCodeAt(0));
 | 
			
		||||
		}
 | 
			
		||||
		// advance the cursor head to the next character
 | 
			
		||||
		cursor++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return `<span class="inline-block pt-0.5 font-trunic text-md sm:text-xl h-full align-bottom">${payload}</span>`;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default { parse_hints };
 | 
			
		||||
| 
						 | 
				
			
			@ -2,23 +2,27 @@
 | 
			
		|||
	"Default": {
 | 
			
		||||
		"Speedrunner Code": "RULDDRULU",
 | 
			
		||||
		"Seeking Spell": "ULURDR",
 | 
			
		||||
		"Healing Spell": "DRDLURU"
 | 
			
		||||
		"Healing Spell": "DRDLURU",
 | 
			
		||||
		"Plushie Code": "URRDLDRURRDLDRULDRDLLULDRDLLL"
 | 
			
		||||
	},
 | 
			
		||||
	"Cathedral": {
 | 
			
		||||
		"Secret Legend Door": "LULURULURDRRURDLDRDLDL"
 | 
			
		||||
	},
 | 
			
		||||
	"Swamp": {
 | 
			
		||||
		"Secret Legend Door": "LULURULURDRRURDLDRDLDL"
 | 
			
		||||
	},
 | 
			
		||||
	"Caustic Light Cave": {
 | 
			
		||||
		"Casting Light Fairy": "RULURDRURDLDR"
 | 
			
		||||
		"Holy Cross Chest": "RULURDRURDLDR"
 | 
			
		||||
	},
 | 
			
		||||
	"Cube Cave": {
 | 
			
		||||
		"Cube Fairy": "RRRRUUUURRRUUURRUURU"
 | 
			
		||||
		"Holy Cross Chest": "RRRRUUUURRRUUURRUURU"
 | 
			
		||||
	},
 | 
			
		||||
	"East Forest": {
 | 
			
		||||
		"Dancer Fairy": "UDUDLRLRDLUR",
 | 
			
		||||
		"Obelisk Fairy": "DRDLULDLURULURURULURDRDRDLDRDLU"
 | 
			
		||||
		"Dancing Fox Spirit Holy Cross": "UDUDLRLRDLUR",
 | 
			
		||||
		"Golden Obelisk Holy Cross": "DRDLULDLURULURURULURDRDRDLDRDLU"
 | 
			
		||||
	},
 | 
			
		||||
	"Eastern Vault Fortress": {
 | 
			
		||||
		"Candles Fairy": "RLDRUL"
 | 
			
		||||
		"Candles Holy Cross": "RLDRUL"
 | 
			
		||||
	},
 | 
			
		||||
	"Global": {
 | 
			
		||||
		"Firebomb": "LURDRURDRURDL",
 | 
			
		||||
| 
						 | 
				
			
			@ -26,54 +30,57 @@
 | 
			
		|||
		"Icebomb": "LDRURDRURDRUL"
 | 
			
		||||
	},
 | 
			
		||||
	"Hourglass Cave": {
 | 
			
		||||
		"Hourglass Door": "RULURULUURDLDRDLDR",
 | 
			
		||||
		"Hourglass Fairy": "LURURDRURULLLURU"
 | 
			
		||||
		"Holy Cross Door": "RULURULUURDLDRDLDR",
 | 
			
		||||
		"Holy Cross Chest": "LURURDRURULLLURU"
 | 
			
		||||
	},
 | 
			
		||||
	"Library Hall": {
 | 
			
		||||
		"Library Fairy": "URDRULURULURDLDRURDRULURULULDRDLDRDL"
 | 
			
		||||
		"Holy Cross Chest": "URDRULURULURDLDRURDRULURULULDRDLDRDL"
 | 
			
		||||
	},
 | 
			
		||||
	"Lower Mountain": {
 | 
			
		||||
		"Top Of Mountain Door": "ULDLULDLURURULURDRULULURULDLURUULURDRDRURDLDRURRDRURDRURRDLDLDRDRDLLDRDLDRURDRURRDDLURULDLULULURRULU"
 | 
			
		||||
	},
 | 
			
		||||
	"Maze Cave": {
 | 
			
		||||
		"Maze Fairy": "ULDLURDRURDLULU"
 | 
			
		||||
		"Maze Room Holy Cross": "ULDLURDRURDLULU"
 | 
			
		||||
	},
 | 
			
		||||
	"Old House": {
 | 
			
		||||
		"Old House Door": "ULDRDL",
 | 
			
		||||
		"Old House Fairy": "UURDDRUURDDD"
 | 
			
		||||
		"Holy Cross Door": "ULDRDL",
 | 
			
		||||
		"Holy Cross Chest": "UURDDRUURDDD"
 | 
			
		||||
	},
 | 
			
		||||
	"Overworld": {
 | 
			
		||||
		"Back To Work Treasure": "RDLULLDRRDD",
 | 
			
		||||
		"Compass Fairy": "LRDUUDRLURDLUDRL",
 | 
			
		||||
		"Fire Wand Obelisk Page": "URDLDRUL",
 | 
			
		||||
		"Starting Platform Holy Cross": "RDLULLDRRDD",
 | 
			
		||||
		"Weathervane Holy Cross": "LRDUUDRLURDLUDRL",
 | 
			
		||||
		"Golden Obelisk Page": "URDLDRUL",
 | 
			
		||||
		"Fountain Cross Door": "DRULUR",
 | 
			
		||||
		"Fountain Fairy": "DLLDURD",
 | 
			
		||||
		"Lower Flower Fairy": "URDLDLDLDLU",
 | 
			
		||||
		"Moss Fairy": "URULDLULURDRDRULURDRD",
 | 
			
		||||
		"Power Up Treasure": "UDRUDLUDLRDLRU",
 | 
			
		||||
		"Sacred Geometry Treasure": "DLLUURRLDRUD",
 | 
			
		||||
		"Fountain Holy Cross": "DLLDURD",
 | 
			
		||||
		"Southwest Flowers Holy Cross": "URDLDLDLDLU",
 | 
			
		||||
		"Moss Wall Holy Cross": "URULDLULURDRDRULURDRD",
 | 
			
		||||
		"Windchimes Holy Cross": "UDRUDLUDLRDLRU",
 | 
			
		||||
		"Windmill Holy Cross": "DLLUURRLDRUD",
 | 
			
		||||
		"Southeast Cross Door": "DRULUR",
 | 
			
		||||
		"Upper Flowers Fairy": "ULDLDLDLURDRRDR",
 | 
			
		||||
		"Vintage Treasure": "DRRRRRRRRRRRLLLLLLLLLLLL"
 | 
			
		||||
		"Northeast Flowers Holy Cross": "ULDLDLDLURDRRDR",
 | 
			
		||||
		"Haiku Holy Cross": "DRRRRRRRRRRRLLLLLLLLLLLL"
 | 
			
		||||
	},
 | 
			
		||||
	"Patrol Cave": {
 | 
			
		||||
		"Patrol Fairy": "DDRURDLDRURDD"
 | 
			
		||||
		"Holy Cross Chest": "DDRURDLDRURDD"
 | 
			
		||||
	},
 | 
			
		||||
	"Quarry": {
 | 
			
		||||
		"Quarry Fairy": "URDLURULDLURRD"
 | 
			
		||||
		"Bushes Holy Cross": "URDLURULDLURRD"
 | 
			
		||||
	},
 | 
			
		||||
	"Ruined Passage": {
 | 
			
		||||
		"Ruined Passage Door": "LURULDLURDRULURD"
 | 
			
		||||
		"Holy Cross Door": "LURULDLURDRULURD"
 | 
			
		||||
	},
 | 
			
		||||
	"Sealed Temple": {
 | 
			
		||||
		"Temple Fairy": "URULURULURDRUUL"
 | 
			
		||||
		"Holy Cross Chest": "URULURULURDRUUL"
 | 
			
		||||
	},
 | 
			
		||||
	"Secret Gathering Place": {
 | 
			
		||||
		"Waterfall Fairy": "DRURURULULURURULDLDLDRDLDRDRUR"
 | 
			
		||||
		"Holy Cross Chest": "DRURURULULURURULDLDLDRDLDRDRUR"
 | 
			
		||||
	},
 | 
			
		||||
	"West Garden": {
 | 
			
		||||
		"Sword Door": "DRULUR",
 | 
			
		||||
		"Tiles Fairy": "URULURULURDRULDLURULURULU",
 | 
			
		||||
		"Tree Fairy": "LDRLUD"
 | 
			
		||||
		"Holy Cross Door": "DRULUR",
 | 
			
		||||
		"Holy Cross (Blue Lines)": "URULURULURDRULDLURULURULU",
 | 
			
		||||
		"Tree Holy Cross Chest": "LDRLUD"
 | 
			
		||||
	},
 | 
			
		||||
	"mystery": {
 | 
			
		||||
		"it is a mystery": "UDLR"
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/fonts/Trunic-Regular.otf
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 759 KiB  | 
| 
		 After Width: | Height: | Size: 494 KiB  | 
| 
		 After Width: | Height: | Size: 533 KiB  | 
| 
		 After Width: | Height: | Size: 290 KiB  | 
| 
		 After Width: | Height: | Size: 789 KiB  | 
| 
		 After Width: | Height: | Size: 379 KiB  | 
| 
		 After Width: | Height: | Size: 299 KiB  | 
| 
		 After Width: | Height: | Size: 502 KiB  | 
| 
		 After Width: | Height: | Size: 823 KiB  | 
| 
		 After Width: | Height: | Size: 482 KiB  | 
| 
		 After Width: | Height: | Size: 511 KiB  | 
| 
		 After Width: | Height: | Size: 512 KiB  | 
| 
		 After Width: | Height: | Size: 508 KiB  | 
| 
		 After Width: | Height: | Size: 482 KiB  | 
| 
		 After Width: | Height: | Size: 802 KiB  | 
| 
		 After Width: | Height: | Size: 1.6 MiB  | 
| 
		 After Width: | Height: | Size: 1.1 MiB  | 
| 
		 After Width: | Height: | Size: 500 KiB  | 
| 
		 After Width: | Height: | Size: 500 KiB  | 
| 
		 After Width: | Height: | Size: 499 KiB  | 
| 
		 After Width: | Height: | Size: 388 KiB  | 
| 
		 After Width: | Height: | Size: 290 KiB  | 
| 
		 After Width: | Height: | Size: 478 KiB  | 
| 
		 After Width: | Height: | Size: 842 KiB  | 
| 
		 After Width: | Height: | Size: 469 KiB  | 
| 
		 After Width: | Height: | Size: 797 KiB  | 
| 
		 After Width: | Height: | Size: 802 KiB  | 
| 
		 After Width: | Height: | Size: 290 KiB  | 
| 
		 After Width: | Height: | Size: 737 KiB  | 
| 
		 After Width: | Height: | Size: 733 KiB  | 
| 
		 After Width: | Height: | Size: 524 KiB  | 
| 
		 After Width: | Height: | Size: 543 KiB  | 
| 
		 After Width: | Height: | Size: 488 KiB  | 
| 
		 After Width: | Height: | Size: 481 KiB  | 
| 
		 After Width: | Height: | Size: 1.1 MiB  | 
| 
		 After Width: | Height: | Size: 829 KiB  | 
| 
		 After Width: | Height: | Size: 1.5 MiB  | 
| 
		 After Width: | Height: | Size: 1.7 MiB  | 
| 
		 After Width: | Height: | Size: 759 KiB  | 
| 
		 After Width: | Height: | Size: 1.6 MiB  | 
| 
		 After Width: | Height: | Size: 290 KiB  | 
| 
		 After Width: | Height: | Size: 484 KiB  | 
| 
		 After Width: | Height: | Size: 5.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/question_mark.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.9 KiB  | 
| 
		 After Width: | Height: | Size: 23 KiB  | 
| 
		 After Width: | Height: | Size: 23 KiB  | 
| 
		 After Width: | Height: | Size: 23 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/anklet.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 32 KiB  | 
| 
		 After Width: | Height: | Size: 7.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/att.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 22 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/attrelic.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 16 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/aurasgem.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 32 KiB  | 
| 
		 After Width: | Height: | Size: 16 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/bluehex.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 20 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/bonecard.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 26 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/book.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 27 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/bracer.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 31 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/btsr.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 31 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/coin.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 27 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/dagger.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 35 KiB  | 
| 
		 After Width: | Height: | Size: 29 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/dath.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 18 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/def.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 27 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/defrelic.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 19 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/dusty.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 14 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/effigy.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 18 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/fairy.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 25 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/firebomb.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 23 KiB  | 
| 
		 After Width: | Height: | Size: 9.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/flask.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 30 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/fooltrap.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 27 KiB  | 
| 
		 After Width: | Height: | Size: 21 KiB  | 
| 
		 After Width: | Height: | Size: 32 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/goldhex.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 18 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/greenhex.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 20 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/gun.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 22 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								tunictracker/tracker/static/tracker/images/sprites/heirsword.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 17 KiB  |