| 
									
										
										
										
											2021-07-12 15:11:48 +02:00
										 |  |  | """Module extending BaseClasses.py for aLttP""" | 
					
						
							| 
									
										
										
										
											2023-05-20 19:57:48 +02:00
										 |  |  | from typing import Optional, TYPE_CHECKING | 
					
						
							| 
									
										
										
										
											2023-02-13 18:06:43 -06:00
										 |  |  | from enum import IntEnum | 
					
						
							| 
									
										
										
										
											2021-07-12 15:11:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-18 16:34:34 -05:00
										 |  |  | from BaseClasses import Entrance, Location, Item, ItemClassification, Region, MultiWorld | 
					
						
							| 
									
										
										
										
											2021-07-12 15:11:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-20 19:57:48 +02:00
										 |  |  | if TYPE_CHECKING: | 
					
						
							|  |  |  |     from .Dungeons import Dungeon | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 10:48:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-12 15:11:48 +02:00
										 |  |  | class ALttPLocation(Location): | 
					
						
							|  |  |  |     game: str = "A Link to the Past" | 
					
						
							| 
									
										
										
										
											2022-08-04 14:10:58 +02:00
										 |  |  |     crystal: bool | 
					
						
							|  |  |  |     player_address: Optional[int] | 
					
						
							|  |  |  |     _hint_text: Optional[str] | 
					
						
							| 
									
										
										
										
											2024-02-19 19:07:49 -05:00
										 |  |  |     shop: None | 
					
						
							| 
									
										
										
										
											2022-08-04 14:10:58 +02:00
										 |  |  |     shop_slot: Optional[int] = None | 
					
						
							|  |  |  |     """If given as integer, shop_slot is the shop's inventory index.""" | 
					
						
							|  |  |  |     shop_slot_disabled: bool = False | 
					
						
							| 
									
										
										
										
											2024-02-19 19:07:49 -05:00
										 |  |  |     shop_price = 0 | 
					
						
							|  |  |  |     shop_price_type = None | 
					
						
							| 
									
										
										
										
											2023-05-20 19:57:48 +02:00
										 |  |  |     parent_region: "LTTPRegion" | 
					
						
							| 
									
										
										
										
											2021-07-12 15:11:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 14:10:58 +02:00
										 |  |  |     def __init__(self, player: int, name: str, address: Optional[int] = None, crystal: bool = False, | 
					
						
							|  |  |  |                  hint_text: Optional[str] = None, parent=None, player_address: Optional[int] = None): | 
					
						
							| 
									
										
										
										
											2021-07-12 15:11:48 +02:00
										 |  |  |         super(ALttPLocation, self).__init__(player, name, address, parent) | 
					
						
							|  |  |  |         self.crystal = crystal | 
					
						
							|  |  |  |         self.player_address = player_address | 
					
						
							| 
									
										
										
										
											2022-08-04 14:10:58 +02:00
										 |  |  |         self._hint_text = hint_text | 
					
						
							| 
									
										
										
										
											2021-07-12 15:11:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-16 17:23:18 +01:00
										 |  |  |     @property | 
					
						
							|  |  |  |     def hint_text(self) -> str: | 
					
						
							|  |  |  |         hint_text = getattr(self, "_hint_text", None) | 
					
						
							|  |  |  |         if hint_text: | 
					
						
							|  |  |  |             return hint_text | 
					
						
							|  |  |  |         return "at " + self.name.replace("_", " ").replace("-", " ") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-12 15:11:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ALttPItem(Item): | 
					
						
							|  |  |  |     game: str = "A Link to the Past" | 
					
						
							| 
									
										
										
										
											2022-08-06 00:49:54 +02:00
										 |  |  |     type: Optional[str] | 
					
						
							|  |  |  |     _pedestal_hint_text: Optional[str] | 
					
						
							|  |  |  |     _hint_text: Optional[str] | 
					
						
							| 
									
										
										
										
											2021-08-30 16:31:56 +02:00
										 |  |  |     dungeon = None | 
					
						
							| 
									
										
										
										
											2021-07-12 15:11:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-06 00:49:54 +02:00
										 |  |  |     def __init__(self, name, player, classification=ItemClassification.filler, type=None, item_code=None, | 
					
						
							|  |  |  |                  pedestal_hint=None, hint_text=None): | 
					
						
							| 
									
										
										
										
											2022-06-17 03:23:27 +02:00
										 |  |  |         super(ALttPItem, self).__init__(name, classification, item_code, player) | 
					
						
							| 
									
										
										
										
											2021-07-12 15:11:48 +02:00
										 |  |  |         self.type = type | 
					
						
							|  |  |  |         self._pedestal_hint_text = pedestal_hint | 
					
						
							| 
									
										
										
										
											2021-08-28 12:56:52 +02:00
										 |  |  |         self._hint_text = hint_text | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def crystal(self) -> bool: | 
					
						
							|  |  |  |         return self.type == 'Crystal' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def smallkey(self) -> bool: | 
					
						
							|  |  |  |         return self.type == 'SmallKey' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def bigkey(self) -> bool: | 
					
						
							|  |  |  |         return self.type == 'BigKey' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def map(self) -> bool: | 
					
						
							|  |  |  |         return self.type == 'Map' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def compass(self) -> bool: | 
					
						
							|  |  |  |         return self.type == 'Compass' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def dungeon_item(self) -> Optional[str]: | 
					
						
							| 
									
										
										
										
											2021-08-30 16:31:56 +02:00
										 |  |  |         if self.type in {"SmallKey", "BigKey", "Map", "Compass"}: | 
					
						
							| 
									
										
										
										
											2021-08-28 12:56:52 +02:00
										 |  |  |             return self.type | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-13 18:06:43 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-18 16:34:34 -05:00
										 |  |  | Addresses = int | list[int] | tuple[int, int, int, int, int, int, int, int, int, int, int, int, int] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class LTTPEntrance(Entrance): | 
					
						
							|  |  |  |     addresses: Addresses | None = None | 
					
						
							|  |  |  |     target: int | None = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def connect(self, region: Region, addresses: Addresses | None = None, target: int | None = None) -> None: | 
					
						
							|  |  |  |         super().connect(region) | 
					
						
							|  |  |  |         self.addresses = addresses | 
					
						
							|  |  |  |         self.target = target | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-13 18:06:43 -06:00
										 |  |  | class LTTPRegionType(IntEnum): | 
					
						
							|  |  |  |     LightWorld = 1 | 
					
						
							|  |  |  |     DarkWorld = 2 | 
					
						
							|  |  |  |     Cave = 3  # also houses | 
					
						
							|  |  |  |     Dungeon = 4 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def is_indoors(self) -> bool: | 
					
						
							|  |  |  |         """Shorthand for checking if Cave or Dungeon""" | 
					
						
							|  |  |  |         return self in (LTTPRegionType.Cave, LTTPRegionType.Dungeon) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class LTTPRegion(Region): | 
					
						
							| 
									
										
										
										
											2025-04-18 16:34:34 -05:00
										 |  |  |     entrance_type = LTTPEntrance | 
					
						
							| 
									
										
										
										
											2023-02-13 18:06:43 -06:00
										 |  |  |     type: LTTPRegionType | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-03 23:23:52 -08:00
										 |  |  |     # will be set after making connections. | 
					
						
							|  |  |  |     is_light_world: bool = False | 
					
						
							|  |  |  |     is_dark_world: bool = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     shop: Optional = None | 
					
						
							| 
									
										
										
										
											2023-05-20 19:57:48 +02:00
										 |  |  |     dungeon: Optional["Dungeon"] = None | 
					
						
							| 
									
										
										
										
											2023-03-03 23:23:52 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-13 18:06:43 -06:00
										 |  |  |     def __init__(self, name: str, type_: LTTPRegionType, hint: str, player: int, multiworld: MultiWorld): | 
					
						
							|  |  |  |         super().__init__(name, player, multiworld, hint) | 
					
						
							|  |  |  |         self.type = type_ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def get_entrance(self): | 
					
						
							|  |  |  |         for entrance in self.entrances: | 
					
						
							|  |  |  |             if entrance.parent_region.type in (LTTPRegionType.DarkWorld, LTTPRegionType.LightWorld): | 
					
						
							|  |  |  |                 return entrance | 
					
						
							|  |  |  |         for entrance in self.entrances: | 
					
						
							|  |  |  |             return entrance.parent_region.get_entrance |