Fixed an issue where certain vanilla door types would not allow other types to be placed.

Customizer: fixed an issue where last ditch placements would move customized items. Those are now locked and the generation will fail instead if no alternatives are found.
This commit is contained in:
aerinon
2023-07-19 12:31:50 -06:00
parent 1b81151941
commit 213d3d3aa0
3 changed files with 19 additions and 13 deletions

View File

@@ -1962,7 +1962,7 @@ def shuffle_big_key_doors(door_type_pools, used_doors, start_regions_map, all_cu
if flex_map[dungeon] > 0: if flex_map[dungeon] > 0:
queue.append(dungeon) queue.append(dungeon)
# time to re-assign # time to re-assign
reassign_big_key_doors(bk_map, world, player) reassign_big_key_doors(bk_map, used_doors, world, player)
for name, big_list in bk_map.items(): for name, big_list in bk_map.items():
used_doors.update(flatten_pair_list(big_list)) used_doors.update(flatten_pair_list(big_list))
return used_doors return used_doors
@@ -2047,7 +2047,7 @@ def shuffle_small_key_doors(door_type_pools, used_doors, start_regions_map, all_
else: else:
builder.key_doors_num -= 1 builder.key_doors_num -= 1
# time to re-assign # time to re-assign
reassign_key_doors(small_map, world, player) reassign_key_doors(small_map, used_doors, world, player)
for dungeon_name in pool: for dungeon_name in pool:
if world.keyshuffle[player] != 'universal': if world.keyshuffle[player] != 'universal':
builder = world.dungeon_layouts[player][dungeon_name] builder = world.dungeon_layouts[player][dungeon_name]
@@ -2129,7 +2129,7 @@ def shuffle_bomb_dash_doors(door_type_pools, used_doors, start_regions_map, all_
suggestion_map[dungeon] = pair suggestion_map[dungeon] = pair
queue.append(dungeon) queue.append(dungeon)
# time to re-assign # time to re-assign
reassign_bd_doors(bd_map, world, player) reassign_bd_doors(bd_map, used_doors, world, player)
for name, pair in bd_map.items(): for name, pair in bd_map.items():
used_doors.update(flatten_pair_list(pair[0])) used_doors.update(flatten_pair_list(pair[0]))
used_doors.update(flatten_pair_list(pair[1])) used_doors.update(flatten_pair_list(pair[1]))
@@ -2539,7 +2539,7 @@ def find_current_bk_doors(builder):
return current_doors return current_doors
def reassign_big_key_doors(bk_map, world, player): def reassign_big_key_doors(bk_map, used_doors, world, player):
logger = logging.getLogger('') logger = logging.getLogger('')
for name, big_doors in bk_map.items(): for name, big_doors in bk_map.items():
flat_proposal = flatten_pair_list(big_doors) flat_proposal = flatten_pair_list(big_doors)
@@ -2547,11 +2547,12 @@ def reassign_big_key_doors(bk_map, world, player):
queue = deque(find_current_bk_doors(builder)) queue = deque(find_current_bk_doors(builder))
while len(queue) > 0: while len(queue) > 0:
d = queue.pop() d = queue.pop()
if d.type is DoorType.Interior and d not in flat_proposal and d.dest not in flat_proposal: if (d.type is DoorType.Interior and d not in flat_proposal and d.dest not in flat_proposal
and d not in used_doors and d.dest not in used_doors):
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)
d.bigKey = False d.bigKey = False
elif d.type is DoorType.Normal and d not in flat_proposal: elif d.type is DoorType.Normal and d not in flat_proposal and d not in used_doors:
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)
d.bigKey = False d.bigKey = False
@@ -2795,7 +2796,7 @@ def find_valid_bd_combination(builder, suggested, world, player):
return bomb_proposal, dash_proposal, ttl_needed return bomb_proposal, dash_proposal, ttl_needed
def reassign_bd_doors(bd_map, world, player): def reassign_bd_doors(bd_map, used_doors, world, player):
for name, pair in bd_map.items(): for name, pair in bd_map.items():
flat_bomb_proposal = flatten_pair_list(pair[0]) flat_bomb_proposal = flatten_pair_list(pair[0])
flat_dash_proposal = flatten_pair_list(pair[1]) flat_dash_proposal = flatten_pair_list(pair[1])
@@ -2808,10 +2809,10 @@ def reassign_bd_doors(bd_map, world, player):
queue = deque(find_current_bd_doors(builder, world)) queue = deque(find_current_bd_doors(builder, world))
while len(queue) > 0: while len(queue) > 0:
d = queue.pop() d = queue.pop()
if d.type is DoorType.Interior and not_in_proposal(d): if d.type is DoorType.Interior and not_in_proposal(d) and d not in used_doors and d.dest not in used_doors:
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)
elif d.type is DoorType.Normal and not_in_proposal(d): elif d.type is DoorType.Normal and not_in_proposal(d) and d not in used_doors:
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(pair[0], DoorKind.Bombable, world, player) do_bombable_dashable(pair[0], DoorKind.Bombable, world, player)
@@ -3003,7 +3004,7 @@ def valid_key_door_pair(door1, door2):
return len(door1.entrance.parent_region.exits) <= 1 or len(door2.entrance.parent_region.exits) <= 1 return len(door1.entrance.parent_region.exits) <= 1 or len(door2.entrance.parent_region.exits) <= 1
def reassign_key_doors(small_map, world, player): def reassign_key_doors(small_map, used_doors, world, player):
logger = logging.getLogger('') logger = logging.getLogger('')
for name, small_doors in small_map.items(): for name, small_doors in small_map.items():
logger.debug(f'Key doors for {name}') logger.debug(f'Key doors for {name}')
@@ -3013,7 +3014,7 @@ def reassign_key_doors(small_map, world, player):
queue = deque(find_current_key_doors(builder)) queue = deque(find_current_key_doors(builder))
while len(queue) > 0: while len(queue) > 0:
d = queue.pop() d = queue.pop()
if d.type is DoorType.SpiralStairs and d not in proposal: if d.type is DoorType.SpiralStairs and d not in proposal and d not in used_doors:
room = world.get_room(d.roomIndex, player) room = world.get_room(d.roomIndex, player)
if room.doorList[d.doorListPos][1] == DoorKind.StairKeyLow: if room.doorList[d.doorListPos][1] == DoorKind.StairKeyLow:
room.delete(d.doorListPos) room.delete(d.doorListPos)
@@ -3023,13 +3024,14 @@ def reassign_key_doors(small_map, world, player):
else: else:
room.delete(d.doorListPos) room.delete(d.doorListPos)
d.smallKey = False d.smallKey = False
elif d.type is DoorType.Interior and d not in flat_proposal and d.dest not in flat_proposal: elif (d.type is DoorType.Interior and d not in flat_proposal and d.dest not in flat_proposal
and d not in used_doors and d.dest not in used_doors):
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)
d.smallKey = False d.smallKey = False
d.dest.smallKey = False d.dest.smallKey = False
queue.remove(d.dest) queue.remove(d.dest)
elif d.type is DoorType.Normal and d not in flat_proposal: elif d.type is DoorType.Normal and d not in flat_proposal and d not in used_doors:
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)
d.smallKey = False d.smallKey = False

