diff --git a/asm/macros/event.inc b/asm/macros/event.inc index eafd19b1c2..4186666c7c 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -1778,3 +1778,21 @@ setfieldeffectargument 2, \priority dofieldeffect FLDEFF_SPARKLE .endm + + @ Prepares to start a double wild battle against a species1 at Level level1 holding item1 and a species2 at Level level2 holding item2. + @ Running this command will not affect normal wild battles. You start the prepared battle with dodoublewildbattle. + @ BUG: If the player only has one pokemon, the scripted double battle has undefined behaviours... + .macro setdoublewildbattle species1:req, level1:req, item1:req, species2:req, level2:req, item2:req + .byte 0xe3 + .2byte \species1 + .byte \level1 + .2byte \item1 + .2byte \species2 + .byte \level2 + .2byte \item2 + .endm + + @ Starts a wild battle against the Pokemon generated by setdoublewildbattle. Blocks script execution until the battle finishes. + .macro dodoublewildbattle + .byte 0xe4 + .endm diff --git a/data/script_cmd_table.inc b/data/script_cmd_table.inc index 0971358a14..6911d8e82b 100644 --- a/data/script_cmd_table.inc +++ b/data/script_cmd_table.inc @@ -227,6 +227,8 @@ gScriptCmdTable:: @ 81DB67C .4byte ScrCmd_warpsootopolislegend @ 0xe0 .4byte ScrCmd_buffercontesttype @ 0xe1 .4byte ScrCmd_bufferitemnameplural @ 0xe2 + .4byte ScrCmd_setdoublewildbattle @ 0xe3 + .4byte ScrCmd_dodoublewildbattle @ 0xe4 gScriptCmdTableEnd:: @ 81DBA08 .4byte ScrCmd_nop diff --git a/include/battle_setup.h b/include/battle_setup.h index 1d1a35fa19..4099d5f150 100644 --- a/include/battle_setup.h +++ b/include/battle_setup.h @@ -24,6 +24,7 @@ void BattleSetup_StartBattlePikeWildBattle(void); void BattleSetup_StartRoamerBattle(void); void StartWallyTutorialBattle(void); void BattleSetup_StartScriptedWildBattle(void); +void BattleSetup_StartScriptedDoubleWildBattle(void); void BattleSetup_StartLatiBattle(void); void BattleSetup_StartLegendaryBattle(void); void StartGroudonKyogreBattle(void); diff --git a/include/script_pokemon_util.h b/include/script_pokemon_util.h index 120c28a637..024f2579e5 100644 --- a/include/script_pokemon_util.h +++ b/include/script_pokemon_util.h @@ -4,6 +4,7 @@ u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8); u8 ScriptGiveEgg(u16); void CreateScriptedWildMon(u16, u8, u16); +void CreateScriptedDoubleWildMon(u16, u8, u16, u16, u8, u16); void ScriptSetMonMoveSlot(u8, u16, u8); void ReducePlayerPartyToSelectedMons(void); void HealPlayerParty(void); diff --git a/src/battle_setup.c b/src/battle_setup.c index afa82680f5..1edbbd45f2 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -499,6 +499,18 @@ void BattleSetup_StartScriptedWildBattle(void) TryUpdateGymLeaderRematchFromWild(); } +void BattleSetup_StartScriptedDoubleWildBattle(void) +{ + ScriptContext2_Enable(); + gMain.savedCallback = CB2_EndScriptedWildBattle; + gBattleTypeFlags = BATTLE_TYPE_DOUBLE; + CreateBattleStartTask(GetWildBattleTransition(), 0); + IncrementGameStat(GAME_STAT_TOTAL_BATTLES); + IncrementGameStat(GAME_STAT_WILD_BATTLES); + IncrementDailyWildBattles(); + TryUpdateGymLeaderRematchFromWild(); +} + void BattleSetup_StartLatiBattle(void) { ScriptContext2_Enable(); diff --git a/src/scrcmd.c b/src/scrcmd.c index 578e357fa5..f099e24add 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -2302,3 +2302,23 @@ bool8 ScrCmd_warpsootopolislegend(struct ScriptContext *ctx) ResetInitialPlayerAvatarState(); return TRUE; } + +bool8 ScrCmd_setdoublewildbattle(struct ScriptContext *ctx) +{ + u16 species1 = ScriptReadHalfword(ctx); + u8 level1 = ScriptReadByte(ctx); + u16 item1 = ScriptReadHalfword(ctx); + u16 species2 = ScriptReadHalfword(ctx); + u8 level2 = ScriptReadByte(ctx); + u16 item2 = ScriptReadHalfword(ctx); + + CreateScriptedDoubleWildMon(species1, level1, item1, species2, level2, item2); + return FALSE; +} + +bool8 ScrCmd_dodoublewildbattle(struct ScriptContext *ctx) +{ + BattleSetup_StartScriptedDoubleWildBattle(); + ScriptContext1_Stop(); + return TRUE; +} diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index c9a2127acb..5d79ecae7b 100755 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -147,6 +147,29 @@ void CreateScriptedWildMon(u16 species, u8 level, u16 item) SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem); } } +void CreateScriptedDoubleWildMon(u16 species1, u8 level1, u16 item1, u16 species2, u8 level2, u16 item2) +{ + u8 heldItem1[2]; + u8 heldItem2[2]; + + ZeroEnemyPartyMons(); + + CreateMon(&gEnemyParty[0], species1, level1, 32, 0, 0, OT_ID_PLAYER_ID, 0); + if (item1) + { + heldItem1[0] = item1; + heldItem1[1] = item1 >> 8; + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem1); + } + + CreateMon(&gEnemyParty[3], species2, level2, 32, 0, 0, OT_ID_PLAYER_ID, 0); + if (item2) + { + heldItem2[0] = item2; + heldItem2[1] = item2 >> 8; + SetMonData(&gEnemyParty[3], MON_DATA_HELD_ITEM, heldItem2); + } +} void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot) {