using System.Collections.Generic; using Continentis.MainGame.Card; using UnityEngine.Events; using SoftCircuits.Collections; using SLSFramework.General; namespace Continentis.MainGame.Character { public partial class EventSubmodule : SubmoduleBase { public OrderedDictionary onCombatStart; //战斗开始时 public OrderedDictionary onCombatEnd; //战斗结束时 public OrderedDictionary onRoundStart; //每回合开始时 public OrderedDictionary onRoundEnd; //每回合结束时 public OrderedDictionary> onStartAttack; //开始攻击时,参数为被攻击目标 public OrderedDictionary> onFinishAttack; //完成攻击时,参数为被攻击目标和对应的攻击结果 public OrderedDictionary> onGetAttacked; //被攻击时,参数为攻击者和攻击结果 public OrderedDictionary onActionStart; //每次行动开始时 public OrderedDictionary onActionEnd; //每次行动结束时 public OrderedDictionary>> onBeforePlayCard; //使用卡牌前,参数为使用的卡牌 public OrderedDictionary>> onAfterPlayCard; //使用卡牌后,参数为使用的卡牌 /// 角色死亡时触发,供 Buff / 技能系统订阅响应 public OrderedDictionary onDeath; //角色死亡时 public EventSubmodule(CharacterBase character) : base(character) { onCombatStart = new OrderedDictionary(); onCombatEnd = new OrderedDictionary(); onRoundStart = new OrderedDictionary(); onRoundEnd = new OrderedDictionary(); onActionStart = new OrderedDictionary(); onActionEnd = new OrderedDictionary(); onStartAttack = new OrderedDictionary>(); onFinishAttack = new OrderedDictionary>(); onGetAttacked = new OrderedDictionary>(); onBeforePlayCard = new OrderedDictionary>>(); onAfterPlayCard = new OrderedDictionary>>(); onDeath = new OrderedDictionary(); onActionStart.InsertByPriority("StaminaRecover", new PrioritizedAction(() => { owner.ModifyAttribute("Stamina", owner.GetAttribute("StaminaRecoverPerAction")); owner.ClampAttribute("Stamina", 0, owner.GetAttribute("MaximumStamina")); }, 999)); onActionStart.InsertByPriority("ManaRecover", new PrioritizedAction(() => { owner.ModifyAttribute("Mana", owner.GetAttribute("ManaRecoverPerAction")); owner.ClampAttribute("Mana", 0, owner.GetAttribute("MaximumMana")); }, 999)); onActionStart.InsertByPriority("DefenseReset", new PrioritizedAction(() => { if (owner.GetAttribute("KeepBlockOnActionStart") <= 0) { owner.SetAttribute("Block", 0); } if (owner.GetAttribute("KeepDodgeOnActionStart") <= 0) { owner.SetAttribute("Dodge", 0); } }, 998)); } } public partial class EventSubmodule { protected void SetUpDefaultEvents() { } } } namespace Continentis.MainGame.Character { public class AttackResult { public CharacterBase attacker; //攻击者 public CharacterBase target; //被攻击者 public CardInstance attackCard; //使用的攻击卡牌 public int startDamage; //攻击开始时的原始伤害值 public bool isDodged; //是否被闪避 public int blockedDamage; //格挡掉的伤害 public int shieldedDamage; //护盾吸收的伤害 public int hurtDamage; //实际受到的伤害 /// 本次攻击的上下文,包含标签等扩展信息。 public AttackContext context; public bool IsHurt => hurtDamage > 0; //是否实际受到伤害 public AttackResult(CharacterBase attacker, CharacterBase target, int startDamage, AttackContext context, bool isDodged, int blocked, int shielded, int hurt) { this.attacker = attacker; this.target = target; this.attackCard = context?.sourceCard; this.startDamage = startDamage; this.context = context ?? new AttackContext(); this.isDodged = isDodged; this.blockedDamage = blocked; this.shieldedDamage = shielded; this.hurtDamage = hurt; } } }