tli/scripts/ui/unit_info.gd

101 lines
2.2 KiB
GDScript

extends FollowingUI
class_name UnitInfo
enum State {
NONE,
ANT_IDLE,
ANT_MOVING,
ANT_PICKING_UP,
ANT_DEPOSITING,
ANT_WAITING_FOR_NEW_ITEMS,
ANT_WAITING_FOR_MORE_SPACE,
APHID_IDLE,
APHID_PANIC,
APHID_EAT,
}
const ANIMATION_SPEED: float = 0.25
var unit: Unit
var _state: State = State.NONE
var _anim_time: float = 0
@onready var texture_rect: TextureRect = $TextureRect
@onready var atlas: AtlasTexture = texture_rect.texture as AtlasTexture
func _ready() -> void:
assert(texture_rect != null, "texture_rect missing!")
assert(atlas != null, "atlas missing!")
super._ready()
func _process(delta: float) -> void:
super._process(delta)
if unit == null or not visible:
return
_anim_time += delta
_get_state()
_handle_pictogram()
func open(who: Unit) -> void:
visible = true
unit = who
set_target(unit.ui_origin)
_open_animation(self)
func close() -> void:
super.close()
unit = null
func _handle_pictogram() -> void:
texture_rect.visible = _state != State.NONE
atlas.region.position.y = (_state - 1) * atlas.region.size.y
atlas.region.position.x = floorf(
wrapf(_anim_time / ANIMATION_SPEED, 0, 4)
) * atlas.region.size.x
func _get_state() -> void:
if unit is Aphid:
match (unit as Aphid).state:
Aphid.State.WANDERING:
_state = State.APHID_IDLE
if unit is AntNitwit:
match (unit as AntNitwit).state:
AntNitwit.State.WANDERING:
_state = State.ANT_IDLE
AntNitwit.State.MOVING:
_state = State.ANT_MOVING
AntNitwit.State.GATHERING:
_get_gathering_state((unit as AntNitwit).gathering.state)
if unit is AntGatherer:
match (unit as AntGatherer).state:
AntGatherer.State.WANDERING:
_state = State.ANT_IDLE
AntGatherer.State.MOVING:
_state = State.ANT_MOVING
AntGatherer.State.GATHERING:
_get_gathering_state((unit as AntGatherer).gathering.state)
func _get_gathering_state(gather_state: Gathering.State) -> void:
match gather_state:
Gathering.State.PICKING_UP:
_state = State.ANT_PICKING_UP
Gathering.State.DEPOSITING:
_state = State.ANT_DEPOSITING
Gathering.State.WAITING_FOR_NEW_ITEMS:
_state = State.ANT_WAITING_FOR_NEW_ITEMS
Gathering.State.WAITING_FOR_MORE_SPACE:
_state = State.ANT_WAITING_FOR_MORE_SPACE
Gathering.State.STOP:
_state = State.NONE