Adds a bunch of abilities
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2021-11-19 18:12:10 +01:00
parent 67762af0e7
commit 6302ca9809
14 changed files with 378 additions and 3 deletions

View File

@@ -0,0 +1,18 @@
namespace Gen7 {
[Ability effect=Aftermath]
class Aftermath : PkmnScript {
void OnFaint(Pokemon@ mon, DamageSource source) override {
// If the mon fainted due to something that was not a move, ignore
if (source != DamageSource::AttackDamage){
return;
}
// Last used attack on the target should always be the move that caused the faint if the source is AttackDamage
auto lastMoveEvent = mon.Battle.History.GetLastUsedAttackOnTarget(mon, 1);
// Check if the move is a contact move
if (lastMoveEvent.Move.UseMove.HasFlag("contact")){
// Damage by 1/4th of the mon's max HP.
lastMoveEvent.Move.User.Damage(lastMoveEvent.Move.User.MaxHealth / 4, DamageSource::Misc);
}
}
}
}

View File

@@ -0,0 +1,15 @@
namespace Gen7 {
[Ability effect=Analytic]
class Analytic : PkmnScript {
void OverrideBasePower(ExecutingMove@ move, Pokemon@, uint8, uint8 &inout damage) override {
// If the turnqueue of the battle is empty now, we don't have any choices to execute after this.
// This means this is the last move in the turn.
if (!move.User.Battle.TurnQueue.HasNext()){
float expectedDamage = damage;
expectedDamage *= 1.3f;
if (expectedDamage > 255) expectedDamage = 255;
damage = uint8(expectedDamage);
}
}
}
}

View File

@@ -0,0 +1,9 @@
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);
}
}
}
}

View File

@@ -0,0 +1,31 @@
namespace Gen7 {
[Ability effect=ChangeMoveType]
class ChangeMoveType : PkmnScript {
string _fromType;
string _toType;
bool _changedLastAttack = false;
void OnInitialize(const narray<EffectParameter@>@ parameters) override {
_fromType = parameters[0].AsString();
_toType = parameters[1].AsString();
}
void ChangeAttackType(ExecutingMove@ move, Pokemon@ target, uint8 hit, uint8 &inout t) override {
auto lib = move.User.Battle.Library.StaticLibrary.TypeLibrary;
auto fromTypeId = lib.GetTypeId(_fromType);
if (fromTypeId == t){
t = lib.GetTypeId(_toType);
_changedLastAttack = true;
}
else{
_changedLastAttack = false;
}
}
void ModifyDamageModifier(ExecutingMove@, Pokemon@, uint8, float &inout damageMod) override {
if (_changedLastAttack){
damageMod *= 1.2f;
}
}
}
}

View File

@@ -0,0 +1,10 @@
namespace Gen7 {
[Ability effect=IncreasedStab]
class IncreasedStab : PkmnScript {
void OverrideSTABModifier(ExecutingMove@ move, Pokemon@ target, uint8 hit, float &inout stabMod) override {
if (move.User.HasType(move.GetHit(target, hit).Type)){
stabMod = 2;
}
};
}
}

View File

@@ -0,0 +1,15 @@
namespace Gen7 {
class SuppressWeatherAbility : PkmnScript {
void OnSwitchIn(Pokemon@ pokemon) override {
pokemon.Battle.SuppressWeather();
pokemon.Battle.AddVolatile("SuppressWeather");
};
void OnRemove() override {
auto battle = cast<Pokemon@>(GetOwner()).Battle;
battle.UnsuppressWeather();
auto script = cast<SuppressWeather>(battle.GetVolatile("SuppressWeather"));
script.Unstack();
}
}
}

View File

@@ -0,0 +1,21 @@
namespace Gen7 {
[Battle effect=SuppressWeather]
class SuppressWeather : PkmnScript {
int num = 1;
void Stack() override {
num++;
}
void Unstack() {
num--;
if (num == 0){
cast<Battle@>(GetOwner()).RemoveVolatile("SuppressWeather");
}
}
void BlockWeather(Battle@, bool &inout block){
block = true;
};
}
}

