diff --git a/scripts/autoloads/player_stats.gd b/scripts/autoloads/player_stats.gd index abf4275..80614fc 100644 --- a/scripts/autoloads/player_stats.gd +++ b/scripts/autoloads/player_stats.gd @@ -26,9 +26,15 @@ var resistance: float = 0.0 # 0.0~1.0 var mana: float = 100.0 var mana_max: float = 100.0 var mana_regen: float = 5.0 # 每秒回复 +var mana_heat: float = 0.0 # 递增蓝耗热值(0=无,1=蓝耗翻倍) +var mana_leech: float = 0.0 # 击杀回蓝量(换杖/换牌重算) func _ready() -> void: EventBus.subscribe(EventID.PLAYER_DAMAGED, _on_player_damaged) + EventBus.subscribe(EventID.ENEMY_KILLED, _on_enemy_killed) + +func _on_enemy_killed(_payload: Dictionary) -> void: + gain_mana(mana_leech) ## 升级曲线:roundf(10 × 1.4^(level-1)),P6-N16 ## Level 1→2: 10 XP; Level 5→6: ≈ 54 XP @@ -91,6 +97,22 @@ func regen_mana(delta: float) -> void: return mana = min(mana_max, mana + mana_regen * delta) +## 击杀回蓝(魔力虹吸) +func gain_mana(n: float) -> void: + if n <= 0.0: + return + mana = min(mana_max, mana + n) + stats_changed.emit() + +## 主动 HP 代价(infinite_spells / heavy_cost)——直接扣血,不走难度减伤 +func spend_hp_cost(amount: float) -> void: + if amount <= 0.0: + return + hp = max(0.0, hp - amount) + stats_changed.emit() + if hp <= 0.0: + EventBus.emit(EventID.PLAYER_DIED, {}) + func _on_player_damaged(payload: Dictionary) -> void: take_damage(float(payload.get("damage", 0.0))) diff --git a/scripts/domain/spell_system/spell_context.gd b/scripts/domain/spell_system/spell_context.gd index 6bfe0f2..af78787 100644 --- a/scripts/domain/spell_system/spell_context.gd +++ b/scripts/domain/spell_system/spell_context.gd @@ -9,6 +9,7 @@ var stats: CastStats = null # 本次施法的修改层 ## 跨帧持久寄存器(长度固定 4,P6-N48) ## R1-R4:供 LOGIC_EVERY_N_SHOTS 等指令跨帧计数 var registers: PackedFloat32Array = PackedFloat32Array() +var hp_cost_accum: float = 0.0 # 本次施法累积 HP 代价(heavy_cost + infinite),施法末结算 func _init() -> void: stats = CastStats.new() @@ -21,6 +22,7 @@ func reset() -> void: stats.reset() else: stats = CastStats.new() + hp_cost_accum = 0.0 # registers 小心:仅当 Core 没有 PERSISTENT_MEMORY Feature 时才清零 # 具体清空逻辑在 SpellContextPool.acquire_for_wand() 中处理