添加新技能

This commit is contained in:
milimoe 2026-04-15 00:09:38 +08:00
parent 8ae5cb116e
commit 48be31d985
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0
16 changed files with 387 additions and 44 deletions

View File

@ -53,7 +53,7 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects
}
}
public override void AlterSelectListBeforeSelection(Character character, ISkill skill, List<Character> enemys, List<Character> teammates)
public override void AlterSelectListBeforeSelection(Character character, ISkill skill, List<Character> allEnemys, List<Character> allTeammates, List<Character> enemys, List<Character> teammates)
{
if (skill is NormalAttack)
{

View File

@ -230,7 +230,7 @@ namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects
break;
case EffectType.Confusion:
_dispelledType = DispelledType.Strong;
_description = "混乱:进入行动受限状态,失控并随机行动,且在进行攻击指令时,可能会选取友方角色为目标。";
_description = "混乱:进入行动受限状态,失控并随机行动,且所有指令均会在所有角色中随机选取目标。";
break;
case EffectType.Taunt:
_dispelledType = DispelledType.Strong;

View File

@ -16,7 +16,7 @@ namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects
public override EffectType EffectType => EffectType.Weaken;
public override bool ExemptDuration => true;
private string => _durative && _duration > 0 ? + $" {GameplayEquilibriumConstant.InGameTime}" : (!_durative && _durationTurn > 0 ? + " 回合" : $"0 {GameplayEquilibriumConstant.InGameTime}");
private string => _durative && _duration > 0 ? $"{实际虚弱时间: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;
private readonly double _duration;

View File

@ -186,17 +186,5 @@ namespace Oshima.FunGame.OshimaModules.Items
}));
}
}
public override List<Character> GetSelectableTargets(Character caster, List<Character> enemys, List<Character> teammates)
{
List<Character> targets = base.GetSelectableTargets(caster, enemys, teammates);
if (GamingQueue != null)
{
// 从死亡队列中获取队友,加入目标列表。
Dictionary<Character, bool> deaths = GamingQueue.GetIsTeammateDictionary(caster, GamingQueue.Eliminated);
targets = [.. targets.Union(deaths.Where(kv => kv.Value).Select(kv => kv.Key)).Distinct()];
}
return targets;
}
}
}

View File

