This commit is contained in:
@@ -6,30 +6,30 @@ namespace PkmnLib.Plugin.Gen7.Libraries.Battling;
|
||||
public class Gen7DamageCalculator(Gen7PluginConfiguration configuration) : IDamageCalculator
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public uint GetDamage(IExecutingMove executingMove, IPokemon target, byte hitNumber, IHitData hitData)
|
||||
public uint GetDamage(IExecutingMove? executingMove, MoveCategory category, IPokemon user, IPokemon target,
|
||||
int targetCount, byte hitNumber, IHitData hitData)
|
||||
{
|
||||
var category = executingMove.UseMove.Category;
|
||||
if (category == MoveCategory.Status)
|
||||
return 0;
|
||||
if (hitData.Effectiveness == 0)
|
||||
return 0;
|
||||
|
||||
var levelModifier = 2.0f * executingMove.User.Level / 5.0f + 2.0f;
|
||||
var levelModifier = 2.0f * user.Level / 5.0f + 2.0f;
|
||||
var basePower = (float)hitData.BasePower;
|
||||
var statModifier = GetStatModifier(executingMove, target, hitNumber, hitData);
|
||||
var damageModifier = GetDamageModifier(executingMove, target, hitNumber);
|
||||
var statModifier = GetStatModifier(executingMove, category, user, target, hitNumber, hitData);
|
||||
var damageModifier = executingMove == null ? 1.0f : GetDamageModifier(executingMove, target, hitNumber);
|
||||
|
||||
var floatDamage = MathF.Floor(levelModifier * basePower);
|
||||
floatDamage = MathF.Floor(floatDamage * statModifier);
|
||||
floatDamage = MathF.Floor(floatDamage / 50.0f) + 2.0f;
|
||||
floatDamage = MathF.Floor(floatDamage * damageModifier);
|
||||
if (executingMove.TargetCount > 1)
|
||||
if (targetCount > 1)
|
||||
floatDamage = MathF.Floor(floatDamage * 0.75f);
|
||||
|
||||
if (hitData.IsCritical)
|
||||
{
|
||||
var critModifier = 1.5f;
|
||||
executingMove.RunScriptHook(script =>
|
||||
executingMove?.RunScriptHook(script =>
|
||||
script.ChangeCriticalModifier(executingMove, target, hitNumber, ref critModifier));
|
||||
floatDamage = MathF.Floor(floatDamage * critModifier);
|
||||
}
|
||||
@@ -46,12 +46,12 @@ public class Gen7DamageCalculator(Gen7PluginConfiguration configuration) : IDama
|
||||
|
||||
var stabModifier = 1.0f;
|
||||
var isStab = false;
|
||||
if (hitData.Type != null && executingMove.User.Types.Contains(hitData.Type.Value))
|
||||
if (hitData.Type != null && user.Types.Contains(hitData.Type.Value))
|
||||
{
|
||||
stabModifier = 1.5f;
|
||||
isStab = true;
|
||||
}
|
||||
executingMove.RunScriptHook(script =>
|
||||
executingMove?.RunScriptHook(script =>
|
||||
script.ChangeStabModifier(executingMove, target, hitNumber, isStab, ref stabModifier));
|
||||
floatDamage = MathF.Floor(floatDamage * stabModifier);
|
||||
|
||||
@@ -62,8 +62,14 @@ public class Gen7DamageCalculator(Gen7PluginConfiguration configuration) : IDama
|
||||
< 1 => 1,
|
||||
_ => (uint)floatDamage,
|
||||
};
|
||||
executingMove.RunScriptHook(script => script.ChangeMoveDamage(executingMove, target, hitNumber, ref damage));
|
||||
target.RunScriptHook(script => script.ChangeIncomingMoveDamage(executingMove, target, hitNumber, ref damage));
|
||||
|
||||
if (executingMove is not null)
|
||||
{
|
||||
executingMove.RunScriptHook(script =>
|
||||
script.ChangeMoveDamage(executingMove, target, hitNumber, ref damage));
|
||||
target.RunScriptHook(script =>
|
||||
script.ChangeIncomingMoveDamage(executingMove, target, hitNumber, ref damage));
|
||||
}
|
||||
|
||||
return damage;
|
||||
}
|
||||
@@ -97,10 +103,9 @@ public class Gen7DamageCalculator(Gen7PluginConfiguration configuration) : IDama
|
||||
};
|
||||
}
|
||||
|
||||
private static float GetStatModifier(IExecutingMove executingMove, IPokemon target, byte hitNumber,
|
||||
IHitData hitData)
|
||||
private static float GetStatModifier(IExecutingMove? executingMove, MoveCategory category, IPokemon user,
|
||||
IPokemon target, byte hitNumber, IHitData hitData)
|
||||
{
|
||||
var category = executingMove.UseMove.Category;
|
||||
if (category == MoveCategory.Status)
|
||||
return 1;
|
||||
|
||||
@@ -114,19 +119,19 @@ public class Gen7DamageCalculator(Gen7PluginConfiguration configuration) : IDama
|
||||
// move is critical, and the target has a defensive stat boost of > 0, but a script is
|
||||
// allowed to change this.
|
||||
var bypassDefense = hitData.IsCritical && target.StatBoost.GetStatistic(defensive) > 0;
|
||||
executingMove.RunScriptHook(script =>
|
||||
executingMove?.RunScriptHook(script =>
|
||||
script.BypassDefensiveStatBoosts(executingMove, target, hitNumber, ref bypassDefense));
|
||||
|
||||
// Check if we can bypass the offensive stat boost on the user. We default to this if the
|
||||
// move is critical, and the user has an offensive stat boost of < 0, but a script is
|
||||
// allowed to change this.
|
||||
var bypassOffense = hitData.IsCritical && executingMove.User.StatBoost.GetStatistic(offensive) < 0;
|
||||
executingMove.RunScriptHook(script =>
|
||||
var bypassOffense = hitData.IsCritical && user.StatBoost.GetStatistic(offensive) < 0;
|
||||
executingMove?.RunScriptHook(script =>
|
||||
script.BypassOffensiveStatBoosts(executingMove, target, hitNumber, ref bypassOffense));
|
||||
|
||||
var userStats = executingMove.User.BoostedStats;
|
||||
var userStats = user.BoostedStats;
|
||||
if (bypassOffense)
|
||||
userStats = executingMove.User.FlatStats;
|
||||
userStats = user.FlatStats;
|
||||
var offensiveStat = userStats.GetStatistic(offensive);
|
||||
|
||||
var targetStats = target.BoostedStats;
|
||||
@@ -135,17 +140,20 @@ public class Gen7DamageCalculator(Gen7PluginConfiguration configuration) : IDama
|
||||
var defensiveStat = targetStats.GetStatistic(defensive);
|
||||
var origOffensiveStat = offensiveStat;
|
||||
|
||||
executingMove.RunScriptHook(script => script.ChangeOffensiveStatValue(executingMove, target, hitNumber,
|
||||
defensiveStat, targetStats, offensive, ref offensiveStat));
|
||||
executingMove.RunScriptHook(script => script.ChangeDefensiveStatValue(executingMove, target, hitNumber,
|
||||
origOffensiveStat, targetStats, defensive, ref defensiveStat));
|
||||
target.RunScriptHook(script => script.ChangeIncomingMoveOffensiveStatValue(executingMove, target, hitNumber,
|
||||
defensiveStat, targetStats, offensive, ref offensiveStat));
|
||||
target.RunScriptHook(script => script.ChangeIncomingMoveDefensiveStatValue(executingMove, target, hitNumber,
|
||||
origOffensiveStat, targetStats, defensive, ref defensiveStat));
|
||||
if (executingMove != null)
|
||||
{
|
||||
executingMove.RunScriptHook(script => script.ChangeOffensiveStatValue(executingMove, target, hitNumber,
|
||||
defensiveStat, targetStats, offensive, ref offensiveStat));
|
||||
executingMove.RunScriptHook(script => script.ChangeDefensiveStatValue(executingMove, target, hitNumber,
|
||||
origOffensiveStat, targetStats, defensive, ref defensiveStat));
|
||||
target.RunScriptHook(script => script.ChangeIncomingMoveOffensiveStatValue(executingMove, target, hitNumber,
|
||||
defensiveStat, targetStats, offensive, ref offensiveStat));
|
||||
target.RunScriptHook(script => script.ChangeIncomingMoveDefensiveStatValue(executingMove, target, hitNumber,
|
||||
origOffensiveStat, targetStats, defensive, ref defensiveStat));
|
||||
}
|
||||
|
||||
var modifier = (float)offensiveStat / defensiveStat;
|
||||
executingMove.RunScriptHook(script =>
|
||||
executingMove?.RunScriptHook(script =>
|
||||
script.ChangeDamageStatModifier(executingMove, target, hitNumber, ref modifier));
|
||||
|
||||
return modifier;
|
||||
|
||||
Reference in New Issue
Block a user