using System.Collections.Generic; using Continentis.MainGame; using Continentis.MainGame.Card; using Continentis.MainGame.Character; using Continentis.MainGame.Commands; using Continentis.Mods.Basic.Buffs; using SLSUtilities.General; namespace Continentis.Mods.Basic.Cards { /// /// 至圣斩(DivineSmite): /// 造成物理伤害和多段光属性魔法伤害,光伤害段数等于连续打出该牌的次数,最后施加致盲Buff。 /// public class DivineSmite : CardLogicBase { // 游戏字典里定义的伤害及Buff参数键值点 private const string DAMAGE_PHYSICS = "Damage_Physics"; private const string DAMAGE_LIGHT = "Damage_Light"; private const string BUFF_BLIND_COUNT = "Buff_Blind_Count"; /// /// 物理伤害的上下文属性通道 /// private AttackContext PhysicsCtx => AttackContext.Default(card) .WithDamageKeywords("Physics") .WithBaseDamageAttribute(DAMAGE_PHYSICS); /// /// 光属性魔法伤害的上下文属性通道 /// private AttackContext LightCtx => AttackContext.Default(card) .WithDamageKeywords("Light") .WithBaseDamageAttribute(DAMAGE_LIGHT); public override void SetUpLogicComponents() { AddLogicComponent(); } /// /// 选中目标时,预览最终会造成的伤害数值和攻击段数 /// public override void TargetingEffect(CharacterBase target) { card.SetAttribute("Display_Damage_Physics", GetTargetedFinalDamage(target, PhysicsCtx)); card.SetAttribute("Display_Damage_Light", GetTargetedFinalDamage(target, LightCtx)); // 为界面显示专门设定一个动态的“光属性连击次数”属性 int lightTimes = GetConsecutiveDivineSmiteCount(); card.SetAttribute("Hit_Count_Light", lightTimes); } /// /// 没有目标、或者取消选中时的默认面板预期伤害 /// public override void UntargetingEffect() { card.SetAttribute("Display_Damage_Physics", GetNoTargetFinalDamage(PhysicsCtx)); card.SetAttribute("Display_Damage_Light", GetNoTargetFinalDamage(LightCtx)); int lightTimes = GetConsecutiveDivineSmiteCount(); card.SetAttribute("Hit_Count_Light", lightTimes); } public override CommandGroup PlayEffect(List targetList) { // 通过过往卡牌出牌记录找到需要触发多少次光属性攻击 int lightTimes = GetConsecutiveDivineSmiteCount(); return ForEachTarget(targetList, target => Cmd.Sequential( new Cmd_PlayAnimation(user.characterView, "Attack"), Cmd.Do(() => { // 1. 触发一段基础物理伤害 AttackContext physCtx = PhysicsCtx; AttackTarget(target, GetTargetedFinalDamage(target, physCtx), physCtx); // 2. 根据连续使用的次数,循环触发光属性魔法追击 AttackContext lightCtx = LightCtx; for (int i = 0; i < lightTimes; i++) { AttackTarget(target, GetTargetedFinalDamage(target, lightCtx), lightCtx); } // 3. 结算后对目标挂载致盲 (Blind) 状态 int blindStacks = GetAttribute(BUFF_BLIND_COUNT); CreateCharacterBuff(blindStacks).Apply(target, user, this); }) )); } public override void ApplyAttributeChangesByCard() { // 在卡牌数据更新层对物理伤害与默认(光属性)伤害渠道做双重初始化 LogicComponent().SetDamage_Physics(DAMAGE_PHYSICS); LogicComponent().SetDamage_Default(DAMAGE_LIGHT); } /// /// 从历史行动记录中寻找过往连续出过的本牌数量,用于充能和统计光爆次数。 /// private int GetConsecutiveDivineSmiteCount() { if (user.recordSubmodule == null || user.recordSubmodule.actionRecords == null) return 1; int count = 1; // 包含当前准备打出的这一张本身 int cardsSeen = 0; for (int i = user.recordSubmodule.actionRecords.Count - 1; i >= 0; i--) { var record = user.recordSubmodule.actionRecords[i]; for (int j = record.cardsPlayed.Count - 1; j >= 0; j--) { if (cardsSeen > 0) { if (record.cardsPlayed[j].cardLogic is DivineSmite) { count++; } else { return count; } } cardsSeen++; } } return count; } } }