extends Node const my_version = "0.1.0" var SCRIPT_client var SCRIPT_keyboard var SCRIPT_locationListener var SCRIPT_uuid var SCRIPT_victoryListener var ap_server = "" var ap_user = "" var ap_pass = "" var connection_history = [] var client var keyboard var _localdata_file = "" var _last_new_item = -1 var _batch_locations = false var _held_locations = [] var _held_location_scouts = [] var _location_scouts = {} var _item_locks = {} var _inverse_item_locks = {} var _held_letters = {} var _letters_setup = false const kSHUFFLE_LETTERS_VANILLA = 0 const kSHUFFLE_LETTERS_UNLOCKED = 1 const kSHUFFLE_LETTERS_PROGRESSIVE = 2 const kSHUFFLE_LETTERS_VANILLA_CYAN = 3 const kSHUFFLE_LETTERS_ITEM_CYAN = 4 const kLETTER_BEHAVIOR_VANILLA = 0 const kLETTER_BEHAVIOR_ITEM = 1 const kLETTER_BEHAVIOR_UNLOCKED = 2 const kCYAN_DOOR_BEHAVIOR_H2 = 0 const kCYAN_DOOR_BEHAVIOR_DOUBLE_LETTER = 1 const kCYAN_DOOR_BEHAVIOR_ITEM = 2 var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2 var daedalus_roof_access = false var keyholder_sanity = false var shuffle_control_center_colors = false var shuffle_doors = false var shuffle_letters = kSHUFFLE_LETTERS_VANILLA var victory_condition = -1 signal could_not_connect signal connect_status signal ap_connected func _init(): # Read AP settings from file, if there are any if FileAccess.file_exists("user://ap_settings"): var file = FileAccess.open("user://ap_settings", FileAccess.READ) var data = file.get_var(true) file.close() if typeof(data) != TYPE_ARRAY: global._print("AP settings file is corrupted") data = [] if data.size() > 0: ap_server = data[0] if data.size() > 1: ap_user = data[1] if data.size() > 2: ap_pass = data[2] if data.size() > 3: connection_history = data[3] func _ready(): client = SCRIPT_client.new() client.SCRIPT_uuid = SCRIPT_uuid client.connect("item_received", _process_item) client.connect("message_received", _process_message) client.connect("location_scout_received", _process_location_scout) client.connect("could_not_connect", _client_could_not_connect) client.connect("connect_status", _client_connect_status) client.connect("client_connected", _client_connected) add_child(client) keyboard = SCRIPT_keyboard.new() add_child(keyboard) func saveSettings(): # Save the AP settings to disk. var path = "user://ap_settings" var file = FileAccess.open(path, FileAccess.WRITE) var data = [ ap_server, ap_user, ap_pass, connection_history, ] file.store_var(data, true) file.close() func saveLocaldata(): # Save the MW/slot specific settings to disk. var dir = DirAccess.open("user://") var folder = "archipelago_data" if not dir.dir_exists(folder): dir.make_dir(folder) var file = FileAccess.open(_localdata_file, FileAccess.WRITE) var data = [ _last_new_item, ] file.store_var(data, true) file.close() func connectToServer(): _last_new_item = -1 _batch_locations = false _held_locations = [] _held_location_scouts = [] _location_scouts = {} _letters_setup = false _held_letters = {} client.connectToServer(ap_server, ap_user, ap_pass) func getSaveFileName(): return "zzAP_%s_%d" % [client._seed, client._slot] func disconnect_from_ap(): client.disconnect_from_ap() func get_item_id_for_door(door_id): return _item_locks.get(door_id, null) func _process_item(item, index, from, flags, amount): var item_name = "Unknown" if client._item_id_to_name["Lingo 2"].has(item): item_name = client._item_id_to_name["Lingo 2"][item] var gamedata = global.get_node("Gamedata") var prog_id = null if _inverse_item_locks.has(item): for lock in _inverse_item_locks.get(item): if lock[1] != amount: continue if gamedata.progressive_id_by_ap_id.has(item): prog_id = lock[0] if gamedata.get_door_map_name(lock[0]) != global.map: continue var receivers = gamedata.get_door_receivers(lock[0]) var scene = get_tree().get_root().get_node_or_null("scene") if scene != null: for receiver in receivers: var rnode = scene.get_node_or_null(receiver) if rnode != null: rnode.handleTriggered() var letter_id = gamedata.letter_id_by_ap_id.get(item, null) if letter_id != null: var letter = gamedata.objects.get_letters()[letter_id] if not letter.has_level2() or not letter.get_level2(): _process_key_item(letter.get_key(), amount) # Show a m
extends "res://scripts/nodes/listeners/keyHolderChecker.gd"
func check():
var ap = global.get_node("Archipelago")
var matches = []
for map in ap.keyboard.keyholder_state.keys():
var nodes = ap.keyboard.keyholder_state[map]
for node in nodes.keys():
matches.append([nodes[node], 1, map, "/root/scene/%s" % node])
var count = 0
for key_match in matches:
var active = (
key_match[2] + String(key_match[3]).replace("/root/scene/Components/KeyHolders/", ".")
)
if map[active] == key_match[0]:
emit_signal("trigger_letter", key_match[0], true)
count += 1
else:
emit_signal("trigger_letter", key_match[0], false)
if count > 25:
emit_signal("trigger")