diff --git a/include/battle.h b/include/battle.h index 5225b72e31..6d456fd1b9 100644 --- a/include/battle.h +++ b/include/battle.h @@ -472,7 +472,7 @@ struct BattleStruct u8 wishPerishSongBattlerId; bool8 overworldWeatherDone; u8 atkCancellerTracker; - u8 field_1A4[96]; + s16 field_1A4[2][6][4]; u8 field_204[104]; u8 field_26C[40]; u8 AI_monToSwitchIntoId[MAX_BATTLERS_COUNT]; diff --git a/include/tv.h b/include/tv.h index eca11385e8..8235373aec 100644 --- a/include/tv.h +++ b/include/tv.h @@ -16,5 +16,6 @@ size_t sub_80EF370(int value); bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 unused, u8 sheen, u8 language); void SetPokemonAnglerSpecies(u16 species); void UpdateTVShowsPerDay(u16 days); +void PutBattleUpdateOnTheAir(u8 a0, u16 a1, u16 a2, u16 a3); #endif //GUARD_TV_H diff --git a/src/battle_link_817C95C.c b/src/battle_link_817C95C.c index 4b310c2739..f951b3da81 100644 --- a/src/battle_link_817C95C.c +++ b/src/battle_link_817C95C.c @@ -3,8 +3,11 @@ #include "battle.h" #include "battle_link_817C95C.h" #include "constants/battle_string_ids.h" +#include "constants/battle_anim.h" #include "constants/moves.h" +#include "constants/species.h" #include "battle_message.h" +#include "tv.h" struct BattleLinkStringSide { @@ -583,3 +586,136 @@ void sub_817E0FC(u16 move, u16 weatherFlags, struct DisableStruct *disableStruct sub_817E684(11, gBattleMoves[move].type, 0, 0); sub_817E684(12, gBattleMoves[move].type, 0, 0); } + +void sub_817E32C(u8 animationId) +{ + struct UnknownBattleLinkStruct *structPtr; + u32 atkSide; + + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) + return; + + structPtr = (struct UnknownBattleLinkStruct*)(&gBattleStruct->field_204); + atkSide = GetBattlerSide(gBattlerAttacker); + switch (animationId) + { + case B_ANIM_FUTURE_SIGHT_HIT: + if (structPtr->side[atkSide].futureSightMonId != 0) + { + sub_817E684(2, 0, atkSide, + (structPtr->side[atkSide].futureSightMonId - 1) * 4 + structPtr->side[atkSide].futureSightMoveSlot); + structPtr->side[atkSide].field_3_0 = 8; + } + break; + case B_ANIM_DOOM_DESIRE_HIT: + if (structPtr->side[atkSide].doomDesireMonId != 0) + { + sub_817E684(2, 1, atkSide, + (structPtr->side[atkSide].doomDesireMonId - 1) * 4 + structPtr->side[atkSide].doomDesireMoveSlot); + structPtr->side[atkSide].field_3_0 = 9; + } + break; + } +} + +void sub_817E3F4(void) +{ + u16 playerBestSpecies = 0, opponentBestSpecies = 0; + s16 playerBestSum = 0, opponentBestSum = SHRT_MAX; + u8 playerBestMonId = 0, opponentBestMonId = 0; + s16 (*array)[2][6][4] = NULL; + u8 countPlayer = 0, countOpponent = 0; + s16 sum = 0; + u16 moveId = 0; + s32 i, j; + + if (gBattleStruct->field_B3) + return; + + array = &gBattleStruct->field_1A4; + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + countPlayer++; + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + countOpponent++; + } + + if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) || countPlayer != countOpponent) + return; + + for (i = 0; i < PARTY_SIZE; i++) + { + u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL); + if (species != SPECIES_NONE && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG, NULL)) + { + for (sum = 0, j = 0; j < 4; j++) + sum += (*array)[0][i][j]; + + if (playerBestSum < sum) + { + playerBestMonId = i; + playerBestSum = sum; + playerBestSpecies = species; + } + } + + species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL); + if (species != SPECIES_NONE && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG, NULL)) + { + s32 sideId = B_SIDE_OPPONENT; + for (sum = 0, j = 0; j < 4; j++) + sum += (*array)[sideId][i][j]; + + if (opponentBestSum == sum) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_EXP, NULL) > GetMonData(&gEnemyParty[opponentBestMonId], MON_DATA_EXP, NULL)) + { + opponentBestMonId = i; + opponentBestSum = sum; + opponentBestSpecies = species; + } + } + else if (opponentBestSum > sum) + { + opponentBestMonId = i; + opponentBestSum = sum; + opponentBestSpecies = species; + } + } + } + + for (sum = 0, i = 0, j = 0; j < 4; j++) + { + if (sum < (*array)[0][playerBestMonId][j]) + { + sum = (*array)[0][playerBestMonId][j]; + i = j; + } + } + + moveId = GetMonData(&gPlayerParty[playerBestMonId], MON_DATA_MOVE1 + i, NULL); + if (playerBestSum == 0 || moveId == 0) + return; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (playerBestMonId < 3) + { + if (sub_806D82C(gBattleScripting.multiplayerId)) + return; + } + else + { + if (!sub_806D82C(gBattleScripting.multiplayerId)) + return; + } + + j = (opponentBestMonId < 3) ? 0 : 1; + PutBattleUpdateOnTheAir(sub_806EF84(j, gBattleScripting.multiplayerId), moveId, playerBestSpecies, opponentBestSpecies); + } + else + { + PutBattleUpdateOnTheAir(gBattleScripting.multiplayerId ^ 1, moveId, playerBestSpecies, opponentBestSpecies); + } +}