diff --git a/Scripts/Interfaces/Battle.as b/Scripts/Interfaces/Battle.as index 394436c..7383ad9 100644 --- a/Scripts/Interfaces/Battle.as +++ b/Scripts/Interfaces/Battle.as @@ -2,6 +2,7 @@ shared interface Battle { const BattleLibrary@ Library { get const; } bool CanUse(BaseTurnChoice@ choice); bool CanFlee { get const; } + uint CurrentTurn { get const; } BattleRandom@ Random { get const; } ChoiceQueue@ TurnQueue { get const; } ref AddVolatile(const constString &in name); diff --git a/Scripts/Interfaces/BattleSide.as b/Scripts/Interfaces/BattleSide.as index e43dcbb..f7e30e1 100644 --- a/Scripts/Interfaces/BattleSide.as +++ b/Scripts/Interfaces/BattleSide.as @@ -2,4 +2,5 @@ shared interface BattleSide { bool SwapPositions(uint8 a, uint8 b); uint8 SideIndex { get const; } uint8 GetPokemonIndex(const Pokemon@ pokemon) const; + Pokemon@ GetPokemon(uint8 index) const; } diff --git a/Scripts/Interfaces/EvolutionData.as b/Scripts/Interfaces/EvolutionData.as new file mode 100644 index 0000000..93f7f74 --- /dev/null +++ b/Scripts/Interfaces/EvolutionData.as @@ -0,0 +1,6 @@ +shared interface EvolutionData { + const Species& NewSpecies { get const; } + EvolutionMethod Method { get const; } + uint64 DataCount { get const; } + EffectParameter@ GetData(uint64 index) const; +} diff --git a/Scripts/Interfaces/EvolutionMethod.as b/Scripts/Interfaces/EvolutionMethod.as new file mode 100644 index 0000000..9b71c13 --- /dev/null +++ b/Scripts/Interfaces/EvolutionMethod.as @@ -0,0 +1,17 @@ +shared enum EvolutionMethod { + Level = 0, + HighFriendship = 1, + HighFriendshipTime = 2, + KnownMove = 3, + LocationBased = 4, + TimeBased = 5, + HoldsItem = 6, + HoldsItemTime = 7, + IsGenderAndLevel = 8, + EvolutionItemUse = 9, + EvolutionItemUseWithGender = 10, + Trade = 11, + TradeWithHeldItem = 12, + TradeWithSpecificPokemon = 13, + Custom = 14, +} diff --git a/Scripts/Interfaces/EvolutionScript.as b/Scripts/Interfaces/EvolutionScript.as new file mode 100644 index 0000000..e555325 --- /dev/null +++ b/Scripts/Interfaces/EvolutionScript.as @@ -0,0 +1,3 @@ +shared abstract class EvolutionScript { + void DoesEvolveFromLevelUp(bool &out, const EvolutionData@, const Pokemon@){}; +} diff --git a/Scripts/Interfaces/Pokemon.as b/Scripts/Interfaces/Pokemon.as index 7572c69..bd88c29 100644 --- a/Scripts/Interfaces/Pokemon.as +++ b/Scripts/Interfaces/Pokemon.as @@ -8,7 +8,7 @@ shared interface Pokemon { bool Shiny { get const; } const Item@ HeldItem { get const; } bool HasHeldItem(const constString &in name) const; - void SetHeldItem(const string &in name); + void SetHeldItem(const constString &in name); void SetHeldItem(const Item@ item); uint CurrentHealth { get const; } const string& Nickname { get const; } diff --git a/Scripts/Interfaces/constString.as b/Scripts/Interfaces/constString.as index 23155b4..2c0ba79 100644 --- a/Scripts/Interfaces/constString.as +++ b/Scripts/Interfaces/constString.as @@ -2,4 +2,5 @@ shared interface constString { bool opEquals(const constString &in) const; bool opEquals(const string &in) const; uint opImplConv(); + string opImplConv(); } diff --git a/Scripts/Moves/2_5HitMove.as b/Scripts/Moves/2_5HitMove.as index a75ba19..006091c 100644 --- a/Scripts/Moves/2_5HitMove.as +++ b/Scripts/Moves/2_5HitMove.as @@ -23,4 +23,34 @@ namespace Gen7 { } } } -} \ No newline at end of file +} + +#if TESTS + +void RunHits(uint seed, uint8 expectedHits){ + auto battle = CreateSimpleBattle(seed, "charizard", "venusaur", 100); + auto mon1 = battle.GetBattleSide(0).GetPokemon(0); + + auto choice = CreateMoveTurnChoice("tackle", mon1, 1, 0); + auto script = cast(CreateMoveScript("2_5HitMove")); + uint8 numberHits = 1; + script.ModifyNumberOfHits(choice, numberHits); + RequireEquals(expectedHits, numberHits); +} + +[Test name="2-5 Hit Move"] +void MultiHitMove_HasMultiHits(){ + RunHits(684, 3); + RunHits(78216, 4); + RunHits(123640, 3); + RunHits(280282, 2); + RunHits(353353, 3); + RunHits(388667, 2); + RunHits(436269, 2); + RunHits(784419, 5); + RunHits(800144, 2); + RunHits(901811, 5); + RunHits(992841, 4); +} + +#endif \ No newline at end of file diff --git a/Scripts/Moves/Acrobatics.as b/Scripts/Moves/Acrobatics.as index 411b033..76e741c 100644 --- a/Scripts/Moves/Acrobatics.as +++ b/Scripts/Moves/Acrobatics.as @@ -8,4 +8,74 @@ namespace Gen7 { } }; } -} \ No newline at end of file +} + +#if TESTS +[Test name="Acrobatics: Base Power without item"] +void Acrobatics_BasePowerWithoutItem(){ + auto battle = CreateSimpleBattle(684, "charizard", "venusaur", 100); + auto mon1 = battle.GetBattleSide(0).GetPokemon(0); + auto mon2 = battle.GetBattleSide(1).GetPokemon(0); + + auto script = cast(CreateMoveScript("Acrobatics")); + Require(script !is null); + uint8 bp = 20; + auto executingMove = CreateExecutingMove("Acrobatics", mon1, mon2); + script.OverrideBasePower(executingMove, mon2, 0x0, bp); + RequireEquals(40, bp); +} + +[Test name="Acrobatics: Base Power with item"] +void Acrobatics_BasePowerWithItem(){ + auto battle = CreateSimpleBattle(684, "charizard", "venusaur", 100); + auto mon1 = battle.GetBattleSide(0).GetPokemon(0); + auto mon2 = battle.GetBattleSide(1).GetPokemon(0); + mon1.SetHeldItem("poke_ball"); + + auto script = cast(CreateMoveScript("Acrobatics")); + Require(script !is null); + uint8 bp = 20; + auto executingMove = CreateExecutingMove("Acrobatics", mon1, mon2); + script.OverrideBasePower(executingMove, mon2, 0x0, bp); + RequireEquals(20, bp); +} + +[Test name="Acrobatics: Base Power without item with base power > 128"] +void Acrobatics_BasePowerWithoutItemWithHighBasePower(){ + auto battle = CreateSimpleBattle(684, "charizard", "venusaur", 100); + auto mon1 = battle.GetBattleSide(0).GetPokemon(0); + auto mon2 = battle.GetBattleSide(1).GetPokemon(0); + + auto script = cast(CreateMoveScript("Acrobatics")); + Require(script !is null); + uint8 bp = 140; + auto executingMove = CreateExecutingMove("Acrobatics", mon1, mon2); + script.OverrideBasePower(executingMove, mon2, 0x0, bp); + RequireEquals(255, bp); +} + +[Test name="Acrobatics: Damage without item"] +void Acrobatics_TestDamageWithoutItem(){ + auto battle = CreateSimpleBattle(684, "charizard", "venusaur", 100); + auto mon1 = battle.GetBattleSide(0).GetPokemon(0); + auto mon2 = battle.GetBattleSide(1).GetPokemon(0); + auto startHealth = mon2.CurrentHealth; + Require(mon1.UseMove("acrobatics", 1, 0)); + Require(mon2.PassTurn()); + RequireEquals(272, startHealth - mon2.CurrentHealth); +} + +[Test name="Acrobatics: Damage with item"] +void Acrobatics_TestDamageWithItem(){ + auto battle = CreateSimpleBattle(684, "charizard", "venusaur", 100); + auto mon1 = battle.GetBattleSide(0).GetPokemon(0); + auto mon2 = battle.GetBattleSide(1).GetPokemon(0); + mon1.SetHeldItem("poke_ball"); + + auto startHealth = mon2.CurrentHealth; + Require(mon1.UseMove("acrobatics", 1, 0)); + Require(mon2.PassTurn()); + RequireEquals(139, startHealth - mon2.CurrentHealth); +} + +#endif