Files
tli/scripts/units/controlled_unit.gd
2024-10-07 07:00:33 +10:00

101 lines
2.3 KiB
GDScript

extends Unit
class_name ControlledUnit
signal moving_started
signal moving_ended
var anthill: Anthill
var hovered_rect: bool = false
var selected: bool = false
var moving_to_target: bool = false
var ground_plane: Plane = Plane(Vector3.UP, 0)
@onready var camera: Camera3D = get_viewport().get_camera_3d()
@onready var selection_sprite: Sprite3D = $SelectionSprite
static func get_cost() -> int:
return 5
func _init() -> void:
max_wander_distance = 2
min_wander_interval = 0.5
max_wander_interval = 10
func _ready() -> void:
assert(camera != null, "camera missing!")
assert(selection_sprite != null, "selection_sprite missing!")
nav_agent.navigation_finished.connect(_on_nav_agent_navigation_finished)
super._ready()
func _process(delta: float) -> void:
super._process(delta)
selection_sprite.visible = selected
hover_sprite.visible = hovered or hovered_rect
func _physics_process(delta: float) -> void:
super._physics_process(delta)
if moving_to_target and nav_agent.is_navigation_finished():
moving_to_target = false
moving_ended.emit()
func _input(event: InputEvent) -> void:
super._input(event)
if not is_on_screen:
return
if event is InputEventMouseButton and selected:
var button_event := event as InputEventMouseButton
if (
button_event.button_index == MOUSE_BUTTON_RIGHT
and button_event.pressed
):
if HoveringManager.hovered_node is Interactable:
_interact(HoveringManager.hovered_node as Interactable)
else:
moving_to_target = true
moving_started.emit()
_set_target_click(button_event.position)
func initialize(from: Anthill, pos: Vector3) -> ControlledUnit:
anthill = from
spawn_pos = pos
return self
func set_hovered_rect(on: bool) -> void:
hovered_rect = on
func set_selected(on: bool) -> void:
selected = on
func _interact(with: Interactable) -> void:
print(self, ' interacting with ', with)
func _set_target_click(mouse_pos: Vector2) -> void:
var click_pos := _click_raycast(mouse_pos)
if click_pos == null:
return
nav_agent.set_target_position(click_pos)
func _click_raycast(mouse_pos: Vector2) -> Vector3:
var from := camera.global_position
var to := camera.project_ray_normal(mouse_pos)
return ground_plane.intersects_ray(from, to)
func _on_nav_agent_navigation_finished() -> void:
wandering_center = nav_agent.get_final_position()