diff --git a/Entity/Skill/Effect.cs b/Entity/Skill/Effect.cs
index a0e4154..7e01802 100644
--- a/Entity/Skill/Effect.cs
+++ b/Entity/Skill/Effect.cs
@@ -360,11 +360,12 @@ namespace Milimoe.FunGame.Core.Entity
///
///
///
+ ///
///
///
///
///
- public virtual void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
+ public virtual void AfterDamageCalculation(Character character, Character enemy, double damage, double actualDamage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
}
diff --git a/Library/Constant/ResultEnum.cs b/Library/Constant/ResultEnum.cs
index 3a82c98..b3930de 100644
--- a/Library/Constant/ResultEnum.cs
+++ b/Library/Constant/ResultEnum.cs
@@ -62,7 +62,9 @@ namespace Milimoe.FunGame.Core.Library.Constant
{
Normal,
Critical,
- Evaded
+ Evaded,
+ Shield,
+ Immune
}
public enum RedeemResult
diff --git a/Model/GamingQueue.cs b/Model/GamingQueue.cs
index 2892155..00f6f3b 100644
--- a/Model/GamingQueue.cs
+++ b/Model/GamingQueue.cs
@@ -1132,6 +1132,7 @@ namespace Milimoe.FunGame.Core.Model
}
else if (type == CharacterActionType.EndTurn)
{
+ baseTime = 3;
decided = true;
WriteLine($"[ {character} ] 结束了回合!");
await OnCharacterDoNothingAsync(character);
@@ -1183,8 +1184,8 @@ namespace Milimoe.FunGame.Core.Model
LastRound.CastTime = newHardnessTime;
}
AddCharacter(character, newHardnessTime, isCheckProtected);
- await OnQueueUpdatedAsync(_queue, character, newHardnessTime, QueueUpdatedReason.Action, "设置角色行动后的硬直时间。");
LastRound.HardnessTime = newHardnessTime;
+ await OnQueueUpdatedAsync(_queue, character, newHardnessTime, QueueUpdatedReason.Action, "设置角色行动后的硬直时间。");
effects = [.. character.Effects];
foreach (Effect effect in effects)
@@ -1340,8 +1341,10 @@ namespace Milimoe.FunGame.Core.Model
return;
}
+ // 不管有没有暴击,都尝试往回合记录中添加目标,不暴击时不会修改原先值
if (!LastRound.IsCritical.TryAdd(enemy, damageResult == DamageResult.Critical) && damageResult == DamageResult.Critical)
{
+ // 暴击了修改目标对应的值为 true
LastRound.IsCritical[enemy] = true;
}
@@ -1359,6 +1362,7 @@ namespace Milimoe.FunGame.Core.Model
}
}
damage += totalDamageBonus.Sum(kv => kv.Value);
+ double actualDamage = damage;
// 闪避了就没伤害了
if (damageResult != DamageResult.Evaded)
@@ -1402,6 +1406,7 @@ namespace Milimoe.FunGame.Core.Model
if (isImmune)
{
// 免疫
+ damageResult = DamageResult.Immune;
LastRound.IsImmune[enemy] = true;
WriteLine($"[ {enemy} ] 免疫了此伤害!");
}
@@ -1448,21 +1453,31 @@ namespace Milimoe.FunGame.Core.Model
{
enemy.HP -= remain;
shieldMsg = $"(护盾抵消了 {shield:0.##} 点并破碎,角色承受了 {remain:0.##} 点)";
+ actualDamage = remain;
}
else
{
shieldMsg = $"(护盾抵消了 {shield:0.##} 点并破碎,角色没有承受伤害)";
+ damageResult = DamageResult.Shield;
+ actualDamage = 0;
}
}
else
{
enemy.Shield[isMagicDamage, magicType] = remain;
shieldMsg = $"(护盾抵消了 {damage:0.##} 点,剩余可用 {remain:0.##} 点)";
+ damageResult = DamageResult.Shield;
+ actualDamage = 0;
}
}
- else if (shieldMsg.Trim() == "")
+ else
{
- shieldMsg = $"(护盾已使其无效化)";
+ if (shieldMsg.Trim() == "")
+ {
+ shieldMsg = $"(护盾已使其无效化)";
+ }
+ damageResult = DamageResult.Shield;
+ actualDamage = 0;
}
}
else enemy.HP -= damage;
@@ -1474,7 +1489,7 @@ namespace Milimoe.FunGame.Core.Model
}
else WriteLine($"[ {enemy} ] 受到了 {damage:0.##} 点物理伤害!{shieldMsg}");
- // 生命偷取
+ // 生命偷取,攻击者为全额
double steal = damage * actor.Lifesteal;
await HealToTargetAsync(actor, actor, steal, false);
effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
@@ -1483,7 +1498,7 @@ namespace Milimoe.FunGame.Core.Model
effect.AfterLifesteal(actor, enemy, damage, steal);
}
- // 造成伤害和受伤都可以获得能量
+ // 造成伤害和受伤都可以获得能量。攻击者为全额,被攻击者为 actualDamage,护盾抵消的伤害不算
double ep = GetEP(damage, GameplayEquilibriumConstant.DamageGetEPFactor, GameplayEquilibriumConstant.DamageGetEPMax);
effects = [.. actor.Effects.Where(e => e.IsInEffect)];
foreach (Effect effect in effects)
@@ -1491,7 +1506,7 @@ namespace Milimoe.FunGame.Core.Model
effect.AlterEPAfterDamage(actor, ref ep);
}
actor.EP += ep;
- ep = GetEP(damage, GameplayEquilibriumConstant.TakenDamageGetEPFactor, GameplayEquilibriumConstant.TakenDamageGetEPMax);
+ ep = GetEP(actualDamage, GameplayEquilibriumConstant.TakenDamageGetEPFactor, GameplayEquilibriumConstant.TakenDamageGetEPMax);
effects = [.. enemy.Effects.Where(e => e.IsInEffect)];
foreach (Effect effect in effects)
{
@@ -1500,7 +1515,7 @@ namespace Milimoe.FunGame.Core.Model
enemy.EP += ep;
// 统计伤害
- CalculateCharacterDamageStatistics(actor, enemy, damage, isMagicDamage);
+ CalculateCharacterDamageStatistics(actor, enemy, damage, isMagicDamage, actualDamage);
// 计算助攻
_assistDetail[actor][enemy, TotalTime] += damage;
@@ -1511,12 +1526,12 @@ namespace Milimoe.FunGame.Core.Model
LastRound.IsEvaded[enemy] = true;
}
- await OnDamageToEnemyAsync(actor, enemy, damage, isNormalAttack, isMagicDamage, magicType, damageResult);
+ await OnDamageToEnemyAsync(actor, enemy, damage, actualDamage, isNormalAttack, isMagicDamage, magicType, damageResult);
effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
foreach (Effect effect in effects)
{
- effect.AfterDamageCalculation(actor, enemy, damage, isNormalAttack, isMagicDamage, magicType, damageResult);
+ effect.AfterDamageCalculation(actor, enemy, damage, actualDamage, isNormalAttack, isMagicDamage, magicType, damageResult);
}
if (enemy.HP <= 0 && !_eliminated.Contains(enemy) && !_respawnCountdown.ContainsKey(enemy))
@@ -1639,6 +1654,7 @@ namespace Milimoe.FunGame.Core.Model
if (assist != killer)
{
if (!_earnedMoney.TryAdd(assist, cmoney)) _earnedMoney[assist] += cmoney;
+ assist.User.Inventory.Credits += cmoney;
_stats[assist].Assists += 1;
}
else
@@ -1708,6 +1724,7 @@ namespace Milimoe.FunGame.Core.Model
}
if (!_earnedMoney.TryAdd(killer, money)) _earnedMoney[killer] += money;
+ killer.User.Inventory.Credits += money;
await OnDeathCalculation(death, killer);
@@ -2635,8 +2652,9 @@ namespace Milimoe.FunGame.Core.Model
///
/// 计算角色的数据
///
- public void CalculateCharacterDamageStatistics(Character character, Character characterTaken, double damage, bool isMagic)
+ public void CalculateCharacterDamageStatistics(Character character, Character characterTaken, double damage, bool isMagic, double takenDamage = -1)
{
+ if (takenDamage == -1) takenDamage = damage;
if (_stats.TryGetValue(character, out CharacterStatistics? stats) && stats != null)
{
if (isMagic)
@@ -2653,13 +2671,13 @@ namespace Milimoe.FunGame.Core.Model
{
if (isMagic)
{
- statsTaken.TotalTakenMagicDamage = Calculation.Round2Digits(statsTaken.TotalTakenMagicDamage + damage);
+ statsTaken.TotalTakenMagicDamage = Calculation.Round2Digits(statsTaken.TotalTakenMagicDamage + takenDamage);
}
else
{
- statsTaken.TotalTakenPhysicalDamage = Calculation.Round2Digits(statsTaken.TotalTakenPhysicalDamage + damage);
+ statsTaken.TotalTakenPhysicalDamage = Calculation.Round2Digits(statsTaken.TotalTakenPhysicalDamage + takenDamage);
}
- statsTaken.TotalTakenDamage = Calculation.Round2Digits(statsTaken.TotalTakenDamage + damage);
+ statsTaken.TotalTakenDamage = Calculation.Round2Digits(statsTaken.TotalTakenDamage + takenDamage);
}
if (LastRound.Damages.TryGetValue(characterTaken, out double damageTotal))
{
@@ -2912,7 +2930,7 @@ namespace Milimoe.FunGame.Core.Model
await (HealToTarget?.Invoke(this, actor, target, heal, isRespawn) ?? Task.CompletedTask);
}
- public delegate Task DamageToEnemyEventHandler(GamingQueue queue, Character actor, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult);
+ public delegate Task DamageToEnemyEventHandler(GamingQueue queue, Character actor, Character enemy, double damage, double actualDamage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult);
///
/// 造成伤害事件
///
@@ -2923,14 +2941,15 @@ namespace Milimoe.FunGame.Core.Model
///
///
///
+ ///
///
///
///
///
///
- protected async Task OnDamageToEnemyAsync(Character actor, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
+ protected async Task OnDamageToEnemyAsync(Character actor, Character enemy, double damage, double actualDamage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
- await (DamageToEnemy?.Invoke(this, actor, enemy, damage, isNormalAttack, isMagicDamage, magicType, damageResult) ?? Task.CompletedTask);
+ await (DamageToEnemy?.Invoke(this, actor, enemy, damage, actualDamage, isNormalAttack, isMagicDamage, magicType, damageResult) ?? Task.CompletedTask);
}
public delegate Task CharacterNormalAttackEventHandler(GamingQueue queue, Character actor, List targets);