Added scripted double wild battles

This commit is contained in:
Aaron B-D 2020-10-19 14:47:32 -04:00
parent 1df696c1fb
commit b83a87c8e8
7 changed files with 77 additions and 0 deletions

View File

@ -1778,3 +1778,21 @@
setfieldeffectargument 2, \priority setfieldeffectargument 2, \priority
dofieldeffect FLDEFF_SPARKLE dofieldeffect FLDEFF_SPARKLE
.endm .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

View File

@ -227,6 +227,8 @@ gScriptCmdTable:: @ 81DB67C
.4byte ScrCmd_warpsootopolislegend @ 0xe0 .4byte ScrCmd_warpsootopolislegend @ 0xe0
.4byte ScrCmd_buffercontesttype @ 0xe1 .4byte ScrCmd_buffercontesttype @ 0xe1
.4byte ScrCmd_bufferitemnameplural @ 0xe2 .4byte ScrCmd_bufferitemnameplural @ 0xe2
.4byte ScrCmd_setdoublewildbattle @ 0xe3
.4byte ScrCmd_dodoublewildbattle @ 0xe4
gScriptCmdTableEnd:: @ 81DBA08 gScriptCmdTableEnd:: @ 81DBA08
.4byte ScrCmd_nop .4byte ScrCmd_nop

View File

@ -24,6 +24,7 @@ void BattleSetup_StartBattlePikeWildBattle(void);
void BattleSetup_StartRoamerBattle(void); void BattleSetup_StartRoamerBattle(void);
void StartWallyTutorialBattle(void); void StartWallyTutorialBattle(void);
void BattleSetup_StartScriptedWildBattle(void); void BattleSetup_StartScriptedWildBattle(void);
void BattleSetup_StartScriptedDoubleWildBattle(void);
void BattleSetup_StartLatiBattle(void); void BattleSetup_StartLatiBattle(void);
void BattleSetup_StartLegendaryBattle(void); void BattleSetup_StartLegendaryBattle(void);
void StartGroudonKyogreBattle(void); void StartGroudonKyogreBattle(void);

View File

@ -4,6 +4,7 @@
u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8); u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8);
u8 ScriptGiveEgg(u16); u8 ScriptGiveEgg(u16);
void CreateScriptedWildMon(u16, u8, u16); void CreateScriptedWildMon(u16, u8, u16);
void CreateScriptedDoubleWildMon(u16, u8, u16, u16, u8, u16);
void ScriptSetMonMoveSlot(u8, u16, u8); void ScriptSetMonMoveSlot(u8, u16, u8);
void ReducePlayerPartyToSelectedMons(void); void ReducePlayerPartyToSelectedMons(void);
void HealPlayerParty(void); void HealPlayerParty(void);

View File

@ -499,6 +499,18 @@ void BattleSetup_StartScriptedWildBattle(void)
TryUpdateGymLeaderRematchFromWild(); 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) void BattleSetup_StartLatiBattle(void)
{ {
ScriptContext2_Enable(); ScriptContext2_Enable();

View File

@ -2302,3 +2302,23 @@ bool8 ScrCmd_warpsootopolislegend(struct ScriptContext *ctx)
ResetInitialPlayerAvatarState(); ResetInitialPlayerAvatarState();
return TRUE; 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;
}

View File

@ -147,6 +147,29 @@ void CreateScriptedWildMon(u16 species, u8 level, u16 item)
SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem); 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) void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot)
{ {