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 |