Implemented smarter Balanced Flute Shuffle

This commit is contained in:
codemann8
2021-07-18 06:07:27 -05:00
parent bdde8591a7
commit a13975e4ff

View File

@@ -143,55 +143,6 @@ def link_overworld(world, player):
region = world.get_region(name, player)
region.type = RegionType.LightWorld
# flute shuffle
def connect_flutes(flute_destinations):
for o in range(0, len(flute_destinations)):
owslot = flute_destinations[o]
regions = flute_data[owslot][0]
if (world.mode[player] == 'inverted') == (flute_data[owslot][1] in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
connect_simple(world, 'Flute Spot ' + str(o + 1), regions[0], player)
else:
connect_simple(world, 'Flute Spot ' + str(o + 1), regions[1], player)
if world.owFluteShuffle[player] == 'vanilla':
connect_flutes(default_flute_connections)
else:
flute_pool = list(flute_data.keys())
new_spots = list()
# guarantee desert/mire access
flute_pool.remove(0x38)
new_spots.append(0x38)
# guarantee mountain access
mountainIds = [0x0b, 0x0e, 0x07]
owslot = mountainIds[random.randint(0, 2)]
flute_pool.remove(owslot)
new_spots.append(owslot)
random.shuffle(flute_pool)
f = 0
while len(new_spots) < 8:
if f >= len(flute_pool):
f = 0
if world.owFluteShuffle[player] == 'balanced':
if (flute_pool[f] + 1 in new_spots \
or flute_pool[f] - 1 in new_spots \
or flute_pool[f] + 8 in new_spots \
or flute_pool[f] - 8 in new_spots) \
or (random.randint(0, 31) != 0 \
and (flute_pool[f] + 7 in new_spots
or flute_pool[f] - 7 in new_spots
or flute_pool[f] + 9 in new_spots
or flute_pool[f] - 9 in new_spots)):
f += 1
continue
if flute_pool[f] not in new_spots:
new_spots.append(flute_pool[f])
f += 1
new_spots.sort()
world.owflutespots[player] = new_spots
connect_flutes(new_spots)
# make new connections
for owid in ow_connections.keys():
if (world.mode[player] == 'inverted') == (owid in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
@@ -260,6 +211,72 @@ def link_overworld(world, player):
raise KeyError('No parallel edge for edge %d' % back_edge)
assert len(connected_edges) == len(default_connections) * 2, connected_edges
# flute shuffle
def connect_flutes(flute_destinations):
for o in range(0, len(flute_destinations)):
owslot = flute_destinations[o]
regions = flute_data[owslot][0]
if (world.mode[player] == 'inverted') == (flute_data[owslot][1] in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
connect_simple(world, 'Flute Spot ' + str(o + 1), regions[0], player)
else:
connect_simple(world, 'Flute Spot ' + str(o + 1), regions[1], player)
if world.owFluteShuffle[player] == 'vanilla':
connect_flutes(default_flute_connections)
else:
flute_pool = list(flute_data.keys())
new_spots = list()
ignored_regions = set()
def addSpot(owid, removeFromPool = False):
if world.owFluteShuffle[player] == 'balanced':
def getIgnored(regionname, base_owid, owid):
region = world.get_region(regionname, player)
for exit in region.exits:
if exit.connected_region is not None and exit.connected_region.type in [RegionType.LightWorld, RegionType.DarkWorld] and exit.connected_region.name not in new_ignored:
if OWTileRegions[exit.connected_region.name] in [base_owid, owid] or OWTileRegions[regionname] == base_owid:
new_ignored.add(exit.connected_region.name)
getIgnored(exit.connected_region.name, base_owid, OWTileRegions[exit.connected_region.name])
if (world.mode[player] == 'inverted') == (flute_data[owid][1] in world.owswaps[player][0] and world.owSwap[player] == 'mixed'):
new_region = flute_data[owid][0][0]
else:
new_region = flute_data[owid][0][1]
if new_region in ignored_regions:
return False
new_ignored = {new_region}
getIgnored(new_region, OWTileRegions[new_region], OWTileRegions[new_region])
if random.randint(0, 31) != 0 and new_ignored.intersection(ignored_regions):
return False
ignored_regions.update(new_ignored)
if removeFromPool:
flute_pool.remove(owid)
new_spots.append(owid)
return True
# guarantee desert/mire access
addSpot(0x38, True)
# guarantee mountain access
if world.owShuffle[player] == 'vanilla':
mountainIds = [0x0b, 0x0e, 0x07]
addSpot(mountainIds[random.randint(0, 2)], True)
random.shuffle(flute_pool)
f = 0
while len(new_spots) < 8:
if f >= len(flute_pool):
f = 0
if flute_pool[f] not in new_spots:
addSpot(flute_pool[f])
f += 1
new_spots.sort()
world.owflutespots[player] = new_spots
connect_flutes(new_spots)
def connect_custom(world, connected_edges, player):
if hasattr(world, 'custom_overworld') and world.custom_overworld[player]: