diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1891ea9285..f1a03b7af7 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7189,7 +7189,7 @@ static void Cmd_forcerandomswitch(void) s32 battler2PartyId = 0; s32 firstMonId; - s32 lastMonId = 0; // + 1 + s32 lastMonId = 0; s32 monsCount; struct Pokemon *party = NULL; s32 validMons = 0; @@ -7209,12 +7209,20 @@ static void Cmd_forcerandomswitch(void) if ((gBattlerTarget & BIT_FLANK) != B_FLANK_LEFT) { firstMonId = PARTY_SIZE / 2; + #ifdef BUGFIX + lastMonId = PARTY_SIZE - 1; + #else lastMonId = PARTY_SIZE; + #endif } else { firstMonId = 0; + #ifdef BUGFIX + lastMonId = PARTY_SIZE / 2 - 1; + #else lastMonId = PARTY_SIZE / 2; + #endif } monsCount = PARTY_SIZE / 2; minNeeded = 1; @@ -7227,12 +7235,20 @@ static void Cmd_forcerandomswitch(void) if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gBattlerTarget)) == B_FLANK_RIGHT) { firstMonId = PARTY_SIZE / 2; + #ifdef BUGFIX + lastMonId = PARTY_SIZE - 1; + #else lastMonId = PARTY_SIZE; + #endif } else { firstMonId = 0; + #ifdef BUGFIX + lastMonId = PARTY_SIZE / 2 - 1; + #else lastMonId = PARTY_SIZE / 2; + #endif } monsCount = PARTY_SIZE / 2; minNeeded = 1; @@ -7244,7 +7260,11 @@ static void Cmd_forcerandomswitch(void) if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) { firstMonId = 0; + #ifdef BUGFIX + lastMonId = PARTY_SIZE - 1; + #else lastMonId = PARTY_SIZE; + #endif monsCount = PARTY_SIZE; minNeeded = 2; // since there are two opponents, it has to be a double battle } @@ -7253,12 +7273,20 @@ static void Cmd_forcerandomswitch(void) if ((gBattlerTarget & BIT_FLANK) != B_FLANK_LEFT) { firstMonId = PARTY_SIZE / 2; + #ifdef BUGFIX + lastMonId = PARTY_SIZE - 1; + #else lastMonId = PARTY_SIZE; + #endif } else { firstMonId = 0; + #ifdef BUGFIX + lastMonId = PARTY_SIZE / 2 - 1; + #else lastMonId = PARTY_SIZE / 2; + #endif } monsCount = PARTY_SIZE / 2; minNeeded = 1; @@ -7269,7 +7297,11 @@ static void Cmd_forcerandomswitch(void) else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { firstMonId = 0; + #ifdef BUGFIX + lastMonId = PARTY_SIZE - 1; + #else lastMonId = PARTY_SIZE; + #endif monsCount = PARTY_SIZE; minNeeded = 2; battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; @@ -7278,7 +7310,11 @@ static void Cmd_forcerandomswitch(void) else { firstMonId = 0; + #ifdef BUGFIX + lastMonId = PARTY_SIZE - 1; + #else lastMonId = PARTY_SIZE; + #endif monsCount = PARTY_SIZE; minNeeded = 1; battler2PartyId = gBattlerPartyIndexes[gBattlerTarget]; // there is only one Pokémon out in single battles @@ -7301,6 +7337,38 @@ static void Cmd_forcerandomswitch(void) } else { + #ifdef BUGFIX + if (TryDoForceSwitchOut()) + { + do + { + do + { + i = Random() % monsCount; + i += firstMonId; + } + while (i == battler2PartyId || i == battler1PartyId); + } while (GetMonData(&party[i], MON_DATA_SPECIES) == SPECIES_NONE + || GetMonData(&party[i], MON_DATA_IS_EGG) == TRUE + || GetMonData(&party[i], MON_DATA_HP) == 0); //should be one while loop, but that doesn't match. + *(gBattleStruct->monToSwitchIntoId + gBattlerTarget) = i; + + if (!IsMultiBattle()) + SwitchPartyOrder(gBattlerTarget); + + if ((gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + || (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI) + || (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + || (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + SwitchPartyOrderLinkMulti(gBattlerTarget, i, 0); + SwitchPartyOrderLinkMulti(BATTLE_PARTNER(gBattlerTarget), i, 1); + } + + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + SwitchPartyOrderInGameMulti(gBattlerTarget, i); + } + #else if (TryDoForceSwitchOut()) { do @@ -7331,6 +7399,7 @@ static void Cmd_forcerandomswitch(void) if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) SwitchPartyOrderInGameMulti(gBattlerTarget, i); + #endif } } else diff --git a/src/battle_util2.c b/src/battle_util2.c index 8a202c9867..8ecb0a79b4 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -109,12 +109,12 @@ void SwitchPartyOrderInGameMulti(u8 battlerId, u8 arg1) { s32 i; for (i = 0; i < (int)ARRAY_COUNT(gBattlePartyCurrentOrder); i++) - gBattlePartyCurrentOrder[i] = *(0 * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)); + gBattlePartyCurrentOrder[i] = *(i + (u8 *)(gBattleStruct->battlerPartyOrders)); SwitchPartyMonSlots(GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battlerId]), GetPartyIdFromBattlePartyId(arg1)); for (i = 0; i < (int)ARRAY_COUNT(gBattlePartyCurrentOrder); i++) - *(0 * 3 + i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i]; + *(i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i]; } }