diff options
Diffstat (limited to 'src/battle_main.c')
-rw-r--r-- | src/battle_main.c | 194 |
1 files changed, 104 insertions, 90 deletions
diff --git a/src/battle_main.c b/src/battle_main.c index 2d24d0dab..9afbc7f40 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -41,6 +41,7 @@ #include "pokedex.h" #include "constants/abilities.h" #include "constants/moves.h" +#include "constants/rgb.h" #include "evolution_scene.h" #include "roamer.h" #include "tv.h" @@ -137,13 +138,13 @@ static void sub_803980C(struct Sprite *sprite); static void sub_8039838(struct Sprite *sprite); static void sub_8039894(struct Sprite *sprite); static void sub_80398D0(struct Sprite *sprite); -static void sub_8039A48(struct Sprite *sprite); +static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite); static void sub_8039AF4(struct Sprite *sprite); static void SpriteCallbackDummy_3(struct Sprite *sprite); static void oac_poke_ally_(struct Sprite *sprite); static void SpecialStatusesClear(void); static void TurnValuesCleanUp(bool8 var0); -static void SpriteCB_HealthBoxBounce(struct Sprite *sprite); +static void SpriteCB_BounceEffect(struct Sprite *sprite); static void BattleStartClearSetData(void); static void BattleIntroGetMonsData(void); static void BattleIntroPrepareBackgroundSlide(void); @@ -183,7 +184,7 @@ static void HandleAction_SafariZoneBallThrow(void); static void HandleAction_ThrowPokeblock(void); static void HandleAction_GoNear(void); static void HandleAction_SafriZoneRun(void); -static void HandleAction_Action9(void); +static void HandleAction_WallyBallThrow(void); static void HandleAction_Action11(void); static void HandleAction_NothingIsFainted(void); static void HandleAction_ActionFinished(void); @@ -515,7 +516,7 @@ static void (* const sTurnActionsFuncsTable[])(void) = HandleAction_ThrowPokeblock, // B_ACTION_SAFARI_POKEBLOCK HandleAction_GoNear, // B_ACTION_SAFARI_GO_NEAR HandleAction_SafriZoneRun, // B_ACTION_SAFARI_RUN - HandleAction_Action9, // B_ACTION_UNKNOWN9 + HandleAction_WallyBallThrow, // B_ACTION_WALLY_THROW HandleAction_RunBattleScript, // B_ACTION_EXEC_SCRIPT HandleAction_Action11, // not sure about this one HandleAction_ActionFinished, // B_ACTION_FINISHED @@ -532,7 +533,7 @@ static void (* const sEndTurnFuncsTable[])(void) = HandleEndTurn_FinishBattle, // B_OUTCOME_PLAYER_TELEPORTED HandleEndTurn_MonFled, // B_OUTCOME_MON_FLED HandleEndTurn_FinishBattle, // B_OUTCOME_CAUGHT - HandleEndTurn_FinishBattle, // battle outcome 8 + HandleEndTurn_FinishBattle, // B_OUTCOME_NO_SAFARI_BALLS HandleEndTurn_FinishBattle, // B_OUTCOME_FORFEITED HandleEndTurn_FinishBattle, // B_OUTCOME_MON_TELEPORTED }; @@ -678,7 +679,7 @@ static void CB2_InitBattleInternal(void) gMain.inBattle = TRUE; gSaveBlock2Ptr->field_CA9_b = 0; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) AdjustFriendship(&gPlayerParty[i], 3); gBattleCommunication[MULTIUSE_STATE] = 0; @@ -739,7 +740,7 @@ static void SetPlayerBerryDataInBattleStruct(void) } else { - const struct Berry* berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY)); + const struct Berry *berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY)); for (i = 0; i < BERRY_NAME_COUNT - 1; i++) battleBerry->name[i] = berryData->name[i]; @@ -783,7 +784,7 @@ static void SetAllPlayersBerryData(void) } else { - const struct Berry* berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY)); + const struct Berry *berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY)); for (i = 0; i < BERRY_NAME_COUNT - 1; i++) { @@ -809,7 +810,7 @@ static void SetAllPlayersBerryData(void) { s32 numPlayers; struct BattleEnigmaBerry *src; - u8 r4; + u8 battlerId; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { @@ -821,17 +822,17 @@ static void SetAllPlayersBerryData(void) for (i = 0; i < numPlayers; i++) { src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2); - r4 = gLinkPlayers[i].lp_field_18; + battlerId = gLinkPlayers[i].lp_field_18; for (j = 0; j < BERRY_NAME_COUNT - 1; j++) - gEnigmaBerries[r4].name[j] = src->name[j]; - gEnigmaBerries[r4].name[j] = EOS; + gEnigmaBerries[battlerId].name[j] = src->name[j]; + gEnigmaBerries[battlerId].name[j] = EOS; for (j = 0; j < BERRY_ITEM_EFFECT_COUNT; j++) - gEnigmaBerries[r4].itemEffect[j] = src->itemEffect[j]; + gEnigmaBerries[battlerId].itemEffect[j] = src->itemEffect[j]; - gEnigmaBerries[r4].holdEffect = src->holdEffect; - gEnigmaBerries[r4].holdEffectParam = src->holdEffectParam; + gEnigmaBerries[battlerId].holdEffect = src->holdEffect; + gEnigmaBerries[battlerId].holdEffectParam = src->holdEffectParam; } } else @@ -1382,7 +1383,7 @@ static void CB2_PreInitMultiBattle(void) u8 playerMultiplierId; s32 numPlayers = 4; u8 r4 = 0xF; - u32* savedBattleTypeFlags; + u32 *savedBattleTypeFlags; void (**savedCallback)(void); if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) @@ -1476,7 +1477,7 @@ static void CB2_PreInitMultiBattle(void) static void CB2_PreInitIngamePlayerPartnerBattle(void) { - u32* savedBattleTypeFlags; + u32 *savedBattleTypeFlags; void (**savedCallback)(void); savedCallback = &gBattleStruct->savedCallback; @@ -1819,7 +1820,7 @@ void BattleMainCB2(void) { gSpecialVar_Result = gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; ResetPaletteFadeControl(); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); SetMainCallback2(CB2_QuitRecordedBattle); } } @@ -2026,7 +2027,7 @@ void sub_8038A04(void) // unused void VBlankCB_Battle(void) { - // change gRngSeed every vblank unless the battle could be recorded + // Change gRngSeed every vblank unless the battle could be recorded. if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_RECORDED))) Random(); @@ -2192,7 +2193,7 @@ void sub_8038D64(void) } for (i = 80; i < 160; i++) { - asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter + asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter. gScanlineEffectRegBuffers[0][i] = 0xFF10; gScanlineEffectRegBuffers[1][i] = 0xFF10; } @@ -2255,7 +2256,7 @@ static void sub_8038F34(void) case 1: if (--gBattleCommunication[1] == 0) { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); gBattleCommunication[MULTIUSE_STATE]++; } break; @@ -2312,7 +2313,7 @@ static void sub_8038F34(void) for (i = 0; i < 2; i++) LoadChosenBattleElement(i); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(-1, 0, 0x10, 0, RGB_BLACK); gBattleCommunication[MULTIUSE_STATE]++; break; case 4: @@ -2417,7 +2418,7 @@ static void sub_80392A8(void) gReservedSpritePaletteCount = 4; SetVBlankCallback(VBlankCB_Battle); SetMainCallback2(sub_803937C); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(-1, 0, 0x10, 0, RGB_BLACK); gBattleCommunication[MULTIUSE_STATE] = 0; } @@ -2577,7 +2578,7 @@ static void sub_803939C(void) { if (sub_800A520() == TRUE) { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); gBattleCommunication[1] = 0x20; gBattleCommunication[MULTIUSE_STATE] = 8; } @@ -2585,7 +2586,7 @@ static void sub_803939C(void) } else { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); gBattleCommunication[1] = 0x20; gBattleCommunication[MULTIUSE_STATE] = 8; } @@ -2620,7 +2621,7 @@ void oac_poke_opponent(struct Sprite *sprite) { sprite->callback = sub_803980C; StartSpriteAnimIfDifferent(sprite, 0); - BeginNormalPaletteFade(0x20000, 0, 10, 10, 0x2108); + BeginNormalPaletteFade(0x20000, 0, 10, 10, RGB(8, 8, 8)); } static void sub_803980C(struct Sprite *sprite) @@ -2643,7 +2644,7 @@ static void sub_8039838(struct Sprite *sprite) SetHealthboxSpriteVisible(gHealthboxSpriteIds[sprite->sBattler]); sprite->callback = sub_8039894; StartSpriteAnimIfDifferent(sprite, 0); - BeginNormalPaletteFade(0x20000, 0, 10, 0, 0x2108); + BeginNormalPaletteFade(0x20000, 0, 10, 0, RGB(8, 8, 8)); } } @@ -2687,7 +2688,7 @@ static void sub_80398D0(struct Sprite *sprite) extern const struct MonCoords gMonFrontPicCoords[]; extern const struct MonCoords gCastformFrontSpriteCoords[]; -void sub_8039934(struct Sprite *sprite) +void SpriteCB_FaintOpponentMon(struct Sprite *sprite) { u8 battler = sprite->sBattler; u16 species; @@ -2698,7 +2699,7 @@ void sub_8039934(struct Sprite *sprite) else species = sprite->sSpeciesId; - GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); // Unused return value + GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); // Unused return value. if (species == SPECIES_UNOWN) { @@ -2707,9 +2708,9 @@ void sub_8039934(struct Sprite *sprite) u16 unownSpecies; if (unownForm == 0) - unownSpecies = SPECIES_UNOWN; // Use the A Unown form + unownSpecies = SPECIES_UNOWN; // Use the A Unown form. else - unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters + unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters. yOffset = gMonFrontPicCoords[unownSpecies].y_offset; } @@ -2728,25 +2729,23 @@ void sub_8039934(struct Sprite *sprite) sprite->data[3] = 8 - yOffset / 8; sprite->data[4] = 1; - sprite->callback = sub_8039A48; + sprite->callback = SpriteCB_AnimFaintOpponent; } -static void sub_8039A48(struct Sprite *sprite) +static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite) { s32 i; - sprite->data[4]--; - if (sprite->data[4] == 0) + if (--sprite->data[4] == 0) { sprite->data[4] = 2; - sprite->pos2.y += 8; - sprite->data[3]--; - if (sprite->data[3] < 0) + sprite->pos2.y += 8; // Move the sprite down. + if (--sprite->data[3] < 0) { FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } - else + else // Erase bottom part of the sprite to create a smooth illusion of mon falling down. { u8 *dst = (u8 *)gMonSpritesGfxPtr->sprites[GetBattlerPosition(sprite->sBattler)] + (gBattleMonForms[sprite->sBattler] << 11) + (sprite->data[3] << 8); @@ -2831,85 +2830,100 @@ void sub_8039C00(struct Sprite *sprite) } } -void dp11b_obj_instanciate(u8 battler, u8 b, s8 c, s8 d) +#define sSinIndex data[0] +#define sDelta data[1] +#define sAmplitude data[2] +#define sBouncerSpriteId data[3] +#define sWhich data[4] + +void DoBounceEffect(u8 battler, u8 which, s8 delta, s8 amplitude) { - u8 bounceHealthBoxSpriteId; - u8 spriteId2; + u8 invisibleSpriteId; + u8 bouncerSpriteId; - if (b) + switch (which) { - if (gBattleSpritesDataPtr->healthBoxesData[battler].flag_x2) + case BOUNCE_HEALTHBOX: + default: + if (gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing) return; - } - else - { - if (gBattleSpritesDataPtr->healthBoxesData[battler].flag_x4) + break; + case BOUNCE_MON: + if (gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing) return; + break; } - bounceHealthBoxSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_HealthBoxBounce); - if (b == TRUE) + invisibleSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_BounceEffect); + if (which == BOUNCE_HEALTHBOX) { - spriteId2 = gHealthboxSpriteIds[battler]; - gBattleSpritesDataPtr->healthBoxesData[battler].field_2 = bounceHealthBoxSpriteId; - gBattleSpritesDataPtr->healthBoxesData[battler].flag_x2 = 1; - gSprites[bounceHealthBoxSpriteId].data[0] = 0x80; + bouncerSpriteId = gHealthboxSpriteIds[battler]; + gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId = invisibleSpriteId; + gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing = 1; + gSprites[invisibleSpriteId].sSinIndex = 128; // 0 } else { - spriteId2 = gBattlerSpriteIds[battler]; - gBattleSpritesDataPtr->healthBoxesData[battler].field_3 = bounceHealthBoxSpriteId; - gBattleSpritesDataPtr->healthBoxesData[battler].flag_x4 = 1; - gSprites[bounceHealthBoxSpriteId].data[0] = 0xC0; - } - gSprites[bounceHealthBoxSpriteId].data[1] = c; - gSprites[bounceHealthBoxSpriteId].data[2] = d; - gSprites[bounceHealthBoxSpriteId].data[3] = spriteId2; - gSprites[bounceHealthBoxSpriteId].data[4] = b; - gSprites[spriteId2].pos2.x = 0; - gSprites[spriteId2].pos2.y = 0; + bouncerSpriteId = gBattlerSpriteIds[battler]; + gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId = invisibleSpriteId; + gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing = 1; + gSprites[invisibleSpriteId].sSinIndex = 192; // -1 + } + gSprites[invisibleSpriteId].sDelta = delta; + gSprites[invisibleSpriteId].sAmplitude = amplitude; + gSprites[invisibleSpriteId].sBouncerSpriteId = bouncerSpriteId; + gSprites[invisibleSpriteId].sWhich = which; + gSprites[bouncerSpriteId].pos2.x = 0; + gSprites[bouncerSpriteId].pos2.y = 0; } -void dp11b_obj_free(u8 battler, bool8 b) +void EndBounceEffect(u8 battler, u8 which) { - u8 r4; + u8 bouncerSpriteId; - if (b == TRUE) + if (which == BOUNCE_HEALTHBOX) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].flag_x2) + if (!gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing) return; - r4 = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].field_2].data[3]; - DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].field_2]); - gBattleSpritesDataPtr->healthBoxesData[battler].flag_x2 = 0; + bouncerSpriteId = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId].sBouncerSpriteId; + DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId]); + gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing = 0; } else { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].flag_x4) + if (!gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing) return; - r4 = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].field_3].data[3]; - DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].field_3]); - gBattleSpritesDataPtr->healthBoxesData[battler].flag_x4 = 0; + bouncerSpriteId = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId].sBouncerSpriteId; + DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId]); + gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing = 0; } - gSprites[r4].pos2.x = 0; - gSprites[r4].pos2.y = 0; + + gSprites[bouncerSpriteId].pos2.x = 0; + gSprites[bouncerSpriteId].pos2.y = 0; } -static void SpriteCB_HealthBoxBounce(struct Sprite *sprite) +static void SpriteCB_BounceEffect(struct Sprite *sprite) { - u8 spriteId = sprite->data[3]; - s32 var; + u8 bouncerSpriteId = sprite->sBouncerSpriteId; + s32 index; - if (sprite->data[4] == 1) - var = sprite->data[0]; + if (sprite->sWhich == BOUNCE_HEALTHBOX) + index = sprite->sSinIndex; else - var = sprite->data[0]; + index = sprite->sSinIndex; - gSprites[spriteId].pos2.y = Sin(var, sprite->data[2]) + sprite->data[2]; - sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF; + gSprites[bouncerSpriteId].pos2.y = Sin(index, sprite->sAmplitude) + sprite->sAmplitude; + sprite->sSinIndex = (sprite->sSinIndex + sprite->sDelta) & 0xFF; } +#undef sSinIndex +#undef sDelta +#undef sAmplitude +#undef sBouncerSpriteId +#undef sWhich + void sub_8039E44(struct Sprite *sprite) { if (sprite->affineAnimEnded) @@ -4272,7 +4286,7 @@ static void HandleTurnActionSelectionState(void) if (gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].status2 & STATUS2_MULTIPLETURNS || gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].status2 & STATUS2_RECHARGE) { - BtlController_EmitCmd50(0); + BtlController_EmitEndBounceEffect(0); MarkBattlerForControllerExec(gActiveBattler); return; } @@ -4300,7 +4314,7 @@ static void HandleTurnActionSelectionState(void) { RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 3); } - BtlController_EmitCmd50(0); + BtlController_EmitEndBounceEffect(0); MarkBattlerForControllerExec(gActiveBattler); return; } @@ -4439,7 +4453,7 @@ static void HandleTurnActionSelectionState(void) gHitMarker |= HITMARKER_RUN; gBattleCommunication[gActiveBattler]++; break; - case B_ACTION_UNKNOWN9: + case B_ACTION_WALLY_THROW: gBattleCommunication[gActiveBattler]++; break; } @@ -5776,7 +5790,7 @@ static void HandleAction_SafriZoneRun(void) gBattleOutcome = B_OUTCOME_RAN; } -static void HandleAction_Action9(void) +static void HandleAction_WallyBallThrow(void) { gBattlerAttacker = gBattleTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; |