From 7e8c69bf1b5606a08713d99c3d577466ebbe5320 Mon Sep 17 00:00:00 2001 From: milimoe Date: Tue, 17 Jun 2025 01:38:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A4=E7=9B=BE=E6=94=B9=E5=8A=A8=E5=92=8C?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=A2=9E=E5=BC=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Effects/PassiveEffects/物理护盾.cs | 34 +++++-- .../Effects/PassiveEffects/魔法护盾.cs | 34 +++++-- .../{增加物理护盾.cs => 增加混合护盾值.cs} | 14 ++- ...加魔法护盾.cs => 增加物理护盾_护盾值型.cs} | 14 ++- .../SkillEffects/增加物理护盾_特效持续型.cs | 45 ++++++++++ .../SkillEffects/增加魔法护盾_护盾值型.cs | 34 +++++++ .../SkillEffects/增加魔法护盾_特效持续型.cs | 45 ++++++++++ .../Effects/SkillEffects/百分比回复生命值.cs | 2 +- OshimaModules/Skills/NiuNan/变幻之心.cs | 89 ++++++++++++++++--- OshimaModules/Skills/QWQAQW/破釜沉舟.cs | 10 +-- OshimaModules/Skills/QuDuoduo/弱者猎手.cs | 4 +- OshimaModules/Skills/XinYin/天赐之力.cs | 2 +- OshimaModules/Skills/魔法/复苏术.cs | 2 +- OshimaModules/Skills/魔法/大地之墙.cs | 2 +- OshimaModules/Skills/魔法/盖亚之盾.cs | 3 +- OshimaServers/Service/FunGameActionQueue.cs | 6 +- OshimaServers/Service/FunGameSimulation.cs | 7 +- OshimaWebAPI/Controllers/FunGameController.cs | 2 + 18 files changed, 288 insertions(+), 61 deletions(-) rename OshimaModules/Effects/SkillEffects/{增加物理护盾.cs => 增加混合护盾值.cs} (73%) rename OshimaModules/Effects/SkillEffects/{增加魔法护盾.cs => 增加物理护盾_护盾值型.cs} (73%) create mode 100644 OshimaModules/Effects/SkillEffects/增加物理护盾_特效持续型.cs create mode 100644 OshimaModules/Effects/SkillEffects/增加魔法护盾_护盾值型.cs create mode 100644 OshimaModules/Effects/SkillEffects/增加魔法护盾_特效持续型.cs diff --git a/OshimaModules/Effects/PassiveEffects/物理护盾.cs b/OshimaModules/Effects/PassiveEffects/物理护盾.cs index 6313c6d..a71ae6d 100644 --- a/OshimaModules/Effects/PassiveEffects/物理护盾.cs +++ b/OshimaModules/Effects/PassiveEffects/物理护盾.cs @@ -13,28 +13,50 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects public override bool DurativeWithoutDuration => true; public override bool IsDebuff => false; public override Character Source => _sourceCharacter; + public override bool Durative => _durative; + public override double Duration => _duration; + public override int DurationTurn => _durationTurn; private readonly Character _sourceCharacter; private readonly double _shield; + private readonly bool _durative; + private readonly double _duration; + private readonly int _durationTurn; - public 物理护盾(Skill skill, Character sourceCharacter, double shield) : base(skill) + public 物理护盾(Skill skill, Character sourceCharacter, double shield, bool durative = false, double duration = 0, int durationTurn = 0) : base(skill) { GamingQueue = skill.GamingQueue; _sourceCharacter = sourceCharacter; + _durative = durative; + _duration = duration; + _durationTurn = durationTurn; _shield = shield; } public override void OnEffectGained(Character character) { - character.Shield.Physical += _shield; + if (_durative && RemainDuration == 0) + { + RemainDuration = Duration; + } + else if (RemainDurationTurn == 0) + { + RemainDurationTurn = DurationTurn; + } + character.Shield.AddShieldOfEffect(new(this, _shield, false, MagicType.None)); } - public override bool OnShieldBroken(Character character, Character attacker, bool isMagic, MagicType magicType, double damage, double shield, double overFlowing) + public override void OnEffectLost(Character character) { - Effect[] effects = [.. character.Effects.Where(e => e is 物理护盾)]; - foreach (Effect effect in effects) + character.Shield.RemoveShieldOfEffect(this); + } + + public override bool OnShieldBroken(Character character, Character attacker, Effect effet, double overFlowing) + { + if (effet == this) { - character.Effects.Remove(effect); + character.Shield.RemoveShieldOfEffect(this); + character.Effects.Remove(this); } return true; } diff --git a/OshimaModules/Effects/PassiveEffects/魔法护盾.cs b/OshimaModules/Effects/PassiveEffects/魔法护盾.cs index e22c8c6..8684bf3 100644 --- a/OshimaModules/Effects/PassiveEffects/魔法护盾.cs +++ b/OshimaModules/Effects/PassiveEffects/魔法护盾.cs @@ -13,28 +13,50 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects public override bool DurativeWithoutDuration => true; public override bool IsDebuff => false; public override Character Source => _sourceCharacter; + public override bool Durative => _durative; + public override double Duration => _duration; + public override int DurationTurn => _durationTurn; private readonly Character _sourceCharacter; private readonly double _shield; + private readonly bool _durative; + private readonly double _duration; + private readonly int _durationTurn; - public 魔法护盾(Skill skill, Character sourceCharacter, double shield) : base(skill) + public 魔法护盾(Skill skill, Character sourceCharacter, double shield, bool durative = false, double duration = 0, int durationTurn = 0) : base(skill) { GamingQueue = skill.GamingQueue; _sourceCharacter = sourceCharacter; + _durative = durative; + _duration = duration; + _durationTurn = durationTurn; _shield = shield; } public override void OnEffectGained(Character character) { - character.Shield.None += _shield; + if (_durative && RemainDuration == 0) + { + RemainDuration = Duration; + } + else if (RemainDurationTurn == 0) + { + RemainDurationTurn = DurationTurn; + } + character.Shield.AddShieldOfEffect(new(this, _shield, true, MagicType.None)); } - public override bool OnShieldBroken(Character character, Character attacker, bool isMagic, MagicType magicType, double damage, double shield, double overFlowing) + public override void OnEffectLost(Character character) { - Effect[] effects = [.. character.Effects.Where(e => e is 魔法护盾)]; - foreach (Effect effect in effects) + character.Shield.RemoveShieldOfEffect(this); + } + + public override bool OnShieldBroken(Character character, Character attacker, Effect effet, double overFlowing) + { + if (effet == this) { - character.Effects.Remove(effect); + character.Shield.RemoveShieldOfEffect(this); + character.Effects.Remove(this); } return true; } diff --git a/OshimaModules/Effects/SkillEffects/增加物理护盾.cs b/OshimaModules/Effects/SkillEffects/增加混合护盾值.cs similarity index 73% rename from OshimaModules/Effects/SkillEffects/增加物理护盾.cs rename to OshimaModules/Effects/SkillEffects/增加混合护盾值.cs index b2db961..2803228 100644 --- a/OshimaModules/Effects/SkillEffects/增加物理护盾.cs +++ b/OshimaModules/Effects/SkillEffects/增加混合护盾值.cs @@ -1,21 +1,20 @@ using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; -using Oshima.FunGame.OshimaModules.Effects.PassiveEffects; namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects { - public class 增加物理护盾 : Effect + public class 增加混合护盾值 : Effect { public override long Id => Skill.Id; public override string Name => Skill.Name; - public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点物理护盾。"; + public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点混合护盾值。"; public string TargetDescription => Skill.SelectAllTeammates ? "友方全体角色" : $"目标{(Skill.CanSelectTargetCount > 1 ? $"至多 {Skill.CanSelectTargetCount} 个" : "")}友方角色"; private double 护盾值 => Level > 0 ? Math.Abs(基础数值护盾 + 基础护盾等级成长 * (Level - 1)) : Math.Abs(基础数值护盾); private double 基础数值护盾 { get; set; } = 200; private double 基础护盾等级成长 { get; set; } = 100; - public 增加物理护盾(Skill skill, double 基础数值护盾, double 基础护盾等级成长) : base(skill) + public 增加混合护盾值(Skill skill, double 基础数值护盾, double 基础护盾等级成长) : base(skill) { GamingQueue = skill.GamingQueue; this.基础数值护盾 = 基础数值护盾; @@ -26,11 +25,8 @@ namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects { foreach (Character target in targets) { - WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点物理护盾!"); - 物理护盾 e = new(Skill, caster, 护盾值); - target.Effects.Add(e); - e.OnEffectGained(target); - e.DispelledType = DispelledType; + target.Shield.Mix += 护盾值; + WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点混合护盾值!"); GamingQueue?.LastRound.ApplyEffects.TryAdd(target, [EffectType.Shield]); } } diff --git a/OshimaModules/Effects/SkillEffects/增加魔法护盾.cs b/OshimaModules/Effects/SkillEffects/增加物理护盾_护盾值型.cs similarity index 73% rename from OshimaModules/Effects/SkillEffects/增加魔法护盾.cs rename to OshimaModules/Effects/SkillEffects/增加物理护盾_护盾值型.cs index 29c7ff4..0d67f4c 100644 --- a/OshimaModules/Effects/SkillEffects/增加魔法护盾.cs +++ b/OshimaModules/Effects/SkillEffects/增加物理护盾_护盾值型.cs @@ -1,21 +1,20 @@ using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; -using Oshima.FunGame.OshimaModules.Effects.PassiveEffects; namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects { - public class 增加魔法护盾 : Effect + public class 增加物理护盾_护盾值型 : Effect { public override long Id => Skill.Id; public override string Name => Skill.Name; - public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点魔法护盾。"; + public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点物理护盾值。"; public string TargetDescription => Skill.SelectAllTeammates ? "友方全体角色" : $"目标{(Skill.CanSelectTargetCount > 1 ? $"至多 {Skill.CanSelectTargetCount} 个" : "")}友方角色"; private double 护盾值 => Level > 0 ? Math.Abs(基础数值护盾 + 基础护盾等级成长 * (Level - 1)) : Math.Abs(基础数值护盾); private double 基础数值护盾 { get; set; } = 200; private double 基础护盾等级成长 { get; set; } = 100; - public 增加魔法护盾(Skill skill, double 基础数值护盾, double 基础护盾等级成长) : base(skill) + public 增加物理护盾_护盾值型(Skill skill, double 基础数值护盾, double 基础护盾等级成长) : base(skill) { GamingQueue = skill.GamingQueue; this.基础数值护盾 = 基础数值护盾; @@ -26,11 +25,8 @@ namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects { foreach (Character target in targets) { - WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点魔法护盾!"); - 魔法护盾 e = new(Skill, caster, 护盾值); - target.Effects.Add(e); - e.OnEffectGained(target); - e.DispelledType = DispelledType; + target.Shield[false] += 护盾值; + WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点物理护盾值!"); GamingQueue?.LastRound.ApplyEffects.TryAdd(target, [EffectType.Shield]); } } diff --git a/OshimaModules/Effects/SkillEffects/增加物理护盾_特效持续型.cs b/OshimaModules/Effects/SkillEffects/增加物理护盾_特效持续型.cs new file mode 100644 index 0000000..b00e41b --- /dev/null +++ b/OshimaModules/Effects/SkillEffects/增加物理护盾_特效持续型.cs @@ -0,0 +1,45 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Oshima.FunGame.OshimaModules.Effects.PassiveEffects; + +namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects +{ + public class 增加物理护盾_特效持续型 : Effect + { + public override long Id => Skill.Id; + public override string Name => Skill.Name; + public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点物理护盾,持续 {持续时间}。"; + public string TargetDescription => Skill.SelectAllTeammates ? "友方全体角色" : $"目标{(Skill.CanSelectTargetCount > 1 ? $"至多 {Skill.CanSelectTargetCount} 个" : "")}友方角色"; + + private string 持续时间 => _durative && _duration > 0 ? _duration + $" {GameplayEquilibriumConstant.InGameTime}" : (!_durative && _durationTurn > 0 ? _durationTurn + " 回合" : $"0 {GameplayEquilibriumConstant.InGameTime}"); + private double 护盾值 => Level > 0 ? Math.Abs(基础数值护盾 + 基础护盾等级成长 * (Level - 1)) : Math.Abs(基础数值护盾); + private double 基础数值护盾 { get; set; } = 200; + private double 基础护盾等级成长 { get; set; } = 100; + private readonly bool _durative; + private readonly double _duration; + private readonly int _durationTurn; + + public 增加物理护盾_特效持续型(Skill skill, double 基础数值护盾, double 基础护盾等级成长, bool durative = false, double duration = 0, int durationTurn = 0) : base(skill) + { + GamingQueue = skill.GamingQueue; + this.基础数值护盾 = 基础数值护盾; + this.基础护盾等级成长 = 基础护盾等级成长; + _durative = durative; + _duration = duration; + _durationTurn = durationTurn; + } + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + foreach (Character target in targets) + { + WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点物理护盾!"); + 物理护盾 e = new(Skill, caster, 护盾值, _durative, _duration, _durationTurn); + target.Effects.Add(e); + e.OnEffectGained(target); + e.DispelledType = DispelledType; + GamingQueue?.LastRound.ApplyEffects.TryAdd(target, [EffectType.Shield]); + } + } + } +} diff --git a/OshimaModules/Effects/SkillEffects/增加魔法护盾_护盾值型.cs b/OshimaModules/Effects/SkillEffects/增加魔法护盾_护盾值型.cs new file mode 100644 index 0000000..d179d2e --- /dev/null +++ b/OshimaModules/Effects/SkillEffects/增加魔法护盾_护盾值型.cs @@ -0,0 +1,34 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects +{ + public class 增加魔法护盾_护盾值型 : Effect + { + public override long Id => Skill.Id; + public override string Name => Skill.Name; + public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点魔法护盾值。"; + public string TargetDescription => Skill.SelectAllTeammates ? "友方全体角色" : $"目标{(Skill.CanSelectTargetCount > 1 ? $"至多 {Skill.CanSelectTargetCount} 个" : "")}友方角色"; + + private double 护盾值 => Level > 0 ? Math.Abs(基础数值护盾 + 基础护盾等级成长 * (Level - 1)) : Math.Abs(基础数值护盾); + private double 基础数值护盾 { get; set; } = 200; + private double 基础护盾等级成长 { get; set; } = 100; + + public 增加魔法护盾_护盾值型(Skill skill, double 基础数值护盾, double 基础护盾等级成长) : base(skill) + { + GamingQueue = skill.GamingQueue; + this.基础数值护盾 = 基础数值护盾; + this.基础护盾等级成长 = 基础护盾等级成长; + } + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + foreach (Character target in targets) + { + target.Shield[true, MagicType.None] += 护盾值; + WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点魔法护盾值!"); + GamingQueue?.LastRound.ApplyEffects.TryAdd(target, [EffectType.Shield]); + } + } + } +} diff --git a/OshimaModules/Effects/SkillEffects/增加魔法护盾_特效持续型.cs b/OshimaModules/Effects/SkillEffects/增加魔法护盾_特效持续型.cs new file mode 100644 index 0000000..b42b9cb --- /dev/null +++ b/OshimaModules/Effects/SkillEffects/增加魔法护盾_特效持续型.cs @@ -0,0 +1,45 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Oshima.FunGame.OshimaModules.Effects.PassiveEffects; + +namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects +{ + public class 增加魔法护盾_特效持续型 : Effect + { + public override long Id => Skill.Id; + public override string Name => Skill.Name; + public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点魔法护盾,持续 {持续时间}。"; + public string TargetDescription => Skill.SelectAllTeammates ? "友方全体角色" : $"目标{(Skill.CanSelectTargetCount > 1 ? $"至多 {Skill.CanSelectTargetCount} 个" : "")}友方角色"; + + private string 持续时间 => _durative && _duration > 0 ? _duration + $" {GameplayEquilibriumConstant.InGameTime}" : (!_durative && _durationTurn > 0 ? _durationTurn + " 回合" : $"0 {GameplayEquilibriumConstant.InGameTime}"); + private double 护盾值 => Level > 0 ? Math.Abs(基础数值护盾 + 基础护盾等级成长 * (Level - 1)) : Math.Abs(基础数值护盾); + private double 基础数值护盾 { get; set; } = 200; + private double 基础护盾等级成长 { get; set; } = 100; + private readonly bool _durative; + private readonly double _duration; + private readonly int _durationTurn; + + public 增加魔法护盾_特效持续型(Skill skill, double 基础数值护盾, double 基础护盾等级成长, bool durative = false, double duration = 0, int durationTurn = 0) : base(skill) + { + GamingQueue = skill.GamingQueue; + this.基础数值护盾 = 基础数值护盾; + this.基础护盾等级成长 = 基础护盾等级成长; + _durative = durative; + _duration = duration; + _durationTurn = durationTurn; + } + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + foreach (Character target in targets) + { + WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点魔法护盾!"); + 魔法护盾 e = new(Skill, caster, 护盾值, _durative, _duration, _durationTurn); + target.Effects.Add(e); + e.OnEffectGained(target); + e.DispelledType = DispelledType; + GamingQueue?.LastRound.ApplyEffects.TryAdd(target, [EffectType.Shield]); + } + } + } +} diff --git a/OshimaModules/Effects/SkillEffects/百分比回复生命值.cs b/OshimaModules/Effects/SkillEffects/百分比回复生命值.cs index 48d17a8..d767b35 100644 --- a/OshimaModules/Effects/SkillEffects/百分比回复生命值.cs +++ b/OshimaModules/Effects/SkillEffects/百分比回复生命值.cs @@ -6,7 +6,7 @@ namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects { public override long Id => Skill.Id; public override string Name => Skill.Name; - public override string Description => $"为{(Skill.CanSelectTargetCount > 1 ? $"至多 {Skill.CanSelectTargetCount} 个" : "")}目标回复其最大生命值 {百分比 * 100:0.##}% 点生命值。"; + public override string Description => $"为{(Skill.CanSelectTargetCount > 1 ? $"至多 {Skill.CanSelectTargetCount} 个" : "")}目标回复其最大生命值 {百分比 * 100:0.##}% 生命值。{(CanRespawn ? "如果目标已死亡,将复活目标。" : "")}"; private double 基础回复 { get; set; } = 0.03; private double 回复成长 { get; set; } = 0.03; diff --git a/OshimaModules/Skills/NiuNan/变幻之心.cs b/OshimaModules/Skills/NiuNan/变幻之心.cs index 5babf34..87aa779 100644 --- a/OshimaModules/Skills/NiuNan/变幻之心.cs +++ b/OshimaModules/Skills/NiuNan/变幻之心.cs @@ -25,53 +25,118 @@ namespace Oshima.FunGame.OshimaModules.Skills { public override long Id => Skill.Id; public override string Name => "变幻之心"; - public override string Description => $"检查 [ 智慧与力量 ] 的模式。在力量模式下,立即回复 {生命值回复 * 100:0.##}% 生命值;智力模式下,下一次魔法伤害提升 {伤害提升 * 100:0.##}%。"; + public override string Description => $"检查 [ 智慧与力量 ] 的模式。在力量模式下,立即回复 {生命值回复 * 100:0.##}% 生命值,同时下 {吸血次数} 次对敌人造成伤害时获得 30% 生命偷取;" + + $"智力模式下,下 {魔法加成次数} 次魔法伤害提升 {伤害提升 * 100:0.##}%。此技能效果不叠加,重复释放时将重置次数;若是模式切换后重复释放,将回收先前的效果。"; public override DispelledType DispelledType => DispelledType.CannotBeDispelled; + private int 吸血次数 + { + get + { + return Level switch + { + 1 => 3, + 2 => 3, + 3 => 4, + 4 => 4, + 5 => 5, + 6 => 5, + _ => 3 + }; + } + } + private int 魔法加成次数 + { + get + { + return Level switch + { + 1 => 1, + 2 => 2, + 3 => 2, + 4 => 3, + 5 => 3, + 6 => 4, + _ => 1 + }; + } + } private double 生命值回复 => 0.25 + 0.03 * (Level - 1); private double 伤害提升 => 0.6 + 0.4 * (Level - 1); + private double 当前吸血次数 = 0; + private double 当前魔法加成次数 = 0; public override void OnEffectGained(Character character) { - Skill.IsInEffect = true; + if (character.PrimaryAttribute == PrimaryAttribute.STR) + { + 当前吸血次数 = 吸血次数; + } + else if (character.PrimaryAttribute == PrimaryAttribute.INT) + { + 当前魔法加成次数 = 魔法加成次数; + } } public override void OnEffectLost(Character character) { - Skill.IsInEffect = false; + 当前吸血次数 = 0; + 当前魔法加成次数 = 0; } public override double AlterExpectedDamageBeforeCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, Dictionary totalDamageBonus) { - if (character == Skill.Character && isMagicDamage) + if (character == Skill.Character && isMagicDamage && 当前魔法加成次数 > 0) { + 当前魔法加成次数--; double 实际伤害提升百分比 = 伤害提升; double 实际伤害提升 = damage * 实际伤害提升百分比; - WriteLine($"[ {character} ] 发动了变幻之心!伤害提升了 {实际伤害提升:0.##} 点!"); - character.Effects.Remove(this); - OnEffectLost(character); + WriteLine($"[ {character} ] 发动了变幻之心!伤害提升了 {实际伤害提升:0.##} 点!变幻之心加成剩余:{当前魔法加成次数} 次。"); + if (当前魔法加成次数 == 0) + { + character.Effects.Remove(this); + OnEffectLost(character); + } return 实际伤害提升; } return 0; } + public override void AfterDamageCalculation(Character character, Character enemy, double damage, double actualDamage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult) + { + if (character == Skill.Character && 当前吸血次数 > 0 && (damageResult == DamageResult.Normal || damageResult == DamageResult.Critical) && damage > 0) + { + 当前吸血次数--; + double 实际吸血 = damage * 0.3; + character.HP += 实际吸血; + WriteLine($"[ {character} ] 发动了变幻之心!回复了 {实际吸血:0.##} 点生命值!变幻之心加成剩余:{当前吸血次数} 次。"); + if (当前吸血次数 == 0) + { + character.Effects.Remove(this); + OnEffectLost(character); + } + } + } + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { IEnumerable effects = caster.Effects.Where(e => e is 智慧与力量特效); if (effects.Any()) { + if (caster.Effects.Contains(this)) + { + OnEffectLost(caster); + } + caster.Effects.Add(this); + OnEffectGained(caster); if (caster.PrimaryAttribute == PrimaryAttribute.STR) { double 回复的生命 = 生命值回复 * caster.MaxHP; HealToTarget(caster, caster, 回复的生命); + GamingQueue?.LastRound.ApplyEffects.TryAdd(caster, [EffectType.Lifesteal]); } else if (caster.PrimaryAttribute == PrimaryAttribute.INT) { - if (!caster.Effects.Contains(this)) - { - caster.Effects.Add(this); - OnEffectGained(caster); - } GamingQueue?.LastRound.ApplyEffects.TryAdd(caster, [EffectType.DamageBoost]); } } diff --git a/OshimaModules/Skills/QWQAQW/破釜沉舟.cs b/OshimaModules/Skills/QWQAQW/破釜沉舟.cs index 3429388..884c91b 100644 --- a/OshimaModules/Skills/QWQAQW/破釜沉舟.cs +++ b/OshimaModules/Skills/QWQAQW/破釜沉舟.cs @@ -32,7 +32,7 @@ namespace Oshima.FunGame.OshimaModules.Skills { public override long Id => Skill.Id; public override string Name => Skill.Name; - public override string Description => $"最大生命值减少 20%。破釜沉舟:生命值高于 30% 时,受到额外的 [ {高于30额外伤害下限}~{高于30额外伤害上限}% ] 伤害,但是获得 [ 累计所受伤害的 {高于30的加成下限}~{高于30的加成上限}% ] 伤害加成;生命值低于等于 30% 时,不会受到额外的伤害,仅能获得 [ 累计受到的伤害 {低于30的加成下限}~{低于30的加成上限}% ] 伤害加成。" + + public override string Description => $"最大生命值减少 20%。破釜沉舟:生命值高于 30% 时,受到额外的 [ {高于30额外伤害下限}~{高于30额外伤害上限}% ] 伤害,获得 [ 累计所受伤害的 {高于30的加成下限}~{高于30的加成上限}% ] 伤害加成;生命值低于等于 30% 时,不会受到额外的伤害,并且获得 [ 累计受到的伤害 {低于30的加成下限}~{低于30的加成上限}% ] 的伤害加成。" + $"在没有受到任何伤害的时候,将获得 {常规伤害加成 * 100:0.##}% 伤害加成。" + (累计受到的伤害 > 0 ? $"(当前累计受到伤害:{累计受到的伤害:0.##})" : ""); private double 累计受到的伤害 = 0; @@ -42,10 +42,10 @@ namespace Oshima.FunGame.OshimaModules.Skills private readonly double 常规伤害加成 = 0.35; private readonly int 高于30额外伤害上限 = 30; private readonly int 高于30额外伤害下限 = 15; - private readonly int 高于30的加成上限 = 100; - private readonly int 高于30的加成下限 = 80; - private readonly int 低于30的加成上限 = 60; - private readonly int 低于30的加成下限 = 40; + private readonly int 高于30的加成上限 = 80; + private readonly int 高于30的加成下限 = 50; + private readonly int 低于30的加成上限 = 120; + private readonly int 低于30的加成下限 = 90; private double 伤害加成(double damage) { diff --git a/OshimaModules/Skills/QuDuoduo/弱者猎手.cs b/OshimaModules/Skills/QuDuoduo/弱者猎手.cs index e0619b0..9de436b 100644 --- a/OshimaModules/Skills/QuDuoduo/弱者猎手.cs +++ b/OshimaModules/Skills/QuDuoduo/弱者猎手.cs @@ -24,7 +24,7 @@ namespace Oshima.FunGame.OshimaModules.Skills { public override long Id => Skill.Id; public override string Name => Skill.Name; - public override string Description => $"在 AI 控制下,任何目标都将则优先选择血量更低的角色。行动开始时,弱者猎手会盯上一名角色,然后标记所有生命值百分比低于自己的角色。在此回合内攻击被盯上或者被标记的角色,将造成 150% 伤害。"; + public override string Description => $"在 AI 控制下,任何目标都将则优先选择血量更低的角色。行动开始时,弱者猎手会盯上一名角色,然后标记所有生命值百分比低于自己的角色。在此回合内攻击被盯上或者被标记的角色,将造成 140% 伤害。"; public HashSet 猎手标记 { get; set; } = []; @@ -32,7 +32,7 @@ namespace Oshima.FunGame.OshimaModules.Skills { if (character == Skill.Character && 猎手标记.Contains(enemy)) { - double 额外伤害 = damage * 0.5; + double 额外伤害 = damage * 0.4; return 额外伤害; } return 0; diff --git a/OshimaModules/Skills/XinYin/天赐之力.cs b/OshimaModules/Skills/XinYin/天赐之力.cs index 650d099..59e9d2d 100644 --- a/OshimaModules/Skills/XinYin/天赐之力.cs +++ b/OshimaModules/Skills/XinYin/天赐之力.cs @@ -25,7 +25,7 @@ namespace Oshima.FunGame.OshimaModules.Skills { public override long Id => Skill.Id; public override string Name => Skill.Name; - public override string Description => $"{Duration:0.##} {GameplayEquilibriumConstant.InGameTime}内,增加 40% 攻击力 [ {攻击力提升:0.##} ]、30% 物理穿透和 25% 闪避率(不可叠加),普通攻击硬直时间额外减少 20%,基于 {系数 * 100:0.##}% 敏捷 [ {伤害加成:0.##} ] 强化普通攻击的伤害。在持续时间内,【心灵之火】的冷却时间降低至 3 {GameplayEquilibriumConstant.InGameTime}。"; + public override string Description => $"{Duration:0.##} {GameplayEquilibriumConstant.InGameTime}内,增加 40% 攻击力 [ {攻击力提升:0.##} ]、30% 物理穿透和 25% 闪避率(不可叠加),普通攻击硬直时间额外减少 20%,基于 {系数 * 100:0.##}% 敏捷 [ {伤害加成:0.##} ] 强化普通攻击的伤害。在持续时间内,[ 心灵之火 ] 的冷却时间降低至 3 {GameplayEquilibriumConstant.InGameTime}。"; public override bool Durative => true; public override double Duration => 40; public override DispelledType DispelledType => DispelledType.CannotBeDispelled; diff --git a/OshimaModules/Skills/魔法/复苏术.cs b/OshimaModules/Skills/魔法/复苏术.cs index 4cc7403..ce32d5c 100644 --- a/OshimaModules/Skills/魔法/复苏术.cs +++ b/OshimaModules/Skills/魔法/复苏术.cs @@ -23,7 +23,7 @@ namespace Oshima.FunGame.OshimaModules.Skills { SelectTargetPredicates.Add(c => c.HP >= 0 && c.HP < c.MaxHP); Effects.Add(new 弱驱散特效(this)); - Effects.Add(new 纯数值回复生命(this, 160, 135, true)); + Effects.Add(new 百分比回复生命值(this, 0.24, 0.02, true)); } public override List GetSelectableTargets(Character caster, List enemys, List teammates) diff --git a/OshimaModules/Skills/魔法/大地之墙.cs b/OshimaModules/Skills/魔法/大地之墙.cs index 1719819..3d99046 100644 --- a/OshimaModules/Skills/魔法/大地之墙.cs +++ b/OshimaModules/Skills/魔法/大地之墙.cs @@ -70,7 +70,7 @@ namespace Oshima.FunGame.OshimaModules.Skills public 大地之墙(Character? character = null) : base(SkillType.Magic, character) { - Effect shield = new 增加物理护盾(this, 120, 160) + Effect shield = new 增加物理护盾_特效持续型(this, 120, 160, true, 15) { DispelledType = DispelledType.CannotBeDispelled }; diff --git a/OshimaModules/Skills/魔法/盖亚之盾.cs b/OshimaModules/Skills/魔法/盖亚之盾.cs index 439b354..80ba64a 100644 --- a/OshimaModules/Skills/魔法/盖亚之盾.cs +++ b/OshimaModules/Skills/魔法/盖亚之盾.cs @@ -22,8 +22,7 @@ namespace Oshima.FunGame.OshimaModules.Skills public 盖亚之盾(Character? character = null) : base(SkillType.Magic, character) { - Effects.Add(new 增加物理护盾(this, 160, 80)); - Effects.Add(new 增加魔法护盾(this, 160, 80)); + Effects.Add(new 增加混合护盾值(this, 160, 120)); } } } diff --git a/OshimaServers/Service/FunGameActionQueue.cs b/OshimaServers/Service/FunGameActionQueue.cs index 449945d..c52e319 100644 --- a/OshimaServers/Service/FunGameActionQueue.cs +++ b/OshimaServers/Service/FunGameActionQueue.cs @@ -172,7 +172,7 @@ namespace Oshima.FunGame.OshimaServers.Service mvpBuilder.AppendLine($"[ {mvp.ToStringWithLevel()} ]"); mvpBuilder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / 死亡数:" + stats.Deaths : "")}"); mvpBuilder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); - mvpBuilder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##}"); + mvpBuilder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##} / 护盾抵消:{stats.TotalShield:0.##}"); mvpBuilder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}"); mvpBuilder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); mvpBuilder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); @@ -189,7 +189,7 @@ namespace Oshima.FunGame.OshimaServers.Service builder.AppendLine($"{count + ". "}[ {character.ToStringWithLevel()} ]"); builder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / 死亡数:" + stats.Deaths : "")}"); builder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); - builder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##}"); + builder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##} / 护盾抵消:{stats.TotalShield:0.##}"); builder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}"); builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); builder.AppendLine($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); @@ -383,7 +383,7 @@ namespace Oshima.FunGame.OshimaServers.Service mvpBuilder.AppendLine($"{(team != null ? "[ " + team.Name + " ] " : "")}[ {mvp.ToStringWithLevel()} ]"); mvpBuilder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / 死亡数:" + stats.Deaths : "")}"); mvpBuilder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); - mvpBuilder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##}"); + mvpBuilder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##} / 护盾抵消:{stats.TotalShield:0.##}"); mvpBuilder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}"); mvpBuilder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); mvpBuilder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); diff --git a/OshimaServers/Service/FunGameSimulation.cs b/OshimaServers/Service/FunGameSimulation.cs index b2701f9..b65222e 100644 --- a/OshimaServers/Service/FunGameSimulation.cs +++ b/OshimaServers/Service/FunGameSimulation.cs @@ -418,7 +418,7 @@ namespace Oshima.FunGame.OshimaServers.Service mvpBuilder.AppendLine($"{(tgq != null ? "[ " + tgq.GetTeamFromEliminated(mvp)?.Name + " ] " : "")}[ {mvp.ToStringWithLevel()} ]"); mvpBuilder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / 死亡数:" + stats.Deaths : "")}"); mvpBuilder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); - mvpBuilder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##}"); + mvpBuilder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##} / 护盾抵消:{stats.TotalShield:0.##}"); mvpBuilder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}"); mvpBuilder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); mvpBuilder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); @@ -480,7 +480,7 @@ namespace Oshima.FunGame.OshimaServers.Service builder.AppendLine($"{(isWeb ? count + "." : ("[ " + tgq.GetTeamFromEliminated(character)?.Name + " ]" ?? ""))} [ {character.ToStringWithLevel()} ]"); builder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(tgq.MaxRespawnTimes != 0 ? " / 死亡数:" + stats.Deaths : "")}"); builder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); - builder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##}"); + builder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##} / 护盾抵消:{stats.TotalShield:0.##}"); builder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}"); builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); builder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); @@ -512,7 +512,7 @@ namespace Oshima.FunGame.OshimaServers.Service builder.AppendLine($"{(isWeb ? count + ". " : "")}[ {character.ToStringWithLevel()} ]"); builder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / 死亡数:" + stats.Deaths : "")}"); builder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); - builder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##}"); + builder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##} / 护盾抵消:{stats.TotalShield:0.##}"); builder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}"); builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); builder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); @@ -1090,6 +1090,7 @@ namespace Oshima.FunGame.OshimaServers.Service totalStats.AvgActionTurn = totalStats.ActionTurn / totalStats.Plays; totalStats.AvgLiveTime = Calculation.Round2Digits(totalStats.LiveTime / totalStats.Plays); totalStats.AvgControlTime = Calculation.Round2Digits(totalStats.ControlTime / totalStats.Plays); + totalStats.AvgShield = Calculation.Round2Digits(totalStats.TotalShield / totalStats.Plays); totalStats.AvgEarnedMoney = totalStats.TotalEarnedMoney / totalStats.Plays; totalStats.Winrates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Wins) / Convert.ToDouble(totalStats.Plays)); totalStats.Top3rates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Top3s) / Convert.ToDouble(totalStats.Plays)); diff --git a/OshimaWebAPI/Controllers/FunGameController.cs b/OshimaWebAPI/Controllers/FunGameController.cs index af10e12..7814ce7 100644 --- a/OshimaWebAPI/Controllers/FunGameController.cs +++ b/OshimaWebAPI/Controllers/FunGameController.cs @@ -71,6 +71,7 @@ namespace Oshima.FunGame.WebAPI.Controllers builder.AppendLine($"总计行动回合数:{stats.ActionTurn} / 场均:{stats.AvgActionTurn}"); builder.AppendLine($"总计存活时长:{stats.LiveTime:0.##} / 场均:{stats.AvgLiveTime:0.##}"); builder.AppendLine($"总计控制时长:{stats.ControlTime:0.##} / 场均:{stats.AvgControlTime:0.##}"); + builder.AppendLine($"总计护盾抵消:{stats.TotalShield:0.##} / 场均:{stats.AvgShield:0.##}"); builder.AppendLine($"总计赚取金钱:{stats.TotalEarnedMoney} / 场均:{stats.AvgEarnedMoney}"); builder.AppendLine($"每回合伤害:{stats.DamagePerRound:0.##}"); builder.AppendLine($"每行动回合伤害:{stats.DamagePerTurn:0.##}"); @@ -128,6 +129,7 @@ namespace Oshima.FunGame.WebAPI.Controllers builder.AppendLine($"总计行动回合数:{stats.ActionTurn} / 场均:{stats.AvgActionTurn}"); builder.AppendLine($"总计存活时长:{stats.LiveTime:0.##} / 场均:{stats.AvgLiveTime:0.##}"); builder.AppendLine($"总计控制时长:{stats.ControlTime:0.##} / 场均:{stats.AvgControlTime:0.##}"); + builder.AppendLine($"总计护盾抵消:{stats.TotalShield:0.##} / 场均:{stats.AvgShield:0.##}"); builder.AppendLine($"总计赚取金钱:{stats.TotalEarnedMoney} / 场均:{stats.AvgEarnedMoney}"); builder.AppendLine($"每回合伤害:{stats.DamagePerRound:0.##}"); builder.AppendLine($"每行动回合伤害:{stats.DamagePerTurn:0.##}");