94 lines
2.7 KiB
GDScript
94 lines
2.7 KiB
GDScript
## Represents a unit on the game board.
|
|
## The board manages its position inside the game grid.
|
|
## The unit itself holds stats and a visual representation that moves smoothly in the game world.
|
|
@tool
|
|
class_name Unit_Move
|
|
extends Path2D
|
|
|
|
## Emitted when the unit reached the end of a path along which it was walking.
|
|
signal walk_finished
|
|
|
|
## Shared resource of type Grid, used to calculate map coordinates.
|
|
@export var grid: Resource
|
|
## Distance to which the unit can walk in cells.
|
|
@export var move_range := 6
|
|
## The unit's move speed when it's moving along a path.
|
|
@export var move_speed := 600.0
|
|
## Texture representing the unit.
|
|
@export var skin: Texture:
|
|
set(value):
|
|
skin = value
|
|
if not _sprite:
|
|
# This will resume execution after this node's _ready()
|
|
await ready
|
|
_sprite.texture = value
|
|
## Offset to apply to the `skin` sprite in pixels.
|
|
@export var skin_offset := Vector2.ZERO:
|
|
set(value):
|
|
skin_offset = value
|
|
if not _sprite:
|
|
await ready
|
|
_sprite.position = value
|
|
|
|
## Coordinates of the current cell the cursor moved to.
|
|
var cell := Vector2.ZERO:
|
|
set(value):
|
|
# When changing the cell's value, we don't want to allow coordinates outside
|
|
# the grid, so we clamp them
|
|
cell = grid.clamp(value)
|
|
## Toggles the "selected" animation on the unit.
|
|
var is_selected := false:
|
|
set(value):
|
|
is_selected = value
|
|
if is_selected:
|
|
_sprite.play("selected")
|
|
else:
|
|
_sprite.play("idle")
|
|
|
|
var _is_walking := false:
|
|
set(value):
|
|
_is_walking = value
|
|
set_process(_is_walking)
|
|
|
|
@onready var _sprite: AnimatedSprite2D = $PathFollow2D/AnimatedSprite2D
|
|
#@onready var _anim_player: AnimationPlayer = $AnimationPlayer
|
|
@onready var _path_follow: PathFollow2D = $PathFollow2D
|
|
|
|
|
|
func _ready() -> void:
|
|
set_process(false)
|
|
_path_follow.rotates = false
|
|
|
|
cell = grid.calculateGridCoordinates(position)
|
|
position = grid.calculateMapPosition(cell)
|
|
|
|
# We create the curve resource here because creating it in the editor prevents us from
|
|
# moving the unit.
|
|
if not Engine.is_editor_hint():
|
|
curve = Curve2D.new()
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
_path_follow.progress += move_speed * delta
|
|
|
|
if _path_follow.progress_ratio >= 1.0:
|
|
_is_walking = false
|
|
# Setting this value to 0.0 causes a Zero Length Interval error
|
|
_path_follow.progress = 0.00001
|
|
position = grid.calculateMapPosition(cell)
|
|
curve.clear_points()
|
|
emit_signal("walk_finished")
|
|
|
|
|
|
## Starts walking along the `path`.
|
|
## `path` is an array of grid coordinates that the function converts to map coordinates.
|
|
func walk_along(path: PackedVector2Array) -> void:
|
|
if path.is_empty():
|
|
return
|
|
|
|
curve.add_point(Vector2.ZERO)
|
|
for point in path:
|
|
curve.add_point(grid.calculateMapPosition(point) - position)
|
|
cell = path[-1]
|
|
_is_walking = true
|