From 59350cc32ff32f7a61890001c781dae5efb09468 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Tue, 24 Jun 2025 15:15:04 +0200 Subject: [PATCH] Increase party action limit (#7119) --- include/battle_controllers.h | 2 +- src/battle_controller_opponent.c | 2 +- src/battle_controller_player.c | 12 ++++++------ src/battle_controller_player_partner.c | 2 +- src/battle_controllers.c | 5 +++-- src/battle_main.c | 10 +++++----- src/battle_script_commands.c | 8 ++++---- 7 files changed, 21 insertions(+), 20 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index e55b3ef6e1..80c8c6ee38 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -298,7 +298,7 @@ void BtlController_EmitChooseAction(u32 battler, u32 bufferId, u8 action, u16 it void BtlController_EmitYesNoBox(u32 battler, u32 bufferId); void BtlController_EmitChooseMove(u32 battler, u32 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData); void BtlController_EmitChooseItem(u32 battler, u32 bufferId, u8 *battlePartyOrder); -void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 *data); +void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 battlerPreventingSwitchout, u8 *data); void BtlController_EmitHealthBarUpdate(u32 battler, u32 bufferId, u16 hpValue); void BtlController_EmitExpUpdate(u32 battler, u32 bufferId, u8 partyId, s32 expPoints); void BtlController_EmitStatusIconUpdate(u32 battler, u32 bufferId, u32 status1, u32 status2); diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 0004e711f7..6cab244d95 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -543,7 +543,7 @@ static void OpponentHandleChoosePokemon(u32 battler) s32 pokemonInBattle = 1; // Choosing Revival Blessing target - if ((gBattleResources->bufferA[battler][1] & 0xF) == PARTY_ACTION_CHOOSE_FAINTED_MON) + if (gBattleResources->bufferA[battler][1] == PARTY_ACTION_CHOOSE_FAINTED_MON) { chosenMonId = gSelectedMonPartyId = GetFirstFaintedPartyIndex(battler); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 78afeb27a6..df3345ed5a 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1557,7 +1557,7 @@ static void WaitForMonSelection(u32 battler) else BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, PARTY_SIZE, NULL); - if ((gBattleResources->bufferA[battler][1] & 0xF) == 1) + if (gBattleResources->bufferA[battler][1] == PARTY_ACTION_SEND_OUT) PrintLinkStandbyMsg(); BtlController_Complete(battler); @@ -2119,9 +2119,9 @@ static void PlayerHandleChoosePokemon(u32 battler) for (i = 0; i < ARRAY_COUNT(gBattlePartyCurrentOrder); i++) gBattlePartyCurrentOrder[i] = gBattleResources->bufferA[battler][4 + i]; - if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CANT_SWITCH - && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_CHOOSE_FAINTED_MON - && (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_SEND_MON_TO_BOX) + if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleResources->bufferA[battler][1] != PARTY_ACTION_CANT_SWITCH + && gBattleResources->bufferA[battler][1] != PARTY_ACTION_CHOOSE_FAINTED_MON + && gBattleResources->bufferA[battler][1] != PARTY_ACTION_SEND_MON_TO_BOX) { BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattlerPartyIndexes[battler] + 1, gBattlePartyCurrentOrder); BtlController_Complete(battler); @@ -2129,8 +2129,8 @@ static void PlayerHandleChoosePokemon(u32 battler) else { gBattleControllerData[battler] = CreateTask(TaskDummy, 0xFF); - gTasks[gBattleControllerData[battler]].data[0] = gBattleResources->bufferA[battler][1] & 0xF; - *(&gBattleStruct->battlerPreventingSwitchout) = gBattleResources->bufferA[battler][1] >> 4; + gTasks[gBattleControllerData[battler]].data[0] = gBattleResources->bufferA[battler][1]; + *(&gBattleStruct->battlerPreventingSwitchout) = gBattleResources->bufferA[battler][8]; *(&gBattleStruct->prevSelectedPartySlot) = gBattleResources->bufferA[battler][2]; *(&gBattleStruct->abilityPreventingSwitchout) = (gBattleResources->bufferA[battler][3] & 0xFF) | (gBattleResources->bufferA[battler][7] << 8); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 11b6e8fa30..513e286d12 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -277,7 +277,7 @@ static void PlayerPartnerHandleChoosePokemon(u32 battler) { s32 chosenMonId; // Choosing Revival Blessing target - if ((gBattleResources->bufferA[battler][1] & 0xF) == PARTY_ACTION_CHOOSE_FAINTED_MON) + if (gBattleResources->bufferA[battler][1] == PARTY_ACTION_CHOOSE_FAINTED_MON) { chosenMonId = gSelectedMonPartyId = GetFirstFaintedPartyIndex(battler); } diff --git a/src/battle_controllers.c b/src/battle_controllers.c index a9b0d875d4..2a5cdbece9 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -1005,7 +1005,7 @@ void BtlController_EmitChooseItem(u32 battler, u32 bufferId, u8 *battlePartyOrde PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 4); } -void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 *data) +void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 slotId, u16 abilityId, u8 battlerPreventingSwitchout, u8 *data) { s32 i; @@ -1014,9 +1014,10 @@ void BtlController_EmitChoosePokemon(u32 battler, u32 bufferId, u8 caseId, u8 sl gBattleResources->transferBuffer[2] = slotId; gBattleResources->transferBuffer[3] = abilityId & 0xFF; gBattleResources->transferBuffer[7] = (abilityId >> 8) & 0xFF; + gBattleResources->transferBuffer[8] = battlerPreventingSwitchout; for (i = 0; i < 3; i++) gBattleResources->transferBuffer[4 + i] = data[i]; - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 8); // Only 7 bytes were written. + PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 9); // Only 7 bytes were written. } static void UNUSED BtlController_EmitCmd23(u32 battler, u32 bufferId) diff --git a/src/battle_main.c b/src/battle_main.c index acfbac6061..68e0cd049c 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4299,21 +4299,21 @@ static void HandleTurnActionSelectionState(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA || !CanBattlerEscape(battler)) { - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); } else if (GetItemHoldEffect(gBattleMons[battler].item) != HOLD_EFFECT_SHED_SHELL && (i = IsAbilityPreventingEscape(battler))) // must be last to keep i value integrity { - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gBattleMons[i - 1].ability, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gBattleMons[i - 1].ability, i - 1, gBattleStruct->battlerPartyOrders[battler]); } else { if (battler == 2 && gChosenActionByBattler[0] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[0], ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[0], ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); else if (battler == 3 && gChosenActionByBattler[1] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[1], ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, gBattleStruct->monToSwitchIntoId[1], ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); else - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); } MarkBattlerForControllerExec(battler); break; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e9b088d93a..04e41aa2cb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7695,7 +7695,7 @@ static void ChooseMonToSendOut(u32 battler, u8 slotId) gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; gBattleStruct->field_93 &= ~(1u << battler); - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); MarkBattlerForControllerExec(battler); } @@ -7873,7 +7873,7 @@ static void Cmd_openpartyscreen(void) gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; gBattleStruct->field_93 &= ~(1u << battler); - BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, hitmarkerFaintBits, gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battler)], ABILITY_NONE, gBattleStruct->battlerPartyOrders[battler]); + BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, hitmarkerFaintBits, gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battler)], ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = cmd->nextInstr; @@ -15953,7 +15953,7 @@ static void Cmd_givecaughtmon(void) case GIVECAUGHTMON_DO_CHOOSE_MON: if (!gPaletteFade.active) { - BtlController_EmitChoosePokemon(gBattlerAttacker, B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_MON_TO_BOX, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); + BtlController_EmitChoosePokemon(gBattlerAttacker, B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_MON_TO_BOX, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); MarkBattlerForControllerExec(gBattlerAttacker); gBattleCommunication[MULTIUSE_STATE] = GIVECAUGHTMON_HANDLE_CHOSEN_MON; } @@ -18020,7 +18020,7 @@ void BS_TryRevivalBlessing(void) else { // Open party menu, wait to go to next instruction. - BtlController_EmitChoosePokemon(gBattlerAttacker, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_FAINTED_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); + BtlController_EmitChoosePokemon(gBattlerAttacker, B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_FAINTED_MON, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[gBattlerAttacker]); MarkBattlerForControllerExec(gBattlerAttacker); } }