Files
Decked-Out-Defense/Scripts/level.gd

98 lines
2.9 KiB
GDScript

class_name Level
extends Node3D
@export var enemy_pool: Array[Enemy]
@export var tower_path: Node
@export var player_spawns: Array[Node3D]
@export var enemy_spawns: Array[EnemySpawner]
@export var enemy_goals: Array[Node3D]
@export var corpses: Node
@export var cinematic_cam: CinematicCamManager
@export var printer: CardPrinter
@export var shop: ShopStand
@export var obstacles: Array[PackedScene]
var walls: Dictionary[FlowNodeData, TowerBase] = {}
var wall_id: int = 0
var tower_base_scene: PackedScene = load("res://Scenes/TowerBase/tower_base.tscn")
var tower_frame_scene: PackedScene = load("res://Scenes/tower_frame.tscn")
var tower_frames: Dictionary[FlowNodeData, Node3D] = {}
var game_manager: GameManager
var flow_field: FlowField
func load_flow_field() -> void:
for spawn: EnemySpawner in enemy_spawns:
flow_field.path_updated.connect(spawn.update_path)
for node: FlowNodeData in flow_field.data.nodes:
if node.buildable:
var frame: Node3D = tower_frame_scene.instantiate()
tower_frames[node] = frame
add_child(frame)
frame.position = node.position
func disable_all_tower_frames() -> void:
for node: FlowNodeData in tower_frames:
tower_frames[node].visible = false
func enable_non_path_tower_frames() -> void:
for node: FlowNodeData in tower_frames:
tower_frames[node].visible = true
disable_path_tower_frames()
func disable_path_tower_frames() -> void:
for node: FlowNodeData in tower_frames:
if node.traversable and !flow_field.traversable_after_blocking_point(node):
tower_frames[node].visible = false
func set_wall(point: FlowNodeData, caller_id: int) -> void:
point.traversable = false
flow_field.calculate()
flow_field.path_updated.emit()
if is_multiplayer_authority():
spawn_wall(point, wall_id, caller_id)
wall_id += 1
func remove_wall(point: FlowNodeData) -> void:
var wall: TowerBase = walls[point]
#game_manager.connected_players_nodes[wall.owner_id].currency += Data.wall_cost
game_manager.connected_players_nodes[wall.owner_id].unready_self()
walls.erase(point)
wall.queue_free()
point.traversable = true
flow_field.calculate()
flow_field.path_updated.emit()
enable_non_path_tower_frames()
func spawn_wall(point: FlowNodeData, name_id: int, caller_id: int) -> void:
var base: TowerBase = tower_base_scene.instantiate() as TowerBase
base.game_manager = game_manager
base.position = point.position
base.name = "Wall" + str(name_id)
base.owner_id = caller_id
base.point = point
walls[point] = base
tower_path.add_child(base)
disable_path_tower_frames()
func generate_obstacles(ids: Array[int]) -> void:
var points: Array[FlowNodeData] = []
for node: FlowNodeData in flow_field.data.nodes:
if ids.has(node.node_id):
points.append(node)
for node: FlowNodeData in points:
var obstacle: Node3D = obstacles[0].instantiate()
obstacle.position = node.position
flow_field.toggle_buildable(node)
if node.traversable:
flow_field.toggle_traversable(node)
add_child(obstacle)