diff options
Diffstat (limited to 'apworld/client/gamedata.gd')
-rw-r--r-- | apworld/client/gamedata.gd | 294 |
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 @@ | |||
1 | extends Node | ||
2 | |||
3 | var SCRIPT_proto | ||
4 | |||
5 | var objects | ||
6 | var door_id_by_map_node_path = {} | ||
7 | var painting_id_by_map_node_path = {} | ||
8 | var panel_id_by_map_node_path = {} | ||
9 | var port_id_by_map_node_path = {} | ||
10 | var door_id_by_ap_id = {} | ||
11 | var map_id_by_name = {} | ||
12 | var progressive_id_by_ap_id = {} | ||
13 | var letter_id_by_ap_id = {} | ||
14 | var symbol_item_ids = [] | ||
15 | var anti_trap_ids = {} | ||
16 | var location_name_by_id = {} | ||
17 | var ending_display_name_by_name = {} | ||
18 | |||
19 | var kSYMBOL_ITEMS | ||
20 | |||
21 | |||
22 | func _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 | |||
48 | func 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 | |||
141 | func 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 | |||
149 | func 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 | |||
157 | func 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 | |||
165 | func 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 | |||
173 | func 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 | |||
179 | func get_door_receivers(door_id): | ||
180 | var door = objects.get_doors()[door_id] | ||
181 | return door.get_receivers() | ||
182 | |||
183 | |||
184 | func 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 | |||
189 | func _get_map_object_map_name(obj): | ||
190 | return objects.get_maps()[obj.get_map_id()].get_display_name() | ||
191 | |||
192 | |||
193 | func _get_room_object_map_name(obj): | ||
194 | return _get_map_object_map_name(objects.get_rooms()[obj.get_room_id()]) | ||
195 | |||
196 | |||
197 | func _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 | |||
207 | func _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 | |||
220 | func _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 | |||
274 | func _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 | |||
280 | func _get_mastery_location_name(mastery): | ||
281 | return "%s - Mastery" % _get_room_object_map_name(mastery) | ||
282 | |||
283 | |||
284 | func _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 | |||
290 | func _get_keyholder_location_name(keyholder): | ||
291 | return ( | ||
292 | "%s - %s Keyholder" | ||
293 | % [_get_room_object_location_prefix(keyholder), keyholder.get_key().to_upper()] | ||
294 | ) | ||