67 lines
2.8 KiB
C#
67 lines
2.8 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|