using System.Collections.Generic;
using Continentis.MainGame;
using Continentis.MainGame.Character;
using SLSUtilities.General;
using UnityEngine;
namespace Continentis.Mods.Basic.Buffs
{
///
/// 挑衅:标记该角色正在挑衅某个敌方目标。
/// 关系追踪器,不直接影响目标选择——过滤逻辑通过被挑衅者身上的 Provoked 状态实现。
/// 持续行动次数由 roundFirstActionCountSubmodule 决定。
///
public class Provoking : CharacterCombatBuffBase
{
public CharacterBase target;
public Provoked provokedBuff;
public Provoking(CharacterBase target, int actionCount, Provoked provokedBuff)
{
Initialize(BuffType.Neutral, BuffDispelLevel.DeathOnly, 100);
this.target = target;
this.provokedBuff = provokedBuff;
if (this.provokedBuff == null)
{
Debug.LogError("Provoking buff requires a Provoked buff on the target.");
}
this.contentSubmodule = new ContentSubmodule(this)
.AddParameterGetter("Count", () => roundFirstActionCountSubmodule.remainingCount.ToString())
.AddParameterGetter("Target", () => target.data.displayName);
this.iconSubmodule = new IconSubmodule(this).SetTextFunctions("Count");
this.roundFirstActionCountSubmodule = new CountSubmodule(this, actionCount);
}
public override bool OnBuffApply(out CharacterCombatBuffBase existingBuff)
{
MainGameManager.Instance.basePrefabs.GenerateInfoText(
contentSubmodule.displayName, attachedCharacter.characterView);
// 如果已存在对同一目标的挑衅,累加持续时间
if (FindExistingSameBuffs(out List existingProvokings))
{
var sameProvoking = existingProvokings.Find(ep => ep.target == this.target);
if (sameProvoking != null)
{
existingBuff = sameProvoking;
sameProvoking.roundFirstActionCountSubmodule.AddCount(
this.roundFirstActionCountSubmodule.remainingCount);
return false;
}
existingBuff = null;
return true; // 对不同目标的挑衅可以共存
}
existingBuff = null;
return true;
}
public override void OnAfterFirstApply()
{
base.OnAfterFirstApply();
provokedBuff.provokingSources.Add(this);
// 同步到 StatusSubmodule,使核心框架可读取挑衅者列表
if (!provokedBuff.attachedCharacter.statusSubmodule.provokers.Contains(attachedCharacter))
{
provokedBuff.attachedCharacter.statusSubmodule.provokers.Add(attachedCharacter);
}
}
public override void OnBuffRemove()
{
base.OnBuffRemove();
provokedBuff.provokingSources.Remove(this);
// 检查是否还有其他 Provoking 指向同一挑衅者
bool hasOtherFromSameProvoker = provokedBuff.provokingSources.Exists(p => p.attachedCharacter == attachedCharacter);
if (!hasOtherFromSameProvoker)
{
provokedBuff.attachedCharacter.statusSubmodule.provokers.Remove(attachedCharacter);
}
if (provokedBuff.provokingSources.Count == 0)
{
provokedBuff.Remove();
}
}
}
}