diff --git a/BaseClasses.py b/BaseClasses.py index f1088c04..9e14565f 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1157,6 +1157,7 @@ class Spoiler(object): self.world = world self.entrances = OrderedDict() self.doors = OrderedDict() + self.doorTypes = OrderedDict() self.medallions = {} self.playthrough = {} self.locations = {} @@ -1177,6 +1178,12 @@ class Spoiler(object): else: self.doors[(entrance, direction, player)] = OrderedDict([('player', player), ('entrance', entrance), ('exit', exit), ('direction', direction)]) + def set_door_type(self, doorNames, type, player): + if self.world.players == 1: + self.doorTypes[(doorNames, player)] = OrderedDict([('doorNames', doorNames), ('type', type)]) + else: + self.doorTypes[(doorNames, player)] = OrderedDict([('player', player), ('doorNames', doorNames), ('type', type)]) + def parse_data(self): self.medallions = OrderedDict() if self.world.players == 1: @@ -1272,6 +1279,7 @@ class Spoiler(object): out = OrderedDict() out['Entrances'] = list(self.entrances.values()) out['Doors'] = list(self.doors.values()) + out['DoorTypes'] = list(self.doorTypes.values()) out.update(self.locations) out['Special'] = self.medallions if self.shops: @@ -1304,6 +1312,9 @@ class Spoiler(object): if self.doors: outfile.write('\n\nDoors:\n\n') outfile.write('\n'.join(['%s%s %s %s' % ('Player {0}: '.format(entry['player']) if self.world.players > 1 else '', entry['entrance'], '<=>' if entry['direction'] == 'both' else '<=' if entry['direction'] == 'exit' else '=>', entry['exit']) for entry in self.doors.values()])) + if self.doorTypes: + outfile.write('\n\nDoor Types:\n\n') + outfile.write('\n'.join(['%s%s %s' % ('Player {0}: '.format(entry['player']) if self.world.players > 1 else '', entry['doorNames'], entry['type']) for entry in self.doorTypes.values()])) if self.entrances: outfile.write('\n\nEntrances:\n\n') outfile.write('\n'.join(['%s%s %s %s' % ('Player {0}: '.format(entry['player']) if self.world.players > 1 else '', entry['entrance'], '<=>' if entry['direction'] == 'both' else '<=' if entry['direction'] == 'exit' else '=>', entry['exit']) for entry in self.entrances.values()])) diff --git a/DoorShuffle.py b/DoorShuffle.py index 0acff55c..c3782ac1 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -94,9 +94,6 @@ def create_door_spoiler(world, player): logger.debug('Door not found in queue: %s connected to %s', door_b.name, door_a.name) else: logger.warning('Door not connected: %s', door_a.name) - for room in world.rooms: - if room.modified: - logger.debug('Room %s changed (p%d)', room.index, player) for dp in world.paired_doors[player]: if dp.pair: logger.debug('Paired Doors: %s with %s (p%d)', dp.door_a, dp.door_b, player) @@ -925,7 +922,7 @@ def find_key_door_candidates(region, checked, world, player): room_b = world.get_room(d2.roomIndex, player) pos_b, kind_b = room_b.doorList[d2.doorListPos] okay_normals = [DoorKind.Normal, DoorKind.SmallKey, DoorKind.Bombable, - DoorKind.Dashable, DoorKind.Warp, DoorKind.DungeonChanger] + DoorKind.Dashable, DoorKind.DungeonChanger] valid = kind in okay_normals and kind_b in okay_normals else: valid = True @@ -1009,6 +1006,8 @@ def validate_key_layout(sector, start_regions, key_door_proposal, world, player) def validate_key_layout_r(state, flat_proposal, world, player): + # improvements: remove recursion to make this iterative + # store a cache of various states of opened door to increase speed of checks - many are repetitive while len(state.avail_doors) > 0: door = state.avail_doors.pop() connect_region = world.get_entrance(door.name, player).connected_region @@ -1117,6 +1116,7 @@ def reassign_key_doors(current_doors, proposal, world, player): world.paired_doors[player].append(PairedDoor(d1.name, d2.name)) change_door_to_small_key(d1, world, player) change_door_to_small_key(d2, world, player) + world.spoiler.set_door_type(d1.name+' <-> '+d2.name, 'Key Door', player) else: d = obj if d.type is DoorType.Interior: @@ -1125,6 +1125,7 @@ def reassign_key_doors(current_doors, proposal, world, player): pass # we don't have spiral stairs candidates yet that aren't already key doors elif d.type is DoorType.Normal: change_door_to_small_key(d, world, player) + world.spoiler.set_door_type(d.name, 'Key Door', player) def change_door_to_small_key(d, world, player): diff --git a/Doors.py b/Doors.py index d0608a0c..b4e53c67 100644 --- a/Doors.py +++ b/Doors.py @@ -27,9 +27,9 @@ LTL = 3 # Low to Low 11 def create_doors(world, player): world.doors += [ # hyrule castle - toggle(create_dir_door(player, 'Hyrule Castle Lobby W', DoorType.Normal, Direction.West, 0x61, Mid, High)).pos(6), + toggle(create_dir_door(player, 'Hyrule Castle Lobby W', DoorType.Normal, Direction.West, 0x61, Mid, High)).pos(0), toggle(create_dir_door(player, 'Hyrule Castle Lobby E', DoorType.Normal, Direction.East, 0x61, Mid, High)).pos(2), - create_dir_door(player, 'Hyrule Castle Lobby WN', DoorType.Normal, Direction.West, 0x61, Top, High).pos(0), + create_dir_door(player, 'Hyrule Castle Lobby WN', DoorType.Normal, Direction.West, 0x61, Top, High).pos(1), create_dir_door(player, 'Hyrule Castle Lobby North Stairs', DoorType.StraightStairs, Direction.North, 0x61, Mid, High), toggle(create_dir_door(player, 'Hyrule Castle West Lobby E', DoorType.Normal, Direction.East, 0x60, Mid, Low)).pos(1), create_dir_door(player, 'Hyrule Castle West Lobby N', DoorType.Normal, Direction.North, 0x60, Right, Low).pos(0), diff --git a/RoomData.py b/RoomData.py index 42bc55db..51a00d6d 100644 --- a/RoomData.py +++ b/RoomData.py @@ -232,6 +232,10 @@ def create_rooms(world, player): # Room(player, 0xfe, 0x52ff1).door(Position.SouthE2, DoorKind.CaveEntranceLow), # Room(player, 0xff, 0x52c9a).door(Position.InteriorW, DoorKind.Bombable).door(Position.InteriorE, DoorKind.Bombable).door(Position.SouthE, DoorKind.CaveEntrance), ] + # fix some wonky things + world.get_room(0x60, player).swap(2, 4) # puts the exit at pos 2 - enables pos 3 + world.get_room(0x61, player).swap(1, 6) # puts the WN door at pos 1 - enables it + world.get_room(0x62, player).swap(1, 4) # puts the exit at pos 1 - enables pos 3 class Room(object): @@ -251,6 +255,13 @@ class Room(object): self.doorList[list_idx] = (prev[0], kind) self.modified = True + def swap(self, idx1, idx2): + item1 = self.doorList[idx1] + item2 = self.doorList[idx2] + self.doorList[idx1] = item2 + self.doorList[idx2] = item1 + self.modified = True + def address(self): return self.doorListAddress