From 326449345bc0c8de1ec3ecc56b7d424c7071647f Mon Sep 17 00:00:00 2001 From: milimoe Date: Wed, 31 Dec 2025 01:38:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=B4=E5=A4=9A=E7=9A=84?= =?UTF-8?q?=E6=8A=80=E8=83=BD=E5=92=8C=E7=89=B9=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OshimaModules/Effects/PassiveEffects/愤怒.cs | 3 +- OshimaModules/Effects/PassiveEffects/混乱.cs | 5 +- .../Effects/SkillEffects/打断施法.cs | 24 ++++++ OshimaModules/Modules/SkillModule.cs | 7 ++ OshimaModules/Skills/QuDuoduo/弱者猎手.cs | 4 +- OshimaModules/Skills/SkillID.cs | 10 ++- OshimaModules/Skills/XinYin/天赐之力.cs | 3 +- OshimaModules/Skills/战技/助威.cs | 80 +++++++++++++++++++ OshimaModules/Skills/战技/双连击.cs | 56 +++++++++++++ OshimaModules/Skills/战技/挑拨.cs | 73 +++++++++++++++++ OshimaModules/Skills/战技/旋风轮.cs | 24 ++++++ OshimaModules/Skills/战技/疾走.cs | 72 +++++++++++++++++ OshimaModules/Skills/战技/疾风步.cs | 2 +- OshimaModules/Skills/战技/绝影.cs | 22 +++++ OshimaModules/Skills/战技/绞丝棍.cs | 22 +++++ OshimaModules/Skills/战技/金刚击.cs | 23 ++++++ OshimaModules/Skills/战技/闪现.cs | 36 +++++++++ OshimaModules/Skills/被动/征服者.cs | 15 ++-- OshimaModules/Skills/被动/致命节奏.cs | 2 +- OshimaModules/Skills/被动/黑暗收割.cs | 7 +- OshimaServers/Service/FunGameService.cs | 2 +- OshimaServers/Service/FunGameSimulation.cs | 15 ++-- 22 files changed, 478 insertions(+), 29 deletions(-) create mode 100644 OshimaModules/Effects/SkillEffects/打断施法.cs create mode 100644 OshimaModules/Skills/战技/助威.cs create mode 100644 OshimaModules/Skills/战技/双连击.cs create mode 100644 OshimaModules/Skills/战技/挑拨.cs create mode 100644 OshimaModules/Skills/战技/旋风轮.cs create mode 100644 OshimaModules/Skills/战技/疾走.cs create mode 100644 OshimaModules/Skills/战技/绝影.cs create mode 100644 OshimaModules/Skills/战技/绞丝棍.cs create mode 100644 OshimaModules/Skills/战技/金刚击.cs create mode 100644 OshimaModules/Skills/战技/闪现.cs diff --git a/OshimaModules/Effects/PassiveEffects/愤怒.cs b/OshimaModules/Effects/PassiveEffects/愤怒.cs index b011301..20462cf 100644 --- a/OshimaModules/Effects/PassiveEffects/愤怒.cs +++ b/OshimaModules/Effects/PassiveEffects/愤怒.cs @@ -1,5 +1,6 @@ using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Core.Model; using Oshima.FunGame.OshimaModules.Effects.OpenEffects; namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects @@ -49,7 +50,7 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects } } - public override CharacterActionType AlterActionTypeBeforeAction(Character character, CharacterState state, ref bool canUseItem, ref bool canCastSkill, ref double pUseItem, ref double pCastSkill, ref double pNormalAttack, ref bool forceAction) + public override CharacterActionType AlterActionTypeBeforeAction(Character character, DecisionPoints dp, CharacterState state, ref bool canUseItem, ref bool canCastSkill, ref double pUseItem, ref double pCastSkill, ref double pNormalAttack, ref bool forceAction) { forceAction = true; if (_targetCharacter.HP > 0) diff --git a/OshimaModules/Effects/PassiveEffects/混乱.cs b/OshimaModules/Effects/PassiveEffects/混乱.cs index fc09b1e..ca90ed0 100644 --- a/OshimaModules/Effects/PassiveEffects/混乱.cs +++ b/OshimaModules/Effects/PassiveEffects/混乱.cs @@ -1,5 +1,6 @@ using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Core.Model; using Oshima.FunGame.OshimaModules.Effects.OpenEffects; namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects @@ -43,10 +44,10 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects teammates.AddRange(enemys); } - public override CharacterActionType AlterActionTypeBeforeAction(Character character, CharacterState state, ref bool canUseItem, ref bool canCastSkill, ref double pUseItem, ref double pCastSkill, ref double pNormalAttack, ref bool forceAction) + public override CharacterActionType AlterActionTypeBeforeAction(Character character, DecisionPoints dp, CharacterState state, ref bool canUseItem, ref bool canCastSkill, ref double pUseItem, ref double pCastSkill, ref double pNormalAttack, ref bool forceAction) { forceAction = true; - return Milimoe.FunGame.Core.Model.GamingQueue.GetActionType(pUseItem, pCastSkill, pNormalAttack); + return Milimoe.FunGame.Core.Model.GamingQueue.GetActionType(dp, pUseItem, pCastSkill, pNormalAttack); } public override void OnTurnEnd(Character character) diff --git a/OshimaModules/Effects/SkillEffects/打断施法.cs b/OshimaModules/Effects/SkillEffects/打断施法.cs new file mode 100644 index 0000000..26f6060 --- /dev/null +++ b/OshimaModules/Effects/SkillEffects/打断施法.cs @@ -0,0 +1,24 @@ +using Milimoe.FunGame.Core.Entity; + +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 => $"打断施法:中断目标正在进行的吟唱。"; + + public 打断施法(Skill skill) : base(skill) + { + GamingQueue = skill.GamingQueue; + } + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + foreach (Character target in targets) + { + GamingQueue?.InterruptCastingAsync(target, caster); + } + } + } +} diff --git a/OshimaModules/Modules/SkillModule.cs b/OshimaModules/Modules/SkillModule.cs index 5cf3ad2..a849243 100644 --- a/OshimaModules/Modules/SkillModule.cs +++ b/OshimaModules/Modules/SkillModule.cs @@ -100,6 +100,13 @@ namespace Oshima.FunGame.OshimaModules (long)MagicID.时间加速复 => new 时间加速复(), (long)MagicID.时间减速复 => new 时间减速复(), (long)SkillID.疾风步 => new 疾风步(), + (long)SkillID.疾走 => new 疾走(), + (long)SkillID.助威 => new 助威(), + (long)SkillID.挑拨 => new 挑拨(), + (long)SkillID.绞丝棍 => new 绞丝棍(), + (long)SkillID.金刚击 => new 金刚击(), + (long)SkillID.旋风轮 => new 旋风轮(), + (long)SkillID.双连击 => new 双连击(), (long)SuperSkillID.力量爆发 => new 力量爆发(), (long)SuperSkillID.天赐之力 => new 天赐之力(), (long)SuperSkillID.魔法涌流 => new 魔法涌流(), diff --git a/OshimaModules/Skills/QuDuoduo/弱者猎手.cs b/OshimaModules/Skills/QuDuoduo/弱者猎手.cs index e43288e..fa3ad01 100644 --- a/OshimaModules/Skills/QuDuoduo/弱者猎手.cs +++ b/OshimaModules/Skills/QuDuoduo/弱者猎手.cs @@ -41,7 +41,7 @@ namespace Oshima.FunGame.OshimaModules.Skills public override void AlterSelectListBeforeAction(Character character, List enemys, List teammates, List skills, Dictionary continuousKilling, Dictionary earnedMoney) { 猎手标记.Clear(); - IEnumerable list = [.. enemys.OrderBy(e => e.HP / e.MaxHP)]; + IEnumerable list = [.. enemys.Where(e => e.HP > 0).OrderBy(e => e.HP / e.MaxHP)]; if (list.Any()) { Character first = list.First(); @@ -61,7 +61,7 @@ namespace Oshima.FunGame.OshimaModules.Skills { foreach (Character enemy in enemys) { - if (Skill.Character != null && ((enemy.HP / enemy.MaxHP) < (Skill.Character.HP / Skill.Character.MaxHP))) + if (Skill.Character != null && enemy.HP > 0 && (enemy.HP / enemy.MaxHP) < (Skill.Character.HP / Skill.Character.MaxHP)) { 猎手标记.Add(enemy); } diff --git a/OshimaModules/Skills/SkillID.cs b/OshimaModules/Skills/SkillID.cs index 7c031c2..b426dff 100644 --- a/OshimaModules/Skills/SkillID.cs +++ b/OshimaModules/Skills/SkillID.cs @@ -137,7 +137,7 @@ namespace Oshima.FunGame.OshimaModules.Skills * 旋风轮 = 多目标伤害 * 双连击 = 单体2次普通攻击 * 绝影 = 单体伤害+迟滞(硬直时间延长),可弱驱散 - * 胧 = 单体攻击,概率战斗不能(攻击不能+施法不能),需强驱散 + * 胧 = 单体攻击,概率战斗不能(攻击受限+施法不能),需强驱散 * 魔眼 = 单体迟滞(硬直时间延长)、概率混乱(行动受限,如同AI控制行动,回合型),需强驱散 * 风之鞭 = 多目标伤害 * 拘束之鞭 = 单体伤害+施法解除 @@ -184,6 +184,8 @@ namespace Oshima.FunGame.OshimaModules.Skills * 无尽剑制 = 全体伤害 * 灾难一掷 = 单体伤害,概率战斗不能 * 血腥旋转 = 多目标伤害,概率战斗不能 + * 疾走 = 提升移动距离 + * 闪现 = 传送到指定位置 */ public enum SkillID : long { @@ -241,7 +243,9 @@ namespace Oshima.FunGame.OshimaModules.Skills 千剑之雨 = 2052, 无尽剑制 = 2053, 灾难一掷 = 2054, - 血腥旋转 = 2055 + 血腥旋转 = 2055, + 疾走 = 2056, + 闪现 = 2057 } /** @@ -260,7 +264,7 @@ namespace Oshima.FunGame.OshimaModules.Skills * 樱花无双击 = 单体伤害+生命偷取 * 漆黑之牙 = 全体伤害,此技能击杀敌人时,永久提升该技能伤害 * 女王之怒 = 单体伤害+虚弱(伤害降低+护甲魔抗降低+重伤,回合型),可弱驱散 - * 裁决塔罗 = 多目标伤害+以下状态之一:冻结(完全行动不能+魔法易伤)/混乱(行动受限,如同AI控制行动,回合型)/战斗不能(攻击不能+施法不能),需强驱散 + * 裁决塔罗 = 多目标伤害+以下状态之一:冻结(完全行动不能+魔法易伤)/混乱(行动受限,如同AI控制行动,回合型)/战斗不能(攻击受限+施法不能),需强驱散 * 光明之环 = 我方·全体强驱散+复苏,复苏的回复量为20%;起步消耗100能量,每10能量额外增加护甲魔抗 * 圣星光旋 = 全体伤害,概率眩晕(时间型),需强驱散 * 炎龙倒海 = 全体伤害,削减能量,减少行动速度和加速系数,推迟当前硬直 diff --git a/OshimaModules/Skills/XinYin/天赐之力.cs b/OshimaModules/Skills/XinYin/天赐之力.cs index b39ffa9..b63c90c 100644 --- a/OshimaModules/Skills/XinYin/天赐之力.cs +++ b/OshimaModules/Skills/XinYin/天赐之力.cs @@ -1,5 +1,6 @@ using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Core.Model; namespace Oshima.FunGame.OshimaModules.Skills { @@ -62,7 +63,7 @@ namespace Oshima.FunGame.OshimaModules.Skills } } - public override CharacterActionType AlterActionTypeBeforeAction(Character character, CharacterState state, ref bool canUseItem, ref bool canCastSkill, ref double pUseItem, ref double pCastSkill, ref double pNormalAttack, ref bool forceAction) + public override CharacterActionType AlterActionTypeBeforeAction(Character character, DecisionPoints dp, CharacterState state, ref bool canUseItem, ref bool canCastSkill, ref double pUseItem, ref double pCastSkill, ref double pNormalAttack, ref bool forceAction) { pNormalAttack += 0.1; return CharacterActionType.None; diff --git a/OshimaModules/Skills/战技/助威.cs b/OshimaModules/Skills/战技/助威.cs new file mode 100644 index 0000000..51d1810 --- /dev/null +++ b/OshimaModules/Skills/战技/助威.cs @@ -0,0 +1,80 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Oshima.FunGame.OshimaModules.Effects.OpenEffects; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 助威 : Skill + { + public override long Id => (long)SkillID.助威; + public override string Name => "助威"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; + public override double EPCost => 75; + public override double CD => 35; + public override double HardnessTime { get; set; } = 7; + public override bool CanSelectSelf => true; + public override bool CanSelectTeammate => true; + public override bool CanSelectEnemy => false; + public override int CanSelectTargetCount => 3; + + public 助威(Character? character = null) : base(SkillType.Skill, character) + { + CastRange = 5; + Effects.Add(new 助威特效(this)); + } + } + + public class 助威特效 : Effect + { + public override long Id => Skill.Id; + public override string Name => Skill.Name; + public override string Description => $"提升目标{(Skill.CanSelectTargetCount > 1 ? $"至多 {Skill.CanSelectTargetCount} 个" : "")}友方角色 {ATK * 100:0.##}% 攻击力,持续 {持续时间}。"; + public override EffectType EffectType => EffectType.DamageBoost; + public override DispelledType DispelledType => DispelledType.Weak; + + private string 持续时间 => _durative && _duration > 0 ? 实际持续时间 + $" {GameplayEquilibriumConstant.InGameTime}" : (!_durative && _durationTurn > 0 ? 实际持续时间 + " 回合" : $"0 {GameplayEquilibriumConstant.InGameTime}"); + private double 实际持续时间 => _durative && _duration > 0 ? _duration + _levelGrowth * (Level - 1) : (!_durative && _durationTurn > 0 ? _durationTurn + _levelGrowth * (Level - 1) : 0); + + private readonly bool _durative = false; + private readonly double _duration = 0; + private readonly int _durationTurn = 3; + private readonly double _levelGrowth = 0; + + private double ATK => Level > 0 ? 0.07 + 0.03 * (Level - 1) : 0.03; + + public 助威特效(Skill skill) : base(skill) + { + GamingQueue = skill.GamingQueue; + } + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + foreach (Character target in targets) + { + WriteLine($"[ {target} ] 的攻击力提升了 {ATK * 100:0.##}% [ {target.BaseATK * ATK:0.##} ] 点!持续时间:{持续时间}!"); + ExATK2 e = new(Skill, new() + { + { "exatk", ATK } + }, caster); + target.Effects.Add(e); + if (_durative && _duration > 0) + { + e.Durative = true; + e.Duration = 实际持续时间; + e.RemainDuration = 实际持续时间; + } + else if (!_durative && _durationTurn > 0) + { + e.Durative = false; + e.DurationTurn = (int)实际持续时间; + e.RemainDurationTurn = (int)实际持续时间; + } + e.EffectType = EffectType; + e.Source = caster; + e.OnEffectGained(target); + GamingQueue?.LastRound.AddApplyEffects(target, EffectType); + } + } + } +} diff --git a/OshimaModules/Skills/战技/双连击.cs b/OshimaModules/Skills/战技/双连击.cs new file mode 100644 index 0000000..1fcffab --- /dev/null +++ b/OshimaModules/Skills/战技/双连击.cs @@ -0,0 +1,56 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Core.Model; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 双连击 : Skill + { + public override long Id => (long)SkillID.双连击; + public override string Name => "双连击"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; + public override double EPCost => 60; + public override double CD => 30; + public override double HardnessTime { get; set; } = 10; + public override bool CanSelectSelf => Character?.NormalAttack.CanSelectSelf ?? false; + public override bool CanSelectTeammate => Character?.NormalAttack.CanSelectTeammate ?? false; + public override bool CanSelectEnemy => Character?.NormalAttack.CanSelectEnemy ?? true; + public override int CanSelectTargetCount => Character?.NormalAttack.CanSelectTargetCount ?? 1; + + public 双连击(Character? character = null) : base(SkillType.Skill, character) + { + Effects.Add(new 双连击特效(this)); + } + } + + public class 双连击特效 : Effect + { + public override long Id => Skill.Id; + public override string Name => Skill.Name; + public override string Description => $"基于普通攻击的目标选择器对目标发起 2 次普通攻击。若该回合已使用过普通攻击,则只会发起 1 次普通攻击;使用该技能后,该回合不再允许普通攻击。伤害特效可叠加;不受 [ 攻击受限 ] 状态的限制。"; + + public 双连击特效(Skill skill) : base(skill) + { + GamingQueue = skill.GamingQueue; + } + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + if (GamingQueue != null) + { + bool hasAttacked = false; + if (GamingQueue.CharacterDecisionPoints.TryGetValue(caster, out DecisionPoints? dp) && dp != null) + { + hasAttacked = dp.ActionTypes.Contains(CharacterActionType.NormalAttack); + dp.ActionTypes.Add(CharacterActionType.NormalAttack); + } + caster.NormalAttack.Attack(GamingQueue, caster, targets); + if (!hasAttacked) + { + caster.NormalAttack.Attack(GamingQueue, caster, targets); + } + } + } + } +} diff --git a/OshimaModules/Skills/战技/挑拨.cs b/OshimaModules/Skills/战技/挑拨.cs new file mode 100644 index 0000000..670adc9 --- /dev/null +++ b/OshimaModules/Skills/战技/挑拨.cs @@ -0,0 +1,73 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Oshima.FunGame.OshimaModules.Effects.PassiveEffects; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 挑拨 : Skill + { + public override long Id => (long)SkillID.挑拨; + public override string Name => "挑拨"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; + public override double EPCost => 65; + public override double CD => 55; + public override double HardnessTime { get; set; } = 10; + public override bool CanSelectSelf => false; + public override bool CanSelectTeammate => false; + public override bool CanSelectEnemy => true; + public override int CanSelectTargetCount => 3; + + public 挑拨(Character? character = null) : base(SkillType.Skill, character) + { + CastRange = 4; + Effects.Add(new 挑拨特效(this)); + } + } + + public class 挑拨特效 : Effect + { + public override long Id => Skill.Id; + public override string Name => Skill.Name; + public override string Description => $"对目标{(Skill.CanSelectTargetCount > 1 ? $"至多 {Skill.CanSelectTargetCount} 个" : "")}敌方角色施加愤怒状态。愤怒:行动受限且失控,行动回合中无法自主行动,仅能对施法者发起普通攻击。持续 {持续时间}。"; + public override EffectType EffectType => EffectType.Taunt; + public override DispelledType DispelledType => DispelledType.Strong; + + private string 持续时间 => _durative && _duration > 0 ? 实际持续时间 + $" {GameplayEquilibriumConstant.InGameTime}" : (!_durative && _durationTurn > 0 ? 实际持续时间 + " 回合" : $"0 {GameplayEquilibriumConstant.InGameTime}"); + private double 实际持续时间 => _durative && _duration > 0 ? _duration + _levelGrowth * (Level - 1) : (!_durative && _durationTurn > 0 ? _durationTurn + _levelGrowth * (Level - 1) : 0); + + private readonly bool _durative = false; + private readonly double _duration = 0; + private readonly int _durationTurn = 2; + private readonly double _levelGrowth = 0; + + public 挑拨特效(Skill skill) : base(skill) + { + GamingQueue = skill.GamingQueue; + } + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + foreach (Character target in targets) + { + WriteLine($"[ {caster} ] 嘲讽了 [ {target} ] ,[ {target} ] 愤怒了!!持续时间:{持续时间}!"); + 愤怒 e = new(Skill, caster, caster); + if (_durative && _duration > 0) + { + e.Durative = true; + e.Duration = 实际持续时间; + e.RemainDuration = 实际持续时间; + } + else if (!_durative && _durationTurn > 0) + { + e.Durative = false; + e.DurationTurn = (int)实际持续时间; + e.RemainDurationTurn = (int)实际持续时间; + } + target.Effects.Add(e); + e.OnEffectGained(target); + GamingQueue?.LastRound.AddApplyEffects(target, e.EffectType); + } + } + } +} diff --git a/OshimaModules/Skills/战技/旋风轮.cs b/OshimaModules/Skills/战技/旋风轮.cs new file mode 100644 index 0000000..0b84f45 --- /dev/null +++ b/OshimaModules/Skills/战技/旋风轮.cs @@ -0,0 +1,24 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Oshima.FunGame.OshimaModules.Effects.SkillEffects; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 旋风轮 : Skill + { + public override long Id => (long)SkillID.旋风轮; + public override string Name => "旋风轮"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; + public override double EPCost => 80; + public override double CD => 25; + public override double HardnessTime { get; set; } = 8; + public override int CanSelectTargetCount => 5; + + public 旋风轮(Character? character = null) : base(SkillType.Skill, character) + { + CastRange = 6; + Effects.Add(new 基于攻击力的伤害_带基础伤害(this, 40, 55, 0.1, 0.03, DamageType.Physical)); + } + } +} diff --git a/OshimaModules/Skills/战技/疾走.cs b/OshimaModules/Skills/战技/疾走.cs new file mode 100644 index 0000000..7256dba --- /dev/null +++ b/OshimaModules/Skills/战技/疾走.cs @@ -0,0 +1,72 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 疾走 : Skill + { + public override long Id => (long)SkillID.疾走; + public override string Name => "疾走"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; + public override double EPCost => 25; + public override double CD => 15; + public override double HardnessTime { get; set; } = 3; + public override bool CanSelectSelf => true; + public override bool CanSelectEnemy => false; + + public 疾走(Character? character = null) : base(SkillType.Skill, character) + { + Effects.Add(new 疾走特效(this)); + } + } + + public class 疾走特效(Skill skill) : Effect(skill) + { + public override long Id => Skill.Id; + public override string Name => Skill.Name; + public override string Description => $"本回合内大幅提升移动距离。"; + public override string DispelDescription => ""; + public override EffectType EffectType => EffectType.Haste; + public override bool Durative => false; + public override double Duration => 0; + public override int DurationTurn => 1; + + private int 移动距离提升 + { + get + { + return Skill.Level switch + { + 2 or 3 => 2, + 4 or 5 => 3, + 6 => 4, + _ => 1, + }; + } + } + + public override void OnEffectGained(Character character) + { + Skill.IsInEffect = true; + character.ExMOV += 移动距离提升; + } + + public override void OnEffectLost(Character character) + { + Skill.IsInEffect = false; + character.ExMOV -= 移动距离提升; + } + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + if (!caster.Effects.Contains(this)) + { + GamingQueue?.LastRound.AddApplyEffects(caster, EffectType); + RemainDurationTurn = DurationTurn; + caster.Effects.Add(this); + OnEffectGained(caster); + } + } + } +} diff --git a/OshimaModules/Skills/战技/疾风步.cs b/OshimaModules/Skills/战技/疾风步.cs index 1559edd..1d091b2 100644 --- a/OshimaModules/Skills/战技/疾风步.cs +++ b/OshimaModules/Skills/战技/疾风步.cs @@ -10,7 +10,7 @@ namespace Oshima.FunGame.OshimaModules.Skills public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; public override double EPCost => 60; - public override double CD => 35; + public override double CD => 45; public override double HardnessTime { get; set; } = 5; public override bool CanSelectSelf => true; public override bool CanSelectEnemy => false; diff --git a/OshimaModules/Skills/战技/绝影.cs b/OshimaModules/Skills/战技/绝影.cs new file mode 100644 index 0000000..7fe75ae --- /dev/null +++ b/OshimaModules/Skills/战技/绝影.cs @@ -0,0 +1,22 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Oshima.FunGame.OshimaModules.Effects.SkillEffects; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 绝影 : Skill + { + public override long Id => (long)SkillID.绝影; + public override string Name => "绝影"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; + public override double EPCost => 45; + public override double CD => 12; + public override double HardnessTime { get; set; } = 7; + + public 绝影(Character? character = null) : base(SkillType.Skill, character) + { + Effects.Add(new 基于攻击力的伤害_带基础伤害(this, 75, 70, 0.075, 0.055, DamageType.Physical)); + } + } +} diff --git a/OshimaModules/Skills/战技/绞丝棍.cs b/OshimaModules/Skills/战技/绞丝棍.cs new file mode 100644 index 0000000..14f93e3 --- /dev/null +++ b/OshimaModules/Skills/战技/绞丝棍.cs @@ -0,0 +1,22 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Oshima.FunGame.OshimaModules.Effects.SkillEffects; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 绞丝棍 : Skill + { + public override long Id => (long)SkillID.绞丝棍; + public override string Name => "绞丝棍"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; + public override double EPCost => 45; + public override double CD => 12; + public override double HardnessTime { get; set; } = 7; + + public 绞丝棍(Character? character = null) : base(SkillType.Skill, character) + { + Effects.Add(new 基于攻击力的伤害_带基础伤害(this, 75, 70, 0.075, 0.055, DamageType.Physical)); + } + } +} diff --git a/OshimaModules/Skills/战技/金刚击.cs b/OshimaModules/Skills/战技/金刚击.cs new file mode 100644 index 0000000..401d87f --- /dev/null +++ b/OshimaModules/Skills/战技/金刚击.cs @@ -0,0 +1,23 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Oshima.FunGame.OshimaModules.Effects.SkillEffects; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 金刚击 : Skill + { + public override long Id => (long)SkillID.金刚击; + public override string Name => "金刚击"; + public override string Description => string.Join("", Effects.Select(e => e.Description)); + public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; + public override double EPCost => 60; + public override double CD => 20; + public override double HardnessTime { get; set; } = 8; + + public 金刚击(Character? character = null) : base(SkillType.Skill, character) + { + Effects.Add(new 基于攻击力的伤害_带基础伤害(this, 65, 65, 0.09,0.04, DamageType.Physical)); + Effects.Add(new 打断施法(this)); + } + } +} diff --git a/OshimaModules/Skills/战技/闪现.cs b/OshimaModules/Skills/战技/闪现.cs new file mode 100644 index 0000000..0a6b094 --- /dev/null +++ b/OshimaModules/Skills/战技/闪现.cs @@ -0,0 +1,36 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + [Obsolete("非指向性技能测试,请勿使用")] + public class 闪现 : Skill + { + public override long Id => (long)SkillID.闪现; + public override string Name => "闪现"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override string DispelDescription => Effects.Count > 0 ? Effects.First().DispelDescription : ""; + public override double EPCost => 25; + public override double CD => 25; + public override double HardnessTime { get; set; } = 3; + public override bool IsNonDirectional => true; + + public 闪现(Character? character = null) : base(SkillType.Skill, character) + { + Effects.Add(new 闪现特效(this)); + } + } + + public class 闪现特效(Skill skill) : Effect(skill) + { + public override long Id => Skill.Id; + public override string Name => Skill.Name; + public override string Description => $"立即将角色传送到范围内的任意一个没有被角色占据的指定地点。"; + public override string DispelDescription => ""; + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + + } + } +} diff --git a/OshimaModules/Skills/被动/征服者.cs b/OshimaModules/Skills/被动/征服者.cs index 7d5642c..1120d25 100644 --- a/OshimaModules/Skills/被动/征服者.cs +++ b/OshimaModules/Skills/被动/征服者.cs @@ -47,21 +47,14 @@ namespace Oshima.FunGame.OshimaModules.Skills { 是否是满层伤害 = true; 是否是叠加伤害 = true; - WriteLine($"[ {character} ] 发动了征服者!"); - DamageToEnemy(character, enemy, DamageType.True, magicType, 真实伤害 * 层数); WriteLine($"[ {character} ] 发动了征服者的满层效果!"); DamageToEnemy(character, enemy, DamageType.True, magicType, 满层伤害); ClearExPrimaryAttribute(character); 层数 = 0; + 允许叠层 = false; } if (!是否是满层伤害 && !是否是叠加伤害 && 层数 < 4) { - if (层数 > 0 && enemy.HP > 0) - { - 是否是叠加伤害 = true; - WriteLine($"[ {character} ] 发动了征服者!"); - DamageToEnemy(character, enemy, DamageType.True, magicType, 真实伤害 * 层数); - } if (允许叠层) { 允许叠层 = false; @@ -82,6 +75,12 @@ namespace Oshima.FunGame.OshimaModules.Skills break; } WriteLine($"[ {character} ] 的征服者层数:{层数},获得了 {累计增加:0.##} 点核心属性({CharacterSet.GetPrimaryAttributeName(核心属性)})加成。"); + if (层数 > 0 && enemy.HP > 0) + { + 是否是叠加伤害 = true; + WriteLine($"[ {character} ] 发动了征服者!"); + DamageToEnemy(character, enemy, DamageType.True, magicType, 真实伤害 * 层数); + } } } } diff --git a/OshimaModules/Skills/被动/致命节奏.cs b/OshimaModules/Skills/被动/致命节奏.cs index 7f1c636..cb6973a 100644 --- a/OshimaModules/Skills/被动/致命节奏.cs +++ b/OshimaModules/Skills/被动/致命节奏.cs @@ -57,7 +57,7 @@ namespace Oshima.FunGame.OshimaModules.Skills RecordCharacterApplyEffects(character, EffectType.Haste); // 检查是否达到阈值 - if (character.ActionCoefficient * 100 >= 行动系数阈值) + if (character.ActionCoefficient * 100 >= 行动系数阈值 && !冷却中) { Skill.Enable = false; Skill.CurrentCD = 冷却时间; diff --git a/OshimaModules/Skills/被动/黑暗收割.cs b/OshimaModules/Skills/被动/黑暗收割.cs index 66b8bb8..d85215f 100644 --- a/OshimaModules/Skills/被动/黑暗收割.cs +++ b/OshimaModules/Skills/被动/黑暗收割.cs @@ -58,8 +58,11 @@ namespace Oshima.FunGame.OshimaModules.Skills if (death == Skill.Character && 当前灵魂数量 > 0) { int lost = 当前灵魂数量 / 2; - 当前灵魂数量 -= lost; - WriteLine($"[ {death} ] 因死亡损失了 [ {lost} ] 个灵魂!"); + if (lost > 0) + { + 当前灵魂数量 -= lost; + WriteLine($"[ {death} ] 因死亡损失了 [ {lost} ] 个灵魂!"); + } } } diff --git a/OshimaServers/Service/FunGameService.cs b/OshimaServers/Service/FunGameService.cs index 5a96c09..75dfcf4 100644 --- a/OshimaServers/Service/FunGameService.cs +++ b/OshimaServers/Service/FunGameService.cs @@ -46,7 +46,7 @@ namespace Oshima.FunGame.OshimaServers.Service FunGameConstant.Characters.Add(new dddovo()); FunGameConstant.Characters.Add(new Quduoduo()); - FunGameConstant.Skills.AddRange([new 疾风步()]); + FunGameConstant.Skills.AddRange([new 疾风步(), new 疾走(), new 助威(), new 挑拨(), new 绞丝棍(), new 金刚击(), new 旋风轮(), new 双连击()]); FunGameConstant.SuperSkills.AddRange([new 嗜血本能(), new 平衡强化(), new 绝对领域(), new 精准打击(), new 三重叠加(), new 变幻之心(), new 力量爆发(), new 能量毁灭(), new 血之狂欢(), new 迅捷之势(), new 天赐之力(), new 魔法涌流()]); diff --git a/OshimaServers/Service/FunGameSimulation.cs b/OshimaServers/Service/FunGameSimulation.cs index 1de2412..67a5b8d 100644 --- a/OshimaServers/Service/FunGameSimulation.cs +++ b/OshimaServers/Service/FunGameSimulation.cs @@ -121,12 +121,14 @@ namespace Oshima.FunGame.OshimaServers.Service c.Level = clevel; c.NormalAttack.Level = mlevel; FunGameService.AddCharacterSkills(c, 1, slevel, slevel); - Skill 疾风步 = new 疾风步(c) + foreach (Skill skillLoop in FunGameConstant.Skills.Where(s => s is not 疾走).OrderBy(o => Random.Shared.Next()).Take(3)) { - Level = slevel - }; - c.Skills.Add(疾风步); - foreach (Skill skillLoop in FunGameConstant.CommonPassiveSkills) + Skill skill = skillLoop.Copy(); + skill.Character = c; + skill.Level = slevel; + c.Skills.Add(skill); + } + foreach (Skill skillLoop in FunGameConstant.CommonPassiveSkills.OrderBy(o => Random.Shared.Next()).Take(3)) { Skill passive = skillLoop.Copy(); passive.Character = c; @@ -343,7 +345,7 @@ namespace Oshima.FunGame.OshimaServers.Service break; } - actionQueue.DisplayQueue(); + if (isWeb) actionQueue.DisplayQueue(); WriteLine(""); } @@ -440,7 +442,6 @@ namespace Oshima.FunGame.OshimaServers.Service mvpBuilder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); if (stats.TotalTrueDamage > 0 || stats.TotalTakenTrueDamage > 0) mvpBuilder.AppendLine($"总计真实伤害:{stats.TotalTrueDamage:0.##} / 总承受真实伤害:{stats.TotalTakenTrueDamage:0.##}"); mvpBuilder.AppendLine($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); - mvpBuilder.Append($"{mvp.GetInfo()}"); } int top = isWeb ? actionQueue.CharacterStatistics.Count : 0; // 回执多少个角色的统计信息