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
							 |