116 lines
5.5 KiB
C#
116 lines
5.5 KiB
C#
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<CharacterBase>
|
|
{
|
|
public OrderedDictionary<string, PrioritizedAction> onCombatStart; //战斗开始时
|
|
public OrderedDictionary<string, PrioritizedAction> onCombatEnd; //战斗结束时
|
|
|
|
public OrderedDictionary<string, PrioritizedAction> onRoundStart; //每回合开始时
|
|
public OrderedDictionary<string, PrioritizedAction> onRoundEnd; //每回合结束时
|
|
|
|
public OrderedDictionary<string, PrioritizedAction<CharacterBase>> onStartAttack; //开始攻击时,参数为被攻击目标
|
|
public OrderedDictionary<string, PrioritizedAction<CharacterBase, AttackResult>> onFinishAttack; //完成攻击时,参数为被攻击目标和对应的攻击结果
|
|
public OrderedDictionary<string, PrioritizedAction<CharacterBase, AttackResult>> onGetAttacked; //被攻击时,参数为攻击者和攻击结果
|
|
|
|
public OrderedDictionary<string, PrioritizedAction> onActionStart; //每次行动开始时
|
|
public OrderedDictionary<string, PrioritizedAction> onActionEnd; //每次行动结束时
|
|
|
|
public OrderedDictionary<string, PrioritizedAction<CardInstance, List<CharacterBase>>> onBeforePlayCard; //使用卡牌前,参数为使用的卡牌
|
|
public OrderedDictionary<string, PrioritizedAction<CardInstance, List<CharacterBase>>> onAfterPlayCard; //使用卡牌后,参数为使用的卡牌
|
|
|
|
/// <summary>角色死亡时触发,供 Buff / 技能系统订阅响应</summary>
|
|
public OrderedDictionary<string, PrioritizedAction> onDeath; //角色死亡时
|
|
|
|
public EventSubmodule(CharacterBase character) : base(character)
|
|
{
|
|
onCombatStart = new OrderedDictionary<string, PrioritizedAction>();
|
|
onCombatEnd = new OrderedDictionary<string, PrioritizedAction>();
|
|
|
|
onRoundStart = new OrderedDictionary<string, PrioritizedAction>();
|
|
onRoundEnd = new OrderedDictionary<string, PrioritizedAction>();
|
|
|
|
onActionStart = new OrderedDictionary<string, PrioritizedAction>();
|
|
onActionEnd = new OrderedDictionary<string, PrioritizedAction>();
|
|
|
|
onStartAttack = new OrderedDictionary<string, PrioritizedAction<CharacterBase>>();
|
|
onFinishAttack = new OrderedDictionary<string, PrioritizedAction<CharacterBase, AttackResult>>();
|
|
onGetAttacked = new OrderedDictionary<string, PrioritizedAction<CharacterBase, AttackResult>>();
|
|
|
|
onBeforePlayCard = new OrderedDictionary<string, PrioritizedAction<CardInstance, List<CharacterBase>>>();
|
|
onAfterPlayCard = new OrderedDictionary<string, PrioritizedAction<CardInstance, List<CharacterBase>>>();
|
|
|
|
onDeath = new OrderedDictionary<string, PrioritizedAction>();
|
|
|
|
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; //实际受到的伤害
|
|
|
|
/// <summary>本次攻击的上下文,包含标签等扩展信息。</summary>
|
|
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;
|
|
}
|
|
}
|
|
} |