From fd07daf0d88e0659bced27cf8ab327aeb22d1c85 Mon Sep 17 00:00:00 2001 From: FosterProgramming Date: Tue, 28 Oct 2025 19:23:16 +0100 Subject: [PATCH] Fix nature power string and add support for evnvironment in tests (#8068) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- data/battle_scripts_1.s | 2 +- include/test/battle.h | 3 +++ include/test_runner.h | 3 +++ src/battle_bg.c | 17 +++++++++++++++-- src/battle_intro.c | 2 ++ src/battle_main.c | 2 ++ test/battle/move_effect/nature_power.c | 25 ++++++++++++++++++++++++- test/test_runner_battle.c | 12 ++++++++++++ 8 files changed, 62 insertions(+), 4 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index f7edad9db4..01f94705db 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8889,7 +8889,7 @@ BattleScript_MetronomeAttackstring:: BattleScript_NaturePowerAttackstring:: printattackstring pause B_WAIT_TIME_SHORT + setcalledmove printstring STRINGID_NATUREPOWERTURNEDINTO waitmessage B_WAIT_TIME_LONG - setcalledmove return diff --git a/include/test/battle.h b/include/test/battle.h index fbd4106b35..bf1e7ceee9 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -736,6 +736,7 @@ struct BattleTestData bool8 isShiny; enum Ability forcedAbilities[NUM_BATTLE_SIDES][PARTY_SIZE]; u8 chosenGimmick[NUM_BATTLE_SIDES][PARTY_SIZE]; + u8 forcedEnvironment; u8 currentMonIndexes[MAX_BATTLERS_COUNT]; u8 turnState; @@ -990,6 +991,7 @@ struct moveWithPP { #define TeraType(teraType) TeraType_(__LINE__, teraType) #define Shadow(isShadow) Shadow_(__LINE__, isShadow) #define Shiny(isShiny) Shiny_(__LINE__, isShiny) +#define Environment(environment) Environment_(__LINE__, environment) void SetFlagForTest(u32 sourceLine, u16 flagId); void TestSetConfig(u32 sourceLine, enum GenConfigTag configTag, u32 value); @@ -1030,6 +1032,7 @@ void GigantamaxFactor_(u32 sourceLine, bool32 gigantamaxFactor); void TeraType_(u32 sourceLine, enum Type teraType); void Shadow_(u32 sourceLine, bool32 isShadow); void Shiny_(u32 sourceLine, bool32 isShiny); +void Environment_(u32 sourceLine, u32 environment); static inline bool8 IsMultibattleTest(void) { diff --git a/include/test_runner.h b/include/test_runner.h index a3b0826e86..493cfabc43 100644 --- a/include/test_runner.h +++ b/include/test_runner.h @@ -28,6 +28,7 @@ void TestRunner_Battle_CheckBattleRecordActionType(u32 battlerId, u32 recordInde u32 TestRunner_Battle_GetForcedAbility(u32 side, u32 partyIndex); u32 TestRunner_Battle_GetChosenGimmick(u32 side, u32 partyIndex); +u32 TestRunner_Battle_GetForcedEnvironment(void); #else @@ -51,6 +52,8 @@ u32 TestRunner_Battle_GetChosenGimmick(u32 side, u32 partyIndex); #define TestRunner_Battle_GetChosenGimmick(...) (u32)0 +#define TestRunner_Battle_GetForcedEnvironment(...) (u8)0 + #endif #endif diff --git a/src/battle_bg.c b/src/battle_bg.c index 3524dbee2d..14244c4e95 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -19,6 +19,7 @@ #include "sound.h" #include "sprite.h" #include "task.h" +#include "test_runner.h" #include "text_window.h" #include "trig.h" #include "window.h" @@ -650,7 +651,13 @@ static u8 GetBattleEnvironmentOverride(void) { u8 battleScene = GetCurrentMapBattleScene(); - if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) + if (TestRunner_Battle_GetForcedEnvironment() + && gBattleEnvironmentInfo[gBattleEnvironment].background.tilemap + && gBattleEnvironmentInfo[gBattleEnvironment].background.tileset) + { + return gBattleEnvironment; + } + else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) return BATTLE_ENVIRONMENT_FRONTIER; else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) { @@ -1022,7 +1029,13 @@ void DrawBattleEntryBackground(void) } else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) { - if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) + if (TestRunner_Battle_GetForcedEnvironment() + && gBattleEnvironmentInfo[gBattleEnvironment].background.tilemap + && gBattleEnvironmentInfo[gBattleEnvironment].background.tileset) + { + LoadBattleEnvironmentEntryGfx(gBattleEnvironment); + } + else if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) { LoadBattleEnvironmentEntryGfx(BATTLE_ENVIRONMENT_BUILDING); } diff --git a/src/battle_intro.c b/src/battle_intro.c index 5239a81575..8a335ea481 100644 --- a/src/battle_intro.c +++ b/src/battle_intro.c @@ -125,6 +125,8 @@ void HandleIntroSlide(u8 environment) } else { + if (environment >= NELEMS(sBattleIntroSlideFuncs)) + environment = BATTLE_ENVIRONMENT_PLAIN; taskId = CreateTask(sBattleIntroSlideFuncs[environment], 0); } diff --git a/src/battle_main.c b/src/battle_main.c index 5d99e6f964..685b1a9f15 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -521,6 +521,8 @@ static void CB2_InitBattleInternal(void) } if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) gBattleEnvironment = BATTLE_ENVIRONMENT_BUILDING; + if (TestRunner_Battle_GetForcedEnvironment()) + gBattleEnvironment = TestRunner_Battle_GetForcedEnvironment() - 1; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER diff --git a/test/battle/move_effect/nature_power.c b/test/battle/move_effect/nature_power.c index 1e9692f88d..53aa68442d 100644 --- a/test/battle/move_effect/nature_power.c +++ b/test/battle/move_effect/nature_power.c @@ -1,4 +1,27 @@ #include "global.h" #include "test/battle.h" +#include "battle_environment.h" -TO_DO_BATTLE_TEST("TODO: Write Nature Power (Move Effect) test titles") +//TO_DO_BATTLE_TEST("TODO: Write Nature Power (Move Effect) test titles") + +SINGLE_BATTLE_TEST("Nature power plays a move correctly in any background") +{ + u32 environment = 0; + u32 move = MOVE_TRI_ATTACK; + for (u32 j = 0; j < BATTLE_ENVIRONMENT_COUNT; j++) + { + PARAMETRIZE {environment = i;} + } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + Environment(environment); + if (gBattleEnvironmentInfo[environment].naturePower) + move = gBattleEnvironmentInfo[environment].naturePower; + } WHEN { + TURN { MOVE(player, MOVE_NATURE_POWER); } + } SCENE { + NOT MESSAGE("Nature Power turned into Nature Power!"); + ANIMATION(ANIM_TYPE_MOVE, move, player); + } +} diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index cc036f2069..9633346ffe 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -2181,6 +2181,13 @@ void Shiny_(u32 sourceLine, bool32 isShiny) DATA.isShiny = isShiny; } +void Environment_(u32 sourceLine, u32 environment) +{ + INVALID_IF(DATA.forcedEnvironment, "Environment is already set"); + INVALID_IF(environment >= BATTLE_ENVIRONMENT_COUNT, "Illegal environment: %d", environment); + DATA.forcedEnvironment = environment + 1; +} + static const char *const sBattlerIdentifiersSingles[] = { "player", @@ -3104,6 +3111,11 @@ u32 TestRunner_Battle_GetForcedAbility(u32 side, u32 partyIndex) return DATA.forcedAbilities[side][partyIndex]; } +u32 TestRunner_Battle_GetForcedEnvironment(void) +{ + return DATA.forcedEnvironment; +} + u32 TestRunner_Battle_GetChosenGimmick(u32 side, u32 partyIndex) { return DATA.chosenGimmick[side][partyIndex];