2022-10-06 13:41:45 +00:00
|
|
|
@tool
|
|
|
|
class_name Unit
|
|
|
|
extends Composer
|
|
|
|
|
2022-10-05 23:21:40 +00:00
|
|
|
@export var can_move = false
|
|
|
|
|
2022-10-06 13:41:45 +00:00
|
|
|
@export var sprite: Texture2D:
|
|
|
|
set(val):
|
|
|
|
sprite = val
|
|
|
|
_check_compose()
|
|
|
|
|
2022-10-05 23:21:40 +00:00
|
|
|
@export var player: Node:
|
|
|
|
set(val):
|
|
|
|
if val is Player:
|
|
|
|
player = val
|
|
|
|
else:
|
|
|
|
player = null
|
|
|
|
|
|
|
|
var target_reached = true
|
|
|
|
var target_position: Vector2
|
|
|
|
|
2022-10-06 13:41:45 +00:00
|
|
|
func _compose():
|
|
|
|
$sprite.texture = sprite
|
2022-10-05 23:21:40 +00:00
|
|
|
if player:
|
|
|
|
# TODO something more subtle
|
|
|
|
modulate = player.color
|
|
|
|
if player.code and not Engine.is_editor_hint():
|
|
|
|
add_to_group("player:" + player.code)
|
|
|
|
|
|
|
|
func _physics_process(delta):
|
|
|
|
if not target_reached:
|
|
|
|
# TODO use position instead of position, once parented to battlefield
|
|
|
|
global_position += (target_position - global_position).normalized() * 100.0 * delta
|
|
|
|
if global_position == target_position:
|
|
|
|
target_reached = true
|
|
|
|
|
|
|
|
make_decision() # TODO not every tick
|
|
|
|
|
|
|
|
func set_target(pos: Vector2):
|
|
|
|
if pos != target_position:
|
|
|
|
target_position = pos
|
|
|
|
target_reached = false
|
|
|
|
|
|
|
|
func make_decision():
|
|
|
|
if can_move:
|
|
|
|
var enemy: Unit = null
|
|
|
|
var closest := INF
|
|
|
|
for unit in get_tree().get_nodes_in_group("unit"):
|
|
|
|
if unit is Unit and unit.player != player:
|
|
|
|
var distance := global_position.distance_to(unit.global_position)
|
|
|
|
if distance < closest:
|
|
|
|
closest = distance
|
|
|
|
enemy = unit
|
|
|
|
if enemy:
|
|
|
|
set_target(enemy.global_position)
|