From 0c24d27d19e98f4049dc1d21052ae33197f7be25 Mon Sep 17 00:00:00 2001 From: milimoe Date: Sat, 26 Apr 2025 16:20:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=B9=E6=95=88=E6=B7=BB=E5=8A=A0=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E7=94=9F=E6=95=88=E5=92=8C=E6=98=BE=E7=A4=BA=E5=9C=A8?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=A0=8F=E7=9A=84=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Entity/Character/Character.cs | 27 ++++--- Entity/Character/Unit.cs | 25 ++++--- Entity/Skill/Effect.cs | 41 +++++++---- Entity/Skill/Skill.cs | 7 +- .../Common/JsonConverter/EffectConverter.cs | 14 +++- Model/ActionQueue.cs | 72 +++++++++---------- 6 files changed, 113 insertions(+), 73 deletions(-) diff --git a/Entity/Character/Character.cs b/Entity/Character/Character.cs index d64e9fa..9040926 100644 --- a/Entity/Character/Character.cs +++ b/Entity/Character/Character.cs @@ -1208,7 +1208,7 @@ namespace Milimoe.FunGame.Core.Entity /// public void OnAttributeChanged() { - List effects = [.. Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + List effects = [.. Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.OnAttributeChanged(this); @@ -1448,10 +1448,11 @@ namespace Milimoe.FunGame.Core.Entity } } - if (Effects.Where(e => e.EffectType != EffectType.Item).Any()) + Effect[] effects = [.. Effects.Where(e => e.ShowInStatusBar)]; + if (effects.Length > 0) { builder.AppendLine("== 状态栏 =="); - foreach (Effect effect in Effects.Where(e => e.EffectType != EffectType.Item)) + foreach (Effect effect in effects) { builder.Append(effect.ToString()); } @@ -1560,10 +1561,11 @@ namespace Milimoe.FunGame.Core.Entity builder.AppendLine(string.Join(",", types.Select(ItemSet.GetEquipSlotTypeName))); } - if (Effects.Where(e => e.EffectType != EffectType.Item).Any()) + Effect[] effects = [.. Effects.Where(e => e.ShowInStatusBar)]; + if (effects.Length > 0) { builder.AppendLine("== 状态栏 =="); - builder.Append(string.Join(",", Effects.Where(e => e.EffectType != EffectType.Item).Select(e => e.Name))); + builder.Append(string.Join(",", effects.Select(e => e.Name))); } } @@ -1609,10 +1611,11 @@ namespace Milimoe.FunGame.Core.Entity builder.AppendLine($"硬直时间:{hardnessTimes:0.##}"); - if (Effects.Where(e => e.EffectType != EffectType.Item).Any()) + Effect[] effects = [.. Effects.Where(e => e.ShowInStatusBar)]; + if (effects.Length > 0) { builder.AppendLine("== 状态栏 =="); - foreach (Effect effect in Effects.Where(e => e.EffectType != EffectType.Item)) + foreach (Effect effect in effects) { builder.Append(effect.ToString()); } @@ -1644,10 +1647,11 @@ namespace Milimoe.FunGame.Core.Entity builder.AppendLine($"核心属性:{PrimaryAttributeValue:0.##}" + (ExPrimaryAttributeValue != 0 ? $" [{BasePrimaryAttributeValue:0.##} {(ExPrimaryAttributeValue >= 0 ? "+" : "-")} {Math.Abs(ExPrimaryAttributeValue):0.##}]" : "")); builder.AppendLine($"硬直时间:{hardnessTimes:0.##}"); - if (Effects.Where(e => e.EffectType != EffectType.Item).Any()) + Effect[] effects = [.. Effects.Where(e => e.ShowInStatusBar)]; + if (effects.Length > 0) { builder.AppendLine("== 状态栏 =="); - builder.Append(string.Join(",", Effects.Where(e => e.EffectType != EffectType.Item).Select(e => e.Name))); + builder.Append(string.Join(",", effects.Select(e => e.Name))); } return builder.ToString(); @@ -1690,10 +1694,11 @@ namespace Milimoe.FunGame.Core.Entity } } - if (Effects.Where(e => e.EffectType != EffectType.Item).Any()) + Effect[] effects = [.. Effects.Where(e => e.ShowInStatusBar)]; + if (effects.Length > 0) { builder.AppendLine("== 状态栏 =="); - foreach (Effect effect in Effects.Where(e => e.EffectType != EffectType.Item)) + foreach (Effect effect in effects) { builder.Append(effect.ToString()); } diff --git a/Entity/Character/Unit.cs b/Entity/Character/Unit.cs index 76f9fc8..5d7aded 100644 --- a/Entity/Character/Unit.cs +++ b/Entity/Character/Unit.cs @@ -148,10 +148,11 @@ namespace Milimoe.FunGame.Core.Entity } } - if (Effects.Where(e => e.EffectType != EffectType.Item).Any()) + Effect[] effects = [.. Effects.Where(e => e.ShowInStatusBar)]; + if (effects.Length > 0) { builder.AppendLine("== 状态栏 =="); - foreach (Effect effect in Effects.Where(e => e.EffectType != EffectType.Item)) + foreach (Effect effect in effects) { builder.Append(effect.ToString()); } @@ -249,10 +250,11 @@ namespace Milimoe.FunGame.Core.Entity builder.AppendLine(string.Join(",", types.Select(ItemSet.GetEquipSlotTypeName))); } - if (Effects.Where(e => e.EffectType != EffectType.Item).Any()) + Effect[] effects = [.. Effects.Where(e => e.ShowInStatusBar)]; + if (effects.Length > 0) { builder.AppendLine("== 状态栏 =="); - builder.Append(string.Join(",", Effects.Where(e => e.EffectType != EffectType.Item).Select(e => e.Name))); + builder.Append(string.Join(",", effects.Select(e => e.Name))); } } @@ -301,10 +303,11 @@ namespace Milimoe.FunGame.Core.Entity builder.AppendLine($"硬直时间:{hardnessTimes:0.##}"); - if (Effects.Where(e => e.EffectType != EffectType.Item).Any()) + Effect[] effects = [.. Effects.Where(e => e.ShowInStatusBar)]; + if (effects.Length > 0) { builder.AppendLine("== 状态栏 =="); - foreach (Effect effect in Effects.Where(e => e.EffectType != EffectType.Item)) + foreach (Effect effect in effects) { builder.Append(effect.ToString()); } @@ -331,10 +334,11 @@ namespace Milimoe.FunGame.Core.Entity builder.AppendLine($"攻击力:{ATK:0.##}" + (exATK != 0 ? $" [{BaseATK:0.##} {(exATK >= 0 ? "+" : "-")} {Math.Abs(exATK):0.##}]" : "")); builder.AppendLine($"硬直时间:{hardnessTimes:0.##}"); - if (Effects.Where(e => e.EffectType != EffectType.Item).Any()) + Effect[] effects = [.. Effects.Where(e => e.ShowInStatusBar)]; + if (effects.Length > 0) { builder.AppendLine("== 状态栏 =="); - builder.Append(string.Join(",", Effects.Where(e => e.EffectType != EffectType.Item).Select(e => e.Name))); + builder.Append(string.Join(",", effects.Select(e => e.Name))); } return builder.ToString(); @@ -377,10 +381,11 @@ namespace Milimoe.FunGame.Core.Entity } } - if (Effects.Where(e => e.EffectType != EffectType.Item).Any()) + Effect[] effects = [.. Effects.Where(e => e.ShowInStatusBar)]; + if (effects.Length > 0) { builder.AppendLine("== 状态栏 =="); - foreach (Effect effect in Effects.Where(e => e.EffectType != EffectType.Item)) + foreach (Effect effect in effects) { builder.Append(effect.ToString()); } diff --git a/Entity/Skill/Effect.cs b/Entity/Skill/Effect.cs index d79d2de..95f8d73 100644 --- a/Entity/Skill/Effect.cs +++ b/Entity/Skill/Effect.cs @@ -55,6 +55,16 @@ namespace Milimoe.FunGame.Core.Entity /// public virtual bool DurativeWithoutDuration { get; set; } = false; + /// + /// 是否显示在状态栏 + /// + public bool ShowInStatusBar => Skill.Item is null || (Durative && Duration > 0) || DurationTurn > 0 || DurativeWithoutDuration; + + /// + /// 特效是否生效 + /// + public bool IsInEffect => Level > 0 && !IsBeingTemporaryDispelled; + /// /// 魔法类型 /// @@ -908,7 +918,7 @@ namespace Milimoe.FunGame.Core.Entity { return; } - Effect[] effects = [.. target.Effects.Where(e => e.Level > 0 && EffectType != EffectType.Item && !e.IsBeingTemporaryDispelled)]; + Effect[] effects = [.. target.Effects.Where(e => e.IsInEffect && e.ShowInStatusBar)]; foreach (Effect effect in effects) { if (effect.OnEffectIsBeingDispelled(dispeller, target, this, isEnemy)) @@ -972,7 +982,7 @@ namespace Milimoe.FunGame.Core.Entity /// 复制一个特效 /// /// - public Effect Copy(Skill skill) + public Effect Copy(Skill skill, bool copyByCode = false) { Dictionary args = new() { @@ -980,21 +990,24 @@ namespace Milimoe.FunGame.Core.Entity { "values", Values } }; Effect copy = Factory.OpenFactory.GetInstance(Id, Name, args); - copy.Id = Id; - copy.Name = Name; - copy.Description = Description; - copy.DispelDescription = DispelDescription; - copy.EffectType = EffectType; - copy.DispelType = DispelType; - copy.DispelledType = DispelledType; - copy.IsDebuff = IsDebuff; - copy.IgnoreImmune = IgnoreImmune; - copy.DurativeWithoutDuration = DurativeWithoutDuration; + if (!copyByCode) + { + copy.Id = Id; + copy.Name = Name; + copy.Description = Description; + copy.DispelDescription = DispelDescription; + copy.EffectType = EffectType; + copy.DispelType = DispelType; + copy.DispelledType = DispelledType; + copy.IsDebuff = IsDebuff; + copy.IgnoreImmune = IgnoreImmune; + copy.DurativeWithoutDuration = DurativeWithoutDuration; + copy.MagicType = MagicType; + copy.GamingQueue = GamingQueue; + } copy.Durative = Durative; copy.Duration = Duration; copy.DurationTurn = DurationTurn; - copy.MagicType = MagicType; - copy.GamingQueue = GamingQueue; return copy; } diff --git a/Entity/Skill/Skill.cs b/Entity/Skill/Skill.cs index 1803abc..95fb8d7 100644 --- a/Entity/Skill/Skill.cs +++ b/Entity/Skill/Skill.cs @@ -544,7 +544,12 @@ namespace Milimoe.FunGame.Core.Entity { foreach (Effect e in skillDefined.Effects) { - Effect neweffect = e.Copy(skill); + // 特效没法动态扩展,必须使用编程钩子实现,因此动态扩展的技能需要使用代码定义的特效 + Effect neweffect = e.Copy(skill, true); + if (skill.GamingQueue != null) + { + neweffect.GamingQueue = skill.GamingQueue; + } skill.Effects.Add(neweffect); } } diff --git a/Library/Common/JsonConverter/EffectConverter.cs b/Library/Common/JsonConverter/EffectConverter.cs index 2cb13da..2d16ee4 100644 --- a/Library/Common/JsonConverter/EffectConverter.cs +++ b/Library/Common/JsonConverter/EffectConverter.cs @@ -21,6 +21,15 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter case nameof(Effect.Name): result.Name = reader.GetString() ?? ""; break; + case nameof(Effect.Durative): + result.Durative = reader.GetBoolean(); + break; + case nameof(Effect.Duration): + result.Duration = reader.GetDouble(); + break; + case nameof(Effect.DurationTurn): + result.DurationTurn = reader.GetInt32(); + break; default: if (reader.TokenType == JsonTokenType.Number) { @@ -42,8 +51,11 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter { writer.WriteStartObject(); - writer.WriteNumber(nameof(Effect.Id), (int)value.Id); + writer.WriteNumber(nameof(Effect.Id), value.Id); writer.WriteString(nameof(Effect.Name), value.Name); + writer.WriteBoolean(nameof(Effect.Durative), value.Durative); + writer.WriteNumber(nameof(Effect.Duration), value.Duration); + writer.WriteNumber(nameof(Effect.DurationTurn), value.DurationTurn); foreach (var kvp in value.Values) { diff --git a/Model/ActionQueue.cs b/Model/ActionQueue.cs index bcb4a62..a6cc764 100644 --- a/Model/ActionQueue.cs +++ b/Model/ActionQueue.cs @@ -639,7 +639,7 @@ namespace Milimoe.FunGame.Core.Model skillTurnStart.OnTurnStart(character, enemys, teammates, skills, items); } - List effects = [.. character.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + List effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.OnTurnStart(character, enemys, teammates, skills, items); @@ -675,7 +675,7 @@ namespace Milimoe.FunGame.Core.Model if (character.CharacterState != CharacterState.Casting && character.CharacterState != CharacterState.PreCastSuperSkill) { CharacterActionType actionTypeTemp = CharacterActionType.None; - effects = [.. character.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { actionTypeTemp = effect.AlterActionTypeBeforeAction(character, character.CharacterState, ref canUseItem, ref canCastSkill, ref pUseItem, ref pCastSkill, ref pNormalAttack); @@ -798,7 +798,7 @@ namespace Milimoe.FunGame.Core.Model Dictionary continuousKillingTemp = new(_continuousKilling); Dictionary earnedMoneyTemp = new(_earnedMoney); - effects = [.. character.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.AlterSelectListBeforeAction(character, enemys, teammates, skills, continuousKillingTemp, earnedMoneyTemp); @@ -834,7 +834,7 @@ namespace Milimoe.FunGame.Core.Model character.NormalAttack.Attack(this, character, targets); baseTime = character.NormalAttack.RealHardnessTime; - effects = [.. character.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.AlterHardnessTimeAfterNormalAttack(character, ref baseTime, ref isCheckProtected); @@ -918,7 +918,7 @@ namespace Milimoe.FunGame.Core.Model await OnCharacterCastSkillAsync(character, skillTarget, cost); skill.OnSkillCasted(this, character, targets); - effects = [.. character.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.AlterHardnessTimeAfterCastSkill(character, skill, ref baseTime, ref isCheckProtected); @@ -974,7 +974,7 @@ namespace Milimoe.FunGame.Core.Model baseTime = 3; } - effects = [.. character.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.AlterHardnessTimeAfterCastSkill(character, skill, ref baseTime, ref isCheckProtected); @@ -1027,7 +1027,7 @@ namespace Milimoe.FunGame.Core.Model baseTime = 3; } - effects = [.. character.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.AlterHardnessTimeAfterCastSkill(character, skill, ref baseTime, ref isCheckProtected); @@ -1050,7 +1050,7 @@ namespace Milimoe.FunGame.Core.Model decided = true; LastRound.Item = item; baseTime = skill.RealHardnessTime; - effects = [.. character.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.AlterHardnessTimeAfterCastSkill(character, skill, ref baseTime, ref isCheckProtected); @@ -1119,7 +1119,7 @@ namespace Milimoe.FunGame.Core.Model await OnQueueUpdatedAsync(_queue, character, newHardnessTime, QueueUpdatedReason.Action, "设置角色行动后的硬直时间。"); LastRound.HardnessTime = newHardnessTime; - effects = [.. character.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.OnTurnEnd(character); @@ -1333,7 +1333,7 @@ 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.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + List effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { double damageBonus = effect.AlterActualDamageAfterCalculation(actor, enemy, damage, isNormalAttack, isMagicDamage, magicType, damageResult, ref isEvaded, totalDamageBonus); @@ -1355,7 +1355,7 @@ namespace Milimoe.FunGame.Core.Model (!isNormalAttack && (enemy.ImmuneType == ImmuneType.All || enemy.ImmuneType == ImmuneType.Physical || enemy.ImmuneType == ImmuneType.Magical || enemy.ImmuneType == ImmuneType.Skilled)); if (isImmune) { - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { if (isNormalAttack) @@ -1402,7 +1402,7 @@ namespace Milimoe.FunGame.Core.Model bool change = false; // 看特效有没有特殊护盾逻辑 - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { if (!effect.BeforeShieldCalculation(actor, enemy, isMagicDamage, magicType, damage, shield, ref shieldMsg)) @@ -1420,7 +1420,7 @@ namespace Milimoe.FunGame.Core.Model enemy.Shield[isMagicDamage, magicType] = 0; change = false; - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { if (!effect.OnShieldBroken(actor, enemy, isMagicDamage, magicType, damage, shield, remain)) @@ -1462,7 +1462,7 @@ namespace Milimoe.FunGame.Core.Model // 生命偷取 double steal = damage * actor.Lifesteal; await HealToTargetAsync(actor, actor, steal, false); - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { effect.AfterLifesteal(actor, enemy, damage, steal); @@ -1470,14 +1470,14 @@ namespace Milimoe.FunGame.Core.Model // 造成伤害和受伤都可以获得能量 double ep = GetEP(damage, GameplayEquilibriumConstant.DamageGetEPFactor, GameplayEquilibriumConstant.DamageGetEPMax); - effects = [.. actor.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + effects = [.. actor.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.AlterEPAfterDamage(actor, ref ep); } actor.EP += ep; ep = GetEP(damage, GameplayEquilibriumConstant.TakenDamageGetEPFactor, GameplayEquilibriumConstant.TakenDamageGetEPMax); - effects = [.. enemy.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + effects = [.. enemy.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.AlterEPAfterGetDamage(enemy, ref ep); @@ -1498,7 +1498,7 @@ namespace Milimoe.FunGame.Core.Model await OnDamageToEnemyAsync(actor, enemy, damage, isNormalAttack, isMagicDamage, magicType, damageResult); - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + 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); @@ -1529,7 +1529,7 @@ namespace Milimoe.FunGame.Core.Model bool isDead = target.HP <= 0; Dictionary totalHealBonus = []; - List effects = [.. actor.Effects.Union(target.Effects).Distinct().Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + List effects = [.. actor.Effects.Union(target.Effects).Distinct().Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { bool changeCanRespawn = false; @@ -1611,7 +1611,7 @@ namespace Milimoe.FunGame.Core.Model List characters = [actor, enemy]; bool isMagic = false; MagicType magicType = MagicType.None; - List effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + List effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; if (changeCount < 3) { foreach (Effect effect in effects) @@ -1626,7 +1626,7 @@ namespace Milimoe.FunGame.Core.Model } Dictionary totalDamageBonus = []; - effects = [.. actor.Effects.Union(enemy.Effects).Distinct().Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + 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); @@ -1640,7 +1640,7 @@ namespace Milimoe.FunGame.Core.Model bool checkCritical = true; if (isNormalAttack) { - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { checkEvade = effect.BeforeEvadeCheck(actor, enemy, ref throwingBonus); @@ -1653,7 +1653,7 @@ namespace Milimoe.FunGame.Core.Model { finalDamage = 0; bool isAlterEvaded = false; - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { if (effect.OnEvadedTriggered(actor, enemy, dice)) @@ -1680,7 +1680,7 @@ namespace Milimoe.FunGame.Core.Model finalDamage = expectedDamage * (1 - Calculation.PercentageCheck(physicalDamageReduction + enemy.ExPDR)); // 暴击检定 - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { checkCritical = effect.BeforeCriticalCheck(actor, enemy, ref throwingBonus); @@ -1693,7 +1693,7 @@ namespace Milimoe.FunGame.Core.Model { finalDamage *= actor.CritDMG; // 暴击伤害倍率加成 WriteLine("暴击生效!!"); - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { effect.OnCriticalDamageTriggered(actor, enemy, dice); @@ -1721,7 +1721,7 @@ namespace Milimoe.FunGame.Core.Model { List characters = [actor, enemy]; bool isMagic = true; - List effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + List effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; if (changeCount < 3) { foreach (Effect effect in effects) @@ -1736,7 +1736,7 @@ namespace Milimoe.FunGame.Core.Model } Dictionary totalDamageBonus = []; - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + 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); @@ -1750,7 +1750,7 @@ namespace Milimoe.FunGame.Core.Model bool checkCritical = true; if (isNormalAttack) { - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { checkEvade = effect.BeforeEvadeCheck(actor, enemy, ref throwingBonus); @@ -1763,7 +1763,7 @@ namespace Milimoe.FunGame.Core.Model { finalDamage = 0; bool isAlterEvaded = false; - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { if (effect.OnEvadedTriggered(actor, enemy, dice)) @@ -1789,7 +1789,7 @@ namespace Milimoe.FunGame.Core.Model finalDamage = expectedDamage * (1 - MDF); // 暴击检定 - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { checkCritical = effect.BeforeCriticalCheck(actor, enemy, ref throwingBonus); @@ -1802,7 +1802,7 @@ namespace Milimoe.FunGame.Core.Model { finalDamage *= actor.CritDMG; // 暴击伤害倍率加成 WriteLine("暴击生效!!"); - effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { effect.OnCriticalDamageTriggered(actor, enemy, dice); @@ -1829,7 +1829,7 @@ namespace Milimoe.FunGame.Core.Model } // 给所有角色的特效广播角色死亡结算 - List effects = [.. _queue.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled))]; + List effects = [.. _queue.SelectMany(c => c.Effects.Where(e => e.IsInEffect))]; foreach (Effect effect in effects) { effect.AfterDeathCalculation(death, character, _continuousKilling, _earnedMoney); @@ -2339,7 +2339,7 @@ namespace Milimoe.FunGame.Core.Model if (skill != null) { WriteLine($"[ {caster} ] 的施法被 [ {interrupter} ] 打断了!!"); - List effects = [.. caster.Effects.Union(interrupter.Effects).Distinct().Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + List effects = [.. caster.Effects.Union(interrupter.Effects).Distinct().Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.OnSkillCastInterrupted(caster, skill, interrupter); @@ -2361,7 +2361,7 @@ namespace Milimoe.FunGame.Core.Model { Skill skill = skillTarget.Skill; WriteLine($"[ {interrupter} ] 打断了 [ {caster} ] 的施法!!"); - List effects = [.. caster.Effects.Union(interrupter.Effects).Distinct().Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)]; + List effects = [.. caster.Effects.Union(interrupter.Effects).Distinct().Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.OnSkillCastInterrupted(caster, skill, interrupter); @@ -2781,7 +2781,7 @@ namespace Milimoe.FunGame.Core.Model /// public virtual async Task> SelectTargetsAsync(Character caster, Skill skill, List enemys, List teammates) { - List effects = [.. caster.Effects.Where(e => e.Level > 0)]; + List effects = [.. caster.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.AlterSelectListBeforeSelection(caster, skill, enemys, teammates); @@ -2804,7 +2804,7 @@ namespace Milimoe.FunGame.Core.Model /// public virtual async Task> SelectTargetsAsync(Character character, NormalAttack attack, List enemys, List teammates) { - List effects = [.. character.Effects.Where(e => e.Level > 0)]; + List effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { effect.AlterSelectListBeforeSelection(character, attack, enemys, teammates); @@ -2844,7 +2844,7 @@ namespace Milimoe.FunGame.Core.Model if (isImmune) { Character[] characters = [character, target]; - Effect[] effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.Level > 0 && !e.IsBeingTemporaryDispelled)).Distinct()]; + Effect[] effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { // 自带无视免疫或者特效免疫检定不通过可无视免疫