mirror of
https://github.com/rh-hideout/pokeemerald-expansion
synced 2025-10-06 03:02:44 +02:00
576 lines
23 KiB
C
576 lines
23 KiB
C
#include "global.h"
|
|
#include "battle.h"
|
|
#include "event_data.h"
|
|
#include "pokemon.h"
|
|
#include "test/overworld_script.h"
|
|
#include "test/test.h"
|
|
#include "constants/characters.h"
|
|
|
|
TEST("Nature independent from Hidden Nature")
|
|
{
|
|
u32 i, j, nature = 0, hiddenNature = 0;
|
|
struct Pokemon mon;
|
|
for (i = 0; i < NUM_NATURES; i++)
|
|
{
|
|
for (j = 0; j < NUM_NATURES; j++)
|
|
{
|
|
PARAMETRIZE { nature = i; hiddenNature = j; }
|
|
}
|
|
}
|
|
CreateMonWithNature(&mon, SPECIES_WOBBUFFET, 100, 0, nature);
|
|
SetMonData(&mon, MON_DATA_HIDDEN_NATURE, &hiddenNature);
|
|
EXPECT_EQ(GetNature(&mon), nature);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HIDDEN_NATURE), hiddenNature);
|
|
}
|
|
|
|
TEST("Terastallization type defaults to primary or secondary type")
|
|
{
|
|
u32 i, teraType;
|
|
struct Pokemon mon;
|
|
for (i = 0; i < 128; i++) PARAMETRIZE {}
|
|
CreateMon(&mon, SPECIES_PIDGEY, 100, 0, FALSE, 0, OT_ID_PRESET, 0);
|
|
teraType = GetMonData(&mon, MON_DATA_TERA_TYPE);
|
|
EXPECT(teraType == GetSpeciesType(SPECIES_PIDGEY, 0)
|
|
|| teraType == GetSpeciesType(SPECIES_PIDGEY, 1));
|
|
}
|
|
|
|
TEST("Terastallization type can be set to any type except TYPE_NONE")
|
|
{
|
|
u32 i, teraType;
|
|
struct Pokemon mon;
|
|
for (i = 1; i < NUMBER_OF_MON_TYPES; i++)
|
|
{
|
|
PARAMETRIZE { teraType = i; }
|
|
}
|
|
CreateMon(&mon, SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0);
|
|
SetMonData(&mon, MON_DATA_TERA_TYPE, &teraType);
|
|
EXPECT_EQ(teraType, GetMonData(&mon, MON_DATA_TERA_TYPE));
|
|
}
|
|
|
|
TEST("Terastallization type is reset to the default types when setting Tera Type back to TYPE_NONE")
|
|
{
|
|
u32 i, teraType, typeNone;
|
|
struct Pokemon mon;
|
|
for (i = 1; i < NUMBER_OF_MON_TYPES; i++)
|
|
{
|
|
PARAMETRIZE { teraType = i; typeNone = TYPE_NONE; }
|
|
}
|
|
CreateMon(&mon, SPECIES_PIDGEY, 100, 0, FALSE, 0, OT_ID_PRESET, 0);
|
|
SetMonData(&mon, MON_DATA_TERA_TYPE, &teraType);
|
|
EXPECT_EQ(teraType, GetMonData(&mon, MON_DATA_TERA_TYPE));
|
|
if (typeNone == TYPE_NONE)
|
|
typeNone = GetTeraTypeFromPersonality(&mon);
|
|
SetMonData(&mon, MON_DATA_TERA_TYPE, &typeNone);
|
|
typeNone = GetMonData(&mon, MON_DATA_TERA_TYPE);
|
|
EXPECT(typeNone == GetSpeciesType(SPECIES_PIDGEY, 0)
|
|
|| typeNone == GetSpeciesType(SPECIES_PIDGEY, 1));
|
|
}
|
|
|
|
TEST("Shininess independent from PID and OTID")
|
|
{
|
|
u32 pid, otId, data;
|
|
bool32 isShiny;
|
|
struct Pokemon mon;
|
|
PARAMETRIZE { pid = 0; otId = 0; }
|
|
CreateMon(&mon, SPECIES_WOBBUFFET, 100, 0, TRUE, pid, OT_ID_PRESET, otId);
|
|
isShiny = IsMonShiny(&mon);
|
|
data = !isShiny;
|
|
SetMonData(&mon, MON_DATA_IS_SHINY, &data);
|
|
EXPECT_EQ(pid, GetMonData(&mon, MON_DATA_PERSONALITY));
|
|
EXPECT_EQ(otId, GetMonData(&mon, MON_DATA_OT_ID));
|
|
EXPECT_EQ(!isShiny, GetMonData(&mon, MON_DATA_IS_SHINY));
|
|
}
|
|
|
|
TEST("Hyper Training increases stats without affecting IVs")
|
|
{
|
|
u32 data, hp, atk, def, speed, spatk, spdef, friendship = 0;
|
|
struct Pokemon mon;
|
|
CreateMon(&mon, SPECIES_WOBBUFFET, 100, 3, TRUE, 0, OT_ID_PRESET, 0);
|
|
|
|
// Consider B_FRIENDSHIP_BOOST.
|
|
SetMonData(&mon, MON_DATA_FRIENDSHIP, &friendship);
|
|
CalculateMonStats(&mon);
|
|
|
|
hp = GetMonData(&mon, MON_DATA_HP);
|
|
atk = GetMonData(&mon, MON_DATA_ATK);
|
|
def = GetMonData(&mon, MON_DATA_DEF);
|
|
speed = GetMonData(&mon, MON_DATA_SPEED);
|
|
spatk = GetMonData(&mon, MON_DATA_SPATK);
|
|
spdef = GetMonData(&mon, MON_DATA_SPDEF);
|
|
|
|
data = TRUE;
|
|
SetMonData(&mon, MON_DATA_HYPER_TRAINED_HP, &data);
|
|
SetMonData(&mon, MON_DATA_HYPER_TRAINED_ATK, &data);
|
|
SetMonData(&mon, MON_DATA_HYPER_TRAINED_DEF, &data);
|
|
SetMonData(&mon, MON_DATA_HYPER_TRAINED_SPEED, &data);
|
|
SetMonData(&mon, MON_DATA_HYPER_TRAINED_SPATK, &data);
|
|
SetMonData(&mon, MON_DATA_HYPER_TRAINED_SPDEF, &data);
|
|
CalculateMonStats(&mon);
|
|
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HP_IV), 3);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_ATK_IV), 3);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_DEF_IV), 3);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SPEED_IV), 3);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SPATK_IV), 3);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SPDEF_IV), 3);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SPEED_IV), 3);
|
|
|
|
EXPECT_EQ(hp - 3 + MAX_PER_STAT_IVS, GetMonData(&mon, MON_DATA_HP));
|
|
EXPECT_EQ(atk - 3 + MAX_PER_STAT_IVS, GetMonData(&mon, MON_DATA_ATK));
|
|
EXPECT_EQ(def - 3 + MAX_PER_STAT_IVS, GetMonData(&mon, MON_DATA_DEF));
|
|
EXPECT_EQ(speed - 3 + MAX_PER_STAT_IVS, GetMonData(&mon, MON_DATA_SPEED));
|
|
EXPECT_EQ(spatk - 3 + MAX_PER_STAT_IVS, GetMonData(&mon, MON_DATA_SPATK));
|
|
EXPECT_EQ(spdef - 3 + MAX_PER_STAT_IVS, GetMonData(&mon, MON_DATA_SPDEF));
|
|
}
|
|
|
|
TEST("Status1 round-trips through BoxPokemon")
|
|
{
|
|
u32 status1;
|
|
struct Pokemon mon1, mon2;
|
|
PARAMETRIZE { status1 = STATUS1_NONE; }
|
|
PARAMETRIZE { status1 = STATUS1_SLEEP_TURN(1); }
|
|
PARAMETRIZE { status1 = STATUS1_SLEEP_TURN(2); }
|
|
PARAMETRIZE { status1 = STATUS1_SLEEP_TURN(3); }
|
|
PARAMETRIZE { status1 = STATUS1_SLEEP_TURN(4); }
|
|
PARAMETRIZE { status1 = STATUS1_SLEEP_TURN(5); }
|
|
PARAMETRIZE { status1 = STATUS1_POISON; }
|
|
PARAMETRIZE { status1 = STATUS1_BURN; }
|
|
PARAMETRIZE { status1 = STATUS1_FREEZE; }
|
|
PARAMETRIZE { status1 = STATUS1_PARALYSIS; }
|
|
PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; }
|
|
PARAMETRIZE { status1 = STATUS1_FROSTBITE; }
|
|
CreateMon(&mon1, SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0);
|
|
SetMonData(&mon1, MON_DATA_STATUS, &status1);
|
|
BoxMonToMon(&mon1.box, &mon2);
|
|
EXPECT_EQ(GetMonData(&mon2, MON_DATA_STATUS), status1);
|
|
}
|
|
|
|
TEST("canhypertrain/hypertrain affect MON_DATA_HYPER_TRAINED_* and recalculate stats")
|
|
{
|
|
u32 atk, friendship = 0;
|
|
CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0);
|
|
|
|
// Consider B_FRIENDSHIP_BOOST.
|
|
SetMonData(&gPlayerParty[0], MON_DATA_FRIENDSHIP, &friendship);
|
|
CalculateMonStats(&gPlayerParty[0]);
|
|
|
|
atk = GetMonData(&gPlayerParty[0], MON_DATA_ATK);
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
canhypertrain STAT_ATK, 0;
|
|
);
|
|
EXPECT(VarGet(VAR_RESULT));
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
hypertrain STAT_ATK, 0;
|
|
canhypertrain STAT_ATK, 0;
|
|
);
|
|
EXPECT(GetMonData(&gPlayerParty[0], MON_DATA_HYPER_TRAINED_ATK));
|
|
EXPECT_EQ(atk + 31, GetMonData(&gPlayerParty[0], MON_DATA_ATK));
|
|
EXPECT(!VarGet(VAR_RESULT));
|
|
}
|
|
|
|
TEST("hasgigantamaxfactor/togglegigantamaxfactor affect MON_DATA_GIGANTAMAX_FACTOR")
|
|
{
|
|
CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0);
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
hasgigantamaxfactor 0;
|
|
);
|
|
EXPECT(!VarGet(VAR_RESULT));
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
togglegigantamaxfactor 0;
|
|
hasgigantamaxfactor 0;
|
|
);
|
|
EXPECT(VarGet(VAR_RESULT));
|
|
EXPECT(GetMonData(&gPlayerParty[0], MON_DATA_GIGANTAMAX_FACTOR));
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
togglegigantamaxfactor 0;
|
|
hasgigantamaxfactor 0;
|
|
);
|
|
EXPECT(!VarGet(VAR_RESULT));
|
|
EXPECT(!GetMonData(&gPlayerParty[0], MON_DATA_GIGANTAMAX_FACTOR));
|
|
}
|
|
|
|
TEST("togglegigantamaxfactor fails for Melmetal")
|
|
{
|
|
CreateMon(&gPlayerParty[0], SPECIES_MELMETAL, 100, 0, FALSE, 0, OT_ID_PRESET, 0);
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
hasgigantamaxfactor 0;
|
|
);
|
|
EXPECT(!VarGet(VAR_RESULT));
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
togglegigantamaxfactor 0;
|
|
);
|
|
EXPECT(!VarGet(VAR_RESULT));
|
|
EXPECT(!GetMonData(&gPlayerParty[0], MON_DATA_GIGANTAMAX_FACTOR));
|
|
}
|
|
|
|
TEST("givemon [simple]")
|
|
{
|
|
ZeroPlayerPartyMons();
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
givemon SPECIES_WOBBUFFET, 100;
|
|
);
|
|
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_WOBBUFFET);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_LEVEL), 100);
|
|
}
|
|
|
|
TEST("givemon respects perfectIVCount")
|
|
{
|
|
ZeroPlayerPartyMons();
|
|
u32 perfectIVs[6] = {0};
|
|
|
|
ASSUME(gSpeciesInfo[SPECIES_MEW].perfectIVCount == 3);
|
|
ASSUME(gSpeciesInfo[SPECIES_CELEBI].perfectIVCount == 3);
|
|
ASSUME(gSpeciesInfo[SPECIES_JIRACHI].perfectIVCount == 3);
|
|
ASSUME(gSpeciesInfo[SPECIES_MANAPHY].perfectIVCount == 3);
|
|
ASSUME(gSpeciesInfo[SPECIES_VICTINI].perfectIVCount == 3);
|
|
ASSUME(gSpeciesInfo[SPECIES_DIANCIE].perfectIVCount == 3);
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
givemon SPECIES_MEW, 100;
|
|
givemon SPECIES_CELEBI, 100;
|
|
givemon SPECIES_JIRACHI, 100;
|
|
givemon SPECIES_MANAPHY, 100;
|
|
givemon SPECIES_VICTINI, 100;
|
|
givemon SPECIES_DIANCIE, 100;
|
|
);
|
|
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_MEW);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_SPECIES), SPECIES_CELEBI);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[2], MON_DATA_SPECIES), SPECIES_JIRACHI);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[3], MON_DATA_SPECIES), SPECIES_MANAPHY);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[4], MON_DATA_SPECIES), SPECIES_VICTINI);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[5], MON_DATA_SPECIES), SPECIES_DIANCIE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_LEVEL), 100);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_LEVEL), 100);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[2], MON_DATA_LEVEL), 100);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[3], MON_DATA_LEVEL), 100);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[4], MON_DATA_LEVEL), 100);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[5], MON_DATA_LEVEL), 100);
|
|
for (u32 j = 0; j < 6; j++)
|
|
{
|
|
for (u32 k = 0; k < NUM_STATS; k++)
|
|
{
|
|
if (GetMonData(&gPlayerParty[j], MON_DATA_HP_IV + k) == MAX_PER_STAT_IVS)
|
|
perfectIVs[j]++;
|
|
}
|
|
EXPECT_GE(perfectIVs[j], 3);
|
|
}
|
|
}
|
|
|
|
TEST("givemon respects FORM_CHANGE_ITEM_HOLD")
|
|
{
|
|
ZeroPlayerPartyMons();
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
givemon SPECIES_ARCEUS_NORMAL, 100, item=ITEM_ZAP_PLATE;
|
|
givemon SPECIES_ARCEUS_GRASS, 100, item=ITEM_ZAP_PLATE;
|
|
givemon SPECIES_ARCEUS_ELECTRIC, 100, item=ITEM_ZAP_PLATE;
|
|
givemon SPECIES_GIRATINA_ORIGIN, 100, item=ITEM_POTION;
|
|
);
|
|
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_ARCEUS_ELECTRIC);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_SPECIES), SPECIES_ARCEUS_ELECTRIC);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[2], MON_DATA_SPECIES), SPECIES_ARCEUS_ELECTRIC);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[3], MON_DATA_SPECIES), SPECIES_GIRATINA_ALTERED);
|
|
}
|
|
|
|
TEST("givemon [moves]")
|
|
{
|
|
ZeroPlayerPartyMons();
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
givemon SPECIES_WOBBUFFET, 100, move1=MOVE_SCRATCH, move2=MOVE_SPLASH, move3=MOVE_NONE;
|
|
);
|
|
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_WOBBUFFET);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_LEVEL), 100);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE1), MOVE_SCRATCH);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE2), MOVE_SPLASH);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE3), MOVE_NONE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE4), MOVE_NONE);
|
|
}
|
|
|
|
TEST("givemon [all]")
|
|
{
|
|
ZeroPlayerPartyMons();
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
givemon SPECIES_WOBBUFFET, 100, item=ITEM_LEFTOVERS, ball=ITEM_MASTER_BALL, nature=NATURE_BOLD, abilityNum=2, gender=MON_MALE, hpEv=1, atkEv=2, defEv=3, speedEv=4, spAtkEv=5, spDefEv=6, hpIv=7, atkIv=8, defIv=9, speedIv=10, spAtkIv=11, spDefIv=12, move1=MOVE_SCRATCH, move2=MOVE_SPLASH, move3=MOVE_CELEBRATE, move4=MOVE_EXPLOSION, isShiny=TRUE, gmaxFactor=TRUE, teraType=TYPE_FIRE, dmaxLevel=7;
|
|
);
|
|
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_WOBBUFFET);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_LEVEL), 100);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM), ITEM_LEFTOVERS);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKEBALL), BALL_MASTER);
|
|
EXPECT_EQ(GetNature(&gPlayerParty[0]), NATURE_BOLD);
|
|
EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), GetSpeciesAbility(SPECIES_WOBBUFFET, 2));
|
|
EXPECT_EQ(GetMonGender(&gPlayerParty[0]), MON_MALE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP_EV), 1);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK_EV), 2);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_DEF_EV), 3);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPEED_EV), 4);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPATK_EV), 5);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPDEF_EV), 6);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP_IV), 7);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK_IV), 8);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_DEF_IV), 9);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPEED_IV), 10);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPATK_IV), 11);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPDEF_IV), 12);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE1), MOVE_SCRATCH);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE2), MOVE_SPLASH);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE3), MOVE_CELEBRATE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE4), MOVE_EXPLOSION);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_IS_SHINY), TRUE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_GIGANTAMAX_FACTOR), TRUE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_TERA_TYPE), TYPE_FIRE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_DYNAMAX_LEVEL), 7);
|
|
}
|
|
|
|
TEST("givemon [vars]")
|
|
{
|
|
ZeroPlayerPartyMons();
|
|
|
|
VarSet(VAR_TEMP_C, SPECIES_WOBBUFFET);
|
|
VarSet(VAR_TEMP_D, 100);
|
|
VarSet(VAR_0x8000, ITEM_LEFTOVERS);
|
|
VarSet(VAR_0x8001, ITEM_MASTER_BALL);
|
|
VarSet(VAR_0x8002, NATURE_BOLD);
|
|
VarSet(VAR_0x8003, 2);
|
|
VarSet(VAR_0x8004, MON_MALE);
|
|
VarSet(VAR_0x8005, 1);
|
|
VarSet(VAR_0x8006, 2);
|
|
VarSet(VAR_0x8007, 3);
|
|
VarSet(VAR_0x8008, 4);
|
|
VarSet(VAR_0x8009, 5);
|
|
VarSet(VAR_0x800A, 6);
|
|
VarSet(VAR_0x800B, 7);
|
|
VarSet(VAR_TEMP_0, 8);
|
|
VarSet(VAR_TEMP_1, 9);
|
|
VarSet(VAR_TEMP_2, 10);
|
|
VarSet(VAR_TEMP_3, 11);
|
|
VarSet(VAR_TEMP_4, 12);
|
|
VarSet(VAR_TEMP_5, MOVE_SCRATCH);
|
|
VarSet(VAR_TEMP_6, MOVE_SPLASH);
|
|
VarSet(VAR_TEMP_7, MOVE_CELEBRATE);
|
|
VarSet(VAR_TEMP_8, MOVE_EXPLOSION);
|
|
VarSet(VAR_TEMP_9, TRUE);
|
|
VarSet(VAR_TEMP_A, TRUE);
|
|
VarSet(VAR_TEMP_B, TYPE_FIRE);
|
|
VarSet(VAR_TEMP_E, 7);
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
givemon VAR_TEMP_C, VAR_TEMP_D, item=VAR_0x8000, ball=VAR_0x8001, nature=VAR_0x8002, abilityNum=VAR_0x8003, gender=VAR_0x8004, hpEv=VAR_0x8005, atkEv=VAR_0x8006, defEv=VAR_0x8007, speedEv=VAR_0x8008, spAtkEv=VAR_0x8009, spDefEv=VAR_0x800A, hpIv=VAR_0x800B, atkIv=VAR_TEMP_0, defIv=VAR_TEMP_1, speedIv=VAR_TEMP_2, spAtkIv=VAR_TEMP_3, spDefIv=VAR_TEMP_4, move1=VAR_TEMP_5, move2=VAR_TEMP_6, move3=VAR_TEMP_7, move4=VAR_TEMP_8, isShiny=VAR_TEMP_9, gmaxFactor=VAR_TEMP_A, teraType=VAR_TEMP_B, dmaxLevel=VAR_TEMP_E;
|
|
);
|
|
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_WOBBUFFET);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_LEVEL), 100);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM), ITEM_LEFTOVERS);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKEBALL), BALL_MASTER);
|
|
EXPECT_EQ(GetNature(&gPlayerParty[0]), NATURE_BOLD);
|
|
EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), GetSpeciesAbility(SPECIES_WOBBUFFET, 2));
|
|
EXPECT_EQ(GetMonGender(&gPlayerParty[0]), MON_MALE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP_EV), 1);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK_EV), 2);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_DEF_EV), 3);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPEED_EV), 4);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPATK_EV), 5);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPDEF_EV), 6);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP_IV), 7);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK_IV), 8);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_DEF_IV), 9);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPEED_IV), 10);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPATK_IV), 11);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPDEF_IV), 12);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE1), MOVE_SCRATCH);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE2), MOVE_SPLASH);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE3), MOVE_CELEBRATE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE4), MOVE_EXPLOSION);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_IS_SHINY), TRUE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_GIGANTAMAX_FACTOR), TRUE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_TERA_TYPE), TYPE_FIRE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_DYNAMAX_LEVEL), 7);
|
|
}
|
|
|
|
TEST("checkteratype/setteratype work")
|
|
{
|
|
CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0);
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
checkteratype 0;
|
|
);
|
|
EXPECT(VarGet(VAR_RESULT) == TYPE_PSYCHIC);
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
setteratype TYPE_FIRE, 0;
|
|
checkteratype 0;
|
|
);
|
|
EXPECT(VarGet(VAR_RESULT) == TYPE_FIRE);
|
|
}
|
|
|
|
TEST("createmon [simple]")
|
|
{
|
|
ZeroPlayerPartyMons();
|
|
|
|
RUN_OVERWORLD_SCRIPT(
|
|
createmon 1, 0, SPECIES_WOBBUFFET, 100;
|
|
createmon 1, 1, SPECIES_WYNAUT, 10;
|
|
);
|
|
|
|
EXPECT_EQ(GetMonData(&gEnemyParty[0], MON_DATA_SPECIES), SPECIES_WOBBUFFET);
|
|
EXPECT_EQ(GetMonData(&gEnemyParty[0], MON_DATA_LEVEL), 100);
|
|
EXPECT_EQ(GetMonData(&gEnemyParty[1], MON_DATA_SPECIES), SPECIES_WYNAUT);
|
|
EXPECT_EQ(GetMonData(&gEnemyParty[1], MON_DATA_LEVEL), 10);
|
|
}
|
|
|
|
TEST("Pokémon level up learnsets fit within MAX_LEVEL_UP_MOVES and MAX_RELEARNER_MOVES")
|
|
{
|
|
KNOWN_FAILING;
|
|
|
|
u32 j, count, species = 0;
|
|
const struct LevelUpMove *learnset;
|
|
|
|
for(j = 0; j < SPECIES_EGG; j++)
|
|
{
|
|
PARAMETRIZE { species = j; }
|
|
}
|
|
|
|
learnset = GetSpeciesLevelUpLearnset(species);
|
|
count = 0;
|
|
for (j = 0; learnset[j].move != LEVEL_UP_MOVE_END; j++)
|
|
count++;
|
|
EXPECT_LT(count, MAX_LEVEL_UP_MOVES);
|
|
EXPECT_LT(count, MAX_RELEARNER_MOVES - 1); // - 1 because at least one move is already known
|
|
}
|
|
|
|
TEST("Optimised GetMonData")
|
|
{
|
|
CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 5, 0, FALSE, 0, OT_ID_PRESET, 0x12345678);
|
|
u32 exp = 0x123456;
|
|
SetMonData(&gPlayerParty[0], MON_DATA_EXP, &exp);
|
|
struct Benchmark optimised,
|
|
vanilla = (struct Benchmark) { .ticks = 137 }; // From prior testing
|
|
u32 expGet = 0;
|
|
BENCHMARK(&optimised) { expGet = GetMonData(&gPlayerParty[0], MON_DATA_EXP); }
|
|
EXPECT_EQ(exp, expGet);
|
|
EXPECT_FASTER(optimised, vanilla);
|
|
}
|
|
|
|
TEST("Optimised SetMonData")
|
|
{
|
|
CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 5, 0, FALSE, 0, OT_ID_PRESET, 0x12345678);
|
|
u32 exp = 0x123456;
|
|
struct Benchmark optimised,
|
|
vanilla = (struct Benchmark) { .ticks = 205 }; // From prior testing
|
|
BENCHMARK(&optimised) { SetMonData(&gPlayerParty[0], MON_DATA_EXP, &exp); }
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_BAD_EGG), FALSE);
|
|
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_EXP), exp);
|
|
EXPECT_FASTER(optimised, vanilla);
|
|
}
|
|
|
|
TEST("BoxPokemon encryption works")
|
|
{
|
|
u32 raw[20] =
|
|
{
|
|
990384375,
|
|
2948624514,
|
|
3907508686,
|
|
14410461,
|
|
35316705,
|
|
3907508686,
|
|
64742109,
|
|
718729,
|
|
3102307966,
|
|
2160206402,
|
|
49956971,
|
|
2495766612,
|
|
1424318580,
|
|
273408756,
|
|
2371630199,
|
|
2708871082,
|
|
3059937332,
|
|
2529190026,
|
|
2290634828,
|
|
2870614922
|
|
};
|
|
|
|
struct Pokemon mon;
|
|
BoxMonToMon((struct BoxPokemon *)&raw, &mon);
|
|
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SANITY_IS_BAD_EGG), 0);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SPECIES), SPECIES_TORCHIC);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_MARKINGS), 3);
|
|
const u8 *actualNickname = COMPOUND_STRING("Testing mon");
|
|
u8 nickname[12];
|
|
GetMonData(&mon, MON_DATA_NICKNAME, nickname);
|
|
u32 charIndex = 0;
|
|
while (actualNickname[charIndex] != EOS)
|
|
{
|
|
EXPECT_EQ(actualNickname[charIndex], nickname[charIndex]);
|
|
charIndex++;
|
|
}
|
|
EXPECT_EQ(GetNature(&mon), NATURE_HARDY);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HIDDEN_NATURE), NATURE_ADAMANT);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HP_LOST), 10);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HELD_ITEM), ITEM_ORAN_BERRY);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_MOVE1), MOVE_TACKLE);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_MOVE2), MOVE_SCRATCH);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_MOVE3), MOVE_POUND);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_MOVE4), MOVE_GROWL);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_PP1), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_PP2), 2);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_PP3), 3);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_PP4), 4);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_PP_BONUSES), 255);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_COOL), 10);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_BEAUTY), 20);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_CUTE), 30);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SMART), 40);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_TOUGH), 50);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SHEEN), 150);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_EXP), 12345);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_MET_LEVEL), 20);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HP_EV), 11);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_ATK_EV), 22);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_DEF_EV), 33);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SPEED_EV), 44);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SPATK_EV), 55);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SPDEF_EV), 66);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_FRIENDSHIP), 123);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_POKERUS), 2);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_POKEBALL), BALL_FRIEND);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HP_IV), 31);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_ATK_IV), 30);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_DEF_IV), 29);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SPEED_IV), 28);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SPATK_IV), 27);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SPDEF_IV), 26);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_CUTE_RIBBON), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_BEAUTY_RIBBON), 0);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_TOUGH_RIBBON), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_SMART_RIBBON), 0);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_CHAMPION_RIBBON), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_VICTORY_RIBBON), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_EFFORT_RIBBON), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_LAND_RIBBON), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_COUNTRY_RIBBON), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_EARTH_RIBBON), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HYPER_TRAINED_HP), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HYPER_TRAINED_ATK), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HYPER_TRAINED_DEF), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HYPER_TRAINED_SPEED), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HYPER_TRAINED_SPATK), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_HYPER_TRAINED_SPDEF), 1);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_DYNAMAX_LEVEL), 3);
|
|
EXPECT_EQ(GetMonData(&mon, MON_DATA_OT_GENDER), 0);
|
|
}
|