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 { /// /// 命令术:根据使用者与目标的等级差产生不同效果: /// 对敌人:等级差达到 High 门槛时随机移除一个意图;达到 Low 门槛时随机改变一个意图。 /// 对玩家英雄:等级差达到 High 门槛时将"扼制"卡牌放入目标抽牌堆;达到 Low 门槛时将"干扰"卡牌放入目标抽牌堆。 /// 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(_ => InvalidateHint())); SubscribeCombatEvent(events.onCharacterJoin, new PrioritizedAction(_ => InvalidateHint())); } /// 抽到此牌时刷新 hintShadow。 protected override void OnDraw() => InvalidateHint(); public override CommandGroup PlayEffect(List targetList) { return ForEachTarget(targetList, target => Cmd.Parallel( new Cmd_PlayAnimation(user.characterView, "Action"), Cmd.Do(() => { if (target is PlayerHero) PlayEffectOnPlayer(target); else PlayEffectOnEnemy(target); }) )); } /// /// 检查场上是否存在等级差达到 Low 门槛的可用目标。 /// 有可用目标时返回绿色,无可用目标时返回红色。 /// public override Color? GetHintColor() { if (user == null || card.handCardView == null) return null; card.DetectTargetsValidity(out List 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; } /// 计算使用者与目标的等级差。 private int GetLevelGap(CharacterBase target) { return user.GetAttribute(CharacterAttributes.Level) - target.GetAttribute(CharacterAttributes.Level); } /// 对敌方目标:等级差达到 High 时移除意图,达到 Low 时改变意图。 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(); } /// 对玩家英雄:等级差达到 High 时塞入扼制,达到 Low 时塞入干扰。 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); } } }