aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornokoe <nokoe@mailbox.org>2025-04-07 16:29:11 +0200
committernokoe <nokoe@mailbox.org>2025-04-07 16:29:11 +0200
commita51e4f60fcc03649529349227bbe2b28395eebc7 (patch)
treea3da5ce2b00837df98257d8f093b85ac99bf3c2b
parent48a7a20e0f1595cd6e46c8c5136863ed56d5ef2b (diff)
downloadhurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar
hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar.bz2
hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar.zst
fix #240; fix #241
-rw-r--r--client/map/map.gd4
-rw-r--r--client/map/tiles/floor_mesher.gd22
-rw-r--r--server/editor/src/main.rs30
3 files changed, 24 insertions, 32 deletions
diff --git a/client/map/map.gd b/client/map/map.gd
index 10bb1bd1..2b8dd651 100644
--- a/client/map/map.gd
+++ b/client/map/map.gd
@@ -21,7 +21,7 @@ extends Node3D
var tile_by_pos: Dictionary = {}
var autobake = false
var currently_baked = false
-var floor_mesher = FloorMesher.new()
+var floor_mesher := FloorMesher.new()
var floor_node := MeshInstance3D.new()
func get_tile_name(pos: Vector2i):
@@ -34,6 +34,7 @@ func get_tile_instance(pos: Vector2i) -> Tile:
else: return null
func set_tile(pos: Vector2i, name_: String, neighbors: Array = [null,null,null,null]) -> Tile:
+ clear_tile(pos)
var tile = TileFactory.produce(name_, pos, neighbors, floor_mesher)
add_child(tile)
tile.position = Vector3(pos.x, 0, pos.y)
@@ -47,6 +48,7 @@ func clear_tile(pos: Vector2i):
tile_by_pos.erase(str(pos))
tile.name += "_queued_free"
tile.queue_free()
+ floor_mesher.remove_tile(pos)
@onready var voxelgi: VoxelGI = $VoxelGI
diff --git a/client/map/tiles/floor_mesher.gd b/client/map/tiles/floor_mesher.gd
index 182425a5..d3a66c89 100644
--- a/client/map/tiles/floor_mesher.gd
+++ b/client/map/tiles/floor_mesher.gd
@@ -31,21 +31,25 @@ var tiles: Dictionary
func add_tile(pos: Vector2i):
tiles[str(pos)] = pos
+func remove_tile(pos: Vector2i):
+ tiles.erase(str(pos))
+
func flush() -> ArrayMesh:
+ var tiles_queue = tiles.duplicate()
var st := SurfaceTool.new()
st.begin(Mesh.PRIMITIVE_TRIANGLES)
- while not tiles.is_empty():
- var key: String = tiles.keys()[0]
- var tile_position: Vector2i = tiles[key]
+ while not tiles_queue.is_empty():
+ var key: String = tiles_queue.keys()[0]
+ var tile_position: Vector2i = tiles_queue[key]
var shift := Vector2i.ZERO
# move the origin of the rectangle to the upper left corner
while true:
- #if tiles.has(str(tile_position + shift + Vector2i.UP + Vector2i.LEFT)):
+ #if tiles_queue.has(str(tile_position + shift + Vector2i.UP + Vector2i.LEFT)):
# shift += Vector2i.UP + Vector2i.LEFT
- if tiles.has(str(tile_position + shift + Vector2i.UP)):
+ if tiles_queue.has(str(tile_position + shift + Vector2i.UP)):
shift += Vector2i.UP
- elif tiles.has(str(tile_position + shift + Vector2i.LEFT)):
+ elif tiles_queue.has(str(tile_position + shift + Vector2i.LEFT)):
shift += Vector2i.LEFT
else:
break
@@ -54,14 +58,14 @@ func flush() -> ArrayMesh:
var rectangle := Vector2i.ONE
# go down as long as possible
- while tiles.has(str(rectangle_origin + Vector2i(0, rectangle.y))):
+ while tiles_queue.has(str(rectangle_origin + Vector2i(0, rectangle.y))):
rectangle.y += 1
# try to go right as long as possible by checking if whole columns are long enough
while true:
var column_possible := true
for i in range(0, rectangle.y):
- column_possible = tiles.has(str(rectangle_origin + Vector2i(rectangle.x, i)))
+ column_possible = tiles_queue.has(str(rectangle_origin + Vector2i(rectangle.x, i)))
if not column_possible: break
if column_possible:
rectangle.x += 1
@@ -102,5 +106,5 @@ func flush() -> ArrayMesh:
# remove the rectangle from the "queue"
for x in range(rectangle_origin.x, rectangle_origin.x + rectangle.x):
for y in range(rectangle_origin.y, rectangle_origin.y + rectangle.y):
- tiles.erase(str(Vector2i(x, y)))
+ tiles_queue.erase(str(Vector2i(x, y)))
return st.commit()
diff --git a/server/editor/src/main.rs b/server/editor/src/main.rs
index 8577aec1..2c05dfbc 100644
--- a/server/editor/src/main.rs
+++ b/server/editor/src/main.rs
@@ -92,7 +92,7 @@ const TILES: &[(&str, char, u8)] = &[
("coconut-crate", 'u', 0),
("strawberry-crate", 'v', 0),
("rice-crate", 'w', 0),
- ("wall-window", 'x', 0),
+ ("wall-window", 'x', 2),
("freezer", 'y', 0),
("trash", 'z', 0),
("sink", 'A', 0),
@@ -103,6 +103,13 @@ const TILES: &[(&str, char, u8)] = &[
("door", 'F', 1),
("path", 'G', 1),
("book", 'H', 1),
+ ("house-wall", 'I', 2),
+ ("house-side", 'J', 2),
+ ("house-balcony", 'K', 2),
+ ("house-door", 'L', 2),
+ ("house-oriel", 'M', 2),
+ ("house-roof", 'N', 2),
+ ("house-roof-chimney", 'O', 2),
];
#[allow(unused_assignments)]
@@ -237,27 +244,6 @@ impl State {
],
})
}
- // send every existing tile once move because client does not remember
- // TODO remove when client is fixed
- for (tile, _) in &self.tiles {
- self.out.push(PacketC::UpdateMap {
- tile: *tile,
- kind: None,
- neighbors: [None; 4],
- })
- }
- for (tile, kind) in &self.tiles {
- self.out.push(PacketC::UpdateMap {
- tile: *tile,
- kind: Some(*kind),
- neighbors: [
- self.tiles.get(&(tile + IVec2::NEG_Y)).copied(),
- self.tiles.get(&(tile + IVec2::NEG_X)).copied(),
- self.tiles.get(&(tile + IVec2::Y)).copied(),
- self.tiles.get(&(tile + IVec2::X)).copied(),
- ],
- })
- }
self.out.push(PacketC::FlushMap);
}
}