#include "global.h" #include "battle.h" #include "event_data.h" #include "pokemon.h" #include "test/overworld_script.h" #include "test/test.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 == gSpeciesInfo[SPECIES_PIDGEY].types[0] || teraType == gSpeciesInfo[SPECIES_PIDGEY].types[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)); SetMonData(&mon, MON_DATA_TERA_TYPE, &typeNone); typeNone = GetMonData(&mon, MON_DATA_TERA_TYPE); EXPECT(typeNone == gSpeciesInfo[SPECIES_PIDGEY].types[0] || typeNone == gSpeciesInfo[SPECIES_PIDGEY].types[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; struct Pokemon mon; CreateMon(&mon, SPECIES_WOBBUFFET, 100, 3, TRUE, 0, OT_ID_PRESET, 0); 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; CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 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 [moves]") { ZeroPlayerPartyMons(); RUN_OVERWORLD_SCRIPT( givemon SPECIES_WOBBUFFET, 100, move1=MOVE_TACKLE, move2=MOVE_SPLASH, move3=MOVE_NONE, move4=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_TACKLE); 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_TACKLE, move2=MOVE_SPLASH, move3=MOVE_CELEBRATE, move4=MOVE_EXPLOSION, isShiny=TRUE, ggMaxFactor=TRUE, teraType=TYPE_FIRE; ); 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), ITEM_MASTER_BALL); EXPECT_EQ(GetNature(&gPlayerParty[0]), NATURE_BOLD); EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), gSpeciesInfo[SPECIES_WOBBUFFET].abilities[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_TACKLE); 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); } 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_TACKLE); 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); 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, ggMaxFactor=VAR_TEMP_A, teraType=VAR_TEMP_B; ); 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), ITEM_MASTER_BALL); EXPECT_EQ(GetNature(&gPlayerParty[0]), NATURE_BOLD); EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), gSpeciesInfo[SPECIES_WOBBUFFET].abilities[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_TACKLE); 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); } 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); }