diff options
Diffstat (limited to 'Archipelago/client.gd')
-rw-r--r-- | Archipelago/client.gd | 71 |
1 files changed, 57 insertions, 14 deletions
diff --git a/Archipelago/client.gd b/Archipelago/client.gd index c690986..8a15d03 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd | |||
@@ -18,7 +18,7 @@ var enable_multiplayer = false | |||
18 | var track_player = false | 18 | var track_player = false |
19 | var connection_history = [] | 19 | var connection_history = [] |
20 | 20 | ||
21 | const my_version = "3.0.1" | 21 | const my_version = "3.2.1" |
22 | const ap_version = {"major": 0, "minor": 4, "build": 6, "class": "Version"} | 22 | const ap_version = {"major": 0, "minor": 4, "build": 6, "class": "Version"} |
23 | const color_items = [ | 23 | const color_items = [ |
24 | "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" | 24 | "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" |
@@ -81,6 +81,7 @@ var _team = 0 | |||
81 | var _slot = 0 | 81 | var _slot = 0 |
82 | var _players = [] | 82 | var _players = [] |
83 | var _player_name_by_slot = {} | 83 | var _player_name_by_slot = {} |
84 | var _game_by_player = {} | ||
84 | var _checked_locations = [] | 85 | var _checked_locations = [] |
85 | var _slot_data = {} | 86 | var _slot_data = {} |
86 | var _paintings_mapping = {} | 87 | var _paintings_mapping = {} |
@@ -116,6 +117,7 @@ var _cached_slowness = 0 | |||
116 | var _cached_iceland = 0 | 117 | var _cached_iceland = 0 |
117 | var _cached_atbash = 0 | 118 | var _cached_atbash = 0 |
118 | var _geronimo_skip = false | 119 | var _geronimo_skip = false |
120 | var _checked_paintings = [] | ||
119 | 121 | ||
120 | signal could_not_connect | 122 | signal could_not_connect |
121 | signal connect_status | 123 | signal connect_status |
@@ -133,6 +135,10 @@ func _init(): | |||
133 | var data = file.get_var(true) | 135 | var data = file.get_var(true) |
134 | file.close() | 136 | file.close() |
135 | 137 | ||
138 | if typeof(data) != TYPE_ARRAY: | ||
139 | global._print("AP settings file is corrupted") | ||
140 | data = [] | ||
141 | |||
136 | if data.size() > 0: | 142 | if data.size() > 0: |
137 | ap_server = data[0] | 143 | ap_server = data[0] |
138 | if data.size() > 1: | 144 | if data.size() > 1: |
@@ -257,6 +263,7 @@ func _on_data(): | |||
257 | 263 | ||
258 | for player in _players: | 264 | for player in _players: |
259 | _player_name_by_slot[player["slot"]] = player["alias"] | 265 | _player_name_by_slot[player["slot"]] = player["alias"] |
266 | _game_by_player[player["slot"]] = message["slot_info"][str(player["slot"])]["game"] | ||
260 | 267 | ||
261 | _death_link = _slot_data.has("death_link") and _slot_data["death_link"] | 268 | _death_link = _slot_data.has("death_link") and _slot_data["death_link"] |
262 | if _death_link: | 269 | if _death_link: |
@@ -340,6 +347,10 @@ func _on_data(): | |||
340 | var localdata = ap_file.get_var(true) | 347 | var localdata = ap_file.get_var(true) |
341 | ap_file.close() | 348 | ap_file.close() |
342 | 349 | ||
350 | if typeof(localdata) != TYPE_ARRAY: | ||
351 | global._print("AP localdata file is corrupted") | ||
352 | localdata = [] | ||
353 | |||
343 | if localdata.size() > 0: | 354 | if localdata.size() > 0: |
344 | _last_new_item = localdata[0] | 355 | _last_new_item = localdata[0] |
345 | else: | 356 | else: |
@@ -370,6 +381,18 @@ func _on_data(): | |||
370 | 381 | ||
371 | requestSync() | 382 | requestSync() |
372 | 383 | ||
384 | sendMessage( | ||
385 | [ | ||
386 | { | ||
387 | "cmd": "Set", | ||
388 | "key": "Lingo_%d_Paintings" % [_slot], | ||
389 | "default": [], | ||
390 | "want_reply": true, | ||
391 | "operations": [{"operation": "default", "value": []}] | ||
392 | } | ||
393 | ] | ||
394 | ) | ||
395 | |||
373 | emit_signal("client_connected") | 396 | emit_signal("client_connected") |
374 | 397 | ||
375 | elif cmd == "ConnectionRefused": | 398 | elif cmd == "ConnectionRefused": |
@@ -437,12 +460,14 @@ func _on_data(): | |||
437 | continue | 460 | continue |
438 | 461 | ||
439 | var item_name = "Unknown" | 462 | var item_name = "Unknown" |
440 | if _item_id_to_name.has(message["item"]["item"]): | 463 | var item_player_game = _game_by_player[message["receiving"]] |
441 | item_name = _item_id_to_name[message["item"]["item"]] | 464 | if _item_id_to_name[item_player_game].has(message["item"]["item"]): |
465 | item_name = _item_id_to_name[item_player_game][message["item"]["item"]] | ||
442 | 466 | ||
443 | var location_name = "Unknown" | 467 | var location_name = "Unknown" |
444 | if _location_id_to_name.has(message["item"]["location"]): | 468 | var location_player_game = _game_by_player[message["item"]["player"]] |
445 | location_name = _location_id_to_name[message["item"]["location"]] | 469 | if _location_id_to_name[location_player_game].has(message["item"]["location"]): |
470 | location_name = _location_id_to_name[location_player_game][message["item"]["location"]] | ||
446 | 471 | ||
447 | var player_name = "Unknown" | 472 | var player_name = "Unknown" |
448 | if _player_name_by_slot.has(message["receiving"]): | 473 | if _player_name_by_slot.has(message["receiving"]): |
@@ -485,6 +510,10 @@ func _on_data(): | |||
485 | # Return the player home. | 510 | # Return the player home. |
486 | get_tree().get_root().get_node("Spatial/player/pause_menu")._reload() | 511 | get_tree().get_root().get_node("Spatial/player/pause_menu")._reload() |
487 | 512 | ||
513 | elif cmd == "SetReply": | ||
514 | if message.has("key") and message["key"] == ("Lingo_%d_Paintings" % _slot): | ||
515 | _checked_paintings = message["value"] | ||
516 | |||
488 | 517 | ||
489 | func _process(_delta): | 518 | func _process(_delta): |
490 | if _should_process: | 519 | if _should_process: |
@@ -592,12 +621,16 @@ func requestDatapackages(games): | |||
592 | func processDatapackages(): | 621 | func processDatapackages(): |
593 | _item_id_to_name = {} | 622 | _item_id_to_name = {} |
594 | _location_id_to_name = {} | 623 | _location_id_to_name = {} |
595 | for package in _datapackages.values(): | 624 | for game in _datapackages.keys(): |
625 | var package = _datapackages[game] | ||
626 | |||
627 | _item_id_to_name[game] = {} | ||
596 | for name in package["item_name_to_id"].keys(): | 628 | for name in package["item_name_to_id"].keys(): |
597 | _item_id_to_name[package["item_name_to_id"][name]] = name | 629 | _item_id_to_name[game][package["item_name_to_id"][name]] = name |
598 | 630 | ||
631 | _location_id_to_name[game] = {} | ||
599 | for name in package["location_name_to_id"].keys(): | 632 | for name in package["location_name_to_id"].keys(): |
600 | _location_id_to_name[package["location_name_to_id"][name]] = name | 633 | _location_id_to_name[game][package["location_name_to_id"][name]] = name |
601 | 634 | ||
602 | if _datapackages.has("Lingo"): | 635 | if _datapackages.has("Lingo"): |
603 | _item_name_to_id = _datapackages["Lingo"]["item_name_to_id"] | 636 | _item_name_to_id = _datapackages["Lingo"]["item_name_to_id"] |
@@ -639,13 +672,14 @@ func sendLocation(loc_id): | |||
639 | _held_locations.append(loc_id) | 672 | _held_locations.append(loc_id) |
640 | 673 | ||
641 | 674 | ||
642 | func setValue(key, value): | 675 | func setValue(key, value, operation = "replace"): |
643 | sendMessage( | 676 | sendMessage( |
644 | [ | 677 | [ |
645 | { | 678 | { |
646 | "cmd": "Set", | 679 | "cmd": "Set", |
647 | "key": "Lingo_%d_%s" % [_slot, key], | 680 | "key": "Lingo_%d_%s" % [_slot, key], |
648 | "operations": [{"operation": "replace", "value": value}] | 681 | "want_reply": false, |
682 | "operations": [{"operation": operation, "value": value}] | ||
649 | } | 683 | } |
650 | ] | 684 | ] |
651 | ) | 685 | ) |
@@ -686,8 +720,8 @@ func processItem(item, index, from, flags): | |||
686 | 720 | ||
687 | var gamedata = $Gamedata | 721 | var gamedata = $Gamedata |
688 | var item_name = "Unknown" | 722 | var item_name = "Unknown" |
689 | if _item_id_to_name.has(item): | 723 | if _item_id_to_name["Lingo"].has(item): |
690 | item_name = _item_id_to_name[item] | 724 | item_name = _item_id_to_name["Lingo"][item] |
691 | 725 | ||
692 | if gamedata.door_ids_by_item_id.has(int(item)): | 726 | if gamedata.door_ids_by_item_id.has(int(item)): |
693 | var doorsNode = get_tree().get_root().get_node("Spatial/Doors") | 727 | var doorsNode = get_tree().get_root().get_node("Spatial/Doors") |
@@ -725,8 +759,8 @@ func processItem(item, index, from, flags): | |||
725 | processItem(subitem_id, null, null, null) | 759 | processItem(subitem_id, null, null, null) |
726 | _progressive_progress[int(item)] += 1 | 760 | _progressive_progress[int(item)] += 1 |
727 | 761 | ||
728 | if _color_shuffle and color_items.has(_item_id_to_name[item]): | 762 | if _color_shuffle and color_items.has(_item_id_to_name["Lingo"][item]): |
729 | var lcol = _item_id_to_name[item].to_lower() | 763 | var lcol = _item_id_to_name["Lingo"][item].to_lower() |
730 | if not _has_colors.has(lcol): | 764 | if not _has_colors.has(lcol): |
731 | _has_colors.append(lcol) | 765 | _has_colors.append(lcol) |
732 | emit_signal("evaluate_solvability") | 766 | emit_signal("evaluate_solvability") |
@@ -801,6 +835,15 @@ func geronimo(): | |||
801 | saveLocaldata() | 835 | saveLocaldata() |
802 | 836 | ||
803 | 837 | ||
838 | func checkPainting(painting_id): | ||
839 | if _checked_paintings.has(painting_id): | ||
840 | return | ||
841 | |||
842 | _checked_paintings.append(painting_id) | ||
843 | |||
844 | setValue("Paintings", [painting_id], "add") | ||
845 | |||
846 | |||
804 | func colorForItemType(flags): | 847 | func colorForItemType(flags): |
805 | var int_flags = int(flags) | 848 | var int_flags = int(flags) |
806 | if int_flags & 1: # progression | 849 | if int_flags & 1: # progression |