Merge branch 'OverworldShuffle' of github.com:codemann8/ALttPDoorRandomizer into OverworldShuffle

This commit is contained in:
2021-07-18 09:28:25 -07:00
3 changed files with 352 additions and 414 deletions

View File

@@ -3,7 +3,7 @@ import logging, copy
from BaseClasses import OWEdge, WorldType, RegionType, Direction, Terrain, PolSlot
from OWEdges import OWTileRegions, OWTileGroups, OWEdgeGroups, OpenStd, parallel_links, IsParallel
__version__ = '0.1.6.7-u'
__version__ = '0.1.6.8-u'
def link_overworld(world, player):
# setup mandatory connections
@@ -31,18 +31,18 @@ def link_overworld(world, player):
exist_owids.extend(lw_owids)
exist_owids.extend(dw_owids)
for owid in lw_owids:
exist_lw_regions.extend(OWTileRegions[owid])
exist_lw_regions.extend(OWTileRegions.inverse[owid])
for owid in dw_owids:
exist_dw_regions.extend(OWTileRegions[owid])
exist_dw_regions.extend(OWTileRegions.inverse[owid])
tile_groups[(name,)] = (exist_owids, exist_lw_regions, exist_dw_regions)
else:
(exist_owids, exist_lw_regions, exist_dw_regions) = tile_groups[(name, groupType)]
exist_owids.extend(lw_owids)
exist_owids.extend(dw_owids)
for owid in lw_owids:
exist_lw_regions.extend(OWTileRegions[owid])
exist_lw_regions.extend(OWTileRegions.inverse[owid])
for owid in dw_owids:
exist_dw_regions.extend(OWTileRegions[owid])
exist_dw_regions.extend(OWTileRegions.inverse[owid])
tile_groups[(name, groupType)] = (exist_owids, exist_lw_regions, exist_dw_regions)
#tile shuffle happens here, the groups that remain in the list are the tiles that get swapped
@@ -144,55 +144,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'):
@@ -261,6 +212,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]: