using System.Text; using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Interface.Entity; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Entity { /// /// 特殊效果类,需要继承 /// public abstract class Effect(Skill skill) : BaseEntity { /// /// 所属的技能 /// public Skill Skill { get; } = skill; /// /// 作用于自身 /// public virtual bool TargetSelf { get; } = false; /// /// 作用目标数量 /// public virtual int TargetCount { get; } = 0; /// /// 作用范围 /// public virtual double TargetRange { get; } = 0; /// /// 持续性的 /// 配合 使用,而不是 。 /// public virtual bool Durative { get; } = false; /// /// 持续时间 /// 配合 使用。 /// public virtual double Duration { get; } = 0; /// /// 持续时间(回合) /// 使用此属性需要将 设置为 false。 /// public virtual double DurationTurn { get; } = 0; /// /// 剩余持续时间 /// public double RemainDuration { get; set; } = 0; /// /// 剩余持续时间(回合) /// public double RemainDurationTurn { get; set; } = 0; /// /// 魔法类型 /// public virtual MagicType MagicType { get; } = MagicType.None; /// /// 效果描述 /// public virtual string Description { get; } = ""; /// /// 等级,跟随技能的等级 /// public int Level => Skill.Level; /// /// 此特效的施加者,用于溯源 /// public Character? Source { get; set; } = null; /// /// 获得此特效时 /// /// public virtual void OnEffectGained(Character character) { } /// /// 失去此特效时 /// /// public virtual void OnEffectLost(Character character) { } /// /// 在伤害计算前修改预期伤害 /// /// /// /// /// /// /// /// /// 返回 true 表示修改了伤害 public virtual bool AlterExpectedDamageBeforeCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, out double newDamage) { newDamage = damage; return false; } /// /// 在伤害计算完成后修改实际伤害 /// /// /// /// /// /// /// /// /// /// 返回 true 表示修改了伤害 public virtual bool AlterActualDamageAfterCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, bool isCritical, out double newDamage) { newDamage = damage; return false; } /// /// 在完成普通攻击动作之后修改硬直时间 /// /// /// /// /// 返回 true 表示修改了硬直时间 public virtual bool AlterHardnessTimeAfterNormalAttack(Character character, double baseHardnessTime, out double newHardnessTime) { newHardnessTime = baseHardnessTime; return false; } /// /// 在完成释放技能动作之后修改硬直时间 /// /// /// /// /// 返回 true 表示修改了硬直时间 public virtual bool AlterHardnessTimeAfterCastSkill(Character character, double baseHardnessTime, out double newHardnessTime) { newHardnessTime = baseHardnessTime; return false; } /// /// 在造成伤害时,修改获得的能量 /// /// /// /// /// 返回 true 表示修改了获得的能量 public virtual bool AlterEPAfterDamage(Character character, double baseEP, out double newEP) { newEP = baseEP; return false; } /// /// 在受到伤害时,修改获得的能量 /// /// /// /// /// 返回 true 表示修改了获得的能量 public virtual bool AlterEPAfterGetDamage(Character character, double baseEP, out double newEP) { newEP = baseEP; return false; } /// /// 技能开始吟唱时 [ 爆发技插队可触发此项 ] /// /// public virtual void OnSkillCasting(Character caster) { } /// /// 技能吟唱被打断时 /// /// /// public virtual void OnSkillCastInterrupted(Character caster, Character interrupter) { } /// /// 吟唱结束后释放技能(魔法)/ 直接释放技能(战技/爆发技) /// /// /// /// /// /// public virtual void OnSkillCasted(ActionQueue queue, Character caster, List enemys, List teammates, Dictionary others) { } /// /// 时间流逝时 /// /// /// public virtual void OnTimeElapsed(Character character, double elapsed) { } /// /// 在完成伤害结算后 /// /// /// /// /// /// public virtual void AfterDamageCalculation(Character character, Character enemy, double damage, bool isMagicDamage, MagicType magicType) { } /// /// 在特效持有者的回合开始前 /// /// public virtual void OnTurnStart(Character character) { } /// /// 在特效持有者的回合开始后 /// /// public virtual void OnTurnEnd(Character character) { } /// /// 技能被升级时 /// /// /// public virtual void OnSkillLevelUp(Character character, double level) { } /// /// 特效持有者升级时 /// /// /// public virtual void OnOwnerLevelUp(Character owner, double level) { } /// /// 在完成死亡结算后 [ 全体广播 ] /// /// /// /// /// public virtual void AfterDeathCalculation(Character death, Character? killer, Dictionary continuousKilling, Dictionary earnedMoney) { } /// /// 在触发闪避时 /// /// /// /// /// 返回 true 表示无视闪避 public virtual bool OnEvadedTriggered(Character attacker, Character evader, double dice) { return false; } /// /// 在触发暴击时 /// /// /// public virtual void OnCriticalDamageTriggered(Character character, double dice) { } public override string ToString() { StringBuilder builder = new(); string isDurative = ""; if (Durative) { isDurative = "(剩余:" + RemainDuration + " 时间)"; } else if (DurationTurn > 0) { isDurative = "(剩余:" + RemainDurationTurn + " 回合)"; } builder.AppendLine("【" + Name + " - 等级 " + Level + "】" + Description + isDurative); return builder.ToString(); } public override bool Equals(IBaseEntity? other) { return other is Effect c && c.Name == Name; } } }