aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortpart <tpart120@proton.me>2026-03-01 22:17:36 +0100
committertpart <tpart120@proton.me>2026-03-01 22:17:41 +0100
commita4d9e467bb629546f7c663f2d6fa3a8f2a753977 (patch)
treeca667dc9466fa5e152d213319112cb48784f66da
parent998267627f1b31ca4534eb6b450a1d09379d58ff (diff)
downloadhurrycurry-a4d9e467bb629546f7c663f2d6fa3a8f2a753977.tar
hurrycurry-a4d9e467bb629546f7c663f2d6fa3a8f2a753977.tar.bz2
hurrycurry-a4d9e467bb629546f7c663f2d6fa3a8f2a753977.tar.zst
Implement server name and motd; Update to new data protocol
-rw-r--r--client/game.gd35
-rw-r--r--client/gui/menus/screen_info.tscn4
-rw-r--r--client/map/map.gd12
-rw-r--r--client/map/tile_factory.gd4
-rw-r--r--client/map/tiles/screen/screen.gd5
-rw-r--r--client/map/tiles/screen/screen.tscn3
-rw-r--r--client/map/tiles/screen/screen_model.gd22
-rw-r--r--client/map/tiles/screen/screen_model.gd.uid1
8 files changed, 64 insertions, 22 deletions
diff --git a/client/game.gd b/client/game.gd
index bf7831ef..45cca6f9 100644
--- a/client/game.gd
+++ b/client/game.gd
@@ -30,6 +30,12 @@ class TextMessage:
var timeout_initial: float
var timeout_remaining
+class ServerContext:
+ var name: String
+ var motd#: String?
+ func _init(name_: String, motd_) -> void:
+ name = name_; motd = motd_
+
enum SpectatingMode {
CENTER,
FREE,
@@ -49,6 +55,7 @@ var tile_placeable_any: Array[String] = []
var tile_placeable_items: Dictionary[String, Array] = {} # Dictionary[String, Array[String]]
var tile_interactable_empty: Array[String] = []
var maps: Array = []
+var server_context: ServerContext
var bot_algos: Array
var text_message_history: Array[TextMessage] = []
@@ -89,25 +96,27 @@ func _ready():
func handle_packet(p):
match p.type:
"joined": my_player_id = p.id
- "data":
- item_names = p["data"]["item_names"]
- tile_names = p["data"]["tile_names"]
+ "server_data":
+ maps = p["maps"]
+ bot_algos = p["bot_algos"]
+ server_context = ServerContext.new(p["name"], p["motd"])
+ "game_data":
+ item_names = p["item_names"]
+ tile_names = p["tile_names"]
tile_collide = []
tile_interactable_empty = []
tile_placeable_any = []
tile_placeable_items = {}
- for tile in p["data"]["tile_collide"]: tile_collide.append(tile_names[int(tile)])
- for tile in p["data"]["tile_interactable_empty"]: tile_interactable_empty.append(tile_names[int(tile)])
- for tile in p["data"]["tile_placeable_any"]: tile_placeable_any.append(tile_names[int(tile)])
- for tile in p["data"]["tile_placeable_items"]:
- tile_placeable_items[tile_names[int(tile)]] = p["data"]["tile_placeable_items"][tile].map(func(x): return item_names[int(x)])
- maps = p["data"]["maps"]
- bot_algos = p["data"]["bot_algos"]
- Global.hand_count = p["data"]["hand_count"]
+ for tile in p["tile_collide"]: tile_collide.append(tile_names[int(tile)])
+ for tile in p["tile_interactable_empty"]: tile_interactable_empty.append(tile_names[int(tile)])
+ for tile in p["tile_placeable_any"]: tile_placeable_any.append(tile_names[int(tile)])
+ for tile in p["tile_placeable_items"]:
+ tile_placeable_items[tile_names[int(tile)]] = p["tile_placeable_items"][tile].map(func(x): return item_names[int(x)])
+ Global.hand_count = p["hand_count"]
Global.hand_count_change.emit(Global.hand_count)
Global.last_map_name = Global.current_map_name
- Global.current_map_name = p["data"]["current_map"]
+ Global.current_map_name = p["current_map"]
data_updated.emit()
"add_player":
@@ -226,7 +235,7 @@ func handle_packet(p):
var tiles: Array = change[1].map(func(x): return tile_names[int(x)] if x != null else null) # : Array[String]
changes[pos] = tiles
- map.set_all_tiles(changes)
+ map.set_all_tiles(changes, server_context)
map.flush()
"communicate":
# TODO: use MessageParser
diff --git a/client/gui/menus/screen_info.tscn b/client/gui/menus/screen_info.tscn
index 6e6441d0..79fac92f 100644
--- a/client/gui/menus/screen_info.tscn
+++ b/client/gui/menus/screen_info.tscn
@@ -1,5 +1,6 @@
[gd_scene format=3 uid="uid://dgtdfctc0x78v"]
+[ext_resource type="Script" uid="uid://4quq7un7innk" path="res://map/tiles/screen/screen_info.gd" id="1_07dxw"]
[ext_resource type="Shader" uid="uid://b7p7umdb51hhn" path="res://gui/resources/shaders/clouds_canvas_item.gdshader" id="1_ogbng"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_ogbng"]
@@ -25,6 +26,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
+script = ExtResource("1_07dxw")
[node name="ColorRect" type="ColorRect" parent="." unique_id=642803588]
material = SubResource("ShaderMaterial_86n4b")
@@ -54,7 +56,7 @@ layout_mode = 2
layout_mode = 2
size_flags_vertical = 3
bbcode_enabled = true
-text = "[font_size=48][b]Welcome to example.org![/b]
+text = "[font_size=48][b]Example server[/b]
This is an example motd. Enjoy![/font_size]"
fit_content = true
diff --git a/client/map/map.gd b/client/map/map.gd
index eb1e13bb..da9f3f68 100644
--- a/client/map/map.gd
+++ b/client/map/map.gd
@@ -49,11 +49,11 @@ func get_tile_item(pos: Vector2i): # -> Item?
if e == null: return null
return e.item
-func set_all_tiles(changes: Dictionary[Vector2i, Array]):
+func set_all_tiles(changes: Dictionary[Vector2i, Array], srv: Game.ServerContext = null):
for pos: Vector2i in changes:
- set_tiles(Vector2i(pos.x, pos.y), changes[pos], changes)
+ set_tiles(Vector2i(pos.x, pos.y), changes[pos], changes, srv)
-func set_tiles(pos: Vector2i, tiles: Array = [], pending_changes: Dictionary[Vector2i, Array] = {}): # tiles: Array[String]
+func set_tiles(pos: Vector2i, tiles: Array = [], pending_changes: Dictionary[Vector2i, Array] = {}, srv: Game.ServerContext = null): # tiles: Array[String]
var tile_info = tile_by_pos.get(pos)
if tile_info != null:
for inst: Tile in tile_info.tile_instances:
@@ -61,10 +61,10 @@ func set_tiles(pos: Vector2i, tiles: Array = [], pending_changes: Dictionary[Vec
# TODO: Don't return, but handle changes which weren't handled by the instance below.
if inst.change(tile): return # Instance handled change itself!
_remove_tile(pos)
- if not tiles.is_empty(): _add_tiles(pos, tiles, pending_changes)
+ if not tiles.is_empty(): _add_tiles(pos, tiles, pending_changes, srv)
if autoflush: flush()
-func _add_tiles(pos: Vector2i, tiles: Array, pending_changes: Dictionary[Vector2i, Array] = {}) -> void:
+func _add_tiles(pos: Vector2i, tiles: Array, pending_changes: Dictionary[Vector2i, Array], srv: Game.ServerContext) -> void:
# Combinate tiles
for k in TILE_COMBINATOR:
if G.has_all(tiles, k):
@@ -86,7 +86,7 @@ func _add_tiles(pos: Vector2i, tiles: Array, pending_changes: Dictionary[Vector2
add_child(tiles_parent)
var tile_instances: Array[Tile] = []
for tile_name: String in tiles:
- var tile := tile_factory.produce(tile_name, pos, neighbors)
+ var tile := tile_factory.produce(tile_name, pos, neighbors, srv)
tile_instances.append(tile)
tile.position = Vector3(pos.x, 0, pos.y)
tiles_parent.add_child(tile)
diff --git a/client/map/tile_factory.gd b/client/map/tile_factory.gd
index ce239f4c..1ff6baf4 100644
--- a/client/map/tile_factory.gd
+++ b/client/map/tile_factory.gd
@@ -31,6 +31,7 @@ class TileCC:
var position: Vector2i
var neighbors: Array
var floor_meshers: Dictionary[String, FloorMesher]
+ var server_context: Game.ServerContext
var floor_meshers: Dictionary[String, FloorMesher] = {
"floor": FloorMesher.new(Floor.floor_mesh()),
@@ -39,7 +40,7 @@ var floor_meshers: Dictionary[String, FloorMesher] = {
"street": FloorMesher.new(Street.floor_mesh())
}
-func produce(raw_name: String, position: Vector2i, neighbors: Array) -> Tile:
+func produce(raw_name: String, position: Vector2i, neighbors: Array, server_context: Game.ServerContext = null) -> Tile:
var tile_name = TileName.new(raw_name)
var ctx := TileCC.new()
@@ -51,6 +52,7 @@ func produce(raw_name: String, position: Vector2i, neighbors: Array) -> Tile:
else: return null
)
ctx.floor_meshers = floor_meshers
+ ctx.server_context = server_context
match tile_name.name:
"book": return CounterBase.new(ctx, preload("res://map/tiles/book.tscn"))
diff --git a/client/map/tiles/screen/screen.gd b/client/map/tiles/screen/screen.gd
index c95f0753..3e059fc1 100644
--- a/client/map/tiles/screen/screen.gd
+++ b/client/map/tiles/screen/screen.gd
@@ -18,4 +18,7 @@ extends Tile
func _init(ctx: TileFactory.TileCC):
super(ctx)
- base.add_child(load("res://map/tiles/screen/screen.tscn").instantiate())
+ var screen_model: ScreenModel = load("res://map/tiles/screen/screen.tscn").instantiate()
+ base.add_child(screen_model)
+ screen_model.set_server_context(ctx.server_context)
+ \ No newline at end of file
diff --git a/client/map/tiles/screen/screen.tscn b/client/map/tiles/screen/screen.tscn
index 82221eeb..a1f88294 100644
--- a/client/map/tiles/screen/screen.tscn
+++ b/client/map/tiles/screen/screen.tscn
@@ -1,11 +1,13 @@
[gd_scene format=3 uid="uid://vqe0wrt0ddq"]
[ext_resource type="ArrayMesh" uid="uid://g6nwwhptmmmd" path="res://map/tiles/screen/screen_display.res" id="1_d1utq"]
+[ext_resource type="Script" uid="uid://cye7akcsp46cv" path="res://map/tiles/screen/screen_model.gd" id="1_fabw7"]
[ext_resource type="ArrayMesh" uid="uid://nsmq1ko2woad" path="res://map/tiles/screen/screen_base.res" id="1_mm46a"]
[ext_resource type="PackedScene" uid="uid://d22cslgao5jd4" path="res://map/tiles/floor.tscn" id="3_dmy1m"]
[ext_resource type="PackedScene" uid="uid://dgtdfctc0x78v" path="res://gui/menus/screen_info.tscn" id="4_ebgc8"]
[node name="Screen" type="Node3D" unique_id=1614533170]
+script = ExtResource("1_fabw7")
[node name="Base" type="MeshInstance3D" parent="." unique_id=597805735]
transform = Transform3D(2, 0, 0, 0, 0, -2, 0, 2, 0, 0, 0, 0)
@@ -20,6 +22,7 @@ disable_3d = true
size = Vector2i(834, 480)
[node name="ScreenInfo" parent="Display/ScreenViewport" unique_id=907327052 instance=ExtResource("4_ebgc8")]
+script = null
[node name="Floor" parent="." unique_id=527188940 instance=ExtResource("3_dmy1m")]
transform = Transform3D(12.117, 0, 0, 0, 12.117, 0, 0, 0, 12.117, 0, 0, 0)
diff --git a/client/map/tiles/screen/screen_model.gd b/client/map/tiles/screen/screen_model.gd
new file mode 100644
index 00000000..c0f0cbde
--- /dev/null
+++ b/client/map/tiles/screen/screen_model.gd
@@ -0,0 +1,22 @@
+# Hurry Curry! - a game about cooking
+# Copyright (C) 2025 Hurry Curry! contributors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, version 3 of the License only.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# 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 Node3D
+class_name ScreenModel
+
+func set_server_context(server_context: Game.ServerContext) -> void:
+ $Display/ScreenViewport/ScreenInfo/MarginContainer/VBoxContainer/RichTextLabel.text = """[font_size=48][b]%s[/b]
+
+%s[/font_size]""" % [server_context.name, server_context.motd]
diff --git a/client/map/tiles/screen/screen_model.gd.uid b/client/map/tiles/screen/screen_model.gd.uid
new file mode 100644
index 00000000..6a2a81b0
--- /dev/null
+++ b/client/map/tiles/screen/screen_model.gd.uid
@@ -0,0 +1 @@
+uid://cye7akcsp46cv