diff options
Diffstat (limited to 'client/menu/communicate/popup_message/popup_message.gd')
-rw-r--r-- | client/menu/communicate/popup_message/popup_message.gd | 117 |
1 files changed, 59 insertions, 58 deletions
diff --git a/client/menu/communicate/popup_message/popup_message.gd b/client/menu/communicate/popup_message/popup_message.gd index 6c2c2c0e..98bd94e3 100644 --- a/client/menu/communicate/popup_message/popup_message.gd +++ b/client/menu/communicate/popup_message/popup_message.gd @@ -14,45 +14,34 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>. # -extends MarginContainer +extends Control class_name PopupMessage +const SERVER_MESSAGE_SCENE = preload("res://menu/communicate/popup_message/server_message.tscn") + var is_ingame := false var is_joined := false -@onready var server_msg = $VBox/ServerMessage -@onready var server_msg_positional = $ServerMessagePositional -@onready var hint_msg = $VBox/HintMessage - -@onready var server_msg_timer: Timer = $ServerTimer -@onready var hint_msg_timer: Timer = $HintTimer - -@onready var server_msg_label: Label = $VBox/ServerMessage/CenterContainer/Label -@onready var server_msg_positional_label: Label = $ServerMessagePositional/ServerMessage/CenterContainer/Label -@onready var hint_msg_label: Label = $VBox/HintMessage/CenterContainer/Label +var positional_messages = {} -@onready var server_msg_positional_panel: PanelContainer = $ServerMessagePositional/ServerMessage +@onready var positional_messages_node: Control = $Positional +@onready var server_msg = $Static/VBox/ServerMessage +@onready var hint_msg = $Static/VBox/HintMessage -@onready var auto_hint_timers: Node = $AutoHintTimers +@onready var server_msg_label: Label = $Static/VBox/ServerMessage/CenterContainer/Label +@onready var hint_msg_label: Label = $Static/VBox/HintMessage/CenterContainer/Label -@onready var reset_timer = $Reset -@onready var join_while_running_timer = $JoinWhileRunning +@onready var auto_hint_timers: Node = $Timers/AutoHints +@onready var server_msg_timer: Timer = $Timers/Server +@onready var hint_msg_timer: Timer = $Timers/Hint +@onready var reset_timer = $Timers/Reset +@onready var join_while_running_timer = $Timers/JoinWhileRunning @onready var game: Game = $"../Game" -var server_message_position := Vector2.ZERO -var last_server_message_panel_size := Vector2.ZERO - func _ready(): - game.joined.connect( - func player_joined(): - is_joined = true - update_state() - ) - game.left.connect( - func player_joined(): - is_joined = false - update_state() + game.join_state_updated.connect(func(state: Game.JoinState): + is_joined = state == Game.JoinState.JOINED ) game.update_tutorial_running.connect( func a(running: bool): @@ -61,25 +50,26 @@ func _ready(): else: update_state() ) + game.in_lobby_updated.connect( + func a(in_lobby): + is_ingame = not in_lobby + update_state() + ) func _process(_delta: float): - if server_msg_positional.visible: - var pos_3d = Vector3(server_message_position.x + 0.5, 1.5, server_message_position.y + 0.5) + for pos: Vector2 in positional_messages.keys(): + var msg: PositionalMessage = positional_messages[pos] + var pos_3d = Vector3(pos.x + 0.5, 1.5, pos.y + 0.5) var pos_2d = get_viewport().get_camera_3d().unproject_position(pos_3d) - var server_message_panel_size = server_msg_positional_panel.size - server_msg_positional.position = pos_2d.clamp(Vector2.ZERO + 0.5 * server_message_panel_size, Vector2(get_viewport_rect().size) - 0.5 * server_message_panel_size) - if server_message_panel_size != last_server_message_panel_size: - last_server_message_panel_size = server_message_panel_size - server_msg_positional_panel.position = -0.5 * last_server_message_panel_size - -func ingame(): - is_ingame = true - update_state() - -func lobby(): - is_ingame = false - update_state() + msg.node_2d.position = pos_2d.clamp( + Vector2.ZERO + 0.5 * msg.node.size, + Vector2(get_viewport_rect().size) - 0.5 * msg.node.size + ) + + if msg.node.size != msg.last_size: + msg.last_size = msg.node.size + msg.node.position = -0.5 * msg.last_size func update_state(): if is_ingame and is_joined: @@ -91,30 +81,35 @@ func update_state(): stop_game_hints() func display_server_msg(msg: String, auto_remove := true): - clear_server_msg() server_msg.show() server_msg_label.text = msg if auto_remove: server_msg_timer.start() -func display_server_msg_positional(msg: String, pos: Vector2, auto_remove := true): +func _on_server_timeout() -> void: clear_server_msg() - server_msg_positional.show() - server_message_position = pos - server_msg_positional_label.text = msg - server_msg_positional_panel.size = Vector2.ZERO - - if auto_remove: - server_msg_timer.start() -func clear_server_msg(): - server_msg_timer.stop() - server_msg.hide() - server_msg_positional.hide() +func display_server_msg_positional(text: String, pos: Vector2, use_monospace: bool): + var msg := PositionalMessage.new() + msg.node = SERVER_MESSAGE_SCENE.instantiate() + msg.node_2d = Node2D.new() + positional_messages_node.add_child(msg.node_2d) + msg.node_2d.add_child(msg.node) + msg.node.set_text(text, use_monospace) + msg.node.size = Vector2.ZERO + msg.position = pos + positional_messages[pos] = msg -func _on_server_timer_timeout(): - clear_server_msg() +func clear_server_msg(position_ = null): + if position_ == null: + server_msg_timer.stop() + server_msg.hide() + else: + if position_ in positional_messages: + var msg: PositionalMessage = positional_messages[position_] + msg.node_2d.queue_free() + positional_messages.erase(position_) func display_hint_msg(msg: String): hint_msg.show() @@ -220,7 +215,7 @@ func _on_rotate_camera_timeout(): )])) func _on_join_while_running_timeout(): - if not game.is_joined and not Global.get_hint("has_seen_join_while_running"): + if not game.join_state == Game.JoinState.JOINED and not Global.get_hint("has_seen_join_while_running"): Global.set_hint("has_seen_join_while_running", true) display_hint_msg(tr("c.hint.join_while_running").format([display_keybind("menu")])) @@ -228,3 +223,9 @@ func _on_performance_timeout() -> void: if not Global.get_hint("has_seen_performance") and Engine.get_frames_per_second() < DisplayServer.screen_get_refresh_rate() * 0.75: Global.set_hint("has_seen_performance", true) display_hint_msg(tr("c.hint.framerate_low")) + +class PositionalMessage: + var node: ServerMessage + var node_2d: Node2D + var position: Vector2 + var last_size: Vector2 |