about summary refs log tree commit diff stats
path: root/apworld
diff options
context:
space:
mode:
Diffstat (limited to 'apworld')
-rw-r--r--apworld/options.py9
-rw-r--r--apworld/player_logic.py35
-rw-r--r--apworld/static_logic.py3
3 files changed, 41 insertions, 6 deletions
diff --git a/apworld/options.py b/apworld/options.py index f7dc5bd..dbf09e7 100644 --- a/apworld/options.py +++ b/apworld/options.py
@@ -8,6 +8,14 @@ class ShuffleDoors(Toggle):
8 display_name = "Shuffle Doors" 8 display_name = "Shuffle Doors"
9 9
10 10
11class ShuffleControlCenterColors(Toggle):
12 """
13 Some doors open after solving the COLOR panel in the Control Center. If this option is enabled, these doors will
14 instead open upon receiving an item.
15 """
16 display_name = "Shuffle Control Center Colors"
17
18
11class ShuffleLetters(Choice): 19class ShuffleLetters(Choice):
12 """ 20 """
13 Controls how letter unlocks are handled. Note that H1, I1, N1, and T1 will always be present at their vanilla 21 Controls how letter unlocks are handled. Note that H1, I1, N1, and T1 will always be present at their vanilla
@@ -71,6 +79,7 @@ class VictoryCondition(Choice):
71@dataclass 79@dataclass
72class Lingo2Options(PerGameCommonOptions): 80class Lingo2Options(PerGameCommonOptions):
73 shuffle_doors: ShuffleDoors 81 shuffle_doors: ShuffleDoors
82 shuffle_control_center_colors: ShuffleControlCenterColors
74 shuffle_letters: ShuffleLetters 83 shuffle_letters: ShuffleLetters
75 keyholder_sanity: KeyholderSanity 84 keyholder_sanity: KeyholderSanity
76 daedalus_roof_access: DaedalusRoofAccess 85 daedalus_roof_access: DaedalusRoofAccess
diff --git a/apworld/player_logic.py b/apworld/player_logic.py index 5cb9011..ce9a4e5 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py
@@ -123,16 +123,39 @@ class Lingo2PlayerLogic:
123 self.item_by_door[progressive.doors[i]] = (progressive.name, i + 1) 123 self.item_by_door[progressive.doors[i]] = (progressive.name, i + 1)
124 self.real_items.append(progressive.name) 124 self.real_items.append(progressive.name)
125 125
126 for door_group in world.static_logic.objects.door_groups:
127 if door_group.type == data_pb2.DoorGroupType.CONNECTOR and not self.world.options.shuffle_doors:
128 continue
129
130 if (door_group.type == data_pb2.DoorGroupType.COLOR_CONNECTOR and
131 not self.world.options.shuffle_control_center_colors):
132 continue
133
134 for door in door_group.doors:
135 self.item_by_door[door] = (door_group.name, 1)
136
137 self.real_items.append(door_group.name)
138
126 # We iterate through the doors in two parts because it is essential that we determine which doors are shuffled 139 # We iterate through the doors in two parts because it is essential that we determine which doors are shuffled
127 # before we calculate any access requirements. 140 # before we calculate any access requirements.
128 for door in world.static_logic.objects.doors: 141 for door in world.static_logic.objects.doors:
129 if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.ITEM_ONLY] and self.world.options.shuffle_doors: 142 if door.type in [data_pb2.DoorType.EVENT, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]:
130 if door.id in self.item_by_door: 143 continue
131 continue 144
145 if door.id in self.item_by_door:
146 continue
147
148 if (door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.ITEM_ONLY] and
149 not self.world.options.shuffle_doors):
150 continue
151
152 if (door.type == data_pb2.DoorType.CONTROL_CENTER_COLOR and
153 not self.world.options.shuffle_control_center_colors):
154 continue
132 155
133 door_item_name = self.world.static_logic.get_door_item_name(door) 156 door_item_name = self.world.static_logic.get_door_item_name(door)
134 self.item_by_door[door.id] = (door_item_name, 1) 157 self.item_by_door[door.id] = (door_item_name, 1)
135 self.real_items.append(door_item_name) 158 self.real_items.append(door_item_name)
136 159
137 for door in world.static_logic.objects.doors: 160 for door in world.static_logic.objects.doors:
138 if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]: 161 if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.LOCATION_ONLY, data_pb2.DoorType.GRAVESTONE]:
diff --git a/apworld/static_logic.py b/apworld/static_logic.py index b699d59..3f6cdea 100644 --- a/apworld/static_logic.py +++ b/apworld/static_logic.py
@@ -44,6 +44,9 @@ class Lingo2StaticLogic:
44 for progressive in self.objects.progressives: 44 for progressive in self.objects.progressives:
45 self.item_id_to_name[progressive.ap_id] = progressive.name 45 self.item_id_to_name[progressive.ap_id] = progressive.name
46 46
47 for door_group in self.objects.door_groups:
48 self.item_id_to_name[door_group.ap_id] = door_group.name
49
47 for keyholder in self.objects.keyholders: 50 for keyholder in self.objects.keyholders:
48 if keyholder.HasField("key"): 51 if keyholder.HasField("key"):
49 location_name = f"{self.get_room_object_location_prefix(keyholder)} - {keyholder.key.upper()} Keyholder" 52 location_name = f"{self.get_room_object_location_prefix(keyholder)} - {keyholder.key.upper()} Keyholder"