using Cielonos.MainGame.Characters; using UnityEngine; namespace Cielonos.MainGame.Inventory.Collections { public class Salvo : ConsumableBase { public override void OnObtained() { base.OnObtained(); if (RunManager.Instance != null) RunManager.Instance.OnPhaseChanged += CheckAndTrigger; } public override void OnDiscarded() { base.OnDiscarded(); if (RunManager.Instance != null) RunManager.Instance.OnPhaseChanged -= CheckAndTrigger; } private void CheckAndTrigger(RunPhase newPhase) { if (newPhase == RunPhase.InCombat) { RunState run = RunManager.Instance.currentRun; if (run == null) return; RunMapNode currentNode = run.mapData.nodes[run.currentPosition]; if (currentNode == null) return; // 判断是否是普通战斗(排除精英战和 Boss 战) if (currentNode.nodeType == MapNodeType.NoRewardNormalBattle || currentNode.nodeType == MapNodeType.MinorRewardNormalBattle || currentNode.nodeType == MapNodeType.MajorRewardNormalBattle) { if (Use(1)) { Debug.Log("[Salvo] 生效!削减全场敌人 50% 生命值!"); foreach (var enemy in CombatManager.EnemySm.activeEnemiesList) { if (enemy == null || enemy.attributeSm == null) continue; float maxHealth = enemy.attributeSm[CharacterAttribute.MaximumHealth]; float pureDamage = maxHealth * 0.9f; // 保底保留 1 点生命值,确保不直接越权跳过死亡逻辑 if (enemy.attributeSm[CharacterAttribute.Health] - pureDamage <= 0) { pureDamage = Mathf.Max(0, enemy.attributeSm[CharacterAttribute.Health] - 1f); } Attack.Context context = new Attack.Context(player, enemy, nameof(Salvo)); Attack.Value value = new Attack.Value(false, pureDamage, 0, type: Attack.Type.Explosion); Attack.Result result = new Attack.Result(context, value); enemy.TakeDepletion(result); enemy.TakeDamage(result, out var dmgNumber); dmgNumber.SetPosition(enemy.CenterPosition); } } } } } } }