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.gd286
1 files changed, 286 insertions, 0 deletions
diff --git a/apworld/client/gamedata.gd b/apworld/client/gamedata.gd new file mode 100644 index 0000000..334d42a --- /dev/null +++ b/apworld/client/gamedata.gd
@@ -0,0 +1,286 @@
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 location_name_by_id[door.get_ap_id()] = _get_door_location_name(door)
76
77 for painting in objects.get_paintings():
78 var room = objects.get_rooms()[painting.get_room_id()]
79 var map = objects.get_maps()[room.get_map_id()]
80
81 if not map.get_name() in painting_id_by_map_node_path:
82 painting_id_by_map_node_path[map.get_name()] = {}
83
84 var _map_data = painting_id_by_map_node_path[map.get_name()]
85
86 for port in objects.get_ports():
87 var room = objects.get_rooms()[port.get_room_id()]
88 var map = objects.get_maps()[room.get_map_id()]
89
90 if not map.get_name() in port_id_by_map_node_path:
91 port_id_by_map_node_path[map.get_name()] = {}
92
93 var map_data = port_id_by_map_node_path[map.get_name()]
94 map_data[port.get_path()] = port.get_id()
95
96 for progressive in objects.get_progressives():
97 progressive_id_by_ap_id[progressive.get_ap_id()] = progressive.get_id()
98
99 for letter in objects.get_letters():
100 letter_id_by_ap_id[letter.get_ap_id()] = letter.get_id()
101 location_name_by_id[letter.get_ap_id()] = _get_letter_location_name(letter)
102
103 for mastery in objects.get_masteries():
104 location_name_by_id[mastery.get_ap_id()] = _get_mastery_location_name(mastery)
105
106 for ending in objects.get_endings():
107 var location_name = _get_ending_location_name(ending)
108 location_name_by_id[ending.get_ap_id()] = location_name
109 ending_display_name_by_name[ending.get_name()] = location_name
110
111 for keyholder in objects.get_keyholders():
112 if keyholder.has_key():
113 location_name_by_id[keyholder.get_ap_id()] = _get_keyholder_location_name(keyholder)
114
115 for panel in objects.get_panels():
116 var room = objects.get_rooms()[panel.get_room_id()]
117 var map = objects.get_maps()[room.get_map_id()]
118
119 if not map.get_name() in panel_id_by_map_node_path:
120 panel_id_by_map_node_path[map.get_name()] = {}
121
122 var map_data = panel_id_by_map_node_path[map.get_name()]
123 map_data[panel.get_path()] = panel.get_id()
124
125 for symbol_name in kSYMBOL_ITEMS.values():
126 symbol_item_ids.append(objects.get_special_ids()[symbol_name])
127
128 for special_name in objects.get_special_ids().keys():
129 if special_name.begins_with("Anti "):
130 anti_trap_ids[objects.get_special_ids()[special_name]] = (
131 special_name.substr(5).to_lower()
132 )
133
134
135func get_door_for_map_node_path(map_name, node_path):
136 if not door_id_by_map_node_path.has(map_name):
137 return null
138
139 var map_data = door_id_by_map_node_path[map_name]
140 return map_data.get(node_path, null)
141
142
143func get_panel_for_map_node_path(map_name, node_path):
144 if not panel_id_by_map_node_path.has(map_name):
145 return null
146
147 var map_data = panel_id_by_map_node_path[map_name]
148 return map_data.get(node_path, null)
149
150
151func get_port_for_map_node_path(map_name, node_path):
152 if not port_id_by_map_node_path.has(map_name):
153 return null
154
155 var map_data = port_id_by_map_node_path[map_name]
156 return map_data.get(node_path, null)
157
158
159func get_door_ap_id(door_id):
160 var door = objects.get_doors()[door_id]
161 if door.has_ap_id():
162 return door.get_ap_id()
163 else:
164 return null
165
166
167func get_door_map_name(door_id):
168 var door = objects.get_doors()[door_id]
169 var room = objects.get_rooms()[door.get_room_id()]
170 var map = objects.get_maps()[room.get_map_id()]
171 return map.get_name()
172
173
174func get_door_receivers(door_id):
175 var door = objects.get_doors()[door_id]
176 return door.get_receivers()
177
178
179func get_worldport_display_name(port_id):
180 var port = objects.get_ports()[port_id]
181 return "%s - %s" % [_get_room_object_map_name(port), port.get_display_name()]
182
183
184func _get_map_object_map_name(obj):
185 return objects.get_maps()[obj.get_map_id()].get_display_name()
186
187
188func _get_room_object_map_name(obj):
189 return _get_map_object_map_name(objects.get_rooms()[obj.get_room_id()])
190
191
192func _get_room_object_location_prefix(obj):
193 var room = objects.get_rooms()[obj.get_room_id()]
194 var game_map = objects.get_maps()[room.get_map_id()]
195
196 if room.has_panel_display_name():
197 return "%s (%s)" % [game_map.get_display_name(), room.get_panel_display_name()]
198 else:
199 return game_map.get_display_name()
200
201
202func _get_door_location_name(door):
203 var map_part = _get_room_object_location_prefix(door)
204
205 if door.has_location_name():
206 return "%s - %s" % [map_part, door.get_location_name()]
207
208 var generated_location_name = _get_generated_door_location_name(door)
209 if generated_location_name != null:
210 return generated_location_name
211
212 return "%s - %s" % [map_part, door.get_name()]
213
214
215func _get_generated_door_location_name(door):
216 if door.get_type() != SCRIPT_proto.DoorType.STANDARD:
217 return null
218
219 if door.get_keyholders().size() > 0 or door.get_endings().size() > 0 or door.has_complete_at():
220 return null
221
222 if door.get_panels().size() > 4:
223 return null
224
225 var map_areas = []
226 for panel_id in door.get_panels():
227 var panel = objects.get_panels()[panel_id.get_panel()]
228 var panel_room = objects.get_rooms()[panel.get_room_id()]
229 # It's okay if panel_display_name is not present because then it's coalesced with other unnamed areas.
230 if not map_areas.has(panel_room.get_panel_display_name()):
231 map_areas.append(panel_room.get_panel_display_name())
232
233 if map_areas.size() > 1:
234 return null
235
236 var game_map = objects.get_maps()[door.get_map_id()]
237 var map_area = map_areas[0]
238 var map_part
239 if map_area == "":
240 map_part = game_map.get_display_name()
241 else:
242 map_part = "%s (%s)" % [game_map.get_display_name(), map_area]
243
244 var panel_names = []
245 for panel_id in door.get_panels():
246 var panel_data = objects.get_panels()[panel_id.get_panel()]
247 var panel_name
248 if panel_data.has_display_name():
249 panel_name = panel_data.get_display_name()
250 else:
251 panel_name = panel_data.get_name()
252
253 var location_part
254 if panel_id.has_answer():
255 location_part = "%s/%s" % [panel_name, panel_id.get_answer().to_upper()]
256 else:
257 location_part = panel_name
258
259 panel_names.append(location_part)
260
261 panel_names.sort()
262
263 return map_part + " - " + ", ".join(panel_names)
264
265
266func _get_letter_location_name(letter):
267 var letter_level = 2 if letter.get_level2() else 1
268 var letter_name = "%s%d" % [letter.get_key().to_upper(), letter_level]
269 return "%s - %s" % [_get_room_object_map_name(letter), letter_name]
270
271
272func _get_mastery_location_name(mastery):
273 return "%s - Mastery" % _get_room_object_map_name(mastery)
274
275
276func _get_ending_location_name(ending):
277 return (
278 "%s - %s Ending" % [_get_room_object_map_name(ending), ending.get_name().to_pascal_case()]
279 )
280
281
282func _get_keyholder_location_name(keyholder):
283 return (
284 "%s - %s Keyholder"
285 % [_get_room_object_location_prefix(keyholder), keyholder.get_key().to_upper()]
286 )