mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-04-23 04:29:36 +08:00
明确闪避只能闪避普通攻击;最低硬直修改为0;优化闪避逻辑,以便触发特效
This commit is contained in:
parent
700db8e694
commit
72da63b30c
@ -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); // 暴击伤害倍率加成
|
||||||
|
@ -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>
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user