Big Key fix for dungeons with only big chests

Door pairing issues
Minor gui error
This commit is contained in:
aerinon
2022-10-28 08:56:06 -06:00
parent bd619ff2ef
commit 82965ac734
2 changed files with 14 additions and 28 deletions

View File

@@ -831,7 +831,8 @@ def main_dungeon_pool(dungeon_pool, world, player):
for name in pool: for name in pool:
builder = world.dungeon_layouts[player][name] builder = world.dungeon_layouts[player][name]
region_set = builder.master_sector.region_set() region_set = builder.master_sector.region_set()
builder.bk_required = builder.bk_door_proposal or any(x in region_set for x in special_bk_regions) builder.bk_required = (builder.bk_door_proposal or any(x in region_set for x in special_bk_regions)
or len(world.key_logic[player][name].bk_chests) > 0)
dungeon = world.get_dungeon(name, player) dungeon = world.get_dungeon(name, player)
if not builder.bk_required or builder.bk_provided: if not builder.bk_required or builder.bk_provided:
dungeon.big_key = None dungeon.big_key = None
@@ -2362,21 +2363,16 @@ def find_big_key_door_candidates(region, checked, used, world, player):
if valid and d.dest not in candidates: # interior doors are not separable yet if valid and d.dest not in candidates: # interior doors are not separable yet
candidates.append(d.dest) candidates.append(d.dest)
elif d.type == DoorType.Normal: elif d.type == DoorType.Normal:
if decoupled: valid = kind in okay_normals
valid = kind in okay_normals if valid and not decoupled:
else:
d2 = d.dest d2 = d.dest
if d2 not in candidates and d2 not in used: if d2 not in candidates and d2 not in used:
if d2.type == DoorType.Normal: if d2.type == DoorType.Normal:
room_b = world.get_room(d2.roomIndex, player) room_b = world.get_room(d2.roomIndex, player)
pos_b, kind_b = room_b.doorList[d2.doorListPos] pos_b, kind_b = room_b.doorList[d2.doorListPos]
valid = kind in okay_normals and kind_b in okay_normals and valid_key_door_pair(d, d2) valid &= kind_b in okay_normals and valid_key_door_pair(d, d2)
else:
valid = kind in okay_normals
if valid and 0 <= d2.doorListPos < 4: if valid and 0 <= d2.doorListPos < 4:
candidates.append(d2) candidates.append(d2)
else:
valid = True
if valid and d not in candidates: if valid and d not in candidates:
candidates.append(d) candidates.append(d)
connected = ext.connected_region connected = ext.connected_region
@@ -2628,21 +2624,16 @@ def find_bd_door_candidates(region, checked, used, world, player):
if valid and d.dest not in candidates: # interior doors are not separable yet if valid and d.dest not in candidates: # interior doors are not separable yet
candidates.append(d.dest) candidates.append(d.dest)
elif d.type == DoorType.Normal: elif d.type == DoorType.Normal:
if decoupled: valid = kind in okay_normals
valid = kind in okay_normals if valid and not decoupled:
else:
d2 = d.dest d2 = d.dest
if d2 not in candidates and d2 not in used: if d2 not in candidates and d2 not in used:
if d2.type == DoorType.Normal: if d2.type == DoorType.Normal:
room_b = world.get_room(d2.roomIndex, player) room_b = world.get_room(d2.roomIndex, player)
pos_b, kind_b = room_b.doorList[d2.doorListPos] pos_b, kind_b = room_b.doorList[d2.doorListPos]
valid = kind in okay_normals and kind_b in okay_normals and valid_key_door_pair(d, d2) valid &= kind_b in okay_normals and valid_key_door_pair(d, d2)
else:
valid = kind in okay_normals
if valid and 0 <= d2.doorListPos < 4: if valid and 0 <= d2.doorListPos < 4:
candidates.append(d2) candidates.append(d2)
else:
valid = True
if valid and d not in candidates: if valid and d not in candidates:
candidates.append(d) candidates.append(d)
connected = ext.connected_region connected = ext.connected_region
@@ -2702,8 +2693,8 @@ def reassign_bd_doors(bd_map, world, player):
elif d.type is DoorType.Normal and not_in_proposal(d): elif d.type is DoorType.Normal and not_in_proposal(d):
if not d.entranceFlag: if not d.entranceFlag:
world.get_room(d.roomIndex, player).change(d.doorListPos, DoorKind.Normal) world.get_room(d.roomIndex, player).change(d.doorListPos, DoorKind.Normal)
do_bombable_dashable(flat_bomb_proposal, DoorKind.Bombable, world, player) do_bombable_dashable(pair[0], DoorKind.Bombable, world, player)
do_bombable_dashable(flat_dash_proposal, DoorKind.Dashable, world, player) do_bombable_dashable(pair[1], DoorKind.Dashable, world, player)
def do_bombable_dashable(proposal, kind, world, player): def do_bombable_dashable(proposal, kind, world, player):
@@ -2864,21 +2855,16 @@ def find_key_door_candidates(region, checked, used, world, player):
elif d.type == DoorType.SpiralStairs: elif d.type == DoorType.SpiralStairs:
valid = kind in [DoorKind.StairKey, DoorKind.StairKey2, DoorKind.StairKeyLow] valid = kind in [DoorKind.StairKey, DoorKind.StairKey2, DoorKind.StairKeyLow]
elif d.type == DoorType.Normal: elif d.type == DoorType.Normal:
if decoupled: valid = kind in okay_normals
valid = kind in okay_normals if valid and not decoupled:
else:
d2 = d.dest d2 = d.dest
if d2 not in candidates and d2 not in used: if d2 not in candidates and d2 not in used:
if d2.type == DoorType.Normal: if d2.type == DoorType.Normal:
room_b = world.get_room(d2.roomIndex, player) room_b = world.get_room(d2.roomIndex, player)
pos_b, kind_b = room_b.doorList[d2.doorListPos] pos_b, kind_b = room_b.doorList[d2.doorListPos]
valid = kind in okay_normals and kind_b in okay_normals and valid_key_door_pair(d, d2) valid &= kind_b in okay_normals and valid_key_door_pair(d, d2)
else:
valid = kind in okay_normals
if valid and 0 <= d2.doorListPos < 4: if valid and 0 <= d2.doorListPos < 4:
candidates.append(d2) candidates.append(d2)
else:
valid = True
if valid and d not in candidates: if valid and d not in candidates:
candidates.append(d) candidates.append(d)
connected = ext.connected_region connected = ext.connected_region

View File

@@ -1,6 +1,6 @@
{ {
"widgets": { "widgets": {
"keyshuffle": { "smallkeyshuffle": {
"type": "selectbox", "type": "selectbox",
"options": [ "options": [
"none", "none",