Merge remote-tracking branch 'origin/OverworldShuffle' into OverworldShuffle

This commit is contained in:
2022-01-01 15:34:17 -08:00
21 changed files with 425 additions and 260 deletions

View File

@@ -76,11 +76,12 @@ class World(object):
self.dynamic_locations = []
self.spoiler = Spoiler(self)
self.lamps_needed_for_dark_rooms = 1
self.owswaps = {}
self.owwhirlpools = {}
self.owedges = []
self._owedge_cache = {}
self.owswaps = {}
self.owwhirlpools = {}
self.owflutespots = {}
self.owsectors = {}
self.doors = []
self._door_cache = {}
self.paired_doors = {}
@@ -108,6 +109,7 @@ class World(object):
set_player_attr('player_names', [])
set_player_attr('owswaps', [[],[],[]])
set_player_attr('owwhirlpools', [])
set_player_attr('owsectors', None)
set_player_attr('remote_items', False)
set_player_attr('required_medallions', ['Ether', 'Quake'])
set_player_attr('bottle_refills', ['Bottle (Green Potion)', 'Bottle (Green Potion)'])
@@ -1742,6 +1744,11 @@ class Region(object):
self.crystal_switch = False
def can_reach(self, state):
from Utils import stack_size3a
from DungeonGenerator import GenerationException
if stack_size3a() > 500:
raise GenerationException(f'Infinite loop detected for "{self.name}" located at \'Region.can_reach\'')
if state.stale[self.player]:
state.update_reachable_regions(self.player)
return self in state.reachable_regions[self.player]
@@ -1862,7 +1869,8 @@ class Entrance(object):
from OWEdges import OWTileRegions
from OverworldShuffle import ow_connections
owid = OWTileRegions[follower_region.name]
(mirror_map, other_world) = ow_connections[owid % 0x40]
(mirror_map_orig, other_world) = ow_connections[owid % 0x40]
mirror_map = list(mirror_map_orig).copy()
mirror_map.extend(other_world)
mirror_exit = None
while len(mirror_map):
@@ -1914,7 +1922,8 @@ class Entrance(object):
from OWEdges import OWTileRegions
from OverworldShuffle import ow_connections
owid = OWTileRegions[dest_region.name]
(mirror_map, other_world) = ow_connections[owid % 0x40]
(mirror_map_orig, other_world) = ow_connections.copy()[owid % 0x40]
mirror_map = list(mirror_map_orig).copy()
mirror_map.extend(other_world)
mirror_map = [(x, d) for (x, d) in mirror_map if x in [e.name for e in dest_region.exits]]
# loop thru potential places to leave a mirror portal
@@ -2950,12 +2959,10 @@ class Spoiler(object):
self.overworlds[(entrance, direction, player)] = OrderedDict([('player', player), ('entrance', entrance), ('exit', exit), ('direction', direction)])
def set_map(self, type, text, data, player):
if type not in self.maps:
self.maps[type] = {}
if self.world.players == 1:
self.maps[type][player] = OrderedDict([('text', text), ('data', data)])
self.maps[(type, player)] = OrderedDict([('type', type), ('text', text), ('data', data)])
else:
self.maps[type][player] = OrderedDict([('player', player), ('text', text), ('data', data)])
self.maps[(type, player)] = OrderedDict([('player', player), ('type', type), ('text', text), ('data', data)])
def set_entrance(self, entrance, exit, direction, player):
if self.world.players == 1:
@@ -3238,12 +3245,15 @@ class Spoiler(object):
if self.overworlds:
outfile.write('\n\nOverworld:\n\n')
# overworld tile swaps
if 'swaps' in self.maps:
outfile.write('OW Tile Swaps:\n')
for player in self.maps['swaps']:
for player in range(1, self.world.players + 1):
if ('swaps', player) in self.maps:
outfile.write('OW Tile Swaps:\n')
break
for player in range(1, self.world.players + 1):
if ('swaps', player) in self.maps:
if self.world.players > 1:
outfile.write(str('(Player ' + str(player) + ')\n')) # player name
outfile.write(self.maps['swaps'][player]['text'] + '\n\n')
outfile.write(self.maps[('swaps', player)]['text'] + '\n\n')
# overworld transitions
outfile.write('\n'.join(['%s%s %s %s' % (f'{self.world.get_player_names(entry["player"])}: ' if self.world.players > 1 else '', self.world.fish.translate("meta","overworlds",entry['entrance']), '<=>' if entry['direction'] == 'both' else '<=' if entry['direction'] == 'exit' else '=>', self.world.fish.translate("meta","overworlds",entry['exit'])) for entry in self.overworlds.values()]))