aboutsummaryrefslogtreecommitdiff
path: root/client/map/map.gd
diff options
context:
space:
mode:
Diffstat (limited to 'client/map/map.gd')
-rw-r--r--client/map/map.gd70
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