aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/game.gd107
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