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);
}
}