From b4ad0ebf5282e19fda7469aacc6d0163470c0bec Mon Sep 17 00:00:00 2001 From: Grrmo <72080072+Grrmo@users.noreply.github.com> Date: Sun, 23 Jan 2022 21:26:32 +0100 Subject: [PATCH] Created new region for kitty boss (#233) * Added own region for kitty boss Kitty boss had the same access restriction as upper lake desolation, which is wrong. --- worlds/timespinner/Locations.py | 22 ++++++++++++---------- worlds/timespinner/Regions.py | 19 ++++++++++++------- worlds/timespinner/__init__.py | 2 +- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/worlds/timespinner/Locations.py b/worlds/timespinner/Locations.py index 655a2c58..36e86325 100644 --- a/worlds/timespinner/Locations.py +++ b/worlds/timespinner/Locations.py @@ -4,26 +4,28 @@ from .Options import is_option_enabled EventId: Optional[int] = None + class LocationData(NamedTuple): region: str name: str code: Optional[int] rule: Callable = lambda state: True + def get_locations(world: Optional[MultiWorld], player: Optional[int]) -> Tuple[LocationData, ...]: # 1337000 - 1337155 Generic locations # 1337171 - 1337175 New Pickup checks # 1337246 - 1337249 Ancient Pyramid location_table: List[LocationData] = [ - # PresentItemLocations + # Present item locations LocationData('Tutorial', 'Yo Momma 1', 1337000), LocationData('Tutorial', 'Yo Momma 2', 1337001), LocationData('Lake desolation', 'Starter chest 2', 1337002), LocationData('Lake desolation', 'Starter chest 3', 1337003), LocationData('Lake desolation', 'Starter chest 1', 1337004), LocationData('Lake desolation', 'Timespinner Wheel room', 1337005), - LocationData('Upper lake desolation', 'Forget me not chest', 1337006), - LocationData('Lower lake desolation', 'Chicken chest', 1337007, lambda state: state._timespinner_has_timestop(world, player)), + LocationData('Lake desolation', 'Forget me not chest', 1337006, lambda state: state._timespinner_has_fire(world, player) and state.can_reach('Upper Lake Serene', 'Region', player)), + LocationData('Lake desolation', 'Chicken chest', 1337007, lambda state: state._timespinner_has_timestop(world, player)), LocationData('Lower lake desolation', 'Not so secret room', 1337008, lambda state: state._timespinner_can_break_walls(world, player)), LocationData('Lower lake desolation', 'Tank chest', 1337009, lambda state: state._timespinner_has_timestop(world, player)), LocationData('Upper lake desolation', 'Upper desolation Oxygen recovery room', 1337010), @@ -32,9 +34,9 @@ def get_locations(world: Optional[MultiWorld], player: Optional[int]) -> Tuple[L LocationData('Upper lake desolation', 'Upper desolation double jump cave floor', 1337013), LocationData('Upper lake desolation', 'Fire-Locked sparrow chest', 1337014), LocationData('Upper lake desolation', 'Crash site pedestal', 1337015), - LocationData('Upper lake desolation', 'Crash site chest 1', 1337016, lambda state: state.has_all({'Killed Maw', 'Gas Mask'}, player)), - LocationData('Upper lake desolation', 'Crash site chest 2', 1337017, lambda state: state.has_all({'Killed Maw', 'Gas Mask'}, player)), - LocationData('Upper lake desolation', 'Kitty Boss', 1337018), + LocationData('Upper lake desolation', 'Crash site chest 1', 1337016, lambda state: state.has_all({'Killed Maw'}, player)), + LocationData('Upper lake desolation', 'Crash site chest 2', 1337017, lambda state: state.has_all({'Killed Maw'}, player)), + LocationData('Eastern lake desolation', 'Kitty Boss', 1337018), LocationData('Library', 'Library Basement', 1337019), LocationData('Library', 'Library warp gate', 1337020), LocationData('Library', 'Librarian', 1337021), @@ -103,7 +105,7 @@ def get_locations(world: Optional[MultiWorld], player: Optional[int]) -> Tuple[L LocationData('Emperors tower', 'Dad\'s Chambers chest', 1337084), LocationData('Emperors tower', 'Dad\'s Chambers pedestal', 1337085), - # PastItemLocations + # Past item locations LocationData('Refugee Camp', 'Neliste\'s Bra', 1337086), LocationData('Refugee Camp', 'Refugee camp storage chest 3', 1337087), LocationData('Refugee Camp', 'Refugee camp storage chest 2', 1337088), @@ -183,7 +185,7 @@ def get_locations(world: Optional[MultiWorld], player: Optional[int]) -> Tuple[L LocationData('Royal towers (upper)', 'Aelana\'s chest', 1337154), LocationData('Royal towers (upper)', 'Aelana\'s pedestal', 1337155), - #AncientPyramidLocations + # Ancient pyramid locations LocationData('Ancient Pyramid (left)', 'Why not it\'s right there', 1337246), LocationData('Ancient Pyramid (left)', 'Conviction guarded room', 1337247), LocationData('Ancient Pyramid (left)', 'Pit secret room', 1337248, lambda state: state._timespinner_can_break_walls(world, player)), @@ -197,7 +199,7 @@ def get_locations(world: Optional[MultiWorld], player: Optional[int]) -> Tuple[L location_table += ( LocationData('Library', 'Library terminal 2', 1337156, lambda state: state.has('Tablet', player)), LocationData('Library', 'Library terminal 1', 1337157, lambda state: state.has('Tablet', player)), - # 1337158 Is Lost in time + # 1337158 Is lost in time LocationData('Library', 'Library terminal 3', 1337159, lambda state: state.has('Tablet', player)), LocationData('Library', 'V terminal 1', 1337160, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), LocationData('Library', 'V terminal 2', 1337161, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), @@ -269,4 +271,4 @@ starter_progression_locations: Tuple[str, ...] = ( 'Starter chest 3', 'Starter chest 1', 'Timespinner Wheel room' -) \ No newline at end of file +) diff --git a/worlds/timespinner/Regions.py b/worlds/timespinner/Regions.py index 04275bfc..c1371115 100644 --- a/worlds/timespinner/Regions.py +++ b/worlds/timespinner/Regions.py @@ -3,6 +3,7 @@ from BaseClasses import MultiWorld, Region, Entrance, Location, RegionType from .Options import is_option_enabled from .Locations import LocationData + def create_regions(world: MultiWorld, player: int, locations: Tuple[LocationData, ...], location_cache: List[Location], pyramid_keys_unlock: str): locations_per_region = get_locations_per_region(locations) @@ -12,6 +13,7 @@ def create_regions(world: MultiWorld, player: int, locations: Tuple[LocationData create_region(world, player, locations_per_region, location_cache, 'Lake desolation'), create_region(world, player, locations_per_region, location_cache, 'Upper lake desolation'), create_region(world, player, locations_per_region, location_cache, 'Lower lake desolation'), + create_region(world, player, locations_per_region, location_cache, 'Eastern lake desolation'), create_region(world, player, locations_per_region, location_cache, 'Library'), create_region(world, player, locations_per_region, location_cache, 'Library top'), create_region(world, player, locations_per_region, location_cache, 'Ifrit\'s Lair'), @@ -51,7 +53,7 @@ def create_regions(world: MultiWorld, player: int, locations: Tuple[LocationData if __debug__: throwIfAnyLocationIsNotAssignedToARegion(regions, locations_per_region.keys()) - + world.regions += regions connectStartingRegion(world, player) @@ -63,11 +65,14 @@ def create_regions(world: MultiWorld, player: int, locations: Tuple[LocationData connect(world, player, names, 'Lake desolation', 'Skeleton Shaft', lambda state: state._timespinner_has_doublejump(world, player)) connect(world, player, names, 'Lake desolation', 'Space time continuum', lambda state: state.has('Twin Pyramid Key', player)) connect(world, player, names, 'Upper lake desolation', 'Lake desolation') - connect(world, player, names, 'Upper lake desolation', 'Lower lake desolation') + connect(world, player, names, 'Upper lake desolation', 'Eastern lake desolation') connect(world, player, names, 'Lower lake desolation', 'Lake desolation') - connect(world, player, names, 'Lower lake desolation', 'Library') - connect(world, player, names, 'Lower lake desolation', 'Space time continuum', lambda state: state.has('Twin Pyramid Key', player)) - connect(world, player, names, 'Library', 'Lower lake desolation') + connect(world, player, names, 'Lower lake desolation', 'Eastern lake desolation') + connect(world, player, names, 'Eastern lake desolation', 'Space time continuum', lambda state: state.has('Twin Pyramid Key', player)) + connect(world, player, names, 'Eastern lake desolation', 'Library') + connect(world, player, names, 'Eastern lake desolation', 'Lower lake desolation') + connect(world, player, names, 'Eastern lake desolation', 'Upper lake desolation', lambda state: state._timespinner_has_fire(world, player) and state.can_reach('Upper Lake Serene', 'Region', player)) + connect(world, player, names, 'Library', 'Eastern lake desolation') connect(world, player, names, 'Library', 'Library top', lambda state: state._timespinner_has_doublejump(world, player) or state.has('Talaria Attachment', player)) connect(world, player, names, 'Library', 'Varndagroth tower left', lambda state: state._timespinner_has_keycard_D(world, player)) connect(world, player, names, 'Library', 'Space time continuum', lambda state: state.has('Twin Pyramid Key', player)) @@ -174,7 +179,7 @@ def throwIfAnyLocationIsNotAssignedToARegion(regions: List[Region], regionNames: existingRegions.add(region.name) if (regionNames - existingRegions): - raise Exception("Tiemspinner: the following regions are used in locations: {}, but no such region exists".format(regionNames - existingRegions)) + raise Exception("Timespinner: the following regions are used in locations: {}, but no such region exists".format(regionNames - existingRegions)) def create_location(player: int, location_data: LocationData, region: Region, location_cache: List[Location]) -> Location: @@ -234,7 +239,7 @@ def connect(world: MultiWorld, player: int, used_names: Dict[str, int], source: name = target else: used_names[target] += 1 - name = target + (' ' * used_names[target]) + name = target + (' ' * used_names[target]) connection = Entrance(player, name, sourceRegion) diff --git a/worlds/timespinner/__init__.py b/worlds/timespinner/__init__.py index 1b0b060e..4460821a 100644 --- a/worlds/timespinner/__init__.py +++ b/worlds/timespinner/__init__.py @@ -226,4 +226,4 @@ def get_personal_items(player: int, locations: List[Location]) -> Dict[int, int] if location.address and location.item and location.item.code and location.item.player == player: personal_items[location.address] = location.item.code - return personal_items \ No newline at end of file + return personal_items