Merge unstable into CrossGen
This commit is contained in:
@@ -318,7 +318,7 @@ def within_dungeon(world, player):
|
||||
dungeon_builders[key] = simple_dungeon_builder(key, sector_list)
|
||||
dungeon_builders[key].entrance_list = list(entrances_map[key])
|
||||
recombinant_builders = {}
|
||||
handle_split_dungeons(dungeon_builders, recombinant_builders, entrances_map)
|
||||
handle_split_dungeons(dungeon_builders, recombinant_builders, entrances_map, world.fish)
|
||||
main_dungeon_generation(dungeon_builders, recombinant_builders, connections_tuple, world, player)
|
||||
|
||||
paths = determine_required_paths(world, player)
|
||||
@@ -328,15 +328,15 @@ def within_dungeon(world, player):
|
||||
start = time.process_time()
|
||||
for builder in world.dungeon_layouts[player].values():
|
||||
shuffle_key_doors(builder, world, player)
|
||||
logging.getLogger('').info('Key door shuffle time: %s', time.process_time()-start)
|
||||
logging.getLogger('').info('%s: %s', world.fish.translate("cli","cli","keydoor.shuffle.time"), time.process_time()-start)
|
||||
smooth_door_pairs(world, player)
|
||||
|
||||
|
||||
def handle_split_dungeons(dungeon_builders, recombinant_builders, entrances_map):
|
||||
def handle_split_dungeons(dungeon_builders, recombinant_builders, entrances_map, fish):
|
||||
for name, split_list in split_region_starts.items():
|
||||
builder = dungeon_builders.pop(name)
|
||||
recombinant_builders[name] = builder
|
||||
split_builders = split_dungeon_builder(builder, split_list)
|
||||
split_builders = split_dungeon_builder(builder, split_list, fish)
|
||||
dungeon_builders.update(split_builders)
|
||||
for sub_name, split_entrances in split_list.items():
|
||||
sub_builder = dungeon_builders[name+' '+sub_name]
|
||||
@@ -370,7 +370,7 @@ def main_dungeon_generation(dungeon_builders, recombinant_builders, connections_
|
||||
last_key = builder.name
|
||||
loops += 1
|
||||
else:
|
||||
logging.getLogger('').info('Generating dungeon: %s', builder.name)
|
||||
logging.getLogger('').info('%s: %s', world.fish.translate("cli","cli","generating.dungeon"), builder.name)
|
||||
ds = generate_dungeon(builder, origin_list_sans_drops, split_dungeon, world, player)
|
||||
find_new_entrances(ds, entrances_map, connections, potentials, enabled_entrances, world, player)
|
||||
ds.name = name
|
||||
@@ -521,7 +521,7 @@ def shuffle_dungeon(world, player, start_region_names, dungeon_region_names):
|
||||
for door in get_doors(world, world.get_region(name, player), player):
|
||||
ugly_regions[door.name] = 0
|
||||
available_doors.append(door)
|
||||
|
||||
|
||||
# Loop until all available doors are used
|
||||
while len(available_doors) > 0:
|
||||
# Pick a random available door to connect, prioritizing ones that aren't blocked.
|
||||
@@ -691,7 +691,7 @@ def cross_dungeon(world, player):
|
||||
key_name = dungeon_keys[builder.name] if loc.name != 'Hyrule Castle - Big Key Drop' else dungeon_bigs[builder.name]
|
||||
loc.forced_item = loc.item = ItemFactory(key_name, player)
|
||||
recombinant_builders = {}
|
||||
handle_split_dungeons(dungeon_builders, recombinant_builders, entrances_map)
|
||||
handle_split_dungeons(dungeon_builders, recombinant_builders, entrances_map, world.fish)
|
||||
|
||||
main_dungeon_generation(dungeon_builders, recombinant_builders, connections_tuple, world, player)
|
||||
|
||||
@@ -699,26 +699,16 @@ def cross_dungeon(world, player):
|
||||
check_required_paths(paths, world, player)
|
||||
|
||||
hc = world.get_dungeon('Hyrule Castle', player)
|
||||
del hc.dungeon_items[0] # removes map
|
||||
hc.dungeon_items.append(ItemFactory('Compass (Escape)', player))
|
||||
at = world.get_dungeon('Agahnims Tower', player)
|
||||
at.dungeon_items.append(ItemFactory('Compass (Agahnims Tower)', player))
|
||||
gt = world.get_dungeon('Ganons Tower', player)
|
||||
del gt.dungeon_items[0] # removes map
|
||||
at.dungeon_items.append(ItemFactory('Map (Agahnims Tower)', player))
|
||||
|
||||
assign_cross_keys(dungeon_builders, world, player)
|
||||
all_dungeon_items = [y for x in world.dungeons if x.player == player for y in x.all_items]
|
||||
target_items = 34 if world.retro[player] else 63
|
||||
d_items = target_items - len(all_dungeon_items)
|
||||
if d_items > 0:
|
||||
if d_items >= 1: # restore HC map
|
||||
world.get_dungeon('Hyrule Castle', player).dungeon_items.append(ItemFactory('Map (Escape)', player))
|
||||
if d_items >= 2: # restore GT map
|
||||
world.get_dungeon('Ganons Tower', player).dungeon_items.append(ItemFactory('Map (Ganons Tower)', player))
|
||||
if d_items > 2:
|
||||
world.pool_adjustment[player] = d_items - 2
|
||||
elif d_items < 0:
|
||||
world.pool_adjustment[player] = d_items
|
||||
world.pool_adjustment[player] = d_items
|
||||
smooth_door_pairs(world, player)
|
||||
|
||||
# Re-assign dungeon bosses
|
||||
@@ -812,7 +802,7 @@ def assign_cross_keys(dungeon_builders, world, player):
|
||||
dungeon.small_keys = []
|
||||
else:
|
||||
dungeon.small_keys = [ItemFactory(dungeon_keys[name], player)] * actual_chest_keys
|
||||
logging.getLogger('').info('Cross Dungeon: Key door shuffle time: %s', time.process_time()-start)
|
||||
logging.getLogger('').info('%s: %s', world.fish.translate("cli","cli","keydoor.shuffle.time.crossed"), time.process_time()-start)
|
||||
|
||||
|
||||
def reassign_boss(boss_region, boss_key, builder, gt, world, player):
|
||||
@@ -969,14 +959,14 @@ def calc_used_dungeon_items(builder):
|
||||
|
||||
def find_valid_combination(builder, start_regions, world, player, drop_keys=True):
|
||||
logger = logging.getLogger('')
|
||||
logger.info('Shuffling Key doors for %s', builder.name)
|
||||
logger.info('%s %s', world.fish.translate("cli","cli","shuffling.keydoors"), builder.name)
|
||||
# find valid combination of candidates
|
||||
if len(builder.candidates) < builder.key_doors_num:
|
||||
if not drop_keys:
|
||||
logger.info('No valid layouts for %s with %s doors', builder.name, builder.key_doors_num)
|
||||
return False
|
||||
builder.key_doors_num = len(builder.candidates) # reduce number of key doors
|
||||
logger.info('Lowering key door count because not enough candidates: %s', builder.name)
|
||||
logger.info('%s: %s', world.fish.translate("cli","cli","lowering.keys.candidates"), builder.name)
|
||||
combinations = ncr(len(builder.candidates), builder.key_doors_num)
|
||||
itr = 0
|
||||
start = time.process_time()
|
||||
@@ -996,7 +986,7 @@ def find_valid_combination(builder, start_regions, world, player, drop_keys=True
|
||||
if not drop_keys:
|
||||
logger.info('No valid layouts for %s with %s doors', builder.name, builder.key_doors_num)
|
||||
return False
|
||||
logger.info('Lowering key door count because no valid layouts: %s', builder.name)
|
||||
logger.info('%s: %s', world.fish.translate("cli","cli","lowering.keys.layouts"), builder.name)
|
||||
builder.key_doors_num -= 1
|
||||
if builder.key_doors_num < 0:
|
||||
raise Exception('Bad dungeon %s - 0 key doors not valid' % builder.name)
|
||||
@@ -1043,8 +1033,9 @@ def log_key_logic(d_name, key_logic):
|
||||
logger.debug('*Rule for %s:', rule.door_reference)
|
||||
if rule.bk_conditional_set:
|
||||
logger.debug('**BK Checks %s', ','.join([x.name for x in rule.bk_conditional_set]))
|
||||
logger.debug('**BK Blocked By Door (%s) : %s', rule.needed_keys_wo_bk, ','.join([x.name for x in rule.check_locations_wo_bk]))
|
||||
logger.debug('**BK Elsewhere (%s) : %s', rule.needed_keys_w_bk, ','.join([x.name for x in rule.check_locations_w_bk]))
|
||||
logger.debug('**BK Blocked (%s) : %s', rule.needed_keys_wo_bk, ','.join([x.name for x in rule.check_locations_wo_bk]))
|
||||
if rule.needed_keys_w_bk:
|
||||
logger.debug('**BK Available (%s) : %s', rule.needed_keys_w_bk, ','.join([x.name for x in rule.check_locations_w_bk]))
|
||||
|
||||
|
||||
def build_pair_list(flat_list):
|
||||
@@ -1294,7 +1285,7 @@ def stateful_door(door, kind):
|
||||
|
||||
|
||||
def random_door_type(door, partner, world, player, type_a, type_b, room_a, room_b):
|
||||
r_kind = random.choices([DoorKind.Normal, DoorKind.Bombable, DoorKind.Dashable], [5, 2, 3], k=1)[0]
|
||||
r_kind = random.choices([DoorKind.Normal, DoorKind.Bombable, DoorKind.Dashable], [15, 4, 6], k=1)[0]
|
||||
if r_kind != DoorKind.Normal:
|
||||
if door.type == DoorType.Normal:
|
||||
add_pair(door, partner, world, player)
|
||||
@@ -1486,6 +1477,7 @@ class DROptions(Flag):
|
||||
NoOptions = 0x00
|
||||
Eternal_Mini_Bosses = 0x01 # If on, GT minibosses marked as defeated when they try to spawn a heart
|
||||
Town_Portal = 0x02 # If on, Players will start with mirror scroll
|
||||
Map_Info = 0x04
|
||||
Open_Desert_Wall = 0x80 # If on, pre opens the desert wall, no fire required
|
||||
|
||||
# DATA GOES DOWN HERE
|
||||
@@ -1572,10 +1564,12 @@ logical_connections = [
|
||||
('Ice Big Chest Landing Push Blocks', 'Ice Big Chest View'),
|
||||
('Mire Lobby Gap', 'Mire Post-Gap'),
|
||||
('Mire Post-Gap Gap', 'Mire Lobby'),
|
||||
('Mire Hub Upper Blue Barrier', 'Mire Hub Top'),
|
||||
('Mire Hub Upper Blue Barrier', 'Mire Hub Switch'),
|
||||
('Mire Hub Lower Blue Barrier', 'Mire Hub Right'),
|
||||
('Mire Hub Right Blue Barrier', 'Mire Hub'),
|
||||
('Mire Hub Top Blue Barrier', 'Mire Hub'),
|
||||
('Mire Hub Top Blue Barrier', 'Mire Hub Switch'),
|
||||
('Mire Hub Switch Blue Barrier N', 'Mire Hub Top'),
|
||||
('Mire Hub Switch Blue Barrier S', 'Mire Hub'),
|
||||
('Mire Map Spike Side Drop Down', 'Mire Lone Shooter'),
|
||||
('Mire Map Spike Side Blue Barrier', 'Mire Crystal Dead End'),
|
||||
('Mire Map Spot Blue Barrier', 'Mire Crystal Dead End'),
|
||||
@@ -2246,3 +2240,19 @@ compass_data = {
|
||||
'Turtle Rock': (0x11F, 0xcb, 0x15e, 0, 0x18),
|
||||
'Ganons Tower': (0x13A, 0xcc, 0x170, 2, 0x1a)
|
||||
}
|
||||
|
||||
# For compass boss indicator
|
||||
boss_indicator = {
|
||||
'Eastern Palace': (0x04, 'Eastern Boss SE'),
|
||||
'Desert Palace': (0x06, 'Desert Boss SW'),
|
||||
'Agahnims Tower': (0x08, 'Tower Agahnim 1 SW'),
|
||||
'Swamp Palace': (0x0a, 'Swamp Boss SW'),
|
||||
'Palace of Darkness': (0x0c, 'PoD Boss SE'),
|
||||
'Misery Mire': (0x0e, 'Mire Boss SW'),
|
||||
'Skull Woods': (0x10, 'Skull Spike Corner SW'),
|
||||
'Ice Palace': (0x12, 'Ice Antechamber NE'),
|
||||
'Tower of Hera': (0x14, 'Hera Boss Down Stairs'),
|
||||
'Thieves Town': (0x16, 'Thieves Boss SE'),
|
||||
'Turtle Rock': (0x18, 'TR Boss SW'),
|
||||
'Ganons Tower': (0x1a, 'GT Agahnim 2 SW')
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user