Files

138 lines
6.5 KiB
C#
Raw Permalink Normal View History

2025-10-03 00:02:43 -04:00
using System.Collections.Generic;
using Continentis.MainGame.Card;
using UnityEngine.Events;
using SoftCircuits.Collections;
2026-04-17 12:01:50 -04:00
using SLSUtilities.General;
2025-10-03 00:02:43 -04:00
namespace Continentis.MainGame.Character
{
public partial class EventSubmodule : SubmoduleBase<CharacterBase>
{
2025-10-31 10:02:30 -04:00
public OrderedDictionary<string, PrioritizedAction> onCombatStart; //战斗开始时
public OrderedDictionary<string, PrioritizedAction> onCombatEnd; //战斗结束时
2025-10-03 00:02:43 -04:00
2025-10-31 10:02:30 -04:00
public OrderedDictionary<string, PrioritizedAction> onRoundStart; //每回合开始时
public OrderedDictionary<string, PrioritizedAction> onRoundEnd; //每回合结束时
2025-10-03 00:02:43 -04:00
2025-11-08 22:22:43 -05:00
public OrderedDictionary<string, PrioritizedAction<CharacterBase>> onStartAttack; //开始攻击时,参数为被攻击目标
public OrderedDictionary<string, PrioritizedAction<CharacterBase, AttackResult>> onFinishAttack; //完成攻击时,参数为被攻击目标和对应的攻击结果
2025-10-31 10:02:30 -04:00
public OrderedDictionary<string, PrioritizedAction<CharacterBase, AttackResult>> onGetAttacked; //被攻击时,参数为攻击者和攻击结果
2025-10-03 00:02:43 -04:00
2026-04-17 12:01:50 -04:00
/// <summary> 在 Block/Shield/Health 计算之前触发Buff 可修改 damage 或设置 isCancelled = true 来免疫本次伤害。</summary>
public OrderedDictionary<string, PrioritizedAction<IncomingDamageModifier>> onBeforeReceiveDamage;
2025-10-31 10:02:30 -04:00
public OrderedDictionary<string, PrioritizedAction> onActionStart; //每次行动开始时
public OrderedDictionary<string, PrioritizedAction> onActionEnd; //每次行动结束时
2025-10-03 00:02:43 -04:00
2025-10-31 10:02:30 -04:00
public OrderedDictionary<string, PrioritizedAction<CardInstance, List<CharacterBase>>> onBeforePlayCard; //使用卡牌前,参数为使用的卡牌
public OrderedDictionary<string, PrioritizedAction<CardInstance, List<CharacterBase>>> onAfterPlayCard; //使用卡牌后,参数为使用的卡牌
2025-10-03 00:02:43 -04:00
2026-04-01 12:23:27 -04:00
/// <summary>角色死亡时触发,供 Buff / 技能系统订阅响应</summary>
public OrderedDictionary<string, PrioritizedAction> onDeath; //角色死亡时
2025-10-03 00:02:43 -04:00
public EventSubmodule(CharacterBase character) : base(character)
{
2025-10-31 10:02:30 -04:00
onCombatStart = new OrderedDictionary<string, PrioritizedAction>();
onCombatEnd = new OrderedDictionary<string, PrioritizedAction>();
2025-10-03 00:02:43 -04:00
2025-10-31 10:02:30 -04:00
onRoundStart = new OrderedDictionary<string, PrioritizedAction>();
onRoundEnd = new OrderedDictionary<string, PrioritizedAction>();
2025-10-03 00:02:43 -04:00
2025-10-31 10:02:30 -04:00
onActionStart = new OrderedDictionary<string, PrioritizedAction>();
onActionEnd = new OrderedDictionary<string, PrioritizedAction>();
2025-10-03 00:02:43 -04:00
2025-11-08 22:22:43 -05:00
onStartAttack = new OrderedDictionary<string, PrioritizedAction<CharacterBase>>();
onFinishAttack = new OrderedDictionary<string, PrioritizedAction<CharacterBase, AttackResult>>();
2025-10-31 10:02:30 -04:00
onGetAttacked = new OrderedDictionary<string, PrioritizedAction<CharacterBase, AttackResult>>();
2026-04-17 12:01:50 -04:00
onBeforeReceiveDamage = new OrderedDictionary<string, PrioritizedAction<IncomingDamageModifier>>();
2025-10-03 00:02:43 -04:00
2025-10-31 10:02:30 -04:00
onBeforePlayCard = new OrderedDictionary<string, PrioritizedAction<CardInstance, List<CharacterBase>>>();
onAfterPlayCard = new OrderedDictionary<string, PrioritizedAction<CardInstance, List<CharacterBase>>>();
2025-10-03 00:02:43 -04:00
2026-04-01 12:23:27 -04:00
onDeath = new OrderedDictionary<string, PrioritizedAction>();
2025-10-31 10:02:30 -04:00
onActionStart.InsertByPriority("StaminaRecover", new PrioritizedAction(() =>
2025-10-23 00:49:44 -04:00
{
owner.ModifyAttribute("Stamina", owner.GetAttribute("StaminaRecoverPerAction"));
owner.ClampAttribute("Stamina", 0, owner.GetAttribute("MaximumStamina"));
}, 999));
2025-10-31 10:02:30 -04:00
onActionStart.InsertByPriority("ManaRecover", new PrioritizedAction(() =>
2025-10-03 00:02:43 -04:00
{
2025-10-23 00:49:44 -04:00
owner.ModifyAttribute("Mana", owner.GetAttribute("ManaRecoverPerAction"));
owner.ClampAttribute("Mana", 0, owner.GetAttribute("MaximumMana"));
}, 999));
2025-10-30 04:21:28 -04:00
2025-10-31 10:02:30 -04:00
onActionStart.InsertByPriority("DefenseReset", new PrioritizedAction(() =>
2025-10-30 04:21:28 -04:00
{
2026-04-17 12:01:50 -04:00
if (owner.GetAttribute("KeepBlockOnRoundFirstActionStart") <= 0)
2025-10-30 04:21:28 -04:00
{
owner.SetAttribute("Block", 0);
}
2026-04-17 12:01:50 -04:00
if (owner.GetAttribute("KeepDodgeOnRoundFirstActionStart") <= 0)
2025-10-30 04:21:28 -04:00
{
owner.SetAttribute("Dodge", 0);
}
}, 998));
2025-10-03 00:02:43 -04:00
}
}
public partial class EventSubmodule
{
protected void SetUpDefaultEvents()
{
}
}
}
namespace Continentis.MainGame.Character
{
2026-04-17 12:01:50 -04:00
/// <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;
}
}
2025-10-03 00:02:43 -04:00
public class AttackResult
{
public CharacterBase attacker; //攻击者
2025-11-08 22:22:43 -05:00
public CharacterBase target; //被攻击者
public CardInstance attackCard; //使用的攻击卡牌
2025-10-03 00:02:43 -04:00
public int startDamage; //攻击开始时的原始伤害值
public bool isDodged; //是否被闪避
public int blockedDamage; //格挡掉的伤害
public int shieldedDamage; //护盾吸收的伤害
public int hurtDamage; //实际受到的伤害
2026-04-01 12:23:27 -04:00
/// <summary>本次攻击的上下文,包含标签等扩展信息。</summary>
public AttackContext context;
2025-10-03 00:02:43 -04:00
public bool IsHurt => hurtDamage > 0; //是否实际受到伤害
2026-04-01 12:23:27 -04:00
public AttackResult(CharacterBase attacker, CharacterBase target, int startDamage, AttackContext context, bool isDodged, int blocked, int shielded, int hurt)
2025-10-03 00:02:43 -04:00
{
this.attacker = attacker;
2025-11-08 22:22:43 -05:00
this.target = target;
2026-04-01 12:23:27 -04:00
this.attackCard = context?.sourceCard;
2025-10-03 00:02:43 -04:00
this.startDamage = startDamage;
2026-04-01 12:23:27 -04:00
this.context = context ?? new AttackContext();
2025-10-03 00:02:43 -04:00
this.isDodged = isDodged;
this.blockedDamage = blocked;
this.shieldedDamage = shielded;
this.hurtDamage = hurt;
}
}
}