From 672573ecfd02c0f26ee3629608d12c134daa1601 Mon Sep 17 00:00:00 2001 From: milimoe Date: Thu, 31 Oct 2024 23:33:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=96=B0=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=9F=A5=E8=AF=A2=EF=BC=9B=E6=9B=B4=E6=96=B0Rating?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E5=85=AC=E5=BC=8F=EF=BC=9B=E6=96=B0=E7=9A=84?= =?UTF-8?q?Skill=E7=BB=A7=E6=89=BF=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OshimaCore/Controllers/FunGameController.cs | 102 +++++++++++++++++-- OshimaCore/Utils/FunGameUtil.cs | 93 ++++++++--------- OshimaModules/Skills/ColdBlue/嗜血本能.cs | 2 +- OshimaModules/Skills/MagicalGirl/绝对领域.cs | 2 +- OshimaModules/Skills/Mayor/精准打击.cs | 2 +- OshimaModules/Skills/NanGanyu/三重叠加.cs | 2 +- OshimaModules/Skills/NiuNan/变幻之心.cs | 2 +- OshimaModules/Skills/Oshima/力量爆发.cs | 2 +- OshimaModules/Skills/QWQAQW/迅捷之势.cs | 2 +- OshimaModules/Skills/QingXiang/能量毁灭.cs | 4 +- OshimaModules/Skills/QuDuoduo/血之狂欢.cs | 2 +- OshimaModules/Skills/XinYin/天赐之力.cs | 2 +- OshimaModules/Skills/Yang/魔法涌流.cs | 2 +- OshimaModules/Skills/dddovo/平衡强化.cs | 2 +- OshimaModules/Skills/战技/疾风步.cs | 2 +- OshimaModules/Skills/魔法/冰霜攻击.cs | 27 ++--- OshimaModules/Skills/魔法/心灵之霞.cs | 43 ++++++++ OshimaModules/Skills/魔法/暗物质.cs | 43 ++++++++ OshimaModules/Skills/魔法/次元上升.cs | 43 ++++++++ OshimaModules/Skills/魔法/水之矢.cs | 43 ++++++++ OshimaModules/Skills/魔法/火之矢.cs | 43 ++++++++ OshimaModules/Skills/魔法/石之锤.cs | 43 ++++++++ OshimaModules/Skills/魔法/风之轮.cs | 43 ++++++++ 23 files changed, 462 insertions(+), 89 deletions(-) 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/OshimaCore/Controllers/FunGameController.cs b/OshimaCore/Controllers/FunGameController.cs index 4f0e9ee..440c090 100644 --- a/OshimaCore/Controllers/FunGameController.cs +++ b/OshimaCore/Controllers/FunGameController.cs @@ -59,9 +59,14 @@ namespace Oshima.Core.Controllers builder.AppendLine($"ܼƹھ{stats.Wins}"); builder.AppendLine($"ܼǰ{stats.Top3s}"); builder.AppendLine($"ܼưܳ{stats.Loses}"); - builder.AppendLine($"ʤʣ{stats.Winrates * 100:0.##}%"); + + List names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Winrates).Select(kv => kv.Key.GetName())]; + builder.AppendLine($"ʤʣ{stats.Winrates * 100:0.##}%#{names.IndexOf(character.GetName())}"); builder.AppendLine($"ǰʣ{stats.Top3rates * 100:0.##}%"); - builder.AppendLine($"÷֣{stats.Rating:0.##}"); + + names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Rating).Select(kv => kv.Key.GetName())]; + builder.AppendLine($"÷֣{stats.Rating:0.##}#{names.IndexOf(character.GetName())}"); + builder.AppendLine($"ϴ{stats.LastRank} / Σ{stats.AvgRank}"); return NetworkUtility.JsonSerialize(builder.ToString()); @@ -105,10 +110,11 @@ namespace Oshima.Core.Controllers builder.AppendLine($"ܼƹھ{stats.Wins}"); builder.AppendLine($"ܼǰ{stats.Top3s}"); builder.AppendLine($"ܼưܳ{stats.Loses}"); - builder.AppendLine($"ʤʣ{stats.Winrates * 100:0.##}%"); - builder.AppendLine($"ǰʣ{stats.Top3rates * 100:0.##}%"); - builder.AppendLine($"÷֣{stats.Rating:0.##}"); - builder.AppendLine($"ϴ{stats.LastRank} / Σ{stats.AvgRank}"); + + List names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Winrates).Select(kv => kv.Key.GetName())]; + builder.AppendLine($"ʤʣ{stats.Winrates * 100:0.##}%#{names.IndexOf(character.GetName())}"); + names = [.. FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Rating).Select(kv => kv.Key.GetName())]; + builder.AppendLine($"÷֣{stats.Rating:0.##}#{names.IndexOf(character.GetName())}"); return NetworkUtility.JsonSerialize(builder.ToString()); } @@ -116,6 +122,90 @@ namespace Oshima.Core.Controllers return NetworkUtility.JsonSerialize(""); } + [HttpGet("winraterank")] + public string GetWinrateRank([FromQuery] bool? isteam = null) + { + bool team = isteam ?? false; + if (team) + { + List strings = []; + IEnumerable ratings = FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Winrates).Select(kv => kv.Key); + foreach (Character character in ratings) + { + StringBuilder builder = new(); + CharacterStatistics stats = FunGameSimulation.TeamCharacterStatistics[character]; + builder.AppendLine(character.ToString()); + builder.AppendLine($"ܼƲ{stats.Plays}"); + builder.AppendLine($"ܼƹھ{stats.Wins}"); + builder.AppendLine($"ʤʣ{stats.Winrates * 100:0.##}%"); + builder.AppendLine($"÷֣{stats.Rating:0.##}"); + strings.Add(builder.ToString()); + } + return NetworkUtility.JsonSerialize(strings); + } + else + { + List strings = []; + IEnumerable ratings = FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Winrates).Select(kv => kv.Key); + foreach (Character character in ratings) + { + StringBuilder builder = new(); + CharacterStatistics stats = FunGameSimulation.CharacterStatistics[character]; + builder.AppendLine(character.ToString()); + builder.AppendLine($"ܼƲ{stats.Plays}"); + builder.AppendLine($"ܼƹھ{stats.Wins}"); + builder.AppendLine($"ʤʣ{stats.Winrates * 100:0.##}%"); + builder.AppendLine($"ǰʣ{stats.Top3rates * 100:0.##}%"); + builder.AppendLine($"÷֣{stats.Rating:0.##}"); + builder.AppendLine($"ϴ{stats.LastRank} / Σ{stats.AvgRank}"); + strings.Add(builder.ToString()); + } + return NetworkUtility.JsonSerialize(strings); + } + } + + [HttpGet("ratingrank")] + public string GetRatingRank([FromQuery] bool? isteam = null) + { + bool team = isteam ?? false; + if (team) + { + List strings = []; + IEnumerable ratings = FunGameSimulation.TeamCharacterStatistics.OrderByDescending(kv => kv.Value.Rating).Select(kv => kv.Key); + foreach (Character character in ratings) + { + StringBuilder builder = new(); + CharacterStatistics stats = FunGameSimulation.TeamCharacterStatistics[character]; + builder.AppendLine(character.ToString()); + builder.AppendLine($"ܼƲ{stats.Plays}"); + builder.AppendLine($"ܼƹھ{stats.Wins}"); + builder.AppendLine($"ʤʣ{stats.Winrates * 100:0.##}%"); + builder.AppendLine($"÷֣{stats.Rating:0.##}"); + strings.Add(builder.ToString()); + } + return NetworkUtility.JsonSerialize(strings); + } + else + { + List strings = []; + IEnumerable ratings = FunGameSimulation.CharacterStatistics.OrderByDescending(kv => kv.Value.Rating).Select(kv => kv.Key); + foreach (Character character in ratings) + { + StringBuilder builder = new(); + CharacterStatistics stats = FunGameSimulation.CharacterStatistics[character]; + builder.AppendLine(character.ToString()); + builder.AppendLine($"ܼƲ{stats.Plays}"); + builder.AppendLine($"ܼƹھ{stats.Wins}"); + builder.AppendLine($"ʤʣ{stats.Winrates * 100:0.##}%"); + builder.AppendLine($"ǰʣ{stats.Top3rates * 100:0.##}%"); + builder.AppendLine($"÷֣{stats.Rating:0.##}"); + builder.AppendLine($"ϴ{stats.LastRank} / Σ{stats.AvgRank}"); + strings.Add(builder.ToString()); + } + return NetworkUtility.JsonSerialize(strings); + } + } + [HttpGet("cjs")] public string GetCharacterIntroduce([FromQuery] int? id = null) { diff --git a/OshimaCore/Utils/FunGameUtil.cs b/OshimaCore/Utils/FunGameUtil.cs index 671492e..cb102bf 100644 --- a/OshimaCore/Utils/FunGameUtil.cs +++ b/OshimaCore/Utils/FunGameUtil.cs @@ -482,7 +482,7 @@ namespace Oshima.Core.Utils } // 赛后统计 - GetCharacterRating(actionQueue.CharacterStatistics, isTeam); + GetCharacterRating(actionQueue.CharacterStatistics, isTeam, actionQueue.EliminatedTeams); int top = isWeb ? actionQueue.CharacterStatistics.Count : 0; // 回执多少个角色的统计信息 int count = 1; if (isWeb) @@ -802,68 +802,59 @@ namespace Oshima.Core.Utils if (totalStats.LiveTime != 0) totalStats.DamagePerSecond = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveTime); } - public static void GetCharacterRating(Dictionary statistics, bool isTeam) + public static void GetCharacterRating(Dictionary statistics, bool isTeam, List teams) { - Dictionary ratings = statistics.ToDictionary(k => k.Key, v => CalculateRating(v.Value, isTeam)); - foreach (Character character in ratings.Keys) + foreach (Character character in statistics.Keys) { - statistics[character].Rating = ratings[character]; + Team? team = null; + if (isTeam) + { + team = teams.Where(t => t.IsOnThisTeam(character)).FirstOrDefault(); + } + statistics[character].Rating = CalculateRating(statistics[character], team); } } - public static double CalculateRating(CharacterStatistics stats, bool isTeam) + public static double CalculateRating(CharacterStatistics stats, Team? team = null) { - // 设定基准值 - double avgKills = 4.0; - double avgAssists = 2.5; - double avgDeaths = 1.0; - double avgLiveTime = 90.0; - double avgTotalDamage = 7500.0; - double avgTotalTakenDamage = 5500.0; - double avgDamagePerSecond = 80.0; - - // 团队模式使用其他基准 - if (isTeam) + // 基础得分 + double baseScore = (stats.Kills + stats.Assists) / (stats.Kills + stats.Assists + stats.Deaths + 0.01); + if (team is null) { - avgKills = 2.0; - avgAssists = 3; - avgDeaths = 1.0; - avgLiveTime = 110.0; - avgTotalDamage = 6000.0; - avgTotalTakenDamage = 2000.0; - avgDamagePerSecond = 80.0; + baseScore += stats.Kills * 0.1; + if (stats.Deaths == 0) + { + baseScore += 0.5; + } + } + + // 伤害贡献 + double logDamageContribution = Math.Log(1 + (stats.TotalDamage / (stats.TotalTakenDamage + 1e-6))); + + // 存活时间贡献 + double liveTimeContribution = Math.Log(1 + (stats.LiveTime / (stats.TotalTakenDamage + 0.01) * 100)); + + // 团队模式参团率加成 + double teamContribution = 0; + if (team != null) + { + teamContribution = (stats.Kills + stats.Assists) / (team.Score + 0.01); + if (team.IsWinner) + { + teamContribution += 0.2; + } } - - // 归一化计算 - double normalizedKills = stats.Kills / avgKills; - double normalizedAssists = stats.Assists / avgAssists; - double normalizedDeaths = avgDeaths - stats.Deaths / avgDeaths; - double normalizedLiveTime = stats.LiveTime / avgLiveTime; - double normalizedTotalDamage = stats.TotalDamage / avgTotalDamage; - double normalizedTotalTakenDamage = stats.TotalTakenDamage / avgTotalTakenDamage; - double normalizedDamagePerSecond = stats.DamagePerSecond / avgDamagePerSecond; // 权重设置 - double killWeight = 0.4; - double assistWeight = 0.15; - double deathWeight = -0.25; - double liveTimeWeight = 0.2; - double totalDamageWeight = 0.25; - double totalTakenDamageWeight = 0.15; - double damagePerSecondWeight = 0.05; + double k = stats.Deaths > 0 ? 0.2 : 0.075; // 伤害贡献权重 + double l = stats.Deaths > 0 ? 0.3 : 0.05; // 存活时间权重 + double t = stats.Deaths > 0 ? 0.225 : 0.1; // 参团率权重 - // 计算归一化后的Rating - double rating = - killWeight * normalizedKills + - assistWeight * normalizedAssists + - deathWeight * normalizedDeaths + - liveTimeWeight * normalizedLiveTime + - totalDamageWeight * normalizedTotalDamage + - totalTakenDamageWeight * normalizedTotalTakenDamage + - damagePerSecondWeight * normalizedDamagePerSecond; + // 计算最终评分 + double rating = baseScore + k * logDamageContribution + l * liveTimeContribution + t * teamContribution; - // 限制Rating在 0 和 5 之间 - return Math.Clamp(rating, 0, 5); + // 确保评分在合理范围内 + return Math.Max(0.01, rating); } } } diff --git a/OshimaModules/Skills/ColdBlue/嗜血本能.cs b/OshimaModules/Skills/ColdBlue/嗜血本能.cs index cfd0520..54d9213 100644 --- a/OshimaModules/Skills/ColdBlue/嗜血本能.cs +++ b/OshimaModules/Skills/ColdBlue/嗜血本能.cs @@ -50,7 +50,7 @@ namespace Oshima.FunGame.OshimaModules.Skills } } - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { RemainDuration = Duration; if (!caster.Effects.Contains(this)) diff --git a/OshimaModules/Skills/MagicalGirl/绝对领域.cs b/OshimaModules/Skills/MagicalGirl/绝对领域.cs index 71d6f0e..d38a955 100644 --- a/OshimaModules/Skills/MagicalGirl/绝对领域.cs +++ b/OshimaModules/Skills/MagicalGirl/绝对领域.cs @@ -59,7 +59,7 @@ namespace Oshima.FunGame.OshimaModules.Skills 释放时的能量值 = caster.EP; } - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { RemainDuration = Duration; if (!caster.Effects.Contains(this)) diff --git a/OshimaModules/Skills/Mayor/精准打击.cs b/OshimaModules/Skills/Mayor/精准打击.cs index b8cf308..311db24 100644 --- a/OshimaModules/Skills/Mayor/精准打击.cs +++ b/OshimaModules/Skills/Mayor/精准打击.cs @@ -52,7 +52,7 @@ namespace Oshima.FunGame.OshimaModules.Skills character.PhysicalPenetration -= 实际物理穿透提升; } - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { RemainDuration = Duration; if (!caster.Effects.Contains(this)) diff --git a/OshimaModules/Skills/NanGanyu/三重叠加.cs b/OshimaModules/Skills/NanGanyu/三重叠加.cs index 882456e..6886355 100644 --- a/OshimaModules/Skills/NanGanyu/三重叠加.cs +++ b/OshimaModules/Skills/NanGanyu/三重叠加.cs @@ -51,7 +51,7 @@ namespace Oshima.FunGame.OshimaModules.Skills } } - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { 剩余持续次数 = 技能持续次数; if (!caster.Effects.Contains(this)) diff --git a/OshimaModules/Skills/NiuNan/变幻之心.cs b/OshimaModules/Skills/NiuNan/变幻之心.cs index eaed6c6..a783880 100644 --- a/OshimaModules/Skills/NiuNan/变幻之心.cs +++ b/OshimaModules/Skills/NiuNan/变幻之心.cs @@ -51,7 +51,7 @@ namespace Oshima.FunGame.OshimaModules.Skills } } - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { IEnumerable effects = caster.Effects.Where(e => e is 智慧与力量特效); if (effects.Any()) diff --git a/OshimaModules/Skills/Oshima/力量爆发.cs b/OshimaModules/Skills/Oshima/力量爆发.cs index 1dc50b8..22f7234 100644 --- a/OshimaModules/Skills/Oshima/力量爆发.cs +++ b/OshimaModules/Skills/Oshima/力量爆发.cs @@ -54,7 +54,7 @@ namespace Oshima.FunGame.OshimaModules.Skills } } - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { RemainDuration = Duration; if (!caster.Effects.Contains(this)) diff --git a/OshimaModules/Skills/QWQAQW/迅捷之势.cs b/OshimaModules/Skills/QWQAQW/迅捷之势.cs index 62d3748..9d5f045 100644 --- a/OshimaModules/Skills/QWQAQW/迅捷之势.cs +++ b/OshimaModules/Skills/QWQAQW/迅捷之势.cs @@ -66,7 +66,7 @@ namespace Oshima.FunGame.OshimaModules.Skills baseHardnessTime *= 0.3; } - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { RemainDuration = Duration; if (!caster.Effects.Contains(this)) diff --git a/OshimaModules/Skills/QingXiang/能量毁灭.cs b/OshimaModules/Skills/QingXiang/能量毁灭.cs index 19df25d..5dfd8d6 100644 --- a/OshimaModules/Skills/QingXiang/能量毁灭.cs +++ b/OshimaModules/Skills/QingXiang/能量毁灭.cs @@ -32,9 +32,9 @@ namespace Oshima.FunGame.OshimaModules.Skills private double 智力伤害 => 智力系数 * Skill.Character?.INT ?? 0; private double 能量系数 => 1.05 * Level; - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { - foreach (Character c in enemys) + foreach (Character c in targets) { WriteLine($"[ {caster} ] 正在毁灭 [ {c} ] 的能量!!"); double ep = c.EP; diff --git a/OshimaModules/Skills/QuDuoduo/血之狂欢.cs b/OshimaModules/Skills/QuDuoduo/血之狂欢.cs index a9eca39..90cb78f 100644 --- a/OshimaModules/Skills/QuDuoduo/血之狂欢.cs +++ b/OshimaModules/Skills/QuDuoduo/血之狂欢.cs @@ -37,7 +37,7 @@ namespace Oshima.FunGame.OshimaModules.Skills } } - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { RemainDuration = Duration; if (!caster.Effects.Contains(this)) diff --git a/OshimaModules/Skills/XinYin/天赐之力.cs b/OshimaModules/Skills/XinYin/天赐之力.cs index f753c87..bcca61a 100644 --- a/OshimaModules/Skills/XinYin/天赐之力.cs +++ b/OshimaModules/Skills/XinYin/天赐之力.cs @@ -76,7 +76,7 @@ namespace Oshima.FunGame.OshimaModules.Skills baseHardnessTime *= 0.8; } - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { RemainDuration = Duration; if (!caster.Effects.Contains(this)) diff --git a/OshimaModules/Skills/Yang/魔法涌流.cs b/OshimaModules/Skills/Yang/魔法涌流.cs index ccdcb63..c6c077d 100644 --- a/OshimaModules/Skills/Yang/魔法涌流.cs +++ b/OshimaModules/Skills/Yang/魔法涌流.cs @@ -50,7 +50,7 @@ namespace Oshima.FunGame.OshimaModules.Skills return false; } - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { RemainDuration = Duration; if (!caster.Effects.Contains(this)) diff --git a/OshimaModules/Skills/dddovo/平衡强化.cs b/OshimaModules/Skills/dddovo/平衡强化.cs index 286871a..3f65bf2 100644 --- a/OshimaModules/Skills/dddovo/平衡强化.cs +++ b/OshimaModules/Skills/dddovo/平衡强化.cs @@ -55,7 +55,7 @@ namespace Oshima.FunGame.OshimaModules.Skills character.Recovery(pastHP, pastMP, pastMaxHP, pastMaxMP); } - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { RemainDuration = Duration; if (!caster.Effects.Contains(this)) diff --git a/OshimaModules/Skills/战技/疾风步.cs b/OshimaModules/Skills/战技/疾风步.cs index 361091a..f783208 100644 --- a/OshimaModules/Skills/战技/疾风步.cs +++ b/OshimaModules/Skills/战技/疾风步.cs @@ -69,7 +69,7 @@ namespace Oshima.FunGame.OshimaModules.Skills return false; } - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { if (!caster.Effects.Contains(this)) { diff --git a/OshimaModules/Skills/魔法/冰霜攻击.cs b/OshimaModules/Skills/魔法/冰霜攻击.cs index ea1317b..1714de6 100644 --- a/OshimaModules/Skills/魔法/冰霜攻击.cs +++ b/OshimaModules/Skills/魔法/冰霜攻击.cs @@ -9,8 +9,8 @@ namespace Oshima.FunGame.OshimaModules.Skills public override string Name => "冰霜攻击"; public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; public override double MPCost => 30 + (50 * (Level - 1)); - public override double CD => 20; - public override double CastTime => 6; + public override double CD => 25; + public override double CastTime => 8; public override double HardnessTime { get; set; } = 3; public 冰霜攻击(Character? character = null) : base(SkillType.Magic, character) @@ -23,28 +23,19 @@ namespace Oshima.FunGame.OshimaModules.Skills { public override long Id => Skill.Id; public override string Name => Skill.Name; - public override string Description => $"对目标敌人造成 {90 + 60 * (Skill.Level - 1):0.##} + {(1.2 + 1.8 * (Skill.Level - 1)) * 100:0.##}% 智力 [ {Damage:0.##} ] 点{CharacterSet.GetMagicDamageName(MagicType)}。"; + public override string Description => $"对目标敌人造成 {基础伤害:0.##} + {系数 * 100:0.##}% 智力 [ {Damage:0.##} ] 点{CharacterSet.GetMagicDamageName(MagicType)}。"; public override bool TargetSelf => false; public override int TargetCount => 1; - private double Damage - { - get - { - double d = 0; - if (Skill.Character != null) - { - d = 90 + 60 * (Skill.Level - 1) + (1.2 + 1.8 * (Skill.Level - 1)) * Skill.Character.INT; - } - return d; - } - } + private double 基础伤害 => 90 + 60 * (Skill.Level - 1); + private double 系数 => 0.35 + 0.4 * (Skill.Level - 1); + private double Damage => 基础伤害 + 系数 * Skill.Character?.INT ?? 0; - public override void OnSkillCasted(Character caster, List enemys, List teammates, Dictionary others) + public override void OnSkillCasted(Character caster, List targets, Dictionary others) { - if (enemys.Count > 0) + if (targets.Count > 0) { - Character enemy = enemys[new Random().Next(enemys.Count)]; + Character enemy = targets[0]; DamageToEnemy(caster, enemy, true, MagicType, Damage); } } diff --git a/OshimaModules/Skills/魔法/心灵之霞.cs b/OshimaModules/Skills/魔法/心灵之霞.cs new file mode 100644 index 0000000..a5a3594 --- /dev/null +++ b/OshimaModules/Skills/魔法/心灵之霞.cs @@ -0,0 +1,43 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 心灵之霞 : Skill + { + public override long Id => (long)MagicID.心灵之霞; + public override string Name => "心灵之霞"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override double MPCost => 30 + (50 * (Level - 1)); + public override double CD => 25; + public override double CastTime => 6; + public override double HardnessTime { get; set; } = 3; + + public 心灵之霞(Character? character = null) : base(SkillType.Magic, 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 => $"对目标敌人造成 {基础伤害:0.##} + {智力系数 * 100:0.##}% 智力 [ {Damage:0.##} ] 点{CharacterSet.GetMagicDamageName(MagicType)}。"; + public override bool TargetSelf => false; + public override int TargetCount => 1; + + private double 基础伤害 => 90 + 60 * (Skill.Level - 1); + private double 智力系数 => (0.5 + 0.6 * (Skill.Level - 1)); + private double Damage => 基础伤害 + 智力系数 * Skill.Character?.INT ?? 0; + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + if (targets.Count > 0) + { + Character enemy = targets[0]; + DamageToEnemy(caster, enemy, true, MagicType, Damage); + } + } + } +} diff --git a/OshimaModules/Skills/魔法/暗物质.cs b/OshimaModules/Skills/魔法/暗物质.cs new file mode 100644 index 0000000..011bba2 --- /dev/null +++ b/OshimaModules/Skills/魔法/暗物质.cs @@ -0,0 +1,43 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 暗物质 : Skill + { + public override long Id => (long)MagicID.暗物质; + public override string Name => "暗物质"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override double MPCost => 30 + (50 * (Level - 1)); + public override double CD => 25; + public override double CastTime => 6; + public override double HardnessTime { get; set; } = 3; + + public 暗物质(Character? character = null) : base(SkillType.Magic, 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 => $"对目标敌人造成 {基础伤害:0.##} + {智力系数 * 100:0.##}% 智力 [ {Damage:0.##} ] 点{CharacterSet.GetMagicDamageName(MagicType)}。"; + public override bool TargetSelf => false; + public override int TargetCount => 1; + + private double 基础伤害 => 90 + 60 * (Skill.Level - 1); + private double 智力系数 => (0.5 + 0.6 * (Skill.Level - 1)); + private double Damage => 基础伤害 + 智力系数 * Skill.Character?.INT ?? 0; + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + if (targets.Count > 0) + { + Character enemy = targets[0]; + DamageToEnemy(caster, enemy, true, MagicType, Damage); + } + } + } +} diff --git a/OshimaModules/Skills/魔法/次元上升.cs b/OshimaModules/Skills/魔法/次元上升.cs new file mode 100644 index 0000000..ae7ea78 --- /dev/null +++ b/OshimaModules/Skills/魔法/次元上升.cs @@ -0,0 +1,43 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 次元上升 : Skill + { + public override long Id => (long)MagicID.次元上升; + public override string Name => "次元上升"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override double MPCost => 30 + (50 * (Level - 1)); + public override double CD => 25; + public override double CastTime => 6; + public override double HardnessTime { get; set; } = 3; + + public 次元上升(Character? character = null) : base(SkillType.Magic, 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 => $"对目标敌人造成 {基础伤害:0.##} + {智力系数 * 100:0.##}% 智力 [ {Damage:0.##} ] 点{CharacterSet.GetMagicDamageName(MagicType)}。"; + public override bool TargetSelf => false; + public override int TargetCount => 1; + + private double 基础伤害 => 90 + 60 * (Skill.Level - 1); + private double 智力系数 => (0.5 + 0.6 * (Skill.Level - 1)); + private double Damage => 基础伤害 + 智力系数 * Skill.Character?.INT ?? 0; + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + if (targets.Count > 0) + { + Character enemy = targets[0]; + DamageToEnemy(caster, enemy, true, MagicType, Damage); + } + } + } +} diff --git a/OshimaModules/Skills/魔法/水之矢.cs b/OshimaModules/Skills/魔法/水之矢.cs new file mode 100644 index 0000000..f07cebd --- /dev/null +++ b/OshimaModules/Skills/魔法/水之矢.cs @@ -0,0 +1,43 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 水之矢 : Skill + { + public override long Id => (long)MagicID.水之矢; + public override string Name => "水之矢"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override double MPCost => 30 + (40 * (Level - 1)); + public override double CD => 20; + public override double CastTime => 6; + public override double HardnessTime { get; set; } = 3; + + public 水之矢(Character? character = null) : base(SkillType.Magic, 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 => $"对目标敌人造成 {基础伤害:0.##} + {系数 * 100:0.##}% {CharacterSet.GetPrimaryAttributeName(Skill.Character?.PrimaryAttribute ?? PrimaryAttribute.INT)} [ {Damage:0.##} ] 点{CharacterSet.GetMagicDamageName(MagicType)}。"; + public override bool TargetSelf => false; + public override int TargetCount => 1; + + private double 基础伤害 => 85 + 65 * (Skill.Level - 1); + private double 系数 => 0.35 + 0.45 * (Skill.Level - 1); + private double Damage => 基础伤害 + 系数 * Skill.Character?.PrimaryAttributeValue ?? 0; + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + if (targets.Count > 0) + { + Character enemy = targets[0]; + DamageToEnemy(caster, enemy, true, MagicType, Damage); + } + } + } +} diff --git a/OshimaModules/Skills/魔法/火之矢.cs b/OshimaModules/Skills/魔法/火之矢.cs new file mode 100644 index 0000000..f80c3cf --- /dev/null +++ b/OshimaModules/Skills/魔法/火之矢.cs @@ -0,0 +1,43 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 火之矢 : Skill + { + public override long Id => (long)MagicID.火之矢; + public override string Name => "火之矢"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override double MPCost => 30 + (40 * (Level - 1)); + public override double CD => 20; + public override double CastTime => 6; + public override double HardnessTime { get; set; } = 3; + + public 火之矢(Character? character = null) : base(SkillType.Magic, 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 => $"对目标敌人造成 {基础伤害:0.##} + {系数 * 100:0.##}% {CharacterSet.GetPrimaryAttributeName(Skill.Character?.PrimaryAttribute ?? PrimaryAttribute.INT)} [ {Damage:0.##} ] 点{CharacterSet.GetMagicDamageName(MagicType)}。"; + public override bool TargetSelf => false; + public override int TargetCount => 1; + + private double 基础伤害 => 80 + 65 * (Skill.Level - 1); + private double 系数 => 0.45 + 0.35 * (Skill.Level - 1); + private double Damage => 基础伤害 + 系数 * Skill.Character?.PrimaryAttributeValue ?? 0; + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + if (targets.Count > 0) + { + Character enemy = targets[0]; + DamageToEnemy(caster, enemy, true, MagicType, Damage); + } + } + } +} diff --git a/OshimaModules/Skills/魔法/石之锤.cs b/OshimaModules/Skills/魔法/石之锤.cs new file mode 100644 index 0000000..220a9b3 --- /dev/null +++ b/OshimaModules/Skills/魔法/石之锤.cs @@ -0,0 +1,43 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 石之锤 : Skill + { + public override long Id => (long)MagicID.石之锤; + public override string Name => "石之锤"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override double MPCost => 30 + (30 * (Level - 1)); + public override double CD => 22; + public override double CastTime => 6; + public override double HardnessTime { get; set; } = 4; + + public 石之锤(Character? character = null) : base(SkillType.Magic, 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 => $"对目标敌人造成 {基础伤害:0.##} + {系数 * 100:0.##}% 力量 [ {Damage:0.##} ] 点{CharacterSet.GetMagicDamageName(MagicType)}。"; + public override bool TargetSelf => false; + public override int TargetCount => 1; + + private double 基础伤害 => 100 + 50 * (Skill.Level - 1); + private double 系数 => 0.7 + 0.4 * (Skill.Level - 1); + private double Damage => 基础伤害 + 系数 * Skill.Character?.STR ?? 0; + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + if (targets.Count > 0) + { + Character enemy = targets[0]; + DamageToEnemy(caster, enemy, true, MagicType, Damage); + } + } + } +} diff --git a/OshimaModules/Skills/魔法/风之轮.cs b/OshimaModules/Skills/魔法/风之轮.cs new file mode 100644 index 0000000..1396e66 --- /dev/null +++ b/OshimaModules/Skills/魔法/风之轮.cs @@ -0,0 +1,43 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Oshima.FunGame.OshimaModules.Skills +{ + public class 风之轮 : Skill + { + public override long Id => (long)MagicID.风之轮; + public override string Name => "风之轮"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override double MPCost => 50 + (60 * (Level - 1)); + public override double CD => 30; + public override double CastTime => 10; + public override double HardnessTime { get; set; } = 4; + + public 风之轮(Character? character = null) : base(SkillType.Magic, 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 => $"对目标敌人造成 {基础伤害:0.##} + {系数 * 100:0.##}% 敏捷 [ {Damage:0.##} ] 点{CharacterSet.GetMagicDamageName(MagicType)}。"; + public override bool TargetSelf => false; + public override int TargetCount => 1; + + private double 基础伤害 => 120 + 80 * (Skill.Level - 1); + private double 系数 => 0.4 + 0.4 * (Skill.Level - 1); + private double Damage => 基础伤害 + 系数 * Skill.Character?.AGI ?? 0; + + public override void OnSkillCasted(Character caster, List targets, Dictionary others) + { + if (targets.Count > 0) + { + Character enemy = targets[0]; + DamageToEnemy(caster, enemy, true, MagicType, Damage); + } + } + } +}