summary refs log tree commit diff stats
path: root/apworld/player_logic.py
diff options
context:
space:
mode:
Diffstat (limited to 'apworld/player_logic.py')
-rw-r--r--apworld/player_logic.py60
1 files changed, 35 insertions, 25 deletions
diff --git a/apworld/player_logic.py b/apworld/player_logic.py index edf8c4f..83c16f2 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py
@@ -63,6 +63,8 @@ class Lingo2PlayerLogic:
63 world: "Lingo2World" 63 world: "Lingo2World"
64 64
65 locations_by_room: dict[int, list[PlayerLocation]] 65 locations_by_room: dict[int, list[PlayerLocation]]
66 event_loc_item_by_room: dict[int, dict[str, str]]
67
66 item_by_door: dict[int, str] 68 item_by_door: dict[int, str]
67 69
68 panel_reqs: dict[int, AccessRequirements] 70 panel_reqs: dict[int, AccessRequirements]
@@ -74,6 +76,7 @@ class Lingo2PlayerLogic:
74 def __init__(self, world: "Lingo2World"): 76 def __init__(self, world: "Lingo2World"):
75 self.world = world 77 self.world = world
76 self.locations_by_room = {} 78 self.locations_by_room = {}
79 self.event_loc_item_by_room = {}
77 self.item_by_door = {} 80 self.item_by_door = {}
78 self.panel_reqs = dict() 81 self.panel_reqs = dict()
79 self.proxy_reqs = dict() 82 self.proxy_reqs = dict()
@@ -105,6 +108,14 @@ class Lingo2PlayerLogic:
105 self.locations_by_room.setdefault(ending.room_id, []).append(PlayerLocation(ending.ap_id, 108 self.locations_by_room.setdefault(ending.room_id, []).append(PlayerLocation(ending.ap_id,
106 AccessRequirements())) 109 AccessRequirements()))
107 110
111 event_name = f"{ending.name.capitalize()} Ending (Achieved)"
112 item_name = event_name
113
114 if world.options.victory_condition.current_key.removesuffix("_ending").upper() == ending.name:
115 item_name = "Victory"
116
117 self.event_loc_item_by_room.setdefault(ending.room_id, {})[event_name] = item_name
118
108 def get_panel_reqs(self, panel_id: int, answer: str | None) -> AccessRequirements: 119 def get_panel_reqs(self, panel_id: int, answer: str | None) -> AccessRequirements:
109 if answer is None: 120 if answer is None:
110 if panel_id not in self.panel_reqs: 121 if panel_id not in self.panel_reqs:
@@ -131,6 +142,12 @@ class Lingo2PlayerLogic:
131 proxy_reqs.add_solution(proxy.answer) 142 proxy_reqs.add_solution(proxy.answer)
132 143
133 reqs.or_logic.append([proxy_reqs]) 144 reqs.or_logic.append([proxy_reqs])
145
146 if not any(proxy.answer == panel.answer for proxy in panel.proxies):
147 proxy_reqs = AccessRequirements()
148 proxy_reqs.add_solution(panel.answer)
149
150 reqs.or_logic.append([proxy_reqs])
134 else: 151 else:
135 reqs.add_solution(panel.answer) 152 reqs.add_solution(panel.answer)
136 153
@@ -158,32 +175,25 @@ class Lingo2PlayerLogic:
158 door = self.world.static_logic.objects.doors[door_id] 175 door = self.world.static_logic.objects.doors[door_id]
159 reqs = AccessRequirements() 176 reqs = AccessRequirements()
160 177
161 use_item = False 178 # TODO: complete_at, control_center_color, switches, keyholders
162 if door.type in [data_pb2.DoorType.STANDARD, data_pb2.DoorType.ITEM_ONLY] and self.world.options.shuffle_doors: 179 if not door.HasField("complete_at") or door.complete_at == 0:
163 use_item = True 180 for proxy in door.panels:
164 181 panel_reqs = self.get_panel_reqs(proxy.panel, proxy.answer if proxy.HasField("answer") else None)
165 if use_item: 182 reqs.merge(panel_reqs)
166 reqs.items.add(self.world.static_logic.get_door_item_name(door.id)) 183 elif door.complete_at == 1:
184 reqs.or_logic.append([self.get_panel_reqs(proxy.panel,
185 proxy.answer if proxy.HasField("answer") else None)
186 for proxy in door.panels])
167 else: 187 else:
168 # TODO: complete_at, control_center_color, switches, keyholders 188 # TODO: Handle complete_at > 1
169 if not door.HasField("complete_at") or door.complete_at == 0: 189 pass
170 for proxy in door.panels: 190
171 panel_reqs = self.get_panel_reqs(proxy.panel, proxy.answer if proxy.HasField("answer") else None) 191 for room in door.rooms:
172 reqs.merge(panel_reqs) 192 reqs.rooms.add(self.world.static_logic.get_room_region_name(room))
173 elif door.complete_at == 1: 193
174 reqs.or_logic.append([self.get_panel_reqs(proxy.panel, 194 for sub_door_id in door.doors:
175 proxy.answer if proxy.HasField("answer") else None) 195 sub_reqs = self.get_door_open_reqs(sub_door_id)
176 for proxy in door.panels]) 196 reqs.merge(sub_reqs)
177 else:
178 # TODO: Handle complete_at > 1
179 pass
180
181 for room in door.rooms:
182 reqs.rooms.add(self.world.static_logic.get_room_region_name(room))
183
184 for sub_door_id in door.doors:
185 sub_reqs = self.get_door_open_reqs(sub_door_id)
186 reqs.merge(sub_reqs)
187 197
188 return reqs 198 return reqs
189 199