更新动态扩展特效,支持魔抗和百分比硬直

This commit is contained in:
milimoe 2025-06-14 03:16:46 +08:00
parent 66826ee6d2
commit 66231b5003
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
2 changed files with 132 additions and 76 deletions

View File

@ -3,9 +3,6 @@ using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
/// <summary>
/// 除了硬直时间减少和魔法抗性,可以都用这个
/// </summary>
public class DynamicsEffect : Effect public class DynamicsEffect : Effect
{ {
public override long Id => (long)EffectID.DynamicsEffect; public override long Id => (long)EffectID.DynamicsEffect;
@ -53,9 +50,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExATK2 += exATK; character.ExATK2 += exATK;
} }
else else if (RealDynamicsValues.TryGetValue("exatk", out double current))
{ {
character.ExATK2 -= exATK; character.ExATK2 -= current;
} }
RealDynamicsValues["exatk"] = exATK; RealDynamicsValues["exatk"] = exATK;
Descriptions.Add($"{(exATK >= 0 ? "" : "")}角色 {Math.Abs(exATK):0.##} 点攻击力。"); Descriptions.Add($"{(exATK >= 0 ? "" : "")}角色 {Math.Abs(exATK):0.##} 点攻击力。");
@ -68,9 +65,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExDEF2 += exDEF; character.ExDEF2 += exDEF;
} }
else else if (RealDynamicsValues.TryGetValue("exdef", out double current))
{ {
character.ExDEF2 -= exDEF; character.ExDEF2 -= current;
} }
RealDynamicsValues["exdef"] = exDEF; RealDynamicsValues["exdef"] = exDEF;
Descriptions.Add($"{(exDEF >= 0 ? "" : "")}角色 {Math.Abs(exDEF):0.##} 点物理护甲。"); Descriptions.Add($"{(exDEF >= 0 ? "" : "")}角色 {Math.Abs(exDEF):0.##} 点物理护甲。");
@ -83,9 +80,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExSTR += exSTR; character.ExSTR += exSTR;
} }
else else if (RealDynamicsValues.TryGetValue("exstr", out double current))
{ {
character.ExSTR -= exSTR; character.ExSTR -= current;
} }
RealDynamicsValues["exstr"] = exSTR; RealDynamicsValues["exstr"] = exSTR;
Descriptions.Add($"{(exSTR >= 0 ? "" : "")}角色 {Math.Abs(exSTR):0.##} 点力量。"); Descriptions.Add($"{(exSTR >= 0 ? "" : "")}角色 {Math.Abs(exSTR):0.##} 点力量。");
@ -98,9 +95,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExAGI += exAGI; character.ExAGI += exAGI;
} }
else else if (RealDynamicsValues.TryGetValue("exagi", out double current))
{ {
character.ExAGI -= exAGI; character.ExAGI -= current;
} }
RealDynamicsValues["exagi"] = exAGI; RealDynamicsValues["exagi"] = exAGI;
Descriptions.Add($"{(exAGI >= 0 ? "" : "")}角色 {Math.Abs(exAGI):0.##} 点敏捷。"); Descriptions.Add($"{(exAGI >= 0 ? "" : "")}角色 {Math.Abs(exAGI):0.##} 点敏捷。");
@ -113,9 +110,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExINT += exINT; character.ExINT += exINT;
} }
else else if (RealDynamicsValues.TryGetValue("exint", out double current))
{ {
character.ExINT -= exINT; character.ExINT -= current;
} }
RealDynamicsValues["exint"] = exINT; RealDynamicsValues["exint"] = exINT;
Descriptions.Add($"{(exINT >= 0 ? "" : "")}角色 {Math.Abs(exINT):0.##} 点智力。"); Descriptions.Add($"{(exINT >= 0 ? "" : "")}角色 {Math.Abs(exINT):0.##} 点智力。");
@ -136,16 +133,16 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
s.HardnessTime -= shtr; s.HardnessTime -= shtr;
} }
} }
else else if (RealDynamicsValues.TryGetValue("shtr", out double current))
{ {
foreach (Skill s in character.Skills) foreach (Skill s in character.Skills)
{ {
s.HardnessTime += shtr; s.HardnessTime += current;
} }
foreach (Skill? s in character.Items.Select(i => i.Skills.Active)) foreach (Skill? s in character.Items.Select(i => i.Skills.Active))
{ {
if (s != null) if (s != null)
s.HardnessTime += shtr; s.HardnessTime += current;
} }
} }
RealDynamicsValues["shtr"] = shtr; RealDynamicsValues["shtr"] = shtr;
@ -159,14 +156,60 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.NormalAttack.HardnessTime -= nahtr; character.NormalAttack.HardnessTime -= nahtr;
} }
else else if (RealDynamicsValues.TryGetValue("nahtr", out double current))
{ {
character.NormalAttack.HardnessTime += nahtr; character.NormalAttack.HardnessTime += current;
} }
RealDynamicsValues["nahtr"] = nahtr; RealDynamicsValues["nahtr"] = nahtr;
Descriptions.Add($"减少角色的普通攻击 {nahtr:0.##} {GameplayEquilibriumConstant.InGameTime}硬直时间。"); Descriptions.Add($"减少角色的普通攻击 {nahtr:0.##} {GameplayEquilibriumConstant.InGameTime}硬直时间。");
} }
break; break;
case "shtr2":
if (double.TryParse(value, out double shtr2))
{
if (!remove)
{
foreach (Skill s in character.Skills)
{
s.HardnessTime -= s.HardnessTime * shtr2;
}
foreach (Skill? s in character.Items.Select(i => i.Skills.Active))
{
if (s != null)
s.HardnessTime -= s.HardnessTime * shtr2;
}
}
else if (RealDynamicsValues.TryGetValue("shtr2", out double current))
{
foreach (Skill s in character.Skills)
{
s.HardnessTime += s.HardnessTime * current;
}
foreach (Skill? s in character.Items.Select(i => i.Skills.Active))
{
if (s != null)
s.HardnessTime += s.HardnessTime * current;
}
}
RealDynamicsValues["shtr2"] = shtr2;
Descriptions.Add($"减少角色的所有主动技能 {shtr2 * 100:0.##}% {GameplayEquilibriumConstant.InGameTime}硬直时间。");
}
break;
case "nahtr2":
if (double.TryParse(value, out double nahtr2))
{
if (!remove)
{
character.NormalAttack.HardnessTime -= character.NormalAttack.HardnessTime * nahtr2;
}
else if (RealDynamicsValues.TryGetValue("nahtr2", out double current))
{
character.NormalAttack.HardnessTime += character.NormalAttack.HardnessTime * current;
}
RealDynamicsValues["nahtr2"] = nahtr2;
Descriptions.Add($"减少角色的普通攻击 {nahtr2 * 100:0.##}% {GameplayEquilibriumConstant.InGameTime}硬直时间。");
}
break;
case "exacc": case "exacc":
if (double.TryParse(value, out double exacc)) if (double.TryParse(value, out double exacc))
{ {
@ -174,9 +217,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExAccelerationCoefficient += exacc; character.ExAccelerationCoefficient += exacc;
} }
else else if (RealDynamicsValues.TryGetValue("exacc", out double current))
{ {
character.ExAccelerationCoefficient -= exacc; character.ExAccelerationCoefficient -= current;
} }
RealDynamicsValues["exacc"] = exacc; RealDynamicsValues["exacc"] = exacc;
Descriptions.Add($"{(exacc >= 0 ? "" : "")}角色 {Math.Abs(exacc) * 100:0.##}% 加速系数。"); Descriptions.Add($"{(exacc >= 0 ? "" : "")}角色 {Math.Abs(exacc) * 100:0.##}% 加速系数。");
@ -189,9 +232,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExSPD += exspd; character.ExSPD += exspd;
} }
else else if (RealDynamicsValues.TryGetValue("exspd", out double current))
{ {
character.ExSPD -= exspd; character.ExSPD -= current;
} }
RealDynamicsValues["exspd"] = exspd; RealDynamicsValues["exspd"] = exspd;
Descriptions.Add($"{(exspd >= 0 ? "" : "")}角色 {Math.Abs(exspd):0.##} 点行动速度。"); Descriptions.Add($"{(exspd >= 0 ? "" : "")}角色 {Math.Abs(exspd):0.##} 点行动速度。");
@ -204,9 +247,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExActionCoefficient += exac; character.ExActionCoefficient += exac;
} }
else else if (RealDynamicsValues.TryGetValue("exac", out double current))
{ {
character.ExActionCoefficient -= exac; character.ExActionCoefficient -= current;
} }
RealDynamicsValues["exac"] = exac; RealDynamicsValues["exac"] = exac;
Descriptions.Add($"{(exac >= 0 ? "" : "")}角色 {Math.Abs(exac) * 100:0.##}% 行动系数。"); Descriptions.Add($"{(exac >= 0 ? "" : "")}角色 {Math.Abs(exac) * 100:0.##}% 行动系数。");
@ -219,9 +262,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExCDR += excdr; character.ExCDR += excdr;
} }
else else if (RealDynamicsValues.TryGetValue("excdr", out double current))
{ {
character.ExCDR -= excdr; character.ExCDR -= current;
} }
RealDynamicsValues["excdr"] = excdr; RealDynamicsValues["excdr"] = excdr;
Descriptions.Add($"{(excdr >= 0 ? "" : "")}角色 {Math.Abs(excdr) * 100:0.##}% 冷却缩减。"); Descriptions.Add($"{(excdr >= 0 ? "" : "")}角色 {Math.Abs(excdr) * 100:0.##}% 冷却缩减。");
@ -234,9 +277,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExHP2 += exhp; character.ExHP2 += exhp;
} }
else else if (RealDynamicsValues.TryGetValue("exhp", out double current))
{ {
character.ExHP2 -= exhp; character.ExHP2 -= current;
} }
RealDynamicsValues["exhp"] = exhp; RealDynamicsValues["exhp"] = exhp;
Descriptions.Add($"{(exhp >= 0 ? "" : "")}角色 {Math.Abs(exhp):0.##} 点最大生命值。"); Descriptions.Add($"{(exhp >= 0 ? "" : "")}角色 {Math.Abs(exhp):0.##} 点最大生命值。");
@ -249,9 +292,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExMP2 += exmp; character.ExMP2 += exmp;
} }
else else if (RealDynamicsValues.TryGetValue("exmp", out double current))
{ {
character.ExMP2 -= exmp; character.ExMP2 -= current;
} }
RealDynamicsValues["exmp"] = exmp; RealDynamicsValues["exmp"] = exmp;
Descriptions.Add($"{(exmp >= 0 ? "" : "")}角色 {Math.Abs(exmp):0.##} 点最大魔法值。"); Descriptions.Add($"{(exmp >= 0 ? "" : "")}角色 {Math.Abs(exmp):0.##} 点最大魔法值。");
@ -264,9 +307,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExCritRate += excr; character.ExCritRate += excr;
} }
else else if (RealDynamicsValues.TryGetValue("excr", out double current))
{ {
character.ExCritRate -= excr; character.ExCritRate -= current;
} }
RealDynamicsValues["excr"] = excr; RealDynamicsValues["excr"] = excr;
Descriptions.Add($"{(excr >= 0 ? "" : "")}角色 {Math.Abs(excr) * 100:0.##}% 暴击率。"); Descriptions.Add($"{(excr >= 0 ? "" : "")}角色 {Math.Abs(excr) * 100:0.##}% 暴击率。");
@ -279,9 +322,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExCritDMG += excrd; character.ExCritDMG += excrd;
} }
else else if (RealDynamicsValues.TryGetValue("excrd", out double current))
{ {
character.ExCritDMG -= excrd; character.ExCritDMG -= current;
} }
RealDynamicsValues["excrd"] = excrd; RealDynamicsValues["excrd"] = excrd;
Descriptions.Add($"{(excrd >= 0 ? "" : "")}角色 {Math.Abs(excrd) * 100:0.##}% 暴击伤害。"); Descriptions.Add($"{(excrd >= 0 ? "" : "")}角色 {Math.Abs(excrd) * 100:0.##}% 暴击伤害。");
@ -294,9 +337,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExEvadeRate += exer; character.ExEvadeRate += exer;
} }
else else if (RealDynamicsValues.TryGetValue("exer", out double current))
{ {
character.ExEvadeRate -= exer; character.ExEvadeRate -= current;
} }
RealDynamicsValues["exer"] = exer; RealDynamicsValues["exer"] = exer;
Descriptions.Add($"{(exer >= 0 ? "" : "")}角色 {Math.Abs(exer) * 100:0.##}% 闪避率。"); Descriptions.Add($"{(exer >= 0 ? "" : "")}角色 {Math.Abs(exer) * 100:0.##}% 闪避率。");
@ -309,9 +352,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.PhysicalPenetration += exppt; character.PhysicalPenetration += exppt;
} }
else else if (RealDynamicsValues.TryGetValue("exppt", out double current))
{ {
character.PhysicalPenetration -= exppt; character.PhysicalPenetration -= current;
} }
RealDynamicsValues["exppt"] = exppt; RealDynamicsValues["exppt"] = exppt;
Descriptions.Add($"{(exppt >= 0 ? "" : "")}角色 {Math.Abs(exppt) * 100:0.##}% 物理穿透。"); Descriptions.Add($"{(exppt >= 0 ? "" : "")}角色 {Math.Abs(exppt) * 100:0.##}% 物理穿透。");
@ -324,9 +367,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.MagicalPenetration += exmpt; character.MagicalPenetration += exmpt;
} }
else else if (RealDynamicsValues.TryGetValue("exmpt", out double current))
{ {
character.MagicalPenetration -= exmpt; character.MagicalPenetration -= current;
} }
RealDynamicsValues["exmpt"] = exmpt; RealDynamicsValues["exmpt"] = exmpt;
Descriptions.Add($"{(exmpt >= 0 ? "" : "")}角色 {Math.Abs(exmpt) * 100:0.##}% 魔法穿透。"); Descriptions.Add($"{(exmpt >= 0 ? "" : "")}角色 {Math.Abs(exmpt) * 100:0.##}% 魔法穿透。");
@ -339,9 +382,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExPDR += expdr; character.ExPDR += expdr;
} }
else else if (RealDynamicsValues.TryGetValue("expdr", out double current))
{ {
character.ExPDR -= expdr; character.ExPDR -= current;
} }
RealDynamicsValues["expdr"] = expdr; RealDynamicsValues["expdr"] = expdr;
Descriptions.Add($"{(expdr >= 0 ? "" : "")}角色 {Math.Abs(expdr) * 100:0.##}% 物理伤害减免。"); Descriptions.Add($"{(expdr >= 0 ? "" : "")}角色 {Math.Abs(expdr) * 100:0.##}% 物理伤害减免。");
@ -354,9 +397,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExHR += exhr; character.ExHR += exhr;
} }
else else if (RealDynamicsValues.TryGetValue("exhr", out double current))
{ {
character.ExHR -= exhr; character.ExHR -= current;
} }
RealDynamicsValues["exhr"] = exhr; RealDynamicsValues["exhr"] = exhr;
Descriptions.Add($"{(exhr >= 0 ? "" : "")}角色 {Math.Abs(exhr):0.##} 点生命回复。"); Descriptions.Add($"{(exhr >= 0 ? "" : "")}角色 {Math.Abs(exhr):0.##} 点生命回复。");
@ -369,9 +412,9 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
{ {
character.ExMR += exmr; character.ExMR += exmr;
} }
else else if (RealDynamicsValues.TryGetValue("exmr", out double current))
{ {
character.ExMR -= exmr; character.ExMR -= current;
} }
RealDynamicsValues["exmr"] = exmr; RealDynamicsValues["exmr"] = exmr;
Descriptions.Add($"{(exmr >= 0 ? "" : "")}角色 {Math.Abs(exmr):0.##} 点魔法回复。"); Descriptions.Add($"{(exmr >= 0 ? "" : "")}角色 {Math.Abs(exmr):0.##} 点魔法回复。");
@ -496,6 +539,47 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
Descriptions.Add($"{(real >= 0 ? "" : "")}角色 {Math.Abs(exmp2) * 100:0.##}% [ {Math.Abs(real):0.##} ] 点最大魔法值。"); Descriptions.Add($"{(real >= 0 ? "" : "")}角色 {Math.Abs(exmp2) * 100:0.##}% [ {Math.Abs(real):0.##} ] 点最大魔法值。");
} }
break; break;
case "mdftype":
if (int.TryParse(value, out int mdftype))
{
double mdfValue = 0;
MagicType magicType = MagicType.None;
if (!remove)
{
magicType = (MagicType)mdftype;
string mdfvalueKey = Values.Keys.FirstOrDefault(s => s.Equals("mdfvalue", StringComparison.CurrentCultureIgnoreCase)) ?? "";
if (mdfvalueKey.Length > 0 && double.TryParse(Values[mdfvalueKey].ToString(), out mdfValue))
{
if (magicType == MagicType.None)
{
character.MDF.AddAllValue(mdfValue);
}
else
{
character.MDF[magicType] += mdfValue;
}
}
}
else if (RealDynamicsValues.TryGetValue("mdftype", out double currentType))
{
magicType = (MagicType)(int)currentType;
if (RealDynamicsValues.TryGetValue("mdfvalue", out mdfValue))
{
if (magicType == MagicType.None)
{
character.MDF.AddAllValue(-mdfValue);
}
else
{
character.MDF[magicType] -= mdfValue;
}
}
}
RealDynamicsValues["mdftype"] = mdftype;
RealDynamicsValues["mdfvalue"] = mdfValue;
Descriptions.Add($"{(mdfValue >= 0 ? "" : "")}角色 {Math.Abs(mdfValue) * 100:0.##}% {CharacterSet.GetMagicResistanceName(magicType)}。");
}
break;
} }
} }
} }

