diff --git a/Abilities.json b/Abilities.json index dd79e99..29171f2 100644 --- a/Abilities.json +++ b/Abilities.json @@ -65,7 +65,9 @@ "effect": "DoubleSpeedInWeather", "parameters": ["HarshSunlight"] }, - "clear_body": {}, + "clear_body": { + "effect": "PreventStatLowering" + }, "cloud_nine": {}, "color_change": {}, "comatose": {}, diff --git a/Scripts/Abilities/AngerPoint.as b/Scripts/Abilities/AngerPoint.as index 59d2914..543845f 100644 --- a/Scripts/Abilities/AngerPoint.as +++ b/Scripts/Abilities/AngerPoint.as @@ -2,7 +2,7 @@ namespace Gen7 { class AngerPoint : PkmnScript { void OnIncomingHit(ExecutingMove@ move, Pokemon@ target, uint8 hit) override { if (move.GetHitData(target, hit).IsCritical){ - target.ChangeStatBoost(Statistic::Attack, 12); + target.ChangeStatBoost(Statistic::Attack, 12, true); } } } diff --git a/Scripts/Abilities/BeastBoost.as b/Scripts/Abilities/BeastBoost.as index e58b69b..7648732 100644 --- a/Scripts/Abilities/BeastBoost.as +++ b/Scripts/Abilities/BeastBoost.as @@ -29,7 +29,7 @@ namespace Gen7 { if (user.GetFlatStat(Statistic::Speed) > user.GetFlatStat(Statistic::HP)) { increaseStat = Statistic::Speed; } - user.ChangeStatBoost(increaseStat, 1); + user.ChangeStatBoost(increaseStat, 1, true); } } } \ No newline at end of file diff --git a/Scripts/Abilities/Berserk.as b/Scripts/Abilities/Berserk.as index 973453f..d0dfc10 100644 --- a/Scripts/Abilities/Berserk.as +++ b/Scripts/Abilities/Berserk.as @@ -3,7 +3,7 @@ namespace Gen7 { class Berserk : PkmnScript { void OnDamage(Pokemon@ pokemon, DamageSource, uint old, uint new) override { if (float(old) / pokemon.MaxHealth >= 0.5f && float(new) / pokemon.MaxHealth < 0.5f) { - pokemon.ChangeStatBoost(Statistic::SpecialDefense, 1); + pokemon.ChangeStatBoost(Statistic::SpecialDefense, 1, true); } } } diff --git a/Scripts/Abilities/PreventDefLowering.as b/Scripts/Abilities/PreventDefLowering.as index f532b87..cebfb81 100644 --- a/Scripts/Abilities/PreventDefLowering.as +++ b/Scripts/Abilities/PreventDefLowering.as @@ -1,8 +1,8 @@ namespace Gen7 { [Ability effect=PreventDefLowering] class PreventDefLowering : PkmnScript { - void PreventStatBoostChange(Pokemon@, Statistic stat, int8 amount, bool &inout prevent) override { - if (stat == Statistic::Defense && amount < 0) { + void PreventStatBoostChange(Pokemon@, Statistic stat, int8 amount, bool selfInflicted, bool &inout prevent) override { + if (stat == Statistic::Defense && amount < 0 && !selfInflicted) { prevent = true; } } diff --git a/Scripts/Abilities/PreventStatLowering.as b/Scripts/Abilities/PreventStatLowering.as new file mode 100644 index 0000000..ff81e3c --- /dev/null +++ b/Scripts/Abilities/PreventStatLowering.as @@ -0,0 +1,10 @@ +namespace Gen7 { + [Ability effect=PreventStatLowering] + class PreventStatLowering : PkmnScript { + void PreventStatBoostChange(Pokemon@, Statistic stat, int8 amount, bool selfInflicted, bool &inout prevent) override { + if (amount < 0 && !selfInflicted) { + prevent = true; + } + } + } +} \ No newline at end of file diff --git a/Scripts/Interfaces/PkmnScript.as b/Scripts/Interfaces/PkmnScript.as index 9ebb692..204b566 100644 --- a/Scripts/Interfaces/PkmnScript.as +++ b/Scripts/Interfaces/PkmnScript.as @@ -1,7 +1,8 @@ shared abstract class PkmnScript { ref@ __owner; - ref@& GetOwner(){ return __owner; }; + const ref@& GetOwner(){ return __owner; }; + void SetOwner(ref@){}; void OnInitialize(const BattleLibrary@, const narray@){}; void Stack(){}; void OnRemove(){}; @@ -20,7 +21,7 @@ shared abstract class PkmnScript { void BlockCritical(ExecutingMove@, Pokemon@, uint8, bool &inout){}; void OnIncomingHit(ExecutingMove@, Pokemon@, uint8){}; void OnFaintingOpponent(ExecutingMove@, Pokemon@, uint8){}; - void PreventStatBoostChange(Pokemon@, Statistic, int8, bool &inout){}; + void PreventStatBoostChange(Pokemon@, Statistic, int8, bool, bool &inout){}; void ModifyStatBoostChange(Pokemon@, Statistic, int8 &inout){}; void PreventSecondaryEffects(ExecutingMove@, Pokemon@, uint8, bool &inout){}; void OnSecondaryEffect(ExecutingMove@, Pokemon@, uint8){}; diff --git a/Scripts/Interfaces/Pokemon.astypedef b/Scripts/Interfaces/Pokemon.astypedef index abc3778..2a390d3 100644 --- a/Scripts/Interfaces/Pokemon.astypedef +++ b/Scripts/Interfaces/Pokemon.astypedef @@ -30,7 +30,7 @@ type Pokemon { void Damage(uint type, DamageSource source); void Heal(uint type); void OverrideActiveAbility(const string &in ability); - void ChangeStatBoost(Statistic stat, int8 amount); + void ChangeStatBoost(Statistic stat, int8 amount, bool selfInflicted); uint GetFlatStat(Statistic stat) const; uint GetBoostedStat(Statistic stat) const; uint GetBaseStat(Statistic stat) const; diff --git a/Scripts/Moves/Acupressure.as b/Scripts/Moves/Acupressure.as index a2b4e14..0e83674 100644 --- a/Scripts/Moves/Acupressure.as +++ b/Scripts/Moves/Acupressure.as @@ -7,7 +7,7 @@ namespace Gen7{ return; } auto randStat = Statistic(target.Battle.Random.Get(1, 6)); - target.ChangeStatBoost(randStat, 2); + target.ChangeStatBoost(randStat, 2, false); }; } } diff --git a/Scripts/Moves/Automize.as b/Scripts/Moves/Automize.as index 1b9a2ee..9c1a94c 100644 --- a/Scripts/Moves/Automize.as +++ b/Scripts/Moves/Automize.as @@ -3,7 +3,7 @@ namespace Gen7 { void OnSecondaryEffect(ExecutingMove@ move, Pokemon@ target, uint8 hit) override { auto originalSpeed = move.User.GetBoostedStat(Statistic::Speed); auto originalWeight = move.User.Weight; - move.User.ChangeStatBoost(Statistic::Speed, 2); + move.User.ChangeStatBoost(Statistic::Speed, 2, true); if (move.User.GetBoostedStat(Statistic::Speed) != originalSpeed){ // This setter function protects against going below 0.1 move.User.Weight -= 100; diff --git a/Scripts/Moves/ChangeAllTargetStats.as b/Scripts/Moves/ChangeAllTargetStats.as index 76d4c30..48b9852 100644 --- a/Scripts/Moves/ChangeAllTargetStats.as +++ b/Scripts/Moves/ChangeAllTargetStats.as @@ -8,11 +8,11 @@ namespace Gen7 { } void OnSecondaryEffect(ExecutingMove@ attack, Pokemon@ target, uint8 hit) override{ - target.ChangeStatBoost(Statistic::Attack, _amount); - target.ChangeStatBoost(Statistic::Defense, _amount); - target.ChangeStatBoost(Statistic::SpecialAttack, _amount); - target.ChangeStatBoost(Statistic::SpecialDefense, _amount); - target.ChangeStatBoost(Statistic::Speed, _amount); + target.ChangeStatBoost(Statistic::Attack, _amount, attack.User is target); + target.ChangeStatBoost(Statistic::Defense, _amount, attack.User is target); + target.ChangeStatBoost(Statistic::SpecialAttack, _amount, attack.User is target); + target.ChangeStatBoost(Statistic::SpecialDefense, _amount, attack.User is target); + target.ChangeStatBoost(Statistic::Speed, _amount, attack.User is target); } } } diff --git a/Scripts/Moves/ChangeTargetAtt.as b/Scripts/Moves/ChangeTargetAtt.as index fc2f810..ad3879d 100644 --- a/Scripts/Moves/ChangeTargetAtt.as +++ b/Scripts/Moves/ChangeTargetAtt.as @@ -8,7 +8,7 @@ namespace Gen7 { } void OnSecondaryEffect(ExecutingMove@ attack, Pokemon@ target, uint8 hit) override{ - target.ChangeStatBoost(Statistic::Attack, _amount); + target.ChangeStatBoost(Statistic::Attack, _amount, attack.User is target); } } } diff --git a/Scripts/Moves/ChangeTargetDef.as b/Scripts/Moves/ChangeTargetDef.as index 37cb6ca..5875407 100644 --- a/Scripts/Moves/ChangeTargetDef.as +++ b/Scripts/Moves/ChangeTargetDef.as @@ -8,7 +8,7 @@ namespace Gen7 { } void OnSecondaryEffect(ExecutingMove@ attack, Pokemon@ target, uint8 hit) override{ - target.ChangeStatBoost(Statistic::Defense, _amount); + target.ChangeStatBoost(Statistic::Defense, _amount, attack.User is target); } } } diff --git a/Scripts/Moves/ChangeTargetSpDef.as b/Scripts/Moves/ChangeTargetSpDef.as index 0de45bb..c538a4d 100644 --- a/Scripts/Moves/ChangeTargetSpDef.as +++ b/Scripts/Moves/ChangeTargetSpDef.as @@ -8,7 +8,7 @@ namespace Gen7 { } void OnSecondaryEffect(ExecutingMove@ attack, Pokemon@ target, uint8 hit) override{ - target.ChangeStatBoost(Statistic::SpecialDefense, _amount); + target.ChangeStatBoost(Statistic::SpecialDefense, _amount, attack.User is target); } } } diff --git a/Scripts/Moves/ChangeTargetSpeed.as b/Scripts/Moves/ChangeTargetSpeed.as index 2c7de4f..63ee601 100644 --- a/Scripts/Moves/ChangeTargetSpeed.as +++ b/Scripts/Moves/ChangeTargetSpeed.as @@ -8,7 +8,7 @@ namespace Gen7 { } void OnSecondaryEffect(ExecutingMove@ attack, Pokemon@ target, uint8 hit) override{ - target.ChangeStatBoost(Statistic::Speed, _amount); + target.ChangeStatBoost(Statistic::Speed, _amount, attack.User is target); } } }