extends Node3D var grid: Array[Tile.Tile] = [] var grid_width: int var grid_height: int var enemy_inst = preload("res://prefabs/enemy.tscn") var exit_inst = preload("res://prefabs/exit.tscn") var bsp_level_inst = preload("res://prefabs/bsp_level_generator.tscn") var level_done: bool = false # Called when the node enters the scene tree for the first time. func _ready() -> void: spawn_level() func spawn_level() -> void: var bsp_level = bsp_level_inst.instantiate() bsp_level.connect("grid_generated", _grid_generated) $LevelContainer.add_child(bsp_level) func place_objects() -> void: for y in range(grid_height): for x in range(grid_width): var pos = Vector2i(x, y) if grid[pos.y * grid_width + pos.x] == Tile.Tile.PLAYER: $Player.position = Vector3(pos.x, 0, pos.y) + Vector3(0.5, 0, 0.5) elif grid[pos.y * grid_width + pos.x] == Tile.Tile.ENEMY: var enemy = enemy_inst.instantiate() # Target is controlled through enemy wander AI enemy.target = null enemy.position = Vector3(pos.x, 0, pos.y) + Vector3(0.5, 0, 0.5) $LevelContainer.add_child.call_deferred(enemy) elif grid[pos.y * grid_width + pos.x] == Tile.Tile.PORTAL: var exit: Area3D = exit_inst.instantiate() exit.connect("body_entered", _on_player_exit) exit.position = Vector3(pos.x, 0, pos.y) + Vector3(0.5, 0, 0.5) $LevelContainer.add_child.call_deferred(exit) func reset_level() -> void: for child in $LevelContainer.get_children(): print("Child is ", child) $LevelContainer.remove_child(child) child.queue_free() spawn_level() level_done = false func _process(_delta: float) -> void: if level_done: reset_level() func _on_player_exit(_body: Node3D): level_done = true func _grid_generated(p_grid: Array[Tile.Tile], p_grid_width: int, p_grid_height: int) -> void: grid = p_grid grid_width = p_grid_width grid_height = p_grid_height place_objects()