Logic updates to Spike Cave, Bosses
Fix Bomb rules to exclude Spectacle Rock Cave for inverted Require a weapon for Castle Tower kill rooms
This commit is contained in:
@@ -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.
|
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
|
basemagic = 8
|
||||||
if self.has('Quarter Magic', player):
|
if self.has('Magic Upgrade (1/4)', player):
|
||||||
basemagic = 32
|
basemagic = 32
|
||||||
elif self.has('Half Magic', player):
|
elif self.has('Magic Upgrade (1/2)', player):
|
||||||
basemagic = 16
|
basemagic = 16
|
||||||
if self.can_buy_unlimited('Green Potion', player) or self.can_buy_unlimited('Blue Potion', player):
|
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:
|
if self.world.difficulty_adjustments[player] == 'hard' and not fullrefill:
|
||||||
@@ -634,9 +634,8 @@ class CollectionState(object):
|
|||||||
|
|
||||||
def can_shoot_arrows(self, player):
|
def can_shoot_arrows(self, player):
|
||||||
if self.world.retro[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)
|
#todo: Non-progressive silvers grant wooden arrows, but progressive bows do not. Always require shop arrows to be safe
|
||||||
#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.can_buy_unlimited('Single Arrow', player)
|
||||||
return self.has('Bow', player) and (self.has('Silver Arrows', player) or self.can_buy_unlimited('Single Arrow', player))
|
|
||||||
return self.has('Bow', player)
|
return self.has('Bow', player)
|
||||||
|
|
||||||
def can_get_good_bee(self, player):
|
def can_get_good_bee(self, player):
|
||||||
@@ -756,10 +755,10 @@ class CollectionState(object):
|
|||||||
if self.has('Red Mail', item.player):
|
if self.has('Red Mail', item.player):
|
||||||
pass
|
pass
|
||||||
elif self.has('Blue Mail', item.player):
|
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
|
changed = True
|
||||||
else:
|
else:
|
||||||
self.prog_items.add(('Blue Mail', item.player))
|
self.prog_items['Blue Mail', item.player] += 1
|
||||||
changed = True
|
changed = True
|
||||||
|
|
||||||
elif item.name.startswith('Bottle'):
|
elif item.name.startswith('Bottle'):
|
||||||
|
|||||||
12
Bosses.py
12
Bosses.py
@@ -18,6 +18,7 @@ def ArmosKnightsDefeatRule(state, player):
|
|||||||
# Magic amounts are probably a bit overkill
|
# Magic amounts are probably a bit overkill
|
||||||
return (
|
return (
|
||||||
state.has_blunt_weapon(player) or
|
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 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('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
|
(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))
|
state.has('Red Boomerang', player))
|
||||||
|
|
||||||
def LanmolasDefeatRule(state, player):
|
def LanmolasDefeatRule(state, player):
|
||||||
# TODO: Allow the canes here?
|
|
||||||
return (
|
return (
|
||||||
state.has_blunt_weapon(player) or
|
state.has_blunt_weapon(player) or
|
||||||
state.has('Fire Rod', player) or
|
state.has('Fire Rod', player) or
|
||||||
state.has('Ice 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))
|
state.can_shoot_arrows(player))
|
||||||
|
|
||||||
def MoldormDefeatRule(state, player):
|
def MoldormDefeatRule(state, player):
|
||||||
return state.has_blunt_weapon(player)
|
return state.has_blunt_weapon(player)
|
||||||
|
|
||||||
def HelmasaurKingDefeatRule(state, 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):
|
def ArrghusDefeatRule(state, player):
|
||||||
if not state.has('Hookshot', player):
|
if not state.has('Hookshot', player):
|
||||||
@@ -95,7 +97,11 @@ def VitreousDefeatRule(state, player):
|
|||||||
def TrinexxDefeatRule(state, player):
|
def TrinexxDefeatRule(state, player):
|
||||||
if not (state.has('Fire Rod', player) and state.has('Ice Rod', player)):
|
if not (state.has('Fire Rod', player) and state.has('Ice Rod', player)):
|
||||||
return False
|
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):
|
def AgahnimDefeatRule(state, player):
|
||||||
return state.has_sword(player) or state.has('Hammer', player) or state.has('Bug Catching Net', player)
|
return state.has_sword(player) or state.has('Hammer', player) or state.has('Bug Catching Net', player)
|
||||||
|
|||||||
@@ -2304,6 +2304,8 @@ Bomb_Shop_Multi_Cave_Doors = ['Hyrule Castle Entrance (South)',
|
|||||||
'Death Mountain Return Cave (East)',
|
'Death Mountain Return Cave (East)',
|
||||||
'Death Mountain Return Cave (West)',
|
'Death Mountain Return Cave (West)',
|
||||||
'Spectacle Rock Cave Peak',
|
'Spectacle Rock Cave Peak',
|
||||||
|
'Spectacle Rock Cave',
|
||||||
|
'Spectacle Rock Cave (Bottom)',
|
||||||
'Paradox Cave (Bottom)',
|
'Paradox Cave (Bottom)',
|
||||||
'Paradox Cave (Middle)',
|
'Paradox Cave (Middle)',
|
||||||
'Paradox Cave (Top)',
|
'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 (East)',
|
||||||
'Death Mountain Return Cave (West)',
|
'Death Mountain Return Cave (West)',
|
||||||
'Spectacle Rock Cave Peak',
|
'Spectacle Rock Cave Peak',
|
||||||
'Spectacle Rock Cave',
|
|
||||||
'Spectacle Rock Cave (Bottom)',
|
|
||||||
'Paradox Cave (Bottom)',
|
'Paradox Cave (Bottom)',
|
||||||
'Paradox Cave (Middle)',
|
'Paradox Cave (Middle)',
|
||||||
'Paradox Cave (Top)',
|
'Paradox Cave (Top)',
|
||||||
|
|||||||
15
Rules.py
15
Rules.py
@@ -1,10 +1,10 @@
|
|||||||
import logging
|
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 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):
|
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 - Boss', player))
|
||||||
set_defeat_dungeon_boss_rule(world.get_location('Tower of Hera - Prize', 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_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))
|
set_defeat_dungeon_boss_rule(world.get_location('Agahnim 1', player))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user