明确闪避只能闪避普通攻击;最低硬直修改为0;优化闪避逻辑,以便触发特效

This commit is contained in:
milimoe 2024-09-11 00:32:44 +08:00
parent 700db8e694
commit 72da63b30c
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
4 changed files with 129 additions and 58 deletions

View File

@ -535,12 +535,12 @@ namespace Milimoe.FunGame.Core.Api.Utility
double newHardnessTime = baseTime; double newHardnessTime = baseTime;
if (character.CharacterState != CharacterState.Casting) 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); WriteLine("[ " + character + " ] 回合结束,获得硬直时间: " + newHardnessTime);
} }
else else
{ {
newHardnessTime = Math.Max(1, Calculation.Round2Digits(baseTime * (1 - character.AccelerationCoefficient))); newHardnessTime = Math.Max(0, Calculation.Round2Digits(baseTime * (1 - character.AccelerationCoefficient)));
WriteLine("[ " + character + " ] 进行吟唱,持续时间: " + newHardnessTime); WriteLine("[ " + character + " ] 进行吟唱,持续时间: " + newHardnessTime);
} }
AddCharacter(character, newHardnessTime); AddCharacter(character, newHardnessTime);
@ -686,44 +686,49 @@ namespace Milimoe.FunGame.Core.Api.Utility
/// <param name="isNormalAttack"></param> /// <param name="isNormalAttack"></param>
/// <param name="isMagicDamage"></param> /// <param name="isMagicDamage"></param>
/// <param name="magicType"></param> /// <param name="magicType"></param>
/// <param name="isCritical"></param> /// <param name="damageResult"></param>
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()) 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); _assistDamage[actor][enemy] += damage;
foreach (Effect effect in actor.Effects)
{ // 造成伤害和受伤都可以获得能量
effect.AlterEPAfterDamage(actor, ref ep); 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()) 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); DeathCalculation(actor, enemy);
// 给所有角色的特效广播角色死亡结算 // 给所有角色的特效广播角色死亡结算
@ -767,20 +772,23 @@ namespace Milimoe.FunGame.Core.Api.Utility
} }
double dice = new Random().NextDouble(); double dice = new Random().NextDouble();
// 闪避判定 if (isNormalAttack)
if (dice < enemy.EvadeRate)
{ {
finalDamage = 0; // 闪避判定
List<Character> characters = [actor, enemy]; if (dice < enemy.EvadeRate)
bool isAlterEvaded = false;
foreach (Effect effect in characters.SelectMany(c => c.Effects.Where(e => e.Level > 0).ToList()))
{ {
isAlterEvaded = effect.OnEvadedTriggered(actor, enemy, dice); finalDamage = 0;
} List<Character> characters = [actor, enemy];
if (!isAlterEvaded) bool isAlterEvaded = false;
{ foreach (Effect effect in characters.SelectMany(c => c.Effects.Where(e => e.Level > 0).ToList()))
WriteLine("此物理攻击被完美闪避了!"); {
return DamageResult.Evaded; 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); effect.AlterExpectedDamageBeforeCalculation(actor, enemy, ref expectedDamage, isNormalAttack, true, magicType);
} }
double dice = new Random().NextDouble();
if (isNormalAttack)
{
// 闪避判定
if (dice < enemy.EvadeRate)
{
finalDamage = 0;
List<Character> 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 MagicResistance magicResistance = magicType switch
{ {
MagicType.Starmark => enemy.MDF.Starmark, MagicType.Starmark => enemy.MDF.Starmark,
@ -847,7 +876,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
finalDamage = Calculation.Round2Digits(expectedDamage * (1 - MDF)); finalDamage = Calculation.Round2Digits(expectedDamage * (1 - MDF));
// 暴击判定 // 暴击判定
double dice = new Random().NextDouble(); dice = new Random().NextDouble();
if (dice < actor.CritRate) if (dice < actor.CritRate)
{ {
finalDamage = Calculation.Round2Digits(finalDamage * actor.CritDMG); // 暴击伤害倍率加成 finalDamage = Calculation.Round2Digits(finalDamage * actor.CritDMG); // 暴击伤害倍率加成

View File

@ -180,7 +180,19 @@ namespace Milimoe.FunGame.Core.Entity
/// <summary> /// <summary>
/// 当前生命值 [ 战斗相关 ] /// 当前生命值 [ 战斗相关 ]
/// </summary> /// </summary>
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;
}
}
/// <summary> /// <summary>
/// 初始魔法值 [ 初始设定 ] /// 初始魔法值 [ 初始设定 ]
@ -211,7 +223,19 @@ namespace Milimoe.FunGame.Core.Entity
/// <summary> /// <summary>
/// 当前魔法值 [ 战斗相关 ] /// 当前魔法值 [ 战斗相关 ]
/// </summary> /// </summary>
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;
}
}
/// <summary> /// <summary>
/// 当前爆发能量 [ 战斗相关 ] /// 当前爆发能量 [ 战斗相关 ]
@ -690,6 +714,16 @@ namespace Milimoe.FunGame.Core.Entity
/// </summary> /// </summary>
private int _Level = 1; private int _Level = 1;
/// <summary>
/// 生命值
/// </summary>
private double _HP = 0;
/// <summary>
/// 魔法值
/// </summary>
private double _MP = 0;
/// <summary> /// <summary>
/// 能量值 /// 能量值
/// </summary> /// </summary>
@ -744,6 +778,21 @@ namespace Milimoe.FunGame.Core.Entity
} }
} }
/// <summary>
/// 按当前百分比回复状态(一般在属性变化时调用)
/// </summary>
/// <param name="pastHP"></param>
/// <param name="pastMP"></param>
/// <param name="pastMaxHP"></param>
/// <param name="pastMaxMP"></param>
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);
}
/// <summary> /// <summary>
/// 角色的属性发生变化,会影响特殊效果的计算 /// 角色的属性发生变化,会影响特殊效果的计算
/// </summary> /// </summary>

View File

@ -142,8 +142,8 @@ namespace Milimoe.FunGame.Core.Entity
/// <param name="isNormalAttack"></param> /// <param name="isNormalAttack"></param>
/// <param name="isMagicDamage"></param> /// <param name="isMagicDamage"></param>
/// <param name="magicType"></param> /// <param name="magicType"></param>
/// <param name="isCritical"></param> /// <param name="damageResult"></param>
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
/// <param name="isNormalAttack"></param> /// <param name="isNormalAttack"></param>
/// <param name="isMagicDamage"></param> /// <param name="isMagicDamage"></param>
/// <param name="magicType"></param> /// <param name="magicType"></param>
/// <param name="isCritical"></param> /// <param name="damageResult"></param>
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; 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); 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);
{
ActionQueue.DamageToEnemy(actor, enemy, damage, false, isMagic, magicType, result == DamageResult.Critical);
return result;
}
return result; return result;
} }

View File

@ -70,10 +70,7 @@ namespace Milimoe.FunGame.Core.Entity
queue.WriteLine("[ " + Character + $" ] 对 [ {enemy} ] 发起了普通攻击!"); queue.WriteLine("[ " + Character + $" ] 对 [ {enemy} ] 发起了普通攻击!");
double expected = Damage; double expected = Damage;
DamageResult result = IsMagic ? queue.CalculateMagicalDamage(attacker, enemy, true, MagicType, expected, out double damage) : queue.CalculatePhysicalDamage(attacker, enemy, true, expected, out 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);
{
queue.DamageToEnemy(attacker, enemy, damage, true, IsMagic, MagicType, result == DamageResult.Critical);
}
} }
} }