View File

@@ -1396,6 +1396,7 @@ def fill_specific_items(world):
dungeon_pool, prize_set, prize_pool) dungeon_pool, prize_set, prize_pool)
if item_to_place: if item_to_place:
world.push_item(loc, item_to_place, False) world.push_item(loc, item_to_place, False)
loc.locked = True
track_outside_keys(item_to_place, loc, world) track_outside_keys(item_to_place, loc, world)
track_dungeon_items(item_to_place, loc, world) track_dungeon_items(item_to_place, loc, world)
loc.event = (event_flag or item_to_place.advancement loc.event = (event_flag or item_to_place.advancement
@@ -1431,6 +1432,7 @@ def fill_specific_items(world):
if loc.item: if loc.item:
continue continue
world.push_item(loc, item_to_place, False) world.push_item(loc, item_to_place, False)
loc.locked = True
track_outside_keys(item_to_place, loc, world) track_outside_keys(item_to_place, loc, world)
track_dungeon_items(item_to_place, loc, world) track_dungeon_items(item_to_place, loc, world)
loc.event = (event_flag or item_to_place.advancement loc.event = (event_flag or item_to_place.advancement

View File

@@ -113,6 +113,8 @@ These are now independent of retro mode and have three options: None, Random, an
* Fixed an issue with pyramid hole being in logic when it is not opened. * Fixed an issue with pyramid hole being in logic when it is not opened.
* Crystal cutscene at GT use new symmetrical layouts (thanks Codemann) * Crystal cutscene at GT use new symmetrical layouts (thanks Codemann)
* Fix for Hera Boss music (thanks Codemann) * Fix for Hera Boss music (thanks Codemann)
* Fixed an issue where certain vanilla door types would not allow other types to be placed.
* Customizer: fixed an issue where last ditch placements would move customized items. Those are now locked and the generation will fail instead is no alternative are found.
* Customizer: fixed an issue with assured sword and start_inventory * Customizer: fixed an issue with assured sword and start_inventory
* Customizer: warns when trying to specifically place an item that's not in the item pool * Customizer: warns when trying to specifically place an item that's not in the item pool
* Fixed "accessibility: none" displaying a spoiling message * Fixed "accessibility: none" displaying a spoiling message