diff options
| author | tpart <tpart120@proton.me> | 2026-02-28 22:31:33 +0100 |
|---|---|---|
| committer | tpart <tpart120@proton.me> | 2026-02-28 22:31:38 +0100 |
| commit | 94cda50771a7f24f507029751ad3139ca8034801 (patch) | |
| tree | 17c89bd95f3cd1bd3e255d4293ec78e6cc528e9e /client/map | |
| parent | 50ebcafc17f8f0a29f59dfb86cc7a27180c8e9b8 (diff) | |
| download | hurrycurry-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.gd | 70 | ||||
| -rw-r--r-- | client/map/tile_factory.gd | 6 | ||||
| -rw-r--r-- | client/map/tiles/active_interact_counter.gd | 5 | ||||
| -rw-r--r-- | client/map/tiles/book.tscn | 7 | ||||
| -rw-r--r-- | client/map/tiles/exterior_tree.gd | 2 | ||||
| -rw-r--r-- | client/map/tiles/tile.gd | 2 |
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") |