Logic fix for sanc mirror route

Minor updates to customizer
Minor update to new ER (seed duplication issue)
This commit is contained in:
aerinon
2023-01-18 08:02:32 -07:00
parent 22dfeeecca
commit 4547a0a43b
6 changed files with 25 additions and 12 deletions

View File

@@ -551,7 +551,7 @@ def customizer_portals(master_door_list, world, player):
if isinstance(dest, str):
door = world.get_door(dest, player)
assigned_doors.add(door)
else:
elif 'dest' in dest:
door = world.get_door(dest['dest'], player)
assigned_doors.add(door)
return custom_portals, assigned_doors
@@ -1708,8 +1708,8 @@ def setup_custom_door_types(world, player):
if d.type == DoorType.SpiralStairs:
type_map[door_kind][dungeon.name].append(d)
else:
# check if the
if d.dest.type in [DoorType.Interior, DoorType.Normal]:
# check if the dest is paired
if d.dest.type in [DoorType.Interior, DoorType.Normal] and door_kind != 'Trap Door':
type_map[door_kind][dungeon.name].append((d, d.dest))
else:
type_map[door_kind][dungeon.name].append(d)
@@ -1852,10 +1852,11 @@ def shuffle_big_key_doors(door_type_pools, used_doors, start_regions_map, world,
ttl += len(builder.candidates.big)
if ttl == 0:
continue
remaining = max(0, remaining)
for dungeon in pool:
builder = world.dungeon_layouts[player][dungeon]
proportion = len(builder.candidates.big)
calc = int(round(proportion * door_type_pool.bigs/ttl))
calc = int(round(proportion * remaining/ttl))
suggested = min(proportion, calc)
remaining -= suggested
suggestion_map[dungeon] = suggested
@@ -1909,12 +1910,15 @@ def shuffle_small_key_doors(door_type_pools, used_doors, start_regions_map, worl
if not total_adjustable:
builder.total_keys = total_keys
find_small_key_door_candidates(builder, start_regions_map[dungeon], used_doors, world, player)
custom_doors = 0
if custom_key_doors[dungeon]:
builder.candidates.small = filter_key_door_pool(builder.candidates.small, custom_key_doors[dungeon])
remaining -= len(custom_key_doors[dungeon])
builder.key_doors_num = max(0, len(builder.candidates.small) - builder.key_drop_cnt)
custom_doors = len(custom_key_doors[dungeon])
remaining -= custom_doors
builder.key_doors_num = max(0, len(builder.candidates.small) - builder.key_drop_cnt) + custom_doors
total_keys -= builder.key_drop_cnt
ttl += builder.key_doors_num
remaining = max(0, remaining)
for dungeon in pool:
builder = world.dungeon_layouts[player][dungeon]
calculated = int(round(builder.key_doors_num*total_keys/ttl))
@@ -2142,6 +2146,7 @@ def find_valid_trap_combination(builder, suggested, start_regions, paths, world,
if custom_trap_doors:
trap_door_pool = filter_key_door_pool(trap_door_pool, custom_trap_doors)
trap_doors_needed -= len(custom_trap_doors)
trap_doors_needed = max(0, trap_doors_needed)
if len(trap_door_pool) < trap_doors_needed:
if not drop:
return None, 0
@@ -2420,6 +2425,7 @@ def find_valid_bk_combination(builder, suggested, start_regions, world, player,
if custom_bk_doors:
bk_door_pool = filter_key_door_pool(bk_door_pool, custom_bk_doors)
bk_doors_needed -= len(custom_bk_doors)
bk_doors_needed = max(0, bk_doors_needed)
if len(bk_door_pool) < bk_doors_needed:
if not drop:
return None, 0
@@ -2559,7 +2565,7 @@ def find_valid_combination(builder, target, start_regions, world, player, drop_k
if custom_key_doors: # could validate that each custom item is in the candidates
key_door_pool = filter_key_door_pool(key_door_pool, custom_key_doors)
key_doors_needed -= len(custom_key_doors)
key_doors_needed = max(0, key_doors_needed)
# find valid combination of candidates
if len(key_door_pool) < key_doors_needed:
if not drop_keys:
@@ -2574,6 +2580,7 @@ def find_valid_combination(builder, target, start_regions, world, player, drop_k
sample_list = build_sample_list(combinations)
proposal = kth_combination(sample_list[itr], key_door_pool, key_doors_needed)
proposal.extend(custom_key_doors)
builder.key_doors_num = len(proposal)
start_regions, event_starts = filter_start_regions(builder, start_regions, world, player)
key_layout = build_key_layout(builder, start_regions, proposal, event_starts, world, player)
@@ -2606,7 +2613,7 @@ def find_valid_combination(builder, target, start_regions, world, player, drop_k
builder.key_door_proposal = proposal
world.key_logic[player][builder.name] = key_layout.key_logic
world.key_layout[player][builder.name] = key_layout
return builder.key_door_proposal, key_doors_needed
return builder.key_door_proposal, key_doors_needed + len(custom_key_doors)
def find_bd_candidates(builder, start_regions, used, world, player):

View File

@@ -1473,6 +1473,8 @@ def create_doors(world, player):
world.get_door('GT Spike Crystal Right to Left Barrier - Orange', player).barrier(CrystalBarrier.Orange)
world.get_door('GT Spike Crystal Left to Right Bypass', player).barrier(CrystalBarrier.Blue)
world.get_door('Sanctuary Mirror Route', player).barrier(CrystalBarrier.Orange)
# kill certain doors
if world.intensity[player] == 1: # due to ladder & warp being fixed
world.get_door('PoD Mimics 2 SW', player).kill()

View File

@@ -1383,7 +1383,8 @@ def fill_specific_items(world):
world.push_item(loc, item_to_place, False)
track_outside_keys(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
or item_to_place.bigkey or item_to_place.smallkey)
advanced_placements = world.customizer.get_advanced_placements()
if advanced_placements:
for player, placement_list in advanced_placements.items():

View File

@@ -34,7 +34,7 @@ from source.overworld.EntranceShuffle2 import link_entrances_new
from source.tools.BPS import create_bps_from_data
from source.classes.CustomSettings import CustomSettings
__version__ = '1.2.0.4-u'
__version__ = '1.2.0.5-u'
from source.classes.BabelFish import BabelFish

View File

@@ -108,6 +108,9 @@ These are now independent of retro mode and have three options: None, Random, an
* Bonk Fairy (Dark)
# Bug Fixes and Notes
* 1.2.0.5.u
* Logic fix for Sanctuary mirror (it wasn't resetting the crystal state)
* Minor bugfixes for customizer
* 1.2.0.4-u
* Starting inventory fixes if item not present in the item pool.
* Support for Assured sword setting and OWG Boots when using a custom item pool. (Customizer or GUI)

View File

@@ -311,7 +311,7 @@ def do_main_shuffle(entrances, exits, avail, mode_def):
unused_entrances.update(lw_entrances)
unused_entrances.update(dw_entrances)
else:
entrance_list = [x for x in rem_entrances if bonk_fairy_exception(x)]
entrance_list = sorted([x for x in rem_entrances if bonk_fairy_exception(x)])
do_cross_world_connectors(entrance_list, multi_exit_caves, avail)
unused_entrances.update(entrance_list)