Merge branch 'KrisDavie-hmg_logic' into DoorDevVolatile
This commit is contained in:
@@ -133,7 +133,7 @@ class World(object):
|
||||
set_player_attr('can_access_trock_front', None)
|
||||
set_player_attr('can_access_trock_big_chest', None)
|
||||
set_player_attr('can_access_trock_middle', None)
|
||||
set_player_attr('fix_fake_world', logic[player] not in ['owglitches', 'nologic']
|
||||
set_player_attr('fix_fake_world', logic[player] not in ['owglitches', 'hybridglitches', 'nologic']
|
||||
or shuffle[player] in ['lean', 'swapped', 'crossed', 'insanity'])
|
||||
set_player_attr('mapshuffle', False)
|
||||
set_player_attr('compassshuffle', False)
|
||||
@@ -603,6 +603,42 @@ class CollectionState(object):
|
||||
self.placing_items = None
|
||||
# self.trace = None
|
||||
|
||||
def can_reach_from(self, spot, start, player=None):
|
||||
old_state = self.copy()
|
||||
# old_state.path = {old_state.world.get_region(start, player)}
|
||||
old_state.stale[player] = False
|
||||
old_state.reachable_regions[player] = dict()
|
||||
old_state.blocked_connections[player] = dict()
|
||||
rrp = old_state.reachable_regions[player]
|
||||
bc = old_state.blocked_connections[player]
|
||||
|
||||
# init on first call - this can't be done on construction since the regions don't exist yet
|
||||
start = self.world.get_region(start, player)
|
||||
if start in self.reachable_regions[player]:
|
||||
rrp[start] = self.reachable_regions[player][start]
|
||||
for conn in start.exits:
|
||||
bc[conn] = self.blocked_connections[player][conn]
|
||||
else:
|
||||
rrp[start] = CrystalBarrier.Orange
|
||||
for conn in start.exits:
|
||||
bc[conn] = CrystalBarrier.Orange
|
||||
|
||||
queue = deque(old_state.blocked_connections[player].items())
|
||||
|
||||
old_state.traverse_world(queue, rrp, bc, player)
|
||||
if old_state.world.key_logic_algorithm[player] == 'default':
|
||||
unresolved_events = [x for y in old_state.reachable_regions[player] for x in y.locations
|
||||
if x.event and x.item and (x.item.smallkey or x.item.bigkey or x.item.advancement)
|
||||
and x not in old_state.locations_checked and x.can_reach(old_state)]
|
||||
unresolved_events = old_state._do_not_flood_the_keys(unresolved_events)
|
||||
if len(unresolved_events) == 0:
|
||||
old_state.check_key_doors_in_dungeons(rrp, player)
|
||||
|
||||
if self.world.get_region(spot, player) in rrp:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def update_reachable_regions(self, player):
|
||||
self.stale[player] = False
|
||||
rrp = self.reachable_regions[player]
|
||||
@@ -1020,7 +1056,7 @@ class CollectionState(object):
|
||||
# try to resolve a name
|
||||
if resolution_hint == 'Location':
|
||||
spot = self.world.get_location(spot, player)
|
||||
elif resolution_hint in ['Entrance', 'OWEdge', 'OWTerrain', 'Ledge', 'Portal', 'Whirlpool', 'Mirror', 'Flute']:
|
||||
elif resolution_hint in ['Entrance', 'OWEdge', 'OWTerrain', 'OpenTerrain', 'Ledge', 'OWG', 'Portal', 'Whirlpool', 'Mirror', 'Flute']:
|
||||
spot = self.world.get_entrance(spot, player)
|
||||
else:
|
||||
# default to Region
|
||||
@@ -1168,6 +1204,12 @@ class CollectionState(object):
|
||||
|
||||
def can_lift_rocks(self, player):
|
||||
return self.has('Power Glove', player) or self.has('Titans Mitts', player)
|
||||
|
||||
def can_bomb_clip(self, region, player: int) -> bool:
|
||||
return self.is_not_bunny(region, player) and self.has('Pegasus Boots', player) and self.can_use_bombs(player)
|
||||
|
||||
def can_dash_clip(self, region, player: int) -> bool:
|
||||
return self.is_not_bunny(region, player) and self.has('Pegasus Boots', player)
|
||||
|
||||
def has_bottle(self, player):
|
||||
return self.bottle_count(player) > 0
|
||||
@@ -1347,6 +1389,9 @@ class CollectionState(object):
|
||||
|
||||
def can_superbunny_mirror_with_sword(self, player):
|
||||
return self.has_Mirror(player) and self.has_sword(player)
|
||||
|
||||
def can_bunny_pocket(self, player):
|
||||
return self.has_Boots(player) and (self.has_Mirror(player) or self.has_bottle(player))
|
||||
|
||||
def collect(self, item, event=False, location=None):
|
||||
if location:
|
||||
@@ -1631,7 +1676,7 @@ class Entrance(object):
|
||||
if region not in explored_regions:
|
||||
explored_regions[region] = path
|
||||
for exit in region.exits:
|
||||
if exit.connected_region and (not ignore_ledges or exit.spot_type != 'Ledge') \
|
||||
if exit.connected_region and (not ignore_ledges or exit.spot_type not in ['Ledge', 'OWG']) \
|
||||
and exit.name not in ['Dig Game To Ledge Drop'] \
|
||||
and exit.access_rule(state):
|
||||
if exit.connected_region == destination:
|
||||
@@ -3422,7 +3467,7 @@ er_mode = {"vanilla": 0, "simple": 1, "restricted": 2, "full": 3, "crossed": 4,
|
||||
'lean': 9, "dungeonsfull": 7, "dungeonssimple": 6, "swapped": 10}
|
||||
|
||||
# byte 1: LLLW WSS? (logic, mode, sword)
|
||||
logic_mode = {"noglitches": 0, "minorglitches": 1, "nologic": 2, "owglitches": 3, "majorglitches": 4}
|
||||
logic_mode = {"noglitches": 0, "minorglitches": 1, "nologic": 2, "owglitches": 3, "majorglitches": 4, "hybridglitches": 5}
|
||||
world_mode = {"open": 0, "standard": 1, "inverted": 2}
|
||||
sword_mode = {"random": 0, "assured": 1, "swordless": 2, "vanilla": 3}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user