明确闪避只能闪避普通攻击;最低硬直修改为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;
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
/// <param name="isNormalAttack"></param>
/// <param name="isMagicDamage"></param>
/// <param name="magicType"></param>
/// <param name="isCritical"></param>
public void DamageToEnemy(Character actor, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage = false, MagicType magicType = MagicType.None, bool isCritical = false)
/// <param name="damageResult"></param>
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<Character> 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<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;
}
}
}
@ -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<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
{
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); // 暴击伤害倍率加成

View File

@ -180,7 +180,19 @@ namespace Milimoe.FunGame.Core.Entity
/// <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>
/// 初始魔法值 [ 初始设定 ]
@ -211,7 +223,19 @@ namespace Milimoe.FunGame.Core.Entity
/// <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>
/// 当前爆发能量 [ 战斗相关 ]
@ -690,6 +714,16 @@ namespace Milimoe.FunGame.Core.Entity
/// </summary>
private int _Level = 1;
/// <summary>
/// 生命值
/// </summary>
private double _HP = 0;
/// <summary>
/// 魔法值
/// </summary>
private double _MP = 0;
/// <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>

View File

@ -142,8 +142,8 @@ namespace Milimoe.FunGame.Core.Entity
/// <param name="isNormalAttack"></param>
/// <param name="isMagicDamage"></param>
/// <param name="magicType"></param>
/// <param name="isCritical"></param>
public virtual void AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, bool isCritical)
/// <param name="damageResult"></param>
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="isMagicDamage"></param>
/// <param name="magicType"></param>
/// <param name="isCritical"></param>
public virtual void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, bool isCritical)
/// <param name="damageResult"></param>
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;
}

View File

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