From 5a2d1f6f2462636d8389adb46ba3ff237ffe32c7 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Thu, 28 Aug 2025 15:51:23 -0400 Subject: [Client] Added messages overlay --- client/Archipelago/client.gd | 4 +- client/Archipelago/manager.gd | 102 ++++++++++++++++++++++++++++++++-- client/Archipelago/messages.gd | 61 ++++++++++++++++++++ client/Archipelago/settings_screen.gd | 5 ++ 4 files changed, 166 insertions(+), 6 deletions(-) create mode 100644 client/Archipelago/messages.gd (limited to 'client/Archipelago') diff --git a/client/Archipelago/client.gd b/client/Archipelago/client.gd index 5c4bc51..d394b6c 100644 --- a/client/Archipelago/client.gd +++ b/client/Archipelago/client.gd @@ -310,11 +310,11 @@ func processDatapackages(): _item_id_to_name[game] = {} for item_name in package["item_name_to_id"].keys(): - _item_id_to_name[game][package["item_name_to_id"][item_name]] = item_name + _item_id_to_name[game][int(package["item_name_to_id"][item_name])] = item_name _location_id_to_name[game] = {} for location_name in package["location_name_to_id"].keys(): - _location_id_to_name[game][package["location_name_to_id"][location_name]] = location_name + _location_id_to_name[game][int(package["location_name_to_id"][location_name])] = location_name if _datapackages.has("Lingo 2"): _item_name_to_id = _datapackages["Lingo 2"]["item_name_to_id"] diff --git a/client/Archipelago/manager.gd b/client/Archipelago/manager.gd index 35fc8e3..99cb47b 100644 --- a/client/Archipelago/manager.gd +++ b/client/Archipelago/manager.gd @@ -13,6 +13,9 @@ var connection_history = [] var client +var _received_indexes = [] +var _last_new_item = -1 + signal could_not_connect signal connect_status signal ap_connected @@ -35,6 +38,9 @@ func saveSettings(): func connectToServer(): + _received_indexes = [] + _last_new_item = -1 + client.connectToServer(ap_server, ap_user, ap_pass) @@ -62,9 +68,20 @@ func has_item(item_id): return client.hasItem(item_id) -func _process_item(item_id, _index, _player, _flags): +func _process_item(item, index, from, flags): + if index != null: + if _received_indexes.has(index): + # Do not re-process items. + return + + _received_indexes.append(index) + + 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 door_id = gamedata.door_id_by_ap_id.get(item_id, null) + var door_id = gamedata.door_id_by_ap_id.get(item, null) if door_id != null and gamedata.get_door_map_name(door_id) == global.map: var receivers = gamedata.get_door_receivers(door_id) var scene = get_tree().get_root().get_node_or_null("scene") @@ -79,9 +96,71 @@ func _process_item(item_id, _index, _player, _flags): if pnode != null: pnode.handleTriggered() + # Show a message about the item if it's new. + if index != null and index > _last_new_item: + _last_new_item = index + #saveLocaldata() -func _process_message(_message): - pass + var player_name = "Unknown" + if client._player_name_by_slot.has(from): + player_name = client._player_name_by_slot[from] + + var item_color = colorForItemType(flags) + + var message + if from == client._slot: + message = "Found [color=%s]%s[/color]" % [item_color, item_name] + else: + message = "Received [color=%s]%s[/color] from %s" % [item_color, item_name, player_name] + + global._print(message) + + global.get_node("Messages").showMessage(message) + + +func _process_message(message): + if ( + !message.has("receiving") + or !message.has("item") + or message["item"]["player"] != client._slot + ): + return + + var item_name = "Unknown" + var item_player_game = client._game_by_player[message["receiving"]] + if client._item_id_to_name[item_player_game].has(message["item"]["item"]): + item_name = client._item_id_to_name[item_player_game][message["item"]["item"]] + + var location_name = "Unknown" + var location_player_game = client._game_by_player[message["item"]["player"]] + if client._location_id_to_name[location_player_game].has(message["item"]["location"]): + location_name = ( + client._location_id_to_name[location_player_game][message["item"]["location"]] + ) + + var player_name = "Unknown" + if client._player_name_by_slot.has(message["receiving"]): + player_name = client._player_name_by_slot[message["receiving"]] + + var item_color = colorForItemType(message["item"]["flags"]) + + if message["type"] == "Hint": + var is_for = "" + if message["receiving"] != client._slot: + is_for = " for %s" % player_name + if !message.has("found") || !message["found"]: + global.get_node("Messages").showMessage( + ( + "Hint: [color=%s]%s[/color]%s is on %s" + % [item_color, item_name, is_for, location_name] + ) + ) + else: + if message["receiving"] != client._slot: + var sentMsg = "Sent [color=%s]%s[/color] to %s" % [item_color, item_name, player_name] + #if _hinted_locations.has(message["item"]["location"]): + # sentMsg += " ([color=#fafad2]Hinted![/color])" + global.get_node("Messages").showMessage(sentMsg) func _client_could_not_connect(): @@ -98,3 +177,18 @@ func _client_connected(): func send_location(loc_id): client.sendLocation(loc_id) + + +func colorForItemType(flags): + var int_flags = int(flags) + if int_flags & 1: # progression + if int_flags & 2: # proguseful + return "#f0d200" + else: + return "#bc51e0" + elif int_flags & 2: # useful + return "#2b67ff" + elif int_flags & 4: # trap + return "#d63a22" + else: # filler + return "#14de9e" diff --git a/client/Archipelago/messages.gd b/client/Archipelago/messages.gd new file mode 100644 index 0000000..52f38b9 --- /dev/null +++ b/client/Archipelago/messages.gd @@ -0,0 +1,61 @@ +extends CanvasLayer + +var _message_queue = [] +var _font +var _container +var _ordered_labels = [] + + +func _ready(): + _container = VBoxContainer.new() + _container.set_name("Container") + _container.anchor_bottom = 1 + _container.offset_left = 20.0 + _container.offset_right = 1920.0 + _container.offset_top = 0.0 + _container.offset_bottom = -20.0 + _container.alignment = BoxContainer.ALIGNMENT_END + _container.mouse_filter = Control.MOUSE_FILTER_IGNORE + self.add_child(_container) + + _font = load("res://assets/fonts/Lingo2.ttf") + + +func _add_message(text): + var new_label = RichTextLabel.new() + new_label.push_font(_font) + new_label.push_font_size(36) + new_label.push_outline_color(Color(0, 0, 0, 1)) + new_label.push_outline_size(2) + new_label.append_text(text) + new_label.fit_content = true + + _container.add_child(new_label) + _ordered_labels.push_back(new_label) + + +func showMessage(text): + if _ordered_labels.size() >= 9: + _message_queue.append(text) + return + + _add_message(text) + + if _ordered_labels.size() > 1: + return + + var timeout = 10.0 + while !_ordered_labels.is_empty(): + await get_tree().create_timer(timeout).timeout + + var to_remove = _ordered_labels.pop_front() + var to_tween = get_tree().create_tween().bind_node(to_remove) + to_tween.tween_property(to_remove, "modulate:a", 0.0, 0.5) + to_tween.tween_callback(to_remove.queue_free) + + if !_message_queue.is_empty(): + var next_msg = _message_queue.pop_front() + _add_message(next_msg) + + if timeout > 4: + timeout -= 3 diff --git a/client/Archipelago/settings_screen.gd b/client/Archipelago/settings_screen.gd index 90d5437..a675f8e 100644 --- a/client/Archipelago/settings_screen.gd +++ b/client/Archipelago/settings_screen.gd @@ -49,6 +49,11 @@ func _ready(): gamedata_instance.name = "Gamedata" global.add_child(gamedata_instance) + var messages_script = load("user://maps/Archipelago/messages.gd") + var messages_instance = messages_script.new() + messages_instance.name = "Messages" + global.add_child(messages_instance) + var ap = global.get_node("Archipelago") ap.connect("ap_connected", connectionSuccessful) ap.connect("could_not_connect", connectionUnsuccessful) -- cgit 1.4.1