diff --git a/Library/Main.cs b/Library/Main.cs index ee22d0c..93e76d9 100644 --- a/Library/Main.cs +++ b/Library/Main.cs @@ -152,6 +152,36 @@ if (list.Count > 3) }; c.Skills.Add(魔法涌流); } + + if (c== character4) + { + Skill 灵能反射 = new 灵能反射(c) + { + Level = 1 + }; + c.Skills.Add(灵能反射); + + Skill 三重叠加 = new 三重叠加(c) + { + Level = slevel + }; + c.Skills.Add(三重叠加); + } + + if (c== character5) + { + Skill 智慧与力量 = new 智慧与力量(c) + { + Level = 1 + }; + c.Skills.Add(智慧与力量); + + Skill 变幻之心 = new 变幻之心(c) + { + Level = slevel + }; + c.Skills.Add(变幻之心); + } if (c == character9) { @@ -162,7 +192,8 @@ if (list.Count > 3) c.Skills.Add(疾风步); } - if (c != character1 && c != character2 && c != character3) + if (c != character1 && c != character2 && c != character3 && c != character4 && + c != character5) { Skill 天赐之力 = new 天赐之力(c) { @@ -187,6 +218,26 @@ if (list.Count > 3) int i = 1; while (i < 999) { + if (i == 998) + { + Console.WriteLine($"=== 终局审判 ==="); + Dictionary 他们的血量百分比 = []; + foreach (Character c in characters) + { + 他们的血量百分比.TryAdd(c, Calculation.Round4Digits(c.HP / c.MaxHP)); + } + double max = 他们的血量百分比.Values.Max(); + Character winner = 他们的血量百分比.Keys.Where(c => 他们的血量百分比[c] == max).First(); + Console.WriteLine("[ " + winner + " ] 成为了天选之人!!"); + foreach (Character c in characters.Where(c => c != winner && c.HP > 0)) + { + Console.WriteLine("[ " + winner + " ] 对 [ " + c + " ] 造成了 99999999999 点真实伤害。"); + actionQueue.DeathCalculation(winner, c); + } + actionQueue.EndGameInfo(winner); + break; + } + // 检查是否有角色可以行动 Character? characterToAct = actionQueue.NextCharacter(); diff --git a/Library/Skills/NanGanyu/三重叠加.cs b/Library/Skills/NanGanyu/三重叠加.cs new file mode 100644 index 0000000..151ed09 --- /dev/null +++ b/Library/Skills/NanGanyu/三重叠加.cs @@ -0,0 +1,62 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Milimoe.FunGame.Testing.Skills +{ + public class 三重叠加 : Skill + { + public override long Id => 3004; + public override string Name => "三重叠加"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override double EPCost => 100; + public override double CD => 35 - 2 * (Level - 1); + public override double HardnessTime => 10; + + public 三重叠加(Character character) : base(SkillType.SuperSkill, character) + { + Effects.Add(new 三重叠加特效(this)); + } + } + + public class 三重叠加特效(Skill skill) : Effect(skill) + { + public override long Id => Skill.Id; + public override string Name => "三重叠加"; + public override string Description => $"使 [ 灵能反射 ] 的当前释放魔法次数归零,并且最大消除次数提高到 {灵能反射次数},并且在魔法命中时能够回复所回复能量值的 10 倍魔法值,持续 {技能持续次数} 次(灵能反射每消除次数达到最大时算一次)。" + + $"(剩余:{剩余持续次数} 次)"; + public override bool TargetSelf => true; + + public int 剩余持续次数 { get; set; } = 0; + private readonly int 灵能反射次数 = 3; + private readonly int 技能持续次数 = 2; + + public override void OnEffectGained(Character character) + { + IEnumerable effects = character.Effects.Where(e => e is 灵能反射特效); + if (effects.Any() && effects.First() is 灵能反射特效 e) + { + e.触发硬直次数 = 3; + e.释放次数 = 0; + } + } + + public override void OnEffectLost(Character character) + { + IEnumerable effects = character.Effects.Where(e => e is 灵能反射特效); + if (effects.Any() && effects.First() is 灵能反射特效 e) + { + e.触发硬直次数 = 2; + } + } + + public override void OnSkillCasted(Character actor, List enemys, List teammates, Dictionary others) + { + 剩余持续次数 = 技能持续次数; + if (!actor.Effects.Contains(this)) + { + actor.Effects.Add(this); + OnEffectGained(actor); + } + } + } +} diff --git a/Library/Skills/NanGanyu/法术操控.cs b/Library/Skills/NanGanyu/法术操控.cs deleted file mode 100644 index 95d3057..0000000 --- a/Library/Skills/NanGanyu/法术操控.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Milimoe.FunGame.Core.Entity; -using Milimoe.FunGame.Core.Library.Constant; - -namespace Milimoe.FunGame.Testing.Skills -{ - public class 法术操控 : Skill - { - public override long Id => 4004; - public override string Name => "法术操控"; - public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; - - public 法术操控(Character character) : base(SkillType.Passive, character) - { - Effects.Add(new 法术操控特效(this)); - } - - public override IEnumerable AddInactiveEffectToCharacter() - { - return Effects; - } - } - - public class 法术操控特效(Skill skill) : Effect(skill) - { - public override long Id => Skill.Id; - public override string Name => Skill.Name; - public override string Description => $"每释放两次魔法才会触发硬直时间,且魔法命中时基于智力获得额外能量值。"; - public override bool TargetSelf => true; - } -} diff --git a/Library/Skills/NanGanyu/灵能反射.cs b/Library/Skills/NanGanyu/灵能反射.cs new file mode 100644 index 0000000..a1a013c --- /dev/null +++ b/Library/Skills/NanGanyu/灵能反射.cs @@ -0,0 +1,84 @@ +using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Milimoe.FunGame.Testing.Skills +{ + public class 灵能反射 : Skill + { + public override long Id => 4004; + public override string Name => "灵能反射"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + + public 灵能反射(Character character) : base(SkillType.Passive, character) + { + Effects.Add(new 灵能反射特效(this)); + } + + public override IEnumerable AddInactiveEffectToCharacter() + { + return Effects; + } + } + + public class 灵能反射特效(Skill skill) : Effect(skill) + { + public override long Id => Skill.Id; + public override string Name => Skill.Name; + public override string Description => $"每释放 {触发硬直次数} 次魔法才会触发硬直时间,且魔法命中时基于 25% 智力 [{获得额外能量值}] 获得额外能量值。"; + public override bool TargetSelf => true; + + public int 触发硬直次数 { get; set; } = 2; + public int 释放次数 { get; set; } = 0; + public double 获得额外能量值 + { + get + { + return Calculation.Round2Digits(0.25 * Skill.Character?.INT ?? 0); + } + } + + public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult) + { + if (character == Skill.Character && isMagicDamage && damageResult != DamageResult.Evaded && character.EP < 200) + { + double 实际获得能量值 = 获得额外能量值; + character.EP += 实际获得能量值; + WriteLine("[ " + character + " ] 发动了灵能反射!额外获得了 " + 实际获得能量值 + " 能量!"); + IEnumerable effects = character.Effects.Where(e => e is 三重叠加特效); + if (effects.Any() && effects.First() is 三重叠加特效 e) + { + double 获得的魔法值 = Calculation.Round2Digits(实际获得能量值 * 10); + character.MP += 获得的魔法值; + WriteLine("[ " + character + " ] 发动了三重叠加!额外获得了 " + 获得的魔法值 + " 魔法值!"); + } + } + } + + public override void AlterHardnessTimeAfterCastSkill(Character character, ref double baseHardnessTime) + { + 释放次数++; + if (释放次数 < 触发硬直次数) + { + baseHardnessTime = 0; + WriteLine($"[ {character} ] 发动了灵能反射,消除了硬直时间!!"); + } + else + { + 释放次数 = 0; + IEnumerable effects = character.Effects.Where(e => e is 三重叠加特效); + if (effects.Any() && effects.First() is 三重叠加特效 e) + { + baseHardnessTime = 0; + WriteLine($"[ {character} ] 发动了灵能反射,消除了硬直时间!!"); + e.剩余持续次数--; + if (e.剩余持续次数 == 0) + { + character.Effects.Remove(e); + e.OnEffectLost(character); + } + } + } + } + } +} diff --git a/Library/Skills/NiuNan/变幻之心.cs b/Library/Skills/NiuNan/变幻之心.cs new file mode 100644 index 0000000..1e39b47 --- /dev/null +++ b/Library/Skills/NiuNan/变幻之心.cs @@ -0,0 +1,77 @@ +using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Milimoe.FunGame.Testing.Skills +{ + public class 变幻之心 : Skill + { + public override long Id => 3005; + public override string Name => "变幻之心"; + public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; + public override double EPCost => 100; + public override double CD => 30; + public override double HardnessTime => 10; + + public 变幻之心(Character character) : base(SkillType.SuperSkill, character) + { + Effects.Add(new 变幻之心特效(this)); + } + } + + public class 变幻之心特效(Skill skill) : Effect(skill) + { + public override long Id => Skill.Id; + public override string Name => "变幻之心"; + public override string Description => $"检查 [ 智慧与力量 ] 的模式。在力量模式下,立即回复 {生命值回复 * 100}% 生命值;智力模式下,下一次魔法伤害提升 {伤害提升 * 100}%。"; + public override bool TargetSelf => true; + + private double 生命值回复 => Calculation.Round4Digits(0.25 + 0.03 * (Level - 1)); + private double 伤害提升 => Calculation.Round4Digits(0.55 + 0.25 * (Level - 1)); + + public override void OnEffectGained(Character character) + { + Skill.IsInEffect = true; + } + + public override void OnEffectLost(Character character) + { + Skill.IsInEffect = false; + } + + public override void AlterExpectedDamageBeforeCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType) + { + if (character == Skill.Character && isMagicDamage) + { + double 实际伤害提升百分比 = 伤害提升; + double 实际伤害提升 = Calculation.Round2Digits(damage * 实际伤害提升百分比); + damage = Calculation.Round2Digits(damage + 实际伤害提升); + WriteLine("[ " + character + " ] 发动了变幻之心!伤害提升了 " + 实际伤害提升 + " 点!"); + character.Effects.Remove(this); + OnEffectLost(character); + } + } + + public override void OnSkillCasted(Character actor, List enemys, List teammates, Dictionary others) + { + IEnumerable effects = actor.Effects.Where(e => e is 智慧与力量特效); + if (effects.Any()) + { + if (actor.PrimaryAttribute == PrimaryAttribute.STR) + { + double 回复的生命 = Calculation.Round2Digits(生命值回复 * actor.MaxHP); + actor.HP += 回复的生命; + WriteLine("[ " + actor + " ] 发动了变幻之心!回复了 " + 回复的生命 + " 点生命值!"); + } + else if (actor.PrimaryAttribute == PrimaryAttribute.INT) + { + if (!actor.Effects.Contains(this)) + { + actor.Effects.Add(this); + OnEffectGained(actor); + } + } + } + } + } +} diff --git a/Library/Skills/NiuNan/智慧与力量.cs b/Library/Skills/NiuNan/智慧与力量.cs index 6d1eae8..d44c6ff 100644 --- a/Library/Skills/NiuNan/智慧与力量.cs +++ b/Library/Skills/NiuNan/智慧与力量.cs @@ -1,4 +1,5 @@ -using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Testing.Skills @@ -24,7 +25,68 @@ namespace Milimoe.FunGame.Testing.Skills { public override long Id => Skill.Id; public override string Name => Skill.Name; - public override string Description => $"当生命值低于 30% 时,智力转化为力量;当生命值高于或等于 30% 时,力量转化为智力。"; + public override string Description => $"当生命值低于 30% 时,智力转化为力量;当生命值高于或等于 30% 时,力量转化为智力。" + + (Skill.Character != null ? "(当前模式:" + CharacterSet.GetPrimaryAttributeName(Skill.Character.PrimaryAttribute) + ")" : ""); public override bool TargetSelf => true; + + private double 交换前的额外智力 = 0; + private double 交换前的额外力量 = 0; + + public override void OnAttributeChanged(Character character) + { + if (Skill.Character != null) + { + if (Skill.Character.PrimaryAttribute == PrimaryAttribute.INT) + { + double diff = character.ExSTR - 交换前的额外力量; + character.ExINT = 交换前的额外力量 + character.BaseSTR + diff; + } + else if (Skill.Character.PrimaryAttribute == PrimaryAttribute.STR) + { + double diff = character.ExINT - 交换前的额外智力; + character.ExSTR = 交换前的额外智力 + character.BaseINT + diff; + } + } + } + + public override void OnTimeElapsed(Character character, double elapsed) + { + if (Skill.Character != null) + { + Character c = Skill.Character; + if (c.HP < c.MaxHP * 0.3) + { + if (c.PrimaryAttribute == PrimaryAttribute.INT) + { + double pastHP = c.HP; + double pastMaxHP = c.MaxHP; + double pastMP = c.MP; + double pastMaxMP = c.MaxMP; + c.PrimaryAttribute = PrimaryAttribute.STR; + 交换前的额外智力 = c.ExINT; + 交换前的额外力量 = c.ExSTR; + c.ExINT = -c.BaseINT; + c.ExSTR = 交换前的额外智力 + c.BaseINT + 交换前的额外力量; + c.Recovery(pastHP, pastMP, pastMaxHP, pastMaxMP); + } + } + else + { + if (c.PrimaryAttribute == PrimaryAttribute.STR) + { + double pastHP = c.HP; + double pastMaxHP = c.MaxHP; + double pastMP = c.MP; + double pastMaxMP = c.MaxMP; + c.PrimaryAttribute = PrimaryAttribute.INT; + 交换前的额外智力 = c.ExINT; + 交换前的额外力量 = c.ExSTR; + c.ExINT = 交换前的额外力量 + c.BaseSTR + 交换前的额外智力; + c.ExSTR = -c.BaseSTR; + c.Recovery(pastHP, pastMP, pastMaxHP, pastMaxMP); + } + } + } + } } } diff --git a/Library/Skills/QWQAQW/疾风步.cs b/Library/Skills/QWQAQW/疾风步.cs index b8b22c0..0d23c1a 100644 --- a/Library/Skills/QWQAQW/疾风步.cs +++ b/Library/Skills/QWQAQW/疾风步.cs @@ -65,7 +65,7 @@ namespace Milimoe.FunGame.Testing.Skills character.ExCritRate -= 0.15; } - public override void AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, bool isCritical) + public override void AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult) { if (character == Skill.Character && 首次伤害) { diff --git a/Library/Skills/Yang/魔法涌流.cs b/Library/Skills/Yang/魔法涌流.cs index 0181b23..f1b01e8 100644 --- a/Library/Skills/Yang/魔法涌流.cs +++ b/Library/Skills/Yang/魔法涌流.cs @@ -10,7 +10,7 @@ namespace Milimoe.FunGame.Testing.Skills public override string Name => "魔法涌流"; public override string Description => Effects.Count > 0 ? Effects.First().Description : ""; public override double EPCost => 100; - public override double CD => 65; + public override double CD => 35; public override double HardnessTime => 10; public 魔法涌流(Character character) : base(SkillType.SuperSkill, character) @@ -23,12 +23,12 @@ namespace Milimoe.FunGame.Testing.Skills { public override long Id => Skill.Id; public override string Name => "魔法涌流"; - public override string Description => $"{Duration} 秒内,增加所有伤害的20%伤害减免,并将普通攻击转为魔法伤害,可叠加魔法震荡的效果。"; + public override string Description => $"{Duration} 秒内,增加所有伤害的 {减伤比例 * 100}% 伤害减免,并将普通攻击转为魔法伤害,可叠加魔法震荡的效果。"; public override bool TargetSelf => true; public override bool Durative => true; - public override double Duration => 50; + public override double Duration => 25; - private double 减伤比例 => Calculation.Round2Digits(0.2 + 0.02 * (Level -1)); + private double 减伤比例 => Calculation.Round2Digits(0.1 + 0.02 * (Level -1)); private double 实际比例 = 0; public override void OnEffectGained(Character character) @@ -42,7 +42,7 @@ namespace Milimoe.FunGame.Testing.Skills character.NormalAttack.SetMagicType(false, character.MagicType); } - public override void AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, bool isCritical) + public override void AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult) { if (enemy == Skill.Character) { diff --git a/Library/Skills/Yang/魔法震荡.cs b/Library/Skills/Yang/魔法震荡.cs index 19a3d4e..3440af9 100644 --- a/Library/Skills/Yang/魔法震荡.cs +++ b/Library/Skills/Yang/魔法震荡.cs @@ -28,9 +28,9 @@ namespace Milimoe.FunGame.Testing.Skills public override string Description => $"造成魔法伤害时有 35% 几率使敌人眩晕 1 回合。"; public override bool TargetSelf => true; - public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, bool isCritical) + public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult) { - if (character == Skill.Character && isMagicDamage && new Random().NextDouble() < 0.35) + if (character == Skill.Character && isMagicDamage && damageResult != DamageResult.Evaded && new Random().NextDouble() < 0.35) { IEnumerable effects = enemy.Effects.Where(e => e is 眩晕 && e.Skill == Skill); if (effects.Any())