diff options
Diffstat (limited to 'apworld')
| -rw-r--r-- | apworld/__init__.py | 4 | ||||
| -rw-r--r-- | apworld/options.py | 10 | ||||
| -rw-r--r-- | apworld/player_logic.py | 9 | ||||
| -rw-r--r-- | apworld/static_logic.py | 22 |
4 files changed, 37 insertions, 8 deletions
| diff --git a/apworld/__init__.py b/apworld/__init__.py index 4e5777a..1f1e6fe 100644 --- a/apworld/__init__.py +++ b/apworld/__init__.py | |||
| @@ -65,7 +65,9 @@ class Lingo2World(World): | |||
| 65 | 65 | ||
| 66 | def fill_slot_data(self): | 66 | def fill_slot_data(self): |
| 67 | slot_options = [ | 67 | slot_options = [ |
| 68 | "victory_condition", "shuffle_doors", | 68 | "keyholder_sanity", |
| 69 | "shuffle_doors", | ||
| 70 | "victory_condition", | ||
| 69 | ] | 71 | ] |
| 70 | 72 | ||
| 71 | slot_data = { | 73 | slot_data = { |
| diff --git a/apworld/options.py b/apworld/options.py index d984beb..dacbc46 100644 --- a/apworld/options.py +++ b/apworld/options.py | |||
| @@ -8,6 +8,15 @@ class ShuffleDoors(Toggle): | |||
| 8 | display_name = "Shuffle Doors" | 8 | display_name = "Shuffle Doors" |
| 9 | 9 | ||
| 10 | 10 | ||
| 11 | class KeyholderSanity(Toggle): | ||
| 12 | """ | ||
| 13 | If enabled, 26 locations will be created for placing each key into its respective Green Ending keyholder. | ||
| 14 | |||
| 15 | NOTE: This does not apply to the two disappearing keyholders in The Congruent, as they are not part of Green Ending. | ||
| 16 | """ | ||
| 17 | display_name = "Keyholder Sanity" | ||
| 18 | |||
| 19 | |||
| 11 | class VictoryCondition(Choice): | 20 | class VictoryCondition(Choice): |
| 12 | """Victory condition.""" | 21 | """Victory condition.""" |
| 13 | display_name = "Victory Condition" | 22 | display_name = "Victory Condition" |
| @@ -29,4 +38,5 @@ class VictoryCondition(Choice): | |||
| 29 | @dataclass | 38 | @dataclass |
| 30 | class Lingo2Options(PerGameCommonOptions): | 39 | class Lingo2Options(PerGameCommonOptions): |
| 31 | shuffle_doors: ShuffleDoors | 40 | shuffle_doors: ShuffleDoors |
| 41 | keyholder_sanity: KeyholderSanity | ||
| 32 | victory_condition: VictoryCondition | 42 | victory_condition: VictoryCondition |
| diff --git a/apworld/player_logic.py b/apworld/player_logic.py index e08f644..dc1bdf0 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py | |||
| @@ -166,6 +166,15 @@ class Lingo2PlayerLogic: | |||
| 166 | 166 | ||
| 167 | self.event_loc_item_by_room.setdefault(ending.room_id, {})[event_name] = item_name | 167 | self.event_loc_item_by_room.setdefault(ending.room_id, {})[event_name] = item_name |
| 168 | 168 | ||
| 169 | if self.world.options.keyholder_sanity: | ||
| 170 | for keyholder in world.static_logic.objects.keyholders: | ||
| 171 | if keyholder.HasField("key"): | ||
| 172 | reqs = AccessRequirements() | ||
| 173 | reqs.letters[keyholder.key.upper()] = 1 | ||
| 174 | |||
| 175 | self.locations_by_room.setdefault(keyholder.room_id, []).append(PlayerLocation(keyholder.ap_id, | ||
| 176 | reqs)) | ||
| 177 | |||
| 169 | def get_panel_reqs(self, panel_id: int, answer: str | None) -> AccessRequirements: | 178 | def get_panel_reqs(self, panel_id: int, answer: str | None) -> AccessRequirements: |
| 170 | if answer is None: | 179 | if answer is None: |
| 171 | if panel_id not in self.panel_reqs: | 180 | if panel_id not in self.panel_reqs: |
| diff --git a/apworld/static_logic.py b/apworld/static_logic.py index 0613474..a945bc0 100644 --- a/apworld/static_logic.py +++ b/apworld/static_logic.py | |||
| @@ -44,6 +44,11 @@ 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 keyholder in self.objects.keyholders: | ||
| 48 | if keyholder.HasField("key"): | ||
| 49 | location_name = f"{self.get_room_object_location_prefix(keyholder)} - {keyholder.key.upper()} Keyholder" | ||
| 50 | self.location_id_to_name[keyholder.ap_id] = location_name | ||
| 51 | |||
| 47 | self.item_id_to_name[self.objects.special_ids["Nothing"]] = "Nothing" | 52 | self.item_id_to_name[self.objects.special_ids["Nothing"]] = "Nothing" |
| 48 | 53 | ||
| 49 | self.item_name_to_id = {name: ap_id for ap_id, name in self.item_id_to_name.items()} | 54 | self.item_name_to_id = {name: ap_id for ap_id, name in self.item_id_to_name.items()} |
| @@ -57,13 +62,7 @@ class Lingo2StaticLogic: | |||
| 57 | return self.get_door_item_name(door_id) | 62 | return self.get_door_item_name(door_id) |
| 58 | 63 | ||
| 59 | def get_door_location_name(self, door: data_pb2.Door) -> str: | 64 | def get_door_location_name(self, door: data_pb2.Door) -> str: |
| 60 | game_map = self.objects.maps[door.map_id] | 65 | map_part = self.get_room_object_location_prefix(door) |
| 61 | room = self.objects.rooms[door.room_id] | ||
| 62 | |||
| 63 | if room.HasField("panel_display_name"): | ||
| 64 | map_part = f"{game_map.display_name} ({room.panel_display_name})" | ||
| 65 | else: | ||
| 66 | map_part = game_map.display_name | ||
| 67 | 66 | ||
| 68 | if door.HasField("location_name"): | 67 | if door.HasField("location_name"): |
| 69 | return f"{map_part} - {door.location_name}" | 68 | return f"{map_part} - {door.location_name}" |
| @@ -129,3 +128,12 @@ class Lingo2StaticLogic: | |||
| 129 | 128 | ||
| 130 | def get_room_object_map_name(self, obj) -> str: | 129 | def get_room_object_map_name(self, obj) -> str: |
| 131 | return self.get_map_object_map_name(self.objects.rooms[obj.room_id]) | 130 | return self.get_map_object_map_name(self.objects.rooms[obj.room_id]) |
| 131 | |||
| 132 | def get_room_object_location_prefix(self, obj) -> str: | ||
| 133 | room = self.objects.rooms[obj.room_id] | ||
| 134 | game_map = self.objects.maps[room.map_id] | ||
| 135 | |||
| 136 | if room.HasField("panel_display_name"): | ||
| 137 | return f"{game_map.display_name} ({room.panel_display_name})" | ||
| 138 | else: | ||
| 139 | return game_map.display_name | ||