View File

@@ -12,9 +12,11 @@ type Battle {
ref@ AddVolatile(const constString &in name);
ref@ GetVolatile(const constString &in name);
void RemoveVolatile(const constString &in name) const;
void SetWeather(const constString &in name) const;
bool SetWeather(const constString &in name) const;
void ClearWeather(const constString &in name) const;
const constString& GetWeatherName() const;
void SuppressWeather() const;
void UnsuppressWeather() const;
BattleSide@ GetBattleSide(uint8 index);
BattleParty@ GetParty(uint8 index);
BattleParty@ FindPartyForPokemon(Pokemon@ pokemon);

View File

@@ -1,5 +1,6 @@
type BattleHistory {
const HistoryElement@ TopElement { get const; };
const AttackUseHistory@ GetLastUsedAttack(uint maxTurns = 0) const;
const AttackUseHistory@ GetLastUsedAttackOnTarget(Pokemon@ target, uint maxTurns = 0) const;
const DamageHistory@ GetLastDamageOnTarget(Pokemon@ target, uint maxTurns = 0) const;
}

View File

@@ -1,4 +1,5 @@
type ChoiceQueue {
bool MovePokemonChoiceNext(Pokemon@ target);
const BaseTurnChoice@ Peek() const;
bool HasNext() const;
}

View File

@@ -1,4 +1,5 @@
enum DamageSource {
AttackDamage = 0,
Struggle = 1,
Misc = 1,
Struggle = 2,
}

View File

@@ -17,6 +17,7 @@ shared abstract class PkmnScript {
void OnAttackMiss(ExecutingMove@, Pokemon@){};
void ChangeAttackType(ExecutingMove@, Pokemon@, uint8, uint8 &inout){};
void ChangeEffectiveness(ExecutingMove@, Pokemon@, uint8, float &inout){};
void OnIncomingHit(ExecutingMove@, Pokemon@, uint8){};
void PreventSecondaryEffects(ExecutingMove@, Pokemon@, uint8, bool &inout){};
void OnSecondaryEffect(ExecutingMove@, Pokemon@, uint8){};
void OnAfterHits(ExecutingMove@, Pokemon@){};
@@ -38,9 +39,12 @@ shared abstract class PkmnScript {
void PreventOpponentRunAway(FleeTurnChoice@, bool &inout){};
void PreventOpponentSwitch(SwitchTurnChoice@, bool &inout){};
void OnEndTurn(){};
void OnFaint(Pokemon@, DamageSource){};
void ModifyCriticalStage(ExecutingMove@, Pokemon@, uint8, uint8 &inout){};
void OverrideCriticalModifier(ExecutingMove@, Pokemon@, uint8, float &inout){};
void OverrideSTABModifier(ExecutingMove@, Pokemon@, uint8, float &inout){};
void ModifyExperienceGain(Pokemon@, Pokemon@, uint &inout){};
void DoesShareExperience(Pokemon@, Pokemon@, bool &inout){};
void BlockWeather(Battle@, bool &inout){};
void OnSwitchIn(Pokemon@){};
}

View File

@@ -8,7 +8,6 @@ type Pokemon {
bool Shiny { get const; };
const Item@ HeldItem { get const; };
uint CurrentHealth { get const; };
const constString& ActiveAbility { get const; };
bool IsFainted { get const; };
uint MaxHealth { get const; };
const Species@ DisplaySpecies { get const; };
@@ -19,6 +18,7 @@ type Pokemon {
const narray<LearnedMove@>@ Moves { get const; };
float Weight { get const; set; };
float Height { get const; set; };
const constString& ActiveAbility { get const; };
bool HasHeldItem(const constString &in name) const;
void SetHeldItem(const constString &in name);
void SetHeldItem(const Item@ item);