about summary refs log tree commit diff stats
path: root/Archipelago/client.gd
diff options
context:
space:
mode:
Diffstat (limited to 'Archipelago/client.gd')
-rw-r--r--Archipelago/client.gd171
1 files changed, 154 insertions, 17 deletions
diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 78058ca..390b14d 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd
@@ -9,6 +9,7 @@ var SCRIPT_mypainting
9var SCRIPT_notifier 9var SCRIPT_notifier
10var SCRIPT_panel 10var SCRIPT_panel
11var SCRIPT_pilgrimage_terminator 11var SCRIPT_pilgrimage_terminator
12var SCRIPT_textclient
12var SCRIPT_uuid 13var SCRIPT_uuid
13 14
14var ap_server = "" 15var ap_server = ""
@@ -19,12 +20,12 @@ var enable_multiplayer = false
19var track_player = false 20var track_player = false
20var connection_history = [] 21var connection_history = []
21 22
22const my_version = "4.0.2" 23const my_version = "5.0.1"
23const ap_version = {"major": 0, "minor": 5, "build": 0, "class": "Version"} 24const ap_version = {"major": 0, "minor": 5, "build": 1, "class": "Version"}
24const color_items = [ 25const color_items = [
25 "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow" 26 "White", "Black", "Red", "Blue", "Green", "Brown", "Gray", "Orange", "Purple", "Yellow"
26] 27]
27const progressive_items = { 28const door_progressive_items = {
28 "Progressive Orange Tower": 29 "Progressive Orange Tower":
29 ["Second Floor", "Third Floor", "Fourth Floor", "Fifth Floor", "Sixth Floor", "Seventh Floor"], 30 ["Second Floor", "Third Floor", "Fourth Floor", "Fifth Floor", "Sixth Floor", "Seventh Floor"],
30 "Progressive Art Gallery": 31 "Progressive Art Gallery":
@@ -36,6 +37,15 @@ const progressive_items = {
36 "Progressive Pilgrimage": 37 "Progressive Pilgrimage":
37 ["1 Sunwarp", "2 Sunwarp", "3 Sunwarp", "4 Sunwarp", "5 Sunwarp", "6 Sunwarp"] 38 ["1 Sunwarp", "2 Sunwarp", "3 Sunwarp", "4 Sunwarp", "5 Sunwarp", "6 Sunwarp"]
38} 39}
40const panel_progressive_items = {
41 "Progressive Hallway Room": ["First Door", "Second Door", "Third Door", "Fourth Door"],
42 "Progressive Colorful":
43 ["White", "Black", "Red", "Yellow", "Blue", "Purple", "Orange", "Green", "Brown", "Gray"],
44 "Progressive Number Hunt":
45 ["Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Zero"],
46 "Progressive Symmetry Room": ["Near Far", "Warts Straw", "Leaf Feel"],
47 "Progressive Suits Area": ["Words Sword", "Lost", "Amen Name"]
48}
39 49
40const kTHE_END = 0 50const kTHE_END = 0
41const kTHE_MASTER = 1 51const kTHE_MASTER = 1
@@ -91,6 +101,7 @@ var _localdata_file = ""
91var _death_link = false 101var _death_link = false
92var _victory_condition = 0 # THE END, THE MASTER, LEVEL 2 102var _victory_condition = 0 # THE END, THE MASTER, LEVEL 2
93var _door_shuffle = false 103var _door_shuffle = false
104var _panel_door_shuffle = false
94var _color_shuffle = false 105var _color_shuffle = false
95var _panel_shuffle = 0 # none, rearrange 106var _panel_shuffle = 0 # none, rearrange
96var _painting_shuffle = false 107var _painting_shuffle = false
@@ -105,6 +116,7 @@ var _pilgrimage_allows_roof_access = false
105var _pilgrimage_allows_paintings = false 116var _pilgrimage_allows_paintings = false
106var _sunwarp_shuffle = false 117var _sunwarp_shuffle = false
107var _sunwarp_mapping = [] 118var _sunwarp_mapping = []
119var _speed_boost_mode = false
108var _slot_seed = 0 120var _slot_seed = 0
109 121
110var _map_loaded = false 122var _map_loaded = false
@@ -118,8 +130,11 @@ var _puzzle_skips = 0
118var _cached_slowness = 0 130var _cached_slowness = 0
119var _cached_iceland = 0 131var _cached_iceland = 0
120var _cached_atbash = 0 132var _cached_atbash = 0
133var _cached_speed_boosts = 0
121var _geronimo_skip = false 134var _geronimo_skip = false
122var _checked_paintings = [] 135var _checked_paintings = []
136var _hints_key = ""
137var _hinted_locations = []
123 138
124signal could_not_connect 139signal could_not_connect
125signal connect_status 140signal connect_status
@@ -277,9 +292,15 @@ func _on_data():
277 _color_shuffle = _slot_data["shuffle_colors"] 292 _color_shuffle = _slot_data["shuffle_colors"]
278 293
279 if _slot_data.has("shuffle_doors"): 294 if _slot_data.has("shuffle_doors"):
280 _door_shuffle = (_slot_data["shuffle_doors"] > 0) 295 if _slot_data.has("group_doors"):
296 _door_shuffle = (_slot_data["shuffle_doors"] == 2)
297 _panel_door_shuffle = (_slot_data["shuffle_doors"] == 1)
298 else:
299 _door_shuffle = (_slot_data["shuffle_doors"] > 0)
300 _panel_door_shuffle = false
281 else: 301 else:
282 _door_shuffle = false 302 _door_shuffle = false
303 _panel_door_shuffle = false
283 304
284 if _slot_data.has("shuffle_paintings"): 305 if _slot_data.has("shuffle_paintings"):
285 _painting_shuffle = _slot_data["shuffle_paintings"] 306 _painting_shuffle = _slot_data["shuffle_paintings"]
@@ -331,6 +352,10 @@ func _on_data():
331 _sunwarp_shuffle = false 352 _sunwarp_shuffle = false
332 if _slot_data.has("sunwarp_permutation"): 353 if _slot_data.has("sunwarp_permutation"):
333 _sunwarp_mapping = _slot_data["sunwarp_permutation"] 354 _sunwarp_mapping = _slot_data["sunwarp_permutation"]
355 if _slot_data.has("speed_boost_mode"):
356 _speed_boost_mode = _slot_data["speed_boost_mode"]
357 else:
358 _speed_boost_mode = false
334 359
335 if ( 360 if (
336 _location_classification_bit != kCLASSIFICATION_LOCAL_INSANITY 361 _location_classification_bit != kCLASSIFICATION_LOCAL_INSANITY
@@ -349,6 +374,7 @@ func _on_data():
349 _cached_slowness = 0 374 _cached_slowness = 0
350 _cached_iceland = 0 375 _cached_iceland = 0
351 _cached_atbash = 0 376 _cached_atbash = 0
377 _cached_speed_boosts = 0
352 _geronimo_skip = false 378 _geronimo_skip = false
353 379
354 _localdata_file = "user://archipelago_data/%s_%d" % [_seed, _slot] 380 _localdata_file = "user://archipelago_data/%s_%d" % [_seed, _slot]
@@ -380,6 +406,9 @@ func _on_data():
380 if localdata.size() > 5: 406 if localdata.size() > 5:
381 _geronimo_skip = localdata[5] 407 _geronimo_skip = localdata[5]
382 408
409 if localdata.size() > 6:
410 _cached_speed_boosts = localdata[6]
411
383 requestSync() 412 requestSync()
384 413
385 sendMessage( 414 sendMessage(
@@ -394,6 +423,11 @@ func _on_data():
394 ] 423 ]
395 ) 424 )
396 425
426 _hints_key = "_read_hints_%d_%d" % [_team, _slot]
427 sendMessage(
428 [{"cmd": "SetNotify", "keys": [_hints_key]}, {"cmd": "Get", "keys": [_hints_key]}]
429 )
430
397 emit_signal("client_connected") 431 emit_signal("client_connected")
398 432
399 elif cmd == "ConnectionRefused": 433 elif cmd == "ConnectionRefused":
@@ -453,6 +487,8 @@ func _on_data():
453 i += 1 487 i += 1
454 488
455 elif cmd == "PrintJSON": 489 elif cmd == "PrintJSON":
490 parse_printjson(message)
491
456 if ( 492 if (
457 !message.has("receiving") 493 !message.has("receiving")
458 or !message.has("item") 494 or !message.has("item")
@@ -489,9 +525,12 @@ func _on_data():
489 ) 525 )
490 else: 526 else:
491 if message["receiving"] != _slot: 527 if message["receiving"] != _slot:
492 messages.showMessage( 528 var sentMsg = (
493 "Sent [color=%s]%s[/color] to %s" % [item_color, item_name, player_name] 529 "Sent [color=%s]%s[/color] to %s" % [item_color, item_name, player_name]
494 ) 530 )
531 if _hinted_locations.has(message["item"]["location"]):
532 sentMsg += " ([color=#fafad2]Hinted![/color])"
533 messages.showMessage(sentMsg)
495 534
496 elif cmd == "Bounced": 535 elif cmd == "Bounced":
497 if ( 536 if (
@@ -512,8 +551,15 @@ func _on_data():
512 get_tree().get_root().get_node("Spatial/player/pause_menu")._reload() 551 get_tree().get_root().get_node("Spatial/player/pause_menu")._reload()
513 552
514 elif cmd == "SetReply": 553 elif cmd == "SetReply":
515 if message.has("key") and message["key"] == ("Lingo_%d_Paintings" % _slot): 554 if message.has("key"):
516 _checked_paintings = message["value"] 555 if message["key"] == ("Lingo_%d_Paintings" % _slot):
556 _checked_paintings = message["value"]
557 elif message["key"] == _hints_key:
558 parseHints(message["value"])
559
560 elif cmd == "Retrieved":
561 if message.has("keys") and message["keys"].has(_hints_key):
562 parseHints(message["keys"][_hints_key])
517 563
518 564
519func _process(_delta): 565func _process(_delta):
@@ -567,7 +613,8 @@ func saveLocaldata():
567 effects_node.slowness_remaining, 613 effects_node.slowness_remaining,
568 effects_node.iceland_remaining, 614 effects_node.iceland_remaining,
569 effects_node.atbash_remaining, 615 effects_node.atbash_remaining,
570 _geronimo_skip 616 _geronimo_skip,
617 effects_node.speed_boosts_remaining,
571 ] 618 ]
572 file.store_var(data, true) 619 file.store_var(data, true)
573 file.close() 620 file.close()
@@ -686,6 +733,10 @@ func setValue(key, value, operation = "replace"):
686 ) 733 )
687 734
688 735
736func say(textdata):
737 sendMessage([{"cmd": "Say", "text": textdata}])
738
739
689func completedGoal(): 740func completedGoal():
690 sendMessage([{"cmd": "StatusUpdate", "status": 30}]) # CLIENT_GOAL 741 sendMessage([{"cmd": "StatusUpdate", "status": 30}]) # CLIENT_GOAL
691 742
@@ -729,6 +780,18 @@ func processItem(item, index, from, flags):
729 for door_id in gamedata.door_ids_by_item_id[int(item)]: 780 for door_id in gamedata.door_ids_by_item_id[int(item)]:
730 doorsNode.get_node(door_id).openDoor() 781 doorsNode.get_node(door_id).openDoor()
731 782
783 if gamedata.panel_ids_by_item_id.has(int(item)):
784 var panel_ids = gamedata.panel_ids_by_item_id[int(item)]
785 if wasGeneratedOnVersion(0, 5, 1):
786 var extradata = get_node("Extradata")
787 if extradata.panels_mode_051_panel_fixes.has(int(item)):
788 panel_ids = extradata.panels_mode_051_panel_fixes[int(item)]
789
790 var panelsNode = get_tree().get_root().get_node("Spatial/Panels")
791 for panel_id in panel_ids:
792 panelsNode.get_node(panel_id).get_node("AP_Panel").locked = false
793 emit_signal("evaluate_solvability")
794
732 if gamedata.painting_ids_by_item_id.has(int(item)): 795 if gamedata.painting_ids_by_item_id.has(int(item)):
733 var real_parent_node = get_tree().get_root().get_node("Spatial/Decorations/Paintings") 796 var real_parent_node = get_tree().get_root().get_node("Spatial/Decorations/Paintings")
734 var fake_parent_node = get_tree().get_root().get_node_or_null("Spatial/AP_Paintings") 797 var fake_parent_node = get_tree().get_root().get_node_or_null("Spatial/AP_Paintings")
@@ -749,15 +812,34 @@ func processItem(item, index, from, flags):
749 warpsNode.get_node(warp_id).unlock_warp() 812 warpsNode.get_node(warp_id).unlock_warp()
750 813
751 # Handle progressive items. 814 # Handle progressive items.
752 if int(item) in gamedata.items_by_progressive_id.keys(): 815 var is_progressive_door = int(item) in gamedata.door_items_by_progressive_id
816 var is_progressive_panel = int(item) in gamedata.panel_items_by_progressive_id
817 var progitems = null
818 var prognames = null
819
820 if is_progressive_door and is_progressive_panel:
821 if _door_shuffle:
822 progitems = gamedata.door_items_by_progressive_id[int(item)]
823 prognames = door_progressive_items
824 else:
825 progitems = gamedata.panel_items_by_progressive_id[int(item)]
826 prognames = panel_progressive_items
827 elif is_progressive_door:
828 progitems = gamedata.door_items_by_progressive_id[int(item)]
829 prognames = door_progressive_items
830 elif is_progressive_panel:
831 progitems = gamedata.panel_items_by_progressive_id[int(item)]
832 prognames = panel_progressive_items
833
834 if progitems != null:
753 if not int(item) in _progressive_progress: 835 if not int(item) in _progressive_progress:
754 _progressive_progress[int(item)] = 0 836 _progressive_progress[int(item)] = 0
755 837
756 if _progressive_progress[int(item)] < gamedata.items_by_progressive_id[int(item)].size(): 838 if _progressive_progress[int(item)] < progitems.size():
757 var subitems = gamedata.items_by_progressive_id[int(item)] 839 var subitem_id = progitems[_progressive_progress[int(item)]]
758 var subitem_id = subitems[_progressive_progress[int(item)]]
759 global._print("Subitem: %d" % subitem_id) 840 global._print("Subitem: %d" % subitem_id)
760 processItem(subitem_id, null, null, null) 841 processItem(subitem_id, null, null, null)
842 item_name += " (%s)" % prognames[item_name][_progressive_progress[int(item)]]
761 _progressive_progress[int(item)] += 1 843 _progressive_progress[int(item)] += 1
762 844
763 if _color_shuffle and color_items.has(_item_id_to_name["Lingo"][item]): 845 if _color_shuffle and color_items.has(_item_id_to_name["Lingo"][item]):
@@ -771,10 +853,6 @@ func processItem(item, index, from, flags):
771 _last_new_item = index 853 _last_new_item = index
772 saveLocaldata() 854 saveLocaldata()
773 855
774 if item_name in progressive_items:
775 var subitem = progressive_items[item_name][_progressive_progress[int(item)] - 1]
776 item_name += " (%s)" % subitem
777
778 var player_name = "Unknown" 856 var player_name = "Unknown"
779 if _player_name_by_slot.has(from): 857 if _player_name_by_slot.has(from):
780 player_name = _player_name_by_slot[from] 858 player_name = _player_name_by_slot[from]
@@ -789,12 +867,14 @@ func processItem(item, index, from, flags):
789 ) 867 )
790 868
791 var effects_node = get_tree().get_root().get_node("Spatial/AP_Effects") 869 var effects_node = get_tree().get_root().get_node("Spatial/AP_Effects")
792 if item_name == "Slowness Trap": 870 if item_name == "Slowness Trap" and !_speed_boost_mode:
793 effects_node.trigger_slowness_trap() 871 effects_node.trigger_slowness_trap()
794 if item_name == "Iceland Trap": 872 if item_name == "Iceland Trap":
795 effects_node.trigger_iceland_trap() 873 effects_node.trigger_iceland_trap()
796 if item_name == "Atbash Trap": 874 if item_name == "Atbash Trap":
797 effects_node.trigger_atbash_trap() 875 effects_node.trigger_atbash_trap()
876 if item_name == "Speed Boost" and _speed_boost_mode:
877 effects_node.trigger_speed_boost()
798 if item_name == "Puzzle Skip": 878 if item_name == "Puzzle Skip":
799 _puzzle_skips += 1 879 _puzzle_skips += 1
800 880
@@ -845,6 +925,14 @@ func checkPainting(painting_id):
845 setValue("Paintings", [painting_id], "add") 925 setValue("Paintings", [painting_id], "add")
846 926
847 927
928func parseHints(hints):
929 _hinted_locations.clear()
930
931 for hint in hints:
932 if hint["finding_player"] == int(_slot):
933 _hinted_locations.append(hint["location"])
934
935
848func colorForItemType(flags): 936func colorForItemType(flags):
849 var int_flags = int(flags) 937 var int_flags = int(flags)
850 if int_flags & 1: # progression 938 if int_flags & 1: # progression
@@ -857,6 +945,47 @@ func colorForItemType(flags):
857 return "#14de9e" 945 return "#14de9e"
858 946
859 947
948func parse_printjson(message):
949 var parts = []
950 for message_part in message["data"]:
951 if !message_part.has("type") and message_part.has("text"):
952 parts.append(message_part["text"])
953 elif message_part["type"] == "player_id":
954 if int(message_part["text"]) == _slot:
955 parts.append("[color=#ee00ee]%s[/color]" % _player_name_by_slot[_slot])
956 else:
957 var from = float(message_part["text"])
958 parts.append("[color=#fafad2]%s[/color]" % _player_name_by_slot[from])
959 elif message_part["type"] == "item_id":
960 var item_name = "Unknown"
961 var item_player_game = _game_by_player[message_part["player"]]
962 if _item_id_to_name[item_player_game].has(float(message_part["text"])):
963 item_name = _item_id_to_name[item_player_game][float(message_part["text"])]
964
965 parts.append(
966 "[color=%s]%s[/color]" % [colorForItemType(message_part["flags"]), item_name]
967 )
968 elif message_part["type"] == "location_id":
969 var location_name = "Unknown"
970 var location_player_game = _game_by_player[message_part["player"]]
971 if _location_id_to_name[location_player_game].has(float(message_part["text"])):
972 location_name = _location_id_to_name[location_player_game][float(
973 message_part["text"]
974 )]
975
976 parts.append("[color=#00ff7f]%s[/color]" % location_name)
977 elif message_part.has("text"):
978 parts.append(message_part["text"])
979
980 var textclient_node = get_tree().get_root().get_node_or_null("Spatial/AP_TextClient")
981 if textclient_node != null:
982 textclient_node.parse_printjson("".join(parts))
983
984
985func get_player_name():
986 return _player_name_by_slot[_slot]
987
988
860func compareVersion(lhs, rhs): 989func compareVersion(lhs, rhs):
861 if lhs["major"] == rhs["major"]: 990 if lhs["major"] == rhs["major"]:
862 if lhs["minor"] == rhs["minor"]: 991 if lhs["minor"] == rhs["minor"]:
@@ -869,3 +998,11 @@ func compareVersion(lhs, rhs):
869 998
870func wasGeneratedBeforeVersion(major, minor, build): 999func wasGeneratedBeforeVersion(major, minor, build):
871 return compareVersion(_gen_version, {"major": major, "minor": minor, "build": build}) 1000 return compareVersion(_gen_version, {"major": major, "minor": minor, "build": build})
1001
1002
1003func wasGeneratedOnVersion(major, minor, build):
1004 return (
1005 _gen_version["major"] == major
1006 and _gen_version["minor"] == minor
1007 and _gen_version["build"] == build
1008 )