| 
									
										
										
										
											2024-04-20 13:18:06 -05:00
										 |  |  | {% set icons = { | 
					
						
							|  |  |  |     "Blue Shield": "https://www.zeldadungeon.net/wiki/images/thumb/c/c3/FightersShield-ALttP-Sprite.png/100px-FightersShield-ALttP-Sprite.png", | 
					
						
							|  |  |  |     "Red Shield": "https://www.zeldadungeon.net/wiki/images/thumb/9/9e/FireShield-ALttP-Sprite.png/111px-FireShield-ALttP-Sprite.png", | 
					
						
							|  |  |  |     "Mirror Shield": "https://www.zeldadungeon.net/wiki/images/thumb/e/e3/MirrorShield-ALttP-Sprite.png/105px-MirrorShield-ALttP-Sprite.png", | 
					
						
							|  |  |  |     "Fighter Sword": "https://upload.wikimedia.org/wikibooks/en/8/8e/Zelda_ALttP_item_L-1_Sword.png", | 
					
						
							|  |  |  |     "Master Sword": "https://upload.wikimedia.org/wikibooks/en/8/87/BS_Zelda_AST_item_L-2_Sword.png", | 
					
						
							|  |  |  |     "Tempered Sword": "https://upload.wikimedia.org/wikibooks/en/c/cc/BS_Zelda_AST_item_L-3_Sword.png", | 
					
						
							|  |  |  |     "Golden Sword": "https://upload.wikimedia.org/wikibooks/en/4/40/BS_Zelda_AST_item_L-4_Sword.png", | 
					
						
							|  |  |  |     "Bow": "https://www.zeldadungeon.net/wiki/images/thumb/8/8c/BowArrows-ALttP-Sprite.png/120px-BowArrows-ALttP-Sprite.png", | 
					
						
							|  |  |  |     "Silver Bow": "https://upload.wikimedia.org/wikibooks/en/6/69/Zelda_ALttP_item_Silver_Arrows.png", | 
					
						
							|  |  |  |     "Green Mail": "https://upload.wikimedia.org/wikibooks/en/d/dd/Zelda_ALttP_item_Green_Mail.png", | 
					
						
							|  |  |  |     "Blue Mail": "https://upload.wikimedia.org/wikibooks/en/b/b5/Zelda_ALttP_item_Blue_Mail.png", | 
					
						
							|  |  |  |     "Red Mail": "https://upload.wikimedia.org/wikibooks/en/d/db/Zelda_ALttP_item_Red_Mail.png", | 
					
						
							|  |  |  |     "Power Glove": "https://www.zeldadungeon.net/wiki/images/thumb/4/41/PowerGlove-ALttP-Sprite.png/105px-PowerGlove-ALttP-Sprite.png", | 
					
						
							|  |  |  |     "Titan Mitts": "https://www.zeldadungeon.net/wiki/images/thumb/7/75/TitanMitt-ALttP-Sprite.png/105px-TitanMitt-ALttP-Sprite.png", | 
					
						
							|  |  |  |     "Pegasus Boots": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ed/ALttP_Pegasus_Shoes_Sprite.png", | 
					
						
							|  |  |  |     "Flippers": "https://www.zeldadungeon.net/wiki/images/thumb/b/bc/ZoraFlippers-ALttP-Sprite.png/112px-ZoraFlippers-ALttP-Sprite.png", | 
					
						
							|  |  |  |     "Moon Pearl": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/6/63/ALttP_Moon_Pearl_Sprite.png", | 
					
						
							|  |  |  |     "Blue Boomerang": "https://www.zeldadungeon.net/wiki/images/thumb/f/f0/Boomerang-ALttP-Sprite.png/86px-Boomerang-ALttP-Sprite.png", | 
					
						
							|  |  |  |     "Red Boomerang": "https://www.zeldadungeon.net/wiki/images/thumb/3/3c/MagicalBoomerang-ALttP-Sprite.png/86px-MagicalBoomerang-ALttP-Sprite.png", | 
					
						
							|  |  |  |     "Hookshot": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/2/24/Hookshot.png", | 
					
						
							|  |  |  |     "Mushroom": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/35/ALttP_Mushroom_Sprite.png", | 
					
						
							|  |  |  |     "Magic Powder": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e5/ALttP_Magic_Powder_Sprite.png", | 
					
						
							|  |  |  |     "Fire Rod": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d6/FireRod.png", | 
					
						
							|  |  |  |     "Ice Rod": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d7/ALttP_Ice_Rod_Sprite.png", | 
					
						
							|  |  |  |     "Bombos": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/8c/ALttP_Bombos_Medallion_Sprite.png", | 
					
						
							|  |  |  |     "Ether": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/3c/Ether.png", | 
					
						
							|  |  |  |     "Quake": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/56/ALttP_Quake_Medallion_Sprite.png", | 
					
						
							|  |  |  |     "Lamp": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/6/63/ALttP_Lantern_Sprite.png", | 
					
						
							|  |  |  |     "Hammer": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d1/ALttP_Hammer_Sprite.png", | 
					
						
							|  |  |  |     "Shovel": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/c4/ALttP_Shovel_Sprite.png", | 
					
						
							|  |  |  |     "Flute": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/db/Flute.png", | 
					
						
							|  |  |  |     "Bug Catching Net": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/54/Bug-CatchingNet.png", | 
					
						
							|  |  |  |     "Book of Mudora": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/2/22/ALttP_Book_of_Mudora_Sprite.png", | 
					
						
							|  |  |  |     "Bottles": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ef/ALttP_Magic_Bottle_Sprite.png", | 
					
						
							|  |  |  |     "Cane of Somaria": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e1/ALttP_Cane_of_Somaria_Sprite.png", | 
					
						
							|  |  |  |     "Cane of Byrna": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Cane_of_Byrna_Sprite.png", | 
					
						
							|  |  |  |     "Cape": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/1/1c/ALttP_Magic_Cape_Sprite.png", | 
					
						
							|  |  |  |     "Magic Mirror": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e5/ALttP_Magic_Mirror_Sprite.png", | 
					
						
							|  |  |  |     "Triforce": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/4/4e/TriforceALttPTitle.png", | 
					
						
							| 
									
										
										
										
											2023-11-18 12:29:35 -06:00
										 |  |  |     "Triforce Piece": "https://www.zeldadungeon.net/wiki/images/thumb/5/54/Triforce_Fragment_-_BS_Zelda.png/62px-Triforce_Fragment_-_BS_Zelda.png", | 
					
						
							| 
									
										
										
										
											2024-04-20 13:18:06 -05:00
										 |  |  |     "Bombs": "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/3/38/ALttP_Bomb_Sprite.png", | 
					
						
							|  |  |  |     "Small Key": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/f/f1/ALttP_Small_Key_Sprite.png", | 
					
						
							|  |  |  |     "Big Key": "https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/33/ALttP_Big_Key_Sprite.png", | 
					
						
							|  |  |  | } %} | 
					
						
							| 
									
										
										
										
											2023-11-18 12:29:35 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-20 13:18:06 -05:00
										 |  |  | {% set inventory_order = [ | 
					
						
							|  |  |  |     "Progressive Bow", "Boomerangs",      "Hookshot",          "Bombs",            "Mushroom",       "Magic Powder", | 
					
						
							|  |  |  |     "Fire Rod",        "Ice Rod",         "Bombos",            "Ether",            "Quake",          "Progressive Mail", | 
					
						
							|  |  |  |     "Lamp",            "Hammer",          "Flute",             "Bug Catching Net", "Book of Mudora", "Progressive Shield", | 
					
						
							|  |  |  |     "Bottles",         "Cane of Somaria", "Cane of Byrna",     "Cape",             "Magic Mirror",   "Progressive Sword", | 
					
						
							|  |  |  |     "Shovel",          "Pegasus Boots",   "Progressive Glove", "Flippers",         "Moon Pearl",     "Triforce Piece", | 
					
						
							|  |  |  | ] %} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | {# Most have a duplicated 0th entry for when we have none of that item to still load the correct icon/name. #} | 
					
						
							|  |  |  | {% set progressive_order = { | 
					
						
							|  |  |  |     "Progressive Bow":    ["Bow", "Bow", "Silver Bow"], | 
					
						
							|  |  |  |     "Progressive Mail":   ["Green Mail", "Blue Mail", "Red Mail"], | 
					
						
							|  |  |  |     "Progressive Shield": ["Blue Shield", "Blue Shield", "Red Shield", "Mirror Shield"], | 
					
						
							|  |  |  |     "Progressive Sword":  ["Fighter Sword", "Fighter Sword", "Master Sword", "Tempered Sword", "Golden Sword"], | 
					
						
							|  |  |  |     "Progressive Glove":  ["Power Glove", "Power Glove", "Titan Mitts"], | 
					
						
							|  |  |  | } %} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | {% set dungeon_keys = { | 
					
						
							|  |  |  |     "Hyrule Castle": ("Small Key (Hyrule Castle)", "Big Key (Hyrule Castle)"), | 
					
						
							|  |  |  |     "Agahnims Tower": ("Small Key (Agahnims Tower)", "Big Key (Agahnims Tower)"), | 
					
						
							|  |  |  |     "Eastern Palace": ("Small Key (Eastern Palace)", "Big Key (Eastern Palace)"), | 
					
						
							|  |  |  |     "Desert Palace": ("Small Key (Desert Palace)", "Big Key (Desert Palace)"), | 
					
						
							|  |  |  |     "Tower of Hera": ("Small Key (Tower of Hera)", "Big Key (Tower of Hera)"), | 
					
						
							|  |  |  |     "Palace of Darkness": ("Small Key (Palace of Darkness)", "Big Key (Palace of Darkness)"), | 
					
						
							|  |  |  |     "Swamp Palace": ("Small Key (Swamp Palace)", "Big Key (Swamp Palace)"), | 
					
						
							| 
									
										
										
										
											2024-04-20 17:29:41 -05:00
										 |  |  |     "Thieves Town": ("Small Key (Thieves Town)", "Big Key (Thieves Town)"), | 
					
						
							|  |  |  |     "Skull Woods": ("Small Key (Skull Woods)", "Big Key (Skull Woods)"), | 
					
						
							| 
									
										
										
										
											2024-04-20 13:18:06 -05:00
										 |  |  |     "Ice Palace": ("Small Key (Ice Palace)", "Big Key (Ice Palace)"), | 
					
						
							|  |  |  |     "Misery Mire": ("Small Key (Misery Mire)", "Big Key (Misery Mire)"), | 
					
						
							|  |  |  |     "Turtle Rock": ("Small Key (Turtle Rock)", "Big Key (Turtle Rock)"), | 
					
						
							|  |  |  |     "Ganons Tower": ("Small Key (Ganons Tower)", "Big Key (Ganons Tower)"), | 
					
						
							|  |  |  | } %} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <!doctype html> | 
					
						
							| 
									
										
										
										
											2023-11-18 12:29:35 -06:00
										 |  |  | <html lang="en"> | 
					
						
							|  |  |  | <head> | 
					
						
							| 
									
										
										
										
											2024-04-20 13:18:06 -05:00
										 |  |  |     <meta charset="UTF-8"> | 
					
						
							|  |  |  |     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | 
					
						
							| 
									
										
										
										
											2023-11-18 12:29:35 -06:00
										 |  |  |     <title>{{ player_name }}'s Tracker</title> | 
					
						
							| 
									
										
										
										
											2024-04-20 13:18:06 -05:00
										 |  |  |     <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='styles/tracker__ALinkToThePast.css') }}"> | 
					
						
							| 
									
										
										
										
											2023-11-18 12:29:35 -06:00
										 |  |  | </head> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <body> | 
					
						
							|  |  |  |     {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #} | 
					
						
							|  |  |  |     <div style="margin-bottom: 0.5rem"> | 
					
						
							|  |  |  |         <a href="{{ url_for("get_generic_game_tracker", tracker=room.tracker, tracked_team=team, tracked_player=player) }}">Switch To Generic Tracker</a> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-20 13:18:06 -05:00
										 |  |  |     <div class="tracker-container"> | 
					
						
							|  |  |  |         {# Inventory Grid #} | 
					
						
							|  |  |  |         <div class="inventory-grid"> | 
					
						
							|  |  |  |             {% for item in inventory_order %} | 
					
						
							|  |  |  |                 {% if item in progressive_order %} | 
					
						
							|  |  |  |                     {% set non_prog_item = progressive_order[item][inventory[item]] %} | 
					
						
							|  |  |  |                     <div class="item"> | 
					
						
							|  |  |  |                         <img | 
					
						
							|  |  |  |                             src="{{ icons[non_prog_item] }}" | 
					
						
							|  |  |  |                             alt="{{ non_prog_item }}" | 
					
						
							|  |  |  |                             title="{{ non_prog_item }}" | 
					
						
							|  |  |  |                             {# Progressive Mail gets a special exception, since it starts displaying green mail. #} | 
					
						
							|  |  |  |                             class="{{ 'missing' if (item not in inventory or inventory[item] == 0) and item != 'Progressive Mail' }}" | 
					
						
							|  |  |  |                         > | 
					
						
							|  |  |  |                     </div> | 
					
						
							|  |  |  |                 {% elif item == "Boomerangs" %} | 
					
						
							|  |  |  |                     <div class="dual-item"> | 
					
						
							|  |  |  |                         <img | 
					
						
							|  |  |  |                             src="{{ icons['Blue Boomerang'] }}" | 
					
						
							|  |  |  |                             alt="Blue Boomerang" | 
					
						
							|  |  |  |                             title="Blue Boomerang" | 
					
						
							|  |  |  |                             class="{{ 'missing' if 'Blue Boomerang' not in inventory }}" | 
					
						
							|  |  |  |                         > | 
					
						
							|  |  |  |                         <img | 
					
						
							|  |  |  |                             src="{{ icons['Red Boomerang'] }}" | 
					
						
							|  |  |  |                             alt="Red Boomerang" | 
					
						
							|  |  |  |                             title="Red Boomerang" | 
					
						
							|  |  |  |                             class="{{ 'missing' if 'Red Boomerang' not in inventory }}" | 
					
						
							|  |  |  |                         > | 
					
						
							|  |  |  |                     </div> | 
					
						
							|  |  |  |                 {% else %} | 
					
						
							|  |  |  |                     <div class="item {{ 'hidden' if item == 'Triforce Piece' and inventory['Triforce Piece'] == 0 }}"> | 
					
						
							|  |  |  |                         <img | 
					
						
							|  |  |  |                             src="{{ icons[item] }}" | 
					
						
							|  |  |  |                             alt="{{ item }}" | 
					
						
							|  |  |  |                             title="{{ item }}" | 
					
						
							|  |  |  |                             class="{{ 'missing' if item not in inventory or inventory[item] == 0 }}" | 
					
						
							|  |  |  |                         > | 
					
						
							|  |  |  |                         {% if item == "Bottles" or item == "Triforce Piece" %} | 
					
						
							|  |  |  |                             <div class="quantity">{{ inventory[item] }}</div> | 
					
						
							|  |  |  |                         {% endif %} | 
					
						
							|  |  |  |                     </div> | 
					
						
							| 
									
										
										
										
											2023-11-18 12:29:35 -06:00
										 |  |  |                 {% endif %} | 
					
						
							| 
									
										
										
										
											2024-04-20 13:18:06 -05:00
										 |  |  |             {% endfor %} | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <div class="regions-list"> | 
					
						
							|  |  |  |             <div class="region region-header"> | 
					
						
							|  |  |  |                 <div></div> | 
					
						
							|  |  |  |                 <div></div> | 
					
						
							|  |  |  |                 <div><img src="{{ icons['Small Key'] }}" alt="SK" title="Small Keys"></div> | 
					
						
							|  |  |  |                 <div><img src="{{ icons['Big Key'] }}" alt="BK" title="Big Keys"></div> | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-20 17:29:41 -05:00
										 |  |  |             {% for region_name in known_regions %} | 
					
						
							|  |  |  |                 {% set region_data = regions[region_name] %} | 
					
						
							| 
									
										
										
										
											2024-04-20 13:18:06 -05:00
										 |  |  |                 {% if region_data["locations"] | length > 0 %} | 
					
						
							|  |  |  |                     <details class="region-details"> | 
					
						
							|  |  |  |                         <summary> | 
					
						
							|  |  |  |                             {% if region_name in dungeon_keys %} | 
					
						
							|  |  |  |                                 <div class="region"> | 
					
						
							|  |  |  |                                     <span>{{ region_name }}</span> | 
					
						
							|  |  |  |                                     <span>{{ region_data["checked"] }} / {{ region_data["locations"] | length }}</span> | 
					
						
							|  |  |  |                                     <span>{{ inventory[dungeon_keys[region_name][0]] }}</span> | 
					
						
							|  |  |  |                                     <span> | 
					
						
							|  |  |  |                                         {% if region_name == "Agahnims Tower" %} | 
					
						
							|  |  |  |                                             — | 
					
						
							|  |  |  |                                         {% elif inventory[dungeon_keys[region_name][1]] %} | 
					
						
							|  |  |  |                                             ✔ | 
					
						
							|  |  |  |                                         {% endif %} | 
					
						
							|  |  |  |                                     </span> | 
					
						
							|  |  |  |                                 </div> | 
					
						
							|  |  |  |                             {% else %} | 
					
						
							|  |  |  |                                 <div class="region"> | 
					
						
							|  |  |  |                                     <span>{{ region_name }}</span> | 
					
						
							|  |  |  |                                     <span>{{ region_data["checked"] }} / {{ region_data["locations"] | length }}</span> | 
					
						
							|  |  |  |                                     <span>—</span> | 
					
						
							|  |  |  |                                     <span>—</span> | 
					
						
							|  |  |  |                                 </div> | 
					
						
							|  |  |  |                             {% endif %} | 
					
						
							|  |  |  |                         </summary> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         <div class="location-rows"> | 
					
						
							|  |  |  |                             {% for location, checked in region_data["locations"] %} | 
					
						
							|  |  |  |                                 <div>{{ location }}</div> | 
					
						
							|  |  |  |                                 <div>{% if checked %}✔{% endif %}</div> | 
					
						
							|  |  |  |                             {% endfor %} | 
					
						
							|  |  |  |                         </div> | 
					
						
							|  |  |  |                     </details> | 
					
						
							| 
									
										
										
										
											2023-11-18 12:29:35 -06:00
										 |  |  |                 {% endif %} | 
					
						
							|  |  |  |             {% endfor %} | 
					
						
							| 
									
										
										
										
											2024-04-20 13:18:06 -05:00
										 |  |  |         </div> | 
					
						
							| 
									
										
										
										
											2023-11-18 12:29:35 -06:00
										 |  |  |     </div> | 
					
						
							| 
									
										
										
										
											2024-04-20 13:18:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     <script> | 
					
						
							|  |  |  |         const parser = new DOMParser(); | 
					
						
							|  |  |  |         const interval = 15_000; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         window.addEventListener("load", () => { | 
					
						
							|  |  |  |             setInterval(() => updateTracker() | 
					
						
							|  |  |  |                 .then(() => console.log("Refreshed tracker.")) | 
					
						
							|  |  |  |                 .catch(console.error), interval); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         async function updateTracker() { | 
					
						
							|  |  |  |             const response = await fetch(`${window.location}`); | 
					
						
							|  |  |  |             if (!response.ok) { | 
					
						
							|  |  |  |                 throw new Error(`Failed to fetch tracker update from ${window.location}. Received response: ${response.statusText}`); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const fakeDOM = parser.parseFromString(await response.text(), "text/html"); | 
					
						
							|  |  |  |             document.querySelector(".inventory-grid").innerHTML = fakeDOM.querySelector(".inventory-grid").innerHTML; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const regionDetailElements = document.querySelectorAll(".region-details"); | 
					
						
							|  |  |  |             const fakeDetailElements = fakeDOM.querySelectorAll(".region-details"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for (let i = 0; i < regionDetailElements.length; ++i) { | 
					
						
							|  |  |  |                 const isOpen = regionDetailElements[i].open; | 
					
						
							|  |  |  |                 regionDetailElements[i].innerHTML = fakeDetailElements[i].innerHTML; | 
					
						
							|  |  |  |                 regionDetailElements[i].open = isOpen; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     </script> | 
					
						
							| 
									
										
										
										
											2023-11-18 12:29:35 -06:00
										 |  |  | </body> | 
					
						
							|  |  |  | </html> |