37 lines
1.2 KiB
GDScript
37 lines
1.2 KiB
GDScript
extends Node
|
|
|
|
class_name LayeredEntityContainer
|
|
|
|
var entities := {
|
|
"under" : [],
|
|
"base" : [],
|
|
"above" : []
|
|
}
|
|
|
|
func _ready() -> void:
|
|
LevelEventBus.layer_entity_created.connect(on_entity_spawned)
|
|
LevelEventBus.layer_entity_killed.connect(on_entity_killed)
|
|
|
|
for layer in entities.keys():
|
|
entities[layer].resize(FieldParams.COLUMNS * FieldParams.ROWS)
|
|
|
|
## Checks if tile is occupied. [br]
|
|
## If position or layer are invalid, returns true
|
|
func is_occupied(position : int, layer : StringName) -> bool:
|
|
if position >= FieldParams.COLUMNS * FieldParams.ROWS or entities.has(layer) == false: return true
|
|
return not entities[layer][position] == null
|
|
|
|
func on_entity_spawned(entity : Entity) -> void:
|
|
if entities.has(entity.layer) == false: return
|
|
|
|
var index = FieldParams.indexify(entity.get_parent().global_position)
|
|
if index >= FieldParams.COLUMNS * FieldParams.ROWS or is_occupied(index,entity.layer): return
|
|
|
|
entities[entity.layer][index] = entity
|
|
|
|
func on_entity_killed(context : Entity.KilledContext) -> void:
|
|
var entity = context.target
|
|
var index = FieldParams.indexify(entity.get_parent().global_position)
|
|
if is_occupied(index,entity.layer) == false: return
|
|
|
|
entities[entity.layer][index] = null
|