feat(mana): PlayerStats 蓝池状态 + spend/regen/set_pool + reset 置满
This commit is contained in:
@@ -22,6 +22,11 @@ var cpu_limit: int = 5 # 控制 MAX_OPS = cpu_limit * 40
|
||||
var armor: float = 0.0
|
||||
var resistance: float = 0.0 # 0.0~1.0
|
||||
|
||||
# ── 魔力(MVP)─────────────────────────────────────────
|
||||
var mana: float = 100.0
|
||||
var mana_max: float = 100.0
|
||||
var mana_regen: float = 5.0 # 每秒回复
|
||||
|
||||
func _ready() -> void:
|
||||
EventBus.subscribe(EventID.PLAYER_DAMAGED, _on_player_damaged)
|
||||
|
||||
@@ -64,11 +69,34 @@ func heal(amount: float) -> void:
|
||||
func get_hp_percent() -> float:
|
||||
return hp / max(hp_max, 0.001)
|
||||
|
||||
## 换杖时设定蓝池上限/回速,并把当前蓝夹到 [0, max]
|
||||
func set_mana_pool(max_v: float, regen: float) -> void:
|
||||
mana_max = max_v
|
||||
mana_regen = regen
|
||||
mana = clampf(mana, 0.0, mana_max)
|
||||
stats_changed.emit()
|
||||
|
||||
## 花费魔力;够则扣除返回 true,否则不变返回 false
|
||||
func spend_mana(cost: float) -> bool:
|
||||
if mana < cost:
|
||||
return false
|
||||
mana -= cost
|
||||
stats_changed.emit()
|
||||
return true
|
||||
|
||||
## 每帧回蓝(PlayerManager 驱动)。不 emit stats_changed —— HUD 每帧直接读 mana,
|
||||
## 避免回蓝过程每帧发信号触发商店刷新。
|
||||
func regen_mana(delta: float) -> void:
|
||||
if mana >= mana_max:
|
||||
return
|
||||
mana = min(mana_max, mana + mana_regen * delta)
|
||||
|
||||
func _on_player_damaged(payload: Dictionary) -> void:
|
||||
take_damage(float(payload.get("damage", 0.0)))
|
||||
|
||||
func reset_for_run() -> void:
|
||||
hp = hp_max
|
||||
mana = mana_max
|
||||
gold = 0
|
||||
xp = 0
|
||||
level = 1
|
||||
|
||||
Reference in New Issue
Block a user