From 6bf3bb09a96556497519d544c4c9413609416558 Mon Sep 17 00:00:00 2001
From: milimoe <110188673+milimoe@users.noreply.github.com>
Date: Thu, 19 Jun 2025 21:20:53 +0800
Subject: [PATCH] =?UTF-8?q?=E5=BA=95=E5=B1=82=E6=94=AF=E6=8C=81=E7=9C=9F?=
=?UTF-8?q?=E5=AE=9E=E4=BC=A4=E5=AE=B3=20(#141)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Entity/Character/Character.cs | 52 ++-
Entity/Character/Shield.cs | 2 +-
Entity/Skill/Effect.cs | 45 ++-
Entity/Skill/NormalAttack.cs | 2 +-
Entity/Statistics/CharacterStatistics.cs | 8 +-
Entity/Statistics/GameStatistics.cs | 41 +--
Entity/Statistics/UserStatistics.cs | 8 +-
Interface/Base/IGamingQueue.cs | 14 +-
Library/Constant/ConstantSet.cs | 10 +
Library/Constant/TypeEnum.cs | 11 +-
Model/GamingQueue.cs | 448 +++++++++++++----------
11 files changed, 378 insertions(+), 263 deletions(-)
diff --git a/Entity/Character/Character.cs b/Entity/Character/Character.cs
index 5c368ec..229940e 100644
--- a/Entity/Character/Character.cs
+++ b/Entity/Character/Character.cs
@@ -129,9 +129,13 @@ namespace Milimoe.FunGame.Core.Entity
}
set
{
+ int past = _Level;
_Level = Math.Min(Math.Max(1, value), GameplayEquilibriumConstant.MaxLevel);
- OnAttributeChanged();
- Recovery();
+ if (past != _Level)
+ {
+ OnAttributeChanged();
+ Recovery();
+ }
}
}
@@ -900,8 +904,8 @@ namespace Milimoe.FunGame.Core.Entity
{
if (time > 0)
{
- HP = Math.Min(MaxHP, HP + HR * time);
- MP = Math.Min(MaxMP, MP + MR * time);
+ HP += HR * time;
+ MP += MR * time;
if (EP != -1) this.EP = EP;
}
}
@@ -915,10 +919,16 @@ namespace Milimoe.FunGame.Core.Entity
///
public void Recovery(double pastHP, double pastMP, double pastMaxHP, double pastMaxMP)
{
- double pHP = pastHP / pastMaxHP;
- double pMP = pastMP / pastMaxMP;
- HP = MaxHP * pHP;
- MP = MaxMP * pMP;
+ if (pastHP > 0 && pastMaxHP > 0)
+ {
+ double pHP = pastHP / pastMaxHP;
+ HP = MaxHP * pHP;
+ }
+ if (pastMP > 0 && pastMaxMP > 0)
+ {
+ double pMP = pastMP / pastMaxMP;
+ MP = MaxMP * pMP;
+ }
}
///
@@ -1147,6 +1157,32 @@ namespace Milimoe.FunGame.Core.Entity
return result;
}
+ ///
+ /// 设置角色等级,并默认完全回复状态
+ ///
+ /// 新的等级
+ /// false 为按百分比回复
+ public void SetLevel(int level, bool recovery = true)
+ {
+ if (!recovery)
+ {
+ double pastHP = HP;
+ double pastMP = MP;
+ double pastMaxHP = MaxHP;
+ double pastMaxMP = MaxMP;
+ int pastLevel = Level;
+ Level = level;
+ if (pastLevel != Level)
+ {
+ Recovery(pastHP, pastMP, pastMaxHP, pastMaxMP);
+ }
+ }
+ else
+ {
+ Level = level;
+ }
+ }
+
///
/// 角色升级
///
diff --git a/Entity/Character/Shield.cs b/Entity/Character/Shield.cs
index 8901f35..96374ba 100644
--- a/Entity/Character/Shield.cs
+++ b/Entity/Character/Shield.cs
@@ -154,7 +154,7 @@ namespace Milimoe.FunGame.Core.Entity
{
ShieldOfEffects[soe.Effect] = soe;
}
-
+
///
/// 移除某个特效的护盾
///
diff --git a/Entity/Skill/Effect.cs b/Entity/Skill/Effect.cs
index e02cc55..15b4a71 100644
--- a/Entity/Skill/Effect.cs
+++ b/Entity/Skill/Effect.cs
@@ -59,7 +59,7 @@ namespace Milimoe.FunGame.Core.Entity
/// 附属于某个特效
///
public Effect? ParentEffect { get; set; } = null;
-
+
///
/// 是否是某个特效的附属
///
@@ -218,9 +218,9 @@ namespace Milimoe.FunGame.Core.Entity
///
///
///
- ///
+ ///
///
- public virtual void AlterDamageTypeBeforeCalculation(Character character, Character enemy, ref bool isNormalAttack, ref bool isMagicDamage, ref MagicType magicType)
+ public virtual void AlterDamageTypeBeforeCalculation(Character character, Character enemy, ref bool isNormalAttack, ref DamageType damageType, ref MagicType magicType)
{
}
@@ -232,11 +232,11 @@ namespace Milimoe.FunGame.Core.Entity
///
///
///
- ///
+ ///
///
///
/// 返回伤害增减值
- public virtual double AlterExpectedDamageBeforeCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, Dictionary totalDamageBonus)
+ public virtual double AlterExpectedDamageBeforeCalculation(Character character, Character enemy, double damage, bool isNormalAttack, DamageType damageType, MagicType magicType, Dictionary totalDamageBonus)
{
return 0;
}
@@ -248,13 +248,13 @@ namespace Milimoe.FunGame.Core.Entity
///
///
///
- ///
+ ///
///
///
///
///
/// 返回伤害增减值
- public virtual double AlterActualDamageAfterCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult, ref bool isEvaded, Dictionary totalDamageBonus)
+ public virtual double AlterActualDamageAfterCalculation(Character character, Character enemy, double damage, bool isNormalAttack, DamageType damageType, MagicType magicType, DamageResult damageResult, ref bool isEvaded, Dictionary totalDamageBonus)
{
return 0;
}
@@ -335,7 +335,7 @@ namespace Milimoe.FunGame.Core.Entity
}
///
- /// 对目标触发技能效果
+ /// 对目标触发技能效果(局外)
///
///
///
@@ -363,10 +363,10 @@ namespace Milimoe.FunGame.Core.Entity
///
///
///
- ///
+ ///
///
///
- public virtual void AfterDamageCalculation(Character character, Character enemy, double damage, double actualDamage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
+ public virtual void AfterDamageCalculation(Character character, Character enemy, double damage, double actualDamage, bool isNormalAttack, DamageType damageType, MagicType magicType, DamageResult damageResult)
{
}
@@ -656,13 +656,13 @@ namespace Milimoe.FunGame.Core.Entity
///
///
///
- ///
+ ///
///
///
///
///
/// 返回 false 可以跳过护盾结算
- public virtual bool BeforeShieldCalculation(Character character, Character attacker, bool isMagic, MagicType magicType, double damage, ref double damageReduce, ref string message)
+ public virtual bool BeforeShieldCalculation(Character character, Character attacker, DamageType damageType, MagicType magicType, double damage, ref double damageReduce, ref string message)
{
return true;
}
@@ -672,11 +672,11 @@ namespace Milimoe.FunGame.Core.Entity
///
///
///
- ///
+ ///
///
///
///
- public virtual void OnShieldNeutralizeDamage(Character character, Character attacker, bool isMagic, MagicType magicType, double damage, ShieldType shieldType)
+ public virtual void OnShieldNeutralizeDamage(Character character, Character attacker, DamageType damageType, MagicType magicType, double damage, ShieldType shieldType)
{
}
@@ -726,11 +726,11 @@ namespace Milimoe.FunGame.Core.Entity
///
///
///
- ///
+ ///
///
///
/// false:免疫检定不通过
- public virtual bool OnDamageImmuneCheck(Character actor, Character enemy, bool isNormalAttack, bool isMagic, MagicType magicType, double damage)
+ public virtual bool OnDamageImmuneCheck(Character actor, Character enemy, bool isNormalAttack, DamageType damageType, MagicType magicType, double damage)
{
return true;
}
@@ -740,16 +740,21 @@ namespace Milimoe.FunGame.Core.Entity
///
///
///
- ///
+ ///
///
///
///
- public DamageResult DamageToEnemy(Character actor, Character enemy, bool isMagic, MagicType magicType, double expectedDamage)
+ public DamageResult DamageToEnemy(Character actor, Character enemy, DamageType damageType, MagicType magicType, double expectedDamage)
{
if (GamingQueue is null) return DamageResult.Evaded;
int changeCount = 0;
- DamageResult result = !isMagic ? GamingQueue.CalculatePhysicalDamage(actor, enemy, false, expectedDamage, out double damage, ref changeCount) : GamingQueue.CalculateMagicalDamage(actor, enemy, false, MagicType, expectedDamage, out damage, ref changeCount);
- GamingQueue.DamageToEnemyAsync(actor, enemy, damage, false, isMagic, magicType, result);
+ DamageResult result = DamageResult.Normal;
+ double damage = expectedDamage;
+ if (damageType != DamageType.True)
+ {
+ result = damageType == DamageType.Physical ? GamingQueue.CalculatePhysicalDamage(actor, enemy, false, expectedDamage, out damage, ref changeCount) : GamingQueue.CalculateMagicalDamage(actor, enemy, false, MagicType, expectedDamage, out damage, ref changeCount);
+ }
+ GamingQueue.DamageToEnemyAsync(actor, enemy, damage, false, damageType, magicType, result);
return result;
}
diff --git a/Entity/Skill/NormalAttack.cs b/Entity/Skill/NormalAttack.cs
index a4f3bfe..e0f13f9 100644
--- a/Entity/Skill/NormalAttack.cs
+++ b/Entity/Skill/NormalAttack.cs
@@ -181,7 +181,7 @@ namespace Milimoe.FunGame.Core.Entity
double expected = Damage;
int changeCount = 0;
DamageResult result = IsMagic ? queue.CalculateMagicalDamage(attacker, enemy, true, MagicType, expected, out double damage, ref changeCount) : queue.CalculatePhysicalDamage(attacker, enemy, true, expected, out damage, ref changeCount);
- queue.DamageToEnemyAsync(attacker, enemy, damage, true, IsMagic, MagicType, result);
+ queue.DamageToEnemyAsync(attacker, enemy, damage, true, IsMagic ? DamageType.Magical : DamageType.Physical, MagicType, result);
}
}
}
diff --git a/Entity/Statistics/CharacterStatistics.cs b/Entity/Statistics/CharacterStatistics.cs
index 95211e2..2334b86 100644
--- a/Entity/Statistics/CharacterStatistics.cs
+++ b/Entity/Statistics/CharacterStatistics.cs
@@ -5,19 +5,19 @@
public double TotalDamage { get; set; } = 0;
public double TotalPhysicalDamage { get; set; } = 0;
public double TotalMagicDamage { get; set; } = 0;
- public double TotalRealDamage { get; set; } = 0;
+ public double TotalTrueDamage { get; set; } = 0;
public double TotalTakenDamage { get; set; } = 0;
public double TotalTakenPhysicalDamage { get; set; } = 0;
public double TotalTakenMagicDamage { get; set; } = 0;
- public double TotalTakenRealDamage { get; set; } = 0;
+ public double TotalTakenTrueDamage { get; set; } = 0;
public double AvgDamage { get; set; } = 0;
public double AvgPhysicalDamage { get; set; } = 0;
public double AvgMagicDamage { get; set; } = 0;
- public double AvgRealDamage { get; set; } = 0;
+ public double AvgTrueDamage { get; set; } = 0;
public double AvgTakenDamage { get; set; } = 0;
public double AvgTakenPhysicalDamage { get; set; } = 0;
public double AvgTakenMagicDamage { get; set; } = 0;
- public double AvgTakenRealDamage { get; set; } = 0;
+ public double AvgTakenTrueDamage { get; set; } = 0;
public double TotalHeal { get; set; } = 0;
public double AvgHeal { get; set; } = 0;
public double TotalShield { get; set; } = 0;
diff --git a/Entity/Statistics/GameStatistics.cs b/Entity/Statistics/GameStatistics.cs
index f9b321d..d851dad 100644
--- a/Entity/Statistics/GameStatistics.cs
+++ b/Entity/Statistics/GameStatistics.cs
@@ -1,15 +1,15 @@
namespace Milimoe.FunGame.Core.Entity
{
- public class GameStatistics
+ public class GameStatistics(Room Room)
{
public long Id => Room.Id;
- public Room Room { get; }
+ public Room Room { get; } = Room;
public DateTime RecordTime { get; set; } = DateTime.Now;
public string Record { get; set; } = "";
- public Dictionary DamageStats { get; set; } = new();
- public Dictionary PhysicalDamageStats { get; } = new();
- public Dictionary MagicDamageStats { get; } = new();
- public Dictionary RealDamageStats { get; } = new();
+ public Dictionary DamageStats { get; set; } = [];
+ public Dictionary PhysicalDamageStats { get; } = [];
+ public Dictionary MagicDamageStats { get; } = [];
+ public Dictionary TrueDamageStats { get; } = [];
public double AvgDamageStats
{
get
@@ -46,30 +46,25 @@
return Math.Round(total / MagicDamageStats.Count, 2);
}
}
- public double AvgRealDamageStats
+ public double AvgTrueDamageStats
{
get
{
double total = 0;
- foreach (User user in RealDamageStats.Keys)
+ foreach (User user in TrueDamageStats.Keys)
{
- total += RealDamageStats[user];
+ total += TrueDamageStats[user];
}
- return Math.Round(total / RealDamageStats.Count, 2);
+ return Math.Round(total / TrueDamageStats.Count, 2);
}
}
- public Dictionary KillStats { get; } = new();
- public Dictionary> KillDetailStats { get; } = new(); // 子字典记录的是被击杀者以及被击杀次数
- public Dictionary DeathStats { get; } = new();
- public Dictionary> DeathDetailStats { get; } = new(); // 子字典记录的是击杀者以及击杀次数
- public Dictionary AssistStats { get; } = new();
- public Dictionary RatingStats { get; } = new(); // 结算后的Rating
- public Dictionary EloStats { get; } = new(); // Elo分数变化(+/-)
- public Dictionary RankStats { get; } = new(); // 结算后的Rank(非比赛前)
-
- public GameStatistics(Room Room)
- {
- this.Room = Room;
- }
+ public Dictionary KillStats { get; } = [];
+ public Dictionary> KillDetailStats { get; } = []; // 子字典记录的是被击杀者以及被击杀次数
+ public Dictionary DeathStats { get; } = [];
+ public Dictionary> DeathDetailStats { get; } = []; // 子字典记录的是击杀者以及击杀次数
+ public Dictionary AssistStats { get; } = [];
+ public Dictionary RatingStats { get; } = []; // 结算后的Rating
+ public Dictionary EloStats { get; } = []; // Elo分数变化(+/-)
+ public Dictionary RankStats { get; } = []; // 结算后的Rank(非比赛前)
}
}
diff --git a/Entity/Statistics/UserStatistics.cs b/Entity/Statistics/UserStatistics.cs
index c10f97b..30ac502 100644
--- a/Entity/Statistics/UserStatistics.cs
+++ b/Entity/Statistics/UserStatistics.cs
@@ -11,7 +11,7 @@ namespace Milimoe.FunGame.Core.Entity
public Dictionary DamageStats { get; } = [];
public Dictionary PhysicalDamageStats { get; } = [];
public Dictionary MagicDamageStats { get; } = [];
- public Dictionary RealDamageStats { get; } = [];
+ public Dictionary TrueDamageStats { get; } = [];
public Dictionary AvgDamageStats
{
get
@@ -66,7 +66,7 @@ namespace Milimoe.FunGame.Core.Entity
return avgdamage;
}
}
- public Dictionary AvgRealDamageStats
+ public Dictionary AvgTrueDamageStats
{
get
{
@@ -75,9 +75,9 @@ namespace Milimoe.FunGame.Core.Entity
{
long plays = Plays[key];
double total = 0;
- if (RealDamageStats.ContainsKey(key))
+ if (TrueDamageStats.ContainsKey(key))
{
- total = RealDamageStats.Values.Sum();
+ total = TrueDamageStats.Values.Sum();
}
avgdamage.Add(key, Math.Round(total / plays, 2));
}
diff --git a/Interface/Base/IGamingQueue.cs b/Interface/Base/IGamingQueue.cs
index a21db75..bdc97af 100644
--- a/Interface/Base/IGamingQueue.cs
+++ b/Interface/Base/IGamingQueue.cs
@@ -79,10 +79,10 @@ namespace Milimoe.FunGame.Core.Interface.Base
///
///
///
- ///
+ ///
///
///
- public Task DamageToEnemyAsync(Character actor, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage = false, MagicType magicType = MagicType.None, DamageResult damageResult = DamageResult.Normal);
+ public Task DamageToEnemyAsync(Character actor, Character enemy, double damage, bool isNormalAttack, DamageType damageType = DamageType.Physical, MagicType magicType = MagicType.None, DamageResult damageResult = DamageResult.Normal);
///
/// 治疗一个目标
@@ -198,5 +198,15 @@ namespace Milimoe.FunGame.Core.Interface.Base
/// 是否是百分比
/// 是否使用插队保护机制
public void ChangeCharacterHardnessTime(Character character, double addValue, bool isPercentage, bool isCheckProtected);
+
+ ///
+ /// 计算角色的数据
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void CalculateCharacterDamageStatistics(Character character, Character characterTaken, double damage, DamageType damageType, double takenDamage = -1);
}
}
diff --git a/Library/Constant/ConstantSet.cs b/Library/Constant/ConstantSet.cs
index db5a4fe..fd18c8b 100644
--- a/Library/Constant/ConstantSet.cs
+++ b/Library/Constant/ConstantSet.cs
@@ -455,6 +455,16 @@ namespace Milimoe.FunGame.Core.Library.Constant
_ => "★"
};
}
+
+ public static string GetDamageTypeName(DamageType damageType, MagicType magicType = MagicType.None)
+ {
+ return damageType switch
+ {
+ DamageType.Magical => GetMagicDamageName(magicType),
+ DamageType.True => "真实伤害",
+ _ => "物理伤害"
+ };
+ }
}
public class ItemSet
diff --git a/Library/Constant/TypeEnum.cs b/Library/Constant/TypeEnum.cs
index 828e18a..2e9e730 100644
--- a/Library/Constant/TypeEnum.cs
+++ b/Library/Constant/TypeEnum.cs
@@ -312,12 +312,12 @@ namespace Milimoe.FunGame.Core.Library.Constant
Poison,
///
- /// 燃烧,目标受到火焰伤害,持续一段时间
+ /// 燃烧,目标受到伤害,持续一段时间
///
Burn,
///
- /// 流血,目标持续受到物理伤害
+ /// 流血,目标持续受到伤害
///
Bleed,
@@ -1039,4 +1039,11 @@ namespace Milimoe.FunGame.Core.Library.Constant
Mix,
Effect
}
+
+ public enum DamageType
+ {
+ Physical,
+ Magical,
+ True
+ }
}
diff --git a/Model/GamingQueue.cs b/Model/GamingQueue.cs
index 5fc847c..e1e3ff2 100644
--- a/Model/GamingQueue.cs
+++ b/Model/GamingQueue.cs
@@ -130,7 +130,7 @@ namespace Milimoe.FunGame.Core.Model
/// 原始的角色字典
///
protected readonly Dictionary _original = [];
-
+
///
/// 当前的行动顺序
///
@@ -226,6 +226,11 @@ namespace Milimoe.FunGame.Core.Model
///
protected bool _isGameEnd = false;
+ ///
+ /// 是否在回合内
+ ///
+ protected bool _isInRound = false;
+
#endregion
#region 构造函数
@@ -537,7 +542,8 @@ namespace Milimoe.FunGame.Core.Model
TotalTime = Calculation.Round2Digits(TotalTime + timeToReduce);
WriteLine("时间流逝:" + timeToReduce);
- foreach (Character character in _queue)
+ Character[] characters = [.. _queue];
+ foreach (Character character in characters)
{
// 减少所有角色的硬直时间
_hardnessTimes[character] = Calculation.Round2Digits(_hardnessTimes[character] - timeToReduce);
@@ -635,15 +641,17 @@ namespace Milimoe.FunGame.Core.Model
if (effect.Durative)
{
- effect.RemainDuration -= timeToReduce;
- if (effect.RemainDuration <= 0)
+ if (effect.RemainDuration < timeToReduce)
{
+ // 移除特效前也完成剩余时间内的效果
+ effect.OnTimeElapsed(character, effect.RemainDuration);
effect.RemainDuration = 0;
character.Effects.Remove(effect);
effect.OnEffectLost(character);
}
else
{
+ effect.RemainDuration -= timeToReduce;
effect.OnTimeElapsed(character, timeToReduce);
}
}
@@ -688,11 +696,13 @@ namespace Milimoe.FunGame.Core.Model
/// 是否结束游戏
public async Task ProcessTurnAsync(Character character)
{
+ _isInRound = true;
LastRound.Actor = character;
_roundDeaths.Clear();
if (!await BeforeTurnAsync(character))
{
+ _isInRound = false;
return _isGameEnd;
}
@@ -723,6 +733,7 @@ namespace Milimoe.FunGame.Core.Model
// 如果事件全程接管回合操作,需要注意触发特效
if (!await OnTurnStartAsync(character, enemys, teammates, skills, items))
{
+ _isInRound = false;
return _isGameEnd;
}
@@ -806,7 +817,9 @@ namespace Milimoe.FunGame.Core.Model
}
else if (character.CharacterState == CharacterState.ActionRestricted)
{
- // 行动受限,只能使用特殊物品
+ // 行动受限,只能使用消耗品
+ items = [.. items.Where(i => i.ItemType == ItemType.Consumable)];
+ canUseItem = items.Count > 0;
if (canUseItem)
{
pCastSkill = 0;
@@ -1131,7 +1144,7 @@ namespace Milimoe.FunGame.Core.Model
{
decided = true;
LastRound.Item = item;
- baseTime = skill.RealHardnessTime;
+ baseTime = skill.RealHardnessTime > 0 ? skill.RealHardnessTime : 5;
effects = [.. character.Effects.Where(e => e.IsInEffect)];
foreach (Effect effect in effects)
{
@@ -1148,7 +1161,7 @@ namespace Milimoe.FunGame.Core.Model
character.CharacterState == CharacterState.BattleRestricted)
{
baseTime += 5;
- WriteLine($"角色 [ {character} ] 状态为:{CharacterSet.GetCharacterState(character.CharacterState)},放弃行动将额外获得 5 {GameplayEquilibriumConstant.InGameTime}硬直时间!");
+ WriteLine($"[ {character} ] {CharacterSet.GetCharacterState(character.CharacterState)},放弃行动将额外获得 5 {GameplayEquilibriumConstant.InGameTime}硬直时间!");
}
decided = true;
WriteLine($"[ {character} ] 结束了回合!");
@@ -1185,6 +1198,7 @@ namespace Milimoe.FunGame.Core.Model
await AfterTurnAsync(character);
+ _isInRound = false;
return _isGameEnd;
}
@@ -1242,6 +1256,7 @@ namespace Milimoe.FunGame.Core.Model
await AfterTurnAsync(character);
WriteLine("");
+ _isInRound = false;
return _isGameEnd;
}
@@ -1348,10 +1363,10 @@ namespace Milimoe.FunGame.Core.Model
///
///
///
- ///
+ ///
///
///
- public async Task DamageToEnemyAsync(Character actor, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage = false, MagicType magicType = MagicType.None, DamageResult damageResult = DamageResult.Normal)
+ public async Task DamageToEnemyAsync(Character actor, Character enemy, double damage, bool isNormalAttack, DamageType damageType = DamageType.Physical, MagicType magicType = MagicType.None, DamageResult damageResult = DamageResult.Normal)
{
// 如果敌人在结算伤害之前就已经死亡,将不会继续下去
if (enemy.HP <= 0)
@@ -1368,169 +1383,220 @@ namespace Milimoe.FunGame.Core.Model
List characters = [actor, enemy];
bool isEvaded = damageResult == DamageResult.Evaded;
- Dictionary totalDamageBonus = [];
- List effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
- foreach (Effect effect in effects)
+ List effects = [];
+
+ // 真实伤害跳过伤害加成区间
+ if (damageType != DamageType.True)
{
- double damageBonus = effect.AlterActualDamageAfterCalculation(actor, enemy, damage, isNormalAttack, isMagicDamage, magicType, damageResult, ref isEvaded, totalDamageBonus);
- totalDamageBonus[effect] = damageBonus;
- if (isEvaded)
+ Dictionary totalDamageBonus = [];
+ effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
+ foreach (Effect effect in effects)
{
- damageResult = DamageResult.Evaded;
+ double damageBonus = effect.AlterActualDamageAfterCalculation(actor, enemy, damage, isNormalAttack, damageType, magicType, damageResult, ref isEvaded, totalDamageBonus);
+ totalDamageBonus[effect] = damageBonus;
+ if (isEvaded)
+ {
+ damageResult = DamageResult.Evaded;
+ }
}
+ damage += totalDamageBonus.Sum(kv => kv.Value);
}
- damage += totalDamageBonus.Sum(kv => kv.Value);
double actualDamage = damage;
// 闪避了就没伤害了
if (damageResult != DamageResult.Evaded)
{
// 开始计算伤害免疫
- // 此变量为是否无视免疫
- bool ignore = false;
- // 技能免疫无法免疫普通攻击,但是魔法免疫和物理免疫可以
- bool isImmune = (isNormalAttack && (enemy.ImmuneType == ImmuneType.All || enemy.ImmuneType == ImmuneType.Physical || enemy.ImmuneType == ImmuneType.Magical)) ||
- (!isNormalAttack && (enemy.ImmuneType == ImmuneType.All || enemy.ImmuneType == ImmuneType.Physical || enemy.ImmuneType == ImmuneType.Magical || enemy.ImmuneType == ImmuneType.Skilled));
- if (isImmune)
+ bool isImmune = false;
+ // 真实伤害跳过免疫
+ if (damageType != DamageType.True)
{
- effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
- foreach (Effect effect in effects)
+ // 此变量为是否无视免疫
+ bool ignore = false;
+ // 技能免疫无法免疫普通攻击,但是魔法免疫和物理免疫可以
+ isImmune = (isNormalAttack && (enemy.ImmuneType == ImmuneType.All || enemy.ImmuneType == ImmuneType.Physical || enemy.ImmuneType == ImmuneType.Magical)) ||
+ (!isNormalAttack && (enemy.ImmuneType == ImmuneType.All || enemy.ImmuneType == ImmuneType.Physical || enemy.ImmuneType == ImmuneType.Magical || enemy.ImmuneType == ImmuneType.Skilled));
+ if (isImmune)
{
- if (isNormalAttack)
+ effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
+ foreach (Effect effect in effects)
{
- if (actor.NormalAttack.IgnoreImmune == ImmuneType.All ||
- (!isMagicDamage && actor.NormalAttack.IgnoreImmune == ImmuneType.Physical) ||
- (isMagicDamage && actor.NormalAttack.IgnoreImmune == ImmuneType.Magical) ||
- !effect.OnDamageImmuneCheck(actor, enemy, isNormalAttack, isMagicDamage, magicType, damage))
+ if (isNormalAttack)
{
- ignore = true;
+ if (actor.NormalAttack.IgnoreImmune == ImmuneType.All ||
+ (damageType == DamageType.Physical && actor.NormalAttack.IgnoreImmune == ImmuneType.Physical) ||
+ (damageType == DamageType.Magical && actor.NormalAttack.IgnoreImmune == ImmuneType.Magical) ||
+ !effect.OnDamageImmuneCheck(actor, enemy, isNormalAttack, damageType, magicType, damage))
+ {
+ ignore = true;
+ }
}
- }
- else
- {
- if (!effect.OnDamageImmuneCheck(actor, enemy, isNormalAttack, isMagicDamage, magicType, damage))
+ else
{
- ignore = true;
+ if (!effect.OnDamageImmuneCheck(actor, enemy, isNormalAttack, damageType, magicType, damage))
+ {
+ ignore = true;
+ }
}
}
}
+
+ if (ignore)
+ {
+ // 无视免疫
+ isImmune = false;
+ }
+
+ if (isImmune)
+ {
+ // 免疫
+ damageResult = DamageResult.Immune;
+ LastRound.IsImmune[enemy] = true;
+ WriteLine($"[ {enemy} ] 免疫了此伤害!");
+ actualDamage = 0;
+ }
}
- if (ignore)
- {
- // 无视免疫
- isImmune = false;
- }
-
- if (isImmune)
- {
- // 免疫
- damageResult = DamageResult.Immune;
- LastRound.IsImmune[enemy] = true;
- WriteLine($"[ {enemy} ] 免疫了此伤害!");
- actualDamage = 0;
- }
- else
+ // 继续计算伤害
+ if (!isImmune)
{
if (damage < 0) damage = 0;
- string damageType = isMagicDamage ? CharacterSet.GetMagicDamageName(magicType) : "物理伤害";
-
- // 在护盾结算前,特效可以有自己的逻辑
- bool change = false;
+ string damageTypeString = CharacterSet.GetDamageTypeName(damageType, magicType);
string shieldMsg = "";
- effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
- foreach (Effect effect in effects)
- {
- double damageReduce = 0;
- if (!effect.BeforeShieldCalculation(enemy, actor, isMagicDamage, magicType, damage, ref damageReduce, ref shieldMsg))
- {
- change = true;
- }
- if (damageReduce != 0)
- {
- actualDamage -= damageReduce;
- if (actualDamage < 0) actualDamage = 0;
- }
- }
- // 检查护盾
- if (!change)
+ // 真实伤害跳过护盾结算
+ if (damageType != DamageType.True)
{
- double remain = actualDamage;
-
- // 检查特效护盾
- effects = [.. enemy.Shield.ShieldOfEffects.Keys];
+ // 在护盾结算前,特效可以有自己的逻辑
+ bool change = false;
+ effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
foreach (Effect effect in effects)
{
- ShieldOfEffect soe = enemy.Shield.ShieldOfEffects[effect];
- if (soe.IsMagic == isMagicDamage && (!isMagicDamage || soe.MagicType == magicType) && soe.Shield > 0)
+ double damageReduce = 0;
+ if (!effect.BeforeShieldCalculation(enemy, actor, damageType, magicType, damage, ref damageReduce, ref shieldMsg))
{
- double effectShield = soe.Shield;
- // 判断护盾余额
- if (enemy.Shield.CalculateShieldOfEffect(effect, remain) > 0)
- {
- WriteLine($"[ {enemy} ] 发动了 [ {effect.Skill.Name} ] 的护盾效果,抵消了 {remain:0.##} 点{damageType}!");
- remain = 0;
- }
- else
- {
- WriteLine($"[ {enemy} ] 发动了 [ {effect.Skill.Name} ] 的护盾效果,抵消了 {effectShield:0.##} 点{damageType},护盾已破碎!");
- remain -= effectShield;
- Effect[] effects2 = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
- foreach (Effect effect2 in effects2)
- {
- if (!effect2.OnShieldBroken(enemy, actor, effect, remain))
- {
- WriteLine($"[ {(enemy.Effects.Contains(effect2) ? enemy : actor)} ] 因护盾破碎而发动了 [ {effect2.Skill.Name} ],化解了本次伤害!");
- remain = 0;
- }
- }
- }
- if (remain <= 0)
- {
- Effect[] effects2 = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
- foreach (Effect effect2 in effects2)
- {
- effect2.OnShieldNeutralizeDamage(enemy, actor, isMagicDamage, magicType, damage, ShieldType.Effect);
- }
- break;
- }
+ change = true;
+ }
+ if (damageReduce != 0)
+ {
+ actualDamage -= damageReduce;
+ if (actualDamage < 0) actualDamage = 0;
}
}
- // 如果伤害仍然大于0,继续检查护盾
- if (remain > 0)
+ // 检查护盾
+ if (!change)
{
- // 检查指定类型的护盾值
- double shield = enemy.Shield[isMagicDamage, magicType];
- if (shield > 0)
+ double remain = actualDamage;
+
+ // 检查特效护盾
+ effects = [.. enemy.Shield.ShieldOfEffects.Keys];
+ foreach (Effect effect in effects)
{
- shield -= remain;
- string shieldTypeString = isMagicDamage ? "魔法" : "物理";
- ShieldType shieldType = isMagicDamage ? ShieldType.Magical : ShieldType.Physical;
- if (shield > 0)
+ ShieldOfEffect soe = enemy.Shield.ShieldOfEffects[effect];
+ if (soe.IsMagic == (damageType == DamageType.Magical) && (damageType == DamageType.Physical || soe.MagicType == magicType) && soe.Shield > 0)
{
- WriteLine($"[ {enemy} ] 的{shieldTypeString}护盾抵消了 {remain:0.##} 点{damageType}!");
- enemy.Shield[isMagicDamage, magicType] -= remain;
- remain = 0;
- effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
- foreach (Effect effect in effects)
+ double effectShield = soe.Shield;
+ // 判断护盾余额
+ if (enemy.Shield.CalculateShieldOfEffect(effect, remain) > 0)
{
- effect.OnShieldNeutralizeDamage(enemy, actor, isMagicDamage, magicType, damage, shieldType);
+ WriteLine($"[ {enemy} ] 发动了 [ {effect.Skill.Name} ] 的护盾效果,抵消了 {remain:0.##} 点{damageTypeString}!");
+ remain = 0;
+ }
+ else
+ {
+ WriteLine($"[ {enemy} ] 发动了 [ {effect.Skill.Name} ] 的护盾效果,抵消了 {effectShield:0.##} 点{damageTypeString},护盾已破碎!");
+ remain -= effectShield;
+ Effect[] effects2 = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
+ foreach (Effect effect2 in effects2)
+ {
+ if (!effect2.OnShieldBroken(enemy, actor, effect, remain))
+ {
+ WriteLine($"[ {(enemy.Effects.Contains(effect2) ? enemy : actor)} ] 因护盾破碎而发动了 [ {effect2.Skill.Name} ],化解了本次伤害!");
+ remain = 0;
+ }
+ }
+ }
+ if (remain <= 0)
+ {
+ Effect[] effects2 = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
+ foreach (Effect effect2 in effects2)
+ {
+ effect2.OnShieldNeutralizeDamage(enemy, actor, damageType, magicType, damage, ShieldType.Effect);
+ }
+ break;
}
}
- else
+ }
+
+ // 如果伤害仍然大于0,继续检查护盾
+ if (remain > 0)
+ {
+ // 检查指定类型的护盾值
+ bool isMagicDamage = damageType == DamageType.Magical;
+ double shield = enemy.Shield[isMagicDamage, magicType];
+ if (shield > 0)
{
- WriteLine($"[ {enemy} ] 的{shieldTypeString}护盾抵消了 {enemy.Shield[isMagicDamage, magicType]:0.##} 点{damageType}并破碎!");
- remain -= enemy.Shield[isMagicDamage, magicType];
- enemy.Shield[isMagicDamage, magicType] = 0;
- if (isMagicDamage && enemy.Shield.TotalMagicial <= 0 || !isMagicDamage && enemy.Shield.TotalPhysical <= 0)
+ shield -= remain;
+ string shieldTypeString = isMagicDamage ? "魔法" : "物理";
+ ShieldType shieldType = isMagicDamage ? ShieldType.Magical : ShieldType.Physical;
+ if (shield > 0)
{
+ WriteLine($"[ {enemy} ] 的{shieldTypeString}护盾抵消了 {remain:0.##} 点{damageTypeString}!");
+ enemy.Shield[isMagicDamage, magicType] -= remain;
+ remain = 0;
effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
foreach (Effect effect in effects)
{
- if (!effect.OnShieldBroken(enemy, actor, shieldType, remain))
+ effect.OnShieldNeutralizeDamage(enemy, actor, damageType, magicType, damage, shieldType);
+ }
+ }
+ else
+ {
+ WriteLine($"[ {enemy} ] 的{shieldTypeString}护盾抵消了 {enemy.Shield[isMagicDamage, magicType]:0.##} 点{damageTypeString}并破碎!");
+ remain -= enemy.Shield[isMagicDamage, magicType];
+ enemy.Shield[isMagicDamage, magicType] = 0;
+ if (isMagicDamage && enemy.Shield.TotalMagicial <= 0 || !isMagicDamage && enemy.Shield.TotalPhysical <= 0)
+ {
+ effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
+ foreach (Effect effect in effects)
+ {
+ if (!effect.OnShieldBroken(enemy, actor, shieldType, remain))
+ {
+ WriteLine($"[ {(enemy.Effects.Contains(effect) ? enemy : actor)} ] 因护盾破碎而发动了 [ {effect.Skill.Name} ],化解了本次伤害!");
+ remain = 0;
+ }
+ }
+ }
+ }
+ }
+
+ // 检查混合护盾
+ if (remain > 0 && enemy.Shield.Mix > 0)
+ {
+ shield = enemy.Shield.Mix;
+ shield -= remain;
+ if (shield > 0)
+ {
+ WriteLine($"[ {enemy} ] 的混合护盾抵消了 {remain:0.##} 点{damageTypeString}!");
+ enemy.Shield.Mix -= remain;
+ remain = 0;
+ effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
+ foreach (Effect effect in effects)
+ {
+ effect.OnShieldNeutralizeDamage(enemy, actor, damageType, magicType, damage, ShieldType.Mix);
+ }
+ }
+ else
+ {
+ WriteLine($"[ {enemy} ] 的混合护盾抵消了 {enemy.Shield.Mix:0.##} 点{damageTypeString}并破碎!");
+ remain -= enemy.Shield.Mix;
+ enemy.Shield.Mix = 0;
+ effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
+ foreach (Effect effect in effects)
+ {
+ if (!effect.OnShieldBroken(enemy, actor, ShieldType.Mix, remain))
{
WriteLine($"[ {(enemy.Effects.Contains(effect) ? enemy : actor)} ] 因护盾破碎而发动了 [ {effect.Skill.Name} ],化解了本次伤害!");
remain = 0;
@@ -1540,51 +1606,18 @@ namespace Milimoe.FunGame.Core.Model
}
}
- // 检查混合护盾
- if (remain > 0 && enemy.Shield.Mix > 0)
- {
- shield = enemy.Shield.Mix;
- shield -= remain;
- if (shield > 0)
- {
- WriteLine($"[ {enemy} ] 的混合护盾抵消了 {remain:0.##} 点{damageType}!");
- enemy.Shield.Mix -= remain;
- remain = 0;
- effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
- foreach (Effect effect in effects)
- {
- effect.OnShieldNeutralizeDamage(enemy, actor, isMagicDamage, magicType, damage, ShieldType.Mix);
- }
- }
- else
- {
- WriteLine($"[ {enemy} ] 的混合护盾抵消了 {enemy.Shield.Mix:0.##} 点{damageType}并破碎!");
- remain -= enemy.Shield.Mix;
- enemy.Shield.Mix = 0;
- effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
- foreach (Effect effect in effects)
- {
- if (!effect.OnShieldBroken(enemy, actor, ShieldType.Mix, remain))
- {
- WriteLine($"[ {(enemy.Effects.Contains(effect) ? enemy : actor)} ] 因护盾破碎而发动了 [ {effect.Skill.Name} ],化解了本次伤害!");
- remain = 0;
- }
- }
- }
- }
+ actualDamage = remain;
}
- actualDamage = remain;
- }
-
- // 统计护盾
- if (damage > actualDamage && _stats.TryGetValue(actor, out CharacterStatistics? stats) && stats != null)
- {
- stats.TotalShield += damage - actualDamage;
+ // 统计护盾
+ if (damage > actualDamage && _stats.TryGetValue(actor, out CharacterStatistics? stats) && stats != null)
+ {
+ stats.TotalShield += damage - actualDamage;
+ }
}
enemy.HP -= actualDamage;
- WriteLine($"[ {enemy} ] 受到了 {actualDamage:0.##} 点{damageType}!{shieldMsg}");
+ WriteLine($"[ {enemy} ] 受到了 {actualDamage:0.##} 点{damageTypeString}!{shieldMsg}");
// 生命偷取,攻击者为全额
double steal = damage * actor.Lifesteal;
@@ -1618,7 +1651,7 @@ namespace Milimoe.FunGame.Core.Model
}
// 统计伤害
- CalculateCharacterDamageStatistics(actor, enemy, damage, isMagicDamage, actualDamage);
+ CalculateCharacterDamageStatistics(actor, enemy, damage, damageType, actualDamage);
// 计算助攻
_assistDetail[actor][enemy, TotalTime] += damage;
@@ -1630,12 +1663,12 @@ namespace Milimoe.FunGame.Core.Model
actualDamage = 0;
}
- await OnDamageToEnemyAsync(actor, enemy, damage, actualDamage, isNormalAttack, isMagicDamage, magicType, damageResult);
+ await OnDamageToEnemyAsync(actor, enemy, damage, actualDamage, isNormalAttack, damageType, magicType, damageResult);
effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
foreach (Effect effect in effects)
{
- effect.AfterDamageCalculation(actor, enemy, damage, actualDamage, isNormalAttack, isMagicDamage, magicType, damageResult);
+ effect.AfterDamageCalculation(actor, enemy, damage, actualDamage, isNormalAttack, damageType, magicType, damageResult);
}
if (enemy.HP <= 0 && !_eliminated.Contains(enemy) && !_respawnCountdown.ContainsKey(enemy))
@@ -1680,8 +1713,14 @@ namespace Milimoe.FunGame.Core.Model
return;
}
+ double realHeal = heal;
if (target.HP > 0 || (isDead && canRespawn))
{
+ // 用于数据统计,不能是全额,溢出的部分需要扣除
+ if (target.HP + heal > target.MaxHP)
+ {
+ realHeal = target.MaxHP - target.HP;
+ }
target.HP += heal;
if (!LastRound.Heals.TryAdd(target, heal))
{
@@ -1717,7 +1756,7 @@ namespace Milimoe.FunGame.Core.Model
// 统计数据
if (_stats.TryGetValue(actor, out CharacterStatistics? stats) && stats != null)
{
- stats.TotalHeal += heal;
+ stats.TotalHeal += realHeal;
}
await OnHealToTargetAsync(actor, target, heal, isRespawn);
@@ -1928,8 +1967,8 @@ namespace Milimoe.FunGame.Core.Model
{
caster.CharacterState = CharacterState.Actionable;
}
- WriteLine($"[ {caster} ] 终止了 [ {st.Skill.Name} ] 的施法" + (_hardnessTimes[caster] > 3 ? $",并获得了 3 {GameplayEquilibriumConstant.InGameTime}的硬直时间的补偿。" : "。"));
- if (_hardnessTimes[caster] > 3)
+ WriteLine($"[ {caster} ] 终止了 [ {st.Skill.Name} ] 的施法" + (_hardnessTimes[caster] > 3 && _isInRound ? $",并获得了 3 {GameplayEquilibriumConstant.InGameTime}的硬直时间的补偿。" : "。"));
+ if (_hardnessTimes[caster] > 3 && _isInRound)
{
AddCharacter(caster, 3, false);
}
@@ -1966,16 +2005,21 @@ namespace Milimoe.FunGame.Core.Model
{
LastRound.Targets = [.. targets];
+ WriteLine($"[ {character} ] 使用了物品 [ {item.Name} ]!");
+ item.ReduceTimesAndRemove();
+ if (item.IsReduceTimesAfterUse && item.RemainUseTimes == 0)
+ {
+ character.Items.Remove(item);
+ }
await OnCharacterUseItemAsync(character, item, targets);
- string line = $"[ {character} ] 使用了物品 [ {item.Name} ]!\r\n[ {character} ] ";
-
skill.OnSkillCasting(this, character, targets);
skill.BeforeSkillCasted();
skill.CurrentCD = skill.RealCD;
skill.Enable = false;
+ string line = $"[ {character} ] ";
if (costMP > 0)
{
character.MP -= costMP;
@@ -2017,7 +2061,7 @@ namespace Milimoe.FunGame.Core.Model
{
if (pUseItem == 0 && pCastSkill == 0 && pNormalAttack == 0)
{
- return CharacterActionType.None;
+ return CharacterActionType.EndTurn;
}
double total = pUseItem + pCastSkill + pNormalAttack;
@@ -2048,7 +2092,7 @@ namespace Milimoe.FunGame.Core.Model
return CharacterActionType.NormalAttack;
}
- return CharacterActionType.None;
+ return CharacterActionType.EndTurn;
}
///
@@ -2113,7 +2157,7 @@ namespace Milimoe.FunGame.Core.Model
if (skill.SkillType == SkillType.Magic)
{
cost = skill.RealMPCost;
- if (cost > 0 && cost <= caster.MP)
+ if (cost >= 0 && cost <= caster.MP)
{
return true;
}
@@ -2125,7 +2169,7 @@ namespace Milimoe.FunGame.Core.Model
else
{
cost = skill.RealEPCost;
- if (cost > 0 && cost <= caster.EP)
+ if (cost >= 0 && cost <= caster.EP)
{
return true;
}
@@ -2158,7 +2202,7 @@ namespace Milimoe.FunGame.Core.Model
costEP = skill.RealEPCost;
bool isMPOk = false;
bool isEPOk = false;
- if (costMP > 0 && costMP <= caster.MP)
+ if (costMP >= 0 && costMP <= caster.MP)
{
isMPOk = true;
}
@@ -2167,7 +2211,7 @@ namespace Milimoe.FunGame.Core.Model
WriteLine("[ " + caster + $" ] 魔法不足!");
}
costEP = skill.RealEPCost;
- if (costEP > 0 && costEP <= caster.EP)
+ if (costEP >= 0 && costEP <= caster.EP)
{
isEPOk = true;
}
@@ -2191,16 +2235,16 @@ namespace Milimoe.FunGame.Core.Model
public DamageResult CalculatePhysicalDamage(Character actor, Character enemy, bool isNormalAttack, double expectedDamage, out double finalDamage, ref int changeCount)
{
List characters = [actor, enemy];
- bool isMagic = false;
+ DamageType damageType = DamageType.Physical;
MagicType magicType = MagicType.None;
List effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
if (changeCount < 3)
{
foreach (Effect effect in effects)
{
- effect.AlterDamageTypeBeforeCalculation(actor, enemy, ref isNormalAttack, ref isMagic, ref magicType);
+ effect.AlterDamageTypeBeforeCalculation(actor, enemy, ref isNormalAttack, ref damageType, ref magicType);
}
- if (isMagic)
+ if (damageType == DamageType.Magical)
{
changeCount++;
return CalculateMagicalDamage(actor, enemy, isNormalAttack, magicType, expectedDamage, out finalDamage, ref changeCount);
@@ -2211,7 +2255,7 @@ namespace Milimoe.FunGame.Core.Model
effects = [.. actor.Effects.Union(enemy.Effects).Distinct().Where(e => e.IsInEffect)];
foreach (Effect effect in effects)
{
- double damageBonus = effect.AlterExpectedDamageBeforeCalculation(actor, enemy, expectedDamage, isNormalAttack, false, MagicType.None, totalDamageBonus);
+ double damageBonus = effect.AlterExpectedDamageBeforeCalculation(actor, enemy, expectedDamage, isNormalAttack, DamageType.Physical, MagicType.None, totalDamageBonus);
totalDamageBonus[effect] = damageBonus;
}
expectedDamage += totalDamageBonus.Sum(kv => kv.Value);
@@ -2308,15 +2352,15 @@ namespace Milimoe.FunGame.Core.Model
public DamageResult CalculateMagicalDamage(Character actor, Character enemy, bool isNormalAttack, MagicType magicType, double expectedDamage, out double finalDamage, ref int changeCount)
{
List characters = [actor, enemy];
- bool isMagic = true;
+ DamageType damageType = DamageType.Magical;
List effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
if (changeCount < 3)
{
foreach (Effect effect in effects)
{
- effect.AlterDamageTypeBeforeCalculation(actor, enemy, ref isNormalAttack, ref isMagic, ref magicType);
+ effect.AlterDamageTypeBeforeCalculation(actor, enemy, ref isNormalAttack, ref damageType, ref magicType);
}
- if (!isMagic)
+ if (damageType == DamageType.Physical)
{
changeCount++;
return CalculatePhysicalDamage(actor, enemy, isNormalAttack, expectedDamage, out finalDamage, ref changeCount);
@@ -2327,7 +2371,7 @@ namespace Milimoe.FunGame.Core.Model
effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()];
foreach (Effect effect in effects)
{
- double damageBonus = effect.AlterExpectedDamageBeforeCalculation(actor, enemy, expectedDamage, isNormalAttack, true, magicType, totalDamageBonus);
+ double damageBonus = effect.AlterExpectedDamageBeforeCalculation(actor, enemy, expectedDamage, isNormalAttack, DamageType.Magical, magicType, totalDamageBonus);
totalDamageBonus[effect] = damageBonus;
}
expectedDamage += totalDamageBonus.Sum(kv => kv.Value);
@@ -2431,7 +2475,7 @@ namespace Milimoe.FunGame.Core.Model
List teammates = GetTeammates(character);
return teammates.Contains(target);
}
-
+
///
/// 获取目标对于某个角色是否是友方的字典
///
@@ -2812,12 +2856,16 @@ namespace Milimoe.FunGame.Core.Model
///
/// 计算角色的数据
///
- public void CalculateCharacterDamageStatistics(Character character, Character characterTaken, double damage, bool isMagic, double takenDamage = -1)
+ public void CalculateCharacterDamageStatistics(Character character, Character characterTaken, double damage, DamageType damageType, double takenDamage = -1)
{
if (takenDamage == -1) takenDamage = damage;
if (_stats.TryGetValue(character, out CharacterStatistics? stats) && stats != null)
{
- if (isMagic)
+ if (damageType == DamageType.True)
+ {
+ stats.TotalTrueDamage += damage;
+ }
+ if (damageType == DamageType.Magical)
{
stats.TotalMagicDamage += damage;
}
@@ -2829,7 +2877,11 @@ namespace Milimoe.FunGame.Core.Model
}
if (_stats.TryGetValue(characterTaken, out CharacterStatistics? statsTaken) && statsTaken != null)
{
- if (isMagic)
+ if (damageType == DamageType.True)
+ {
+ statsTaken.TotalTakenTrueDamage = Calculation.Round2Digits(statsTaken.TotalTakenTrueDamage + takenDamage);
+ }
+ if (damageType == DamageType.Magical)
{
statsTaken.TotalTakenMagicDamage = Calculation.Round2Digits(statsTaken.TotalTakenMagicDamage + takenDamage);
}
@@ -3090,7 +3142,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, double actualDamage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult);
+ public delegate Task DamageToEnemyEventHandler(GamingQueue queue, Character actor, Character enemy, double damage, double actualDamage, bool isNormalAttack, DamageType damageType, MagicType magicType, DamageResult damageResult);
///
/// 造成伤害事件
///
@@ -3103,13 +3155,13 @@ namespace Milimoe.FunGame.Core.Model
///
///
///
- ///
+ ///
///
///
///
- protected async Task OnDamageToEnemyAsync(Character actor, Character enemy, double damage, double actualDamage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
+ protected async Task OnDamageToEnemyAsync(Character actor, Character enemy, double damage, double actualDamage, bool isNormalAttack, DamageType damageType, MagicType magicType, DamageResult damageResult)
{
- await (DamageToEnemy?.Invoke(this, actor, enemy, damage, actualDamage, isNormalAttack, isMagicDamage, magicType, damageResult) ?? Task.CompletedTask);
+ await (DamageToEnemy?.Invoke(this, actor, enemy, damage, actualDamage, isNormalAttack, damageType, magicType, damageResult) ?? Task.CompletedTask);
}
public delegate Task CharacterNormalAttackEventHandler(GamingQueue queue, Character actor, List targets);