diff options
Diffstat (limited to 'Archipelago')
| -rw-r--r-- | Archipelago/client.gd | 76 |
1 files changed, 46 insertions, 30 deletions
| diff --git a/Archipelago/client.gd b/Archipelago/client.gd index be0ef2d..335871e 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd | |||
| @@ -11,9 +11,10 @@ var _client = WebSocketClient.new() | |||
| 11 | var _last_state = WebSocketPeer.STATE_CLOSED | 11 | var _last_state = WebSocketPeer.STATE_CLOSED |
| 12 | var _should_process = false | 12 | var _should_process = false |
| 13 | 13 | ||
| 14 | var _datapackage_checksum = "" | 14 | var _datapackages = {} |
| 15 | var _item_name_to_id = {} | 15 | var _item_id_to_name = {} # All games |
| 16 | var _location_name_to_id = {} | 16 | var _item_name_to_id = {} # LINGO only |
| 17 | var _location_name_to_id = {} # LINGO only | ||
| 17 | 18 | ||
| 18 | const uuid_util = preload("user://maps/Archipelago/vendor/uuid.gd") | 19 | const uuid_util = preload("user://maps/Archipelago/vendor/uuid.gd") |
| 19 | 20 | ||
| @@ -58,11 +59,9 @@ func _init(): | |||
| 58 | if data.size() > 2: | 59 | if data.size() > 2: |
| 59 | ap_pass = data[2] | 60 | ap_pass = data[2] |
| 60 | if data.size() > 3: | 61 | if data.size() > 3: |
| 61 | _datapackage_checksum = data[3] | 62 | _datapackages = data[3] |
| 62 | if data.size() > 4: | 63 | |
| 63 | _item_name_to_id = data[4] | 64 | processDatapackages() |
| 64 | if data.size() > 5: | ||
| 65 | _location_name_to_id = data[5] | ||
| 66 | 65 | ||
| 67 | 66 | ||
| 68 | func _ready(): | 67 | func _ready(): |
| @@ -96,22 +95,26 @@ func _on_data(): | |||
| 96 | 95 | ||
| 97 | if cmd == "RoomInfo": | 96 | if cmd == "RoomInfo": |
| 98 | _seed = message["seed_name"] | 97 | _seed = message["seed_name"] |
| 99 | if message["datapackage_checksums"].has("Lingo"): | ||
| 100 | if _datapackage_checksum != message["datapackage_checksums"]["Lingo"]: | ||
| 101 | requestDatapackage() | ||
| 102 | else: | ||
| 103 | connectToRoom() | ||
| 104 | |||
| 105 | elif cmd == "DataPackage": | ||
| 106 | if message["data"]["games"].has("Lingo"): | ||
| 107 | var lingo_pkg = message["data"]["games"]["Lingo"] | ||
| 108 | _datapackage_checksum = lingo_pkg["checksum"] | ||
| 109 | _item_name_to_id = lingo_pkg["item_name_to_id"] | ||
| 110 | _location_name_to_id = lingo_pkg["location_name_to_id"] | ||
| 111 | saveSettings() | ||
| 112 | 98 | ||
| 99 | var needed_games = [] | ||
| 100 | for game in message["datapackage_checksums"].keys(): | ||
| 101 | if ( | ||
| 102 | !_datapackages.has(game) | ||
| 103 | or _datapackages[game]["checksum"] != message["datapackage_checksums"][game] | ||
| 104 | ): | ||
| 105 | needed_games.append(game) | ||
| 106 | |||
| 107 | if !needed_games.empty(): | ||
| 108 | requestDatapackages(needed_games) | ||
| 109 | else: | ||
| 113 | connectToRoom() | 110 | connectToRoom() |
| 114 | 111 | ||
| 112 | elif cmd == "DataPackage": | ||
| 113 | _datapackages = message["data"]["games"] | ||
| 114 | saveSettings() | ||
| 115 | processDatapackages() | ||
| 116 | connectToRoom() | ||
| 117 | |||
| 115 | elif cmd == "Connected": | 118 | elif cmd == "Connected": |
| 116 | _authenticated = true | 119 | _authenticated = true |
| 117 | _team = message["team"] | 120 | _team = message["team"] |
| @@ -196,9 +199,7 @@ func saveSettings(): | |||
| 196 | var file = File.new() | 199 | var file = File.new() |
| 197 | file.open("user://settings/archipelago", File.WRITE) | 200 | file.open("user://settings/archipelago", File.WRITE) |
| 198 | 201 | ||
| 199 | var data = [ | 202 | var data = [ap_server, ap_user, ap_pass, _datapackages] |
| 200 | ap_server, ap_user, ap_pass, _datapackage_checksum, _item_name_to_id, _location_name_to_id | ||
| 201 | ] | ||
| 202 | file.store_var(data, true) | 203 | file.store_var(data, true) |
| 203 | file.close() | 204 | file.close() |
| 204 | 205 | ||
| @@ -239,8 +240,19 @@ func sendMessage(msg): | |||
| 239 | _client.get_peer(1).put_packet(payload.to_utf8()) | 240 | _client.get_peer(1).put_packet(payload.to_utf8()) |
| 240 | 241 | ||
| 241 | 242 | ||
| 242 | func requestDatapackage(): | 243 | func requestDatapackages(games): |
| 243 | sendMessage([{"cmd": "GetDataPackage", "games": ["Lingo"]}]) | 244 | sendMessage([{"cmd": "GetDataPackage", "games": games}]) |
| 245 | |||
| 246 | |||
| 247 | func processDatapackages(): | ||
| 248 | _item_id_to_name = {} | ||
| 249 | for package in _datapackages.values(): | ||
| 250 | for name in package["item_name_to_id"].keys(): | ||
| 251 | _item_id_to_name[package["item_name_to_id"][name]] = name | ||
| 252 | |||
| 253 | if _datapackages.has("Lingo"): | ||
| 254 | _item_name_to_id = _datapackages["Lingo"]["item_name_to_id"] | ||
| 255 | _location_name_to_id = _datapackages["Lingo"]["location_name_to_id"] | ||
| 244 | 256 | ||
| 245 | 257 | ||
| 246 | func connectToRoom(): | 258 | func connectToRoom(): |
| @@ -309,19 +321,23 @@ func processItem(item, index, from): | |||
| 309 | if _item_name_to_id["Progressive Orange Tower"] == item and _tower_floors < orange_tower.size(): | 321 | if _item_name_to_id["Progressive Orange Tower"] == item and _tower_floors < orange_tower.size(): |
| 310 | var subitem_name = "Orange Tower - %s Floor" % orange_tower[_tower_floors] | 322 | var subitem_name = "Orange Tower - %s Floor" % orange_tower[_tower_floors] |
| 311 | global._print(subitem_name) | 323 | global._print(subitem_name) |
| 312 | processItem(_item_name_to_id[subitem_name]) | 324 | processItem(_item_name_to_id[subitem_name], null) |
| 313 | _tower_floors += 1 | 325 | _tower_floors += 1 |
| 314 | 326 | ||
| 315 | # Show a message about the item if it's new. | 327 | # Show a message about the item if it's new. |
| 316 | if index > _last_new_item: | 328 | if index != null and index > _last_new_item: |
| 317 | _last_new_item = index | 329 | _last_new_item = index |
| 318 | saveLocaldata() | 330 | saveLocaldata() |
| 319 | 331 | ||
| 332 | var item_name = "Unknown" | ||
| 333 | if _item_id_to_name.has(item): | ||
| 334 | item_name = _item_id_to_name[item] | ||
| 335 | |||
| 320 | var messages_node = get_tree().get_root().get_node("Spatial/AP_Messages") | 336 | var messages_node = get_tree().get_root().get_node("Spatial/AP_Messages") |
| 321 | if from == _slot: | 337 | if from == _slot: |
| 322 | messages_node.showMessage("Found %d" % item) | 338 | messages_node.showMessage("Found %s" % item_name) |
| 323 | else: | 339 | else: |
| 324 | messages_node.showMessage("Received %d from %d" % [item, from]) | 340 | messages_node.showMessage("Received %s from %d" % [item_name, from]) |
| 325 | 341 | ||
| 326 | 342 | ||
| 327 | func doorIsVanilla(door): | 343 | func doorIsVanilla(door): |
