diff options
Diffstat (limited to 'apworld/player_logic.py')
-rw-r--r-- | apworld/player_logic.py | 60 |
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 | ||