97 lines
2.9 KiB
GDScript
97 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 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)
|