| 
									
										
										
										
											2023-11-22 15:17:33 +01:00
										 |  |  | from typing import Tuple, Dict, Union, List | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:04 +02:00
										 |  |  | from random import Random | 
					
						
							|  |  |  | from .Options import TimespinnerOptions | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2023-11-22 15:17:33 +01:00
										 |  |  |     flood_lake_serene: bool | 
					
						
							|  |  |  |     flood_lake_serene_bridge: bool | 
					
						
							|  |  |  |     flood_lab: bool | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:04 +02:00
										 |  |  |     def __init__(self, options: TimespinnerOptions, random: Random): | 
					
						
							|  |  |  |         if options.rising_tides: | 
					
						
							|  |  |  |             weights_overrrides: Dict[str, Union[str, Dict[str, int]]] = self.get_flood_weights_overrides(options) | 
					
						
							| 
									
										
										
										
											2023-03-22 11:32:37 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             self.flood_basement, self.flood_basement_high = \ | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:04 +02:00
										 |  |  |                 self.roll_flood_setting(random, weights_overrrides, "CastleBasement") | 
					
						
							|  |  |  |             self.flood_xarion, _ = self.roll_flood_setting(random, weights_overrrides, "Xarion") | 
					
						
							|  |  |  |             self.flood_maw, _ = self.roll_flood_setting(random, weights_overrrides, "Maw") | 
					
						
							|  |  |  |             self.flood_pyramid_shaft, _ = self.roll_flood_setting(random, weights_overrrides, "AncientPyramidShaft") | 
					
						
							|  |  |  |             self.flood_pyramid_back, _ = self.roll_flood_setting(random, weights_overrrides, "Sandman") | 
					
						
							|  |  |  |             self.flood_moat, _ = self.roll_flood_setting(random, weights_overrrides, "CastleMoat") | 
					
						
							|  |  |  |             self.flood_courtyard, _ = self.roll_flood_setting(random, weights_overrrides, "CastleCourtyard") | 
					
						
							|  |  |  |             self.flood_lake_desolation, _ = self.roll_flood_setting(random, weights_overrrides, "LakeDesolation") | 
					
						
							|  |  |  |             self.flood_lake_serene, _ = self.roll_flood_setting(random, weights_overrrides, "LakeSerene") | 
					
						
							|  |  |  |             self.flood_lake_serene_bridge, _ = self.roll_flood_setting(random, weights_overrrides, "LakeSereneBridge") | 
					
						
							|  |  |  |             self.flood_lab, _ = self.roll_flood_setting(random, weights_overrrides, "Lab") | 
					
						
							| 
									
										
										
										
											2023-03-22 11:32:37 +01:00
										 |  |  |         else: | 
					
						
							|  |  |  |             self.flood_basement = False | 
					
						
							|  |  |  |             self.flood_basement_high = False | 
					
						
							|  |  |  |             self.flood_xarion = False | 
					
						
							|  |  |  |             self.flood_maw = False | 
					
						
							|  |  |  |             self.flood_pyramid_shaft = False | 
					
						
							|  |  |  |             self.flood_pyramid_back = False | 
					
						
							|  |  |  |             self.flood_moat = False | 
					
						
							|  |  |  |             self.flood_courtyard = False | 
					
						
							|  |  |  |             self.flood_lake_desolation = False | 
					
						
							| 
									
										
										
										
											2023-11-22 15:17:33 +01:00
										 |  |  |             self.flood_lake_serene = True  | 
					
						
							|  |  |  |             self.flood_lake_serene_bridge = False | 
					
						
							|  |  |  |             self.flood_lab = False | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.pyramid_keys_unlock, self.present_key_unlock, self.past_key_unlock, self.time_key_unlock = \ | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:04 +02:00
										 |  |  |             self.get_pyramid_keys_unlocks(options, random, self.flood_maw, self.flood_xarion) | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-04 16:31:44 +01:00
										 |  |  |     @staticmethod | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:04 +02:00
										 |  |  |     def get_pyramid_keys_unlocks(options: TimespinnerOptions, random: Random, | 
					
						
							|  |  |  |                                  is_maw_flooded: bool, is_xarion_flooded: bool) -> Tuple[str, str, str, str]: | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2023-11-22 15:17:33 +01:00
										 |  |  |         present_teleportation_gates: List[str] = [ | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  |             "GateKittyBoss", | 
					
						
							|  |  |  |             "GateLeftLibrary", | 
					
						
							|  |  |  |             "GateMilitaryGate", | 
					
						
							|  |  |  |             "GateSealedCaves", | 
					
						
							|  |  |  |             "GateSealedSirensCave", | 
					
						
							|  |  |  |             "GateLakeDesolation" | 
					
						
							| 
									
										
										
										
											2023-11-22 15:17:33 +01:00
										 |  |  |         ] | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-22 15:17:33 +01:00
										 |  |  |         past_teleportation_gates: List[str] = [ | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  |             "GateLakeSereneRight", | 
					
						
							|  |  |  |             "GateAccessToPast", | 
					
						
							|  |  |  |             "GateCastleRamparts", | 
					
						
							|  |  |  |             "GateCastleKeep", | 
					
						
							|  |  |  |             "GateRoyalTowers", | 
					
						
							|  |  |  |             "GateCavesOfBanishment" | 
					
						
							| 
									
										
										
										
											2023-11-22 15:17:33 +01:00
										 |  |  |         ] | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         ancient_pyramid_teleportation_gates: Tuple[str, ...] = ( | 
					
						
							|  |  |  |             "GateGyre", | 
					
						
							|  |  |  |             "GateLeftPyramid", | 
					
						
							|  |  |  |             "GateRightPyramid" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not is_maw_flooded: | 
					
						
							| 
									
										
										
										
											2023-11-22 15:17:33 +01:00
										 |  |  |             past_teleportation_gates.append("GateMaw") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not is_xarion_flooded: | 
					
						
							|  |  |  |             present_teleportation_gates.append("GateXarion") | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:04 +02:00
										 |  |  |         if options.inverted: | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  |             all_gates: Tuple[str, ...] = present_teleportation_gates | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             all_gates: Tuple[str, ...] = past_teleportation_gates + present_teleportation_gates | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return ( | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:04 +02:00
										 |  |  |             random.choice(all_gates), | 
					
						
							|  |  |  |             random.choice(present_teleportation_gates), | 
					
						
							|  |  |  |             random.choice(past_teleportation_gates), | 
					
						
							|  |  |  |             random.choice(ancient_pyramid_teleportation_gates) | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:04 +02:00
										 |  |  |     def get_flood_weights_overrides(options: TimespinnerOptions) -> 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]]]] = \ | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:04 +02:00
										 |  |  |             options.rising_tides_overrides.value | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:04 +02:00
										 |  |  |         default_weights: Dict[str, Dict[str, int]] = options.rising_tides_overrides.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 | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:04 +02:00
										 |  |  |     def roll_flood_setting(random: Random, all_weights: Dict[str, Union[Dict[str, int], str]], | 
					
						
							|  |  |  |                            key: str) -> Tuple[bool, bool]: | 
					
						
							| 
									
										
										
										
											2023-02-19 21:22:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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): | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:04 +02:00
										 |  |  |             result: str = random.choices(list(weights.keys()), weights=list(map(int, weights.values())))[0] | 
					
						
							| 
									
										
										
										
											2023-02-22 17:11:27 -08:00
										 |  |  |         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 |