about summary refs log tree commit diff stats
path: root/apworld/static_logic.py
diff options
context:
space:
mode:
Diffstat (limited to 'apworld/static_logic.py')
-rw-r--r--apworld/static_logic.py19
1 files changed, 18 insertions, 1 deletions
diff --git a/apworld/static_logic.py b/apworld/static_logic.py index 3f6cdea..1ace1e7 100644 --- a/apworld/static_logic.py +++ b/apworld/static_logic.py
@@ -1,4 +1,5 @@
1from .generated import data_pb2 as data_pb2 1from .generated import data_pb2 as data_pb2
2from .items import SYMBOL_ITEMS
2import pkgutil 3import pkgutil
3 4
4class Lingo2StaticLogic: 5class Lingo2StaticLogic:
@@ -8,9 +9,14 @@ class Lingo2StaticLogic:
8 item_name_to_id: dict[str, int] 9 item_name_to_id: dict[str, int]
9 location_name_to_id: dict[str, int] 10 location_name_to_id: dict[str, int]
10 11
12 item_name_groups: dict[str, list[str]]
13 location_name_groups: dict[str, list[str]]
14
11 def __init__(self): 15 def __init__(self):
12 self.item_id_to_name = {} 16 self.item_id_to_name = {}
13 self.location_id_to_name = {} 17 self.location_id_to_name = {}
18 self.item_name_groups = {}
19 self.location_name_groups = {}
14 20
15 file = pkgutil.get_data(__name__, "generated/data.binpb") 21 file = pkgutil.get_data(__name__, "generated/data.binpb")
16 self.objects = data_pb2.AllObjects() 22 self.objects = data_pb2.AllObjects()
@@ -29,17 +35,21 @@ class Lingo2StaticLogic:
29 letter_name = f"{letter.key.upper()}{'2' if letter.level2 else '1'}" 35 letter_name = f"{letter.key.upper()}{'2' if letter.level2 else '1'}"
30 location_name = f"{self.get_room_object_map_name(letter)} - {letter_name}" 36 location_name = f"{self.get_room_object_map_name(letter)} - {letter_name}"
31 self.location_id_to_name[letter.ap_id] = location_name 37 self.location_id_to_name[letter.ap_id] = location_name
38 self.location_name_groups.setdefault("Letters", []).append(location_name)
32 39
33 if not letter.level2: 40 if not letter.level2:
34 self.item_id_to_name[letter.ap_id] = letter.key.upper() 41 self.item_id_to_name[letter.ap_id] = letter.key.upper()
42 self.item_name_groups.setdefault("Letters", []).append(letter.key.upper())
35 43
36 for mastery in self.objects.masteries: 44 for mastery in self.objects.masteries:
37 location_name = f"{self.get_room_object_map_name(mastery)} - Mastery" 45 location_name = f"{self.get_room_object_map_name(mastery)} - Mastery"
38 self.location_id_to_name[mastery.ap_id] = location_name 46 self.location_id_to_name[mastery.ap_id] = location_name
47 self.location_name_groups.setdefault("Masteries", []).append(location_name)
39 48
40 for ending in self.objects.endings: 49 for ending in self.objects.endings:
41 location_name = f"{self.get_room_object_map_name(ending)} - {ending.name.title()} Ending" 50 location_name = f"{self.get_room_object_map_name(ending)} - {ending.name.title()} Ending"
42 self.location_id_to_name[ending.ap_id] = location_name 51 self.location_id_to_name[ending.ap_id] = location_name
52 self.location_name_groups.setdefault("Endings", []).append(location_name)
43 53
44 for progressive in self.objects.progressives: 54 for progressive in self.objects.progressives:
45 self.item_id_to_name[progressive.ap_id] = progressive.name 55 self.item_id_to_name[progressive.ap_id] = progressive.name
@@ -51,9 +61,13 @@ class Lingo2StaticLogic:
51 if keyholder.HasField("key"): 61 if keyholder.HasField("key"):
52 location_name = f"{self.get_room_object_location_prefix(keyholder)} - {keyholder.key.upper()} Keyholder" 62 location_name = f"{self.get_room_object_location_prefix(keyholder)} - {keyholder.key.upper()} Keyholder"
53 self.location_id_to_name[keyholder.ap_id] = location_name 63 self.location_id_to_name[keyholder.ap_id] = location_name
64 self.location_name_groups.setdefault("Keyholders", []).append(location_name)
54 65
55 self.item_id_to_name[self.objects.special_ids["A Job Well Done"]] = "A Job Well Done" 66 self.item_id_to_name[self.objects.special_ids["A Job Well Done"]] = "A Job Well Done"
56 67
68 for symbol_name in SYMBOL_ITEMS.values():
69 self.item_id_to_name[self.objects.special_ids[symbol_name]] = symbol_name
70
57 self.item_name_to_id = {name: ap_id for ap_id, name in self.item_id_to_name.items()} 71 self.item_name_to_id = {name: ap_id for ap_id, name in self.item_id_to_name.items()}
58 self.location_name_to_id = {name: ap_id for ap_id, name in self.location_id_to_name.items()} 72 self.location_name_to_id = {name: ap_id for ap_id, name in self.location_id_to_name.items()}
59 73
@@ -80,7 +94,7 @@ class Lingo2StaticLogic:
80 if door.type != data_pb2.DoorType.STANDARD: 94 if door.type != data_pb2.DoorType.STANDARD:
81 return None 95 return None
82 96
83 if len(door.keyholders) > 0 or len(door.endings) > 0: 97 if len(door.keyholders) > 0 or len(door.endings) > 0 or not door.HasField("complete_at"):
84 return None 98 return None
85 99
86 if len(door.panels) > 4: 100 if len(door.panels) > 4:
@@ -140,3 +154,6 @@ class Lingo2StaticLogic:
140 return f"{game_map.display_name} ({room.panel_display_name})" 154 return f"{game_map.display_name} ({room.panel_display_name})"
141 else: 155 else:
142 return game_map.display_name 156 return game_map.display_name
157
158 def get_data_version(self) -> int:
159 return self.objects.version