about summary refs log tree commit diff stats
path: root/apworld/client/manager.gd
diff options
context:
space:
mode:
Diffstat (limited to 'apworld/client/manager.gd')
-rw-r--r--apworld/client/manager.gd201
1 files changed, 77 insertions, 124 deletions
diff --git a/apworld/client/manager.gd b/apworld/client/manager.gd index b170c77..46c5456 100644 --- a/apworld/client/manager.gd +++ b/apworld/client/manager.gd
@@ -6,8 +6,8 @@ var SCRIPT_client
6var SCRIPT_keyboard 6var SCRIPT_keyboard
7var SCRIPT_locationListener 7var SCRIPT_locationListener
8var SCRIPT_minimap 8var SCRIPT_minimap
9var SCRIPT_uuid
10var SCRIPT_victoryListener 9var SCRIPT_victoryListener
10var SCRIPT_websocketserver
11 11
12var ap_server = "" 12var ap_server = ""
13var ap_user = "" 13var ap_user = ""
@@ -92,14 +92,17 @@ func _init():
92 92
93func _ready(): 93func _ready():
94 client = SCRIPT_client.new() 94 client = SCRIPT_client.new()
95 client.SCRIPT_uuid = SCRIPT_uuid 95 client.SCRIPT_websocketserver = SCRIPT_websocketserver
96 96
97 client.connect("item_received", _process_item) 97 client.item_received.connect(_process_item)
98 client.connect("message_received", _process_message) 98 client.location_scout_received.connect(_process_location_scout)
99 client.connect("location_scout_received", _process_location_scout) 99 client.text_message_received.connect(_process_text_message)
100 client.connect("could_not_connect", _client_could_not_connect) 100 client.item_sent_notification.connect(_process_item_sent_notification)
101 client.connect("connect_status", _client_connect_status) 101 client.hint_received.connect(_process_hint_received)
102 client.connect("client_connected", _client_connected) 102
103 client.could_not_connect.connect(_client_could_not_connect)
104 client.connect_status.connect(_client_connect_status)
105 client.client_connected.connect(_client_connected)
103 106
104 add_child(client) 107 add_child(client)
105 108
@@ -163,20 +166,17 @@ func get_item_id_for_door(door_id):
163 return _item_locks.get(door_id, null) 166 return _item_locks.get(door_id, null)
164 167
165 168
166func _process_item(item, index, from, flags, amount): 169func _process_item(item, amount):
167 var item_name = "Unknown"
168 if client._item_id_to_name["Lingo 2"].has(item):
169 item_name = client._item_id_to_name["Lingo 2"][item]
170
171 var gamedata = global.get_node("Gamedata") 170 var gamedata = global.get_node("Gamedata")
172 171
172 var item_id = int(item["id"])
173 var prog_id = null 173 var prog_id = null
174 if _inverse_item_locks.has(item): 174 if _inverse_item_locks.has(item_id):
175 for lock in _inverse_item_locks.get(item): 175 for lock in _inverse_item_locks.get(item_id):
176 if lock[1] != amount: 176 if lock[1] != amount:
177 continue 177 continue
178 178
179 if gamedata.progressive_id_by_ap_id.has(item): 179 if gamedata.progressive_id_by_ap_id.has(item_id):
180 prog_id = lock[0] 180 prog_id = lock[0]
181 181
182 if gamedata.get_door_map_name(lock[0]) != global.map: 182 if gamedata.get_door_map_name(lock[0]) != global.map:
@@ -190,38 +190,35 @@ func _process_item(item, index, from, flags, amount):
190 if rnode != null: 190 if rnode != null:
191 rnode.handleTriggered() 191 rnode.handleTriggered()
192 192
193 var letter_id = gamedata.letter_id_by_ap_id.get(item, null) 193 var letter_id = gamedata.letter_id_by_ap_id.get(item_id, null)
194 if letter_id != null: 194 if letter_id != null:
195 var letter = gamedata.objects.get_letters()[letter_id] 195 var letter = gamedata.objects.get_letters()[letter_id]
196 if not letter.has_level2() or not letter.get_level2(): 196 if not letter.has_level2() or not letter.get_level2():
197 _process_key_item(letter.get_key(), amount) 197 _process_key_item(letter.get_key(), amount)
198 198
199 if gamedata.symbol_item_ids.has(item): 199 if gamedata.symbol_item_ids.has(item_id):
200 var player = get_tree().get_root().get_node_or_null("scene/player") 200 var player = get_tree().get_root().get_node_or_null("scene/player")
201 if player != null: 201 if player != null:
202 player.emit_signal("evaluate_solvability") 202 player.evaluate_solvability.emit()
203 203
204 # Show a message about the item if it's new. 204 # Show a message about the item if it's new.
205 if index != null and index > _last_new_item: 205 if int(item["index"]) > _last_new_item:
206 _last_new_item = index 206 _last_new_item = int(item["index"])
207 saveLocaldata() 207 saveLocaldata()
208 208
209 var player_name = "Unknown" 209 var full_item_name = item["text"]
210 if client._player_name_by_slot.has(float(from)):
211 player_name = client._player_name_by_slot[float(from)]
212
213 var full_item_name = item_name
214 if prog_id != null: 210 if prog_id != null:
215 var door = gamedata.objects.get_doors()[prog_id] 211 var door = gamedata.objects.get_doors()[prog_id]
216 full_item_name = "%s (%s)" % [item_name, door.get_name()] 212 full_item_name = "%s (%s)" % [full_item_name, door.get_name()]
217 213
218 var message 214 var message
219 if from == client._slot: 215 if "sender" in item:
220 message = "Found %s" % wrapInItemColorTags(full_item_name, flags)
221 else:
222 message = ( 216 message = (
223 "Received %s from %s" % [wrapInItemColorTags(full_item_name, flags), player_name] 217 "Received %s from %s"
218 % [wrapInItemColorTags(full_item_name, item["flags"]), item["sender"]]
224 ) 219 )
220 else:
221 message = "Found %s" % wrapInItemColorTags(full_item_name, item["flags"])
225 222
226 if gamedata.anti_trap_ids.has(item): 223 if gamedata.anti_trap_ids.has(item):
227 keyboard.block_letter(gamedata.anti_trap_ids[item]) 224 keyboard.block_letter(gamedata.anti_trap_ids[item])
@@ -231,112 +228,68 @@ func _process_item(item, index, from, flags, amount):
231 global.get_node("Messages").showMessage(message) 228 global.get_node("Messages").showMessage(message)
232 229
233 230
234func _process_message(message): 231func _process_item_sent_notification(message):
235 parse_printjson_for_textclient(message) 232 var sentMsg = (
236 233 "Sent %s to %s"
237 if ( 234 % [
238 !message.has("receiving") 235 wrapInItemColorTags(message["item_name"], message["item_flags"]),
239 or !message.has("item") 236 message["receiver_name"]
240 or message["item"]["player"] != client._slot 237 ]
241 ): 238 )
242 return 239 #if _hinted_locations.has(message["item"]["location"]):
243 240 # sentMsg += " ([color=#fafad2]Hinted![/color])"
244 var item_name = "Unknown" 241 global.get_node("Messages").showMessage(sentMsg)
245 var item_player_game = client._game_by_player[message["receiving"]] 242
246 if client._item_id_to_name[item_player_game].has(int(message["item"]["item"])): 243
247 item_name = client._item_id_to_name[item_player_game][int(message["item"]["item"])] 244func _process_hint_received(message):
248 245 var is_for = ""
249 var location_name = "Unknown" 246 if message["self"] == 0:
250 var location_player_game = client._game_by_player[message["item"]["player"]] 247 is_for = " for %s" % message["receiver_name"]
251 if client._location_id_to_name[location_player_game].has(int(message["item"]["location"])): 248
252 location_name = (client._location_id_to_name[location_player_game][int( 249 global.get_node("Messages").showMessage(
253 message["item"]["location"] 250 (
254 )]) 251 "Hint: %s%s is on %s"
255 252 % [
256 var player_name = "Unknown" 253 wrapInItemColorTags(message["item_name"], message["item_flags"]),
257 if client._player_name_by_slot.has(message["receiving"]): 254 is_for,
258 player_name = client._player_name_by_slot[message["receiving"]] 255 message["location_name"]
259 256 ]
260 var item_color = colorForItemType(message["item"]["flags"]) 257 )
261 258 )
262 if message["type"] == "Hint": 259
263 var is_for = "" 260
264 if message["receiving"] != client._slot: 261func _process_text_message(message):
265 is_for = " for %s" % player_name
266 if !message.has("found") || !message["found"]:
267 global.get_node("Messages").showMessage(
268 (
269 "Hint: %s%s is on %s"
270 % [
271 wrapInItemColorTags(item_name, message["item"]["flags"]),
272 is_for,
273 location_name
274 ]
275 )
276 )
277 else:
278 if message["receiving"] != client._slot:
279 var sentMsg = (
280 "Sent %s to %s"
281 % [wrapInItemColorTags(item_name, message["item"]["flags"]), player_name]
282 )
283 #if _hinted_locations.has(message["item"]["location"]):
284 # sentMsg += " ([color=#fafad2]Hinted![/color])"
285 global.get_node("Messages").showMessage(sentMsg)
286
287
288func parse_printjson_for_textclient(message):
289 var parts = [] 262 var parts = []
290 for message_part in message["data"]: 263 for message_part in message:
291 if !message_part.has("type") and message_part.has("text"): 264 if message_part["type"] == "text":
292 parts.append(message_part["text"]) 265 parts.append(message_part["text"])
293 elif message_part["type"] == "player_id": 266 elif message_part["type"] == "player":
294 if int(message_part["text"]) == client._slot: 267 if message_part["self"] == 1:
295 parts.append( 268 parts.append("[color=#ee00ee]%s[/color]" % message_part["text"])
296 "[color=#ee00ee]%s[/color]" % client._player_name_by_slot[client._slot]
297 )
298 else: 269 else:
299 var from = float(message_part["text"]) 270 parts.append("[color=#fafad2]%s[/color]" % message_part["text"])
300 parts.append("[color=#fafad2]%s[/color]" % client._player_name_by_slot[from]) 271 elif message_part["type"] == "item":
301 elif message_part["type"] == "item_id": 272 parts.append(wrapInItemColorTags(message_part["text"], message_part["flags"]))
302 var item_name = "Unknown" 273 elif message_part["type"] == "location":
303 var item_player_game = client._game_by_player[message_part["player"]] 274 parts.append("[color=#00ff7f]%s[/color]" % message_part["text"])
304 if client._item_id_to_name[item_player_game].has(int(message_part["text"])):
305 item_name = client._item_id_to_name[item_player_game][int(message_part["text"])]
306
307 parts.append(wrapInItemColorTags(item_name, message_part["flags"]))
308 elif message_part["type"] == "location_id":
309 var location_name = "Unknown"
310 var location_player_game = client._game_by_player[message_part["player"]]
311 if client._location_id_to_name[location_player_game].has(int(message_part["text"])):
312 location_name = client._location_id_to_name[location_player_game][int(
313 message_part["text"]
314 )]
315
316 parts.append("[color=#00ff7f]%s[/color]" % location_name)
317 elif message_part.has("text"):
318 parts.append(message_part["text"])
319 275
320 var textclient_node = global.get_node("Textclient") 276 var textclient_node = global.get_node("Textclient")
321 if textclient_node != null: 277 if textclient_node != null:
322 textclient_node.parse_printjson("".join(parts)) 278 textclient_node.parse_printjson("".join(parts))
323 279
324 280
325func _process_location_scout(item_id, location_id, player, flags): 281func _process_location_scout(location_id, item_name, player_name, flags, for_self):
326 _location_scouts[location_id] = {"item": item_id, "player": player, "flags": flags} 282 _location_scouts[location_id] = {
283 "item": item_name, "player": player_name, "flags": flags, "for_self": for_self
284 }
327 285
328 if player == client._slot and flags & 4 != 0: 286 if for_self and flags & 4 != 0:
329 # This is a trap for us, so let's not display it. 287 # This is a trap for us, so let's not display it.
330 return 288 return
331 289
332 var gamedata = global.get_node("Gamedata") 290 var gamedata = global.get_node("Gamedata")
333 var map_id = gamedata.map_id_by_name.get(global.map) 291 var map_id = gamedata.map_id_by_name.get(global.map)
334 292
335 var item_name = "Unknown"
336 var item_player_game = client._game_by_player[float(player)]
337 if client._item_id_to_name[item_player_game].has(item_id):
338 item_name = client._item_id_to_name[item_player_game][item_id]
339
340 var letter_id = gamedata.letter_id_by_ap_id.get(location_id, null) 293 var letter_id = gamedata.letter_id_by_ap_id.get(location_id, null)
341 if letter_id != null: 294 if letter_id != null:
342 var letter = gamedata.objects.get_letters()[letter_id] 295 var letter = gamedata.objects.get_letters()[letter_id]
@@ -350,11 +303,11 @@ func _process_location_scout(item_id, location_id, player, flags):
350 303
351 304
352func _client_could_not_connect(message): 305func _client_could_not_connect(message):
353 emit_signal("could_not_connect", message) 306 could_not_connect.emit(message)
354 307
355 308
356func _client_connect_status(message): 309func _client_connect_status(message):
357 emit_signal("connect_status", message) 310 connect_status.emit(message)
358 311
359 312
360func _client_connected(slot_data): 313func _client_connected(slot_data):
@@ -463,7 +416,7 @@ func _client_connected(slot_data):
463 416
464 _inverse_item_locks[lock[0]].append([door_id, lock[1]]) 417 _inverse_item_locks[lock[0]].append([door_id, lock[1]])
465 418
466 emit_signal("ap_connected") 419 ap_connected.emit()
467 420
468 421
469func start_batching_locations(): 422func start_batching_locations():