Files
gplan-2/game/presentation/views/standee_vitals.gd
T

100 lines
2.7 KiB
GDScript

## VERTICAL SLICE - NOT FOR PRODUCTION
## 站桩身份与命值态件(StandeeBody 拆件——单一变化原因=战斗结算快照投影的字段形态):
## 站桩是谁、活没活、血量几何的唯一账面——身份五元组(种类/名/id/护甲/顺位)+存活位+血量账与两条血量系 tween 槽。
## 无 class_name(类名缓存面纪律)——经宿主 standee_body preload 引用(st 实例名沿用);
## hp_value 属性 setter 经 _owner 回引触发宿主重绘语义逐字。
extends RefCounted
var _owner: Node2D = null
var _kind := "enemy"
var _display_name := ""
var _enemy_id := ""
var _armor := "light"
var _order := 1
var _dead := false
var _hp_max := 1.0
var _hp_cur := 0 # 血量数字显示面(HUD框架 验收「血量数字可读」)
var hp_value := 1.0: # 血条值 0..1(直角递减——tween_property 目标,逐行刷新重启不累积)
set(v):
hp_value = clampf(v, 0.0, 1.0)
_owner.queue_redraw()
var _hp_tween: Tween
var _hp_flash_tw: Tween
func _init(owner: Node2D) -> void:
_owner = owner
# ---- 公开交付与读投影面(pres封装 A2——宿主经此读写,字段保持私有)----
# 身份四元组一次交付(生成期/配置期同口——宿主 _init 与 set_data 共用)
func configure_identity(kind: String, display_name: String, enemy_id: String, armor: String) -> void:
_kind = kind
_display_name = display_name
_enemy_id = enemy_id
_armor = armor
func set_max_hp(v: float) -> void:
_hp_max = v
func set_order(i: int) -> void:
_order = i
func set_dead(v: bool) -> void:
_dead = v
func is_dead() -> bool:
return _dead
func kind() -> String:
return _kind
func armor() -> String:
return _armor
func display_name() -> String:
return _display_name
func enemy_id() -> String:
return _enemy_id
func order() -> int:
return _order
func hp_cur() -> int:
return _hp_cur
func hp_max() -> float:
return _hp_max
# 受击闪白归位(宿主 flash_hit 转调——tween 句柄留本件自持,目标=宿主 modulate)
func play_hp_flash() -> void:
if _hp_flash_tw != null and _hp_flash_tw.is_valid():
_hp_flash_tw.kill()
_hp_flash_tw = _owner.create_tween()
_hp_flash_tw.tween_property(_owner, "modulate", Color(1.6, 1.4, 1.2), UiKit.motion(0.08))
_hp_flash_tw.tween_property(_owner, "modulate", Color(1, 1, 1) if not _dead else Color(0.62, 0.62, 0.62, 0.9), UiKit.motion(0.2))
# 血条短 tween 递减(直角递减占位);逐行刷新时重启 tween 不累积
func apply_hp(hp: int) -> void:
_hp_cur = clampi(hp, 0, int(_hp_max))
var target := float(_hp_cur) / _hp_max
if _hp_tween != null and _hp_tween.is_valid():
_hp_tween.kill()
_hp_tween = _owner.create_tween()
_hp_tween.tween_property(self, "hp_value", target, UiKit.motion(0.15))