2022-10-06 13:41:45 +00:00
|
|
|
@tool
|
|
|
|
class_name Unit
|
|
|
|
extends Composer
|
|
|
|
|
|
|
|
@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
|
2022-10-06 22:34:33 +00:00
|
|
|
|
|
|
|
@export var hitpoints := 1
|
2022-10-05 23:21:40 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
|
2022-10-06 22:34:33 +00:00
|
|
|
func move_to(pos: Vector2):
|
2022-10-05 23:21:40 +00:00
|
|
|
if pos != target_position:
|
|
|
|
target_position = pos
|
|
|
|
target_reached = false
|
|
|
|
|
2022-10-06 22:34:33 +00:00
|
|
|
func damage(lost_hitpoints: float):
|
|
|
|
hitpoints = max(0.0, hitpoints - lost_hitpoints)
|
|
|
|
if hitpoints <= 0:
|
|
|
|
die()
|
|
|
|
|
|
|
|
func die():
|
|
|
|
queue_free()
|
|
|
|
|
2022-10-05 23:21:40 +00:00
|
|
|
func make_decision():
|
2022-10-06 22:34:33 +00:00
|
|
|
pass
|