Files
Cielonos/Assets/Scripts/MainGame/Items/Consumables/Salvo.cs
SoulliesOfficial 9a9e48f8a5
2026-06-27 12:52:03 -04:00

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);
}
}
}
}
}
}
}