From dcecbb87a19c47c7d00f773f8df6bf98d65410ef Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 22 Oct 2025 19:27:09 -0400 Subject: Make icarus optional --- apworld/player_logic.py | 55 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 6 deletions(-) (limited to 'apworld/player_logic.py') diff --git a/apworld/player_logic.py b/apworld/player_logic.py index 5271ed1..0cf0473 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py @@ -202,6 +202,8 @@ class LetterBehavior(IntEnum): class Lingo2PlayerLogic: world: "Lingo2World" + shuffled_maps: set[int] + locations_by_room: dict[int, list[PlayerLocation]] event_loc_item_by_room: dict[int, dict[str, str]] @@ -227,9 +229,24 @@ class Lingo2PlayerLogic: self.real_items = list() self.double_letter_amount = dict() + def should_shuffle_map(game_map) -> bool: + if game_map.type == data_pb2.MapType.NORMAL_MAP: + return True + elif game_map.type == data_pb2.MapType.ICARUS: + return bool(world.options.enable_icarus) + + return False + + self.shuffled_maps = set(game_map.id for game_map in world.static_logic.objects.maps + if should_shuffle_map(game_map)) + if self.world.options.shuffle_doors: for progressive in world.static_logic.objects.progressives: for i in range(0, len(progressive.doors)): + door = world.static_logic.objects.doors[progressive.doors[i]] + if door.map_id not in self.shuffled_maps: + continue + self.item_by_door[progressive.doors[i]] = (progressive.name, i + 1) self.real_items.append(progressive.name) @@ -246,14 +263,21 @@ class Lingo2PlayerLogic: else: continue - for door in door_group.doors: - self.item_by_door[door] = (door_group.name, 1) + shuffleable_doors = [door_id for door_id in door_group.doors + if world.static_logic.objects.doors[door_id].map_id in self.shuffled_maps] - self.real_items.append(door_group.name) + if len(shuffleable_doors) > 0: + for door in shuffleable_doors: + self.item_by_door[door] = (door_group.name, 1) + + self.real_items.append(door_group.name) # We iterate through the doors in two parts because it is essential that we determine which doors are shuffled # before we calculate any access requirements. for door in world.static_logic.objects.doors: + if door.map_id not in self.shuffled_maps: + continue + if door.type in [data_pb2.DoorType.EVENT, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]: continue @@ -282,18 +306,28 @@ class Lingo2PlayerLogic: if door_group.type != data_pb2.DoorGroupType.CYAN_DOORS: continue - for door in door_group.doors: - if not door in self.item_by_door: + shuffleable_doors = [door_id for door_id in door_group.doors + if world.static_logic.objects.doors[door_id].map_id in self.shuffled_maps + and door_id not in self.item_by_door] + + if len(shuffleable_doors) > 0: + for door in shuffleable_doors: self.item_by_door[door] = (door_group.name, 1) - self.real_items.append(door_group.name) + self.real_items.append(door_group.name) for door in world.static_logic.objects.doors: + if door.map_id not in self.shuffled_maps: + continue + if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]: self.locations_by_room.setdefault(door.room_id, []).append(PlayerLocation(door.ap_id, self.get_door_reqs(door.id))) for letter in world.static_logic.objects.letters: + if world.static_logic.get_room_object_map_id(letter) not in self.shuffled_maps: + continue + self.locations_by_room.setdefault(letter.room_id, []).append(PlayerLocation(letter.ap_id, AccessRequirements())) behavior = self.get_letter_behavior(letter.key, letter.level2) @@ -313,10 +347,16 @@ class Lingo2PlayerLogic: self.double_letter_amount[letter.key.upper()] = self.double_letter_amount.get(letter.key.upper(), 0) + 1 for mastery in world.static_logic.objects.masteries: + if world.static_logic.get_room_object_map_id(mastery) not in self.shuffled_maps: + continue + self.locations_by_room.setdefault(mastery.room_id, []).append(PlayerLocation(mastery.ap_id, AccessRequirements())) for ending in world.static_logic.objects.endings: + if world.static_logic.get_room_object_map_id(ending) not in self.shuffled_maps: + continue + # Don't create a location for your selected ending, and never create a location for White Ending. if world.options.victory_condition.current_key.removesuffix("_ending").upper() != ending.name\ and ending.name != "WHITE": @@ -335,6 +375,9 @@ class Lingo2PlayerLogic: if self.world.options.keyholder_sanity: for keyholder in world.static_logic.objects.keyholders: if keyholder.HasField("key"): + if world.static_logic.get_room_object_map_id(keyholder) not in self.shuffled_maps: + continue + reqs = AccessRequirements() if self.get_letter_behavior(keyholder.key, False) != LetterBehavior.UNLOCKED: -- cgit 1.4.1