aboutsummaryrefslogtreecommitdiff
path: root/client/map
diff options
context:
space:
mode:
authortpart <tpart120@proton.me>2026-02-28 22:31:33 +0100
committertpart <tpart120@proton.me>2026-02-28 22:31:38 +0100
commit94cda50771a7f24f507029751ad3139ca8034801 (patch)
tree17c89bd95f3cd1bd3e255d4293ec78e6cc528e9e /client/map
parent50ebcafc17f8f0a29f59dfb86cc7a27180c8e9b8 (diff)
downloadhurrycurry-94cda50771a7f24f507029751ad3139ca8034801.tar
hurrycurry-94cda50771a7f24f507029751ad3139ca8034801.tar.bz2
hurrycurry-94cda50771a7f24f507029751ad3139ca8034801.tar.zst
Rewrite old item system to work with tile stacks
Diffstat (limited to 'client/map')
-rw-r--r--client/map/map.gd70
-rw-r--r--client/map/tile_factory.gd6
-rw-r--r--client/map/tiles/active_interact_counter.gd5
-rw-r--r--client/map/tiles/book.tscn7
-rw-r--r--client/map/tiles/exterior_tree.gd2
-rw-r--r--client/map/tiles/tile.gd2
6 files changed, 54 insertions, 38 deletions
diff --git a/client/map/map.gd b/client/map/map.gd
index acf7c1a4..d2467fd6 100644
--- a/client/map/map.gd
+++ b/client/map/map.gd
@@ -17,12 +17,13 @@ class_name Map
extends Node3D
class TileInfo:
- func _init(position_, name_, tile_, neighbours_) -> void:
- position = position_; name = name_; tile = tile_; neighbours = neighbours_
+ func _init(position_, tiles_, tile_instances_, tile_parent_) -> void:
+ position = position_; tiles = tiles_; tile_instances = tile_instances_; tile_parent = tile_parent_
var position: Vector2i
- var name: String
- var tile: Tile
- var neighbours: Array
+ var tiles: Array # Array[String]
+ var tile_instances: Array[Tile]
+ var tile_parent: Node3D
+ var interact_tile: Tile
const NEIGHBOR_OFFSETS: Array[Vector2i] = [Vector2i.UP, Vector2i.LEFT, Vector2i.DOWN, Vector2i.RIGHT]
@@ -32,26 +33,30 @@ var currently_baked = false
var floor_node := MeshInstance3D.new()
var tile_factory := TileFactory.new()
-func get_tile_name(pos: Vector2i): # -> String?
+func get_tiles_at(pos: Vector2i): # -> Array[String]?
var e = tile_by_pos.get(pos)
- if e != null: return e.name
- else: return null
-func get_tile_instance(pos: Vector2i) -> Tile:
+ if e == null: return null
+ return e.tiles
+func get_topmost_instance(pos: Vector2i): # -> Tile?
var e = tile_by_pos.get(pos)
- if e != null: return e.tile
- else: return null
+ if e == null: return null
+ return e.tile_instances[-1]
+func get_tile_item(pos: Vector2i): # -> Item?
+ var e = get_topmost_instance(pos)
+ if e == null: return null
+ return e.item
func set_all_tiles(changes: Dictionary[Vector2i, Array]):
for pos: Vector2i in changes:
set_tiles(Vector2i(pos.x, pos.y), changes[pos], changes)
func set_tiles(pos: Vector2i, tiles: Array = [], pending_changes: Dictionary[Vector2i, Array] = {}): # tiles: Array[String]
- var inst = get_tile_instance(pos)
- if inst != null and not tiles.is_empty():
- for tile: String in tiles:
- # TODO: Don't return, but handle changes which weren't handled by the instance below.
- if inst.change(tile):
- return # Instance handled change itself!
+ var tile_info = tile_by_pos.get(pos)
+ if tile_info != null:
+ for inst: Tile in tile_info.tile_instances:
+ for tile: String in tiles:
+ # 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 autoflush: flush()
@@ -67,23 +72,32 @@ func _add_tiles(pos: Vector2i, tiles: Array, pending_changes: Dictionary[Vector2
neighbors.append(tile_by_pos[neighbor_pos])
else: neighbors.append([])
+ var tiles_parent = Node3D.new()
+ tiles_parent.name = str(pos)
+ add_child(tiles_parent)
+ var tile_instances: Array[Tile] = []
for tile_name: String in tiles:
var tile := tile_factory.produce(tile_name, pos, neighbors)
- add_child(tile)
+ tile_instances.append(tile)
tile.position = Vector3(pos.x, 0, pos.y)
- tile_by_pos[pos] = TileInfo.new(pos, tile_name, tile, neighbors)
+ tiles_parent.add_child(tile)
+ tile_by_pos[pos] = TileInfo.new(pos, tiles, tile_instances, tiles_parent)
func _remove_tile(pos: Vector2i):
- var tile := get_tile_instance(pos)
- if tile == null: return
- if tile.item != null: tile.item.queue_free()
- if tile is FloorLike:
- var floor_mesher = tile_factory.floor_meshers.get(tile.fm_id())
- if floor_mesher != null:
- floor_mesher.remove_tile(pos)
- tile.queue_free()
+ var tile_info = tile_by_pos.get(pos)
+ if tile_info == null: return
+
+ var topmost_instance = get_topmost_instance(pos)
+ if topmost_instance.item != null:
+ topmost_instance.item.queue_free()
+
+ for instance: Tile in tile_info.tile_instances:
+ if instance is FloorLike:
+ var floor_mesher = tile_factory.floor_meshers.get(instance.fm_id())
+ if floor_mesher != null:
+ floor_mesher.remove_tile(pos)
+ instance.queue_free()
tile_by_pos.erase(pos)
- tile.name += "_queued_free"
@onready var voxelgi: VoxelGI = $VoxelGI
diff --git a/client/map/tile_factory.gd b/client/map/tile_factory.gd
index 1640e512..dc108392 100644
--- a/client/map/tile_factory.gd
+++ b/client/map/tile_factory.gd
@@ -20,8 +20,10 @@ extends Object
class TileName:
var name# : String
var variant #: String?
- func _init(raw_name: String):
- var c = Array(raw_name.split(":"))
+ var raw_name: String
+ func _init(raw_name_: String):
+ raw_name = raw_name_
+ var c = Array(raw_name_.split(":"))
name = c[0]; variant = c[1] if c.size() >= 2 else null # TODO Array.get throws errors
class TileCC:
diff --git a/client/map/tiles/active_interact_counter.gd b/client/map/tiles/active_interact_counter.gd
index 742f147f..11ab9d5a 100644
--- a/client/map/tiles/active_interact_counter.gd
+++ b/client/map/tiles/active_interact_counter.gd
@@ -15,7 +15,7 @@
#
@abstract
class_name ActiveInteractCounter
-extends CounterBase
+extends Tile
var interact_sound: AudioStreamPlayer3D = AudioStreamPlayer3D.new()
var interact_tool: Node3D
@@ -23,7 +23,8 @@ var acting_players: Array[Player] = []
var play_character_animation: Callable
func _init(ctx: TileFactory.TileCC, station_model_: PackedScene, interact_tool_path: NodePath, play_character_animation_: Callable, audio_stream_: AudioStream):
- super(ctx, station_model_)
+ super(ctx)
+ base.add_child(station_model_.instantiate())
interact_sound.stream = audio_stream_
add_child(interact_sound)
interact_tool = base.get_node(interact_tool_path)
diff --git a/client/map/tiles/book.tscn b/client/map/tiles/book.tscn
index 9e1b144c..c7e9d141 100644
--- a/client/map/tiles/book.tscn
+++ b/client/map/tiles/book.tscn
@@ -1,10 +1,9 @@
-[gd_scene load_steps=2 format=3 uid="uid://c7fjfp5ygxsjc"]
+[gd_scene format=3 uid="uid://c7fjfp5ygxsjc"]
[ext_resource type="ArrayMesh" uid="uid://cgvow28wkwesp" path="res://map/tiles/book.res" id="1_vxs3d"]
-[node name="Book" type="Node3D"]
+[node name="Book" type="Node3D" unique_id=517586832]
-[node name="Mesh" type="MeshInstance3D" parent="."]
+[node name="Mesh" type="MeshInstance3D" parent="." unique_id=664640069]
transform = Transform3D(1.19249e-08, 0, -1, 0, 1, 0, 1, 0, 1.19249e-08, 0, 0.5, 0)
mesh = ExtResource("1_vxs3d")
-skeleton = NodePath("")
diff --git a/client/map/tiles/exterior_tree.gd b/client/map/tiles/exterior_tree.gd
index 7db57cd7..faaede1c 100644
--- a/client/map/tiles/exterior_tree.gd
+++ b/client/map/tiles/exterior_tree.gd
@@ -14,7 +14,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name ExteriorTree
-extends Grass
+extends Tile
const SCALE: Vector3 = Vector3(100., 100., 100.)
const ROT: Vector3 = Vector3(1.5 * PI, 0., 0.)
diff --git a/client/map/tiles/tile.gd b/client/map/tiles/tile.gd
index b4928aa1..7473ff78 100644
--- a/client/map/tiles/tile.gd
+++ b/client/map/tiles/tile.gd
@@ -32,7 +32,7 @@ func _init(ctx: TileFactory.TileCC):
base.name = "Base"
base.position += Vector3(0.5, 0, 0.5)
add_child(base)
- self.name = str(ctx.position)
+ self.name = ctx.tile_name.raw_name
var item_base_ = Node3D.new()
# this method is supposed to be overriden
@warning_ignore("static_called_on_instance")