diff options
Diffstat (limited to 'client/map/map.gd')
| -rw-r--r-- | client/map/map.gd | 70 |
1 files changed, 42 insertions, 28 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 |