TowerDefense/world.gd

97 lines
2.5 KiB
GDScript

extends Node3D
@onready var tower_blueprint = preload("res://Towers/tower.tscn")
@onready var cam : Camera3D = $Camera3D
@onready var selector : Node3D = $Selector
var team_in_action : Array[Tower]
var team_in_rest : Array[Tower]
var target_tower : Tower
var in_build_menu : bool = false
func _ready() -> void:
$Spawner.spawn_next_wave()
$CanvasLayer/UI/ShopPanel.visible = in_build_menu
EventBus.tower_selected.connect(_on_EventBus_tower_selected)
func _process(delta: float) -> void:
handle_player_controls()
if Input.is_action_just_pressed("build"):
build_tower(tower_blueprint)
if Input.is_action_just_pressed("rest") && target_tower:
send_to_rest(target_tower)
func handle_player_controls() -> void:
var space_state : PhysicsDirectSpaceState3D = get_world_3d().direct_space_state
var mouse_pos : Vector2 = get_viewport().get_mouse_position()
var origin : Vector3 = cam.project_ray_origin(mouse_pos)
var end : Vector3 = origin + cam.project_ray_normal(mouse_pos) * 100
var ray : PhysicsRayQueryParameters3D = PhysicsRayQueryParameters3D.create(origin, end)
ray.collide_with_bodies = true
var ray_result : Dictionary = space_state.intersect_ray(ray)
if ray_result.is_empty():
selector.visible = false
return
selector.visible = true
var collider : CollisionObject3D = ray_result.get("collider")
selector.global_position = collider.global_position
selector.global_position += Vector3(0.0,0.2,0.0)
if collider is Tower:
target_tower = collider
else:
target_tower = null
func build_tower(scene : PackedScene) -> void:
if !selector.visible:
return
var temp_tower : Tower = scene.instantiate()
for tower : Tower in team_in_action:
if tower.tower_name == temp_tower.tower_name:
move_tower(tower)
return
for tower : Tower in team_in_rest:
if tower.tower_name == temp_tower.tower_name:
move_tower(tower)
send_to_action(tower)
return
add_child(temp_tower)
team_in_action.append(temp_tower)
temp_tower.global_position = selector.global_position
func move_tower(tower : Tower):
tower.global_position = selector.global_position
func send_to_rest(tower : Tower):
team_in_action.erase(tower)
team_in_rest.append(tower)
tower.visible = false
func send_to_action(tower : Tower):
team_in_rest.erase(tower)
team_in_action.append(tower)
tower.visible = true
func _on_EventBus_tower_selected(tower : PackedScene):
tower_blueprint = tower
func _on_recrutement_button_pressed() -> void:
in_build_menu = !in_build_menu
$CanvasLayer/UI/ShopPanel.visible = in_build_menu