aboutsummaryrefslogtreecommitdiff
path: root/client/menu/communicate/popup_message/popup_message.gd
diff options
context:
space:
mode:
Diffstat (limited to 'client/menu/communicate/popup_message/popup_message.gd')
-rw-r--r--client/menu/communicate/popup_message/popup_message.gd117
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