@ -91,7 +91,7 @@ namespace Oshima.FunGame.OshimaModules.Models
CommonPassiveSkills.AddRange([new (), new (), new (), new (), new (), new (), new ()]);
CommonSuperSkills.AddRange([new (), new ()]);
CommonSuperSkills.AddRange([new (), new (), new (), new (), new (), new ()]);
Magics.AddRange([new (), new (), new (), new (), new (), new (), new (), new (),
new (), new (), new (), new (), new (), new (), new (), new (), new (), new (), new (),

View File

@ -143,6 +143,10 @@ namespace Oshima.FunGame.OshimaModules
(long)SuperSkillID. => new (),
(long)SuperSkillID. => new (),
(long)SuperSkillID. => new (),
(long)SuperSkillID. => new (),
(long)SuperSkillID. => new (),
(long)SuperSkillID. => new (),
(long)SuperSkillID. => new (),
(long)PassiveID.META马 => new META马(),
(long)PassiveID. => new (),
(long)PassiveID. => new (),

View File

@ -39,7 +39,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
return 0;
}
public override void AlterSelectListBeforeSelection(Character character, ISkill skill, List<Character> enemys, List<Character> teammates)
public override void AlterSelectListBeforeSelection(Character character, ISkill skill, List<Character> allEnemys, List<Character> allTeammates, List<Character> enemys, List<Character> teammates)
{
.Clear();
AddHalfOfMe([.. enemys.Where(e => e.HP > 0).OrderBy(e => e.HP / e.MaxHP)]);

View File

@ -28,7 +28,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override string Name => Skill.Name;
public override string Description => $"{Skill.SkillOwner()}在游戏开始时进入 [ {nameof(长期监视)} ] 状态,时刻监视着场上的一举一动。当场上有角色死亡时,如果该角色死于技能,则{Skill.SkillOwner()}复制该技能获得使用权,持续 3 回合;如果该角色死于普通攻击,则{Skill.SkillOwner()}的普通攻击将转为魔法伤害并且无视闪避,持续 3 回合。" +
$"接着,{Skill.SkillOwner()}给予击杀者 [ {nameof(时雨标记)} ]。{Skill.SkillOwner()}在造成魔法伤害时,会基于伤害值的 15% 治疗持有标记的友方角色;{Skill.SkillOwner()}与所有持有标记的友方角色对持有标记的敌方角色的伤害加成提升 25%,并且使持有标记的敌方角色在持续时间内的回合开始阶段,有 65% 概率陷入混乱。" +
$"混乱:进入行动受限状态,失控并随机行动,且在进行攻击指令时,可能会选取友方角色为目标。时雨标记持续 3 回合。";
$"混乱:进入行动受限状态,失控并随机行动,且所有指令均会在所有角色中随机选取目标。时雨标记持续 3 回合。";
private bool = false;

View File

@ -78,7 +78,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
}
}
public override void AlterSelectListBeforeSelection(Character character, ISkill skill, List<Character> enemys, List<Character> teammates)
public override void AlterSelectListBeforeSelection(Character character, ISkill skill, List<Character> allEnemys, List<Character> allTeammates, List<Character> enemys, List<Character> teammates)
{
if (skill is NormalAttack && !)
{

View File

@ -0,0 +1,80 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Model.PrefabricatedEntity;
using Oshima.FunGame.OshimaModules.Effects.OpenEffects;
using Oshima.FunGame.OshimaModules.Effects.SkillEffects;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : SoulboundSkill
{
public override long Id => (long)SuperSkillID.;
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 CD => 100;
public override double HardnessTime { get; set; } = 0;
public override bool CanSelectEnemy => false;
public override bool CanSelectTeammate => true;
public override bool CanSelectSelf => true;
public override bool SelectAllTeammates => true;
public override bool AllowSelectDead => true;
public (Character? character = null) : base(character)
{
Effects.Add(new (this));
}
}
public class (SoulboundSkill skill) : SoulboundEffect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"对{Skill.TargetDescription()}施加强驱散,并基于{(Skill.Character != null ? CharacterSet.GetPrimaryAttributeName(Skill.Character.PrimaryAttribute) : "")}的 {PACoefficient * 100:0.##}% 治疗或复苏{Skill.TargetDescription()},回复 {Heal:0.##} 点生命值。" +
(Improvement > 0 ? $"灵魂绑定额外效果:增加目标 {Improvement / 2 * 100:0.##}% 物理伤害减免和魔法抗性,持续 2 回合。" : "") + $"复苏:如果目标已死亡,则复活目标。复苏只能至多回复至其最大生命值的 20%。";
public double PACoefficient => 1.35 + 0.35 * (Skill.Level - 1);
public double Heal => (Skill.Character?.PrimaryAttributeValue ?? 0) * PACoefficient;
public override void OnSkillCasted(Character caster, List<Character> targets, List<Grid> grids, Dictionary<string, object> others)
{
List<Character> deads = [.. targets.Where(c => c.HP == 0)];
List<Character> alives = [.. targets.Where(c => c.HP > 0)];
Effect e = new (Skill);
e.OnSkillCasted(caster, alives, grids, others);
foreach (Character target in alives)
{
HealToTarget(caster, target, Heal);
}
foreach (Character target in deads)
{
HealToTarget(caster, target, Math.Min(Heal, target.MaxHP * 0.2), true, false);
}
if (Improvement > 0)
{
double dr = Improvement / 2;
foreach (Character target in targets)
{
e = new DynamicsEffect(Skill, new()
{
["expdr"] = dr,
["mdftype"] = 0,
["mdfvalue"] = dr
}, caster)
{
Durative = false,
Duration = 0,
DurationTurn = 2,
RemainDurationTurn = 2,
IsDebuff = false
};
e.OnEffectGained(target);
RecordCharacterApplyEffects(target, EffectType.DefenseBoost);
WriteLine($"[ {target} ] 提升了 {dr * 100:0.##}% 物理伤害减免和魔法抗性!");
}
}
}
}
}

View File

@ -0,0 +1,60 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Model;
using Milimoe.FunGame.Core.Model.PrefabricatedEntity;
using Oshima.FunGame.OshimaModules.Effects.SkillEffects;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : SoulboundSkill
{
public override long Id => (long)SuperSkillID.;
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 CD => 100;
public override double HardnessTime { get; set; } = 16;
public override bool SelectAllEnemies => true;
public (Character? character = null) : base(character)
{
Effects.Add(new (this));
}
}
public class (SoulboundSkill skill) : SoulboundEffect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"对{Skill.TargetDescription()}造成 {PACoefficient * 100:0.##}% " +
$"{(Skill.Character != null ? CharacterSet.GetPrimaryAttributeName(Skill.Character.PrimaryAttribute) : "")} [ {PADamage:0.##} ] + {GeneralDamage:0.##} 点{CharacterSet.GetDamageTypeName(DamageType.True)}。" +
(Improvement > 0 ? $"灵魂绑定伤害加成: {Improvement * 100:0.##}% [ {ImprovementDamage:0.##} ] 点," : "") + $"总伤害 {Damage + ImprovementDamage:0.##} 点。" +
$"随后,有 25% 概率对受到伤害的目标造成眩晕 1 回合。眩晕:进入完全行动不能状态。";
public double PACoefficient => 0.35 + 0.05 * (Skill.Level - 1);
public double PADamage => (Skill.Character?.PrimaryAttributeValue ?? 0) * PACoefficient;
public double GeneralDamage => 70 * Skill.Level;
public double Damage => GeneralDamage + PADamage;
public double ImprovementDamage => Improvement > 0 ? Damage * Improvement : 0;
public override void OnSkillCasted(Character caster, List<Character> targets, List<Grid> grids, Dictionary<string, object> others)
{
List<Character> valid = [];
foreach (Character target in targets)
{
DamageCalculationOptions options = new(caster);
if (DamageToEnemy(caster, target, DamageType.True, MagicType.None, Damage + ImprovementDamage, options).ActualDamage > 0)
{
if (Random.Shared.NextDouble() < 0.25)
{
valid.Add(target);
}
}
}
Effect e = new (Skill);
e.OnSkillCasted(caster, valid, grids, others);
}
}
}

View File

@ -0,0 +1,143 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Model;
using Milimoe.FunGame.Core.Model.PrefabricatedEntity;
using Oshima.FunGame.OshimaModules.Effects.SkillEffects;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : SoulboundSkill
{
public override long Id => (long)SuperSkillID.;
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 CD => 70;
public override double HardnessTime { get; set; } = 11;
public (Character? character = null) : base(character)
{
Effects.Add(new (this));
}
}
public class (SoulboundSkill skill) : SoulboundEffect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"基于{Skill.SkillOwner()}的 {ATKCoefficient * 100:0.##}% 攻击力 [ {Damage:0.##} ] 对{Skill.TargetDescription()}造成{CharacterSet.GetDamageTypeName(DamageType.Physical)}" +
(Improvement > 0 ? $",灵魂绑定伤害加成: {Improvement * 100:0.##}% [ {ImprovementDamage:0.##} ] 点,总伤害 {Damage + ImprovementDamage:0.##} 点;" : "") +
$"造成伤害后,对目标施加 {虚弱时间}虚弱。虚弱:伤害降低 {DamageReductionPercent * 100:0.##}%,物理护甲降低 {DEFReductionPercent * 100:0.##}%" +
$"魔法抗性降低 {MDFReductionPercent * 100:0.##}%,治疗效果降低 {HealingReductionPercent * 100:0.##}%";
public double ATKCoefficient => 0.4 + 0.22 * (Skill.Level - 1);
public double Damage => (Skill.Character?.ATK ?? 0) * ATKCoefficient;
public double ImprovementDamage => Improvement > 0 ? Damage * Improvement : 0;
public override bool Durative => false;
public override int DurationTurn
{
get
{
return Skill.Level switch
{
4 or 5 or 6 => 3,
_ => 2
};
}
}
public double DurationLevelGrowth
{
get
{
return Skill.Level switch
{
_ => 0
};
}
}
public double DamageReductionPercent
{
get
{
return Skill.Level switch
{
1 => 0.10,
2 => 0.14,
3 => 0.18,
4 => 0.22,
5 => 0.26,
6 => 0.3,
_ => 0
};
}
}
public double DEFReductionPercent
{
get
{
return Skill.Level switch
{
1 => 0.3,
2 => 0.35,
3 => 0.4,
4 => 0.45,
5 => 0.50,
6 => 0.55,
_ => 0
};
}
}
public double MDFReductionPercent
{
get
{
return Skill.Level switch
{
1 => 0.08,
2 => 0.11,
3 => 0.14,
4 => 0.17,
5 => 0.20,
6 => 0.23,
_ => 0
};
}
}
public double HealingReductionPercent
{
get
{
return Skill.Level switch
{
1 => 0.12,
2 => 0.16,
3 => 0.20,
4 => 0.24,
5 => 0.28,
6 => 0.32,
_ => 0
};
}
}
private string => Durative && Duration > 0 ? $"{实际虚弱时间:0.##} {GameplayEquilibriumConstant.InGameTime}" : (!Durative && DurationTurn > 0 ? + " 回合" : $"0 {GameplayEquilibriumConstant.InGameTime}");
private double => Durative && Duration > 0 ? Duration + DurationLevelGrowth * (Level - 1) : (!Durative && DurationTurn > 0 ? DurationTurn + DurationLevelGrowth * (Level - 1) : 0);
public override void OnSkillCasted(Character caster, List<Character> targets, List<Grid> grids, Dictionary<string, object> others)
{
List<Character> valid = [];
foreach (Character target in targets)
{
DamageCalculationOptions options = new(caster);
if (DamageToEnemy(caster, target, DamageType.Physical, MagicType.None, Damage + ImprovementDamage, options).ActualDamage > 0)
{
valid.Add(target);
}
}
e = new(Skill, Durative, Duration, DurationTurn, DurationLevelGrowth, DamageReductionPercent, DEFReductionPercent, MDFReductionPercent, HealingReductionPercent);
e.OnSkillCasted(caster, valid, grids, others);
}
}
}

View File

