diff options
| author | nokoe <nokoe@mailbox.org> | 2025-10-14 14:48:51 +0200 |
|---|---|---|
| committer | nokoe <nokoe@mailbox.org> | 2025-10-14 14:48:51 +0200 |
| commit | d057e0a8566e16a0b1f49ae517bcfbd3dc446a04 (patch) | |
| tree | abb9b7fb0b5e8d2a1986a37ecc1c0df2d5333088 /client | |
| parent | a0680908bbe5743a7984a444d258d91d0c729347 (diff) | |
| download | hurrycurry-d057e0a8566e16a0b1f49ae517bcfbd3dc446a04.tar hurrycurry-d057e0a8566e16a0b1f49ae517bcfbd3dc446a04.tar.bz2 hurrycurry-d057e0a8566e16a0b1f49ae517bcfbd3dc446a04.tar.zst | |
replace get_message_str by `MessageParser`
Diffstat (limited to 'client')
| -rw-r--r-- | client/game.gd | 107 |
1 files changed, 51 insertions, 56 deletions
diff --git a/client/game.gd b/client/game.gd index 14274b14..87a3ce2e 100644 --- a/client/game.gd +++ b/client/game.gd @@ -236,51 +236,52 @@ func handle_packet(p): var timeout_remaining: float = p.timeout.remaining if p.timeout != null else 5. var pinned: bool = p.timeout.pinned if p.timeout != null and "pinned" in p.timeout else false if p.message != null: - if "item" in p.message: - var item_name: String = item_names[p.message.item] - var parsed_item := ItemFactory.ItemName.new(item_name) - var ingredients := [parsed_item.name] - ingredients.append_array(parsed_item.contents) - - if pinned: - overlay_pinned_messages.pin_item(item_name, timeout_initial, timeout_remaining, p.player) - - var player: Player = players[p.player] - player.item_message(item_name, timeout_initial, timeout_remaining) - - # Maybe start tutorial - # after joining, the last item message that popped up is ignored. the next one will - # be used for the tutorial - if (player.is_customer - and not Settings.read("gameplay.tutorial_disabled") - and join_state == JoinState.JOINED): - var completed_ingredients: Array = Profile.read("tutorial_ingredients_played") - var completed := Global.array_has_all(completed_ingredients, ingredients) - - if not completed: - if tutorial_running: - tutorial_queue.push_back(item_name) - else: - tutorial_running = true - update_tutorial_running.emit(tutorial_running) - mp.send_chat(my_player_id, "/start-tutorial %s" % item_name) - elif "text" in p.message or "translation" in p.message: - var data = TextMessage.new() - data.timeout_initial = timeout_initial - data.timeout_remaining = timeout_remaining - if pinned: - push_error("Pinned text messages are currently not supported") - var player: Player = players[p.player] - data.color = Character.COLORS[G.rem_euclid(player.character_style.color, Character.COLORS.size())] - data.username = players[p.player].username - data.text = p.message.text if "text" in p.message else get_message_str(p.message) + var m = MessageParser.new(p.message) + m.parse(self) + match m.kind: + MessageParser.Kind.ITEM: + var item_name: String = m.result + var container := ItemFactory.ItemName.new(item_name) + var ingredients := [container.name] + ingredients.append_array(container.contents) - player.text_message(data) - text_message.emit(data) - elif "tile" in p.message: - push_error("TODO: tile message") - else: - push_error("unknown message kind") + if pinned: + overlay_pinned_messages.pin_item(item_name, timeout_initial, timeout_remaining, p.player) + + var player: Player = players[p.player] + player.item_message(item_name, timeout_initial, timeout_remaining) + + # Maybe start tutorial + # after joining, the last item message that popped up is ignored. the next one will + # be used for the tutorial + if (player.is_customer + and not Settings.read("gameplay.tutorial_disabled") + and join_state == JoinState.JOINED): + var completed_ingredients: Array = Profile.read("tutorial_ingredients_played") + var completed := Global.array_has_all(completed_ingredients, ingredients) + + if not completed: + if tutorial_running: + tutorial_queue.push_back(item_name) + else: + tutorial_running = true + update_tutorial_running.emit(tutorial_running) + mp.send_chat(my_player_id, "/start-tutorial %s" % item_name) + MessageParser.Kind.TEXT: + var data = TextMessage.new() + data.timeout_initial = timeout_initial + data.timeout_remaining = timeout_remaining + if pinned: + push_error("Pinned text messages are currently not supported") + var player: Player = players[p.player] + data.color = Character.COLORS[G.rem_euclid(player.character_style.color, Character.COLORS.size())] + data.username = players[p.player].username + data.text = m.result + + player.text_message(data) + text_message.emit(data) + _: + push_error("unsupported communicate message type") else: var player: Player = players[p.player] if player.is_customer and player.current_item_message != null: @@ -357,11 +358,12 @@ func handle_packet(p): "book": menu.submenu("res://gui/menus/book/book.tscn", BookMenu.BookData.new(self, p.data)) "server_message": - var mstr := get_message_str(p.message) + var m := MessageParser.new(p.message) + m.parse(self) if p.error: - overlay_popup_message.display_server_msg(tr("c.error.server").format([mstr])) + overlay_popup_message.display_server_msg(tr("c.error.server").format([m.result])) else: - overlay_popup_message.display_server_msg(mstr) + overlay_popup_message.display_server_msg(m.result) "server_hint": if p.player != my_player_id: return @@ -373,13 +375,13 @@ func handle_packet(p): if message == null: overlay_popup_message.clear_server_msg() else: - overlay_popup_message.display_server_msg(get_message_str(message), false) + overlay_popup_message.display_server_msg(MessageParser.new(message).parse(self), false) else: # Positional hint message if message == null: overlay_popup_message.clear_server_msg(position_) else: - overlay_popup_message.display_server_msg_positional(get_message_str(message), position_, false) + overlay_popup_message.display_server_msg_positional(MessageParser.new(message).parse(self), position_, false) "environment": $Environment.update(p.effects) "redirect": @@ -423,13 +425,6 @@ func _process(delta): if is_replay and mp != null: mp.send_replay_tick(delta) -# TODO: move into PopupMessage and use RichTextLabel for tile/item images -func get_message_str(m: Dictionary) -> String: - if "translation" in m: return tr(m.translation.id).format(m.translation.params.map(get_message_str)) - if "tile" in m.keys(): return tile_names[m.tile] - if "item" in m.keys(): return item_names[m.item] - return Global.get_message_str(m) - func get_tile_collision(pos: Vector2i) -> bool: var t = map.get_tile_name(pos) if t == null: return true |