BaseClasses: more type annotations (#337)
This commit is contained in:
		
							parent
							
								
									8599506497
								
							
						
					
					
						commit
						8e59761b03
					
				| 
						 | 
					@ -433,7 +433,7 @@ class MultiWorld():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return False
 | 
					        return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def has_beaten_game(self, state, player: Optional[int] = None):
 | 
					    def has_beaten_game(self, state: CollectionState, player: Optional[int] = None):
 | 
				
			||||||
        if player:
 | 
					        if player:
 | 
				
			||||||
            return self.completion_condition[player](state)
 | 
					            return self.completion_condition[player](state)
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
| 
						 | 
					@ -617,7 +617,7 @@ class CollectionState():
 | 
				
			||||||
            ret = function(self, ret)
 | 
					            ret = function(self, ret)
 | 
				
			||||||
        return ret
 | 
					        return ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def can_reach(self, spot, resolution_hint=None, player=None) -> bool:
 | 
					    def can_reach(self, spot: Union[Location, Entrance, Region, str], resolution_hint=None, player=None) -> bool:
 | 
				
			||||||
        if not hasattr(spot, "can_reach"):
 | 
					        if not hasattr(spot, "can_reach"):
 | 
				
			||||||
            # try to resolve a name
 | 
					            # try to resolve a name
 | 
				
			||||||
            if resolution_hint == 'Location':
 | 
					            if resolution_hint == 'Location':
 | 
				
			||||||
| 
						 | 
					@ -629,7 +629,7 @@ class CollectionState():
 | 
				
			||||||
                spot = self.world.get_region(spot, player)
 | 
					                spot = self.world.get_region(spot, player)
 | 
				
			||||||
        return spot.can_reach(self)
 | 
					        return spot.can_reach(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def sweep_for_events(self, key_only: bool = False, locations=None):
 | 
					    def sweep_for_events(self, key_only: bool = False, locations: Set[Location] = None):
 | 
				
			||||||
        if locations is None:
 | 
					        if locations is None:
 | 
				
			||||||
            locations = self.world.get_filled_locations()
 | 
					            locations = self.world.get_filled_locations()
 | 
				
			||||||
        new_locations = True
 | 
					        new_locations = True
 | 
				
			||||||
| 
						 | 
					@ -644,7 +644,7 @@ class CollectionState():
 | 
				
			||||||
                self.events.add(event)
 | 
					                self.events.add(event)
 | 
				
			||||||
                self.collect(event.item, True, event)
 | 
					                self.collect(event.item, True, event)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def has(self, item, player: int, count: int = 1):
 | 
					    def has(self, item: str, player: int, count: int = 1):
 | 
				
			||||||
        return self.prog_items[item, player] >= count
 | 
					        return self.prog_items[item, player] >= count
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def has_all(self, items: Set[str], player: int):
 | 
					    def has_all(self, items: Set[str], player: int):
 | 
				
			||||||
| 
						 | 
					@ -727,7 +727,7 @@ class CollectionState():
 | 
				
			||||||
                basemagic = basemagic + basemagic * self.bottle_count(player)
 | 
					                basemagic = basemagic + basemagic * self.bottle_count(player)
 | 
				
			||||||
        return basemagic >= smallmagic
 | 
					        return basemagic >= smallmagic
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def can_kill_most_things(self, player: int, enemies=5) -> bool:
 | 
					    def can_kill_most_things(self, player: int, enemies: int = 5) -> bool:
 | 
				
			||||||
        return (self.has_melee_weapon(player)
 | 
					        return (self.has_melee_weapon(player)
 | 
				
			||||||
                or self.has('Cane of Somaria', player)
 | 
					                or self.has('Cane of Somaria', player)
 | 
				
			||||||
                or (self.has('Cane of Byrna', player) and (enemies < 6 or self.can_extend_magic(player)))
 | 
					                or (self.has('Cane of Byrna', player) and (enemies < 6 or self.can_extend_magic(player)))
 | 
				
			||||||
| 
						 | 
					@ -802,26 +802,26 @@ class CollectionState():
 | 
				
			||||||
    def has_turtle_rock_medallion(self, player: int) -> bool:
 | 
					    def has_turtle_rock_medallion(self, player: int) -> bool:
 | 
				
			||||||
        return self.has(self.world.required_medallions[player][1], player)
 | 
					        return self.has(self.world.required_medallions[player][1], player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def can_boots_clip_lw(self, player: int):
 | 
					    def can_boots_clip_lw(self, player: int) -> bool:
 | 
				
			||||||
        if self.world.mode[player] == 'inverted':
 | 
					        if self.world.mode[player] == 'inverted':
 | 
				
			||||||
            return self.has('Pegasus Boots', player) and self.has('Moon Pearl', player)
 | 
					            return self.has('Pegasus Boots', player) and self.has('Moon Pearl', player)
 | 
				
			||||||
        return self.has('Pegasus Boots', player)
 | 
					        return self.has('Pegasus Boots', player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def can_boots_clip_dw(self, player: int):
 | 
					    def can_boots_clip_dw(self, player: int) -> bool:
 | 
				
			||||||
        if self.world.mode[player] != 'inverted':
 | 
					        if self.world.mode[player] != 'inverted':
 | 
				
			||||||
            return self.has('Pegasus Boots', player) and self.has('Moon Pearl', player)
 | 
					            return self.has('Pegasus Boots', player) and self.has('Moon Pearl', player)
 | 
				
			||||||
        return self.has('Pegasus Boots', player)
 | 
					        return self.has('Pegasus Boots', player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def can_get_glitched_speed_lw(self, player: int):
 | 
					    def can_get_glitched_speed_lw(self, player: int) -> bool:
 | 
				
			||||||
        rules = [self.has('Pegasus Boots', player), any([self.has('Hookshot', player), self.has_sword(player)])]
 | 
					        rules = [self.has('Pegasus Boots', player), any([self.has('Hookshot', player), self.has_sword(player)])]
 | 
				
			||||||
        if self.world.mode[player] == 'inverted':
 | 
					        if self.world.mode[player] == 'inverted':
 | 
				
			||||||
            rules.append(self.has('Moon Pearl', player))
 | 
					            rules.append(self.has('Moon Pearl', player))
 | 
				
			||||||
        return all(rules)
 | 
					        return all(rules)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def can_superbunny_mirror_with_sword(self, player: int):
 | 
					    def can_superbunny_mirror_with_sword(self, player: int) -> bool:
 | 
				
			||||||
        return self.has('Magic Mirror', player) and self.has_sword(player)
 | 
					        return self.has('Magic Mirror', player) and self.has_sword(player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def can_get_glitched_speed_dw(self, player: int):
 | 
					    def can_get_glitched_speed_dw(self, player: int) -> bool:
 | 
				
			||||||
        rules = [self.has('Pegasus Boots', player), any([self.has('Hookshot', player), self.has_sword(player)])]
 | 
					        rules = [self.has('Pegasus Boots', player), any([self.has('Hookshot', player), self.has_sword(player)])]
 | 
				
			||||||
        if self.world.mode[player] != 'inverted':
 | 
					        if self.world.mode[player] != 'inverted':
 | 
				
			||||||
            rules.append(self.has('Moon Pearl', player))
 | 
					            rules.append(self.has('Moon Pearl', player))
 | 
				
			||||||
| 
						 | 
					@ -887,7 +887,7 @@ class Region:
 | 
				
			||||||
    is_light_world: bool = False
 | 
					    is_light_world: bool = False
 | 
				
			||||||
    is_dark_world: bool = False
 | 
					    is_dark_world: bool = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, name: str, type_: RegionType, hint, player: int, world: Optional[MultiWorld] = None):
 | 
					    def __init__(self, name: str, type_: RegionType, hint: str, player: int, world: Optional[MultiWorld] = None):
 | 
				
			||||||
        self.name = name
 | 
					        self.name = name
 | 
				
			||||||
        self.type = type_
 | 
					        self.type = type_
 | 
				
			||||||
        self.entrances = []
 | 
					        self.entrances = []
 | 
				
			||||||
| 
						 | 
					@ -928,7 +928,7 @@ class Entrance:
 | 
				
			||||||
    addresses = None
 | 
					    addresses = None
 | 
				
			||||||
    target = None
 | 
					    target = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, player: int, name: str = '', parent=None):
 | 
					    def __init__(self, player: int, name: str = '', parent: Region = None):
 | 
				
			||||||
        self.name = name
 | 
					        self.name = name
 | 
				
			||||||
        self.parent_region = parent
 | 
					        self.parent_region = parent
 | 
				
			||||||
        self.player = player
 | 
					        self.player = player
 | 
				
			||||||
| 
						 | 
					@ -956,7 +956,8 @@ class Entrance:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Dungeon(object):
 | 
					class Dungeon(object):
 | 
				
			||||||
    def __init__(self, name: str, regions, big_key, small_keys, dungeon_items, player: int):
 | 
					    def __init__(self, name: str, regions: List[Region], big_key: Item, small_keys: List[Item],
 | 
				
			||||||
 | 
					                 dungeon_items: List[Item], player: int):
 | 
				
			||||||
        self.name = name
 | 
					        self.name = name
 | 
				
			||||||
        self.regions = regions
 | 
					        self.regions = regions
 | 
				
			||||||
        self.big_key = big_key
 | 
					        self.big_key = big_key
 | 
				
			||||||
| 
						 | 
					@ -975,11 +976,11 @@ class Dungeon(object):
 | 
				
			||||||
        self.bosses[None] = value
 | 
					        self.bosses[None] = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def keys(self):
 | 
					    def keys(self) -> List[Item]:
 | 
				
			||||||
        return self.small_keys + ([self.big_key] if self.big_key else [])
 | 
					        return self.small_keys + ([self.big_key] if self.big_key else [])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def all_items(self):
 | 
					    def all_items(self) -> List[Item]:
 | 
				
			||||||
        return self.dungeon_items + self.keys
 | 
					        return self.dungeon_items + self.keys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def is_dungeon_item(self, item: Item) -> bool:
 | 
					    def is_dungeon_item(self, item: Item) -> bool:
 | 
				
			||||||
| 
						 | 
					@ -998,7 +999,7 @@ class Dungeon(object):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Boss():
 | 
					class Boss():
 | 
				
			||||||
    def __init__(self, name: str, enemizer_name: str, defeat_rule, player: int):
 | 
					    def __init__(self, name: str, enemizer_name: str, defeat_rule: Callable, player: int):
 | 
				
			||||||
        self.name = name
 | 
					        self.name = name
 | 
				
			||||||
        self.enemizer_name = enemizer_name
 | 
					        self.enemizer_name = enemizer_name
 | 
				
			||||||
        self.defeat_rule = defeat_rule
 | 
					        self.defeat_rule = defeat_rule
 | 
				
			||||||
| 
						 | 
					@ -1066,7 +1067,7 @@ class Location:
 | 
				
			||||||
    def __hash__(self):
 | 
					    def __hash__(self):
 | 
				
			||||||
        return hash((self.name, self.player))
 | 
					        return hash((self.name, self.player))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __lt__(self, other):
 | 
					    def __lt__(self, other: Location):
 | 
				
			||||||
        return (self.player, self.name) < (other.player, other.name)
 | 
					        return (self.player, self.name) < (other.player, other.name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
| 
						 | 
					@ -1075,7 +1076,7 @@ class Location:
 | 
				
			||||||
        return self.item and self.item.game == self.game
 | 
					        return self.item and self.item.game == self.game
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def hint_text(self):
 | 
					    def hint_text(self) -> str:
 | 
				
			||||||
        hint_text = getattr(self, "_hint_text", None)
 | 
					        hint_text = getattr(self, "_hint_text", None)
 | 
				
			||||||
        if hint_text:
 | 
					        if hint_text:
 | 
				
			||||||
            return hint_text
 | 
					            return hint_text
 | 
				
			||||||
| 
						 | 
					@ -1130,7 +1131,7 @@ class Item():
 | 
				
			||||||
    def __eq__(self, other):
 | 
					    def __eq__(self, other):
 | 
				
			||||||
        return self.name == other.name and self.player == other.player
 | 
					        return self.name == other.name and self.player == other.player
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __lt__(self, other):
 | 
					    def __lt__(self, other: Item):
 | 
				
			||||||
        if other.player != self.player:
 | 
					        if other.player != self.player:
 | 
				
			||||||
            return other.player < self.player
 | 
					            return other.player < self.player
 | 
				
			||||||
        return self.name < other.name
 | 
					        return self.name < other.name
 | 
				
			||||||
| 
						 | 
					@ -1161,13 +1162,13 @@ class Spoiler():
 | 
				
			||||||
        self.shops = []
 | 
					        self.shops = []
 | 
				
			||||||
        self.bosses = OrderedDict()
 | 
					        self.bosses = OrderedDict()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def set_entrance(self, entrance, exit, direction, player):
 | 
					    def set_entrance(self, entrance: str, exit_: str, direction: str, player: int):
 | 
				
			||||||
        if self.world.players == 1:
 | 
					        if self.world.players == 1:
 | 
				
			||||||
            self.entrances[(entrance, direction, player)] = OrderedDict(
 | 
					            self.entrances[(entrance, direction, player)] = OrderedDict(
 | 
				
			||||||
                [('entrance', entrance), ('exit', exit), ('direction', direction)])
 | 
					                [('entrance', entrance), ('exit', exit_), ('direction', direction)])
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            self.entrances[(entrance, direction, player)] = OrderedDict(
 | 
					            self.entrances[(entrance, direction, player)] = OrderedDict(
 | 
				
			||||||
                [('player', player), ('entrance', entrance), ('exit', exit), ('direction', direction)])
 | 
					                [('player', player), ('entrance', entrance), ('exit', exit_), ('direction', direction)])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def parse_data(self):
 | 
					    def parse_data(self):
 | 
				
			||||||
        self.medallions = OrderedDict()
 | 
					        self.medallions = OrderedDict()
 | 
				
			||||||
| 
						 | 
					@ -1296,7 +1297,7 @@ class Spoiler():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return json.dumps(out)
 | 
					        return json.dumps(out)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def to_file(self, filename):
 | 
					    def to_file(self, filename: str):
 | 
				
			||||||
        self.parse_data()
 | 
					        self.parse_data()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def bool_to_text(variable: Union[bool, str]) -> str:
 | 
					        def bool_to_text(variable: Union[bool, str]) -> str:
 | 
				
			||||||
| 
						 | 
					@ -1427,7 +1428,7 @@ class Spoiler():
 | 
				
			||||||
seeddigits = 20
 | 
					seeddigits = 20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_seed(seed=None):
 | 
					def get_seed(seed=None) -> int:
 | 
				
			||||||
    if seed is None:
 | 
					    if seed is None:
 | 
				
			||||||
        random.seed(None)
 | 
					        random.seed(None)
 | 
				
			||||||
        return random.randint(0, pow(10, seeddigits) - 1)
 | 
					        return random.randint(0, pow(10, seeddigits) - 1)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue