护盾改动和角色增强

This commit is contained in:
milimoe 2025-06-17 01:38:51 +08:00
parent 66231b5003
commit 7e8c69bf1b
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0
18 changed files with 288 additions and 61 deletions

View File

@ -13,28 +13,50 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects
public override bool DurativeWithoutDuration => true; public override bool DurativeWithoutDuration => true;
public override bool IsDebuff => false; public override bool IsDebuff => false;
public override Character Source => _sourceCharacter; public override Character Source => _sourceCharacter;
public override bool Durative => _durative;
public override double Duration => _duration;
public override int DurationTurn => _durationTurn;
private readonly Character _sourceCharacter; private readonly Character _sourceCharacter;
private readonly double _shield; private readonly double _shield;
private readonly bool _durative;
private readonly double _duration;
private readonly int _durationTurn;
public (Skill skill, Character sourceCharacter, double shield) : base(skill) public (Skill skill, Character sourceCharacter, double shield, bool durative = false, double duration = 0, int durationTurn = 0) : base(skill)
{ {
GamingQueue = skill.GamingQueue; GamingQueue = skill.GamingQueue;
_sourceCharacter = sourceCharacter; _sourceCharacter = sourceCharacter;
_durative = durative;
_duration = duration;
_durationTurn = durationTurn;
_shield = shield; _shield = shield;
} }
public override void OnEffectGained(Character character) public override void OnEffectGained(Character character)
{ {
character.Shield.Physical += _shield; if (_durative && RemainDuration == 0)
{
RemainDuration = Duration;
}
else if (RemainDurationTurn == 0)
{
RemainDurationTurn = DurationTurn;
}
character.Shield.AddShieldOfEffect(new(this, _shield, false, MagicType.None));
} }
public override bool OnShieldBroken(Character character, Character attacker, bool isMagic, MagicType magicType, double damage, double shield, double overFlowing) public override void OnEffectLost(Character character)
{ {
Effect[] effects = [.. character.Effects.Where(e => e is )]; character.Shield.RemoveShieldOfEffect(this);
foreach (Effect effect in effects) }
public override bool OnShieldBroken(Character character, Character attacker, Effect effet, double overFlowing)
{ {
character.Effects.Remove(effect); if (effet == this)
{
character.Shield.RemoveShieldOfEffect(this);
character.Effects.Remove(this);
} }
return true; return true;
} }

View File

@ -13,28 +13,50 @@ namespace Oshima.FunGame.OshimaModules.Effects.PassiveEffects
public override bool DurativeWithoutDuration => true; public override bool DurativeWithoutDuration => true;
public override bool IsDebuff => false; public override bool IsDebuff => false;
public override Character Source => _sourceCharacter; public override Character Source => _sourceCharacter;
public override bool Durative => _durative;
public override double Duration => _duration;
public override int DurationTurn => _durationTurn;
private readonly Character _sourceCharacter; private readonly Character _sourceCharacter;
private readonly double _shield; private readonly double _shield;
private readonly bool _durative;
private readonly double _duration;
private readonly int _durationTurn;
public (Skill skill, Character sourceCharacter, double shield) : base(skill) public (Skill skill, Character sourceCharacter, double shield, bool durative = false, double duration = 0, int durationTurn = 0) : base(skill)
{ {
GamingQueue = skill.GamingQueue; GamingQueue = skill.GamingQueue;
_sourceCharacter = sourceCharacter; _sourceCharacter = sourceCharacter;
_durative = durative;
_duration = duration;
_durationTurn = durationTurn;
_shield = shield; _shield = shield;
} }
public override void OnEffectGained(Character character) public override void OnEffectGained(Character character)
{ {
character.Shield.None += _shield; if (_durative && RemainDuration == 0)
{
RemainDuration = Duration;
}
else if (RemainDurationTurn == 0)
{
RemainDurationTurn = DurationTurn;
}
character.Shield.AddShieldOfEffect(new(this, _shield, true, MagicType.None));
} }
public override bool OnShieldBroken(Character character, Character attacker, bool isMagic, MagicType magicType, double damage, double shield, double overFlowing) public override void OnEffectLost(Character character)
{ {
Effect[] effects = [.. character.Effects.Where(e => e is )]; character.Shield.RemoveShieldOfEffect(this);
foreach (Effect effect in effects) }
public override bool OnShieldBroken(Character character, Character attacker, Effect effet, double overFlowing)
{ {
character.Effects.Remove(effect); if (effet == this)
{
character.Shield.RemoveShieldOfEffect(this);
character.Effects.Remove(this);
} }
return true; return true;
} }

View File

@ -1,21 +1,20 @@
using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Effects.PassiveEffects;
namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects
{ {
public class : Effect public class : Effect
{ {
public override long Id => Skill.Id; public override long Id => Skill.Id;
public override string Name => Skill.Name; public override string Name => Skill.Name;
public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点物理护盾。"; public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点混合护盾值。";
public string TargetDescription => Skill.SelectAllTeammates ? "友方全体角色" : $"目标{(Skill.CanSelectTargetCount > 1 ? $" {Skill.CanSelectTargetCount} " : "")}友方角色"; public string TargetDescription => Skill.SelectAllTeammates ? "友方全体角色" : $"目标{(Skill.CanSelectTargetCount > 1 ? $" {Skill.CanSelectTargetCount} " : "")}友方角色";
private double => Level > 0 ? Math.Abs( + * (Level - 1)) : Math.Abs(); private double => Level > 0 ? Math.Abs( + * (Level - 1)) : Math.Abs();
private double { get; set; } = 200; private double { get; set; } = 200;
private double { get; set; } = 100; private double { get; set; } = 100;
public (Skill skill, double , double ) : base(skill) public (Skill skill, double , double ) : base(skill)
{ {
GamingQueue = skill.GamingQueue; GamingQueue = skill.GamingQueue;
this. = ; this. = ;
@ -26,11 +25,8 @@ namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects
{ {
foreach (Character target in targets) foreach (Character target in targets)
{ {
WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点物理护盾!"); target.Shield.Mix += ;
e = new(Skill, caster, ); WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点混合护盾值!");
target.Effects.Add(e);
e.OnEffectGained(target);
e.DispelledType = DispelledType;
GamingQueue?.LastRound.ApplyEffects.TryAdd(target, [EffectType.Shield]); GamingQueue?.LastRound.ApplyEffects.TryAdd(target, [EffectType.Shield]);
} }
} }

View File

@ -1,21 +1,20 @@
using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Effects.PassiveEffects;
namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects
{ {
public class : Effect public class _护盾值型 : Effect
{ {
public override long Id => Skill.Id; public override long Id => Skill.Id;
public override string Name => Skill.Name; public override string Name => Skill.Name;
public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点魔法护盾。"; public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点物理护盾值。";
public string TargetDescription => Skill.SelectAllTeammates ? "友方全体角色" : $"目标{(Skill.CanSelectTargetCount > 1 ? $" {Skill.CanSelectTargetCount} " : "")}友方角色"; public string TargetDescription => Skill.SelectAllTeammates ? "友方全体角色" : $"目标{(Skill.CanSelectTargetCount > 1 ? $" {Skill.CanSelectTargetCount} " : "")}友方角色";
private double => Level > 0 ? Math.Abs( + * (Level - 1)) : Math.Abs(); private double => Level > 0 ? Math.Abs( + * (Level - 1)) : Math.Abs();
private double { get; set; } = 200; private double { get; set; } = 200;
private double { get; set; } = 100; private double { get; set; } = 100;
public (Skill skill, double , double ) : base(skill) public _护盾值型(Skill skill, double , double ) : base(skill)
{ {
GamingQueue = skill.GamingQueue; GamingQueue = skill.GamingQueue;
this. = ; this. = ;
@ -26,11 +25,8 @@ namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects
{ {
foreach (Character target in targets) foreach (Character target in targets)
{ {
WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点魔法护盾!"); target.Shield[false] += ;
e = new(Skill, caster, ); WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点物理护盾值!");
target.Effects.Add(e);
e.OnEffectGained(target);
e.DispelledType = DispelledType;
GamingQueue?.LastRound.ApplyEffects.TryAdd(target, [EffectType.Shield]); GamingQueue?.LastRound.ApplyEffects.TryAdd(target, [EffectType.Shield]);
} }
} }

View File

@ -0,0 +1,45 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Effects.PassiveEffects;
namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects
{
public class _特效持续型 : Effect
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点物理护盾,持续 {持续时间}。";
public string TargetDescription => Skill.SelectAllTeammates ? "友方全体角色" : $"目标{(Skill.CanSelectTargetCount > 1 ? $" {Skill.CanSelectTargetCount} " : "")}友方角色";
private string => _durative && _duration > 0 ? _duration + $" {GameplayEquilibriumConstant.InGameTime}" : (!_durative && _durationTurn > 0 ? _durationTurn + " 回合" : $"0 {GameplayEquilibriumConstant.InGameTime}");
private double => Level > 0 ? Math.Abs( + * (Level - 1)) : Math.Abs();
private double { get; set; } = 200;
private double { get; set; } = 100;
private readonly bool _durative;
private readonly double _duration;
private readonly int _durationTurn;
public _特效持续型(Skill skill, double , double , bool durative = false, double duration = 0, int durationTurn = 0) : base(skill)
{
GamingQueue = skill.GamingQueue;
this. = ;
this. = ;
_durative = durative;
_duration = duration;
_durationTurn = durationTurn;
}
public override void OnSkillCasted(Character caster, List<Character> targets, Dictionary<string, object> others)
{
foreach (Character target in targets)
{
WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点物理护盾!");
e = new(Skill, caster, , _durative, _duration, _durationTurn);
target.Effects.Add(e);
e.OnEffectGained(target);
e.DispelledType = DispelledType;
GamingQueue?.LastRound.ApplyEffects.TryAdd(target, [EffectType.Shield]);
}
}
}
}

View File

@ -0,0 +1,34 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects
{
public class _护盾值型 : Effect
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点魔法护盾值。";
public string TargetDescription => Skill.SelectAllTeammates ? "友方全体角色" : $"目标{(Skill.CanSelectTargetCount > 1 ? $" {Skill.CanSelectTargetCount} " : "")}友方角色";
private double => Level > 0 ? Math.Abs( + * (Level - 1)) : Math.Abs();
private double { get; set; } = 200;
private double { get; set; } = 100;
public _护盾值型(Skill skill, double , double ) : base(skill)
{
GamingQueue = skill.GamingQueue;
this. = ;
this. = ;
}
public override void OnSkillCasted(Character caster, List<Character> targets, Dictionary<string, object> others)
{
foreach (Character target in targets)
{
target.Shield[true, MagicType.None] += ;
WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点魔法护盾值!");
GamingQueue?.LastRound.ApplyEffects.TryAdd(target, [EffectType.Shield]);
}
}
}
}

View File

@ -0,0 +1,45 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Effects.PassiveEffects;
namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects
{
public class _特效持续型 : Effect
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"为{TargetDescription}提供 {护盾值:0.##} 点魔法护盾,持续 {持续时间}。";
public string TargetDescription => Skill.SelectAllTeammates ? "友方全体角色" : $"目标{(Skill.CanSelectTargetCount > 1 ? $" {Skill.CanSelectTargetCount} " : "")}友方角色";
private string => _durative && _duration > 0 ? _duration + $" {GameplayEquilibriumConstant.InGameTime}" : (!_durative && _durationTurn > 0 ? _durationTurn + " 回合" : $"0 {GameplayEquilibriumConstant.InGameTime}");
private double => Level > 0 ? Math.Abs( + * (Level - 1)) : Math.Abs();
private double { get; set; } = 200;
private double { get; set; } = 100;
private readonly bool _durative;
private readonly double _duration;
private readonly int _durationTurn;
public _特效持续型(Skill skill, double , double , bool durative = false, double duration = 0, int durationTurn = 0) : base(skill)
{
GamingQueue = skill.GamingQueue;
this. = ;
this. = ;
_durative = durative;
_duration = duration;
_durationTurn = durationTurn;
}
public override void OnSkillCasted(Character caster, List<Character> targets, Dictionary<string, object> others)
{
foreach (Character target in targets)
{
WriteLine($"[ {target} ] 获得了 {护盾值:0.##} 点魔法护盾!");
e = new(Skill, caster, , _durative, _duration, _durationTurn);
target.Effects.Add(e);
e.OnEffectGained(target);
e.DispelledType = DispelledType;
GamingQueue?.LastRound.ApplyEffects.TryAdd(target, [EffectType.Shield]);
}
}
}
}

View File

@ -6,7 +6,7 @@ namespace Oshima.FunGame.OshimaModules.Effects.SkillEffects
{ {
public override long Id => Skill.Id; public override long Id => Skill.Id;
public override string Name => Skill.Name; public override string Name => Skill.Name;
public override string Description => $"为{(Skill.CanSelectTargetCount > 1 ? $" {Skill.CanSelectTargetCount} " : "")}目标回复其最大生命值 {百分比 * 100:0.##}% 生命值。"; public override string Description => $"为{(Skill.CanSelectTargetCount > 1 ? $" {Skill.CanSelectTargetCount} " : "")}目标回复其最大生命值 {百分比 * 100:0.##}% 生命值。{(CanRespawn ? "" : "")}";
private double { get; set; } = 0.03; private double { get; set; } = 0.03;
private double { get; set; } = 0.03; private double { get; set; } = 0.03;

View File

@ -25,53 +25,118 @@ namespace Oshima.FunGame.OshimaModules.Skills
{ {
public override long Id => Skill.Id; public override long Id => Skill.Id;
public override string Name => "变幻之心"; public override string Name => "变幻之心";
public override string Description => $"检查 [ 智慧与力量 ] 的模式。在力量模式下,立即回复 {生命值回复 * 100:0.##}% 生命值;智力模式下,下一次魔法伤害提升 {伤害提升 * 100:0.##}%。"; public override string Description => $"检查 [ 智慧与力量 ] 的模式。在力量模式下,立即回复 {生命值回复 * 100:0.##}% 生命值,同时下 {吸血次数} 次对敌人造成伤害时获得 30% 生命偷取;" +
$"智力模式下,下 {魔法加成次数} 次魔法伤害提升 {伤害提升 * 100:0.##}%。此技能效果不叠加,重复释放时将重置次数;若是模式切换后重复释放,将回收先前的效果。";
public override DispelledType DispelledType => DispelledType.CannotBeDispelled; public override DispelledType DispelledType => DispelledType.CannotBeDispelled;
private int
{
get
{
return Level switch
{
1 => 3,
2 => 3,
3 => 4,
4 => 4,
5 => 5,
6 => 5,
_ => 3
};
}
}
private int
{
get
{
return Level switch
{
1 => 1,
2 => 2,
3 => 2,
4 => 3,
5 => 3,
6 => 4,
_ => 1
};
}
}
private double => 0.25 + 0.03 * (Level - 1); private double => 0.25 + 0.03 * (Level - 1);
private double => 0.6 + 0.4 * (Level - 1); private double => 0.6 + 0.4 * (Level - 1);
private double = 0;
private double = 0;
public override void OnEffectGained(Character character) public override void OnEffectGained(Character character)
{ {
Skill.IsInEffect = true; if (character.PrimaryAttribute == PrimaryAttribute.STR)
{
= ;
}
else if (character.PrimaryAttribute == PrimaryAttribute.INT)
{
= ;
}
} }
public override void OnEffectLost(Character character) public override void OnEffectLost(Character character)
{ {
Skill.IsInEffect = false; = 0;
= 0;
} }
public override double AlterExpectedDamageBeforeCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, Dictionary<Effect, double> totalDamageBonus) public override double AlterExpectedDamageBeforeCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, Dictionary<Effect, double> totalDamageBonus)
{ {
if (character == Skill.Character && isMagicDamage) if (character == Skill.Character && isMagicDamage && > 0)
{ {
--;
double = ; double = ;
double = damage * ; double = damage * ;
WriteLine($"[ {character} ] 发动了变幻之心!伤害提升了 {实际伤害提升:0.##} 点!"); WriteLine($"[ {character} ] 发动了变幻之心!伤害提升了 {实际伤害提升:0.##} 点!变幻之心加成剩余:{当前魔法加成次数} 次。");
if ( == 0)
{
character.Effects.Remove(this); character.Effects.Remove(this);
OnEffectLost(character); OnEffectLost(character);
}
return ; return ;
} }
return 0; return 0;
} }
public override void AfterDamageCalculation(Character character, Character enemy, double damage, double actualDamage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (character == Skill.Character && > 0 && (damageResult == DamageResult.Normal || damageResult == DamageResult.Critical) && damage > 0)
{
--;
double = damage * 0.3;
character.HP += ;
WriteLine($"[ {character} ] 发动了变幻之心!回复了 {实际吸血:0.##} 点生命值!变幻之心加成剩余:{当前吸血次数} 次。");
if ( == 0)
{
character.Effects.Remove(this);
OnEffectLost(character);
}
}
}
public override void OnSkillCasted(Character caster, List<Character> targets, Dictionary<string, object> others) public override void OnSkillCasted(Character caster, List<Character> targets, Dictionary<string, object> others)
{ {
IEnumerable<Effect> effects = caster.Effects.Where(e => e is ); IEnumerable<Effect> effects = caster.Effects.Where(e => e is );
if (effects.Any()) if (effects.Any())
{ {
if (caster.Effects.Contains(this))
{
OnEffectLost(caster);
}
caster.Effects.Add(this);
OnEffectGained(caster);
if (caster.PrimaryAttribute == PrimaryAttribute.STR) if (caster.PrimaryAttribute == PrimaryAttribute.STR)
{ {
double = * caster.MaxHP; double = * caster.MaxHP;
HealToTarget(caster, caster, ); HealToTarget(caster, caster, );
GamingQueue?.LastRound.ApplyEffects.TryAdd(caster, [EffectType.Lifesteal]);
} }
else if (caster.PrimaryAttribute == PrimaryAttribute.INT) else if (caster.PrimaryAttribute == PrimaryAttribute.INT)
{ {
if (!caster.Effects.Contains(this))
{
caster.Effects.Add(this);
OnEffectGained(caster);
}
GamingQueue?.LastRound.ApplyEffects.TryAdd(caster, [EffectType.DamageBoost]); GamingQueue?.LastRound.ApplyEffects.TryAdd(caster, [EffectType.DamageBoost]);
} }
} }

View File

@ -32,7 +32,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
{ {
public override long Id => Skill.Id; public override long Id => Skill.Id;
public override string Name => Skill.Name; public override string Name => Skill.Name;
public override string Description => $"最大生命值减少 20%。破釜沉舟:生命值高于 30% 时,受到额外的 [ {高于30额外伤害下限}~{高于30额外伤害上限}% ] 伤害,但是获得 [ 累计所受伤害的 {高于30的加成下限}~{高于30的加成上限}% ] 伤害加成;生命值低于等于 30% 时,不会受到额外的伤害,仅能获得 [ 累计受到的伤害 {低于30的加成下限}~{低于30的加成上限}% ] 伤害加成。" + public override string Description => $"最大生命值减少 20%。破釜沉舟:生命值高于 30% 时,受到额外的 [ {高于30额外伤害下限}{高于30额外伤害上限}% ] 伤害,获得 [ 累计所受伤害的 {高于30的加成下限}{高于30的加成上限}% ] 伤害加成;生命值低于等于 30% 时,不会受到额外的伤害,并且获得 [ 累计受到的伤害 {低于30的加成下限}{低于30的加成上限}% ] 的伤害加成。" +
$"在没有受到任何伤害的时候,将获得 {常规伤害加成 * 100:0.##}% 伤害加成。" + ( > 0 ? $"(当前累计受到伤害:{累计受到的伤害:0.##}" : ""); $"在没有受到任何伤害的时候,将获得 {常规伤害加成 * 100:0.##}% 伤害加成。" + ( > 0 ? $"(当前累计受到伤害:{累计受到的伤害:0.##}" : "");
private double = 0; private double = 0;
@ -42,10 +42,10 @@ namespace Oshima.FunGame.OshimaModules.Skills
private readonly double = 0.35; private readonly double = 0.35;
private readonly int 30 = 30; private readonly int 30 = 30;
private readonly int 30 = 15; private readonly int 30 = 15;
private readonly int 30 = 100; private readonly int 30 = 80;
private readonly int 30 = 80; private readonly int 30 = 50;
private readonly int 30 = 60; private readonly int 30 = 120;
private readonly int 30 = 40; private readonly int 30 = 90;
private double (double damage) private double (double damage)
{ {

View File

@ -24,7 +24,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
{ {
public override long Id => Skill.Id; public override long Id => Skill.Id;
public override string Name => Skill.Name; public override string Name => Skill.Name;
public override string Description => $"在 AI 控制下,任何目标都将则优先选择血量更低的角色。行动开始时,弱者猎手会盯上一名角色,然后标记所有生命值百分比低于自己的角色。在此回合内攻击被盯上或者被标记的角色,将造成 150% 伤害。"; public override string Description => $"在 AI 控制下,任何目标都将则优先选择血量更低的角色。行动开始时,弱者猎手会盯上一名角色,然后标记所有生命值百分比低于自己的角色。在此回合内攻击被盯上或者被标记的角色,将造成 140% 伤害。";
public HashSet<Character> { get; set; } = []; public HashSet<Character> { get; set; } = [];
@ -32,7 +32,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
{ {
if (character == Skill.Character && .Contains(enemy)) if (character == Skill.Character && .Contains(enemy))
{ {
double = damage * 0.5; double = damage * 0.4;
return ; return ;
} }
return 0; return 0;

View File

@ -25,7 +25,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
{ {
public override long Id => Skill.Id; public override long Id => Skill.Id;
public override string Name => Skill.Name; public override string Name => Skill.Name;
public override string Description => $"{Duration:0.##} {GameplayEquilibriumConstant.InGameTime}内,增加 40% 攻击力 [ {攻击力提升:0.##} ]、30% 物理穿透和 25% 闪避率(不可叠加),普通攻击硬直时间额外减少 20%,基于 {系数 * 100:0.##}% 敏捷 [ {伤害加成:0.##} ] 强化普通攻击的伤害。在持续时间内,【心灵之火】的冷却时间降低至 3 {GameplayEquilibriumConstant.InGameTime}。"; public override string Description => $"{Duration:0.##} {GameplayEquilibriumConstant.InGameTime}内,增加 40% 攻击力 [ {攻击力提升:0.##} ]、30% 物理穿透和 25% 闪避率(不可叠加),普通攻击硬直时间额外减少 20%,基于 {系数 * 100:0.##}% 敏捷 [ {伤害加成:0.##} ] 强化普通攻击的伤害。在持续时间内,[ 心灵之火 ] 的冷却时间降低至 3 {GameplayEquilibriumConstant.InGameTime}。";
public override bool Durative => true; public override bool Durative => true;
public override double Duration => 40; public override double Duration => 40;
public override DispelledType DispelledType => DispelledType.CannotBeDispelled; public override DispelledType DispelledType => DispelledType.CannotBeDispelled;

View File

@ -23,7 +23,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
{ {
SelectTargetPredicates.Add(c => c.HP >= 0 && c.HP < c.MaxHP); SelectTargetPredicates.Add(c => c.HP >= 0 && c.HP < c.MaxHP);
Effects.Add(new (this)); Effects.Add(new (this));
Effects.Add(new (this, 160, 135, true)); Effects.Add(new (this, 0.24, 0.02, true));
} }
public override List<Character> GetSelectableTargets(Character caster, List<Character> enemys, List<Character> teammates) public override List<Character> GetSelectableTargets(Character caster, List<Character> enemys, List<Character> teammates)

View File

@ -70,7 +70,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public (Character? character = null) : base(SkillType.Magic, character) public (Character? character = null) : base(SkillType.Magic, character)
{ {
Effect shield = new (this, 120, 160) Effect shield = new _特效持续型(this, 120, 160, true, 15)
{ {
DispelledType = DispelledType.CannotBeDispelled DispelledType = DispelledType.CannotBeDispelled
}; };

View File

@ -22,8 +22,7 @@ namespace Oshima.FunGame.OshimaModules.Skills
public (Character? character = null) : base(SkillType.Magic, character) public (Character? character = null) : base(SkillType.Magic, character)
{ {
Effects.Add(new (this, 160, 80)); Effects.Add(new (this, 160, 120));
Effects.Add(new (this, 160, 80));
} }
} }
} }

View File

@ -172,7 +172,7 @@ namespace Oshima.FunGame.OshimaServers.Service
mvpBuilder.AppendLine($"[ {mvp.ToStringWithLevel()} ]"); mvpBuilder.AppendLine($"[ {mvp.ToStringWithLevel()} ]");
mvpBuilder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / " + stats.Deaths : "")}"); mvpBuilder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / " + stats.Deaths : "")}");
mvpBuilder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); mvpBuilder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}");
mvpBuilder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##}"); mvpBuilder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##} / 护盾抵消:{stats.TotalShield:0.##}");
mvpBuilder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}"); mvpBuilder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}");
mvpBuilder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); mvpBuilder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}");
mvpBuilder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); mvpBuilder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}");
@ -189,7 +189,7 @@ namespace Oshima.FunGame.OshimaServers.Service
builder.AppendLine($"{count + ". "}[ {character.ToStringWithLevel()} ]"); builder.AppendLine($"{count + ". "}[ {character.ToStringWithLevel()} ]");
builder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / " + stats.Deaths : "")}"); builder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / " + stats.Deaths : "")}");
builder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); builder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}");
builder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##}"); builder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##} / 护盾抵消:{stats.TotalShield:0.##}");
builder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}"); builder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}");
builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}");
builder.AppendLine($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); builder.AppendLine($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}");
@ -383,7 +383,7 @@ namespace Oshima.FunGame.OshimaServers.Service
mvpBuilder.AppendLine($"{(team != null ? "[ " + team.Name + " ] " : "")}[ {mvp.ToStringWithLevel()} ]"); mvpBuilder.AppendLine($"{(team != null ? "[ " + team.Name + " ] " : "")}[ {mvp.ToStringWithLevel()} ]");
mvpBuilder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / " + stats.Deaths : "")}"); mvpBuilder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / " + stats.Deaths : "")}");
mvpBuilder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); mvpBuilder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}");
mvpBuilder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##}"); mvpBuilder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##} / 护盾抵消:{stats.TotalShield:0.##}");
mvpBuilder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}"); mvpBuilder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}");
mvpBuilder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); mvpBuilder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}");
mvpBuilder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); mvpBuilder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}");

View File

@ -418,7 +418,7 @@ namespace Oshima.FunGame.OshimaServers.Service
mvpBuilder.AppendLine($"{(tgq != null ? "[ " + tgq.GetTeamFromEliminated(mvp)?.Name + " ] " : "")}[ {mvp.ToStringWithLevel()} ]"); mvpBuilder.AppendLine($"{(tgq != null ? "[ " + tgq.GetTeamFromEliminated(mvp)?.Name + " ] " : "")}[ {mvp.ToStringWithLevel()} ]");
mvpBuilder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / " + stats.Deaths : "")}"); mvpBuilder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / " + stats.Deaths : "")}");
mvpBuilder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); mvpBuilder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}");
mvpBuilder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##}"); mvpBuilder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##} / 护盾抵消:{stats.TotalShield:0.##}");
mvpBuilder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}"); mvpBuilder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}");
mvpBuilder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); mvpBuilder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}");
mvpBuilder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); mvpBuilder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}");
@ -480,7 +480,7 @@ namespace Oshima.FunGame.OshimaServers.Service
builder.AppendLine($"{(isWeb ? count + "." : ("[ " + tgq.GetTeamFromEliminated(character)?.Name + " ]" ?? ""))} [ {character.ToStringWithLevel()} ]"); builder.AppendLine($"{(isWeb ? count + "." : ("[ " + tgq.GetTeamFromEliminated(character)?.Name + " ]" ?? ""))} [ {character.ToStringWithLevel()} ]");
builder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(tgq.MaxRespawnTimes != 0 ? " / " + stats.Deaths : "")}"); builder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(tgq.MaxRespawnTimes != 0 ? " / " + stats.Deaths : "")}");
builder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); builder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}");
builder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##}"); builder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##} / 护盾抵消:{stats.TotalShield:0.##}");
builder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}"); builder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}");
builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}");
builder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); builder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}");
@ -512,7 +512,7 @@ namespace Oshima.FunGame.OshimaServers.Service
builder.AppendLine($"{(isWeb ? count + ". " : "")}[ {character.ToStringWithLevel()} ]"); builder.AppendLine($"{(isWeb ? count + ". " : "")}[ {character.ToStringWithLevel()} ]");
builder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / " + stats.Deaths : "")}"); builder.AppendLine($"技术得分:{stats.Rating:0.0#} / 击杀数:{stats.Kills} / 助攻数:{stats.Assists}{(actionQueue.MaxRespawnTimes != 0 ? " / " + stats.Deaths : "")}");
builder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}"); builder.AppendLine($"存活时长:{stats.LiveTime:0.##} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}");
builder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##}"); builder.AppendLine($"控制时长:{stats.ControlTime:0.##} / 总计治疗:{stats.TotalHeal:0.##} / 护盾抵消:{stats.TotalShield:0.##}");
builder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}"); builder.AppendLine($"总计伤害:{stats.TotalDamage:0.##} / 总计物理伤害:{stats.TotalPhysicalDamage:0.##} / 总计魔法伤害:{stats.TotalMagicDamage:0.##}");
builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}"); builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage:0.##} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage:0.##} / 总承受魔法伤害:{stats.TotalTakenMagicDamage:0.##}");
builder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}"); builder.Append($"每秒伤害:{stats.DamagePerSecond:0.##} / 每回合伤害:{stats.DamagePerTurn:0.##}");
@ -1090,6 +1090,7 @@ namespace Oshima.FunGame.OshimaServers.Service
totalStats.AvgActionTurn = totalStats.ActionTurn / totalStats.Plays; totalStats.AvgActionTurn = totalStats.ActionTurn / totalStats.Plays;
totalStats.AvgLiveTime = Calculation.Round2Digits(totalStats.LiveTime / totalStats.Plays); totalStats.AvgLiveTime = Calculation.Round2Digits(totalStats.LiveTime / totalStats.Plays);
totalStats.AvgControlTime = Calculation.Round2Digits(totalStats.ControlTime / totalStats.Plays); totalStats.AvgControlTime = Calculation.Round2Digits(totalStats.ControlTime / totalStats.Plays);
totalStats.AvgShield = Calculation.Round2Digits(totalStats.TotalShield / totalStats.Plays);
totalStats.AvgEarnedMoney = totalStats.TotalEarnedMoney / totalStats.Plays; totalStats.AvgEarnedMoney = totalStats.TotalEarnedMoney / totalStats.Plays;
totalStats.Winrates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Wins) / Convert.ToDouble(totalStats.Plays)); totalStats.Winrates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Wins) / Convert.ToDouble(totalStats.Plays));
totalStats.Top3rates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Top3s) / Convert.ToDouble(totalStats.Plays)); totalStats.Top3rates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Top3s) / Convert.ToDouble(totalStats.Plays));

View File

@ -71,6 +71,7 @@ namespace Oshima.FunGame.WebAPI.Controllers
builder.AppendLine($"总计行动回合数:{stats.ActionTurn} / 场均:{stats.AvgActionTurn}"); builder.AppendLine($"总计行动回合数:{stats.ActionTurn} / 场均:{stats.AvgActionTurn}");
builder.AppendLine($"总计存活时长:{stats.LiveTime:0.##} / 场均:{stats.AvgLiveTime:0.##}"); builder.AppendLine($"总计存活时长:{stats.LiveTime:0.##} / 场均:{stats.AvgLiveTime:0.##}");
builder.AppendLine($"总计控制时长:{stats.ControlTime:0.##} / 场均:{stats.AvgControlTime:0.##}"); builder.AppendLine($"总计控制时长:{stats.ControlTime:0.##} / 场均:{stats.AvgControlTime:0.##}");
builder.AppendLine($"总计护盾抵消:{stats.TotalShield:0.##} / 场均:{stats.AvgShield:0.##}");
builder.AppendLine($"总计赚取金钱:{stats.TotalEarnedMoney} / 场均:{stats.AvgEarnedMoney}"); builder.AppendLine($"总计赚取金钱:{stats.TotalEarnedMoney} / 场均:{stats.AvgEarnedMoney}");
builder.AppendLine($"每回合伤害:{stats.DamagePerRound:0.##}"); builder.AppendLine($"每回合伤害:{stats.DamagePerRound:0.##}");
builder.AppendLine($"每行动回合伤害:{stats.DamagePerTurn:0.##}"); builder.AppendLine($"每行动回合伤害:{stats.DamagePerTurn:0.##}");
@ -128,6 +129,7 @@ namespace Oshima.FunGame.WebAPI.Controllers
builder.AppendLine($"总计行动回合数:{stats.ActionTurn} / 场均:{stats.AvgActionTurn}"); builder.AppendLine($"总计行动回合数:{stats.ActionTurn} / 场均:{stats.AvgActionTurn}");
builder.AppendLine($"总计存活时长:{stats.LiveTime:0.##} / 场均:{stats.AvgLiveTime:0.##}"); builder.AppendLine($"总计存活时长:{stats.LiveTime:0.##} / 场均:{stats.AvgLiveTime:0.##}");
builder.AppendLine($"总计控制时长:{stats.ControlTime:0.##} / 场均:{stats.AvgControlTime:0.##}"); builder.AppendLine($"总计控制时长:{stats.ControlTime:0.##} / 场均:{stats.AvgControlTime:0.##}");
builder.AppendLine($"总计护盾抵消:{stats.TotalShield:0.##} / 场均:{stats.AvgShield:0.##}");
builder.AppendLine($"总计赚取金钱:{stats.TotalEarnedMoney} / 场均:{stats.AvgEarnedMoney}"); builder.AppendLine($"总计赚取金钱:{stats.TotalEarnedMoney} / 场均:{stats.AvgEarnedMoney}");
builder.AppendLine($"每回合伤害:{stats.DamagePerRound:0.##}"); builder.AppendLine($"每回合伤害:{stats.DamagePerRound:0.##}");
builder.AppendLine($"每行动回合伤害:{stats.DamagePerTurn:0.##}"); builder.AppendLine($"每行动回合伤害:{stats.DamagePerTurn:0.##}");