Files
Continentis/Assets/Mods/Basic/Cards/Scripts/General/Skill/Command.cs
SoulliesOfficial ac98ec3aef 更新
2026-04-17 12:01:50 -04:00

104 lines
4.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections.Generic;
using System.Linq;
using Continentis.MainGame;
using Continentis.MainGame.Card;
using Continentis.MainGame.Character;
using Continentis.MainGame.Combat;
using Continentis.MainGame.Commands;
using SLSUtilities.General;
using UnityEngine;
namespace Continentis.Mods.Basic.Cards
{
/// <summary>
/// 命令术:根据使用者与目标的等级差产生不同效果:
/// <para>对敌人:等级差达到 High 门槛时随机移除一个意图;达到 Low 门槛时随机改变一个意图。</para>
/// <para>对玩家英雄:等级差达到 High 门槛时将"扼制"卡牌放入目标抽牌堆;达到 Low 门槛时将"干扰"卡牌放入目标抽牌堆。</para>
/// </summary>
public class Command : CardLogicBase
{
private const string LEVEL_GAP_LOW = "LevelGap_Low";
private const string LEVEL_GAP_HIGH = "LevelGap_High";
private static readonly Color HintGreen = new Color(0.2f, 0.85f, 0.3f);
private static readonly Color HintRed = new Color(0.9f, 0.2f, 0.2f);
public override void Initialize(CardInstance cardInstance)
{
base.Initialize(cardInstance);
// 战场角色变化时刷新 hintShadow托管机制自动取消订阅
CombatEventCollection events = CombatMainManager.Instance.eventCollection;
SubscribeCombatEvent(events.onCharacterDeath, new PrioritizedAction<CharacterBase>(_ => InvalidateHint()));
SubscribeCombatEvent(events.onCharacterJoin, new PrioritizedAction<CharacterBase>(_ => InvalidateHint()));
}
/// <summary>抽到此牌时刷新 hintShadow。</summary>
protected override void OnDraw() => InvalidateHint();
public override CommandGroup PlayEffect(List<CharacterBase> targetList)
{
return ForEachTarget(targetList, target => Cmd.Parallel(
new Cmd_PlayAnimation(user.characterView, "Action"),
Cmd.Do(() =>
{
if (target is PlayerHero)
PlayEffectOnPlayer(target);
else
PlayEffectOnEnemy(target);
})
));
}
/// <summary>
/// 检查场上是否存在等级差达到 Low 门槛的可用目标。
/// 有可用目标时返回绿色,无可用目标时返回红色。
/// </summary>
public override Color? GetHintColor()
{
if (user == null || card.handCardView == null) return null;
card.DetectTargetsValidity(out List<CharacterBase> valid, out _, out _);
if (valid.Count == 0) return HintRed;
int userLevel = user.GetAttribute(CharacterAttributes.Level);
int gapLow = GetAttribute(LEVEL_GAP_LOW);
bool hasEffectiveTarget = valid.Any(t =>
userLevel - t.GetAttribute(CharacterAttributes.Level) >= gapLow);
return hasEffectiveTarget ? HintGreen : HintRed;
}
/// <summary>计算使用者与目标的等级差。</summary>
private int GetLevelGap(CharacterBase target)
{
return user.GetAttribute(CharacterAttributes.Level) - target.GetAttribute(CharacterAttributes.Level);
}
/// <summary>对敌方目标:等级差达到 High 时移除意图,达到 Low 时改变意图。</summary>
private void PlayEffectOnEnemy(CharacterBase target)
{
int levelGap = GetLevelGap(target);
int gapHigh = GetAttribute(LEVEL_GAP_HIGH);
int gapLow = GetAttribute(LEVEL_GAP_LOW);
if (levelGap >= gapHigh)
target.intentionSubmodule.RemoveRandomIntendedCard();
else if (levelGap >= gapLow)
target.intentionSubmodule.ChangeRandomIntendedCard();
}
/// <summary>对玩家英雄:等级差达到 High 时塞入扼制,达到 Low 时塞入干扰。</summary>
private void PlayEffectOnPlayer(CharacterBase target)
{
int levelGap = GetLevelGap(target);
int gapHigh = GetAttribute(LEVEL_GAP_HIGH);
int gapLow = GetAttribute(LEVEL_GAP_LOW);
if (levelGap >= gapHigh)
CardInstance.GenerateCardInstance(GetDerivativeCardData(0), target, Piles.Draw);
else if (levelGap >= gapLow)
CardInstance.GenerateCardInstance(GetDerivativeCardData(1), target, Piles.Draw);
}
}
}