| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | from typing import Tuple, Dict, Union | 
					
						
							|  |  |  | from BaseClasses import MultiWorld | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  | from .Options import timespinner_options, is_option_enabled, get_option_value | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class PreCalculatedWeights: | 
					
						
							|  |  |  |     pyramid_keys_unlock: str | 
					
						
							|  |  |  |     present_key_unlock: str | 
					
						
							|  |  |  |     past_key_unlock: str | 
					
						
							|  |  |  |     time_key_unlock: str | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     flood_basement: bool | 
					
						
							|  |  |  |     flood_basement_high: bool | 
					
						
							|  |  |  |     flood_xarion: bool | 
					
						
							|  |  |  |     flood_maw: bool | 
					
						
							|  |  |  |     flood_pyramid_shaft: bool | 
					
						
							|  |  |  |     flood_pyramid_back: bool | 
					
						
							|  |  |  |     flood_moat: bool | 
					
						
							|  |  |  |     flood_courtyard: bool | 
					
						
							|  |  |  |     flood_lake_desolation: bool | 
					
						
							|  |  |  |     dry_lake_serene: bool | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, world: MultiWorld, player: int): | 
					
						
							| 
									
										
										
										
											2023-02-22 17:11:27 -08:00
										 |  |  |         weights_overrrides: Dict[str, Union[str, Dict[str, int]]] = self.get_flood_weights_overrides(world, player) | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.flood_basement, self.flood_basement_high = \ | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  |             self.roll_flood_setting(world, player, weights_overrrides, "CastleBasement") | 
					
						
							|  |  |  |         self.flood_xarion, _ = self.roll_flood_setting(world, player, weights_overrrides, "Xarion") | 
					
						
							|  |  |  |         self.flood_maw, _ = self.roll_flood_setting(world, player, weights_overrrides, "Maw") | 
					
						
							|  |  |  |         self.flood_pyramid_shaft, _ = self.roll_flood_setting(world, player, weights_overrrides, "AncientPyramidShaft") | 
					
						
							|  |  |  |         self.flood_pyramid_back, _ = self.roll_flood_setting(world, player, weights_overrrides, "Sandman") | 
					
						
							|  |  |  |         self.flood_moat, _ = self.roll_flood_setting(world, player, weights_overrrides, "CastleMoat") | 
					
						
							|  |  |  |         self.flood_courtyard, _ = self.roll_flood_setting(world, player, weights_overrrides, "CastleCourtyard") | 
					
						
							|  |  |  |         self.flood_lake_desolation, _ = self.roll_flood_setting(world, player, weights_overrrides, "LakeDesolation") | 
					
						
							|  |  |  |         flood_lake_serene, _ = self.roll_flood_setting(world, player, weights_overrrides, "LakeSerene") | 
					
						
							|  |  |  |         self.dry_lake_serene = not flood_lake_serene  | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.pyramid_keys_unlock, self.present_key_unlock, self.past_key_unlock, self.time_key_unlock = \ | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  |             self.get_pyramid_keys_unlocks(world, player, self.flood_maw) | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  |     @staticmethod | 
					
						
							|  |  |  |     def get_pyramid_keys_unlocks(world: MultiWorld, player: int, is_maw_flooded: bool) -> Tuple[str, str, str, str]: | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  |         present_teleportation_gates: Tuple[str, ...] = ( | 
					
						
							|  |  |  |             "GateKittyBoss", | 
					
						
							|  |  |  |             "GateLeftLibrary", | 
					
						
							|  |  |  |             "GateMilitaryGate", | 
					
						
							|  |  |  |             "GateSealedCaves", | 
					
						
							|  |  |  |             "GateSealedSirensCave", | 
					
						
							|  |  |  |             "GateLakeDesolation" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         past_teleportation_gates: Tuple[str, ...] = ( | 
					
						
							|  |  |  |             "GateLakeSereneRight", | 
					
						
							|  |  |  |             "GateAccessToPast", | 
					
						
							|  |  |  |             "GateCastleRamparts", | 
					
						
							|  |  |  |             "GateCastleKeep", | 
					
						
							|  |  |  |             "GateRoyalTowers", | 
					
						
							|  |  |  |             "GateCavesOfBanishment" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ancient_pyramid_teleportation_gates: Tuple[str, ...] = ( | 
					
						
							|  |  |  |             "GateGyre", | 
					
						
							|  |  |  |             "GateLeftPyramid", | 
					
						
							|  |  |  |             "GateRightPyramid" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not world: | 
					
						
							|  |  |  |             return ( | 
					
						
							|  |  |  |                 present_teleportation_gates[0],  | 
					
						
							|  |  |  |                 present_teleportation_gates[0],  | 
					
						
							|  |  |  |                 past_teleportation_gates[0],  | 
					
						
							|  |  |  |                 ancient_pyramid_teleportation_gates[0] | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not is_maw_flooded: | 
					
						
							|  |  |  |             past_teleportation_gates += ("GateMaw", ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if is_option_enabled(world, player, "Inverted"): | 
					
						
							|  |  |  |             all_gates: Tuple[str, ...] = present_teleportation_gates | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             all_gates: Tuple[str, ...] = past_teleportation_gates + present_teleportation_gates | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return ( | 
					
						
							|  |  |  |             world.random.choice(all_gates), | 
					
						
							|  |  |  |             world.random.choice(present_teleportation_gates), | 
					
						
							|  |  |  |             world.random.choice(past_teleportation_gates), | 
					
						
							|  |  |  |             world.random.choice(ancient_pyramid_teleportation_gates) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  |     def get_flood_weights_overrides(world: MultiWorld, player: int) -> Dict[str, Union[str, Dict[str, int]]]: | 
					
						
							| 
									
										
										
										
											2023-02-22 17:11:27 -08:00
										 |  |  |         weights_overrides_option: Union[int, Dict[str, Union[str, Dict[str, int]]]] = \ | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  |             get_option_value(world, player, "RisingTidesOverrides") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  |         default_weights: Dict[str, Dict[str, int]] = timespinner_options["RisingTidesOverrides"].default | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  |         if not weights_overrides_option: | 
					
						
							|  |  |  |             weights_overrides_option = default_weights | 
					
						
							| 
									
										
										
										
											2023-02-22 17:11:27 -08:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  |             for key, weights in default_weights.items(): | 
					
						
							|  |  |  |                 if not key in weights_overrides_option: | 
					
						
							|  |  |  |                     weights_overrides_option[key] = weights | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  |         return weights_overrides_option  | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  |     def roll_flood_setting(world: MultiWorld, player: int, | 
					
						
							|  |  |  |             all_weights: Dict[str, Union[Dict[str, int], str]], key: str) -> Tuple[bool, bool]: | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if not world or not is_option_enabled(world, player, "RisingTides"): | 
					
						
							|  |  |  |             return False, False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  |         weights: Union[Dict[str, int], str] = all_weights[key] | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-22 17:11:27 -08:00
										 |  |  |         if isinstance(weights, dict): | 
					
						
							|  |  |  |             result: str = world.random.choices(list(weights.keys()), weights=list(map(int, weights.values())))[0] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             result: str = weights | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  |          | 
					
						
							|  |  |  |         if result == "Dry": | 
					
						
							|  |  |  |             return False, False | 
					
						
							|  |  |  |         elif result == "Flooded": | 
					
						
							|  |  |  |             return True, True | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  |         elif result == "FloodedWithSavePointAvailable": | 
					
						
							|  |  |  |             return True, False |