@ -0,0 +1,92 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Model;
using Milimoe.FunGame.Core.Model.PrefabricatedEntity;
using Oshima.FunGame.OshimaModules.Effects.SkillEffects;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : SoulboundSkill
{
public override long Id => (long)SuperSkillID.;
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 CD => 75;
public override double HardnessTime { get; set; } = 9;
public override int CanSelectTargetCount
{
get
{
return Level switch
{
1 or 2 => 1,
3 or 4 => 2,
_ => 3
};
}
}
public (Character? character = null) : base(character)
{
Effects.Add(new (this));
}
}
public class (SoulboundSkill skill) : SoulboundEffect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"基于{Skill.SkillOwner()}的 {ATKCoefficient * 100:0.##}% 攻击力 [ {Damage:0.##} ] 对{Skill.TargetDescription()}造成{CharacterSet.GetDamageTypeName(DamageType.Magical)}" +
(Improvement > 0 ? $",灵魂绑定伤害加成: {Improvement * 100:0.##}% [ {ImprovementDamage:0.##} ] 点,总伤害 {Damage + ImprovementDamage:0.##} 点;" : "") +
$"造成伤害后,对目标随机施加以下几种状态:\r\n1、冻结造成 {DurationTurn} 回合完全行动不能和 30% 魔法伤害易伤;\r\n" +
$"2、混乱进入行动受限状态失控并随机行动且所有指令均会在所有角色中随机选取目标持续 {DurationTurn} 回合;\r\n" +
$"3、战斗不能在 {Duration:0.##} {GameplayEquilibriumConstant.InGameTime}内无法普通攻击和使用技能(魔法、战技和爆发技)。";
public double ATKCoefficient => 0.38 + 0.12 * (Skill.Level - 1);
public double Damage => (Skill.Character?.ATK ?? 0) * ATKCoefficient;
public double ImprovementDamage => Improvement > 0 ? Damage * Improvement : 0;
public override double Duration
{
get
{
return Skill.Level switch
{
4 or 5 or 6 => 14,
_ => 7
};
}
}
public override int DurationTurn
{
get
{
return Skill.Level switch
{
4 or 5 or 6 => 3,
_ => 2
};
}
}
public override void OnSkillCasted(Character caster, List<Character> targets, List<Grid> grids, Dictionary<string, object> others)
{
foreach (Character target in targets)
{
DamageCalculationOptions options = new(caster);
if (DamageToEnemy(caster, target, DamageType.Magical, MagicType.None, Damage + ImprovementDamage, options).ActualDamage > 0)
{
Effect e = Random.Shared.Next(3) switch
{
0 => new (Skill, EffectType.Freeze, false, 0, DurationTurn, 0, 1, 0),
1 => new (Skill, EffectType.Confusion, false, 0, DurationTurn, 0, 1, 0),
_ => new (Skill, EffectType.Cripple, true, Duration, 0, 0, 1, 0),
};
e.OnSkillCasted(caster, [target], grids, others);
}
}
}
}
}

View File

@ -27,17 +27,5 @@ namespace Oshima.FunGame.OshimaModules.Skills
Effects.Add(new (this));
Effects.Add(new (this, 380, 270, true));
}
public override List<Character> GetSelectableTargets(Character caster, List<Character> enemys, List<Character> teammates)
{
List<Character> targets = base.GetSelectableTargets(caster, enemys, teammates);
if (GamingQueue != null)
{
// 从死亡队列中获取队友,加入目标列表。
Dictionary<Character, bool> deaths = GamingQueue.GetIsTeammateDictionary(caster, GamingQueue.Eliminated);
targets = [.. targets.Union(deaths.Where(kv => kv.Value).Select(kv => kv.Key)).Distinct()];
}
return targets;
}
}
}

View File

@ -27,17 +27,5 @@ namespace Oshima.FunGame.OshimaModules.Skills
Effects.Add(new (this));
Effects.Add(new (this, 0.21, 0.02, true));
}
public override List<Character> GetSelectableTargets(Character caster, List<Character> enemys, List<Character> teammates)
{
List<Character> targets = base.GetSelectableTargets(caster, enemys, teammates);
if (GamingQueue != null)
{
// 从死亡队列中获取队友,加入目标列表。
Dictionary<Character, bool> deaths = GamingQueue.GetIsTeammateDictionary(caster, GamingQueue.Eliminated);
targets = [.. targets.Union(deaths.Where(kv => kv.Value).Select(kv => kv.Key)).Distinct()];
}
return targets;
}
}
}

View File

@ -45,7 +45,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"对{Skill.TargetDescription()}造成 {Damage:0.##} 点{CharacterSet.GetDamageTypeName(DamageType.Magical, MagicType)}。" +
$"随后 {ActualConfusionProbability * 100:0.##}% 概率对目标施加混乱状态,持续 {持续时间}。混乱:进入行动受限状态,失控并随机行动,且在进行攻击指令时,可能会选取友方角色为目标。";
$"随后 {ActualConfusionProbability * 100:0.##}% 概率对目标施加混乱状态,持续 {持续时间}。混乱:进入行动受限状态,失控并随机行动,且所有指令均会在所有角色中随机选取目标。";
public override DispelledType DispelledType => DispelledType.Strong;
public override EffectType EffectType => EffectType.Confusion;
public override bool ExemptDuration => true;