From 42e5042154b25331f528c17e55defe2fdb0d3a2e Mon Sep 17 00:00:00 2001 From: milimoe Date: Wed, 11 Sep 2024 21:59:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BA=E6=8A=80=E8=83=BD=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=B4=E5=A4=9A=E5=8A=9F=E8=83=BD=EF=BC=9B?= =?UTF-8?q?=E5=88=A0=E9=99=A4SkillFactory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Api/Factory/SkillFactory.cs | 15 ---- Api/Utility/ActionQueue.cs | 80 +++++++++++++------ Api/Utility/Factory.cs | 10 --- Entity/Character/Character.cs | 15 +++- Entity/Skill/Effect.cs | 29 +++++-- Entity/Skill/Skill.cs | 21 +++-- .../Common/Addon/Example/ExampleGameModule.cs | 5 +- 7 files changed, 106 insertions(+), 69 deletions(-) delete mode 100644 Api/Factory/SkillFactory.cs diff --git a/Api/Factory/SkillFactory.cs b/Api/Factory/SkillFactory.cs deleted file mode 100644 index 5074cea..0000000 --- a/Api/Factory/SkillFactory.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Milimoe.FunGame.Core.Entity; -using Milimoe.FunGame.Core.Interface.Base; - -namespace Milimoe.FunGame.Core.Api.Factory -{ - internal class SkillFactory : IFactory - { - public Type EntityType => typeof(Skill); - - public Skill Create() - { - return new(); - } - } -} diff --git a/Api/Utility/ActionQueue.cs b/Api/Utility/ActionQueue.cs index 3fe7c48..b5047e2 100644 --- a/Api/Utility/ActionQueue.cs +++ b/Api/Utility/ActionQueue.cs @@ -296,6 +296,7 @@ namespace Milimoe.FunGame.Core.Api.Utility // 基础硬直时间 double baseTime = 10; + bool isCheckProtected = true; // 敌人列表 List enemys = [.. _queue.Where(c => c != character && !c.IsUnselectable)]; @@ -419,7 +420,7 @@ namespace Milimoe.FunGame.Core.Api.Utility baseTime = character.NormalAttack.HardnessTime; foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList()) { - effect.AlterHardnessTimeAfterNormalAttack(character, ref baseTime); + effect.AlterHardnessTimeAfterNormalAttack(character, ref baseTime, ref isCheckProtected); } } } @@ -434,25 +435,25 @@ namespace Milimoe.FunGame.Core.Api.Utility character.CharacterState = CharacterState.Casting; _castingSkills.Add(character, skill); baseTime = skill.CastTime; - foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList()) - { - effect.OnSkillCasting(character); - } + skill.OnSkillCasting(this, character); } else { if (CheckCanCast(character, skill, out double cost)) { + skill.OnSkillCasting(this, character); + character.EP = Calculation.Round2Digits(character.EP - cost); baseTime = skill.HardnessTime; skill.CurrentCD = Calculation.Round2Digits(Math.Max(1, skill.CD * (1 - character.CDR))); skill.Enable = false; WriteLine("[ " + character + $" ] 消耗了 {cost:f2} 点能量,释放了{(skill.IsSuperSkill ? "爆发技" : "战技")} {skill.Name}!"); - skill.Trigger(this, character, enemys, teammates); + skill.OnSkillCasted(this, character, enemys, teammates); + foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList()) { - effect.AlterHardnessTimeAfterCastSkill(character, ref baseTime); + effect.AlterHardnessTimeAfterCastSkill(character, ref baseTime, ref isCheckProtected); } } } @@ -473,7 +474,7 @@ namespace Milimoe.FunGame.Core.Api.Utility skill.Enable = false; WriteLine("[ " + character + $" ] 消耗了 {cost:f2} 点魔法值,释放了技能 {skill.Name}!"); - skill.Trigger(this, character, enemys, teammates); + skill.OnSkillCasted(this, character, enemys, teammates); } else { @@ -484,7 +485,7 @@ namespace Milimoe.FunGame.Core.Api.Utility foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList()) { - effect.AlterHardnessTimeAfterCastSkill(character, ref baseTime); + effect.AlterHardnessTimeAfterCastSkill(character, ref baseTime, ref isCheckProtected); } } else if (type == CharacterActionType.CastSuperSkill) @@ -503,7 +504,7 @@ namespace Milimoe.FunGame.Core.Api.Utility skill.Enable = false; WriteLine("[ " + character + $" ] 消耗了 {cost:f2} 点能量值,释放了爆发技 {skill.Name}!"); - skill.Trigger(this, character, enemys, teammates); + skill.OnSkillCasted(this, character, enemys, teammates); } else { @@ -514,7 +515,7 @@ namespace Milimoe.FunGame.Core.Api.Utility foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList()) { - effect.AlterHardnessTimeAfterCastSkill(character, ref baseTime); + effect.AlterHardnessTimeAfterCastSkill(character, ref baseTime, ref isCheckProtected); } } else if (type == CharacterActionType.UseItem) @@ -543,7 +544,7 @@ namespace Milimoe.FunGame.Core.Api.Utility newHardnessTime = Math.Max(0, Calculation.Round2Digits(baseTime * (1 - character.AccelerationCoefficient))); WriteLine("[ " + character + " ] 进行吟唱,持续时间: " + newHardnessTime); } - AddCharacter(character, newHardnessTime); + AddCharacter(character, newHardnessTime, isCheckProtected); // 有人想要插队吗? WillPreCastSuperSkill(character); @@ -616,19 +617,19 @@ namespace Milimoe.FunGame.Core.Api.Utility { character.HP = Calculation.Round2Digits(character.HP + reallyReHP); character.MP = Calculation.Round2Digits(character.MP + reallyReMP); - WriteLine("角色 " + character.Name + " 回血:" + recoveryHP + " / " + "回蓝:" + recoveryMP); + WriteLine("角色 " + character.NickName + " 回血:" + recoveryHP + " / " + "回蓝:" + recoveryMP); } else { if (reallyReHP > 0) { character.HP = Calculation.Round2Digits(character.HP + reallyReHP); - WriteLine("角色 " + character.Name + " 回血:" + recoveryHP); + WriteLine("角色 " + character.NickName + " 回血:" + recoveryHP); } if (reallyReMP > 0) { character.MP = Calculation.Round2Digits(character.MP + reallyReMP); - WriteLine("角色 " + character.Name + " 回蓝:" + recoveryMP); + WriteLine("角色 " + character.NickName + " 回蓝:" + recoveryMP); } } @@ -689,13 +690,18 @@ namespace Milimoe.FunGame.Core.Api.Utility /// public void DamageToEnemy(Character actor, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage = false, MagicType magicType = MagicType.None, DamageResult damageResult = DamageResult.Normal) { + bool isEvaded = damageResult == DamageResult.Evaded; foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList()) { - effect.AlterActualDamageAfterCalculation(actor, enemy, ref damage, isNormalAttack, isMagicDamage, magicType, damageResult); + if (effect.AlterActualDamageAfterCalculation(actor, enemy, ref damage, isNormalAttack, isMagicDamage, magicType, damageResult)) + { + isEvaded = true; + damageResult = DamageResult.Evaded; + } } // 闪避了就没伤害了 - if (damageResult != DamageResult.Evaded) + if (!isEvaded) { if (damage < 0) damage = 0; if (isMagicDamage) @@ -728,7 +734,7 @@ namespace Milimoe.FunGame.Core.Api.Utility { effect.AfterDamageCalculation(actor, enemy, damage, isNormalAttack, isMagicDamage, magicType, damageResult); } - if (enemy.HP <= 0) + if (enemy.HP <= 0 && !_eliminated.Contains(enemy)) { DeathCalculation(actor, enemy); // 给所有角色的特效广播角色死亡结算 @@ -766,6 +772,17 @@ namespace Milimoe.FunGame.Core.Api.Utility /// public DamageResult CalculatePhysicalDamage(Character actor, Character enemy, bool isNormalAttack, double expectedDamage, out double finalDamage) { + bool isMagic = false; + MagicType magicType = MagicType.None; + foreach(Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList()) + { + effect.AlterDamageTypeBeforeCalculation(actor, enemy, ref isNormalAttack, ref isMagic, ref magicType); + } + if (isMagic) + { + return CalculateMagicalDamage(actor, enemy, isNormalAttack, magicType, expectedDamage, out finalDamage); + } + foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList()) { effect.AlterExpectedDamageBeforeCalculation(actor, enemy, ref expectedDamage, isNormalAttack, false, MagicType.None); @@ -782,7 +799,10 @@ namespace Milimoe.FunGame.Core.Api.Utility bool isAlterEvaded = false; foreach (Effect effect in characters.SelectMany(c => c.Effects.Where(e => e.Level > 0).ToList())) { - isAlterEvaded = effect.OnEvadedTriggered(actor, enemy, dice); + if (effect.OnEvadedTriggered(actor, enemy, dice)) + { + isAlterEvaded = true; + } } if (!isAlterEvaded) { @@ -830,6 +850,16 @@ namespace Milimoe.FunGame.Core.Api.Utility /// public DamageResult CalculateMagicalDamage(Character actor, Character enemy, bool isNormalAttack, MagicType magicType, double expectedDamage, out double finalDamage) { + bool isMagic = true; + foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList()) + { + effect.AlterDamageTypeBeforeCalculation(actor, enemy, ref isNormalAttack, ref isMagic, ref magicType); + } + if (!isMagic) + { + return CalculatePhysicalDamage(actor, enemy, isNormalAttack, expectedDamage, out finalDamage); + } + foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList()) { effect.AlterExpectedDamageBeforeCalculation(actor, enemy, ref expectedDamage, isNormalAttack, true, magicType); @@ -846,7 +876,10 @@ namespace Milimoe.FunGame.Core.Api.Utility bool isAlterEvaded = false; foreach (Effect effect in characters.SelectMany(c => c.Effects.Where(e => e.Level > 0).ToList())) { - isAlterEvaded = effect.OnEvadedTriggered(actor, enemy, dice); + if (effect.OnEvadedTriggered(actor, enemy, dice)) + { + isAlterEvaded = true; + } } if (!isAlterEvaded) { @@ -1068,10 +1101,7 @@ namespace Milimoe.FunGame.Core.Api.Utility _hardnessTimes[c] = Calculation.Round2Digits(_hardnessTimes[c] + 0.01); } } - foreach (Effect effect in character.Effects.Where(e => e.Level > 0).ToList()) - { - effect.OnSkillCasting(character); - } + skill.OnSkillCasting(this, other); } } } @@ -1097,7 +1127,7 @@ namespace Milimoe.FunGame.Core.Api.Utility WriteLine($"[ {caster} ] 的施法被 [ {interrupter} ] 打断了!!"); foreach (Effect e in cast.Effects.Where(e => e.Level > 0).ToList()) { - e.OnSkillCastInterrupted(caster, interrupter); + e.OnSkillCastInterrupted(caster, cast, interrupter); } } } diff --git a/Api/Utility/Factory.cs b/Api/Utility/Factory.cs index 4008680..39a216f 100644 --- a/Api/Utility/Factory.cs +++ b/Api/Utility/Factory.cs @@ -12,7 +12,6 @@ namespace Milimoe.FunGame.Core.Api.Utility private readonly static InventoryFactory InventoryFactory = new(); private readonly static ItemFactory ItemFactory = new(); private readonly static RoomFactory RoomFactory = new(); - private readonly static SkillFactory SkillFactory = new(); private readonly static UserFactory UserFactory = new(); /// @@ -137,15 +136,6 @@ namespace Milimoe.FunGame.Core.Api.Utility return RoomFactory.Create(); } - /// - /// 获取技能实例 - /// - /// - public static Skill GetSkill() - { - return SkillFactory.Create(); - } - /// /// 获取用户实例 /// diff --git a/Entity/Character/Character.cs b/Entity/Character/Character.cs index 54d2419..ed26b19 100644 --- a/Entity/Character/Character.cs +++ b/Entity/Character/Character.cs @@ -547,17 +547,17 @@ namespace Milimoe.FunGame.Core.Entity /// /// 力量 = 基础力量 + 额外力量 /// - public double STR => BaseSTR + ExSTR; + public double STR => Calculation.Round2Digits(BaseSTR + ExSTR); /// /// 敏捷 = 基础敏捷 + 额外敏捷 /// - public double AGI => BaseAGI + ExAGI; + public double AGI => Calculation.Round2Digits(BaseAGI + ExAGI); /// /// 智力 = 基础智力 + 额外智力 /// - public double INT => BaseINT + ExINT; + public double INT => Calculation.Round2Digits(BaseINT + ExINT); /// /// 力量成长值(+BaseSTR/Lv) @@ -940,6 +940,15 @@ namespace Milimoe.FunGame.Core.Entity builder.Append(item.ToString()); } } + + if (Effects.Count > 0) + { + builder.AppendLine("== 状态栏 =="); + foreach (Effect effect in Effects) + { + builder.Append(effect.ToString()); + } + } return builder.ToString(); } diff --git a/Entity/Skill/Effect.cs b/Entity/Skill/Effect.cs index 2bb790a..1e90cfa 100644 --- a/Entity/Skill/Effect.cs +++ b/Entity/Skill/Effect.cs @@ -119,6 +119,19 @@ namespace Milimoe.FunGame.Core.Entity } + /// + /// 在伤害计算前修改伤害类型 + /// + /// + /// + /// + /// + /// + public virtual void AlterDamageTypeBeforeCalculation(Character character, Character enemy, ref bool isNormalAttack, ref bool isMagicDamage, ref MagicType magicType) + { + + } + /// /// 在伤害计算前修改预期伤害 /// @@ -134,7 +147,7 @@ namespace Milimoe.FunGame.Core.Entity } /// - /// 在伤害计算完成后修改实际伤害 + /// 在伤害计算完成后修改实际伤害 [ 允许取消伤害 ] /// /// /// @@ -143,9 +156,10 @@ namespace Milimoe.FunGame.Core.Entity /// /// /// - public virtual void AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult) + /// 返回 true 表示取消此伤害,等同于闪避 + public virtual bool AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult) { - + return false; } /// @@ -153,7 +167,8 @@ namespace Milimoe.FunGame.Core.Entity /// /// /// - public virtual void AlterHardnessTimeAfterNormalAttack(Character character, ref double baseHardnessTime) + /// + public virtual void AlterHardnessTimeAfterNormalAttack(Character character, ref double baseHardnessTime, ref bool isCheckProtected) { } @@ -163,7 +178,8 @@ namespace Milimoe.FunGame.Core.Entity /// /// /// - public virtual void AlterHardnessTimeAfterCastSkill(Character character, ref double baseHardnessTime) + /// + public virtual void AlterHardnessTimeAfterCastSkill(Character character, ref double baseHardnessTime, ref bool isCheckProtected) { } @@ -201,8 +217,9 @@ namespace Milimoe.FunGame.Core.Entity /// 技能吟唱被打断时 /// /// + /// /// - public virtual void OnSkillCastInterrupted(Character caster, Character interrupter) + public virtual void OnSkillCastInterrupted(Character caster, Skill skill, Character interrupter) { } diff --git a/Entity/Skill/Skill.cs b/Entity/Skill/Skill.cs index 66ce5b1..13bf24b 100644 --- a/Entity/Skill/Skill.cs +++ b/Entity/Skill/Skill.cs @@ -144,11 +144,6 @@ namespace Milimoe.FunGame.Core.Entity Character = character; } - internal Skill() - { - SkillType = SkillType.Passive; - } - /// /// 触发技能升级 /// @@ -158,6 +153,7 @@ namespace Milimoe.FunGame.Core.Entity { foreach (Effect e in AddInactiveEffectToCharacter()) { + e.ActionQueue = ActionQueue; if (Character != null && !Character.Effects.Contains(e)) { Character.Effects.Add(e); @@ -177,10 +173,23 @@ namespace Milimoe.FunGame.Core.Entity OnLevelUp(); } + /// + /// 技能开始吟唱时 [ 吟唱魔法、释放战技和爆发技、预释放爆发技均可触发 ] + /// + public void OnSkillCasting(ActionQueue queue, Character actor) + { + ActionQueue = queue; + foreach (Effect e in Effects) + { + e.ActionQueue = ActionQueue; + e.OnSkillCasting(actor); + } + } + /// /// 触发技能效果 /// - public void Trigger(ActionQueue queue, Character actor, List enemys, List teammates) + public void OnSkillCasted(ActionQueue queue, Character actor, List enemys, List teammates) { ActionQueue = queue; foreach (Effect e in Effects) diff --git a/Library/Common/Addon/Example/ExampleGameModule.cs b/Library/Common/Addon/Example/ExampleGameModule.cs index 98a1bfb..474ee80 100644 --- a/Library/Common/Addon/Example/ExampleGameModule.cs +++ b/Library/Common/Addon/Example/ExampleGameModule.cs @@ -332,10 +332,7 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon.Example get { List list = []; - Skill s = Factory.GetSkill(); - s.Name = "Example Skill"; - s.Description = "技能应该在GameModule中继承实现,再自行构造。"; - list.Add(s); + // 技能应该在GameModule中新建类继承Skill实现,再自行构造。 return list; } }