diff options
| author | tpart <tpart120@proton.me> | 2024-09-28 20:07:24 +0200 | 
|---|---|---|
| committer | tpart <tpart120@proton.me> | 2024-09-28 20:07:24 +0200 | 
| commit | fea2899db4065d035c9c3c6559741328e0084900 (patch) | |
| tree | 72aebf904a4ef0b71db3782511597064c3dad83b /client/menu/communicate | |
| parent | d644c5fd05b082b5a56d233e670689553242fa2c (diff) | |
| download | hurrycurry-fea2899db4065d035c9c3c6559741328e0084900.tar hurrycurry-fea2899db4065d035c9c3c6559741328e0084900.tar.bz2 hurrycurry-fea2899db4065d035c9c3c6559741328e0084900.tar.zst | |
Implement support for multiple positional server hints (Fixes #150)
Diffstat (limited to 'client/menu/communicate')
4 files changed, 110 insertions, 76 deletions
| diff --git a/client/menu/communicate/popup_message/popup_message.gd b/client/menu/communicate/popup_message/popup_message.gd index fdcc51a1..d7dde91f 100644 --- a/client/menu/communicate/popup_message/popup_message.gd +++ b/client/menu/communicate/popup_message/popup_message.gd @@ -14,35 +14,31 @@  # 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.join_state_updated.connect(func(state: Game.JoinState):  		is_joined = state == Game.JoinState.JOINED @@ -56,15 +52,19 @@ func _ready():  	)  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 +		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 ingame():  	is_ingame = true @@ -84,27 +84,32 @@ 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): -	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 display_server_msg_positional(text: String, pos: Vector2): +	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) +	msg.node.size = Vector2.ZERO +	msg.position = pos +	positional_messages[pos] = msg -func clear_server_msg(): -	server_msg_timer.stop() -	server_msg.hide() -	server_msg_positional.hide() +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 _on_server_timer_timeout():  	clear_server_msg() @@ -221,3 +226,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 diff --git a/client/menu/communicate/popup_message/popup_message.tscn b/client/menu/communicate/popup_message/popup_message.tscn index 799712e1..7342fcef 100644 --- a/client/menu/communicate/popup_message/popup_message.tscn +++ b/client/menu/communicate/popup_message/popup_message.tscn @@ -33,25 +33,35 @@ content_margin_top = 8.0  content_margin_right = 32.0  content_margin_bottom = 8.0 -[node name="PopupMessage" type="MarginContainer"] +[node name="PopupMessage" type="Control"] +layout_mode = 3  anchors_preset = 15  anchor_right = 1.0  anchor_bottom = 1.0  grow_horizontal = 2  grow_vertical = 2  mouse_filter = 2 -theme = ExtResource("1_a1566")  script = ExtResource("2_sbew6") -[node name="VBox" type="VBoxContainer" parent="."] +[node name="Static" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme = ExtResource("1_a1566") + +[node name="VBox" type="VBoxContainer" parent="Static"]  layout_mode = 2  mouse_filter = 2 -[node name="ServerMessage" parent="VBox" instance=ExtResource("3_m3rok")] +[node name="ServerMessage" parent="Static/VBox" instance=ExtResource("3_m3rok")]  visible = false  layout_mode = 2 -[node name="HintMessage" type="PanelContainer" parent="VBox"] +[node name="HintMessage" type="PanelContainer" parent="Static/VBox"]  visible = false  material = SubResource("ShaderMaterial_k0m35")  layout_mode = 2 @@ -60,12 +70,12 @@ mouse_filter = 2  theme_override_styles/panel = SubResource("StyleBoxFlat_vq4dg")  script = ExtResource("4_pvwmw") -[node name="CenterContainer" type="HBoxContainer" parent="VBox/HintMessage"] +[node name="CenterContainer" type="HBoxContainer" parent="Static/VBox/HintMessage"]  layout_mode = 2  mouse_filter = 2  alignment = 1 -[node name="MarginContainer" type="MarginContainer" parent="VBox/HintMessage/CenterContainer"] +[node name="MarginContainer" type="MarginContainer" parent="Static/VBox/HintMessage/CenterContainer"]  layout_mode = 2  mouse_filter = 2  theme_override_constants/margin_left = 4 @@ -73,7 +83,7 @@ theme_override_constants/margin_top = 4  theme_override_constants/margin_right = 4  theme_override_constants/margin_bottom = 4 -[node name="TextureRect" type="TextureRect" parent="VBox/HintMessage/CenterContainer/MarginContainer"] +[node name="TextureRect" type="TextureRect" parent="Static/VBox/HintMessage/CenterContainer/MarginContainer"]  custom_minimum_size = Vector2(28, 28)  layout_mode = 2  mouse_filter = 2 @@ -81,7 +91,7 @@ texture = ExtResource("5_2dxsd")  expand_mode = 1  stretch_mode = 4 -[node name="Label" type="Label" parent="VBox/HintMessage/CenterContainer"] +[node name="Label" type="Label" parent="Static/VBox/HintMessage/CenterContainer"]  layout_mode = 2  size_flags_horizontal = 3  theme_override_fonts/font = SubResource("FontVariation_qfltj") @@ -89,60 +99,66 @@ theme_override_styles/normal = SubResource("StyleBoxEmpty_3rgop")  text = "A hint is worth more than a thousand manuals"  autowrap_mode = 3 -[node name="ServerTimer" type="Timer" parent="."] +[node name="Positional" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Timers" type="Node" parent="."] + +[node name="Server" type="Timer" parent="Timers"]  wait_time = 5.0  one_shot = true -[node name="HintTimer" type="Timer" parent="."] +[node name="Hint" type="Timer" parent="Timers"]  wait_time = 10.0  one_shot = true -[node name="AutoHintTimers" type="Node" parent="."] +[node name="AutoHints" type="Node" parent="Timers"] -[node name="Move" type="Timer" parent="AutoHintTimers"] +[node name="Move" type="Timer" parent="Timers/AutoHints"]  wait_time = 2.0  one_shot = true -[node name="Performance" type="Timer" parent="AutoHintTimers"] +[node name="Performance" type="Timer" parent="Timers/AutoHints"]  wait_time = 20.0  one_shot = true -[node name="Boost" type="Timer" parent="AutoHintTimers"] +[node name="Boost" type="Timer" parent="Timers/AutoHints"]  wait_time = 90.0  one_shot = true -[node name="Interact" type="Timer" parent="AutoHintTimers"] +[node name="Interact" type="Timer" parent="Timers/AutoHints"]  wait_time = 15.0  one_shot = true -[node name="RotateCamera" type="Timer" parent="AutoHintTimers"] +[node name="RotateCamera" type="Timer" parent="Timers/AutoHints"]  wait_time = 120.0  one_shot = true -[node name="Zoom" type="Timer" parent="AutoHintTimers"] +[node name="Zoom" type="Timer" parent="Timers/AutoHints"]  wait_time = 135.0  one_shot = true -[node name="Reset" type="Timer" parent="."] +[node name="Reset" type="Timer" parent="Timers"]  wait_time = 10.0  one_shot = true -[node name="JoinWhileRunning" type="Timer" parent="."] +[node name="JoinWhileRunning" type="Timer" parent="Timers"]  wait_time = 5.0  one_shot = true -[node name="ServerMessagePositional" type="Node2D" parent="."] -visible = false - -[node name="ServerMessage" parent="ServerMessagePositional" instance=ExtResource("3_m3rok")] - -[connection signal="timeout" from="ServerTimer" to="." method="_on_server_timer_timeout"] -[connection signal="timeout" from="HintTimer" to="." method="_on_hint_timer_timeout"] -[connection signal="timeout" from="AutoHintTimers/Move" to="." method="_on_move_timeout"] -[connection signal="timeout" from="AutoHintTimers/Performance" to="." method="_on_performance_timeout"] -[connection signal="timeout" from="AutoHintTimers/Boost" to="." method="_on_boost_timeout"] -[connection signal="timeout" from="AutoHintTimers/Interact" to="." method="_on_interact_timeout"] -[connection signal="timeout" from="AutoHintTimers/RotateCamera" to="." method="_on_rotate_camera_timeout"] -[connection signal="timeout" from="AutoHintTimers/Zoom" to="." method="_on_zoom_timeout"] -[connection signal="timeout" from="Reset" to="." method="_on_reset_timeout"] -[connection signal="timeout" from="JoinWhileRunning" to="." method="_on_join_while_running_timeout"] +[connection signal="timeout" from="Timers/Server" to="Static" method="_on_server_timer_timeout"] +[connection signal="timeout" from="Timers/Hint" to="Static" method="_on_hint_timer_timeout"] +[connection signal="timeout" from="Timers/AutoHints/Move" to="Static" method="_on_move_timeout"] +[connection signal="timeout" from="Timers/AutoHints/Performance" to="Static" method="_on_performance_timeout"] +[connection signal="timeout" from="Timers/AutoHints/Boost" to="Static" method="_on_boost_timeout"] +[connection signal="timeout" from="Timers/AutoHints/Interact" to="Static" method="_on_interact_timeout"] +[connection signal="timeout" from="Timers/AutoHints/RotateCamera" to="Static" method="_on_rotate_camera_timeout"] +[connection signal="timeout" from="Timers/AutoHints/Zoom" to="Static" method="_on_zoom_timeout"] +[connection signal="timeout" from="Timers/Reset" to="Static" method="_on_reset_timeout"] +[connection signal="timeout" from="Timers/JoinWhileRunning" to="Static" method="_on_join_while_running_timeout"] diff --git a/client/menu/communicate/popup_message/server_message.gd b/client/menu/communicate/popup_message/server_message.gd new file mode 100644 index 00000000..cbf4ba71 --- /dev/null +++ b/client/menu/communicate/popup_message/server_message.gd @@ -0,0 +1,7 @@ +extends BlurSetup +class_name ServerMessage + +@onready var label: Label = $CenterContainer/Label + +func set_text(text: String): +	label.text = text diff --git a/client/menu/communicate/popup_message/server_message.tscn b/client/menu/communicate/popup_message/server_message.tscn index 63160942..2015027b 100644 --- a/client/menu/communicate/popup_message/server_message.tscn +++ b/client/menu/communicate/popup_message/server_message.tscn @@ -1,7 +1,7 @@  [gd_scene load_steps=8 format=3 uid="uid://dq61p3a8og2b6"]  [ext_resource type="Shader" path="res://menu/blur_mix.gdshader" id="1_qv8ew"] -[ext_resource type="Script" path="res://menu/blur_setup.gd" id="2_80a6b"] +[ext_resource type="Script" path="res://menu/communicate/popup_message/server_message.gd" id="2_csqo8"]  [ext_resource type="FontFile" uid="uid://bk704sc5gkrb3" path="res://menu/theme/font-azaret-mono.woff2" id="3_dw20j"]  [sub_resource type="ShaderMaterial" id="ShaderMaterial_q3bbd"] @@ -35,7 +35,7 @@ size_flags_horizontal = 4  size_flags_vertical = 0  mouse_filter = 2  theme_override_styles/panel = SubResource("StyleBoxFlat_vq4dg") -script = ExtResource("2_80a6b") +script = ExtResource("2_csqo8")  [node name="CenterContainer" type="CenterContainer" parent="."]  layout_mode = 2 | 
