53 lines
1.3 KiB
GDScript
53 lines
1.3 KiB
GDScript
extends Node
|
|
|
|
class_name World
|
|
|
|
var chunks : Dictionary[Vector2i, Chunk]
|
|
|
|
var tps = 1
|
|
var update_timer = 0
|
|
|
|
signal updated(chunk : Chunk)
|
|
|
|
func get_chunk_at(position : Vector2i) -> Chunk:
|
|
if chunks.has(position): return chunks[position]
|
|
|
|
var new_chunk : Chunk = Chunk.new(position)
|
|
|
|
chunks[position] = new_chunk
|
|
|
|
return new_chunk
|
|
|
|
func tile_pos_to_chunk_pos(position : Vector2i) -> Vector2i:
|
|
return floor(Vector2(position) / TileGlobals.chunk_size)
|
|
|
|
func _ready() -> void:
|
|
pass
|
|
|
|
func set_tile(position : Vector2i, tile_id : int):
|
|
var chunk_position : Vector2i = tile_pos_to_chunk_pos(position)
|
|
var position_in_chunk = position - chunk_position * TileGlobals.chunk_size
|
|
var chunk : Chunk = get_chunk_at(chunk_position)
|
|
|
|
chunk.set_tile(position_in_chunk, tile_id)
|
|
updated.emit(chunk)
|
|
|
|
func add_item(position : Vector2i, item : Item):
|
|
var chunk_position : Vector2i = tile_pos_to_chunk_pos(position)
|
|
var position_in_chunk = position - chunk_position * TileGlobals.chunk_size
|
|
var chunk : Chunk = get_chunk_at(chunk_position)
|
|
|
|
func global_position_to_tile(position : Vector2) -> Vector2i:
|
|
return Vector2i(floor(position/TileGlobals.tile_size))
|
|
|
|
func update_chunks():
|
|
for chunk in chunks.values():
|
|
if chunk.update():
|
|
updated.emit(chunk)
|
|
|
|
func _process(delta):
|
|
update_timer -= delta
|
|
if update_timer <= 0:
|
|
update_timer = 1/tps
|
|
update_chunks()
|