55 lines
1.4 KiB
C#
55 lines
1.4 KiB
C#
namespace PkmnLib.Plugin.Gen7.Scripts.Side;
|
|
|
|
[Script(ScriptCategory.Side, "spikes")]
|
|
public class SpikesEffect : Script, IScriptOnSwitchIn, IScriptStack, IAIInfoScriptExpectedEntryDamage
|
|
{
|
|
private int _layers = 1;
|
|
|
|
/// <inheritdoc />
|
|
public void Stack()
|
|
{
|
|
if (_layers < 3)
|
|
_layers++;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public void OnSwitchIn(IPokemon pokemon, byte position)
|
|
{
|
|
if (pokemon.IsFloating)
|
|
return;
|
|
|
|
var damage = CalculateDamage(pokemon);
|
|
|
|
EventBatchId eventBatch = new();
|
|
pokemon.Damage(damage, DamageSource.Misc, eventBatch);
|
|
pokemon.BattleData?.Battle.EventHook.Invoke(new DialogEvent("spikes_damage", new Dictionary<string, object>
|
|
{
|
|
{ "pokemon", pokemon },
|
|
})
|
|
{
|
|
BatchId = eventBatch,
|
|
});
|
|
}
|
|
|
|
private uint CalculateDamage(IPokemon pokemon)
|
|
{
|
|
var modifier = _layers switch
|
|
{
|
|
1 => 1 / 16f,
|
|
2 => 3 / 16f,
|
|
3 => 1 / 4f,
|
|
_ => throw new ArgumentOutOfRangeException(),
|
|
};
|
|
var damage = (uint)(pokemon.MaxHealth * modifier);
|
|
return damage;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public void ExpectedEntryDamage(IPokemon pokemon, ref uint damage)
|
|
{
|
|
if (pokemon.IsFloating)
|
|
return;
|
|
|
|
damage += CalculateDamage(pokemon);
|
|
}
|
|
} |