summary refs log tree commit diff stats
path: root/apworld
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2025-09-02 14:09:35 -0400
committerStar Rauchenberger <fefferburbia@gmail.com>2025-09-02 14:09:35 -0400
commit7f82beb120e222ace6c258fc3982b5988f9ae070 (patch)
tree6a9fdf65badf1ed5e7d26b9a07bf0b0e840ca10e /apworld
parent7f5f14ddb5a67e1ccfdc7aa3d68d829473d0b745 (diff)
downloadlingo2-archipelago-7f82beb120e222ace6c258fc3982b5988f9ae070.tar.gz
lingo2-archipelago-7f82beb120e222ace6c258fc3982b5988f9ae070.tar.bz2
lingo2-archipelago-7f82beb120e222ace6c258fc3982b5988f9ae070.zip
Added keyholder sanity
Diffstat (limited to 'apworld')
-rw-r--r--apworld/__init__.py4
-rw-r--r--apworld/options.py10
-rw-r--r--apworld/player_logic.py9
-rw-r--r--apworld/static_logic.py22
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
11class 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
11class VictoryCondition(Choice): 20class 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
30class Lingo2Options(PerGameCommonOptions): 39class 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