From 72da63b30c656f7105f6cce2baf87d48705550b5 Mon Sep 17 00:00:00 2001 From: milimoe Date: Wed, 11 Sep 2024 00:32:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=98=8E=E7=A1=AE=E9=97=AA=E9=81=BF=E5=8F=AA?= =?UTF-8?q?=E8=83=BD=E9=97=AA=E9=81=BF=E6=99=AE=E9=80=9A=E6=94=BB=E5=87=BB?= =?UTF-8?q?=EF=BC=9B=E6=9C=80=E4=BD=8E=E7=A1=AC=E7=9B=B4=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BA0=EF=BC=9B=E4=BC=98=E5=8C=96=E9=97=AA=E9=81=BF?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BB=A5=E4=BE=BF=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E7=89=B9=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Api/Utility/ActionQueue.cs | 113 +++++++++++++++++++++------------- Entity/Character/Character.cs | 55 ++++++++++++++++- Entity/Skill/Effect.cs | 14 ++--- Entity/Skill/NormalAttack.cs | 5 +- 4 files changed, 129 insertions(+), 58 deletions(-) diff --git a/Api/Utility/ActionQueue.cs b/Api/Utility/ActionQueue.cs index 38f7719..3fe7c48 100644 --- a/Api/Utility/ActionQueue.cs +++ b/Api/Utility/ActionQueue.cs @@ -535,12 +535,12 @@ namespace Milimoe.FunGame.Core.Api.Utility double newHardnessTime = baseTime; if (character.CharacterState != CharacterState.Casting) { - newHardnessTime = Math.Max(1, Calculation.Round2Digits(baseTime * (1 - character.ActionCoefficient))); + newHardnessTime = Math.Max(0, Calculation.Round2Digits(baseTime * (1 - character.ActionCoefficient))); WriteLine("[ " + character + " ] 回合结束,获得硬直时间: " + newHardnessTime); } else { - newHardnessTime = Math.Max(1, Calculation.Round2Digits(baseTime * (1 - character.AccelerationCoefficient))); + newHardnessTime = Math.Max(0, Calculation.Round2Digits(baseTime * (1 - character.AccelerationCoefficient))); WriteLine("[ " + character + " ] 进行吟唱,持续时间: " + newHardnessTime); } AddCharacter(character, newHardnessTime); @@ -686,44 +686,49 @@ namespace Milimoe.FunGame.Core.Api.Utility /// /// /// - /// - public void DamageToEnemy(Character actor, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage = false, MagicType magicType = MagicType.None, bool isCritical = false) + /// + public void DamageToEnemy(Character actor, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage = false, MagicType magicType = MagicType.None, DamageResult damageResult = DamageResult.Normal) { foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList()) { - effect.AlterActualDamageAfterCalculation(actor, enemy, ref damage, isNormalAttack, isMagicDamage, magicType, isCritical); + effect.AlterActualDamageAfterCalculation(actor, enemy, ref damage, isNormalAttack, isMagicDamage, magicType, damageResult); } - if (damage < 0) damage = 0; - if (isMagicDamage) - { - string dmgType = CharacterSet.GetMagicName(magicType); - WriteLine("[ " + enemy + $" ] 受到了 {damage} 点{dmgType}!"); - } - else WriteLine("[ " + enemy + $" ] 受到了 {damage} 点物理伤害!"); - enemy.HP = Calculation.Round2Digits(enemy.HP - damage); - // 计算助攻 - _assistDamage[actor][enemy] += damage; + // 闪避了就没伤害了 + if (damageResult != DamageResult.Evaded) + { + if (damage < 0) damage = 0; + if (isMagicDamage) + { + string dmgType = CharacterSet.GetMagicName(magicType); + WriteLine("[ " + enemy + $" ] 受到了 {damage} 点{dmgType}!"); + } + else WriteLine("[ " + enemy + $" ] 受到了 {damage} 点物理伤害!"); + enemy.HP = Calculation.Round2Digits(enemy.HP - damage); - // 造成伤害和受伤都可以获得能量 - double ep = GetEP(damage, 0.2, 40); - foreach (Effect effect in actor.Effects) - { - effect.AlterEPAfterDamage(actor, ref ep); + // 计算助攻 + _assistDamage[actor][enemy] += damage; + + // 造成伤害和受伤都可以获得能量 + double ep = GetEP(damage, 0.2, 40); + foreach (Effect effect in actor.Effects) + { + effect.AlterEPAfterDamage(actor, ref ep); + } + actor.EP += ep; + ep = GetEP(damage, 0.1, 20); + foreach (Effect effect in enemy.Effects.Where(e => e.Level > 0).ToList()) + { + effect.AlterEPAfterGetDamage(enemy, ref ep); + } + enemy.EP += ep; } - actor.EP += ep; - ep = GetEP(damage, 0.1, 20); - foreach (Effect effect in enemy.Effects.Where(e => e.Level > 0).ToList()) - { - effect.AlterEPAfterGetDamage(enemy, ref ep); - } - enemy.EP += ep; foreach (Effect effect in actor.Effects.Union(enemy.Effects).Where(e => e.Level > 0).ToList()) { - effect.AfterDamageCalculation(actor, enemy, damage, isNormalAttack, isMagicDamage, magicType, isCritical); + effect.AfterDamageCalculation(actor, enemy, damage, isNormalAttack, isMagicDamage, magicType, damageResult); } - if (enemy.HP < 0) + if (enemy.HP <= 0) { DeathCalculation(actor, enemy); // 给所有角色的特效广播角色死亡结算 @@ -767,20 +772,23 @@ namespace Milimoe.FunGame.Core.Api.Utility } double dice = new Random().NextDouble(); - // 闪避判定 - if (dice < enemy.EvadeRate) + if (isNormalAttack) { - finalDamage = 0; - List characters = [actor, enemy]; - bool isAlterEvaded = false; - foreach (Effect effect in characters.SelectMany(c => c.Effects.Where(e => e.Level > 0).ToList())) + // 闪避判定 + if (dice < enemy.EvadeRate) { - isAlterEvaded = effect.OnEvadedTriggered(actor, enemy, dice); - } - if (!isAlterEvaded) - { - WriteLine("此物理攻击被完美闪避了!"); - return DamageResult.Evaded; + finalDamage = 0; + List characters = [actor, enemy]; + 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 (!isAlterEvaded) + { + WriteLine("此物理攻击被完美闪避了!"); + return DamageResult.Evaded; + } } } @@ -827,6 +835,27 @@ namespace Milimoe.FunGame.Core.Api.Utility effect.AlterExpectedDamageBeforeCalculation(actor, enemy, ref expectedDamage, isNormalAttack, true, magicType); } + double dice = new Random().NextDouble(); + if (isNormalAttack) + { + // 闪避判定 + if (dice < enemy.EvadeRate) + { + finalDamage = 0; + List characters = [actor, enemy]; + 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 (!isAlterEvaded) + { + WriteLine("此魔法攻击被完美闪避了!"); + return DamageResult.Evaded; + } + } + } + MagicResistance magicResistance = magicType switch { MagicType.Starmark => enemy.MDF.Starmark, @@ -847,7 +876,7 @@ namespace Milimoe.FunGame.Core.Api.Utility finalDamage = Calculation.Round2Digits(expectedDamage * (1 - MDF)); // 暴击判定 - double dice = new Random().NextDouble(); + dice = new Random().NextDouble(); if (dice < actor.CritRate) { finalDamage = Calculation.Round2Digits(finalDamage * actor.CritDMG); // 暴击伤害倍率加成 diff --git a/Entity/Character/Character.cs b/Entity/Character/Character.cs index 48b4062..54d2419 100644 --- a/Entity/Character/Character.cs +++ b/Entity/Character/Character.cs @@ -180,7 +180,19 @@ namespace Milimoe.FunGame.Core.Entity /// /// 当前生命值 [ 战斗相关 ] /// - public double HP { get; set; } = 0; + public double HP + { + get + { + return _HP < 0 ? 0 : (_HP > MaxHP ? MaxHP : _HP); + } + set + { + _HP = Calculation.Round2Digits(value); + if (_HP > MaxHP) _HP = MaxHP; + else if (_HP < 0) _HP = 0; + } + } /// /// 初始魔法值 [ 初始设定 ] @@ -211,7 +223,19 @@ namespace Milimoe.FunGame.Core.Entity /// /// 当前魔法值 [ 战斗相关 ] /// - public double MP { get; set; } = 0; + public double MP + { + get + { + return _MP < 0 ? 0 : (_MP > MaxMP ? MaxMP : _MP); + } + set + { + _MP = Calculation.Round2Digits(value); + if (_MP > MaxMP) _MP = MaxMP; + else if (_MP < 0) _MP = 0; + } + } /// /// 当前爆发能量 [ 战斗相关 ] @@ -690,6 +714,16 @@ namespace Milimoe.FunGame.Core.Entity /// private int _Level = 1; + /// + /// 生命值 + /// + private double _HP = 0; + + /// + /// 魔法值 + /// + private double _MP = 0; + /// /// 能量值 /// @@ -728,7 +762,7 @@ namespace Milimoe.FunGame.Core.Entity MP = MaxMP; if (EP != -1) this.EP = EP; } - + /// /// 按时间回复状态 /// @@ -744,6 +778,21 @@ namespace Milimoe.FunGame.Core.Entity } } + /// + /// 按当前百分比回复状态(一般在属性变化时调用) + /// + /// + /// + /// + /// + public void Recovery(double pastHP, double pastMP, double pastMaxHP, double pastMaxMP) + { + double pHP = Calculation.Round4Digits(pastHP / pastMaxHP); + double pMP = Calculation.Round4Digits(pastMP / pastMaxMP); + HP = Calculation.Round2Digits(MaxHP * pHP); + MP = Calculation.Round2Digits(MaxMP * pMP); + } + /// /// 角色的属性发生变化,会影响特殊效果的计算 /// diff --git a/Entity/Skill/Effect.cs b/Entity/Skill/Effect.cs index 8b66164..2bb790a 100644 --- a/Entity/Skill/Effect.cs +++ b/Entity/Skill/Effect.cs @@ -142,8 +142,8 @@ namespace Milimoe.FunGame.Core.Entity /// /// /// - /// - public virtual void AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, bool isCritical) + /// + public virtual void AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult) { } @@ -238,8 +238,8 @@ namespace Milimoe.FunGame.Core.Entity /// /// /// - /// - public virtual void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, bool isCritical) + /// + public virtual void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult) { } @@ -337,11 +337,7 @@ namespace Milimoe.FunGame.Core.Entity { if (ActionQueue is null) return DamageResult.Evaded; DamageResult result = !isMagic ? ActionQueue.CalculatePhysicalDamage(actor, enemy, false, expectedDamage, out double damage) : ActionQueue.CalculateMagicalDamage(actor, enemy, false, MagicType, expectedDamage, out damage); - if (result != DamageResult.Evaded) - { - ActionQueue.DamageToEnemy(actor, enemy, damage, false, isMagic, magicType, result == DamageResult.Critical); - return result; - } + ActionQueue.DamageToEnemy(actor, enemy, damage, false, isMagic, magicType, result); return result; } diff --git a/Entity/Skill/NormalAttack.cs b/Entity/Skill/NormalAttack.cs index 8484c00..eb79d22 100644 --- a/Entity/Skill/NormalAttack.cs +++ b/Entity/Skill/NormalAttack.cs @@ -70,10 +70,7 @@ namespace Milimoe.FunGame.Core.Entity queue.WriteLine("[ " + Character + $" ] 对 [ {enemy} ] 发起了普通攻击!"); double expected = Damage; DamageResult result = IsMagic ? queue.CalculateMagicalDamage(attacker, enemy, true, MagicType, expected, out double damage) : queue.CalculatePhysicalDamage(attacker, enemy, true, expected, out damage); - if (result != DamageResult.Evaded) - { - queue.DamageToEnemy(attacker, enemy, damage, true, IsMagic, MagicType, result == DamageResult.Critical); - } + queue.DamageToEnemy(attacker, enemy, damage, true, IsMagic, MagicType, result); } }