From 0700af4dbd9cd786468ffb6cfbb65af0242d025d Mon Sep 17 00:00:00 2001 From: compiling <8335770+compiling@users.noreply.github.com> Date: Tue, 12 May 2020 20:38:58 +1000 Subject: [PATCH] Logic updates to Spike Cave, Bosses Fix Bomb rules to exclude Spectacle Rock Cave for inverted Require a weapon for Castle Tower kill rooms --- BaseClasses.py | 13 ++++++------- Bosses.py | 12 +++++++++--- EntranceShuffle.py | 4 ++-- Rules.py | 15 +++++++++++---- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 0b5f0da3..20f31d8e 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -611,9 +611,9 @@ class CollectionState(object): def can_extend_magic(self, player, smallmagic=16, fullrefill=False): #This reflects the total magic Link has, not the total extra he has. basemagic = 8 - if self.has('Quarter Magic', player): + if self.has('Magic Upgrade (1/4)', player): basemagic = 32 - elif self.has('Half Magic', player): + elif self.has('Magic Upgrade (1/2)', player): basemagic = 16 if self.can_buy_unlimited('Green Potion', player) or self.can_buy_unlimited('Blue Potion', player): if self.world.difficulty_adjustments[player] == 'hard' and not fullrefill: @@ -634,9 +634,8 @@ class CollectionState(object): def can_shoot_arrows(self, player): if self.world.retro[player]: - #TODO: need to decide how we want to handle wooden arrows longer-term (a can-buy-a check, or via dynamic shop location) - #FIXME: Should do something about hard+ ganon only silvers. For the moment, i believe they effective grant wooden, so we are safe - return self.has('Bow', player) and (self.has('Silver Arrows', player) or self.can_buy_unlimited('Single Arrow', player)) + #todo: Non-progressive silvers grant wooden arrows, but progressive bows do not. Always require shop arrows to be safe + return self.has('Bow', player) and self.can_buy_unlimited('Single Arrow', player) return self.has('Bow', player) def can_get_good_bee(self, player): @@ -756,10 +755,10 @@ class CollectionState(object): if self.has('Red Mail', item.player): pass elif self.has('Blue Mail', item.player): - self.prog_items.add(('Red Mail', item.player)) + self.prog_items['Red Mail', item.player] += 1 changed = True else: - self.prog_items.add(('Blue Mail', item.player)) + self.prog_items['Blue Mail', item.player] += 1 changed = True elif item.name.startswith('Bottle'): diff --git a/Bosses.py b/Bosses.py index ea02b8ba..eb139950 100644 --- a/Bosses.py +++ b/Bosses.py @@ -18,6 +18,7 @@ def ArmosKnightsDefeatRule(state, player): # Magic amounts are probably a bit overkill return ( state.has_blunt_weapon(player) or + state.can_shoot_arrows(player) or (state.has('Cane of Somaria', player) and state.can_extend_magic(player, 10)) or (state.has('Cane of Byrna', player) and state.can_extend_magic(player, 16)) or (state.has('Ice Rod', player) and state.can_extend_magic(player, 32)) or @@ -26,18 +27,19 @@ def ArmosKnightsDefeatRule(state, player): state.has('Red Boomerang', player)) def LanmolasDefeatRule(state, player): - # TODO: Allow the canes here? return ( state.has_blunt_weapon(player) or state.has('Fire Rod', player) or state.has('Ice Rod', player) or + state.has('Cane of Somaria', player) or + state.has('Cane of Byrna', player) or state.can_shoot_arrows(player)) def MoldormDefeatRule(state, player): return state.has_blunt_weapon(player) def HelmasaurKingDefeatRule(state, player): - return state.has_blunt_weapon(player) or state.can_shoot_arrows(player) + return state.has_sword(player) or state.can_shoot_arrows(player) def ArrghusDefeatRule(state, player): if not state.has('Hookshot', player): @@ -95,7 +97,11 @@ def VitreousDefeatRule(state, player): def TrinexxDefeatRule(state, player): if not (state.has('Fire Rod', player) and state.has('Ice Rod', player)): return False - return state.has('Hammer', player) or state.has_beam_sword(player) or (state.has_sword(player) and state.can_extend_magic(player, 32)) + return (state.has('Hammer', player) or + state.has('Golden Sword', player) or + state.has('Tempered Sword', player) or + (state.has('Master Sword', player) and state.can_extend_magic(player, 16)) or + (state.has_sword(player) and state.can_extend_magic(player, 32))) def AgahnimDefeatRule(state, player): return state.has_sword(player) or state.has('Hammer', player) or state.has('Bug Catching Net', player) diff --git a/EntranceShuffle.py b/EntranceShuffle.py index 30e50f04..c5424820 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -2304,6 +2304,8 @@ Bomb_Shop_Multi_Cave_Doors = ['Hyrule Castle Entrance (South)', 'Death Mountain Return Cave (East)', 'Death Mountain Return Cave (West)', 'Spectacle Rock Cave Peak', + 'Spectacle Rock Cave', + 'Spectacle Rock Cave (Bottom)', 'Paradox Cave (Bottom)', 'Paradox Cave (Middle)', 'Paradox Cave (Top)', @@ -2644,8 +2646,6 @@ Inverted_Bomb_Shop_Multi_Cave_Doors = ['Hyrule Castle Entrance (South)', 'Death Mountain Return Cave (East)', 'Death Mountain Return Cave (West)', 'Spectacle Rock Cave Peak', - 'Spectacle Rock Cave', - 'Spectacle Rock Cave (Bottom)', 'Paradox Cave (Bottom)', 'Paradox Cave (Middle)', 'Paradox Cave (Top)', diff --git a/Rules.py b/Rules.py index 63f8bec2..7eadbdda 100644 --- a/Rules.py +++ b/Rules.py @@ -1,10 +1,10 @@ import logging -from BaseClasses import CollectionState, RegionType, DoorType -from Regions import key_only_locations -from Items import ItemFactory -from RoomData import DoorKind from collections import deque +from BaseClasses import CollectionState, RegionType, DoorType, Entrance +from Regions import key_only_locations +from RoomData import DoorKind + def set_rules(world, player): @@ -162,6 +162,13 @@ def global_rules(world, player): set_defeat_dungeon_boss_rule(world.get_location('Tower of Hera - Boss', player)) set_defeat_dungeon_boss_rule(world.get_location('Tower of Hera - Prize', player)) + # Castle Tower + set_rule(world.get_entrance('Tower Gold Knights SW', player), lambda state: state.can_kill_most_things(player)) + set_rule(world.get_entrance('Tower Gold Knights EN', player), lambda state: state.can_kill_most_things(player)) + set_rule(world.get_entrance('Tower Dark Archers WN', player), lambda state: state.can_kill_most_things(player)) + set_rule(world.get_entrance('Tower Red Spears WN', player), lambda state: state.can_kill_most_things(player)) + set_rule(world.get_entrance('Tower Red Guards EN', player), lambda state: state.can_kill_most_things(player)) + set_rule(world.get_entrance('Tower Red Guards SW', player), lambda state: state.can_kill_most_things(player)) set_rule(world.get_entrance('Tower Altar NW', player), lambda state: state.has_sword(player)) set_defeat_dungeon_boss_rule(world.get_location('Agahnim 1', player))