2021-07-12 13:11:48 +00:00
|
|
|
"""Module extending BaseClasses.py for aLttP"""
|
2023-05-20 17:57:48 +00:00
|
|
|
from typing import Optional, TYPE_CHECKING
|
2023-02-14 00:06:43 +00:00
|
|
|
from enum import IntEnum
|
2021-07-12 13:11:48 +00:00
|
|
|
|
2023-02-14 00:06:43 +00:00
|
|
|
from BaseClasses import Location, Item, ItemClassification, Region, MultiWorld
|
2021-07-12 13:11:48 +00:00
|
|
|
|
2023-05-20 17:57:48 +00:00
|
|
|
if TYPE_CHECKING:
|
|
|
|
from .Dungeons import Dungeon
|
|
|
|
from .Regions import LTTPRegion
|
|
|
|
|
2023-04-26 08:48:08 +00:00
|
|
|
|
2021-07-12 13:11:48 +00:00
|
|
|
class ALttPLocation(Location):
|
|
|
|
game: str = "A Link to the Past"
|
2022-08-04 12:10:58 +00:00
|
|
|
crystal: bool
|
|
|
|
player_address: Optional[int]
|
|
|
|
_hint_text: Optional[str]
|
2024-02-20 00:07:49 +00:00
|
|
|
shop: None
|
2022-08-04 12:10:58 +00: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-20 00:07:49 +00:00
|
|
|
shop_price = 0
|
|
|
|
shop_price_type = None
|
2023-05-20 17:57:48 +00:00
|
|
|
parent_region: "LTTPRegion"
|
2021-07-12 13:11:48 +00:00
|
|
|
|
2022-08-04 12:10:58 +00: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 13:11:48 +00:00
|
|
|
super(ALttPLocation, self).__init__(player, name, address, parent)
|
|
|
|
self.crystal = crystal
|
|
|
|
self.player_address = player_address
|
2022-08-04 12:10:58 +00:00
|
|
|
self._hint_text = hint_text
|
2021-07-12 13:11:48 +00:00
|
|
|
|
2024-01-16 16:23:18 +00: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 13:11:48 +00:00
|
|
|
|
|
|
|
class ALttPItem(Item):
|
|
|
|
game: str = "A Link to the Past"
|
2022-08-05 22:49:54 +00:00
|
|
|
type: Optional[str]
|
|
|
|
_pedestal_hint_text: Optional[str]
|
|
|
|
_hint_text: Optional[str]
|
2021-08-30 14:31:56 +00:00
|
|
|
dungeon = None
|
2021-07-12 13:11:48 +00:00
|
|
|
|
2022-08-05 22:49:54 +00:00
|
|
|
def __init__(self, name, player, classification=ItemClassification.filler, type=None, item_code=None,
|
|
|
|
pedestal_hint=None, hint_text=None):
|
2022-06-17 01:23:27 +00:00
|
|
|
super(ALttPItem, self).__init__(name, classification, item_code, player)
|
2021-07-12 13:11:48 +00:00
|
|
|
self.type = type
|
|
|
|
self._pedestal_hint_text = pedestal_hint
|
2021-08-28 10:56:52 +00: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 14:31:56 +00:00
|
|
|
if self.type in {"SmallKey", "BigKey", "Map", "Compass"}:
|
2021-08-28 10:56:52 +00:00
|
|
|
return self.type
|
|
|
|
|
|
|
|
@property
|
2021-08-30 14:31:56 +00:00
|
|
|
def locked_dungeon_item(self):
|
2023-02-14 00:06:43 +00:00
|
|
|
return self.location.locked and self.dungeon_item
|
|
|
|
|
|
|
|
|
|
|
|
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):
|
|
|
|
type: LTTPRegionType
|
|
|
|
|
2023-03-04 07:23:52 +00:00
|
|
|
# will be set after making connections.
|
|
|
|
is_light_world: bool = False
|
|
|
|
is_dark_world: bool = False
|
|
|
|
|
|
|
|
shop: Optional = None
|
2023-05-20 17:57:48 +00:00
|
|
|
dungeon: Optional["Dungeon"] = None
|
2023-03-04 07:23:52 +00:00
|
|
|
|
2023-02-14 00:06:43 +00: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
|