mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00
126 lines
4.7 KiB
Python
126 lines
4.7 KiB
Python
![]() |
from typing import TYPE_CHECKING
|
||
|
|
||
|
from ..Items import ISLAND_NUMBER_TO_CHART_NAME
|
||
|
from ..Locations import TWWFlag, TWWLocation
|
||
|
|
||
|
if TYPE_CHECKING:
|
||
|
from .. import TWWWorld
|
||
|
|
||
|
ISLAND_NUMBER_TO_NAME: dict[int, str] = {
|
||
|
1: "Forsaken Fortress Sector",
|
||
|
2: "Star Island",
|
||
|
3: "Northern Fairy Island",
|
||
|
4: "Gale Isle",
|
||
|
5: "Crescent Moon Island",
|
||
|
6: "Seven-Star Isles",
|
||
|
7: "Overlook Island",
|
||
|
8: "Four-Eye Reef",
|
||
|
9: "Mother and Child Isles",
|
||
|
10: "Spectacle Island",
|
||
|
11: "Windfall Island",
|
||
|
12: "Pawprint Isle",
|
||
|
13: "Dragon Roost Island",
|
||
|
14: "Flight Control Platform",
|
||
|
15: "Western Fairy Island",
|
||
|
16: "Rock Spire Isle",
|
||
|
17: "Tingle Island",
|
||
|
18: "Northern Triangle Island",
|
||
|
19: "Eastern Fairy Island",
|
||
|
20: "Fire Mountain",
|
||
|
21: "Star Belt Archipelago",
|
||
|
22: "Three-Eye Reef",
|
||
|
23: "Greatfish Isle",
|
||
|
24: "Cyclops Reef",
|
||
|
25: "Six-Eye Reef",
|
||
|
26: "Tower of the Gods Sector",
|
||
|
27: "Eastern Triangle Island",
|
||
|
28: "Thorned Fairy Island",
|
||
|
29: "Needle Rock Isle",
|
||
|
30: "Islet of Steel",
|
||
|
31: "Stone Watcher Island",
|
||
|
32: "Southern Triangle Island",
|
||
|
33: "Private Oasis",
|
||
|
34: "Bomb Island",
|
||
|
35: "Bird's Peak Rock",
|
||
|
36: "Diamond Steppe Island",
|
||
|
37: "Five-Eye Reef",
|
||
|
38: "Shark Island",
|
||
|
39: "Southern Fairy Island",
|
||
|
40: "Ice Ring Isle",
|
||
|
41: "Forest Haven",
|
||
|
42: "Cliff Plateau Isles",
|
||
|
43: "Horseshoe Island",
|
||
|
44: "Outset Island",
|
||
|
45: "Headstone Island",
|
||
|
46: "Two-Eye Reef",
|
||
|
47: "Angular Isles",
|
||
|
48: "Boating Course",
|
||
|
49: "Five-Star Isles",
|
||
|
}
|
||
|
|
||
|
|
||
|
class ChartRandomizer:
|
||
|
"""
|
||
|
This class handles the randomization of charts.
|
||
|
Each chart points to a specific island on the map, and this randomizer shuffles these mappings.
|
||
|
|
||
|
:param world: The Wind Waker game world.
|
||
|
"""
|
||
|
|
||
|
def __init__(self, world: "TWWWorld") -> None:
|
||
|
self.world = world
|
||
|
self.multiworld = world.multiworld
|
||
|
|
||
|
self.island_number_to_chart_name = ISLAND_NUMBER_TO_CHART_NAME.copy()
|
||
|
|
||
|
def setup_progress_sunken_treasure_locations(self) -> None:
|
||
|
"""
|
||
|
Create the locations for sunken treasure locations and update them as progression and non-progression
|
||
|
appropriately. If the option is enabled, randomize which charts point to which sector.
|
||
|
"""
|
||
|
options = self.world.options
|
||
|
|
||
|
original_item_names = list(self.island_number_to_chart_name.values())
|
||
|
|
||
|
# Shuffles the list of island numbers if charts are randomized.
|
||
|
# The shuffled island numbers determine which sector each chart points to.
|
||
|
shuffled_island_numbers = list(self.island_number_to_chart_name.keys())
|
||
|
if options.randomize_charts:
|
||
|
self.world.random.shuffle(shuffled_island_numbers)
|
||
|
|
||
|
for original_item_name in reversed(original_item_names):
|
||
|
# Assign each chart to its new island.
|
||
|
shuffled_island_number = shuffled_island_numbers.pop()
|
||
|
self.island_number_to_chart_name[shuffled_island_number] = original_item_name
|
||
|
|
||
|
# Additionally, determine if that location is a progress location or not.
|
||
|
island_name = ISLAND_NUMBER_TO_NAME[shuffled_island_number]
|
||
|
island_location = f"{island_name} - Sunken Treasure"
|
||
|
if options.progression_triforce_charts or options.progression_treasure_charts:
|
||
|
if original_item_name.startswith("Triforce Chart "):
|
||
|
if options.progression_triforce_charts:
|
||
|
self.world.progress_locations.add(island_location)
|
||
|
self.world.nonprogress_locations.remove(island_location)
|
||
|
else:
|
||
|
if options.progression_treasure_charts:
|
||
|
self.world.progress_locations.add(island_location)
|
||
|
self.world.nonprogress_locations.remove(island_location)
|
||
|
else:
|
||
|
self.world.nonprogress_locations.add(island_location)
|
||
|
|
||
|
def update_chart_location_flags(self) -> None:
|
||
|
"""
|
||
|
Update the flags for sunken treasure locations based on the current chart mappings.
|
||
|
"""
|
||
|
for shuffled_island_number, item_name in self.island_number_to_chart_name.items():
|
||
|
island_name = ISLAND_NUMBER_TO_NAME[shuffled_island_number]
|
||
|
island_location_str = f"{island_name} - Sunken Treasure"
|
||
|
|
||
|
if island_location_str in self.world.progress_locations:
|
||
|
island_location = self.world.get_location(island_location_str)
|
||
|
assert isinstance(island_location, TWWLocation)
|
||
|
if item_name.startswith("Triforce Chart "):
|
||
|
island_location.flags = TWWFlag.TRI_CHT
|
||
|
else:
|
||
|
island_location.flags = TWWFlag.TRE_CHT
|