Files
Continentis/Assets/Scripts/MainGame/Character/CharacterSubmodules/EventSubmodule.cs
SoulliesOfficial ac98ec3aef 更新
2026-04-17 12:01:50 -04:00

138 lines
6.5 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 Continentis.MainGame.Card;
using UnityEngine.Events;
using SoftCircuits.Collections;
using SLSUtilities.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; //被攻击时,参数为攻击者和攻击结果
/// <summary> 在 Block/Shield/Health 计算之前触发Buff 可修改 damage 或设置 isCancelled = true 来免疫本次伤害。</summary>
public OrderedDictionary<string, PrioritizedAction<IncomingDamageModifier>> onBeforeReceiveDamage;
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>>();
onBeforeReceiveDamage = new OrderedDictionary<string, PrioritizedAction<IncomingDamageModifier>>();
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("KeepBlockOnRoundFirstActionStart") <= 0)
{
owner.SetAttribute("Block", 0);
}
if (owner.GetAttribute("KeepDodgeOnRoundFirstActionStart") <= 0)
{
owner.SetAttribute("Dodge", 0);
}
}, 998));
}
}
public partial class EventSubmodule
{
protected void SetUpDefaultEvents()
{
}
}
}
namespace Continentis.MainGame.Character
{
/// <summary>
/// 伤害前置修改器:在伤害实际作用于 Health 之前,供 Buff 修改或取消伤害。
/// 若 <see cref="isCancelled"/> 为 true伤害将被完全吸收不扣血、不经过 Block/Shield
/// </summary>
public class IncomingDamageModifier
{
public int damage;
public bool isCancelled;
public AttackContext context;
public IncomingDamageModifier(int damage, AttackContext context)
{
this.damage = damage;
this.isCancelled = false;
this.context = context;
}
}
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;
}
}
}