View File

@ -26,28 +26,14 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
switch () switch ()
{ {
case MagicType.Starmark: case MagicType.Starmark:
character.MDF.Starmark += ;
break;
case MagicType.PurityNatural: case MagicType.PurityNatural:
character.MDF.PurityNatural += ;
break;
case MagicType.PurityContemporary: case MagicType.PurityContemporary:
character.MDF.PurityContemporary += ;
break;
case MagicType.Bright: case MagicType.Bright:
character.MDF.Bright += ;
break;
case MagicType.Shadow: case MagicType.Shadow:
character.MDF.Shadow += ;
break;
case MagicType.Element: case MagicType.Element:
character.MDF.Element += ;
break;
case MagicType.Aster: case MagicType.Aster:
character.MDF.Aster += ;
break;
case MagicType.SpatioTemporal: case MagicType.SpatioTemporal:
character.MDF.SpatioTemporal += ; character.MDF[] += ;
break; break;
case MagicType.None: case MagicType.None:
default: default:
@ -61,28 +47,14 @@ namespace Oshima.FunGame.OshimaModules.Effects.OpenEffects
switch () switch ()
{ {
case MagicType.Starmark: case MagicType.Starmark:
character.MDF.Starmark -= ;
break;
case MagicType.PurityNatural: case MagicType.PurityNatural:
character.MDF.PurityNatural -= ;
break;
case MagicType.PurityContemporary: case MagicType.PurityContemporary:
character.MDF.PurityContemporary -= ;
break;
case MagicType.Bright: case MagicType.Bright:
character.MDF.Bright -= ;
break;
case MagicType.Shadow: case MagicType.Shadow:
character.MDF.Shadow -= ;
break;
case MagicType.Element: case MagicType.Element:
character.MDF.Element -= ;
break;
case MagicType.Aster: case MagicType.Aster:
character.MDF.Aster -= ;
break;
case MagicType.SpatioTemporal: case MagicType.SpatioTemporal:
character.MDF.SpatioTemporal -= ; character.MDF[] -= ;
break; break;
case MagicType.None: case MagicType.None:
default: default: