about summary refs log tree commit diff stats
path: root/client/Archipelago/manager.gd
diff options
context:
space:
mode:
Diffstat (limited to 'client/Archipelago/manager.gd')
-rw-r--r--client/Archipelago/manager.gd121
1 files changed, 100 insertions, 21 deletions
diff --git a/client/Archipelago/manager.gd b/client/Archipelago/manager.gd index bcb21e7..06ae7d9 100644 --- a/client/Archipelago/manager.gd +++ b/client/Archipelago/manager.gd
@@ -1,6 +1,6 @@
1extends Node 1extends Node
2 2
3const my_version = "0.1.0" 3const MOD_VERSION = 6
4 4
5var SCRIPT_client 5var SCRIPT_client
6var SCRIPT_keyboard 6var SCRIPT_keyboard
@@ -23,6 +23,7 @@ var _held_locations = []
23var _held_location_scouts = [] 23var _held_location_scouts = []
24var _location_scouts = {} 24var _location_scouts = {}
25var _item_locks = {} 25var _item_locks = {}
26var _inverse_item_locks = {}
26var _held_letters = {} 27var _held_letters = {}
27var _letters_setup = false 28var _letters_setup = false
28 29
@@ -36,10 +37,19 @@ const kLETTER_BEHAVIOR_VANILLA = 0
36const kLETTER_BEHAVIOR_ITEM = 1 37const kLETTER_BEHAVIOR_ITEM = 1
37const kLETTER_BEHAVIOR_UNLOCKED = 2 38const kLETTER_BEHAVIOR_UNLOCKED = 2
38 39
40const kCYAN_DOOR_BEHAVIOR_H2 = 0
41const kCYAN_DOOR_BEHAVIOR_DOUBLE_LETTER = 1
42const kCYAN_DOOR_BEHAVIOR_ITEM = 2
43
44var apworld_version = [0, 0]
45var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2
39var daedalus_roof_access = false 46var daedalus_roof_access = false
40var keyholder_sanity = false 47var keyholder_sanity = false
48var shuffle_control_center_colors = false
41var shuffle_doors = false 49var shuffle_doors = false
50var shuffle_gallery_paintings = false
42var shuffle_letters = kSHUFFLE_LETTERS_VANILLA 51var shuffle_letters = kSHUFFLE_LETTERS_VANILLA
52var shuffle_symbols = false
43var victory_condition = -1 53var victory_condition = -1
44 54
45signal could_not_connect 55signal could_not_connect
@@ -121,6 +131,10 @@ func saveLocaldata():
121 131
122func connectToServer(): 132func connectToServer():
123 _last_new_item = -1 133 _last_new_item = -1
134 _batch_locations = false
135 _held_locations = []
136 _held_location_scouts = []
137 _location_scouts = {}
124 _letters_setup = false 138 _letters_setup = false
125 _held_letters = {} 139 _held_letters = {}
126 140
@@ -145,24 +159,26 @@ func _process_item(item, index, from, flags, amount):
145 item_name = client._item_id_to_name["Lingo 2"][item] 159 item_name = client._item_id_to_name["Lingo 2"][item]
146 160
147 var gamedata = global.get_node("Gamedata") 161 var gamedata = global.get_node("Gamedata")
148 var door_id = gamedata.door_id_by_ap_id.get(item, null) 162
149 var prog_id = null 163 var prog_id = null
164 if _inverse_item_locks.has(item):
165 for lock in _inverse_item_locks.get(item):
166 if lock[1] != amount:
167 continue
150 168
151 if door_id == null: 169 if gamedata.progressive_id_by_ap_id.has(item):
152 prog_id = gamedata.progressive_id_by_ap_id.get(item, null) 170 prog_id = lock[0]
153 if prog_id != null: 171
154 var progressive = gamedata.objects.get_progressives()[prog_id] 172 if gamedata.get_door_map_name(lock[0]) != global.map:
155 if progressive.get_doors().size() >= amount: 173 continue
156 door_id = progressive.get_doors()[amount - 1] 174
157 175 var receivers = gamedata.get_door_receivers(lock[0])
158 if door_id != null and gamedata.get_door_map_name(door_id) == global.map: 176 var scene = get_tree().get_root().get_node_or_null("scene")
159 var receivers = gamedata.get_door_receivers(door_id) 177 if scene != null:
160 var scene = get_tree().get_root().get_node_or_null("scene") 178 for receiver in receivers:
161 if scene != null: 179 var rnode = scene.get_node_or_null(receiver)
162 for receiver in receivers: 180 if rnode != null:
163 var rnode = scene.get_node_or_null(receiver) 181 rnode.handleTriggered()
164 if rnode != null:
165 rnode.handleTriggered()
166 182
167 var letter_id = gamedata.letter_id_by_ap_id.get(item, null) 183 var letter_id = gamedata.letter_id_by_ap_id.get(item, null)
168 if letter_id != null: 184 if letter_id != null:
@@ -170,6 +186,11 @@ func _process_item(item, index, from, flags, amount):
170 if not letter.has_level2() or not letter.get_level2(): 186 if not letter.has_level2() or not letter.get_level2():
171 _process_key_item(letter.get_key(), amount) 187 _process_key_item(letter.get_key(), amount)
172 188
189 if gamedata.symbol_item_ids.has(item):
190 var player = get_tree().get_root().get_node_or_null("scene/player")
191 if player != null:
192 player.emit_signal("evaluate_solvability")
193
173 # Show a message about the item if it's new. 194 # Show a message about the item if it's new.
174 if index != null and index > _last_new_item: 195 if index != null and index > _last_new_item:
175 _last_new_item = index 196 _last_new_item = index
@@ -182,8 +203,8 @@ func _process_item(item, index, from, flags, amount):
182 var item_color = colorForItemType(flags) 203 var item_color = colorForItemType(flags)
183 204
184 var full_item_name = item_name 205 var full_item_name = item_name
185 if prog_id != null and door_id != null: 206 if prog_id != null:
186 var door = gamedata.objects.get_doors()[door_id] 207 var door = gamedata.objects.get_doors()[prog_id]
187 full_item_name = "%s (%s)" % [item_name, door.get_name()] 208 full_item_name = "%s (%s)" % [item_name, door.get_name()]
188 209
189 var message 210 var message
@@ -194,6 +215,9 @@ func _process_item(item, index, from, flags, amount):
194 "Received [color=%s]%s[/color] from %s" % [item_color, full_item_name, player_name] 215 "Received [color=%s]%s[/color] from %s" % [item_color, full_item_name, player_name]
195 ) 216 )
196 217
218 if gamedata.anti_trap_ids.has(item):
219 keyboard.block_letter(gamedata.anti_trap_ids[item])
220
197 global._print(message) 221 global._print(message)
198 222
199 global.get_node("Messages").showMessage(message) 223 global.get_node("Messages").showMessage(message)
@@ -288,6 +312,10 @@ func parse_printjson_for_textclient(message):
288func _process_location_scout(item_id, location_id, player, flags): 312func _process_location_scout(item_id, location_id, player, flags):
289 _location_scouts[location_id] = {"item": item_id, "player": player, "flags": flags} 313 _location_scouts[location_id] = {"item": item_id, "player": player, "flags": flags}
290 314
315 if player == client._slot and flags & 4 != 0:
316 # This is a trap for us, so let's not display it.
317 return
318
291 var gamedata = global.get_node("Gamedata") 319 var gamedata = global.get_node("Gamedata")
292 var map_id = gamedata.map_id_by_name.get(global.map) 320 var map_id = gamedata.map_id_by_name.get(global.map)
293 321
@@ -308,8 +336,8 @@ func _process_location_scout(item_id, location_id, player, flags):
308 collectable.setScoutedText(item_name) 336 collectable.setScoutedText(item_name)
309 337
310 338
311func _client_could_not_connect(): 339func _client_could_not_connect(message):
312 emit_signal("could_not_connect") 340 emit_signal("could_not_connect", message)
313 341
314 342
315func _client_connect_status(message): 343func _client_connect_status(message):
@@ -337,12 +365,19 @@ func _client_connected(slot_data):
337 _last_new_item = localdata[0] 365 _last_new_item = localdata[0]
338 366
339 # Read slot data. 367 # Read slot data.
368 cyan_door_behavior = int(slot_data.get("cyan_door_behavior", 0))
340 daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false)) 369 daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false))
341 keyholder_sanity = bool(slot_data.get("keyholder_sanity", false)) 370 keyholder_sanity = bool(slot_data.get("keyholder_sanity", false))
371 shuffle_control_center_colors = bool(slot_data.get("shuffle_control_center_colors", false))
342 shuffle_doors = bool(slot_data.get("shuffle_doors", false)) 372 shuffle_doors = bool(slot_data.get("shuffle_doors", false))
373 shuffle_gallery_paintings = bool(slot_data.get("shuffle_gallery_paintings", false))
343 shuffle_letters = int(slot_data.get("shuffle_letters", 0)) 374 shuffle_letters = int(slot_data.get("shuffle_letters", 0))
375 shuffle_symbols = bool(slot_data.get("shuffle_symbols", false))
344 victory_condition = int(slot_data.get("victory_condition", 0)) 376 victory_condition = int(slot_data.get("victory_condition", 0))
345 377
378 if slot_data.has("version"):
379 apworld_version = [int(slot_data["version"][0]), int(slot_data["version"][1])]
380
346 # Set up item locks. 381 # Set up item locks.
347 _item_locks = {} 382 _item_locks = {}
348 383
@@ -359,6 +394,47 @@ func _client_connected(slot_data):
359 var door = gamedata.objects.get_doors()[progressive.get_doors()[i]] 394 var door = gamedata.objects.get_doors()[progressive.get_doors()[i]]
360 _item_locks[door.get_id()] = [progressive.get_ap_id(), i + 1] 395 _item_locks[door.get_id()] = [progressive.get_ap_id(), i + 1]
361 396
397 for door_group in gamedata.objects.get_door_groups():
398 if (
399 door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.CONNECTOR
400 or door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.SHUFFLE_GROUP
401 ):
402 for door in door_group.get_doors():
403 _item_locks[door] = [door_group.get_ap_id(), 1]
404
405 if shuffle_control_center_colors:
406 for door in gamedata.objects.get_doors():
407 if door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR:
408 _item_locks[door.get_id()] = [door.get_ap_id(), 1]
409
410 for door_group in gamedata.objects.get_door_groups():
411 if door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.COLOR_CONNECTOR:
412 for door in door_group.get_doors():
413 _item_locks[door] = [door_group.get_ap_id(), 1]
414
415 if shuffle_gallery_paintings:
416 for door in gamedata.objects.get_doors():
417 if door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING:
418 _item_locks[door.get_id()] = [door.get_ap_id(), 1]
419
420 if cyan_door_behavior == kCYAN_DOOR_BEHAVIOR_ITEM:
421 for door_group in gamedata.objects.get_door_groups():
422 if door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.CYAN_DOORS:
423 for door in door_group.get_doors():
424 if not _item_locks.has(door):
425 _item_locks[door] = [door_group.get_ap_id(), 1]
426
427 # Create a reverse item locks map for processing items.
428 _inverse_item_locks = {}
429
430 for door_id in _item_locks.keys():
431 var lock = _item_locks.get(door_id)
432
433 if not _inverse_item_locks.has(lock[0]):
434 _inverse_item_locks[lock[0]] = []
435
436 _inverse_item_locks[lock[0]].append([door_id, lock[1]])
437
362 emit_signal("ap_connected") 438 emit_signal("ap_connected")
363 439
364 440
@@ -453,4 +529,7 @@ func _process_key_item(key, level):
453 _held_letters[key] = max(_held_letters.get(key, 0), level) 529 _held_letters[key] = max(_held_letters.get(key, 0), level)
454 return 530 return
455 531
532 if shuffle_letters == kSHUFFLE_LETTERS_ITEM_CYAN:
533 level += 1
534
456 keyboard.collect_remote_letter(key, level) 535 keyboard.collect_remote_letter(key, level)