Lobby logic improvements
Cutoff entrance rug re-work
This commit is contained in:
@@ -41,7 +41,8 @@ def link_doors(world, player):
|
||||
for entrance, ext in straight_staircases:
|
||||
connect_two_way(world, entrance, ext, player)
|
||||
|
||||
choose_portals(world, player)
|
||||
if world.intensity[player] >= 3:
|
||||
choose_portals(world, player)
|
||||
|
||||
if world.doorShuffle[player] == 'vanilla':
|
||||
for entrance, ext in open_edges:
|
||||
@@ -312,6 +313,7 @@ def choose_portals(world, player):
|
||||
|
||||
if world.doorShuffle[player] in ['basic', 'crossed']:
|
||||
cross_flag = world.doorShuffle[player] == 'crossed'
|
||||
bk_shuffle = world.bigkeyshuffle[player]
|
||||
# roast incognito doors
|
||||
world.get_room(0x60, player).delete(5)
|
||||
world.get_room(0x60, player).change(2, DoorKind.DungeonEntrance)
|
||||
@@ -350,13 +352,15 @@ def choose_portals(world, player):
|
||||
sanc.destination = True
|
||||
clean_up_portal_assignment(portal_assignment, dungeon, sanc, master_door_list, outstanding_portals)
|
||||
for target_region, possible_portals in info.required_passage.items():
|
||||
candidates = find_portal_candidates(master_door_list, dungeon, need_passage=True, crossed=cross_flag)
|
||||
candidates = find_portal_candidates(master_door_list, dungeon, need_passage=True, crossed=cross_flag,
|
||||
bk_shuffle=bk_shuffle)
|
||||
choice, portal = assign_portal(candidates, possible_portals, world, player)
|
||||
portal.destination = True
|
||||
clean_up_portal_assignment(portal_assignment, dungeon, portal, master_door_list, outstanding_portals)
|
||||
dead_end_choices = info.total - 1 - len(portal_assignment[dungeon])
|
||||
for i in range(0, dead_end_choices):
|
||||
candidates = find_portal_candidates(master_door_list, dungeon, dead_end_allowed=True, crossed=cross_flag)
|
||||
candidates = find_portal_candidates(master_door_list, dungeon, dead_end_allowed=True,
|
||||
crossed=cross_flag, bk_shuffle=bk_shuffle)
|
||||
possible_portals = outstanding_portals if not info.sole_entrance else [x for x in outstanding_portals if x != info.sole_entrance]
|
||||
choice, portal = assign_portal(candidates, possible_portals, world, player)
|
||||
if choice.deadEnd:
|
||||
@@ -364,7 +368,8 @@ def choose_portals(world, player):
|
||||
clean_up_portal_assignment(portal_assignment, dungeon, portal, master_door_list, outstanding_portals)
|
||||
the_rest = info.total - len(portal_assignment[dungeon])
|
||||
for i in range(0, the_rest):
|
||||
candidates = find_portal_candidates(master_door_list, dungeon, crossed=cross_flag)
|
||||
candidates = find_portal_candidates(master_door_list, dungeon, crossed=cross_flag,
|
||||
bk_shuffle=bk_shuffle)
|
||||
choice, portal = assign_portal(candidates, outstanding_portals, world, player)
|
||||
clean_up_portal_assignment(portal_assignment, dungeon, portal, master_door_list, outstanding_portals)
|
||||
|
||||
@@ -408,23 +413,23 @@ def connect_portal(portal, world, player):
|
||||
world.regions.remove(placeholder)
|
||||
|
||||
|
||||
def find_portal_candidates(door_list, dungeon, need_passage=False, dead_end_allowed=False, crossed=False):
|
||||
def find_portal_candidates(door_list, dungeon, need_passage=False, dead_end_allowed=False, crossed=False, bk_shuffle=False):
|
||||
filter_list = [x for x in door_list if bk_shuffle or not x.bk_shuffle_req]
|
||||
if need_passage:
|
||||
if crossed:
|
||||
ret = [x for x in door_list if x.passage and not x.deadEnd]
|
||||
return [x for x in ret if x.dungeonLink is None or x.entrance.parent_region.dungeon.name == dungeon]
|
||||
return [x for x in filter_list if x.passage and (x.dungeonLink is None or x.entrance.parent_region.dungeon.name == dungeon)]
|
||||
else:
|
||||
return [x for x in door_list if x.passage and x.entrance.parent_region.dungeon.name == dungeon and not x.deadEnd]
|
||||
return [x for x in filter_list if x.passage and x.entrance.parent_region.dungeon.name == dungeon]
|
||||
elif dead_end_allowed:
|
||||
if crossed:
|
||||
return [x for x in door_list if x.dungeonLink is None or x.entrance.parent_region.dungeon.name == dungeon]
|
||||
return [x for x in filter_list if x.dungeonLink is None or x.entrance.parent_region.dungeon.name == dungeon]
|
||||
else:
|
||||
return [x for x in door_list if x.entrance.parent_region.dungeon.name == dungeon]
|
||||
return [x for x in filter_list if x.entrance.parent_region.dungeon.name == dungeon]
|
||||
else:
|
||||
if crossed:
|
||||
return [x for x in door_list if (not x.dungeonLink or x.entrance.parent_region.dungeon.name == dungeon) and not x.deadEnd]
|
||||
return [x for x in filter_list if (not x.dungeonLink or x.entrance.parent_region.dungeon.name == dungeon) and not x.deadEnd]
|
||||
else:
|
||||
return [x for x in door_list if x.entrance.parent_region.dungeon.name == dungeon and not x.deadEnd]
|
||||
return [x for x in filter_list if x.entrance.parent_region.dungeon.name == dungeon and not x.deadEnd]
|
||||
|
||||
|
||||
def assign_portal(candidates, possible_portals, world, player):
|
||||
@@ -765,7 +770,7 @@ def cross_dungeon(world, player):
|
||||
possible_portals = []
|
||||
for portal_name in dungeon_portals[d_name]:
|
||||
portal = world.get_portal(portal_name, player)
|
||||
if portal.door == 'Sanctuary S':
|
||||
if portal.door.name == 'Sanctuary S':
|
||||
possible_portals.clear()
|
||||
possible_portals.append(portal)
|
||||
break
|
||||
@@ -1499,7 +1504,7 @@ def determine_init_crystal(initial, state, start_regions):
|
||||
elif start_region in state.visited_orange:
|
||||
return CrystalBarrier.Orange
|
||||
else:
|
||||
raise Exception('Can\'t get to %s from initial state', start_region.name)
|
||||
raise Exception(f'Can\'t get to {start_region.name} from initial state')
|
||||
|
||||
|
||||
def explore_state(state, world, player):
|
||||
|
||||
Reference in New Issue
Block a user