about summary refs log tree commit diff stats
path: root/apworld/client/gamedata.gd
diff options
context:
space:
mode:
Diffstat (limited to 'apworld/client/gamedata.gd')
-rw-r--r--apworld/client/gamedata.gd294
1 files changed, 294 insertions, 0 deletions
diff --git a/apworld/client/gamedata.gd b/apworld/client/gamedata.gd new file mode 100644 index 0000000..9305003 --- /dev/null +++ b/apworld/client/gamedata.gd
@@ -0,0 +1,294 @@
1extends Node
2
3var SCRIPT_proto
4
5var objects
6var door_id_by_map_node_path = {}
7var painting_id_by_map_node_path = {}
8var panel_id_by_map_node_path = {}
9var port_id_by_map_node_path = {}
10var door_id_by_ap_id = {}
11var map_id_by_name = {}
12var progressive_id_by_ap_id = {}
13var letter_id_by_ap_id = {}
14var symbol_item_ids = []
15var anti_trap_ids = {}
16var location_name_by_id = {}
17var ending_display_name_by_name = {}
18
19var kSYMBOL_ITEMS
20
21
22func _init(proto_script):
23 SCRIPT_proto = proto_script
24
25 kSYMBOL_ITEMS = {
26 SCRIPT_proto.PuzzleSymbol.SUN: "Sun Symbol",
27 SCRIPT_proto.PuzzleSymbol.SPARKLES: "Sparkles Symbol",
28 SCRIPT_proto.PuzzleSymbol.ZERO: "Zero Symbol",
29 SCRIPT_proto.PuzzleSymbol.EXAMPLE: "Example Symbol",
30 SCRIPT_proto.PuzzleSymbol.BOXES: "Boxes Symbol",
31 SCRIPT_proto.PuzzleSymbol.PLANET: "Planet Symbol",
32 SCRIPT_proto.PuzzleSymbol.PYRAMID: "Pyramid Symbol",
33 SCRIPT_proto.PuzzleSymbol.CROSS: "Cross Symbol",
34 SCRIPT_proto.PuzzleSymbol.SWEET: "Sweet Symbol",
35 SCRIPT_proto.PuzzleSymbol.GENDER: "Gender Symbol",
36 SCRIPT_proto.PuzzleSymbol.AGE: "Age Symbol",
37 SCRIPT_proto.PuzzleSymbol.SOUND: "Sound Symbol",
38 SCRIPT_proto.PuzzleSymbol.ANAGRAM: "Anagram Symbol",
39 SCRIPT_proto.PuzzleSymbol.JOB: "Job Symbol",
40 SCRIPT_proto.PuzzleSymbol.STARS: "Stars Symbol",
41 SCRIPT_proto.PuzzleSymbol.NULL: "Null Symbol",
42 SCRIPT_proto.PuzzleSymbol.EVAL: "Eval Symbol",
43 SCRIPT_proto.PuzzleSymbol.LINGO: "Lingo Symbol",
44 SCRIPT_proto.PuzzleSymbol.QUESTION: "Question Symbol",
45 }
46
47
48func load(data_bytes):
49 objects = SCRIPT_proto.AllObjects.new()
50
51 var result_code = objects.from_bytes(data_bytes)
52 if result_code != SCRIPT_proto.PB_ERR.NO_ERRORS:
53 print("Could not load generated data: %d" % result_code)
54 return
55
56 for map in objects.get_maps():
57 map_id_by_name[map.get_name()] = map.get_id()
58
59 for door in objects.get_doors():
60 var map = objects.get_maps()[door.get_map_id()]
61
62 if not map.get_name() in door_id_by_map_node_path:
63 door_id_by_map_node_path[map.get_name()] = {}
64
65 var map_data = door_id_by_map_node_path[map.get_name()]
66 for receiver in door.get_receivers():
67 map_data[receiver] = door.get_id()
68
69 for painting_id in door.get_move_paintings():
70 var painting = objects.get_paintings()[painting_id]
71 map_data[painting.get_path()] = door.get_id()
72
73 if door.has_ap_id():
74 door_id_by_ap_id[door.get_ap_id()] = door.get_id()
75
76 if (
77 door.get_type() == SCRIPT_proto.DoorType.STANDARD
78 or door.get_type() == SCRIPT_proto.DoorType.LOCATION_ONLY
79 or door.get_type() == SCRIPT_proto.DoorType.GRAVESTONE
80 ):
81 location_name_by_id[door.get_ap_id()] = _get_door_location_name(door)
82
83 for painting in objects.get_paintings():
84 var room = objects.get_rooms()[painting.get_room_id()]
85 var map = objects.get_maps()[room.get_map_id()]
86
87 if not map.get_name() in painting_id_by_map_node_path:
88 painting_id_by_map_node_path[map.get_name()] = {}
89
90 var _map_data = painting_id_by_map_node_path[map.get_name()]
91
92 for port in objects.get_ports():
93 var room = objects.get_rooms()[port.get_room_id()]
94 var map = objects.get_maps()[room.get_map_id()]
95
96 if not map.get_name() in port_id_by_map_node_path:
97 port_id_by_map_node_path[map.get_name()] = {}
98
99 var map_data = port_id_by_map_node_path[map.get_name()]
100 map_data[port.get_path()] = port.get_id()
101
102 for progressive in objects.get_progressives():
103 progressive_id_by_ap_id[progressive.get_ap_id()] = progressive.get_id()
104
105 for letter in objects.get_letters():
106 letter_id_by_ap_id[letter.get_ap_id()] = letter.get_id()
107 location_name_by_id[letter.get_ap_id()] = _get_letter_location_name(letter)
108
109 for mastery in objects.get_masteries():
110 location_name_by_id[mastery.get_ap_id()] = _get_mastery_location_name(mastery)
111
112 for ending in objects.get_endings():
113 var location_name = _get_ending_location_name(ending)
114 location_name_by_id[ending.get_ap_id()] = location_name
115 ending_display_name_by_name[ending.get_name()] = location_name
116
117 for keyholder in objects.get_keyholders():
118 if keyholder.has_key():
119 location_name_by_id[keyholder.get_ap_id()] = _get_keyholder_location_name(keyholder)
120
121 for panel in objects.get_panels():
122 var room = objects.get_rooms()[panel.get_room_id()]
123 var map = objects.get_maps()[room.get_map_id()]
124
125 if not map.get_name() in panel_id_by_map_node_path:
126 panel_id_by_map_node_path[map.get_name()] = {}
127
128 var map_data = panel_id_by_map_node_path[map.get_name()]
129 map_data[panel.get_path()] = panel.get_id()
130
131 for symbol_name in kSYMBOL_ITEMS.values():
132 symbol_item_ids.append(objects.get_special_ids()[symbol_name])
133
134 for special_name in objects.get_special_ids().keys():
135 if special_name.begins_with("Anti "):
136 anti_trap_ids[objects.get_special_ids()[special_name]] = (
137 special_name.substr(5).to_lower()
138 )
139
140
141func get_door_for_map_node_path(map_name, node_path):
142 if not door_id_by_map_node_path.has(map_name):
143 return null
144
145 var map_data = door_id_by_map_node_path[map_name]
146 return map_data.get(node_path, null)
147
148
149func get_panel_for_map_node_path(map_name, node_path):
150 if not panel_id_by_map_node_path.has(map_name):
151 return null
152
153 var map_data = panel_id_by_map_node_path[map_name]
154 return map_data.get(node_path, null)
155
156
157func get_port_for_map_node_path(map_name, node_path):
158 if not port_id_by_map_node_path.has(map_name):
159 return null
160
161 var map_data = port_id_by_map_node_path[map_name]
162 return map_data.get(node_path, null)
163
164
165func get_door_ap_id(door_id):
166 var door = objects.get_doors()[door_id]
167 if door.has_ap_id():
168 return door.get_ap_id()
169 else:
170 return null
171
172
173func get_door_map_name(door_id):
174 var door = objects.get_doors()[door_id]
175 var map = objects.get_maps()[door.get_map_id()]
176 return map.get_name()
177
178
179func get_door_receivers(door_id):
180 var door = objects.get_doors()[door_id]
181 return door.get_receivers()
182
183
184func get_worldport_display_name(port_id):
185 var port = objects.get_ports()[port_id]
186 return "%s - %s" % [_get_room_object_map_name(port), port.get_display_name()]
187
188
189func _get_map_object_map_name(obj):
190 return objects.get_maps()[obj.get_map_id()].get_display_name()
191
192
193func _get_room_object_map_name(obj):
194 return _get_map_object_map_name(objects.get_rooms()[obj.get_room_id()])
195
196
197func _get_room_object_location_prefix(obj):
198 var room = objects.get_rooms()[obj.get_room_id()]
199 var game_map = objects.get_maps()[room.get_map_id()]
200
201 if room.has_panel_display_name():
202 return "%s (%s)" % [game_map.get_display_name(), room.get_panel_display_name()]
203 else:
204 return game_map.get_display_name()
205
206
207func _get_door_location_name(door):
208 var map_part = _get_room_object_location_prefix(door)
209
210 if door.has_location_name():
211 return "%s - %s" % [map_part, door.get_location_name()]
212
213 var generated_location_name = _get_generated_door_location_name(door)
214 if generated_location_name != null:
215 return generated_location_name
216
217 return "%s - %s" % [map_part, door.get_name()]
218
219
220func _get_generated_door_location_name(door):
221 if door.get_type() != SCRIPT_proto.DoorType.STANDARD:
222 return null
223
224 if door.get_keyholders().size() > 0 or door.get_endings().size() > 0 or door.has_complete_at():
225 return null
226
227 if door.get_panels().size() > 4:
228 return null
229
230 var map_areas = []
231 for panel_id in door.get_panels():
232 var panel = objects.get_panels()[panel_id.get_panel()]
233 var panel_room = objects.get_rooms()[panel.get_room_id()]
234 # It's okay if panel_display_name is not present because then it's coalesced with other unnamed areas.
235 var panel_display_name = ""
236 if panel_room.has_panel_display_name():
237 panel_display_name = panel_room.get_panel_display_name()
238 if not map_areas.has(panel_display_name):
239 map_areas.append(panel_display_name)
240
241 if map_areas.size() > 1:
242 return null
243
244 var game_map = objects.get_maps()[door.get_map_id()]
245 var map_area = map_areas[0]
246 var map_part
247 if map_area == "":
248 map_part = game_map.get_display_name()
249 else:
250 map_part = "%s (%s)" % [game_map.get_display_name(), map_area]
251
252 var panel_names = []
253 for panel_id in door.get_panels():
254 var panel_data = objects.get_panels()[panel_id.get_panel()]
255 var panel_name
256 if panel_data.has_display_name():
257 panel_name = panel_data.get_display_name()
258 else:
259 panel_name = panel_data.get_name()
260
261 var location_part
262 if panel_id.has_answer():
263 location_part = "%s/%s" % [panel_name, panel_id.get_answer().to_upper()]
264 else:
265 location_part = panel_name
266
267 panel_names.append(location_part)
268
269 panel_names.sort()
270
271 return map_part + " - " + ", ".join(panel_names)
272
273
274func _get_letter_location_name(letter):
275 var letter_level = 2 if (letter.has_level2() and letter.get_level2()) else 1
276 var letter_name = "%s%d" % [letter.get_key().to_upper(), letter_level]
277 return "%s - %s" % [_get_room_object_map_name(letter), letter_name]
278
279
280func _get_mastery_location_name(mastery):
281 return "%s - Mastery" % _get_room_object_map_name(mastery)
282
283
284func _get_ending_location_name(ending):
285 return (
286 "%s - %s Ending" % [_get_room_object_map_name(ending), ending.get_name().to_pascal_case()]
287 )
288
289
290func _get_keyholder_location_name(keyholder):
291 return (
292 "%s - %s Keyholder"
293 % [_get_room_object_location_prefix(keyholder), keyholder.get_key().to_upper()]
294 )