diff options
author | Diegoisawesome <diego@domoreaweso.me> | 2019-02-05 14:35:42 -0600 |
---|---|---|
committer | Diegoisawesome <diego@domoreaweso.me> | 2019-02-05 14:35:42 -0600 |
commit | bc4cc9f78a705636228c39311bb6e3c393f090d3 (patch) | |
tree | d2b59408df53676ffb65e217cc1a62cbcba05f97 /src | |
parent | 37e86d75788f4ed364db19aabce11e6e054a1084 (diff) | |
parent | b0ee1009759ed1c46da81b1fb8410e2b75e42bb2 (diff) |
Merge branch 'master' of github.com:pret/pokeemerald
Diffstat (limited to 'src')
60 files changed, 6397 insertions, 3477 deletions
diff --git a/src/battle_anim_80A9C70.c b/src/battle_anim_80A9C70.c index 001f99d7f..1271680e0 100644 --- a/src/battle_anim_80A9C70.c +++ b/src/battle_anim_80A9C70.c @@ -28,6 +28,182 @@ static void sub_80A9E44(struct Sprite *sprite); static void sub_80A9E78(struct Sprite *sprite); // const rom data +static const union AnimCmd sSpriteAnim_853EDE4[] = +{ + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(4, 3), + ANIMCMD_FRAME(8, 3), + ANIMCMD_FRAME(12, 3), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const sSpriteAnimTable_853EDF8[] = +{ + sSpriteAnim_853EDE4 +}; + +const struct SpriteTemplate gUnknown_0853EDFC = +{ + .tileTag = ANIM_TAG_UNUSED_ORB, + .paletteTag = ANIM_TAG_UNUSED_ORB, + .oam = &gUnknown_0852490C, + .anims = sSpriteAnimTable_853EDF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A8AEC, +}; + +const struct SpriteTemplate gUnknown_0853EE14 = +{ + .tileTag = ANIM_TAG_UNUSED_ORB, + .paletteTag = ANIM_TAG_UNUSED_ORB, + .oam = &gUnknown_0852490C, + .anims = sSpriteAnimTable_853EDF8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A8A6C, +}; + +static const union AnimCmd sSpriteAnim_853EE2C[] = +{ + ANIMCMD_FRAME(0, 3), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const sSpriteAnimTable_853EE34[] = +{ + sSpriteAnim_853EE2C +}; + +const struct SpriteTemplate gUnknown_0853EE38 = +{ + .tileTag = ANIM_TAG_WEATHER_BALL, + .paletteTag = ANIM_TAG_WEATHER_BALL, + .oam = &gUnknown_08524914, + .anims = sSpriteAnimTable_853EE34, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A8E30, +}; + +const struct SpriteTemplate gUnknown_0853EE50 = +{ + .tileTag = ANIM_TAG_WEATHER_BALL, + .paletteTag = ANIM_TAG_WEATHER_BALL, + .oam = &gUnknown_08524914, + .anims = sSpriteAnimTable_853EE34, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A8EE4, +}; + +static const union AnimCmd sSpriteAnim_853EE68[] = +{ + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_FRAME(32, 3), + ANIMCMD_FRAME(48, 3), + ANIMCMD_FRAME(64, 3), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_853EE80[] = +{ + sSpriteAnim_853EE68 +}; + +const struct SpriteTemplate gUnknown_0853EE84 = +{ + .tileTag = ANIM_TAG_SPARKLE_4, + .paletteTag = ANIM_TAG_SPARKLE_4, + .oam = &gUnknown_08524914, + .anims = sSpriteAnimTable_853EE80, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A8B64, +}; + +const struct SpriteTemplate gUnknown_0853EE9C = +{ + .tileTag = ANIM_TAG_UNUSED_MONSTER_FOOT, + .paletteTag = ANIM_TAG_UNUSED_MONSTER_FOOT, + .oam = &gUnknown_08524914, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A8AEC, +}; + +static const union AnimCmd sSpriteAnim_853EEB4[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd sSpriteAnim_853EEBC[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd sSpriteAnim_853EEC4[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const sSpriteAnimTable_853EECC[] = +{ + sSpriteAnim_853EEB4, + sSpriteAnim_853EEBC, + sSpriteAnim_853EEC4 +}; + +const struct SpriteTemplate gUnknown_0853EED8 = +{ + .tileTag = ANIM_TAG_IMPACT, + .paletteTag = ANIM_TAG_IMPACT, + .oam = &gUnknown_08524914, + .anims = sSpriteAnimTable_853EECC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80A8AEC, +}; + +static const union AnimCmd sSpriteAnim_853EEF0[] = +{ + ANIMCMD_FRAME(0, 15), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const sSpriteAnimTable_853EEF8[] = +{ + sSpriteAnim_853EEF0 +}; + +static const union AffineAnimCmd sSpriteAffineAnim_853EEFC[] = +{ + AFFINEANIMCMD_FRAME(96, 96, 0, 0), + AFFINEANIMCMD_FRAME(2, 2, 0, 1), + AFFINEANIMCMD_JUMP(1) +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable_853EEF8[] = +{ + sSpriteAffineAnim_853EEFC +}; + +const struct SpriteTemplate gUnknown_0853EF18 = +{ + .tileTag = ANIM_TAG_UNUSED_ORB, + .paletteTag = ANIM_TAG_UNUSED_ORB, + .oam = &gUnknown_085249CC, + .anims = sSpriteAnimTable_853EEF8, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_853EEF8, + .callback = sub_80A8A6C, +}; + static const struct Subsprite gUnknown_0853EF30[] = { {.x = -16, .y = -16, .shape = ST_OAM_SQUARE, .size = 3, .tileOffset = 0, .priority = 2}, diff --git a/src/battle_bg.c b/src/battle_bg.c index a072a2cda..61a914fc9 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -1037,10 +1037,10 @@ void sub_8035D74(u8 taskId) case 1: palId = AllocSpritePalette(0x2710); gPlttBufferUnfaded[palId * 16 + 0x10F] = gPlttBufferFaded[palId * 16 + 0x10F] = 0x7FFF; - gBattleStruct->field_7D = CreateSprite(&gUnknown_0831A9D0, 111, 80, 0); - gBattleStruct->field_7E = CreateSprite(&gUnknown_0831A9E8, 129, 80, 0); - gSprites[gBattleStruct->field_7D].invisible = TRUE; - gSprites[gBattleStruct->field_7E].invisible = TRUE; + gBattleStruct->linkBattleVsSpriteId_V = CreateSprite(&gUnknown_0831A9D0, 111, 80, 0); + gBattleStruct->linkBattleVsSpriteId_S = CreateSprite(&gUnknown_0831A9E8, 129, 80, 0); + gSprites[gBattleStruct->linkBattleVsSpriteId_V].invisible = TRUE; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].invisible = TRUE; gTasks[taskId].data[0]++; break; case 2: @@ -1071,15 +1071,15 @@ void sub_8035D74(u8 taskId) PlaySE(SE_W231); DestroyTask(taskId); - gSprites[gBattleStruct->field_7D].invisible = FALSE; - gSprites[gBattleStruct->field_7E].invisible = FALSE; - gSprites[gBattleStruct->field_7E].oam.tileNum += 0x40; - gSprites[gBattleStruct->field_7D].data[0] = 0; - gSprites[gBattleStruct->field_7E].data[0] = 1; - gSprites[gBattleStruct->field_7D].data[1] = gSprites[gBattleStruct->field_7D].pos1.x; - gSprites[gBattleStruct->field_7E].data[1] = gSprites[gBattleStruct->field_7E].pos1.x; - gSprites[gBattleStruct->field_7D].data[2] = 0; - gSprites[gBattleStruct->field_7E].data[2] = 0; + gSprites[gBattleStruct->linkBattleVsSpriteId_V].invisible = FALSE; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].invisible = FALSE; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].oam.tileNum += 0x40; + gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[0] = 0; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[0] = 1; + gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[1] = gSprites[gBattleStruct->linkBattleVsSpriteId_V].pos1.x; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[1] = gSprites[gBattleStruct->linkBattleVsSpriteId_S].pos1.x; + gSprites[gBattleStruct->linkBattleVsSpriteId_V].data[2] = 0; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].data[2] = 0; } break; } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index a6a6ac0f3..70b0a6160 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -696,10 +696,10 @@ static void HandleMoveSwitching(void) moveInfo->maxPp[gMoveSelectionCursor[gActiveBattler]] = moveInfo->maxPp[gMultiUsePlayerCursor]; moveInfo->maxPp[gMultiUsePlayerCursor] = i; - if (gDisableStructs[gActiveBattler].unk18_b & gBitTable[gMoveSelectionCursor[gActiveBattler]]) + if (gDisableStructs[gActiveBattler].mimickedMoves & gBitTable[gMoveSelectionCursor[gActiveBattler]]) { - gDisableStructs[gActiveBattler].unk18_b &= (~gBitTable[gMoveSelectionCursor[gActiveBattler]]); - gDisableStructs[gActiveBattler].unk18_b |= gBitTable[gMultiUsePlayerCursor]; + gDisableStructs[gActiveBattler].mimickedMoves &= (~gBitTable[gMoveSelectionCursor[gActiveBattler]]); + gDisableStructs[gActiveBattler].mimickedMoves |= gBitTable[gMultiUsePlayerCursor]; } MoveSelectionDisplayMoveNames(); diff --git a/src/battle_factory.c b/src/battle_factory.c index 5793c78e9..c025dc139 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -11,6 +11,7 @@ #include "constants/species.h" #include "constants/battle_ai.h" #include "constants/battle_frontier.h" +#include "constants/layouts.h" #include "constants/trainers.h" #include "constants/moves.h" @@ -662,7 +663,8 @@ static u8 GetStyleForMove(u16 move) bool8 sub_81A6BF4(void) { - return (gMapHeader.mapLayoutId == 347 || gMapHeader.mapLayoutId == 348); + return gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM + || gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM; } static void sub_81A6C1C(void) diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 3ceaef983..7c6b74304 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -205,13 +205,13 @@ u16 ChooseMoveAndTargetInBattlePalace(void) if (Random() % 100 > 49) { - gProtectStructs[gActiveBattler].flag_x10 = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; return 0; } } else { - gProtectStructs[gActiveBattler].flag_x10 = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; return 0; } } diff --git a/src/battle_intro.c b/src/battle_intro.c index 21e83ed29..043cf855a 100644 --- a/src/battle_intro.c +++ b/src/battle_intro.c @@ -463,10 +463,10 @@ static void BattleIntroSlideLink(u8 taskId) if (--gTasks[taskId].data[2] == 0) { gTasks[taskId].data[0]++; - gSprites[gBattleStruct->field_7D].oam.objMode = ST_OAM_OBJ_WINDOW; - gSprites[gBattleStruct->field_7D].callback = sub_8038B74; - gSprites[gBattleStruct->field_7E].oam.objMode = ST_OAM_OBJ_WINDOW; - gSprites[gBattleStruct->field_7E].callback = sub_8038B74; + gSprites[gBattleStruct->linkBattleVsSpriteId_V].oam.objMode = ST_OAM_OBJ_WINDOW; + gSprites[gBattleStruct->linkBattleVsSpriteId_V].callback = sub_8038B74; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].oam.objMode = ST_OAM_OBJ_WINDOW; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].callback = sub_8038B74; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2); } diff --git a/src/battle_main.c b/src/battle_main.c index 1aeaa25ca..043e75808 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -139,7 +139,7 @@ static void HandleAction_ThrowPokeblock(void); static void HandleAction_GoNear(void); static void HandleAction_SafariZoneRun(void); static void HandleAction_WallyBallThrow(void); -static void HandleAction_Action11(void); +static void HandleAction_TryFinish(void); static void HandleAction_NothingIsFainted(void); static void HandleAction_ActionFinished(void); @@ -553,7 +553,7 @@ static void (* const sTurnActionsFuncsTable[])(void) = [B_ACTION_SAFARI_RUN] = HandleAction_SafariZoneRun, [B_ACTION_WALLY_THROW] = HandleAction_WallyBallThrow, [B_ACTION_EXEC_SCRIPT] = HandleAction_RunBattleScript, - [11] = HandleAction_Action11, // not sure about this one + [B_ACTION_TRY_FINISH] = HandleAction_TryFinish, [B_ACTION_FINISHED] = HandleAction_ActionFinished, [B_ACTION_NOTHING_FAINTED] = HandleAction_NothingIsFainted, }; @@ -3196,7 +3196,7 @@ void SwitchInClearSetData(void) gMoveResultFlags = 0; gDisableStructs[gActiveBattler].isFirstTurn = 2; - gDisableStructs[gActiveBattler].truantUnknownBit = disableStructCopy.truantUnknownBit; + gDisableStructs[gActiveBattler].truantSwitchInHack = disableStructCopy.truantSwitchInHack; gLastMoves[gActiveBattler] = 0; gLastLandedMoves[gActiveBattler] = 0; gLastHitByType[gActiveBattler] = 0; @@ -5492,7 +5492,7 @@ static void HandleAction_UseMove(void) // choose battlescript if (gBattleTypeFlags & BATTLE_TYPE_PALACE - && gProtectStructs[gBattlerAttacker].flag_x10) + && gProtectStructs[gBattlerAttacker].palaceUnableToUseMove) { if (gBattleMons[gBattlerAttacker].hp == 0) { @@ -5845,7 +5845,7 @@ static void HandleAction_WallyBallThrow(void) gActionsByTurnOrder[1] = B_ACTION_FINISHED; } -static void HandleAction_Action11(void) +static void HandleAction_TryFinish(void) { if (!HandleFaintedMonActions()) { diff --git a/src/battle_message.c b/src/battle_message.c index 7b8085219..164108dec 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -37,8 +37,6 @@ struct BattleWindowText u8 shadowColor; }; -extern u8 gUnknown_0203C7B4; - extern const u8 gTrainerClassNames[][13]; extern const u16 gUnknown_08D85620[]; diff --git a/src/battle_pike.c b/src/battle_pike.c index c12038efb..bdf6e8027 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -16,6 +16,7 @@ #include "constants/event_objects.h" #include "constants/battle_frontier.h" #include "constants/abilities.h" +#include "constants/layouts.h" #include "constants/rgb.h" #include "constants/trainers.h" #include "constants/species.h" @@ -1314,8 +1315,10 @@ static void sub_81A8090(void) bool8 InBattlePike(void) { - return (gMapHeader.mapLayoutId == 351 || gMapHeader.mapLayoutId == 352 - || gMapHeader.mapLayoutId == 358 || gMapHeader.mapLayoutId == 359); + return gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM + || gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_RANDOM_ROOM1 + || gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_RANDOM_ROOM3 + || gMapHeader.mapLayoutId == LAYOUT_UNKNOWN_MAP_084693AC; } static void sub_81A80DC(void) diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index c0ff1ecf5..ed911d8d9 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -30,6 +30,7 @@ #include "constants/event_objects.h" #include "constants/event_object_movement_constants.h" #include "constants/items.h" +#include "constants/layouts.h" #include "constants/maps.h" #include "constants/moves.h" #include "constants/species.h" @@ -1380,9 +1381,9 @@ u8 GetPyramidRunMultiplier(void) u8 InBattlePyramid(void) { - if (gMapHeader.mapLayoutId == 361) + if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_EMPTY_SQUARE) return 1; - else if (gMapHeader.mapLayoutId == 378) + else if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP) return 2; else return FALSE; @@ -1390,7 +1391,8 @@ u8 InBattlePyramid(void) bool8 InBattlePyramid_(void) { - return (gMapHeader.mapLayoutId == 361 || gMapHeader.mapLayoutId == 378); + return gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_EMPTY_SQUARE + || gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP; } void sub_81A9E90(void) diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c index 50baf48fd..9bed2ab43 100644 --- a/src/battle_pyramid_bag.c +++ b/src/battle_pyramid_bag.c @@ -853,7 +853,7 @@ static void Task_HandlePyramidBagInput(u8 taskId) } else { - s32 listId = ListMenuHandleInputGetItemId(data[0]); + s32 listId = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition); switch (listId) { @@ -945,9 +945,9 @@ static void HandleFewMenuActionsInput(u8 taskId) s32 id = Menu_ProcessInputNoWrap(); switch (id) { - case -2: + case MENU_NOTHING_CHOSEN: break; - case -1: + case MENU_B_PRESSED: PlaySE(SE_SELECT); sMenuActions[ACTION_CANCEL].func.void_u8(taskId); break; @@ -1285,7 +1285,7 @@ static void Task_ItemSwapHandleInput(u8 taskId) } else { - s32 id = ListMenuHandleInputGetItemId(data[0]); + s32 id = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition); sub_81C7028(FALSE); sub_81C704C(gPyramidBagCursorData.cursorPosition); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0995eec45..6023b2c1b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1243,7 +1243,7 @@ static void atk03_ppreduce(void) gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = 0; if (!(gBattleMons[gBattlerAttacker].status2 & STATUS2_TRANSFORMED) - && !((gDisableStructs[gBattlerAttacker].unk18_b) & gBitTable[gCurrMovePos])) + && !((gDisableStructs[gBattlerAttacker].mimickedMoves) & gBitTable[gCurrMovePos])) { gActiveBattler = gBattlerAttacker; BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBattlerAttacker].pp[gCurrMovePos]); @@ -4233,13 +4233,13 @@ static void atk3D_end(void) gMoveResultFlags = 0; gActiveBattler = 0; - gCurrentActionFuncId = 0xB; + gCurrentActionFuncId = B_ACTION_TRY_FINISH; } static void atk3E_end2(void) { gActiveBattler = 0; - gCurrentActionFuncId = 0xB; + gCurrentActionFuncId = B_ACTION_TRY_FINISH; } static void atk3F_end3(void) // pops the main function stack @@ -5550,10 +5550,12 @@ static void atk52_switchineffects(void) } else { - if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT && !gDisableStructs[gActiveBattler].truantUnknownBit) + // There is a hack here to ensure the truant counter will be 0 when the battler's next turn starts. + // The truant counter is not updated in the case where a mon switches in after a lost judgement in the battle arena. + if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT && !gDisableStructs[gActiveBattler].truantSwitchInHack) gDisableStructs[gActiveBattler].truantCounter = 1; - gDisableStructs[gActiveBattler].truantUnknownBit = 0; + gDisableStructs[gActiveBattler].truantSwitchInHack = 0; if (!AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBattler, 0, 0, 0) && !ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gActiveBattler, FALSE)) @@ -5774,7 +5776,7 @@ static void atk5A_yesnoboxlearnmove(void) if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId && !(gBattleMons[0].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[0].unk18_b & gBitTable[movePosition])) + && !(gDisableStructs[0].mimickedMoves & gBitTable[movePosition])) { RemoveBattleMonPPBonus(&gBattleMons[0], movePosition); SetBattleMonMoveSlot(&gBattleMons[0], gMoveToLearn, movePosition); @@ -5782,7 +5784,7 @@ static void atk5A_yesnoboxlearnmove(void) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && !(gBattleMons[2].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[2].unk18_b & gBitTable[movePosition])) + && !(gDisableStructs[2].mimickedMoves & gBitTable[movePosition])) { RemoveBattleMonPPBonus(&gBattleMons[2], movePosition); SetBattleMonMoveSlot(&gBattleMons[2], gMoveToLearn, movePosition); @@ -6694,14 +6696,14 @@ static void atk76_various(void) gBattleMons[1].hp = 0; gHitMarker |= HITMARKER_FAINTED(1); gBattleStruct->arenaLostOpponentMons |= gBitTable[gBattlerPartyIndexes[1]]; - gDisableStructs[1].truantUnknownBit = 1; + gDisableStructs[1].truantSwitchInHack = 1; break; case VARIOUS_ARENA_PLAYER_MON_LOST: gBattleMons[0].hp = 0; gHitMarker |= HITMARKER_FAINTED(0); gHitMarker |= HITMARKER_x400000; gBattleStruct->arenaLostPlayerMons |= gBitTable[gBattlerPartyIndexes[0]]; - gDisableStructs[0].truantUnknownBit = 1; + gDisableStructs[0].truantSwitchInHack = 1; break; case VARIOUS_ARENA_BOTH_MONS_LOST: gBattleMons[0].hp = 0; @@ -6711,8 +6713,8 @@ static void atk76_various(void) gHitMarker |= HITMARKER_x400000; gBattleStruct->arenaLostPlayerMons |= gBitTable[gBattlerPartyIndexes[0]]; gBattleStruct->arenaLostOpponentMons |= gBitTable[gBattlerPartyIndexes[1]]; - gDisableStructs[0].truantUnknownBit = 1; - gDisableStructs[1].truantUnknownBit = 1; + gDisableStructs[0].truantSwitchInHack = 1; + gDisableStructs[1].truantSwitchInHack = 1; break; case VARIOUS_EMIT_YESNOBOX: BtlController_EmitUnknownYesNoBox(0); @@ -8021,7 +8023,7 @@ static void atk9B_transformdataexecution(void) gDisableStructs[gBattlerAttacker].disabledMove = 0; gDisableStructs[gBattlerAttacker].disableTimer = 0; gDisableStructs[gBattlerAttacker].transformedMonPersonality = gBattleMons[gBattlerTarget].personality; - gDisableStructs[gBattlerAttacker].unk18_b = 0; + gDisableStructs[gBattlerAttacker].mimickedMoves = 0; PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].species) @@ -8095,7 +8097,7 @@ static void atk9D_mimicattackcopy(void) } else { - s32 i; + int i; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -8114,7 +8116,7 @@ static void atk9D_mimicattackcopy(void) PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) - gDisableStructs[gBattlerAttacker].unk18_b |= gBitTable[gCurrMovePos]; + gDisableStructs[gBattlerAttacker].mimickedMoves |= gBitTable[gCurrMovePos]; gBattlescriptCurrInstr += 5; } else @@ -8571,7 +8573,7 @@ static void atkAD_tryspiteppreduce(void) gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; gActiveBattler = gBattlerTarget; - if (!(gDisableStructs[gActiveBattler].unk18_b & gBitTable[i]) + if (!(gDisableStructs[gActiveBattler].mimickedMoves & gBitTable[i]) && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) { BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBattler].pp[i]); diff --git a/src/battle_tent.c b/src/battle_tent.c index de4d9d374..cb8149253 100644 --- a/src/battle_tent.c +++ b/src/battle_tent.c @@ -12,6 +12,7 @@ #include "frontier_util.h" #include "string_util.h" #include "constants/items.h" +#include "constants/layouts.h" #include "constants/region_map_sections.h" #include "constants/species.h" @@ -270,8 +271,8 @@ static void sub_81B9E88(void) bool8 sub_81B9E94(void) { - return (gMapHeader.regionMapSectionId == MAPSEC_SLATEPORT_CITY - && ((gMapHeader.mapLayoutId == 385) | (gMapHeader.mapLayoutId == 386))); + return gMapHeader.regionMapSectionId == MAPSEC_SLATEPORT_CITY + && (gMapHeader.mapLayoutId == LAYOUT_BATTLE_TENT_CORRIDOR || gMapHeader.mapLayoutId == LAYOUT_BATTLE_TENT_BATTLE_ROOM); } static void sub_81B9EC0(void) diff --git a/src/battle_util.c b/src/battle_util.c index 5d8e42482..2f583a9c7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -78,38 +78,38 @@ u8 GetBattlerForBattleScript(u8 caseId) return ret; } -void PressurePPLose(u8 defender, u8 attacker, u16 move) +void PressurePPLose(u8 target, u8 attacker, u16 move) { - s32 i; + int moveIndex; - if (gBattleMons[defender].ability != ABILITY_PRESSURE) + if (gBattleMons[target].ability != ABILITY_PRESSURE) return; - for (i = 0; i < MAX_MON_MOVES; i++) + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (gBattleMons[attacker].moves[i] == move) + if (gBattleMons[attacker].moves[moveIndex] == move) break; } - if (i == MAX_MON_MOVES) // mons don't share any moves + if (moveIndex == MAX_MON_MOVES) return; - if (gBattleMons[attacker].pp[i] != 0) - gBattleMons[attacker].pp[i]--; + if (gBattleMons[attacker].pp[moveIndex] != 0) + gBattleMons[attacker].pp[moveIndex]--; if (!(gBattleMons[attacker].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[attacker].unk18_b & gBitTable[i])) + && !(gDisableStructs[attacker].mimickedMoves & gBitTable[moveIndex])) { gActiveBattler = attacker; - BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBattler].pp[i]); + BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + moveIndex, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]); MarkBattlerForControllerExec(gActiveBattler); } } void PressurePPLoseOnUsingImprision(u8 attacker) { - s32 i, j; - s32 imprisionPos = 4; + int i, j; + int imprisionPos = 4; u8 atkSide = GetBattlerSide(attacker); for (i = 0; i < gBattlersCount; i++) @@ -132,7 +132,7 @@ void PressurePPLoseOnUsingImprision(u8 attacker) if (imprisionPos != 4 && !(gBattleMons[attacker].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[attacker].unk18_b & gBitTable[imprisionPos])) + && !(gDisableStructs[attacker].mimickedMoves & gBitTable[imprisionPos])) { gActiveBattler = attacker; BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + imprisionPos, 0, 1, &gBattleMons[gActiveBattler].pp[imprisionPos]); @@ -142,8 +142,8 @@ void PressurePPLoseOnUsingImprision(u8 attacker) void PressurePPLoseOnUsingPerishSong(u8 attacker) { - s32 i, j; - s32 perishSongPos = 4; + int i, j; + int perishSongPos = 4; for (i = 0; i < gBattlersCount; i++) { @@ -165,7 +165,7 @@ void PressurePPLoseOnUsingPerishSong(u8 attacker) if (perishSongPos != MAX_MON_MOVES && !(gBattleMons[attacker].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[attacker].unk18_b & gBitTable[perishSongPos])) + && !(gDisableStructs[attacker].mimickedMoves & gBitTable[perishSongPos])) { gActiveBattler = attacker; BtlController_EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBattler].pp[perishSongPos]); @@ -175,7 +175,7 @@ void PressurePPLoseOnUsingPerishSong(u8 attacker) void MarkAllBattlersForControllerExec(void) // unused { - s32 i; + int i; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { @@ -314,14 +314,14 @@ u8 TrySetCantSelectMoveBattleScript(void) u8 holdEffect; u16* choicedMove = &gBattleStruct->choicedMove[gActiveBattler]; - if (gDisableStructs[gActiveBattler].disabledMove == move && move != 0) + if (gDisableStructs[gActiveBattler].disabledMove == move && move != MOVE_NONE) { gBattleScripting.battler = gActiveBattler; gCurrentMove = move; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingDisabledMoveInPalace; - gProtectStructs[gActiveBattler].flag_x10 = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; } else { @@ -336,7 +336,7 @@ u8 TrySetCantSelectMoveBattleScript(void) if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingTormentedMoveInPalace; - gProtectStructs[gActiveBattler].flag_x10 = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; } else { @@ -351,7 +351,7 @@ u8 TrySetCantSelectMoveBattleScript(void) if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingNotAllowedMoveTauntInPalace; - gProtectStructs[gActiveBattler].flag_x10 = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; } else { @@ -366,7 +366,7 @@ u8 TrySetCantSelectMoveBattleScript(void) if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { gPalaceSelectionBattleScripts[gActiveBattler] = BattleScript_SelectingImprisionedMoveInPalace; - gProtectStructs[gActiveBattler].flag_x10 = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; } else { @@ -388,7 +388,7 @@ u8 TrySetCantSelectMoveBattleScript(void) gLastUsedItem = gBattleMons[gActiveBattler].item; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - gProtectStructs[gActiveBattler].flag_x10 = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; } else { @@ -401,7 +401,7 @@ u8 TrySetCantSelectMoveBattleScript(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - gProtectStructs[gActiveBattler].flag_x10 = 1; + gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1; } else { @@ -3035,7 +3035,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) MarkBattlerForControllerExec(gActiveBattler); break; case ITEM_PP_CHANGE: - if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[battlerId].unk18_b & gBitTable[i])) + if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[battlerId].mimickedMoves & gBitTable[i])) gBattleMons[battlerId].pp[i] = changedPP; break; } diff --git a/src/cable_club.c b/src/cable_club.c index ce9b9db05..303b0d016 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -27,12 +27,10 @@ #include "task.h" #include "trade.h" #include "trainer_card.h" +#include "party_menu.h" #include "window.h" #include "constants/songs.h" -extern u8 gUnknown_02032298[2]; -extern u8 gSelectedOrderFromParty[]; - static const struct WindowTemplate gUnknown_08550594 = { .bg = 0, .tilemapLeft = 16, diff --git a/src/contest.c b/src/contest.c index 7decf88fc..cf084e35e 100644 --- a/src/contest.c +++ b/src/contest.c @@ -21,6 +21,7 @@ #include "overworld.h" #include "palette.h" #include "random.h" +#include "new_game.h" #include "script.h" #include "sound.h" #include "sprite.h" @@ -42,134 +43,157 @@ #include "international_string_util.h" #include "data2.h" #include "constants/rgb.h" - -extern void (*gFieldCallback)(void); - -void sub_80D782C(void); -void sub_80D7C7C(u8 taskId); -void sub_80D7CB4(u8 taskId); -void sub_80D7DAC(u8 taskId); -void sub_80D7DC8(u8 taskId); -void sub_80D7DE8(u8 taskId); -bool8 sub_80D7E44(u8 *); -void sub_80D80C8(u8 taskId); -void sub_80D8108(u8 taskId); -void vblank_cb_battle(void); -void sub_80D823C(void); -void sub_80D833C(u8 taskId); -void sub_80D8424(u8 taskId); -void sub_80D8610(u8 taskId); -void sub_80D8490(u8 taskId); -void sub_80D880C(s8); -void sub_80D883C(s8); -void sub_80D8894(u8 taskId); -void sub_80D892C(u8 taskId); -void sub_80D895C(u8 taskId); -void sub_80D8A04(u8 taskId); -void sub_80D8A50(u8 taskId); -void sub_80D8A88(u8 taskId); -void sub_80D8B38(u8 taskId); -void sub_80DA110(u8); -void sub_80DA134(struct Sprite *); -void sub_80DA164(struct Sprite *); -void sub_80DA198(u8); -void sub_80DA25C(u8); -void sub_80DA28C(u8); -void sub_80DA31C(u8); -void sub_80DA348(u8); -void sub_80DA38C(u8); -void sub_80DA3CC(u8); -void sub_80DA464(u8); -void sub_80DA49C(u8); -void sub_80DA4CC(u8); -void sub_80DA51C(u8); -void sub_80DA5B4(u8); -void sub_80DA5E8(u8); -void sub_80DA6B4(u8); -void sub_80DA700(u8); -void sub_80DA740(u8); -void sub_80DA7A0(u8); -void sub_80DA7EC(u8); -void sub_80DA830(u8); -void sub_80DA874(void); -bool8 sub_80DA8A4(void); -void sub_80DAF04(u8); -void sub_80DAF1C(u8 a0, u8 a1); -void sub_80DAF88(u8); -void sub_80DAFA0(u8, u8); -u8 sub_80DB0C4(void); -u8 sub_80DB120(void); -u8 sub_80DB174(u16, u32, u32, u32); -void sub_80DB2BC(void); -void prints_contest_move_description(u16); -u16 sub_80DE84C(u16); -void sub_80DB89C(void); -u16 sub_80DB8B8(u8); -void sub_80DB918(void); -bool8 Contest_IsMonsTurnDisabled(u8); -void sub_80DBF68(void); -void sub_80DBF90(void); -void sub_80DC2BC(void); -void sub_80DC490(bool8); -void sub_80DC4F0(void); -void sub_80DC594(void); -void sub_80DC5E8(void); -void sub_80DC7EC(void); -void sub_80DCD48(void); -void sub_80DCE58(u8); -void sub_80DD04C(void); -void sub_80DD590(void); -void sub_80DDB0C(void); -void sub_80DDBE8(void); -bool8 sub_80DE1E8(u8); -void sub_80DE224(void); -void sub_80DE350(void); -void sub_80DE424(u8); -void sub_80DE69C(u8); -void sub_80DEA20(void); -void Contest_PrintTextToBg0WindowAt(u32, u8 *, s32, u8, u8); -void Contest_StartTextPrinter(const u8 *, u8); -void ContestBG_FillBoxWithIncrementingTile(u8, u16, u8, u8, u8, u8, u8, u8); -bool32 Contest_RunTextPrinters(void); -void Contest_SetBgCopyFlags(u32); -void sub_80FC9F8(u8); -bool8 AreMovesContestCombo(u16, u16); -void sub_80DBD18(void); -void sub_80DF250(void); -void sub_80DF4F8(void); -void sub_80DD080(u8); -void sub_80DF080(u8); -void sub_80DF750(void); -void sub_80DE9DC(u8); -void sub_80DCBE8(u8, u8); -u8 sub_80DC9EC(u8); -u16 sub_80DE834(u16); -void sub_80DE864(u8); -void sub_80DEAA8(u16); -void sub_80DE9B0(u8); -void sub_80DC674(u8); -void sub_80DE12C(void); -void sub_80DD45C(u8, u8); -void sub_80DD720(u8); -void sub_80DE008(bool8); -void sub_80DC028(s16, s16, u8); -bool8 sub_80DB5B8(u8, u8); -bool8 sub_80DB798(u8); -void sub_80DB884(void); -void sub_80DC9B4(u8); -void sub_80DDED0(s8, s8); -void sub_80DDCDC(s8); -void sub_80DDE0C(void); -void sub_80DD940(void); -void sub_80DB944(void); -void sub_80DBA18(void); -void sub_80DC3AC(void); -bool8 sub_80DC3C4(void); -void sub_80DF9D4(u8 *); -void sub_80DF9E0(u8 *, s32); -void ContestBG_FillBoxWithTile(u8, u16, u8, u8, u8, u8, u8); -void Contest_PrintTextToBg0WindowStd(u8, const u8 *); - +#include "contest_ai.h" + +extern void sub_80FC9F8(u8); // contest_link_80FC4F4.c + +// This file's functions. +static void sub_80D782C(void); +static void sub_80D7C7C(u8 taskId); +static void sub_80D7CB4(u8 taskId); +static void sub_80D7DAC(u8 taskId); +static void sub_80D7DC8(u8 taskId); +static void sub_80D7DE8(u8 taskId); +static bool8 sub_80D7E44(u8 *); +static void sub_80D80C8(u8 taskId); +static void sub_80D8108(u8 taskId); +static void vblank_cb_battle(void); +static void sub_80D823C(void); +static void sub_80D833C(u8 taskId); +static void sub_80D8424(u8 taskId); +static void sub_80D8610(u8 taskId); +static void sub_80D8490(u8 taskId); +static void sub_80D880C(s8); +static void sub_80D883C(s8); +static void sub_80D8894(u8 taskId); +static void sub_80D892C(u8 taskId); +static void sub_80D895C(u8 taskId); +static void sub_80D8A04(u8 taskId); +static void sub_80D8A50(u8 taskId); +static void sub_80D8A88(u8 taskId); +static void sub_80D8B38(u8 taskId); +static void sub_80DA110(u8); +static void sub_80DA134(struct Sprite *); +static void sub_80DA164(struct Sprite *); +static void sub_80DA198(u8); +static void sub_80DA25C(u8); +static void sub_80DA28C(u8); +static void sub_80DA31C(u8); +static void sub_80DA348(u8); +static void sub_80DA38C(u8); +static void sub_80DA3CC(u8); +static void sub_80DA464(u8); +static void sub_80DA49C(u8); +static void sub_80DA4CC(u8); +static void sub_80DA51C(u8); +static void sub_80DA5B4(u8); +static void sub_80DA5E8(u8); +static void sub_80DA6B4(u8); +static void sub_80DA700(u8); +static void sub_80DA740(u8); +static void sub_80DA7A0(u8); +static void sub_80DA7EC(u8); +static void sub_80DA830(u8); +static void sub_80DA874(void); +static bool8 sub_80DA8A4(void); +static void sub_80DAF04(u8); +static void sub_80DAF1C(u8 a0, u8 a1); +static void sub_80DAF88(u8); +static void sub_80DAFA0(u8, u8); +static u8 sub_80DB0C4(void); +static u8 sub_80DB120(void); +static u8 sub_80DB174(u16, u32, u32, u32); +static void prints_contest_move_description(u16); +static u16 SanitizeSpecies(u16); +static void sub_80DB89C(void); +static u16 GetChosenMove(u8); +static void sub_80DB918(void); +static void sub_80DBF68(void); +static void sub_80DBF90(void); +static void sub_80DC2BC(void); +static void sub_80DC490(bool8); +static void sub_80DC4F0(void); +static void CreateApplauseMeterSprite(void); +static void sub_80DC5E8(void); +static void sub_80DC7EC(void); +static void sub_80DCD48(void); +static void sub_80DD04C(void); +static void sub_80DD590(void); +static void sub_80DDB0C(void); +static void sub_80DDBE8(void); +static void sub_80DE224(void); +static void sub_80DE350(void); +static void sub_80DE424(u8); +static void sub_80DE69C(u8); +static void sub_80DEA20(void); +static void Contest_StartTextPrinter(const u8 *, u32); +static void ContestBG_FillBoxWithIncrementingTile(u8, u16, u8, u8, u8, u8, u8, s16); +static bool32 Contest_RunTextPrinters(void); +static void Contest_SetBgCopyFlags(u32); +static void sub_80DBD18(void); +static void sub_80DD080(u8); +static void sub_80DE9DC(u8); +static void sub_80DCBE8(u8, u8); +static u8 sub_80DC9EC(u8); +static u16 SanitizeMove(u16); +static void sub_80DE864(u8); +static void SelectContestMoveBankTarget(u16); +static void sub_80DE9B0(u8); +static void sub_80DC674(u8); +static void sub_80DE12C(void); +static void sub_80DD45C(u8, u8); +static void sub_80DD720(u8); +static void sub_80DE008(bool8); +static u8 sub_80DC028(s16, s16, u8); +static bool8 sub_80DB5B8(u8, u8); +static bool8 sub_80DB798(u8); +static void sub_80DB884(void); +static void sub_80DC9B4(u8); +static void sub_80DDED0(s8, s8); +static void sub_80DDCDC(s8); +static void sub_80DDE0C(void); +static void sub_80DD940(void); +static void sub_80DB944(void); +static void sub_80DBA18(void); +static void sub_80DC3AC(void); +static bool8 sub_80DC3C4(void); +static void ContestBG_FillBoxWithTile(u8, u16, u8, u8, u8, u8, u8); +static void Contest_PrintTextToBg0WindowStd(u32, const u8 *); +static s16 sub_80DBD34(u8); +static void DetermineFinalStandings(void); +static bool8 sub_80DBF30(s32, s32, struct UnknownContestStruct6 *); +static void sub_80DC0F4(u8); +static void sub_80DC408(struct Sprite *); +static void sub_80DC728(u8); +static void sub_80DC6A4(u8); +static void sub_80DC8D0(u8); +static void sub_80DC81C(u8); +static void sub_80DC87C(u8); +static void sub_80DCC84(struct Sprite *); +static void sub_80DCCD8(struct Sprite *sprite); +static u8 sub_80DDA20(void); +static void c3_08130B10(u8); +static void sub_80DDB6C(u8); +static void task08_080CD1CC(u8); +static void sub_80DDD20(u8); +static void sub_80DDE30(u8); +static void sub_80DDF80(u8); +static const u8 *GetTurnOrderNumberGfx(u8); +static void sub_80DE464(u8); +static void sub_80DE4A8(u8); +static void sub_80DE5F4(u8); +static void sub_80DE65C(u8); +static void sub_80DE794(u8); +static void sub_80DEA5C(void); +static void sub_80DF250(void); +static void sub_80DF4F8(void); +static void sub_80DF080(u8); +static void sub_80DF750(void); +static void sub_80DF9D4(u8 *); +static void sub_80DF9E0(u8 *, s32); +static void sub_80DB2BC(void); + +// EWRAM vars. EWRAM_DATA struct ContestPokemon gContestMons[4] = {0}; EWRAM_DATA s16 gContestMonConditions[4] = {0}; EWRAM_DATA s16 gUnknown_02039F08[4] = {0}; @@ -187,10 +211,13 @@ EWRAM_DATA u16 gSpecialVar_ContestCategory = 0; EWRAM_DATA u16 gSpecialVar_ContestRank = 0; EWRAM_DATA u8 gNumLinkContestPlayers = 0; EWRAM_DATA u8 gHighestRibbonRank = 0; -EWRAM_DATA struct ContestResources * gContestResources = NULL; +EWRAM_DATA struct ContestResources *gContestResources = NULL; EWRAM_DATA u8 sContestBgCopyFlags = 0; EWRAM_DATA struct ContestWinner gUnknown_02039F3C = {0}; +EWRAM_DATA u8 gUnknown_02039F5C = 0; +EWRAM_DATA u8 gUnknown_02039F5D = 0; +// IWRAM common vars. u32 gContestRngValue; extern const u16 gUnknown_08587C30[]; @@ -199,6 +226,7 @@ extern const struct WindowTemplate gUnknown_08587F44[]; extern const u8 *const gUnknown_08587D90[]; extern const u8 *const gUnknown_08587F08[]; extern const u8 *const gUnknown_08587F1C[]; +extern const u8 *const gUnknown_0827E8DA[]; extern const u8 gText_0827D55A[]; extern const u8 gText_0827E793[]; extern const u8 gText_0827E32E[]; @@ -214,6 +242,14 @@ extern const u8 gText_0827E817[]; extern const u8 gText_0827E58A[]; extern const u8 gText_0827D56F[]; extern const u8 gText_0827D597[]; +extern const u8 gText_Contest_Shyness[]; +extern const u8 gText_Contest_Anxiety[]; +extern const u8 gText_Contest_Laziness[]; +extern const u8 gText_Contest_Hesitancy[]; +extern const u8 gText_Contest_Fear[]; +extern const u8 gText_BDot[]; +extern const u8 gText_CDot[]; +extern const u8 *const gUnknown_08587E10[]; extern const struct ContestPokemon gContestOpponents[96]; extern const u8 gUnknown_085898A4[96]; extern const struct CompressedSpriteSheet gUnknown_08587C00; @@ -224,8 +260,25 @@ extern const struct SpriteTemplate gSpriteTemplate_8587C18; extern const union AffineAnimCmd *const gUnknown_082FF6C0[]; extern const union AffineAnimCmd *const gUnknown_082FF694[]; extern const u8 *const gContestEffectDescriptionPointers[]; - -void TaskDummy1(u8 taskId) +extern const struct SpriteSheet gUnknown_08587A74; +extern const u8 gUnknown_08587A6C[]; +extern const struct SpriteTemplate gSpriteTemplate_8587AD0; +extern const struct SpritePalette gUnknown_08587B08; +extern const struct CompressedSpriteSheet gUnknown_08587AE8[]; +extern const struct SpriteTemplate gSpriteTemplate_8587B18[]; +extern const u8 gUnknown_08587A70[]; +extern const struct SubspriteTable gSubspriteTables_8587B80[]; +extern const struct CompressedSpriteSheet gUnknown_08587BB0; +extern const struct SpritePalette gUnknown_08587BB8; +extern const struct SpriteTemplate gSpriteTemplate_8587BC8; +extern void (*const gContestEffectFuncs[])(void); +extern const s8 gContestExcitementTable[][5]; +extern const struct ContestWinner gUnknown_08587FA4[]; +extern const struct CompressedSpriteSheet gUnknown_08589904[]; +extern const struct SpritePalette gUnknown_08589924[]; +extern const struct SpriteTemplate gSpriteTemplate_858998C[]; + +static void TaskDummy1(u8 taskId) { } @@ -234,7 +287,7 @@ void ResetLinkContestBoolean(void) gIsLinkContest = 0; } -void sub_80D7678(void) +static void sub_80D7678(void) { u16 savedIme; @@ -278,7 +331,7 @@ void LoadContestBgAfterMoveAnim(void) } } -void sub_80D779C(void) +static void sub_80D779C(void) { s32 i; @@ -291,7 +344,7 @@ void sub_80D779C(void) } } -void sub_80D77E4(void) +static void sub_80D77E4(void) { InitWindows(gUnknown_08587F44); DeactivateAllTextPrinters(); @@ -305,7 +358,7 @@ void sub_80D77E4(void) } } -void sub_80D782C(void) +static void sub_80D782C(void) { s32 i; @@ -316,7 +369,7 @@ void sub_80D782C(void) FillPalette(RGB(31, 17, 31), 0xF3, 2); } -void sub_80D787C(void) +static void sub_80D787C(void) { s32 i; @@ -347,10 +400,10 @@ void sub_80D787C(void) gContestResources->field_0->unk19218[i] = gUnknown_02039F26[i]; } sub_80DD590(); - *gContestResources->field_1c = (struct ContestResourcesField1C){}; + memset(gContestResources->field_1c, 0, sizeof(*gContestResources->field_1c) * 4); } -void sub_80D7988(void) +static void sub_80D7988(void) { gContestResources = AllocZeroed(sizeof(struct ContestResources)); gContestResources->field_0 = AllocZeroed(sizeof(struct Contest)); @@ -360,7 +413,7 @@ void sub_80D7988(void) gContestResources->field_10 = AllocZeroed(sizeof(struct UnknownContestStruct5) * 4); gContestResources->field_14 = AllocZeroed(sizeof(struct UnknownContestStruct4) * 4); gContestResources->field_18 = AllocZeroed(sizeof(struct ContestStruct_field_18)); - gContestResources->field_1c = AllocZeroed(sizeof(struct ContestResourcesField1C)); + gContestResources->field_1c = AllocZeroed(sizeof(struct ContestResourcesField1C) * 4); gContestResources->field_20 = AllocZeroed(sizeof(struct ContestResourcesField20)); gContestResources->field_24[0] = AllocZeroed(0x1000); gContestResources->field_24[1] = AllocZeroed(0x1000); @@ -373,7 +426,7 @@ void sub_80D7988(void) gUnknown_02023060 = gContestResources->field_24[1]; } -void sub_80D7A5C(void) +static void sub_80D7A5C(void) { FREE_AND_SET_NULL(gContestResources->field_0); FREE_AND_SET_NULL(gContestResources->field_4); @@ -400,58 +453,58 @@ void sub_80D7B24(void) { switch (gMain.state) { - case 0: - sContestBgCopyFlags = 0; - sub_80D7988(); - AllocateMonSpritesGfx(); - FREE_AND_SET_NULL(gMonSpritesGfxPtr->firstDecompressed); - gMonSpritesGfxPtr->firstDecompressed = AllocZeroed(0x4000); - SetVBlankCallback(NULL); - sub_80D779C(); - sub_80D77E4(); - sub_80D7678(); - ScanlineEffect_Clear(); - ResetPaletteFade(); - gPaletteFade.bufferTransferDisabled = TRUE; - ResetSpriteData(); - ResetTasks(); - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 4; - //shared18000.unk18000 = 0; - gHeap[0x1a000] = 0; - ClearBattleMonForms(); - sub_80D787C(); - gMain.state++; - break; - case 1: + case 0: + sContestBgCopyFlags = 0; + sub_80D7988(); + AllocateMonSpritesGfx(); + FREE_AND_SET_NULL(gMonSpritesGfxPtr->firstDecompressed); + gMonSpritesGfxPtr->firstDecompressed = AllocZeroed(0x4000); + SetVBlankCallback(NULL); + sub_80D779C(); + sub_80D77E4(); + sub_80D7678(); + ScanlineEffect_Clear(); + ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = TRUE; + ResetSpriteData(); + ResetTasks(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 4; + //shared18000.unk18000 = 0; + gHeap[0x1a000] = 0; + ClearBattleMonForms(); + sub_80D787C(); + gMain.state++; + break; + case 1: + gMain.state++; + break; + case 2: + if (sub_80D7E44(&gContestResources->field_0->unk1925D)) + { + gContestResources->field_0->unk1925D = 0; gMain.state++; - break; - case 2: - if (sub_80D7E44(&gContestResources->field_0->unk1925D)) - { - gContestResources->field_0->unk1925D = 0; - gMain.state++; - } - break; - case 3: - sub_80DE224(); - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - BeginFastPaletteFade(2); - gPaletteFade.bufferTransferDisabled = FALSE; - SetVBlankCallback(vblank_cb_battle); - gContestResources->field_0->mainTaskId = CreateTask(sub_80D7C7C, 10); - SetMainCallback2(sub_80D823C); - if (gIsLinkContest & 2) - { - sub_800E0E8(); - CreateWirelessStatusIndicatorSprite(8, 8); - } - break; + } + break; + case 3: + sub_80DE224(); + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + BeginFastPaletteFade(2); + gPaletteFade.bufferTransferDisabled = FALSE; + SetVBlankCallback(vblank_cb_battle); + gContestResources->field_0->mainTaskId = CreateTask(sub_80D7C7C, 10); + SetMainCallback2(sub_80D823C); + if (gIsLinkContest & 2) + { + sub_800E0E8(); + CreateWirelessStatusIndicatorSprite(8, 8); + } + break; } } -void sub_80D7C7C(u8 taskId) +static void sub_80D7C7C(u8 taskId) { if (!gPaletteFade.active) { @@ -460,7 +513,7 @@ void sub_80D7C7C(u8 taskId) } } -void sub_80D7CB4(u8 taskId) +static void sub_80D7CB4(u8 taskId) { if (gIsLinkContest & 1) { @@ -468,22 +521,22 @@ void sub_80D7CB4(u8 taskId) { switch (gTasks[taskId].data[0]) { - case 0: - sub_80DBF68(); + case 0: + sub_80DBF68(); + gTasks[taskId].data[0]++; + // fallthrough + case 1: + if (IsLinkTaskFinished()) + { + sub_800ADF8(); gTasks[taskId].data[0]++; - // fallthrough - case 1: - if (IsLinkTaskFinished()) - { - sub_800ADF8(); - gTasks[taskId].data[0]++; - } + } + return; + case 2: + if (IsLinkTaskFinished() != TRUE) return; - case 2: - if (IsLinkTaskFinished() != TRUE) - return; - gTasks[taskId].data[0]++; - break; + gTasks[taskId].data[0]++; + break; } } @@ -503,18 +556,18 @@ void sub_80D7CB4(u8 taskId) } } -void sub_80D7DAC(u8 taskId) +static void sub_80D7DAC(u8 taskId) { SetTaskFuncWithFollowupFunc(taskId, sub_80FC998, sub_80D7DC8); } -void sub_80D7DC8(u8 taskId) +static void sub_80D7DC8(u8 taskId) { gTasks[taskId].data[0] = 1; gTasks[taskId].func = sub_80D7DE8; } -void sub_80D7DE8(u8 taskId) +static void sub_80D7DE8(u8 taskId) { gTasks[taskId].data[0]--; if (gTasks[taskId].data[0] <= 0) @@ -526,81 +579,81 @@ void sub_80D7DE8(u8 taskId) } } -u8 sub_80D7E44(u8 *a) +static u8 sub_80D7E44(u8 *a) { u16 sp0[16]; u16 sp20[16]; switch (*a) { - case 0: - gPaletteFade.bufferTransferDisabled = TRUE; - RequestDma3Fill(0, (void *)VRAM, 0x8000, 1); - RequestDma3Fill(0, (void *)VRAM + 0x8000, 0x8000, 1); - RequestDma3Fill(0, (void *)VRAM + 0x10000, 0x8000, 1); - break; - case 1: - LZDecompressVram(gContestMiscGfx, (void *)VRAM); - break; - case 2: - LZDecompressVram(gContestAudienceGfx, (void *)(VRAM + 0x2000)); - DmaCopyLarge32(3, (void *)(VRAM + 0x2000), shared15800, 0x2000, 0x1000); - break; - case 3: - CopyToBgTilemapBuffer(3, gUnknown_08C16FA8, 0, 0); - CopyBgTilemapBufferToVram(3); - break; - case 4: - CopyToBgTilemapBuffer(2, gUnknown_08C17170, 0, 0); - CopyBgTilemapBufferToVram(2); - DmaCopy32Defvars(3, gContestResources->field_24[2], shared18000.unk18A04, 0x800); - break; - case 5: - LoadCompressedPalette(gUnknown_08C16E90, 0, 0x200); - CpuCopy32(gPlttBufferUnfaded + 128, sp0, 16 * sizeof(u16)); - CpuCopy32(gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, sp20, 16 * sizeof(u16)); - CpuCopy32(sp20, gPlttBufferUnfaded + 128, 16 * sizeof(u16)); - CpuCopy32(sp0, gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, 16 * sizeof(u16)); - DmaCopy32Defvars(3, gPlttBufferUnfaded, shared18000.unk18004, 0x200); - sub_80D782C(); - break; - case 6: - sub_80DD04C(); - sub_80DBF90(); - sub_80DB2BC(); - gContestResources->field_0->unk19216 = sub_80DB120(); - sub_80DC2BC(); - sub_80DC4F0(); - sub_80DC594(); - sub_80DC5E8(); - sub_80DC7EC(); - gBattlerPositions[0] = 0; - gBattlerPositions[1] = 1; - gBattlerPositions[2] = 3; - gBattlerPositions[3] = 2; - gBattleTypeFlags = 0; - gBattlerAttacker = 2; - gBattlerTarget = 3; - gBattlerSpriteIds[gBattlerAttacker] = sub_80DB0C4(); - sub_80DEA20(); - CopyBgTilemapBufferToVram(3); - CopyBgTilemapBufferToVram(2); - CopyBgTilemapBufferToVram(1); - ShowBg(3); - ShowBg(2); - ShowBg(0); - ShowBg(1); - break; - default: - *a = 0; - return 1; + case 0: + gPaletteFade.bufferTransferDisabled = TRUE; + RequestDma3Fill(0, (void *)VRAM, 0x8000, 1); + RequestDma3Fill(0, (void *)VRAM + 0x8000, 0x8000, 1); + RequestDma3Fill(0, (void *)VRAM + 0x10000, 0x8000, 1); + break; + case 1: + LZDecompressVram(gContestMiscGfx, (void *)VRAM); + break; + case 2: + LZDecompressVram(gContestAudienceGfx, (void *)(VRAM + 0x2000)); + DmaCopyLarge32(3, (void *)(VRAM + 0x2000), shared15800, 0x2000, 0x1000); + break; + case 3: + CopyToBgTilemapBuffer(3, gUnknown_08C16FA8, 0, 0); + CopyBgTilemapBufferToVram(3); + break; + case 4: + CopyToBgTilemapBuffer(2, gUnknown_08C17170, 0, 0); + CopyBgTilemapBufferToVram(2); + DmaCopy32Defvars(3, gContestResources->field_24[2], shared18000.unk18A04, 0x800); + break; + case 5: + LoadCompressedPalette(gUnknown_08C16E90, 0, 0x200); + CpuCopy32(gPlttBufferUnfaded + 128, sp0, 16 * sizeof(u16)); + CpuCopy32(gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, sp20, 16 * sizeof(u16)); + CpuCopy32(sp20, gPlttBufferUnfaded + 128, 16 * sizeof(u16)); + CpuCopy32(sp0, gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, 16 * sizeof(u16)); + DmaCopy32Defvars(3, gPlttBufferUnfaded, shared18000.unk18004, 0x200); + sub_80D782C(); + break; + case 6: + sub_80DD04C(); + sub_80DBF90(); + sub_80DB2BC(); + gContestResources->field_0->unk19216 = sub_80DB120(); + sub_80DC2BC(); + sub_80DC4F0(); + CreateApplauseMeterSprite(); + sub_80DC5E8(); + sub_80DC7EC(); + gBattlerPositions[0] = 0; + gBattlerPositions[1] = 1; + gBattlerPositions[2] = 3; + gBattlerPositions[3] = 2; + gBattleTypeFlags = 0; + gBattlerAttacker = 2; + gBattlerTarget = 3; + gBattlerSpriteIds[gBattlerAttacker] = sub_80DB0C4(); + sub_80DEA20(); + CopyBgTilemapBufferToVram(3); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(1); + ShowBg(3); + ShowBg(2); + ShowBg(0); + ShowBg(1); + break; + default: + *a = 0; + return 1; } (*a)++; return 0; } -void sub_80D80C8(u8 taskId) +static void sub_80D80C8(u8 taskId) { gPaletteFade.bufferTransferDisabled = FALSE; if (!gPaletteFade.active) @@ -611,52 +664,51 @@ void sub_80D80C8(u8 taskId) } } - -void sub_80D8108(u8 taskId) +static void sub_80D8108(u8 taskId) { switch (gTasks[taskId].data[0]) { - case 0: - if (gTasks[taskId].data[1]++ <= 60) - break; - gTasks[taskId].data[1] = 0; - PlaySE12WithPanning(SE_C_MAKU_U, 0); - gTasks[taskId].data[0]++; - break; - case 1: - (s16)gBattle_BG1_Y += 7; - if ((s16)gBattle_BG1_Y <= 160) - break; - gTasks[taskId].data[0]++; - break; - case 2: - sub_80DE350(); - gTasks[taskId].data[0]++; + case 0: + if (gTasks[taskId].data[1]++ <= 60) break; - case 3: - { - u16 bg0Cnt = GetGpuReg(REG_OFFSET_BG0CNT); - u16 bg2Cnt = GetGpuReg(REG_OFFSET_BG2CNT); - ((struct BgCnt *)&bg0Cnt)->priority = 0; - ((struct BgCnt *)&bg2Cnt)->priority = 0; - SetGpuReg(REG_OFFSET_BG0CNT, bg0Cnt); - SetGpuReg(REG_OFFSET_BG2CNT, bg2Cnt); - sub_80DDB0C(); - gTasks[taskId].data[0]++; + gTasks[taskId].data[1] = 0; + PlaySE12WithPanning(SE_C_MAKU_U, 0); + gTasks[taskId].data[0]++; + break; + case 1: + (s16)gBattle_BG1_Y += 7; + if ((s16)gBattle_BG1_Y <= 160) break; - } - case 4: - default: - if (gContestResources->field_0->unk1920A_6) - break; - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0; - gTasks[taskId].func = sub_80D833C; + gTasks[taskId].data[0]++; + break; + case 2: + sub_80DE350(); + gTasks[taskId].data[0]++; + break; + case 3: + { + u16 bg0Cnt = GetGpuReg(REG_OFFSET_BG0CNT); + u16 bg2Cnt = GetGpuReg(REG_OFFSET_BG2CNT); + ((struct BgCnt *)&bg0Cnt)->priority = 0; + ((struct BgCnt *)&bg2Cnt)->priority = 0; + SetGpuReg(REG_OFFSET_BG0CNT, bg0Cnt); + SetGpuReg(REG_OFFSET_BG2CNT, bg2Cnt); + sub_80DDB0C(); + gTasks[taskId].data[0]++; + break; + } + case 4: + default: + if (gContestResources->field_0->unk1920A_6) break; + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].func = sub_80D833C; + break; } } -void sub_80D823C(void) +static void sub_80D823C(void) { s32 i; @@ -673,7 +725,7 @@ void sub_80D823C(void) sContestBgCopyFlags = 0; } -void vblank_cb_battle(void) +static void vblank_cb_battle(void) { SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X); SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y); @@ -693,7 +745,7 @@ void vblank_cb_battle(void) ScanlineEffect_InitHBlankDmaTransfer(); } -void sub_80D833C(u8 taskId) +static void sub_80D833C(u8 taskId) { if (gTasks[taskId].data[0] == 0) { @@ -721,7 +773,7 @@ void sub_80D833C(u8 taskId) } } -void sub_80D8424(u8 taskId) +static void sub_80D8424(u8 taskId) { if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys == B_BUTTON)) { @@ -738,7 +790,7 @@ void sub_80D8424(u8 taskId) } } -void sub_80D8490(u8 taskId) +static void sub_80D8490(u8 taskId) { u8 i; u8 sp8[32]; @@ -776,7 +828,7 @@ void sub_80D8490(u8 taskId) gTasks[taskId].func = sub_80D8610; } -void sub_80D8610(u8 taskId) +static void sub_80D8610(u8 taskId) { u8 numMoves = 0; s32 i; @@ -796,66 +848,66 @@ void sub_80D8610(u8 taskId) { switch (gMain.newAndRepeatedKeys) { - case B_BUTTON: + case B_BUTTON: + PlaySE(SE_SELECT); + sub_80DC490(FALSE); + ConvertIntToDecimalStringN(gStringVar1, gContestResources->field_0->turnNumber + 1, STR_CONV_MODE_LEFT_ALIGN, 1); + if (!Contest_IsMonsTurnDisabled(gContestPlayerMonIndex)) + StringCopy(gDisplayedStringBattle, gText_0827D507); + else + StringCopy(gDisplayedStringBattle, gText_0827D531); + sub_80DB89C(); + StringExpandPlaceholders(gStringVar4, gDisplayedStringBattle); + Contest_StartTextPrinter(gStringVar4, 0); + gBattle_BG0_Y = 0; + gBattle_BG2_Y = 0; + gTasks[taskId].func = sub_80D8424; + break; + case DPAD_LEFT: + case DPAD_RIGHT: + break; + case DPAD_UP: + sub_80D883C(gContestResources->field_0->playerMoveChoice); + if (gContestResources->field_0->playerMoveChoice == 0) + gContestResources->field_0->playerMoveChoice = numMoves - 1; + else + gContestResources->field_0->playerMoveChoice--; + sub_80D880C(gContestResources->field_0->playerMoveChoice); + prints_contest_move_description(gContestMons[gContestPlayerMonIndex].moves[gContestResources->field_0->playerMoveChoice]); + if (numMoves > 1) PlaySE(SE_SELECT); - sub_80DC490(FALSE); - ConvertIntToDecimalStringN(gStringVar1, gContestResources->field_0->turnNumber + 1, STR_CONV_MODE_LEFT_ALIGN, 1); - if (!Contest_IsMonsTurnDisabled(gContestPlayerMonIndex)) - StringCopy(gDisplayedStringBattle, gText_0827D507); - else - StringCopy(gDisplayedStringBattle, gText_0827D531); - sub_80DB89C(); - StringExpandPlaceholders(gStringVar4, gDisplayedStringBattle); - Contest_StartTextPrinter(gStringVar4, 0); - gBattle_BG0_Y = 0; - gBattle_BG2_Y = 0; - gTasks[taskId].func = sub_80D8424; - break; - case DPAD_LEFT: - case DPAD_RIGHT: - break; - case DPAD_UP: - sub_80D883C(gContestResources->field_0->playerMoveChoice); - if (gContestResources->field_0->playerMoveChoice == 0) - gContestResources->field_0->playerMoveChoice = numMoves - 1; - else - gContestResources->field_0->playerMoveChoice--; - sub_80D880C(gContestResources->field_0->playerMoveChoice); - prints_contest_move_description(gContestMons[gContestPlayerMonIndex].moves[gContestResources->field_0->playerMoveChoice]); - if (numMoves > 1) - PlaySE(SE_SELECT); - break; - case DPAD_DOWN: - sub_80D883C(gContestResources->field_0->playerMoveChoice); - if (gContestResources->field_0->playerMoveChoice == numMoves - 1) - gContestResources->field_0->playerMoveChoice = 0; - else - gContestResources->field_0->playerMoveChoice++; - sub_80D880C(gContestResources->field_0->playerMoveChoice); - prints_contest_move_description(gContestMons[gContestPlayerMonIndex].moves[gContestResources->field_0->playerMoveChoice]); - if (numMoves > 1) - PlaySE(SE_SELECT); - break; + break; + case DPAD_DOWN: + sub_80D883C(gContestResources->field_0->playerMoveChoice); + if (gContestResources->field_0->playerMoveChoice == numMoves - 1) + gContestResources->field_0->playerMoveChoice = 0; + else + gContestResources->field_0->playerMoveChoice++; + sub_80D880C(gContestResources->field_0->playerMoveChoice); + prints_contest_move_description(gContestMons[gContestPlayerMonIndex].moves[gContestResources->field_0->playerMoveChoice]); + if (numMoves > 1) + PlaySE(SE_SELECT); + break; } } } -void sub_80D880C(s8 a0) +static void sub_80D880C(s8 a0) { ContestBG_FillBoxWithIncrementingTile(2, 55, 0, 31 + a0 * 2, 2, 2, 17, 1); } -void sub_80D883C(s8 a0) +static void sub_80D883C(s8 a0) { ContestBG_FillBoxWithIncrementingTile(2, 11, 0, 31 + a0 * 2, 2, 1, 17, 1); ContestBG_FillBoxWithIncrementingTile(2, 11, 0, 32 + a0 * 2, 2, 1, 17, 1); } -void sub_80D8894(u8 taskId) +static void sub_80D8894(u8 taskId) { if (gIsLinkContest & 1) { - u16 var = sub_80DB8B8(gContestPlayerMonIndex); + u16 var = GetChosenMove(gContestPlayerMonIndex); u8 taskId2; gContestResources->field_4[gContestPlayerMonIndex].currMove = var; @@ -872,13 +924,13 @@ void sub_80D8894(u8 taskId) } } -void sub_80D892C(u8 taskId) +static void sub_80D892C(u8 taskId) { DestroyTask(taskId); gTasks[gContestResources->field_0->mainTaskId].func = sub_80D895C; } -void sub_80D895C(u8 taskId) +static void sub_80D895C(u8 taskId) { s32 i; @@ -902,7 +954,7 @@ void sub_80D895C(u8 taskId) gTasks[taskId].func = sub_80D8A04; } -void sub_80D8A04(u8 taskId) +static void sub_80D8A04(u8 taskId) { if (++gTasks[taskId].data[0] > 2) { @@ -916,13 +968,13 @@ void sub_80D8A04(u8 taskId) } } -void sub_80D8A50(u8 taskId) +static void sub_80D8A50(u8 taskId) { if (!gContestResources->field_0->unk1920A_6 && !gContestResources->field_0->unk1920B_1) gTasks[taskId].func = sub_80D8A88; } -void sub_80D8A88(u8 taskId) +static void sub_80D8A88(u8 taskId) { if (++gTasks[taskId].data[0] > 19) { @@ -934,7 +986,7 @@ void sub_80D8A88(u8 taskId) for (i = 0; i + gNumLinkContestPlayers < 4; i++) { - gContestResources->field_4[gNumLinkContestPlayers + i].currMove = sub_80DB8B8(gNumLinkContestPlayers + i); + gContestResources->field_4[gNumLinkContestPlayers + i].currMove = GetChosenMove(gNumLinkContestPlayers + i); } } gTasks[taskId].data[0] = 0; @@ -942,7 +994,7 @@ void sub_80D8A88(u8 taskId) } } -void sub_80D8B38(u8 taskId) +static void sub_80D8B38(u8 taskId) { u8 spriteId; s32 i; @@ -951,247 +1003,247 @@ void sub_80D8B38(u8 taskId) switch (gTasks[taskId].data[0]) { - case 0: - sub_80DCD48(); - for (i = 0; gContestResources->field_0->unk19214 != gContestResources->field_8->turnOrder[i]; i++) - ; - gContestResources->field_0->unk19215 = i; - r6 = gContestResources->field_0->unk19215; - if (gIsLinkContest & 1) - { - u8 taskId2; + case 0: + sub_80DCD48(); + for (i = 0; gContestResources->field_0->unk19214 != gContestResources->field_8->turnOrder[i]; i++) + ; + gContestResources->field_0->unk19215 = i; + r6 = gContestResources->field_0->unk19215; + if (gIsLinkContest & 1) + { + u8 taskId2; - gContestResources->field_0->unk1920B_2 = 1; - if (sub_80DA8A4()) - sub_80DD080(gContestResources->field_0->unk19215); - taskId2 = CreateTask(sub_80FCC88, 0); - SetTaskFuncWithFollowupFunc(taskId2, sub_80FCC88, sub_80DA110); - sub_80DBF68(); - gTasks[taskId].data[0] = 1; - } - else - { + gContestResources->field_0->unk1920B_2 = 1; + if (sub_80DA8A4()) sub_80DD080(gContestResources->field_0->unk19215); - gTasks[taskId].data[0] = 2; - } - return; - case 1: - if (!gContestResources->field_0->unk1920B_2) - gTasks[taskId].data[0] = 2; - return; - case 2: - sub_80DF080(r6); - sub_80DF750(); - if (gContestResources->field_4[r6].numTurnsSkipped != 0 - || gContestResources->field_4[r6].noMoreTurns) - { - gTasks[taskId].data[0] = 31; - } - else - { - sub_80DB89C(); - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0] = 3; - } - return; - case 3: - for (i = 0; i < 4; i++) - gBattleMonForms[i] = 0; - memset(gContestResources->field_18, 0, sizeof(*gContestResources->field_18)); - sub_80DE9DC(gContestResources->field_0->unk19215); - spriteId = sub_80DB174( - gContestMons[gContestResources->field_0->unk19215].species, - gContestMons[gContestResources->field_0->unk19215].otId, - gContestMons[gContestResources->field_0->unk19215].personality, - gContestResources->field_0->unk19215); - gSprites[spriteId].pos2.x = 120; - gSprites[spriteId].callback = sub_80DA134; - gTasks[taskId].data[2] = spriteId; - gBattlerSpriteIds[gBattlerAttacker] = spriteId; - sub_80DCBE8(sub_80DC9EC(gContestResources->field_0->unk19215), FALSE); - gTasks[taskId].data[0] = 4; - return; - case 4: - spriteId = gTasks[taskId].data[2]; - if (gSprites[spriteId].callback == SpriteCallbackDummy) - { - if (!gContestResources->field_14[r6].unk2_1) - gTasks[taskId].data[0] = 5; - } - return; - case 5: - if (gContestResources->field_4[r6].nervous) - { - gTasks[taskId].data[0] = 33; - } + taskId2 = CreateTask(sub_80FCC88, 0); + SetTaskFuncWithFollowupFunc(taskId2, sub_80FCC88, sub_80DA110); + sub_80DBF68(); + gTasks[taskId].data[0] = 1; + } + else + { + sub_80DD080(gContestResources->field_0->unk19215); + gTasks[taskId].data[0] = 2; + } + return; + case 1: + if (!gContestResources->field_0->unk1920B_2) + gTasks[taskId].data[0] = 2; + return; + case 2: + sub_80DF080(r6); + sub_80DF750(); + if (gContestResources->field_4[r6].numTurnsSkipped != 0 + || gContestResources->field_4[r6].noMoreTurns) + { + gTasks[taskId].data[0] = 31; + } + else + { + sub_80DB89C(); + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 3; + } + return; + case 3: + for (i = 0; i < 4; i++) + gBattleMonForms[i] = 0; + memset(gContestResources->field_18, 0, sizeof(*gContestResources->field_18)); + sub_80DE9DC(gContestResources->field_0->unk19215); + spriteId = sub_80DB174( + gContestMons[gContestResources->field_0->unk19215].species, + gContestMons[gContestResources->field_0->unk19215].otId, + gContestMons[gContestResources->field_0->unk19215].personality, + gContestResources->field_0->unk19215); + gSprites[spriteId].pos2.x = 120; + gSprites[spriteId].callback = sub_80DA134; + gTasks[taskId].data[2] = spriteId; + gBattlerSpriteIds[gBattlerAttacker] = spriteId; + sub_80DCBE8(sub_80DC9EC(gContestResources->field_0->unk19215), FALSE); + gTasks[taskId].data[0] = 4; + return; + case 4: + spriteId = gTasks[taskId].data[2]; + if (gSprites[spriteId].callback == SpriteCallbackDummy) + { + if (!gContestResources->field_14[r6].unk2_1) + gTasks[taskId].data[0] = 5; + } + return; + case 5: + if (gContestResources->field_4[r6].nervous) + { + gTasks[taskId].data[0] = 33; + } + else + { + sub_80DB89C(); + StringCopy(gStringVar1, gContestMons[r6].nickname); + if (gContestResources->field_4[r6].currMove < MOVES_COUNT) + StringCopy(gStringVar2, gMoveNames[gContestResources->field_4[r6].currMove]); else - { - sub_80DB89C(); - StringCopy(gStringVar1, gContestMons[r6].nickname); - if (gContestResources->field_4[r6].currMove < MOVES_COUNT) - StringCopy(gStringVar2, gMoveNames[gContestResources->field_4[r6].currMove]); - else - StringCopy(gStringVar2, gUnknown_08587F1C[gContestResources->field_4[r6].moveCategory]); - StringExpandPlaceholders(gStringVar4, gText_0827D55A); - Contest_StartTextPrinter(gStringVar4, 1); - gTasks[taskId].data[0] = 6; - } - return; - case 6: - if (!Contest_RunTextPrinters()) - { - gContestResources->field_0->unk1925E = 0; - gTasks[taskId].data[0] = 7; - } - return; - case 7: + StringCopy(gStringVar2, gUnknown_08587F1C[gContestResources->field_4[r6].moveCategory]); + StringExpandPlaceholders(gStringVar4, gText_0827D55A); + Contest_StartTextPrinter(gStringVar4, 1); + gTasks[taskId].data[0] = 6; + } + return; + case 6: + if (!Contest_RunTextPrinters()) + { + gContestResources->field_0->unk1925E = 0; + gTasks[taskId].data[0] = 7; + } + return; + case 7: { - u16 move = sub_80DE834(gContestResources->field_4[gContestResources->field_0->unk19215].currMove); + u16 move = SanitizeMove(gContestResources->field_4[gContestResources->field_0->unk19215].currMove); sub_80DE864(gContestResources->field_0->unk19215); sub_80DE9DC(gContestResources->field_0->unk19215); - sub_80DEAA8(move); + SelectContestMoveBankTarget(move); DoMoveAnim(move); gTasks[taskId].data[0] = 8; } - return; - case 8: - gAnimScriptCallback(); - if (!gAnimScriptActive) - { - sub_80DE9B0(r6); - if (gContestResources->field_0->unk1925E != 0) - { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0] = 9; - } - else - { - if (!gContestResources->field_4[r6].hasJudgesAttention) - sub_80DC674(r6); - sub_80DE12C(); - gTasks[taskId].data[0] = 23; - } - } - return; - case 9: - if (gTasks[taskId].data[10]++ > 30) + return; + case 8: + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + sub_80DE9B0(r6); + if (gContestResources->field_0->unk1925E != 0) { gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0] = 7; + gTasks[taskId].data[0] = 9; } - return; - case 23: - gTasks[taskId].data[1] = 0; - if (gContestResources->field_4[r6].effectStringId != CONTEST_STRING_NONE) + else { - sub_80DD45C(r6, gContestResources->field_4[r6].effectStringId); - gContestResources->field_4[r6].effectStringId = CONTEST_STRING_NONE; - gTasks[taskId].data[0] = 24; + if (!gContestResources->field_4[r6].hasJudgesAttention) + sub_80DC674(r6); + sub_80DE12C(); + gTasks[taskId].data[0] = 23; } - else + } + return; + case 9: + if (gTasks[taskId].data[10]++ > 30) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 7; + } + return; + case 23: + gTasks[taskId].data[1] = 0; + if (gContestResources->field_4[r6].effectStringId != CONTEST_STRING_NONE) + { + sub_80DD45C(r6, gContestResources->field_4[r6].effectStringId); + gContestResources->field_4[r6].effectStringId = CONTEST_STRING_NONE; + gTasks[taskId].data[0] = 24; + } + else + { + if (gContestResources->field_4[r6].effectStringId2 != CONTEST_STRING_NONE) { - if (gContestResources->field_4[r6].effectStringId2 != CONTEST_STRING_NONE) + for (i = 0; i < 4; i++) { - for (i = 0; i < 4; i++) - { - if (i != r6 && gContestResources->field_4[i].effectStringId != CONTEST_STRING_NONE) - break; - } - if (i == 4) - { - sub_80DD45C(r6, gContestResources->field_4[r6].effectStringId2); - gContestResources->field_4[r6].effectStringId2 = CONTEST_STRING_NONE; - gTasks[taskId].data[0] = 24; - } - else - { - gTasks[taskId].data[0] = 48; - } + if (i != r6 && gContestResources->field_4[i].effectStringId != CONTEST_STRING_NONE) + break; + } + if (i == 4) + { + sub_80DD45C(r6, gContestResources->field_4[r6].effectStringId2); + gContestResources->field_4[r6].effectStringId2 = CONTEST_STRING_NONE; + gTasks[taskId].data[0] = 24; } else { gTasks[taskId].data[0] = 48; } } - return; - case 24: - if (!Contest_RunTextPrinters()) - gTasks[taskId].data[0] = 23; - return; - case 48: - if (gContestResources->field_4[r6].turnOrderModAction == 1) - { - sub_80DD720(5); - } - else if (gContestResources->field_4[r6].turnOrderModAction == 2) - { - sub_80DD720(6); - } - else if (gContestResources->field_4[r6].turnOrderModAction == 3) - { - sub_80DD720(7); - } else { - gTasks[taskId].data[0] = 47; - return; + gTasks[taskId].data[0] = 48; } - gTasks[taskId].data[0] = 49; - return; - case 49: - if (!gContestResources->field_0->unk1920A_4) - gTasks[taskId].data[0] = 47; - return; - case 47: - sub_80DE008(TRUE); - gTasks[taskId].data[0] = 12; - return; - case 12: - sub_80DC028(0, gContestResources->field_4[r6].appeal2, r6); - gTasks[taskId].data[0] = 13; - return; - case 13: - if (!gContestResources->field_14[gContestResources->field_0->unk19215].unk2_2) - gTasks[taskId].data[0] = 35; - return; - case 35: - if (gContestResources->field_4[r6].conditionMod == 1) - sub_80DD720(8); - gTasks[taskId].data[0] = 36; - return; - case 36: - if (!gContestResources->field_0->unk1920A_4) - gTasks[taskId].data[0] = 37; - return; - case 37: - if (sub_80DB5B8(r6, 1)) - { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0] = 38; - } - else - { - gTasks[taskId].data[0] = 50; - } - return; - case 38: - if (++gTasks[taskId].data[10] > 20) - { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0] = 50; - } - return; - case 50: - if (sub_80DB798(r6)) - PlaySE(SE_C_PASI); - gTasks[taskId].data[0] = 25; - return; - case 25: - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0] = 26; + } + return; + case 24: + if (!Contest_RunTextPrinters()) + gTasks[taskId].data[0] = 23; + return; + case 48: + if (gContestResources->field_4[r6].turnOrderModAction == 1) + { + sub_80DD720(5); + } + else if (gContestResources->field_4[r6].turnOrderModAction == 2) + { + sub_80DD720(6); + } + else if (gContestResources->field_4[r6].turnOrderModAction == 3) + { + sub_80DD720(7); + } + else + { + gTasks[taskId].data[0] = 47; return; - case 26: + } + gTasks[taskId].data[0] = 49; + return; + case 49: + if (!gContestResources->field_0->unk1920A_4) + gTasks[taskId].data[0] = 47; + return; + case 47: + sub_80DE008(TRUE); + gTasks[taskId].data[0] = 12; + return; + case 12: + sub_80DC028(0, gContestResources->field_4[r6].appeal2, r6); + gTasks[taskId].data[0] = 13; + return; + case 13: + if (!gContestResources->field_14[gContestResources->field_0->unk19215].unk2_2) + gTasks[taskId].data[0] = 35; + return; + case 35: + if (gContestResources->field_4[r6].conditionMod == 1) + sub_80DD720(8); + gTasks[taskId].data[0] = 36; + return; + case 36: + if (!gContestResources->field_0->unk1920A_4) + gTasks[taskId].data[0] = 37; + return; + case 37: + if (sub_80DB5B8(r6, 1)) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 38; + } + else + { + gTasks[taskId].data[0] = 50; + } + return; + case 38: + if (++gTasks[taskId].data[10] > 20) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 50; + } + return; + case 50: + if (sub_80DB798(r6)) + PlaySE(SE_C_PASI); + gTasks[taskId].data[0] = 25; + return; + case 25: + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0] = 26; + return; + case 26: { s32 r2 = 0; @@ -1226,435 +1278,435 @@ void sub_80D8B38(u8 taskId) sub_80DB884(); } } - return; - case 27: - if (!Contest_RunTextPrinters()) - gTasks[taskId].data[0] = 28; - return; - case 28: - for (i = 0; gTasks[taskId].data[1] != gUnknown_02039F26[i]; i++) - ; - sub_80DC028(gContestResources->field_4[i].appeal2 + gContestResources->field_4[i].jam, -gContestResources->field_4[i].jam, i); - gTasks[taskId].data[0] = 29; - return; - case 29: - for (i = 0; gTasks[taskId].data[1] != gUnknown_02039F26[i]; i++) - ; - if (!gContestResources->field_14[i].unk2_2) - gTasks[taskId].data[0] = 39; - return; - case 39: - for (i = 0; gTasks[taskId].data[1] != gUnknown_02039F26[i]; i++) - ; - if (sub_80DB5B8(i, 1)) + return; + case 27: + if (!Contest_RunTextPrinters()) + gTasks[taskId].data[0] = 28; + return; + case 28: + for (i = 0; gTasks[taskId].data[1] != gUnknown_02039F26[i]; i++) + ; + sub_80DC028(gContestResources->field_4[i].appeal2 + gContestResources->field_4[i].jam, -gContestResources->field_4[i].jam, i); + gTasks[taskId].data[0] = 29; + return; + case 29: + for (i = 0; gTasks[taskId].data[1] != gUnknown_02039F26[i]; i++) + ; + if (!gContestResources->field_14[i].unk2_2) + gTasks[taskId].data[0] = 39; + return; + case 39: + for (i = 0; gTasks[taskId].data[1] != gUnknown_02039F26[i]; i++) + ; + if (sub_80DB5B8(i, 1)) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 40; + } + else + { + gTasks[taskId].data[0] = 30; + } + return; + case 40: + if (++gTasks[taskId].data[10] > 20) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 30; + } + return; + case 30: + for (i = 0; i < 4; i++) + { + if (gUnknown_02039F26[i] == gTasks[taskId].data[1]) + break; + } + if (sub_80DB798(i)) + PlaySE(SE_C_PASI); + else + PlaySE(SE_C_SYU); + if (gContestResources->field_4[i].judgesAttentionWasRemoved) + { + sub_80DC674(i); + gContestResources->field_4[i].judgesAttentionWasRemoved = 0; + } + gTasks[taskId].data[1]++; + gTasks[taskId].data[0] = 26; + return; + case 51: + if (gTasks[taskId].data[10]++ > 9) + { + gTasks[taskId].data[10] = 0; + if (gContestResources->field_4[r6].numTurnsSkipped != 0 + || gContestResources->field_4[r6].turnSkipped) { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0] = 40; + sub_80DB89C(); + StringCopy(gStringVar1, gContestMons[r6].nickname); + StringExpandPlaceholders(gStringVar4, gText_0827E793); + Contest_StartTextPrinter(gStringVar4, 1); } + gTasks[taskId].data[0] = 52; + } + return; + case 52: + if (!Contest_RunTextPrinters()) + { + if (!gContestResources->field_4[r6].unk15_6) + gTasks[taskId].data[0] = 17; else + gTasks[taskId].data[0] = 14; + } + return; + case 14: + r3 = gContestResources->field_4[r6].unk16; + if (gContestResources->field_4[r6].unk16 != 0) + { + sub_80DB89C(); + if (r3 == 1) + Contest_StartTextPrinter(gText_0827E32E, 1); + else if (r3 == 2) + Contest_StartTextPrinter(gText_0827E35B, 1); + else + Contest_StartTextPrinter(gText_0827E38D, 1); + sub_80DD720(3); + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 45; + } + else + { + sub_80DB89C(); + StringCopy(gStringVar1, gContestMons[r6].nickname); + StringExpandPlaceholders(gStringVar4, gText_0827E2FE); + Contest_StartTextPrinter(gStringVar4, 1); + sub_80DD720(2); + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 45; + } + return; + case 45: + if (!gContestResources->field_0->unk1920A_4) + { + sub_80DC9B4(gContestResources->field_0->unk19215); + gTasks[taskId].data[0] = 15; + } + return; + case 15: + if (!Contest_RunTextPrinters()) + { + if (++gTasks[taskId].data[10] > 50) { - gTasks[taskId].data[0] = 30; - } - return; - case 40: - if (++gTasks[taskId].data[10] > 20) - { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0] = 30; + if (!gContestResources->field_4[r6].hasJudgesAttention) + { + sub_80DC028( + gContestResources->field_4[r6].appeal2, + gContestResources->field_4[r6].unk17, + r6); + gContestResources->field_4[r6].appeal2 += gContestResources->field_4[r6].unk17; + } + gTasks[taskId].data[0] = 16; } - return; - case 30: - for (i = 0; i < 4; i++) + } + return; + case 16: + if (!gContestResources->field_14[r6].unk2_2) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 17; + } + return; + case 17: + if (gContestResources->field_4[r6].disappointedRepeat) + { + sub_80DB89C(); + StringCopy(gStringVar1, gContestMons[r6].nickname); + StringExpandPlaceholders(gStringVar4, gText_0827E6E3); + Contest_StartTextPrinter(gStringVar4, 1); + gTasks[taskId].data[10] = 0; + sub_80DD720(0); + gTasks[taskId].data[0] = 46; + } + else + { + gTasks[taskId].data[0] = 41; + } + return; + case 46: + if (!gContestResources->field_0->unk1920A_4) + gTasks[taskId].data[0] = 19; + return; + case 19: + if (!Contest_RunTextPrinters()) + { + sub_80DC028(gContestResources->field_4[r6].appeal2, -gContestResources->field_4[r6].unk18, r6); + gContestResources->field_4[r6].appeal2 -= gContestResources->field_4[r6].unk18; + gTasks[taskId].data[0] = 18; + } + return; + case 18: + sub_80DCD48(); + if (!gContestResources->field_14[r6].unk2_2) + { + gTasks[taskId].data[10] = 0; + sub_80DB89C(); + gTasks[taskId].data[0] = 41; + } + return; + case 41: + if (gContestResources->field_10->excitementFrozen && r6 != gContestResources->field_10->excitementFreezer) + { + gTasks[taskId].data[0] = 57; + } + else + { + r3 = gContestResources->field_10->bits_0; + if (gContestResources->field_4[r6].overrideCategoryExcitementMod) { - if (gUnknown_02039F26[i] == gTasks[taskId].data[1]) - break; + r3 = 1; + StringCopy(gStringVar3, gMoveNames[gContestResources->field_4[r6].currMove]); } - if (sub_80DB798(i)) - PlaySE(SE_C_PASI); else - PlaySE(SE_C_SYU); - if (gContestResources->field_4[i].judgesAttentionWasRemoved) { - sub_80DC674(i); - gContestResources->field_4[i].judgesAttentionWasRemoved = 0; + StringCopy(gStringVar3, gUnknown_08587F08[gContestMoves[gContestResources->field_4[r6].currMove].contestCategory]); } - gTasks[taskId].data[1]++; - gTasks[taskId].data[0] = 26; - return; - case 51: - if (gTasks[taskId].data[10]++ > 9) - { - gTasks[taskId].data[10] = 0; - if (gContestResources->field_4[r6].numTurnsSkipped != 0 - || gContestResources->field_4[r6].turnSkipped) - { - sub_80DB89C(); - StringCopy(gStringVar1, gContestMons[r6].nickname); - StringExpandPlaceholders(gStringVar4, gText_0827E793); - Contest_StartTextPrinter(gStringVar4, 1); - } - gTasks[taskId].data[0] = 52; - } - return; - case 52: - if (!Contest_RunTextPrinters()) + if (r3 > 0) { - if (!gContestResources->field_4[r6].unk15_6) - gTasks[taskId].data[0] = 17; - else - gTasks[taskId].data[0] = 14; + if (gContestResources->field_4[r6].disappointedRepeat) + r3 = 0; } - return; - case 14: - r3 = gContestResources->field_4[r6].unk16; - if (gContestResources->field_4[r6].unk16 != 0) + sub_80DB89C(); + StringCopy(gStringVar1, gContestMons[r6].nickname); + gContestResources->field_0->applauseLevel += r3; + if (gContestResources->field_0->applauseLevel < 0) + gContestResources->field_0->applauseLevel = 0; + if (r3 == 0) { - sub_80DB89C(); - if (r3 == 1) - Contest_StartTextPrinter(gText_0827E32E, 1); - else if (r3 == 2) - Contest_StartTextPrinter(gText_0827E35B, 1); - else - Contest_StartTextPrinter(gText_0827E38D, 1); - sub_80DD720(3); - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0] = 45; + gTasks[taskId].data[0] = 55; } else { - sub_80DB89C(); - StringCopy(gStringVar1, gContestMons[r6].nickname); - StringExpandPlaceholders(gStringVar4, gText_0827E2FE); + if (r3 < 0) + StringExpandPlaceholders(gStringVar4, gText_0827E73C); + else if (r3 > 0 && gContestResources->field_0->applauseLevel <= 4) + StringExpandPlaceholders(gStringVar4, gText_0827E717); + else + StringExpandPlaceholders(gStringVar4, gText_0827E76A); Contest_StartTextPrinter(gStringVar4, 1); - sub_80DD720(2); gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0] = 45; + gTasks[taskId].data[11] = 0; + if (r3 < 0) + gTasks[taskId].data[0] = 53; + else + gTasks[taskId].data[0] = 54; } - return; - case 45: - if (!gContestResources->field_0->unk1920A_4) + } + return; + case 53: + switch (gTasks[taskId].data[10]) + { + case 0: + sub_80DDED0(-1, 1); + PlayFanfare(MUS_ME_ZANNEN); + gTasks[taskId].data[10]++; + break; + case 1: + if (!gContestResources->field_0->unk1920B_0 && !Contest_RunTextPrinters()) { - sub_80DC9B4(gContestResources->field_0->unk19215); - gTasks[taskId].data[0] = 15; + sub_80DDCDC(-1); + gTasks[taskId].data[10]++; } - return; - case 15: - if (!Contest_RunTextPrinters()) + break; + case 2: + if (!gContestResources->field_0->unk1920A_5) { - if (++gTasks[taskId].data[10] > 50) + if (gTasks[taskId].data[11]++ > 29) { - if (!gContestResources->field_4[r6].hasJudgesAttention) - { - sub_80DC028( - gContestResources->field_4[r6].appeal2, - gContestResources->field_4[r6].unk17, - r6); - gContestResources->field_4[r6].appeal2 += gContestResources->field_4[r6].unk17; - } - gTasks[taskId].data[0] = 16; + gTasks[taskId].data[11] = 0; + sub_80DDED0(-1, -1); + gTasks[taskId].data[10]++; } } - return; - case 16: - if (!gContestResources->field_14[r6].unk2_2) - { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0] = 17; - } - return; - case 17: - if (gContestResources->field_4[r6].disappointedRepeat) + break; + case 3: + if (!gPaletteFade.active) { - sub_80DB89C(); - StringCopy(gStringVar1, gContestMons[r6].nickname); - StringExpandPlaceholders(gStringVar4, gText_0827E6E3); - Contest_StartTextPrinter(gStringVar4, 1); gTasks[taskId].data[10] = 0; - sub_80DD720(0); - gTasks[taskId].data[0] = 46; - } - else - { - gTasks[taskId].data[0] = 41; + gTasks[taskId].data[11] = 0; + gTasks[taskId].data[0] = 43; } - return; - case 46: - if (!gContestResources->field_0->unk1920A_4) - gTasks[taskId].data[0] = 19; - return; - case 19: + break; + } + return; + case 54: + switch (gTasks[taskId].data[10]) + { + case 0: if (!Contest_RunTextPrinters()) { - sub_80DC028(gContestResources->field_4[r6].appeal2, -gContestResources->field_4[r6].unk18, r6); - gContestResources->field_4[r6].appeal2 -= gContestResources->field_4[r6].unk18; - gTasks[taskId].data[0] = 18; + sub_80DDED0(1, 1); + gTasks[taskId].data[10]++; } - return; - case 18: - sub_80DCD48(); - if (!gContestResources->field_14[r6].unk2_2) - { - gTasks[taskId].data[10] = 0; - sub_80DB89C(); - gTasks[taskId].data[0] = 41; - } - return; - case 41: - if (gContestResources->field_10->excitementFrozen && r6 != gContestResources->field_10->excitementFreezer) + break; + case 1: + if (!gContestResources->field_0->unk1920B_0) { - gTasks[taskId].data[0] = 57; + sub_80DDE0C(); + PlaySE(SE_W227B); + sub_80DDCDC(1); + gTasks[taskId].data[10]++; } - else + break; + case 2: + if (!gContestResources->field_0->unk1920A_5) { - r3 = gContestResources->field_10->bits_0; - if (gContestResources->field_4[r6].overrideCategoryExcitementMod) - { - r3 = 1; - StringCopy(gStringVar3, gMoveNames[gContestResources->field_4[r6].currMove]); - } - else - { - StringCopy(gStringVar3, gUnknown_08587F08[gContestMoves[gContestResources->field_4[r6].currMove].contestCategory]); - } - if (r3 > 0) - { - if (gContestResources->field_4[r6].disappointedRepeat) - r3 = 0; - } - sub_80DB89C(); - StringCopy(gStringVar1, gContestMons[r6].nickname); - gContestResources->field_0->applauseLevel += r3; - if (gContestResources->field_0->applauseLevel < 0) - gContestResources->field_0->applauseLevel = 0; - if (r3 == 0) - { - gTasks[taskId].data[0] = 55; - } - else + if (gTasks[taskId].data[11]++ > 29) { - if (r3 < 0) - StringExpandPlaceholders(gStringVar4, gText_0827E73C); - else if (r3 > 0 && gContestResources->field_0->applauseLevel <= 4) - StringExpandPlaceholders(gStringVar4, gText_0827E717); - else - StringExpandPlaceholders(gStringVar4, gText_0827E76A); - Contest_StartTextPrinter(gStringVar4, 1); - gTasks[taskId].data[10] = 0; gTasks[taskId].data[11] = 0; - if (r3 < 0) - gTasks[taskId].data[0] = 53; - else - gTasks[taskId].data[0] = 54; - } - } - return; - case 53: - switch (gTasks[taskId].data[10]) - { - case 0: - sub_80DDED0(-1, 1); - PlayFanfare(MUS_ME_ZANNEN); + sub_80DC028(gContestResources->field_4[r6].appeal2, gContestResources->field_10->unk2, r6); + gContestResources->field_4[r6].appeal2 += gContestResources->field_10->unk2; gTasks[taskId].data[10]++; - break; - case 1: - if (!gContestResources->field_0->unk1920B_0 && !Contest_RunTextPrinters()) - { - sub_80DDCDC(-1); - gTasks[taskId].data[10]++; - } - break; - case 2: - if (!gContestResources->field_0->unk1920A_5) - { - if (gTasks[taskId].data[11]++ > 29) - { - gTasks[taskId].data[11] = 0; - sub_80DDED0(-1, -1); - gTasks[taskId].data[10]++; - } - } - break; - case 3: - if (!gPaletteFade.active) - { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[11] = 0; - gTasks[taskId].data[0] = 43; - } - break; - } - return; - case 54: - switch (gTasks[taskId].data[10]) - { - case 0: - if (!Contest_RunTextPrinters()) - { - sub_80DDED0(1, 1); - gTasks[taskId].data[10]++; - } - break; - case 1: - if (!gContestResources->field_0->unk1920B_0) - { - sub_80DDE0C(); - PlaySE(SE_W227B); - sub_80DDCDC(1); - gTasks[taskId].data[10]++; - } - break; - case 2: - if (!gContestResources->field_0->unk1920A_5) - { - if (gTasks[taskId].data[11]++ > 29) - { - gTasks[taskId].data[11] = 0; - sub_80DC028(gContestResources->field_4[r6].appeal2, gContestResources->field_10->unk2, r6); - gContestResources->field_4[r6].appeal2 += gContestResources->field_10->unk2; - gTasks[taskId].data[10]++; - } - } - break; - case 3: - if (!gContestResources->field_14[r6].unk2_2) - { - if (!gContestResources->field_0->unk1920A_7) - { - sub_80DDED0(1, -1); - gTasks[taskId].data[10]++; - } - } - break; - case 4: - if (!gPaletteFade.active) - { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[11] = 0; - gTasks[taskId].data[0] = 43; - } - break; + } } - return; - case 43: + break; + case 3: if (!gContestResources->field_14[r6].unk2_2) { - sub_80DB89C(); - gTasks[taskId].data[0] = 55; - } - return; - case 57: - sub_80DB89C(); - StringCopy(gStringVar3, gContestMons[gContestResources->field_10->excitementFreezer].nickname); - StringCopy(gStringVar1, gContestMons[r6].nickname); - StringCopy(gStringVar2, gMoveNames[gContestResources->field_4[r6].currMove]); - StringExpandPlaceholders(gStringVar4, gText_0827E7EA); - Contest_StartTextPrinter(gStringVar4, 1); - gTasks[taskId].data[0] = 58; - return; - case 58: - if (!Contest_RunTextPrinters()) - { - sub_80DB89C(); - StringExpandPlaceholders(gStringVar4, gText_0827E817); - Contest_StartTextPrinter(gStringVar4, 1); - gTasks[taskId].data[0] = 59; - } - return; - case 59: - if (!Contest_RunTextPrinters()) - { - sub_80DB89C(); - gTasks[taskId].data[0] = 55; - } - return; - case 33: - if (gContestResources->field_4[r6].hasJudgesAttention) - gContestResources->field_4[r6].hasJudgesAttention = 0; - sub_80DC9B4(r6); - StringCopy(gStringVar1, gContestMons[r6].nickname); - StringCopy(gStringVar2, gMoveNames[gContestResources->field_4[r6].currMove]); - StringExpandPlaceholders(gStringVar4, gText_0827E58A); - Contest_StartTextPrinter(gStringVar4, 1); - gTasks[taskId].data[0] = 34; - return; - case 34: - if (!Contest_RunTextPrinters()) - gTasks[taskId].data[0] = 55; - return; - case 55: - sub_80DDBE8(); - gTasks[taskId].data[0] = 56; - return; - case 56: - if (!gContestResources->field_0->unk1920A_6) - { - if (gContestResources->field_0->applauseLevel > 4) + if (!gContestResources->field_0->unk1920A_7) { - gContestResources->field_0->applauseLevel = 0; - sub_80DD940(); + sub_80DDED0(1, -1); + gTasks[taskId].data[10]++; } - gTasks[taskId].data[0] = 10; } - return; - case 10: - spriteId = gTasks[taskId].data[2]; - gSprites[spriteId].callback = sub_80DA164; - gTasks[taskId].data[0] = 11; - return; - case 11: - spriteId = gTasks[taskId].data[2]; - if (gSprites[spriteId].invisible) + break; + case 4: + if (!gPaletteFade.active) { - FreeSpriteOamMatrix(&gSprites[spriteId]); - DestroySprite(&gSprites[spriteId]); - gTasks[taskId].data[0] = 20; + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11] = 0; + gTasks[taskId].data[0] = 43; } - return; - case 20: - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0] = 21; - return; - case 31: + break; + } + return; + case 43: + if (!gContestResources->field_14[r6].unk2_2) + { sub_80DB89C(); - StringCopy(gStringVar1, gContestMons[r6].nickname); - StringExpandPlaceholders(gStringVar4, gText_0827D56F); + gTasks[taskId].data[0] = 55; + } + return; + case 57: + sub_80DB89C(); + StringCopy(gStringVar3, gContestMons[gContestResources->field_10->excitementFreezer].nickname); + StringCopy(gStringVar1, gContestMons[r6].nickname); + StringCopy(gStringVar2, gMoveNames[gContestResources->field_4[r6].currMove]); + StringExpandPlaceholders(gStringVar4, gText_0827E7EA); + Contest_StartTextPrinter(gStringVar4, 1); + gTasks[taskId].data[0] = 58; + return; + case 58: + if (!Contest_RunTextPrinters()) + { + sub_80DB89C(); + StringExpandPlaceholders(gStringVar4, gText_0827E817); Contest_StartTextPrinter(gStringVar4, 1); - gTasks[taskId].data[0] = 32; - return; - case 32: - if (!Contest_RunTextPrinters()) - gTasks[taskId].data[0] = 21; - return; - case 21: - if (++gTasks[taskId].data[10] > 29) - { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[0] = 22; - } - return; - case 22: - if (++gContestResources->field_0->unk19214 == 4) - { - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].func = sub_80DA198; - } - else + gTasks[taskId].data[0] = 59; + } + return; + case 59: + if (!Contest_RunTextPrinters()) + { + sub_80DB89C(); + gTasks[taskId].data[0] = 55; + } + return; + case 33: + if (gContestResources->field_4[r6].hasJudgesAttention) + gContestResources->field_4[r6].hasJudgesAttention = 0; + sub_80DC9B4(r6); + StringCopy(gStringVar1, gContestMons[r6].nickname); + StringCopy(gStringVar2, gMoveNames[gContestResources->field_4[r6].currMove]); + StringExpandPlaceholders(gStringVar4, gText_0827E58A); + Contest_StartTextPrinter(gStringVar4, 1); + gTasks[taskId].data[0] = 34; + return; + case 34: + if (!Contest_RunTextPrinters()) + gTasks[taskId].data[0] = 55; + return; + case 55: + sub_80DDBE8(); + gTasks[taskId].data[0] = 56; + return; + case 56: + if (!gContestResources->field_0->unk1920A_6) + { + if (gContestResources->field_0->applauseLevel > 4) { - gTasks[taskId].data[0] = 0; + gContestResources->field_0->applauseLevel = 0; + sub_80DD940(); } - return; + gTasks[taskId].data[0] = 10; + } + return; + case 10: + spriteId = gTasks[taskId].data[2]; + gSprites[spriteId].callback = sub_80DA164; + gTasks[taskId].data[0] = 11; + return; + case 11: + spriteId = gTasks[taskId].data[2]; + if (gSprites[spriteId].invisible) + { + FreeSpriteOamMatrix(&gSprites[spriteId]); + DestroySprite(&gSprites[spriteId]); + gTasks[taskId].data[0] = 20; + } + return; + case 20: + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 21; + return; + case 31: + sub_80DB89C(); + StringCopy(gStringVar1, gContestMons[r6].nickname); + StringExpandPlaceholders(gStringVar4, gText_0827D56F); + Contest_StartTextPrinter(gStringVar4, 1); + gTasks[taskId].data[0] = 32; + return; + case 32: + if (!Contest_RunTextPrinters()) + gTasks[taskId].data[0] = 21; + return; + case 21: + if (++gTasks[taskId].data[10] > 29) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[0] = 22; + } + return; + case 22: + if (++gContestResources->field_0->unk19214 == 4) + { + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_80DA198; + } + else + { + gTasks[taskId].data[0] = 0; + } + return; } } -void sub_80DA110(u8 taskId) +static void sub_80DA110(u8 taskId) { sContest.unk1920B_2 = 0; DestroyTask(taskId); } -void sub_80DA134(struct Sprite *sprite) +static void sub_80DA134(struct Sprite *sprite) { if (sprite->pos2.x != 0) { @@ -1670,7 +1722,7 @@ void sub_80DA134(struct Sprite *sprite) } } -void sub_80DA164(struct Sprite *sprite) +static void sub_80DA164(struct Sprite *sprite) { sprite->pos2.x -= 6; if (sprite->pos1.x + sprite->pos2.x < -32) @@ -1680,7 +1732,7 @@ void sub_80DA164(struct Sprite *sprite) } } -void sub_80DA198(u8 taskId) +static void sub_80DA198(u8 taskId) { switch (gTasks[taskId].data[0]) { @@ -1718,7 +1770,7 @@ void sub_80DA198(u8 taskId) } } -void sub_80DA25C(u8 taskId) +static void sub_80DA25C(u8 taskId) { sub_80DE008(FALSE); gTasks[taskId].data[0] = 0; @@ -1726,7 +1778,7 @@ void sub_80DA25C(u8 taskId) gTasks[taskId].func = sub_80DA28C; } -void sub_80DA28C(u8 taskId) +static void sub_80DA28C(u8 taskId) { switch (gTasks[taskId].data[0]) { @@ -1757,13 +1809,13 @@ void sub_80DA28C(u8 taskId) } } -void sub_80DA31C(u8 taskId) +static void sub_80DA31C(u8 taskId) { if (sub_80DC3C4()) gTasks[taskId].func = sub_80DA348; } -void sub_80DA348(u8 taskId) +static void sub_80DA348(u8 taskId) { DmaCopy32Defvars(3, shared18000.unk18204, gPlttBufferUnfaded, 0x400); gTasks[taskId].data[0] = 0; @@ -1771,7 +1823,7 @@ void sub_80DA348(u8 taskId) gTasks[taskId].func = sub_80DA38C; } -void sub_80DA38C(u8 taskId) +static void sub_80DA38C(u8 taskId) { if (++gTasks[taskId].data[0] > 2) { @@ -1781,7 +1833,7 @@ void sub_80DA38C(u8 taskId) } } -void sub_80DA3CC(u8 taskId) +static void sub_80DA3CC(u8 taskId) { if (gTasks[taskId].data[0] == 0) { @@ -1804,7 +1856,7 @@ void sub_80DA3CC(u8 taskId) } } -void sub_80DA464(u8 taskId) +static void sub_80DA464(u8 taskId) { if (gTasks[taskId].data[0]++ > 29) { @@ -1814,7 +1866,7 @@ void sub_80DA464(u8 taskId) } } -void sub_80DA49C(u8 taskId) +static void sub_80DA49C(u8 taskId) { if (sub_80DC3C4()) { @@ -1823,19 +1875,19 @@ void sub_80DA49C(u8 taskId) } } -void sub_80DA4CC(u8 taskId) +static void sub_80DA4CC(u8 taskId) { sub_80DE224(); gTasks[taskId].func = sub_80DE424; } -void sub_80DA4F4(u8 taskId) +static void sub_80DA4F4(u8 taskId) { sub_80DE350(); gTasks[taskId].func = sub_80DA51C; } -void sub_80DA51C(u8 taskId) +static void sub_80DA51C(u8 taskId) { vu16 sp0 = GetGpuReg(REG_OFFSET_BG0CNT); vu16 sp2 = GetGpuReg(REG_OFFSET_BG2CNT); @@ -1855,13 +1907,13 @@ void sub_80DA51C(u8 taskId) } } -void sub_80DA5B4(u8 taskId) +static void sub_80DA5B4(u8 taskId) { if (!sContest.unk1920A_6) gTasks[taskId].func = sub_80D833C; } -void sub_80DA5E8(u8 taskId) +static void sub_80DA5E8(u8 taskId) { s32 i; @@ -1886,7 +1938,7 @@ void sub_80DA5E8(u8 taskId) gTasks[taskId].func = sub_80DA6B4; } -void sub_80DA6B4(u8 taskId) +static void sub_80DA6B4(u8 taskId) { if (!Contest_RunTextPrinters()) { @@ -1899,7 +1951,7 @@ void sub_80DA6B4(u8 taskId) } } -void sub_80DA700(u8 taskId) +static void sub_80DA700(u8 taskId) { gBattle_BG1_Y -= 7; if ((s16)gBattle_BG1_Y < 0) @@ -1911,7 +1963,7 @@ void sub_80DA700(u8 taskId) } } -void sub_80DA740(u8 taskId) +static void sub_80DA740(u8 taskId) { if (gTasks[taskId].data[0]++ >= 50) { @@ -1928,7 +1980,7 @@ void sub_80DA740(u8 taskId) } } -void sub_80DA7A0(u8 taskId) +static void sub_80DA7A0(u8 taskId) { u8 taskId2 = CreateTask(sub_80FCACC, 0); @@ -1938,14 +1990,14 @@ void sub_80DA7A0(u8 taskId) sub_80DC490(FALSE); } -void sub_80DA7EC(u8 taskId) +static void sub_80DA7EC(u8 taskId) { DestroyTask(taskId); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); gTasks[sContest.mainTaskId].func = sub_80DA830; } -void sub_80DA830(u8 taskId) +static void sub_80DA830(u8 taskId) { if (!gPaletteFade.active) { @@ -1958,26 +2010,25 @@ void sub_80DA830(u8 taskId) } } -void sub_80DA874(void) +static void sub_80DA874(void) { ScriptContext2_Disable(); EnableBothScriptContexts(); } -void sub_80DA884(void) +static void sub_80DA884(void) { if (!(gIsLinkContest & 1)) gContestPlayerMonIndex = 3; } -bool8 sub_80DA8A4(void) +static bool8 sub_80DA8A4(void) { if (gContestPlayerMonIndex == gUnknown_02039F2B) return TRUE; return FALSE; } - void sub_80DA8C8(u8 partyIndex) { u8 name[20]; @@ -2113,48 +2164,41 @@ void sub_80DAB8C(u8 contestType, u8 rank) sub_80DA8C8(gContestMonPartyIndex); } -#ifdef NONMATCHING void sub_80DACBC(u8 contestType, u8 rank, bool32 isPostgame) { - s32 i; + s32 i, j; u8 opponentsCount = 0; u8 opponents[100]; - const u8 * r6; if (gNumLinkContestPlayers == 4) return; - r6 = gUnknown_085898A4; for (i = 0; i < ARRAY_COUNT(gContestOpponents); i++) { if (rank != gContestOpponents[i].whichRank) continue; + if (isPostgame == TRUE) { - if (r6[i] == 1) + if (gUnknown_085898A4[i] == 1) continue; } else { - if (r6[i] == 2) + if (gUnknown_085898A4[i] == 2) continue; } - if (contestType == CONTEST_CATEGORY_COOL && gContestOpponents[i].aiPool_Cool) - opponents[opponentsCount++] = i; - else if (contestType == CONTEST_CATEGORY_BEAUTY && gContestOpponents[i].aiPool_Beauty) - opponents[opponentsCount++] = i; - else if (contestType == CONTEST_CATEGORY_CUTE && gContestOpponents[i].aiPool_Cute) - opponents[opponentsCount++] = i; - else if (contestType == CONTEST_CATEGORY_SMART && gContestOpponents[i].aiPool_Smart) - opponents[opponentsCount++] = i; - else if (contestType == CONTEST_CATEGORY_TOUGH && gContestOpponents[i].aiPool_Tough) + if ((contestType == CONTEST_CATEGORY_COOL && gContestOpponents[i].aiPool_Cool) + || (contestType == CONTEST_CATEGORY_BEAUTY && gContestOpponents[i].aiPool_Beauty) + || (contestType == CONTEST_CATEGORY_CUTE && gContestOpponents[i].aiPool_Cute) + || (contestType == CONTEST_CATEGORY_SMART && gContestOpponents[i].aiPool_Smart) + || (contestType == CONTEST_CATEGORY_TOUGH && gContestOpponents[i].aiPool_Tough)) opponents[opponentsCount++] = i; } opponents[opponentsCount] = 0xFF; for (i = 0; i < 4 - gNumLinkContestPlayers; i++) { u16 rnd = sub_80F903C() % opponentsCount; - s32 j; gContestMons[gNumLinkContestPlayers + i] = gContestOpponents[opponents[rnd]]; sub_80DF9D4(gContestMons[gNumLinkContestPlayers + i].trainerName); @@ -2164,180 +2208,6 @@ void sub_80DACBC(u8 contestType, u8 rank, bool32 isPostgame) opponentsCount--; } } -#else -NAKED void sub_80DACBC(u8 contestType, u8 rank, bool32 isPostgame) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r9\n" - "\tmov r6, r8\n" - "\tpush {r6,r7}\n" - "\tsub sp, 0x64\n" - "\tmov r8, r2\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tlsls r1, 24\n" - "\tlsrs r2, r1, 24\n" - "\tmovs r7, 0\n" - "\tldr r0, =gNumLinkContestPlayers\n" - "\tldrb r1, [r0]\n" - "\tmov r9, r0\n" - "\tcmp r1, 0x4\n" - "\tbne _080DACDE\n" - "\tb _080DADF6\n" - "_080DACDE:\n" - "\tmovs r5, 0\n" - "\tldr r3, =gContestOpponents\n" - "\tldr r6, =gUnknown_085898A4\n" - "_080DACE4:\n" - "\tldrb r0, [r3, 0x1C]\n" - "\tlsls r0, 30\n" - "\tlsrs r0, 30\n" - "\tcmp r2, r0\n" - "\tbne _080DAD56\n" - "\tmov r0, r8\n" - "\tcmp r0, 0x1\n" - "\tbne _080DAD08\n" - "\tldrb r0, [r6]\n" - "\tcmp r0, 0x1\n" - "\tbeq _080DAD56\n" - "\tb _080DAD0E\n" - "\t.pool\n" - "_080DAD08:\n" - "\tldrb r0, [r6]\n" - "\tcmp r0, 0x2\n" - "\tbeq _080DAD56\n" - "_080DAD0E:\n" - "\tcmp r4, 0\n" - "\tbne _080DAD1A\n" - "\tldrb r0, [r3, 0x1C]\n" - "\tlsls r0, 29\n" - "\tcmp r0, 0\n" - "\tblt _080DAD4A\n" - "_080DAD1A:\n" - "\tcmp r4, 0x1\n" - "\tbne _080DAD26\n" - "\tldrb r0, [r3, 0x1C]\n" - "\tlsls r0, 28\n" - "\tcmp r0, 0\n" - "\tblt _080DAD4A\n" - "_080DAD26:\n" - "\tcmp r4, 0x2\n" - "\tbne _080DAD32\n" - "\tldrb r0, [r3, 0x1C]\n" - "\tlsls r0, 27\n" - "\tcmp r0, 0\n" - "\tblt _080DAD4A\n" - "_080DAD32:\n" - "\tcmp r4, 0x3\n" - "\tbne _080DAD3E\n" - "\tldrb r0, [r3, 0x1C]\n" - "\tlsls r0, 26\n" - "\tcmp r0, 0\n" - "\tblt _080DAD4A\n" - "_080DAD3E:\n" - "\tcmp r4, 0x4\n" - "\tbne _080DAD56\n" - "\tldrb r0, [r3, 0x1C]\n" - "\tlsls r0, 25\n" - "\tcmp r0, 0\n" - "\tbge _080DAD56\n" - "_080DAD4A:\n" - "\tadds r0, r7, 0\n" - "\tadds r1, r0, 0x1\n" - "\tlsls r1, 24\n" - "\tlsrs r7, r1, 24\n" - "\tadd r0, sp\n" - "\tstrb r5, [r0]\n" - "_080DAD56:\n" - "\tadds r3, 0x40\n" - "\tadds r6, 0x1\n" - "\tadds r5, 0x1\n" - "\tcmp r5, 0x5F\n" - "\tbls _080DACE4\n" - "\tmov r3, sp\n" - "\tadds r1, r3, r7\n" - "\tmovs r0, 0xFF\n" - "\tstrb r0, [r1]\n" - "\tmovs r5, 0\n" - "\tmov r0, r9\n" - "\tldrb r1, [r0]\n" - "\tmovs r0, 0x4\n" - "\tsubs r0, r1\n" - "\tcmp r5, r0\n" - "\tbge _080DADF6\n" - "\tldr r3, =gContestMons\n" - "\tmov r8, r3\n" - "\tmov r6, r9\n" - "\tmovs r0, 0x2\n" - "\tadd r0, r8\n" - "\tmov r9, r0\n" - "_080DAD82:\n" - "\tbl sub_80F903C\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tadds r1, r7, 0\n" - "\tbl __modsi3\n" - "\tadds r1, r0, 0\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tldrb r0, [r6]\n" - "\tadds r0, r5\n" - "\tlsls r0, 6\n" - "\tadd r0, r8\n" - "\tldr r2, =gContestOpponents\n" - "\tmov r3, sp\n" - "\tadds r4, r3, r1\n" - "\tldrb r1, [r4]\n" - "\tlsls r1, 6\n" - "\tadds r1, r2\n" - "\tmovs r2, 0x40\n" - "\tbl memcpy\n" - "\tldrb r0, [r6]\n" - "\tadds r0, r5\n" - "\tlsls r0, 6\n" - "\tmov r1, r8\n" - "\tadds r1, 0xD\n" - "\tadds r0, r1\n" - "\tbl sub_80DF9D4\n" - "\tldrb r0, [r6]\n" - "\tadds r0, r5\n" - "\tlsls r0, 6\n" - "\tadd r0, r9\n" - "\tmovs r1, 0x2\n" - "\tbl sub_80DF9E0\n" - "\tldrb r0, [r4]\n" - "\tadds r3, r5, 0x1\n" - "\tsubs r1, r7, 0x1\n" - "\tcmp r0, 0xFF\n" - "\tbeq _080DADE6\n" - "\tadds r2, r4, 0\n" - "_080DADDA:\n" - "\tldrb r0, [r2, 0x1]\n" - "\tstrb r0, [r2]\n" - "\tadds r2, 0x1\n" - "\tldrb r0, [r2]\n" - "\tcmp r0, 0xFF\n" - "\tbne _080DADDA\n" - "_080DADE6:\n" - "\tlsls r0, r1, 24\n" - "\tlsrs r7, r0, 24\n" - "\tadds r5, r3, 0\n" - "\tldrb r1, [r6]\n" - "\tmovs r0, 0x4\n" - "\tsubs r0, r1\n" - "\tcmp r5, r0\n" - "\tblt _080DAD82\n" - "_080DADF6:\n" - "\tadd sp, 0x64\n" - "\tpop {r3,r4}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.pool"); -} -#endif // GetContestAvailability? u8 sub_80DAE0C(struct Pokemon *pkmn) @@ -2382,7 +2252,7 @@ u8 sub_80DAE0C(struct Pokemon *pkmn) return retVal; } -void sub_80DAEA4(void) +static void sub_80DAEA4(void) { s32 i; @@ -2394,7 +2264,7 @@ void sub_80DAEA4(void) } } -u8 * sub_80DAED4(const u8 * src, u8 color) +static u8 *sub_80DAED4(const u8 *src, u8 color) { u8 * ptr = StringCopy(gDisplayedStringBattle, gText_ColorTransparent); ptr[-1] = color; @@ -2403,12 +2273,12 @@ u8 * sub_80DAED4(const u8 * src, u8 color) return ptr; } -void sub_80DAF04(u8 a0) +static void sub_80DAF04(u8 a0) { sub_80DAF1C(a0, a0 + 10); } -void sub_80DAF1C(u8 a0, u8 a1) +static void sub_80DAF1C(u8 a0, u8 a1) { u8 buffer[32]; s32 offset; @@ -2422,18 +2292,18 @@ void sub_80DAF1C(u8 a0, u8 a1) Contest_PrintTextToBg0WindowAt(gUnknown_02039F26[a0], gDisplayedStringBattle, offset, 1, 7); } -void sub_80DAF88(u8 a0) +static void sub_80DAF88(u8 a0) { sub_80DAFA0(a0, a0 + 10); } -void sub_80DAFA0(u8 a0, u8 a1) +static void sub_80DAFA0(u8 a0, u8 a1) { sub_80DAED4(gContestMons[a0].nickname, a1); Contest_PrintTextToBg0WindowAt(gUnknown_02039F26[a0], gDisplayedStringBattle, 5, 1, 7); } -u16 sub_80DAFE0(u8 who, u8 contestCategory) +static u16 sub_80DAFE0(u8 who, u8 contestCategory) { u8 statMain; u8 statSub1; @@ -2441,32 +2311,32 @@ u16 sub_80DAFE0(u8 who, u8 contestCategory) switch (contestCategory) { - case CONTEST_CATEGORY_COOL: - statMain = gContestMons[who].cool; - statSub1 = gContestMons[who].tough; - statSub2 = gContestMons[who].beauty; - break; - case CONTEST_CATEGORY_BEAUTY: - statMain = gContestMons[who].beauty; - statSub1 = gContestMons[who].cool; - statSub2 = gContestMons[who].cute; - break; - case CONTEST_CATEGORY_CUTE: - statMain = gContestMons[who].cute; - statSub1 = gContestMons[who].beauty; - statSub2 = gContestMons[who].smart; - break; - case CONTEST_CATEGORY_SMART: - statMain = gContestMons[who].smart; - statSub1 = gContestMons[who].cute; - statSub2 = gContestMons[who].tough; - break; - case CONTEST_CATEGORY_TOUGH: - default: - statMain = gContestMons[who].tough; - statSub1 = gContestMons[who].smart; - statSub2 = gContestMons[who].cool; - break; + case CONTEST_CATEGORY_COOL: + statMain = gContestMons[who].cool; + statSub1 = gContestMons[who].tough; + statSub2 = gContestMons[who].beauty; + break; + case CONTEST_CATEGORY_BEAUTY: + statMain = gContestMons[who].beauty; + statSub1 = gContestMons[who].cool; + statSub2 = gContestMons[who].cute; + break; + case CONTEST_CATEGORY_CUTE: + statMain = gContestMons[who].cute; + statSub1 = gContestMons[who].beauty; + statSub2 = gContestMons[who].smart; + break; + case CONTEST_CATEGORY_SMART: + statMain = gContestMons[who].smart; + statSub1 = gContestMons[who].cute; + statSub2 = gContestMons[who].tough; + break; + case CONTEST_CATEGORY_TOUGH: + default: + statMain = gContestMons[who].tough; + statSub1 = gContestMons[who].smart; + statSub2 = gContestMons[who].cool; + break; } return statMain + (statSub1 + statSub2 + gContestMons[who].sheen) / 2; } @@ -2479,7 +2349,7 @@ void sub_80DB09C(u8 contestCategory) gContestMonConditions[i] = sub_80DAFE0(i, contestCategory); } -u8 sub_80DB0C4(void) +static u8 sub_80DB0C4(void) { u8 spriteId; @@ -2491,7 +2361,7 @@ u8 sub_80DB0C4(void) return spriteId; } -u8 sub_80DB120(void) +static u8 sub_80DB120(void) { u8 spriteId; @@ -2503,10 +2373,10 @@ u8 sub_80DB120(void) return spriteId; } -u8 sub_80DB174(u16 species, u32 otId, u32 personality, u32 index) +static u8 sub_80DB174(u16 species, u32 otId, u32 personality, u32 index) { u8 spriteId; - species = sub_80DE84C(species); + species = SanitizeSpecies(species); if (index == gContestPlayerMonIndex) HandleLoadSpecialPokePic_2(gMonBackPicTable + species, gMonSpritesGfxPtr->sprites[0], species, personality); @@ -2540,36 +2410,36 @@ bool8 IsSpeciesNotUnown(u16 species) return TRUE; } -void sub_80DB2BC(void) +static void sub_80DB2BC(void) { CpuCopy16(gContestResources->field_24[0], gContestResources->field_24[0] + 0x500, 0x280); CpuCopy16(gContestResources->field_24[2], gContestResources->field_24[2] + 0x500, 0x280); } -u16 sub_80DB2EC(u16 a0, u8 a1) +static u16 sub_80DB2EC(u16 a0, u8 a1) { u16 var; switch (gContestEffects[gContestMoves[a0].effect].effectType) { - case 0: - case 1: - case 8: - var = 0x9082; - break; - case 2: - case 3: - var = 0x9088; - break; - default: - var = 0x9086; - break; + case 0: + case 1: + case 8: + var = 0x9082; + break; + case 2: + case 3: + var = 0x9088; + break; + default: + var = 0x9086; + break; } var += 0x9000 + (a1 << 12); return var; } -void prints_contest_move_description(u16 a) +static void prints_contest_move_description(u16 a) { u8 category; u16 categoryTile; @@ -2613,7 +2483,7 @@ void prints_contest_move_description(u16 a) Contest_PrintTextToBg0WindowStd(9, gText_Slash); } -void sub_80DB4E0(u16 move, u8 b) +static void sub_80DB4E0(u16 move, u8 b) { u8 r7 = gUnknown_02039F26[b] * 5 + 2; @@ -2630,7 +2500,7 @@ void sub_80DB4E0(u16 move, u8 b) } } -void sub_80DB584(void) +static void sub_80DB584(void) { s32 i; @@ -2638,12 +2508,12 @@ void sub_80DB584(void) sub_80DB4E0(gContestResources->field_4[i].currMove, i); } -u16 sub_80DB5B0(void) +static u16 sub_80DB5B0(void) { return 0x2034; } -bool8 sub_80DB5B8(u8 contestantIdx, bool8 resetMod) +static bool8 sub_80DB5B8(u8 contestantIdx, bool8 resetMod) { u8 r6; s32 r4; @@ -2673,7 +2543,7 @@ bool8 sub_80DB5B8(u8 contestantIdx, bool8 resetMod) return TRUE; } -void sub_80DB69C(void) +static void sub_80DB69C(void) { s32 i; s32 r6; @@ -2689,33 +2559,33 @@ void sub_80DB69C(void) } } -u16 sub_80DB748(u8 status) +static u16 sub_80DB748(u8 status) { u16 var = 0; switch (status) { - case 0: - var = 0x80; - break; - case 1: - var = 0x84; - break; - case 2: - var = 0x86; - break; - case 3: - var = 0x88; - break; - case 4: - var = 0x82; - break; + case 0: + var = 0x80; + break; + case 1: + var = 0x84; + break; + case 2: + var = 0x86; + break; + case 3: + var = 0x88; + break; + case 4: + var = 0x82; + break; } var += 0x9000; return var; } -bool8 sub_80DB798(u8 a) +static bool8 sub_80DB798(u8 a) { bool8 r9 = TRUE; u16 r8 = 0; @@ -2740,3 +2610,2581 @@ bool8 sub_80DB798(u8 a) } return r9; } + +static void sub_80DB884(void) +{ + s32 i; + + for (i = 0; i < 4; i++) + sub_80DB798(i); +} + +static void sub_80DB89C(void) +{ + FillWindowPixelBuffer(4, 0); + CopyWindowToVram(4, 2); + Contest_SetBgCopyFlags(0); +} + +static u16 GetChosenMove(u8 a) +{ + if (Contest_IsMonsTurnDisabled(a)) + return 0; + if (a == gContestPlayerMonIndex) + { + return gContestMons[a].moves[sContest.playerMoveChoice]; + } + else + { + u8 moveChoice; + + ContestAI_ResetAI(a); + moveChoice = ContestAI_GetActionToUse(); + return gContestMons[a].moves[moveChoice]; + } +} + +static void sub_80DB918(void) +{ + s32 i; + + for (i = 0; i < 4; i++) + sContestantStatus[i].currMove = GetChosenMove(i); +} + +static void sub_80DB944(void) +{ + s32 i; + s32 j; + s16 arr[4]; + + for (i = 0; i < 4; i++) + { + sContestantStatus[i].unk4 += sContestantStatus[i].appeal2; + arr[i] = sContestantStatus[i].unk4; + } + for (i = 0; i < 3; i++) + { + for (j = 3; j > i; j--) + { + if (arr[j - 1] < arr[j]) + { + u16 temp = arr[j]; + + arr[j] = arr[j - 1]; + arr[j - 1] = temp; + } + } + } + for (i = 0; i < 4; i++) + { + for (j = 0; j < 4; j++) + { + if (sContestantStatus[i].unk4 == arr[j]) + { + sContestantStatus[i].unkB_0 = j; + break; + } + } + } + sub_80DCE58(1); + sub_80DD590(); +} + +static void sub_80DBA18(void) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + u8 attentionLevel; + + if (sContestantStatus[i].currMove == MOVE_NONE) + attentionLevel = 5; + else if (sContestantStatus[i].appeal2 <= 0) + attentionLevel = 0; + else if (sContestantStatus[i].appeal2 < 30) + attentionLevel = 1; + else if (sContestantStatus[i].appeal2 < 60) + attentionLevel = 2; + else if (sContestantStatus[i].appeal2 < 80) + attentionLevel = 3; + else + attentionLevel = 4; + + sContestantStatus[i].attentionLevel = attentionLevel; + } +} + +static bool8 sub_80DBA68(u8 a) +{ + if (sContestantStatus[a].numTurnsSkipped != 0 || sContestantStatus[a].noMoreTurns) + return FALSE; + else + return TRUE; +} + +static void sub_80DBAA0(void) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + sContestantStatus[i].appeal2 = 0; + sContestantStatus[i].appeal1 = 0; + sContestantStatus[i].jamSafetyCount = 0; + if (sContestantStatus[i].numTurnsSkipped > 0) + sContestantStatus[i].numTurnsSkipped--; + sContestantStatus[i].jam = 0; + sContestantStatus[i].resistant = 0; + sContestantStatus[i].jamReduction = 0; + sContestantStatus[i].immune = 0; + sContestantStatus[i].moreEasilyStartled = 0; + sContestantStatus[i].usedRepeatableMove = 0; + sContestantStatus[i].nervous = 0; + sContestantStatus[i].effectStringId = CONTEST_STRING_NONE; + sContestantStatus[i].effectStringId2 = CONTEST_STRING_NONE; + sContestantStatus[i].conditionMod = 0; + sContestantStatus[i].unk15_2 = sContestantStatus[i].disappointedRepeat; + sContestantStatus[i].disappointedRepeat = FALSE; + sContestantStatus[i].turnOrderModAction = 0; + sContestantStatus[i].appealTripleCondition = 0; + if (sContestantStatus[i].turnSkipped) + { + sContestantStatus[i].numTurnsSkipped = 1; + sContestantStatus[i].turnSkipped = 0; + } + if (sContestantStatus[i].exploded) + { + sContestantStatus[i].noMoreTurns = 1; + sContestantStatus[i].exploded = 0; + } + sContestantStatus[i].overrideCategoryExcitementMod = 0; + } + for (i = 0; i < 4; i++) + { + sContestantStatus[i].prevMove = sContestantStatus[i].currMove; + sContest.unk19220[sContest.turnNumber][i] = sContestantStatus[i].currMove; + sContest.unk19248[sContest.turnNumber][i] = Contest_GetMoveExcitement(sContestantStatus[i].currMove); + sContestantStatus[i].currMove = MOVE_NONE; + } + shared19328.excitementFrozen = 0; +} + +bool8 Contest_IsMonsTurnDisabled(u8 a) +{ + if (sContestantStatus[a].numTurnsSkipped != 0 || sContestantStatus[a].noMoreTurns) + return TRUE; + else + return FALSE; +} + +static void sub_80DBCE0(u8 a) +{ + gUnknown_02039F18[a] = sub_80DBD34(a); + gUnknown_02039F08[a] = gContestMonConditions[a] + gUnknown_02039F18[a]; +} + +static void sub_80DBD18(void) +{ + s32 i; + + for (i = 0; i < 4; i++) + sub_80DBCE0(i); + DetermineFinalStandings(); +} + +static s16 sub_80DBD34(u8 a) +{ + return gUnknown_02039F10[a] * 2; +} + +static void DetermineFinalStandings(void) +{ + u16 sp0[4] = {0}; + struct UnknownContestStruct6 sp8[4]; + s32 i; + s32 j; + + for (i = 0; i < 4; i++) + { + s32 r2; + + sp0[i] = Random(); + for (r2 = 0; r2 < i; r2++) + { + if (sp0[i] == sp0[r2]) + { + i--; + break; + } + } + } + + for (i = 0; i < 4; i++) + { + sp8[i].unk0 = gUnknown_02039F08[i]; + sp8[i].unk4 = gContestMonConditions[i]; + sp8[i].unk8 = sp0[i]; + sp8[i].unkC = i; + } + + for (i = 0; i < 3; i++) + { + for (j = 3; j > i; j--) + { + if (sub_80DBF30(j - 1, j, sp8)) + { + struct UnknownContestStruct6 temp; + + temp.unk0 = sp8[j - 1].unk0; + temp.unk4 = sp8[j - 1].unk4; + temp.unk8 = sp8[j - 1].unk8; + temp.unkC = sp8[j - 1].unkC; + + sp8[j - 1].unk0 = sp8[j].unk0; + sp8[j - 1].unk4 = sp8[j].unk4; + sp8[j - 1].unk8 = sp8[j].unk8; + sp8[j - 1].unkC = sp8[j].unkC; + + sp8[j].unk0 = temp.unk0; + sp8[j].unk4 = temp.unk4; + sp8[j].unk8 = temp.unk8; + sp8[j].unkC = temp.unkC; + } + } + } + + for (i = 0; i < 4; i++) + gContestFinalStandings[sp8[i].unkC] = i; +} + +void sub_80DBED4(void) +{ + if ((gIsLinkContest & 1)) + { + gSaveBlock2Ptr->contestLinkResults[gSpecialVar_ContestCategory][gContestFinalStandings[gContestPlayerMonIndex]] = + ((gSaveBlock2Ptr->contestLinkResults[gSpecialVar_ContestCategory][gContestFinalStandings[gContestPlayerMonIndex]] + 1) > 9999) ? 9999 : + (gSaveBlock2Ptr->contestLinkResults[gSpecialVar_ContestCategory][gContestFinalStandings[gContestPlayerMonIndex]] + 1); + + } +} + +static bool8 sub_80DBF30(s32 a, s32 b, struct UnknownContestStruct6 *c) +{ + bool8 retVal; + + if (c[a].unk0 < c[b].unk0) + retVal = TRUE; + else if (c[a].unk0 > c[b].unk0) + retVal = FALSE; + else if (c[a].unk4 < c[b].unk4) + retVal = TRUE; + else if (c[a].unk4 > c[b].unk4) + retVal = FALSE; + else if (c[a].unk8 < c[b].unk8) + retVal = TRUE; + else + retVal = FALSE; + return retVal; +} + +static void sub_80DBF68(void) +{ + gBattle_BG0_Y = 0; + gBattle_BG2_Y = 0; + sub_80DB89C(); + Contest_StartTextPrinter((u8*) &gUnknown_0827E8DA, 0); +} + +static void sub_80DBF90(void) +{ + int i; + + for(i = 0; i < 4; i++) + { + ContestBG_FillBoxWithTile(0, 0, 0x16, 2 + i * 5, 8, 2, 0x11); + } +} + +static u16 sub_80DBFC8(u8 a) +{ + u16 var; + + if (a == 0) + var = 0x5011; + else if (a == 1) + var = 0x6011; + else if (a == 2) + var = 0x7011; + else + var = 0x8011; + return var + 1; +} + +static s8 sub_80DBFFC(s16 a) +{ + s8 retVal = a / 10; + + if (retVal > 16) + retVal = 16; + else if (retVal < -16) + retVal = -16; + return retVal; +} + +static u8 sub_80DC028(s16 a, s16 b, u8 c) +{ + u8 taskId; + s8 r4; + s8 r5; + + gContestResources->field_14[c].unk2_2 = 1; + taskId = CreateTask(sub_80DC0F4, 20); + r4 = sub_80DBFFC(a); + r5 = sub_80DBFFC(a + b) - r4; + sub_80DBFC8(c); // unused return value + gTasks[taskId].data[0] = abs(r4); + gTasks[taskId].data[1] = r5; + if (r4 > 0 || (r4 == 0 && r5 > 0)) + gTasks[taskId].data[2] = 1; + else + gTasks[taskId].data[2] = -1; + gTasks[taskId].data[3] = c; + return taskId; +} + +static void sub_80DC0F4(u8 taskId) +{ + u8 r7 = gTasks[taskId].data[3]; + s16 r3 = gTasks[taskId].data[0]; + s16 r1 = gTasks[taskId].data[1]; + + if (++gTasks[taskId].data[10] > 14) + { + u16 r6; + u8 r5; + u8 r10; + u8 r11; + + gTasks[taskId].data[10] = 0; + if (gTasks[taskId].data[1] == 0) + { + DestroyTask(taskId); + gContestResources->field_14[r7].unk2_2 = 0; + return; + } + else if (r3 == 0) + { + if (r1 < 0) + { + r6 = sub_80DBFC8(r7) + 2; + gTasks[taskId].data[1]++; + } + else + { + r6 = sub_80DBFC8(r7); + gTasks[taskId].data[1]--; + } + r5 = gTasks[taskId].data[0]++; + } + else + { + if (gTasks[taskId].data[2] < 0) + { + if (r1 < 0) + { + r5 = gTasks[taskId].data[0]++; + gTasks[taskId].data[1]++; + r6 = sub_80DBFC8(r7) + 2; + } + else + { + r5 = --gTasks[taskId].data[0]; + r6 = 0; + gTasks[taskId].data[1]--; + } + } + else + { + if (r1 < 0) + { + r5 = --gTasks[taskId].data[0]; + r6 = 0; + gTasks[taskId].data[1]++; + } + else + { + r5 = gTasks[taskId].data[0]++; + gTasks[taskId].data[1]--; + r6 = sub_80DBFC8(r7); + } + } + } + r10 = r5; + r11 = 0; + + if (r5 > 7) + { + r11 = 1; + r5-= 8; + } + ContestBG_FillBoxWithTile(0, r6, r5 + 22, gUnknown_02039F26[r7] * 5 + 2 + r11, 1, 1, 17); + if (r1 > 0) + { + PlaySE(SE_C_GAJI); + m4aMPlayImmInit(&gMPlayInfo_SE1); + m4aMPlayPitchControl(&gMPlayInfo_SE1, 0xFFFF, r10 * 256); + } + else + { + PlaySE(SE_BOO); + } + + if (!r11 && !r5 && !r6) + gTasks[taskId].data[2] = -gTasks[taskId].data[2]; + } +} + +static void sub_80DC2BC(void) +{ + s32 i; + + LoadSpriteSheet(&gUnknown_08587A74); + for (i = 0; i < 4; i++) + { + u8 y = gUnknown_08587A6C[gUnknown_02039F26[i]]; + + gContestResources->field_14[i].unk0 = CreateSprite(&gSpriteTemplate_8587AD0, 180, y, 1); + } +} + +static void sub_80DC308(u8 a) +{ + u8 spriteId; + s16 r5; + + gContestResources->field_14[a].unk2_0 = 1; + spriteId = gContestResources->field_14[a].unk0; + r5 = sContestantStatus[a].unk4 / 10 * 2; + if (r5 > 56) + r5 = 56; + else if (r5 < 0) + r5 = 0; + gSprites[spriteId].invisible = FALSE; + gSprites[spriteId].data[0] = a; + gSprites[spriteId].data[1] = r5; + if (gSprites[spriteId].data[1] > gSprites[spriteId].pos2.x) + gSprites[spriteId].data[2] = 1; + else + gSprites[spriteId].data[2] = -1; + gSprites[spriteId].callback = sub_80DC408; +} + +static void sub_80DC3AC(void) +{ + s32 i; + + for (i = 0; i < 4; i++) + sub_80DC308(i); +} + +static bool8 sub_80DC3C4(void) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + if (gContestResources->field_14[i].unk2_0) + break; + } + if (i == 4) + return TRUE; + else + return FALSE; +} + +static void sub_80DC408(struct Sprite *sprite) +{ + if (sprite->pos2.x == sprite->data[1]) + { + gContestResources->field_14[sprite->data[0]].unk2_0 = 0; + sprite->callback = SpriteCallbackDummy; + } + else + { + sprite->pos2.x += sprite->data[2]; + } +} + +static void sub_80DC44C(void) +{ + s32 i; + + for (i = 0; i < 4; i++) + gSprites[gContestResources->field_14[i].unk0].pos1.y = gUnknown_08587A6C[gUnknown_02039F26[i]]; +} + +static void sub_80DC490(bool8 a) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + if (gUnknown_02039F26[i] > 1) + { + if (!a) + gSprites[gContestResources->field_14[i].unk0].pos1.x = 180; + else + gSprites[gContestResources->field_14[i].unk0].pos1.x = 256; + } + } +} + +static void sub_80DC4F0(void) +{ + s32 i; + + LoadSpritePalette(&gUnknown_08587B08); + for (i = 0; i < 4; i++) + { + LoadCompressedSpriteSheet(&gUnknown_08587AE8[i]); + gContestResources->field_14[i].unk1 = CreateSprite(&gSpriteTemplate_8587B18[i], + 204, + gUnknown_08587A70[gUnknown_02039F26[i]], + 0); + SetSubspriteTables(&gSprites[gContestResources->field_14[i].unk1], gSubspriteTables_8587B80); + gSprites[gContestResources->field_14[i].unk1].invisible = TRUE; + } +} + +static void CreateApplauseMeterSprite(void) +{ + u8 spriteId; + + LoadCompressedSpriteSheet(&gUnknown_08587BB0); + LoadSpritePalette(&gUnknown_08587BB8); + spriteId = CreateSprite(&gSpriteTemplate_8587BC8, 30, 44, 1); + gSprites[spriteId].invisible = TRUE; + sContest.applauseMeterSpriteId = spriteId; +} + +static void sub_80DC5E8(void) +{ + u8 i; + u8 taskId = CreateTask(sub_80DC728, 30); + + sContest.unk19211 = taskId; + for (i = 0; i < 4; i++) + gTasks[taskId].data[i * 4] = 0xFF; +} + +static void sub_80DC630(u8 a) +{ + gTasks[sContest.unk19211].data[a * 4 + 0] = 0; + gTasks[sContest.unk19211].data[a * 4 + 1] = 0; +} + +static void sub_80DC674(u8 a) +{ + u8 taskId = CreateTask(sub_80DC6A4, 31); + + gTasks[taskId].data[0] = a; +} + +static void sub_80DC6A4(u8 taskId) +{ + u8 r4 = gTasks[taskId].data[0]; + + if (gTasks[sContest.unk19211].data[r4 * 4 + 0] == 0 + || gTasks[sContest.unk19211].data[r4 * 4 + 0] == 0xFF) + { + gTasks[sContest.unk19211].data[r4 * 4 + 0] = 0xFF; + gTasks[sContest.unk19211].data[r4 * 4 + 1] = 0; + BlendPalette((sContest.unk19218[r4] + 5) * 16 + 6, 2, 0, RGB(31, 31, 18)); + DestroyTask(taskId); + } +} + +static void sub_80DC728(u8 taskId) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + u8 r3 = i * 4; + + if (gTasks[taskId].data[r3 + 0] != 0xFF) + { + if (gTasks[taskId].data[r3 + 1] == 0) + gTasks[taskId].data[r3 + 0]++; + else + gTasks[taskId].data[r3 + 0]--; + + if (gTasks[taskId].data[r3 + 0] == 16 + || gTasks[taskId].data[r3 + 0] == 0) + gTasks[taskId].data[r3 + 1] ^= 1; + + BlendPalette( + (sContest.unk19218[i] + 5) * 16 + 6, + 2, + gTasks[taskId].data[r3 + 0], + RGB(31, 31, 18)); + } + } +} + +static void sub_80DC7EC(void) +{ + s32 i; + + sContest.unk19212 = CreateTask(sub_80DC8D0, 30); + for (i = 0; i < 4; i++) + sub_80DC81C(i); +} + +static void sub_80DC81C(u8 a) +{ + gTasks[sContest.unk19212].data[a * 4 + 0] = 0xFF; + gTasks[sContest.unk19212].data[a * 4 + 1] = 0; +} + +static void sub_80DC864(void) +{ + s32 i; + + for (i = 0; i < 4; i++) + sub_80DC87C(i); +} + +static void sub_80DC87C(u8 a) +{ + u32 var; + u32 r0; + + sub_80DC81C(a); + + r0 = a + 5; + DmaCopy16Defvars(3, + gPlttBufferUnfaded + r0 * 16 + 10, + gPlttBufferFaded + r0 * 16 + 10, + 2); + var = (a + 5) * 16 + 12 + a; + DmaCopy16Defvars(3, + gPlttBufferUnfaded + var, + gPlttBufferFaded + var, + 2); +} + +static void sub_80DC8D0(u8 taskId) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + u8 r3 = i * 4; + + if (gTasks[taskId].data[r3 + 0] != 0xFF) + { + if (++gTasks[taskId].data[r3 + 2] > 2) + { + gTasks[taskId].data[r3 + 2] = 0; + + if (gTasks[taskId].data[r3 + 1] == 0) + gTasks[taskId].data[r3 + 0]++; + else + gTasks[taskId].data[r3 + 0]--; + + if (gTasks[taskId].data[r3 + 0] == 16 + || gTasks[taskId].data[r3 + 0] == 0) + gTasks[taskId].data[r3 + 1] ^= 1; + + BlendPalette((i + 5) * 16 + 10, 1, gTasks[taskId].data[r3 + 0], RGB(31, 31, 18)); + BlendPalette((i + 5) * 16 + 12 + i, 1, gTasks[taskId].data[r3 + 0], RGB(31, 31, 18)); + } + } + } +} + +static void sub_80DC9B4(u8 a) +{ + if (sContestantStatus[a].hasJudgesAttention) + sub_80DC630(a); + else + sub_80DC674(a); +} + +static u8 sub_80DC9EC(u8 a) +{ + u8 spriteId1, spriteId2; + u8 x = gUnknown_02039F26[a] * 40 + 32; + + LoadCompressedSpriteSheet(&gUnknown_08589904[a]); + LoadSpritePalette(&gUnknown_08589924[a]); + spriteId1 = CreateSprite(&gSpriteTemplate_858998C[a], 184, x, 29); + spriteId2 = CreateSprite(&gSpriteTemplate_858998C[a], 248, x, 29); + gSprites[spriteId2].oam.tileNum += 64; + + CopySpriteTiles(0, + 3, + (void *)VRAM, + (u16 *)(VRAM + 0xE000 + gUnknown_02039F26[a] * 5 * 64 + 0x26), + gContestResources->field_34); + + CopySpriteTiles(0, + 3, (void *)VRAM, + (u16 *)(VRAM + 0xE000 + gUnknown_02039F26[a] * 5 * 64 + 0x36), + gContestResources->field_38); + + CpuFill32(0, gContestResources->field_34 + 0x500, 0x300); + CpuFill32(0, gContestResources->field_38 + 0x500, 0x300); + + RequestDma3Copy(gContestResources->field_34, + (u8 *)(VRAM + 0x10000 + gSprites[spriteId1].oam.tileNum * 32), + 0x800, + 1); + + RequestDma3Copy(gContestResources->field_38, + (u8 *)(VRAM + 0x10000 + gSprites[spriteId2].oam.tileNum * 32), + 0x800, + 1); + + gSprites[spriteId1].data[0] = spriteId2; + gSprites[spriteId2].data[0] = spriteId1; + + gSprites[spriteId1].data[1] = a; + gSprites[spriteId2].data[1] = a; + + return spriteId1; +} + +static void sub_80DCB78(u8 spriteId) +{ + u8 spriteId2 = gSprites[spriteId].data[0]; + + FreeSpriteOamMatrix(&gSprites[spriteId2]); + DestroySprite(&gSprites[spriteId2]); + DestroySpriteAndFreeResources(&gSprites[spriteId]); +} + +static void sub_80DCBB4(void) +{ + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(7, 9)); +} + +static void sub_80DCBD0(void) +{ + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); +} + +static void sub_80DCBE8(u8 a, bool8 b) +{ + u8 r5; + + sub_80DCBB4(); + gContestResources->field_14[gSprites[a].data[1]].unk2_1 = 1; + r5 = gSprites[a].data[0]; + StartSpriteAffineAnim(&gSprites[a], 1); + StartSpriteAffineAnim(&gSprites[r5], 1); + gSprites[a].callback = sub_80DCC84; + gSprites[r5].callback = SpriteCallbackDummy; + if (b == FALSE) + PlaySE(SE_C_PIKON); + else + PlaySE(SE_PC_LOGIN); +} + +static void sub_80DCC84(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + { + u8 r1 = sprite->data[0]; + + if (gSprites[r1].affineAnimEnded) + { + sprite->invisible = TRUE; + gSprites[r1].invisible = TRUE; + sprite->callback = sub_80DCCD8; + } + } +} + +static void sub_80DCCD8(struct Sprite *sprite) +{ + gContestResources->field_14[sprite->data[1]].unk2_1 = 0; + sub_80DCB78(sprite->data[0]); + sub_80DCBD0(); +} + +static void sub_80DCD08(void) +{ + if(gHeap[0x1A000] == 1) + gHeap[0x1A000] = 0; + else + gHeap[0x1A000] = 1; + + if(gHeap[0x1A000] == 0) + { + sub_80DAEA4(); + sub_80DB2BC(); + } + else + { + sub_80DCD48(); + } +} + +static void sub_80DCD48(void) +{ + u8 i; + s16 value; + u8 *txtPtr; + u8 text[8]; + + if (gUnknown_020322D5 == 0) + return; + + switch (gHeap[0x1A000]) + { + case 0: + break; + case 2: + case 3: + sub_80DF750(); + break; + default: + for (i = 0; i < 4; i++) + FillWindowPixelBuffer(i, 0); + for (i = 0; i < 4; i++) + { + value = sContestantStatus[i].unk4; + txtPtr = text; + if (sContestantStatus[i].unk4 < 0) + { + value *= -1; + txtPtr = StringCopy(txtPtr, gText_OneDash); + } + ConvertIntToDecimalStringN(txtPtr, value, STR_CONV_MODE_LEFT_ALIGN, 4); + Contest_PrintTextToBg0WindowAt(gUnknown_02039F26[i], text, 55, 1, 7); + } + for (i = 0; i < 4; i++) + { + value = sContestantStatus[i].appeal2; + txtPtr = text; + if (sContestantStatus[i].appeal2 < 0) + { + value *= -1; + txtPtr = StringCopy(txtPtr, gText_OneDash); + } + ConvertIntToDecimalStringN(txtPtr, value, STR_CONV_MODE_LEFT_ALIGN, 4); + Contest_PrintTextToBg0WindowAt(gUnknown_02039F26[i], text, 5, 1, 7); + } + sub_80DB2BC(); + break; + } +} + +void sub_80DCE58(u8 a) +{ + u8 sp0[4]; + u16 sp4[4] = {0}; + s32 i; + s32 r2; + s32 r4; + + for (i = 0; i < 4; i++) + { + sp4[i] = Random(); + for (r2 = 0; r2 < i; r2++) + { + if (sp4[i] == sp4[r2]) + { + i--; + break; + } + } + } + + if (a == 0) + { + for (i = 0; i < 4; i++) + { + gUnknown_02039F26[i] = i; + for (r4 = 0; r4 < i; r4++) + { + if (gContestMonConditions[gUnknown_02039F26[r4]] < gContestMonConditions[i] + || (gContestMonConditions[gUnknown_02039F26[r4]] == gContestMonConditions[i] && sp4[gUnknown_02039F26[r4]] < sp4[i])) + { + for (r2 = i; r2 > r4; r2--) + gUnknown_02039F26[r2] = gUnknown_02039F26[r2 - 1]; + gUnknown_02039F26[r4] = i; + break; + } + } + if (r4 == i) + gUnknown_02039F26[i] = i; + } + memcpy(sp0, gUnknown_02039F26, sizeof(sp0)); + for (i = 0; i < 4; i++) + gUnknown_02039F26[sp0[i]] = i; + } + else + { + memset(sp0, 0xFF, sizeof(sp0)); + for (i = 0; i < 4; i++) + { + u8 r2 = sContestantStatus[i].unkB_0; + + while (1) + { + u8 *ptr = &sp0[r2]; + if (*ptr == 0xFF) + { + *ptr = i; + gUnknown_02039F26[i] = r2; + break; + } + r2++; + } + } + for (i = 0; i < 3; i++) + { + for (r4 = 3; r4 > i; r4--) + { + if (sContestantStatus[r4 - 1].unkB_0 == sContestantStatus[r4].unkB_0 + && gUnknown_02039F26[r4 - 1] < gUnknown_02039F26[r4] + && sp4[r4 - 1] < sp4[r4]) + { + u8 temp = gUnknown_02039F26[r4]; + + gUnknown_02039F26[r4] = gUnknown_02039F26[r4 - 1]; + gUnknown_02039F26[r4 - 1] = temp; + } + } + } + } +} + +static void sub_80DD04C(void) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + LoadPalette(&gHeap[0x1A004] + (i + 5) * 32, (gUnknown_02039F26[i] + 5) * 16, 32); + } + sub_80DAEA4(); +} + +static void sub_80DD080(u8 contestant) +{ + u16 move; + u8 effect; + u8 rnd; + bool8 r8; + s32 i; + + sContestantStatus[contestant].appeal2 = 0; + sContestantStatus[contestant].appeal1 = 0; + r8 = sub_80DBA68(contestant); + if (!r8) + return; + + move = sContestantStatus[contestant].currMove; + effect = gContestMoves[move].effect; + + sContestantStatus[contestant].moveCategory = gContestMoves[sContestantStatus[contestant].currMove].contestCategory; + if (sContestantStatus[contestant].currMove == sContestantStatus[contestant].prevMove && sContestantStatus[contestant].currMove != MOVE_NONE) + { + sContestantStatus[contestant].disappointedRepeat = TRUE; + sContestantStatus[contestant].moveRepeatCount++; + } + else + { + sContestantStatus[contestant].moveRepeatCount = 0; + } + sContestantStatus[contestant].appeal1 = gContestEffects[effect].appeal; + sContestantStatus[contestant].appeal2 = sContestantStatus[contestant].appeal1; + shared192D0.jam = gContestEffects[effect].jam; + shared192D0.jam2 = shared192D0.jam; + + shared192D0.contestant = contestant; + for (i = 0; i < 4; i++) + { + sContestantStatus[i].jam = 0; + shared192D0.unnervedPokes[i] = 0; + } + + if (sContestantStatus[contestant].hasJudgesAttention + && !AreMovesContestCombo(sContestantStatus[contestant].prevMove, sContestantStatus[contestant].currMove)) + sContestantStatus[contestant].hasJudgesAttention = 0; + + gContestEffectFuncs[effect](); + + if (sContestantStatus[contestant].conditionMod == 1) + sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].condition - 10; + else if (sContestantStatus[contestant].appealTripleCondition) + sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].condition * 3; + else + sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].condition; + + sContestantStatus[contestant].unk16 = 0; + sContestantStatus[contestant].unk15_6 = 0; + if (sub_80DE1E8(contestant)) + { + u8 r2 = AreMovesContestCombo(sContestantStatus[contestant].prevMove, sContestantStatus[contestant].currMove); + + if (r2 != 0 && sContestantStatus[contestant].hasJudgesAttention) + { + sContestantStatus[contestant].unk16 = r2; + sContestantStatus[contestant].unk15_6 = 1; + sContestantStatus[contestant].hasJudgesAttention = 0; + sContestantStatus[contestant].unk17 = sContestantStatus[contestant].appeal1 * sContestantStatus[contestant].unk16; + sContestantStatus[contestant].unk15_3 = 1; + } + else + { + if (gContestMoves[sContestantStatus[contestant].currMove].comboStarterId != 0) + { + sContestantStatus[contestant].hasJudgesAttention = 1; + sContestantStatus[contestant].unk15_6 = 1; + } + else + { + sContestantStatus[contestant].hasJudgesAttention = 0; + } + } + } + if (sContestantStatus[contestant].disappointedRepeat) + sContestantStatus[contestant].unk18 = (sContestantStatus[contestant].moveRepeatCount + 1) * 10; + + if (sContestantStatus[contestant].nervous) + { + sContestantStatus[contestant].hasJudgesAttention = 0; + sContestantStatus[contestant].appeal2 = 0; + sContestantStatus[contestant].appeal1 = 0; + } + shared19328.bits_0 = Contest_GetMoveExcitement(sContestantStatus[contestant].currMove); + if (sContestantStatus[contestant].overrideCategoryExcitementMod) + shared19328.bits_0 = 1; + + if (shared19328.bits_0 > 0) + { + if (sContest.applauseLevel + shared19328.bits_0 > 4) + shared19328.unk2 = 60; + else + shared19328.unk2 = 10; + } + else + { + shared19328.unk2 = 0; + } + + rnd = Random() % 3; + for (i = 0; i < 4; i++) + { + if (i != contestant) + { + if (rnd == 0) + break; + rnd--; + } + } + sContestantStatus[contestant].unk1B = i; +} + +void SetContestantEffectStringID(u8 a, u8 b) +{ + sContestantStatus[a].effectStringId = b; +} + +void SetContestantEffectStringID2(u8 a, u8 b) +{ + sContestantStatus[a].effectStringId2 = b; +} + +void SetStartledString(u8 contestant, u8 jam) +{ + if (jam >= 60) + SetContestantEffectStringID(contestant, CONTEST_STRING_TRIPPED_OVER); + else if (jam >= 40) + SetContestantEffectStringID(contestant, CONTEST_STRING_LEAPT_UP); + else if (jam >= 30) + SetContestantEffectStringID(contestant, CONTEST_STRING_UTTER_CRY); + else if (jam >= 20) + SetContestantEffectStringID(contestant, CONTEST_STRING_TURNED_BACK); + else if (jam >= 10) + SetContestantEffectStringID(contestant, CONTEST_STRING_LOOKED_DOWN); +} + +static void sub_80DD45C(u8 contestant, u8 stringId) +{ + StringCopy(gStringVar1, gContestMons[contestant].nickname); + StringCopy(gStringVar2, gMoveNames[sContestantStatus[contestant].currMove]); + if (gContestMoves[sContestantStatus[shared192D0.contestant].currMove].contestCategory == CONTEST_CATEGORY_COOL) + StringCopy(gStringVar3, gText_Contest_Shyness); + else if (gContestMoves[sContestantStatus[shared192D0.contestant].currMove].contestCategory == CONTEST_CATEGORY_BEAUTY) + StringCopy(gStringVar3, gText_Contest_Anxiety); + else if (gContestMoves[sContestantStatus[shared192D0.contestant].currMove].contestCategory == CONTEST_CATEGORY_CUTE) + StringCopy(gStringVar3, gText_Contest_Laziness); + else if (gContestMoves[sContestantStatus[shared192D0.contestant].currMove].contestCategory == CONTEST_CATEGORY_SMART) + StringCopy(gStringVar3, gText_Contest_Hesitancy); + else + StringCopy(gStringVar3, gText_Contest_Fear); + StringExpandPlaceholders(gStringVar4, gUnknown_08587E10[stringId]); + sub_80DB89C(); + Contest_StartTextPrinter(gStringVar4, 1); +} + +void MakeContestantNervous(u8 p) +{ + sContestantStatus[p].nervous = 1; + sContestantStatus[p].currMove = MOVE_NONE; +} + +static void sub_80DD590(void) +{ + u8 r12 = 0; + s32 i; + s32 j; + u8 sp0[4]; + u8 sp4[4]; + + for (i = 0; i < 4; i++) + { + sp0[i] = gUnknown_02039F26[i]; + sp4[i] = 0; + } + + for (i = 0; i < 4; i++) + { + for (j = 0; j < 4; j++) + { + if (sContestantStatus[j].nextTurnOrder == i) + { + sp0[j] = i; + sp4[j] = 1; + break; + } + } + if (j == 4) + { + for (j = 0; j < 4; j++) + { + if (sp4[j] == 0 && sContestantStatus[j].nextTurnOrder == 0xFF) + { + r12 = j; + j++; + break; + } + } + for (; j < 4; j++) + { + if (sp4[j] == 0 && sContestantStatus[j].nextTurnOrder == 0xFF + && gUnknown_02039F26[r12] > gUnknown_02039F26[j]) + r12 = j; + } + sp0[r12] = i; + sp4[r12] = 1; + } + } + + for (i = 0; i < 4; i++) + { + shared192D0.turnOrder[i] = sp0[i]; + sContestantStatus[i].nextTurnOrder = 0xFF; + sContestantStatus[i].turnOrderMod = 0; + gUnknown_02039F26[i] = sp0[i]; + } +} + +static void sub_80DD6DC(struct Sprite *sprite) +{ + if (sprite->data[1]++ > 84) + { + sprite->data[1] = 0; + sprite->invisible = TRUE; + sprite->callback = SpriteCallbackDummy; + sContest.unk1920A_4 = 0; + } +} + +static void sub_80DD720(u8 a) +{ + u8 spriteId = sContest.unk19216; + + switch (a) + { + case 0: + case 1: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0]; + PlaySE(SE_HAZURE); + break; + case 2: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 4; + PlaySE(SE_SEIKAI); + break; + case 3: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 8; + PlaySE(SE_SEIKAI); + break; + case 4: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 12; + PlaySE(SE_TK_WARPIN); + break; + case 5: // exactly the same as case 4 + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 12; + PlaySE(SE_TK_WARPIN); + break; + case 6: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 16; + PlaySE(SE_TK_WARPIN); + break; + case 8: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 24; + PlaySE(SE_W215); + break; + case 7: + default: + gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 20; + PlaySE(SE_TK_WARPIN); + break; + } + gSprites[spriteId].data[1] = 0; + gSprites[spriteId].invisible = FALSE; + gSprites[spriteId].callback = sub_80DD6DC; + sContest.unk1920A_4 = 1; +} + +static void sub_80DD940(void) +{ + s32 i; + + for (i = 0; i < 5; i++) + { + const u8 *src; + + if (i < sContest.applauseLevel) + src = gContestApplauseMeterGfx + 64; + else + src = gContestApplauseMeterGfx; + CpuCopy32(src, (void *)(VRAM + 0x10000 + (gSprites[sContest.applauseMeterSpriteId].oam.tileNum + 17 + i) * 32), 32); + CpuCopy32(src + 32, (void *)(VRAM + 0x10000 + (gSprites[sContest.applauseMeterSpriteId].oam.tileNum + 25 + i) * 32), 32); + + if (sContest.applauseLevel > 4) + sub_80DDA20(); + } +} + +s8 Contest_GetMoveExcitement(u16 move) +{ + return gContestExcitementTable[gSpecialVar_ContestCategory][gContestMoves[move].contestCategory]; +} + +static u8 sub_80DDA20(void) +{ + u8 taskId = CreateTask(c3_08130B10, 10); + + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[2] = IndexOfSpritePaletteTag(0x0ABE2); + return taskId; +} + +static void c3_08130B10(u8 taskId) +{ + if (++gTasks[taskId].data[0] == 1) + { + gTasks[taskId].data[0] = 0; + if (gTasks[taskId].data[3] == 0) + gTasks[taskId].data[4]++; + else + gTasks[taskId].data[4]--; + BlendPalette(264 + gTasks[taskId].data[2] * 16, 1, gTasks[taskId].data[4], RGB(31, 31, 31)); + if (gTasks[taskId].data[4] == 0 || gTasks[taskId].data[4] == 16) + { + gTasks[taskId].data[3] ^= 1; + if (sContest.applauseLevel < 5) + { + BlendPalette(264 + gTasks[taskId].data[2] * 16, 1, 0, RGB(31, 0, 0)); + DestroyTask(taskId); + } + } + } +} + +static void sub_80DDB0C(void) +{ + CreateTask(sub_80DDB6C, 10); + gSprites[sContest.applauseMeterSpriteId].pos2.x = -70; + gSprites[sContest.applauseMeterSpriteId].invisible = FALSE; + sContest.unk1920A_6 = 1; +} + +static void sub_80DDB6C(u8 taskId) +{ + struct Sprite *sprite = &gSprites[sContest.applauseMeterSpriteId]; + + gTasks[taskId].data[10] += 1664; + sprite->pos2.x += gTasks[taskId].data[10] >> 8; + gTasks[taskId].data[10] = gTasks[taskId].data[10] & 0xFF; + if (sprite->pos2.x > 0) + sprite->pos2.x = 0; + if (sprite->pos2.x == 0) + { + sContest.unk1920A_6 = 0; + DestroyTask(taskId); + } +} + +static void sub_80DDBE8(void) +{ + if (gSprites[sContest.applauseMeterSpriteId].invisible == TRUE) + { + sContest.unk1920A_6 = 0; + } + else + { + CreateTask(task08_080CD1CC, 10); + gSprites[sContest.applauseMeterSpriteId].pos2.x = 0; + sContest.unk1920A_6 = 1; + } +} + +static void task08_080CD1CC(u8 taskId) +{ + struct Sprite *sprite = &gSprites[sContest.applauseMeterSpriteId]; + + gTasks[taskId].data[10] += 1664; + sprite->pos2.x -= gTasks[taskId].data[10] >> 8; + gTasks[taskId].data[10] = gTasks[taskId].data[10] & 0xFF; + if (sprite->pos2.x < -70) + sprite->pos2.x = -70; + if (sprite->pos2.x == -70) + { + sprite->invisible = TRUE; + sContest.unk1920A_6 = 0; + DestroyTask(taskId); + } +} + +static void sub_80DDCDC(s8 a) +{ + u8 taskId = CreateTask(sub_80DDD20, 5); + + gTasks[taskId].data[0] = a; + sContest.unk1920A_5 = 1; +} + +static void sub_80DDD20(u8 taskId) +{ + switch (gTasks[taskId].data[10]) + { + case 0: + sub_80DDB0C(); + gTasks[taskId].data[10]++; + break; + case 1: + if (!sContest.unk1920A_6) + { + gTasks[taskId].data[10]++; + } + break; + case 2: + if (gTasks[taskId].data[11]++ > 20) + { + gTasks[taskId].data[11] = 0; + sub_80DD940(); + sContest.unk1920A_5 = 0; + DestroyTask(taskId); + } + break; + } +} + +void unref_sub_80DDDA8(void) +{ + gSprites[sContest.applauseMeterSpriteId].pos2.x = 0; + gSprites[sContest.applauseMeterSpriteId].invisible = FALSE; +} + +void unref_sub_80DDDE4(void) +{ + gSprites[sContest.applauseMeterSpriteId].invisible = TRUE; +} + +static void sub_80DDE0C(void) +{ + CreateTask(sub_80DDE30, 15); + sContest.unk1920A_7 = 1; +} + +static void sub_80DDE30(u8 taskId) +{ + if (gTasks[taskId].data[10]++ > 6) + { + gTasks[taskId].data[10] = 0; + if (gTasks[taskId].data[11] == 0) + { + RequestDma3Copy(shared16800, (void *)(VRAM + 0x2000), 0x1000, 1); + } + else + { + RequestDma3Copy(shared15800, (void *)(VRAM + 0x2000), 0x1000, 1); + gTasks[taskId].data[12]++; + } + + gTasks[taskId].data[11] ^= 1; + + if (gTasks[taskId].data[12] == 9) + { + sContest.unk1920A_7 = 0; + DestroyTask(taskId); + } + } +} + +#define tBlendColor data[0] +#define tBlendCoeff data[1] + +static void sub_80DDED0(s8 a, s8 b) +{ + u8 taskId = CreateTask(sub_80DDF80, 10); + u16 blendColor; + u8 blendCoeff; + u8 r3; + + if (a > 0) + { + blendColor = RGB(30, 27, 8); + if (b > 0) + { + blendCoeff = 0; + r3 = sContest.applauseLevel * 3; + } + else + { + blendCoeff = sContest.applauseLevel * 3; + r3 = 0; + } + } + else + { + blendColor = 0; + if (b > 0) + { + blendCoeff = 0; + r3 = 12; + } + else + { + blendCoeff = 12; + r3 = 0; + } + } + gTasks[taskId].tBlendColor = blendColor; + gTasks[taskId].tBlendCoeff = blendCoeff; + gTasks[taskId].data[2] = b; + gTasks[taskId].data[3] = r3; + sContest.unk1920B_0 = 0; +} + +static void sub_80DDF80(u8 taskId) +{ + if (gTasks[taskId].data[10]++ >= 0) + { + gTasks[taskId].data[10] = 0; + if (gTasks[taskId].data[2] > 0) + gTasks[taskId].tBlendCoeff++; + else + gTasks[taskId].tBlendCoeff--; + BlendPalette(17, 1, gTasks[taskId].tBlendCoeff, gTasks[taskId].tBlendColor); + BlendPalette(26, 1, gTasks[taskId].tBlendCoeff, gTasks[taskId].tBlendColor); + if (gTasks[taskId].tBlendCoeff == gTasks[taskId].data[3]) + { + DestroyTask(taskId); + sContest.unk1920B_0 = 0; + } + } +} + +#undef tBlendColor +#undef tBlendCoeff + +static void sub_80DE008(bool8 a) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + if (sContestantStatus[i].turnOrderMod != 0 && a) + { + CpuCopy32(GetTurnOrderNumberGfx(i), (void *)(VRAM + 0x10000 + (gSprites[gContestResources->field_14[i].unk1].oam.tileNum + 6) * 32), 32); + gSprites[gContestResources->field_14[i].unk1].pos1.y = gUnknown_08587A70[gUnknown_02039F26[i]]; + gSprites[gContestResources->field_14[i].unk1].invisible = FALSE; + } + else + { + gSprites[gContestResources->field_14[i].unk1].invisible = TRUE; + } + } +} + +static const u8 *GetTurnOrderNumberGfx(u8 contestant) +{ + if (sContestantStatus[contestant].turnOrderMod != 1) + return gContestNextTurnRandomGfx; + else + return gContestNextTurnNumbersGfx + sContestantStatus[contestant].nextTurnOrder * 32; +} + +static void sub_80DE12C(void) +{ + s32 r7 = 0; + u8 r10 = 2; + u8 r8 = 1; + u8 r9 = 0x11; + + for (r7 = 0; r7 < 4; r7++) + { + if (shared192D0.unnervedPokes[r7] != 0 && !Contest_IsMonsTurnDisabled(r7)) + { + u32 r6 = gUnknown_02039F26[r7] * 5 + 2; + u16 var = sub_80DB748(3); + + ContestBG_FillBoxWithIncrementingTile(0, var, 0x14, r6, r10, r8, r9, r8); + var += 16; + ContestBG_FillBoxWithIncrementingTile(0, var, 0x14, r6 + 1, r10, r8, r9, r8); + PlaySE(SE_C_PASI); + } + } +} + +bool8 sub_80DE1E8(u8 a) +{ + if (sContestantStatus[a].disappointedRepeat || sContestantStatus[a].nervous) + return FALSE; + else + return TRUE; +} + +static void sub_80DE224(void) +{ + s32 i; + u16 bg0Cnt, bg1Cnt, bg2Cnt; + + bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT); + ((vBgCnt *)&bg1Cnt)->priority = 0; + ((vBgCnt *)&bg1Cnt)->screenSize = 2; + ((vBgCnt *)&bg1Cnt)->areaOverflowMode = 0; + ((vBgCnt *)&bg1Cnt)->charBaseBlock = 0; + + SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt); + + bg0Cnt = GetGpuReg(REG_OFFSET_BG0CNT); + bg2Cnt = GetGpuReg(REG_OFFSET_BG2CNT); + ((vBgCnt *)&bg0Cnt)->priority = 1; + ((vBgCnt *)&bg2Cnt)->priority = 1; + + SetGpuReg(REG_OFFSET_BG0CNT, bg0Cnt); + SetGpuReg(REG_OFFSET_BG2CNT, bg2Cnt); + + gBattle_BG1_X = DISPLAY_WIDTH; + gBattle_BG1_Y = DISPLAY_HEIGHT; + SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); + SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); + + CpuFill32(0, gContestResources->field_24[1], 0x1000); + + CopyToBgTilemapBuffer(1, gUnknown_08C17980, 0, 0); + Contest_SetBgCopyFlags(1); + + for (i = 0; i < 4; i++) + { + gSprites[gContestResources->field_14[i].unk0].oam.priority = 1; + gSprites[gContestResources->field_14[i].unk1].oam.priority = 1; + } +} + +static void sub_80DE350(void) +{ + s32 i; + u16 bg1Cnt; + + RequestDma3Fill(0,(void *)(VRAM + 0x8000), 0x2000, 0x1); + CpuFill32(0, gContestResources->field_24[1], 0x1000); + Contest_SetBgCopyFlags(1); + bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT); + ((vBgCnt *) &bg1Cnt)->priority = 1; + ((vBgCnt *) &bg1Cnt)->screenSize = 0; + ((vBgCnt *) &bg1Cnt)->areaOverflowMode = 0; + ((vBgCnt *) &bg1Cnt)->charBaseBlock = 2; + + SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt); + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + + for (i = 0; i < 4; i++) + { + gSprites[gContestResources->field_14[i].unk0].oam.priority = 0; + gSprites[gContestResources->field_14[i].unk1].oam.priority = 0; + } +} + +static void sub_80DE424(u8 taskId) +{ + gBattle_BG1_X = 0; + gBattle_BG1_Y = DISPLAY_HEIGHT; + PlaySE12WithPanning(SE_C_MAKU_D, 0); + gTasks[taskId].func = sub_80DE464; +} + +static void sub_80DE464(u8 taskId) +{ + if ((s16)(gBattle_BG1_Y -= 7) < 0) + gBattle_BG1_Y = 0; + if (gBattle_BG1_Y == 0) + { + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_80DE4A8; + } +} + +static void sub_80DE4A8(u8 taskId) +{ + s32 i; + + switch (gTasks[taskId].data[0]) + { + case 0: + for (i = 0; i < 4; i++) + sContest.unk19218[i] = gUnknown_02039F26[i]; + sub_80DBF90(); + sub_80DC864(); + sub_80DB69C(); + sub_80DD04C(); + sub_80DE008(TRUE); + sub_80DC44C(); + gTasks[taskId].data[0] = 1; + break; + case 1: + if (gIsLinkContest & 1) + { + u8 taskId2; + + sContest.unk1920B_2 = 1; + if (sub_80DA8A4()) + sub_80DBAA0(); + taskId2 = CreateTask(sub_80FCC88, 0); + SetTaskFuncWithFollowupFunc(taskId2, sub_80FCC88, sub_80DA110); + sub_80DBF68(); + gTasks[taskId].data[0] = 2; + } + else + { + sub_80DBAA0(); + gTasks[taskId].data[0] = 3; + } + break; + case 2: + if (!sContest.unk1920B_2) + gTasks[taskId].data[0] = 3; + break; + case 3: + sub_80DB884(); + sub_80DB2BC(); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_80DE5F4; + break; + } +} + +static void sub_80DE5C0(u8 taskId) +{ + if ((s16)(gBattle_BG1_Y += 7) > DISPLAY_HEIGHT) + gTasks[taskId].func = sub_80DA4F4; +} + +static void sub_80DE5F4(u8 taskId) +{ + if (gTasks[taskId].data[2] < 10) + { + gTasks[taskId].data[2]++; + } + else + { + if (gTasks[taskId].data[1] == 0) + { + if (gTasks[taskId].data[0] == 16) + gTasks[taskId].data[1]++; + else + gTasks[taskId].data[0]++; + } + else + { + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_80DE65C; + } + else + { + gTasks[taskId].data[0]--; + } + } + } +} + +static void sub_80DE65C(u8 taskId) +{ + if (gTasks[taskId].data[2] < 10) + { + gTasks[taskId].data[2]++; + } + else + { + gTasks[taskId].data[2] = 0; + PlaySE12WithPanning(SE_C_MAKU_U, 0); + gTasks[taskId].func = sub_80DE5C0; + } +} + +static void sub_80DE69C(u8 a) +{ + s32 i; + u8 taskId; + + for (i = 0; i < 4; i++) + { + gSprites[gContestResources->field_14[i].unk0].oam.matrixNum = AllocOamMatrix(); + gSprites[gContestResources->field_14[i].unk0].oam.affineMode = 1; + StartSpriteAffineAnim(&gSprites[gContestResources->field_14[i].unk0], a); + if (a == 2) + { + AnimateSprite(&gSprites[gContestResources->field_14[i].unk0]); + gSprites[gContestResources->field_14[i].unk0].invisible = FALSE; + } + } + taskId = CreateTask(sub_80DE794, 5); + gTasks[taskId].data[0] = a; + sContest.unk1920B_1 = 1; +} + +static void sub_80DE794(u8 taskId) +{ + s32 i; + + if (gSprites[gContestResources->field_14[0].unk0].affineAnimEnded) + { + if ((u8)gTasks[taskId].data[0] == 1) + { + for (i = 0; i < 4; i++) + gSprites[gContestResources->field_14[i].unk0].invisible = TRUE; + } + for (i = 0; i < 4; i++) + FreeSpriteOamMatrix(&gSprites[gContestResources->field_14[i].unk0]); + sContest.unk1920B_1 = 0; + DestroyTask(taskId); + } +} + +static u16 SanitizeMove(u16 move) +{ + if (move >= MOVES_COUNT) + move = MOVE_POUND; + return move; +} + +static u16 SanitizeSpecies(u16 species) +{ + if (species >= NUM_SPECIES) + species = SPECIES_NONE; + return species; +} + +static void sub_80DE864(u8 a) +{ + s32 i; + u16 move = SanitizeMove(sContestantStatus[a].currMove); + u16 species = SanitizeSpecies(gContestMons[a].species); + u8 r5_2; + + memset(&gContestResources->field_18->species, 0, 0x14); + ClearBattleAnimationVars(); + for (i = 0; i < 4; i++) + gBattleMonForms[i] = 0; + switch (move) + { + case MOVE_CURSE: + if (gBaseStats[species].type1 == TYPE_GHOST || gBaseStats[species].type2 == TYPE_GHOST) + gAnimMoveTurn = 0; + else + gAnimMoveTurn = 1; + break; + case MOVE_TRANSFORM: + case MOVE_ROLE_PLAY: + r5_2 = sContestantStatus[a].unk1B; + gContestResources->field_18->unk2 = SanitizeSpecies(gContestMons[r5_2].species); + gContestResources->field_18->unk10 = gContestMons[r5_2].personality; + gContestResources->field_18->unk4_0 = 1; + break; + case MOVE_RETURN: + gAnimFriendship = 0xFF; + break; + case MOVE_FRUSTRATION: + gAnimFriendship = 0; + break; + case MOVE_SOLAR_BEAM: + case MOVE_RAZOR_WIND: + case MOVE_SKULL_BASH: + case MOVE_SKY_ATTACK: + if (sContest.unk1925E == 0) + { + sContest.unk1925E = 2; + gAnimMoveTurn = 0; + } + else + { + gAnimMoveTurn = 1; + } + break; + } + sub_80DEA5C(); +} + +static void sub_80DE9B0(u8 unused) +{ + memset(&gContestResources->field_18->species, 0, 0x14); + if (sContest.unk1925E != 0) + sContest.unk1925E--; +} + +static void sub_80DE9DC(u8 a) +{ + gContestResources->field_18->unk5 = a; + gContestResources->field_18->species = SanitizeSpecies(gContestMons[a].species); + gContestResources->field_18->unk8 = gContestMons[a].personality; + gContestResources->field_18->unkC = gContestMons[a].otId; +} + +static void sub_80DEA20(void) +{ + gBattlerSpriteIds[3] = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); + InitSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattlerTarget]]); + sub_80DEA5C(); +} + +static void sub_80DEA5C(void) +{ + struct Sprite *sprite = &gSprites[gBattlerSpriteIds[3]]; + + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->pos1.x = GetBattlerSpriteCoord(3, 0); + sprite->pos1.y = GetBattlerSpriteCoord(3, 1); + sprite->invisible = TRUE; +} + +static void SelectContestMoveBankTarget(u16 move) +{ + switch (gBattleMoves[move].target) + { + case MOVE_TARGET_USER_OR_SELECTED: + case MOVE_TARGET_USER: + gBattlerTarget = 2; + break; + case MOVE_TARGET_SELECTED: + case MOVE_TARGET_RANDOM: + case MOVE_TARGET_BOTH: + case MOVE_TARGET_FOES_AND_ALLY: + default: + gBattlerTarget = 3; + break; + } +} + +static void Contest_PrintTextToBg0WindowStd(u32 a, const u8 *b) +{ + struct TextPrinterTemplate printerTemplate; + + printerTemplate.currentChar = b; + printerTemplate.windowId = a; + printerTemplate.fontId = 1; + printerTemplate.x = 0; + printerTemplate.y = 1; + printerTemplate.currentX = 0; + printerTemplate.currentY = 1; + printerTemplate.letterSpacing = 0; + printerTemplate.lineSpacing = 0; + printerTemplate.unk = 0; + printerTemplate.fgColor = 15; + printerTemplate.bgColor = 0; + printerTemplate.shadowColor = 8; + + AddTextPrinter(&printerTemplate, 0, 0); + PutWindowTilemap(a); + Contest_SetBgCopyFlags(0); +} + +void Contest_PrintTextToBg0WindowAt(u32 windowId, u8 *currChar, s32 x, s32 y, s32 fontId) +{ + struct TextPrinterTemplate printerTemplate; + + printerTemplate.currentChar = currChar; + printerTemplate.windowId = windowId; + printerTemplate.fontId = fontId; + printerTemplate.x = x; + printerTemplate.y = y; + printerTemplate.currentX = x; + printerTemplate.currentY = y; + printerTemplate.letterSpacing = 0; + printerTemplate.lineSpacing = 0; + printerTemplate.unk = 0; + printerTemplate.fgColor = 15; + printerTemplate.bgColor = 0; + printerTemplate.shadowColor = 8; + + AddTextPrinter(&printerTemplate, 0, 0); + PutWindowTilemap(windowId); + Contest_SetBgCopyFlags(0); +} + +static void Contest_StartTextPrinter(const u8 *currChar, bool32 b) +{ + struct TextPrinterTemplate printerTemplate; + u8 speed; + + printerTemplate.currentChar = currChar; + printerTemplate.windowId = 4; + printerTemplate.fontId = 1; + printerTemplate.x = 0; + printerTemplate.y = 1; + printerTemplate.currentX = 0; + printerTemplate.currentY = 1; + printerTemplate.letterSpacing = 0; + printerTemplate.lineSpacing = 0; + printerTemplate.unk = 0; + printerTemplate.fgColor = 1; + printerTemplate.bgColor = 0; + printerTemplate.shadowColor = 8; + + if (!b) + { + AddTextPrinter(&printerTemplate, 0, 0); + } + else + { + if (gIsLinkContest & 1) + speed = 4; + else + speed = GetPlayerTextSpeedDelay(); + AddTextPrinter(&printerTemplate, speed, 0); + } + + PutWindowTilemap(4); + Contest_SetBgCopyFlags(0); +} + +static void ContestBG_FillBoxWithIncrementingTile(u8 a, u16 b, u8 c, u8 d, u8 e, u8 f, u8 g, s16 h) +{ + WriteSequenceToBgTilemapBuffer(a, b, c, d, e, f, g, h); + Contest_SetBgCopyFlags(a); +} + +static void ContestBG_FillBoxWithTile(u8 a, u16 b, u8 c, u8 d, u8 e, u8 f, u8 g) +{ + ContestBG_FillBoxWithIncrementingTile(a, b, c, d, e, f, g, 0); +} + +static bool32 Contest_RunTextPrinters(void) +{ + RunTextPrinters(); + return IsTextPrinterActive(4); +} + +static void Contest_SetBgCopyFlags(u32 var) +{ + sContestBgCopyFlags |= 1 << var; +} + +void ResetContestLinkResults(void) +{ + s32 i; + s32 j; + + for(i = 0; i < 5; i++) + for(j = 0; j < 4; j++) + gSaveBlock2Ptr->contestLinkResults[i][j] = 0; +} + +bool8 sub_80DEDA8(u8 a) +{ + s32 i; + u8 r7 = Random() % 3; + + for (i = 0; i < 3; i++) + { + if (gContestFinalStandings[i] == 0) + break; + } + if (a == 0xFF && i != gContestPlayerMonIndex) + return FALSE; + switch (gSpecialVar_ContestCategory) + { + case CONTEST_CATEGORY_COOL: + r7 += 0; + break; + case CONTEST_CATEGORY_BEAUTY: + r7 += 3; + break; + case CONTEST_CATEGORY_CUTE: + r7 += 6; + break; + case CONTEST_CATEGORY_SMART: + r7 += 9; + break; + case CONTEST_CATEGORY_TOUGH: + r7 += 12; + break; + } + if (a != 0xFE) + { + u8 r4 = sub_80DEFA8(a, 1); + + gSaveBlock1Ptr->contestWinners[r4].personality = gContestMons[i].personality; + gSaveBlock1Ptr->contestWinners[r4].species = gContestMons[i].species; + gSaveBlock1Ptr->contestWinners[r4].trainerId = gContestMons[i].otId; + StringCopy(gSaveBlock1Ptr->contestWinners[r4].monName, gContestMons[i].nickname); + StringCopy(gSaveBlock1Ptr->contestWinners[r4].trainerName, gContestMons[i].trainerName); + if(gIsLinkContest & 1) + gSaveBlock1Ptr->contestWinners[r4].contestRank = 4; + else + gSaveBlock1Ptr->contestWinners[r4].contestRank = gSpecialVar_ContestRank; + + if (a != 0xFF) + gSaveBlock1Ptr->contestWinners[r4].contestCategory = gSpecialVar_ContestCategory; + else + gSaveBlock1Ptr->contestWinners[r4].contestCategory = r7; + } + else + { + gUnknown_02039F3C.personality = gContestMons[i].personality; + gUnknown_02039F3C.trainerId = gContestMons[i].otId; + gUnknown_02039F3C.species = gContestMons[i].species; + StringCopy(gUnknown_02039F3C.monName, gContestMons[i].nickname); + StringCopy(gUnknown_02039F3C.trainerName, gContestMons[i].trainerName); + gUnknown_02039F3C.contestCategory = r7; + } + return TRUE; +} + +u8 sub_80DEFA8(u8 a, u8 b) +{ + s32 i; + + switch (a) + { + case 0: + case 1: + case 2: + case 3: + if (b != 0) + { + for (i = 5; i >= 1; i--) + memcpy(&gSaveBlock1Ptr->contestWinners[i], &gSaveBlock1Ptr->contestWinners[i - 1], sizeof(struct ContestWinner)); + } + return 0; + default: + switch (gSpecialVar_ContestCategory) + { + case CONTEST_CATEGORY_COOL: + return 8; + case CONTEST_CATEGORY_BEAUTY: + return 9; + case CONTEST_CATEGORY_CUTE: + return 10; + case CONTEST_CATEGORY_SMART: + return 11; + case CONTEST_CATEGORY_TOUGH: + default: + return 12; + } + } +} + +void ClearContestWinnerPicsInContestHall(void) +{ + s32 i; + + for (i = 0; i < 8; i++) + gSaveBlock1Ptr->contestWinners[i] = gUnknown_08587FA4[i]; +} + +// The functions below are probably related to Contests in TV. +static void sub_80DF080(u8 contestant) +{ + s32 i; + + if (!gContestResources->field_10->excitementFrozen + && gContestResources->field_10->bits_0 > 0 + && !gContestResources->field_4[contestant].disappointedRepeat) + { + gContestResources->field_1c[contestant].unkC |= 1; + gContestResources->field_1c[contestant].unkE_2 = 1; + } + + if (gContestResources->field_4[contestant].nervous) + gContestResources->field_1c[contestant].unkC |= 2; + + if (!gContestResources->field_10->excitementFrozen + && gContestResources->field_10->bits_0 != 0 + && gContestResources->field_10->unk2 == 60) + { + gContestResources->field_1c[contestant].unkC |= 4; + } + + if (gContestResources->field_4[contestant].unk15_6 + && gContestResources->field_4[contestant].unk16 != 0) + { + gContestResources->field_1c[contestant].unkC |= 8; + } + + for (i = 0; i < 4; i++) + { + if (i != contestant && gContestResources->field_4[i].jam != 0) + { + gContestResources->field_1c[contestant].unkC |= 0x10; + gContestResources->field_1c[i].unkC |= 0x40; + } + } + + if (gContestResources->field_4[contestant].numTurnsSkipped != 0 + || gContestResources->field_4[contestant].noMoreTurns) + { + gContestResources->field_1c[contestant].unkC |= 0x20; + } + else if (!gContestResources->field_4[contestant].nervous) + { + gContestResources->field_1c[contestant].unkC |= 0x80; + gContestResources->field_1c[contestant].unkE_1 = 1; + gContestResources->field_1c[contestant].unk0[gContestResources->field_0->turnNumber] = gContestResources->field_4[contestant].currMove; + } + + if (gContestResources->field_4[contestant].disappointedRepeat) + gContestResources->field_1c[contestant].unkD |= 2; + + if (gContestResources->field_0->applauseLevel == 4 + && !gContestResources->field_10->excitementFrozen + && gContestResources->field_10->bits_0 < 0) + { + gContestResources->field_1c[contestant].unkD |= 0x20; + } +} + +static void sub_80DF250(void) +{ + u8 r1; + s32 i, j; + bool32 r12, r8; + u16 sp0[6]; + u8 spC[6]; + u16 sp14[5]; + u8 var_38; + u8 r3; + u8 count; + + r1 = 0; + var_38 = 0; + + for (i = 0; i < 4; i++) + { + if (gContestFinalStandings[i] == 0) + var_38 = i; + else if (gContestFinalStandings[i] == 3) + r1 = i; + } + + gContestResources->field_1c[r1].unkD |= 1; + for (i = 0; i < 4; i++) + { + if (i != var_38 && gUnknown_02039F08[var_38] - gUnknown_02039F08[i] <= 50) + gContestResources->field_1c[i].unkD |= 4; + + if (!gContestResources->field_1c[i].unkE_2) + gContestResources->field_1c[i].unkD |= 8; + + for (j = 0; j < 4; j++) + { + if (gContestMonConditions[i] < gContestMonConditions[j]) + break; + } + if (j == 4 && gContestFinalStandings[i] != 0) + gContestResources->field_1c[i].unkD |= 0x10; + + r12 = FALSE; + r8 = FALSE; + for (j = 0; j < 4; j++) + { + if (gContestMonConditions[i] > gContestMonConditions[j]) + r12 = TRUE; + if (gUnknown_02039F18[i] > gUnknown_02039F18[j]) + r8 = TRUE; + } + if (!r12 && !r8) + gContestResources->field_1c[i].unkD |= 0x40; + + if (!gContestResources->field_1c[i].unkE_1) + gContestResources->field_1c[i].unkD |= 0x80; + } + + for (i = 0; i < 5; i++) + { + sp0[i] = 0; + spC[i] = 0; + } + sp0[5] = 0xFFFF; + spC[5] = 0; + + for (i = 0; i < 5; i++) + { + if (gContestResources->field_1c[var_38].unk0[i] != 0) + { + for (j = 0; j < 5; j++) + { + if (gContestResources->field_1c[var_38].unk0[i] != sp0[j]) + { + if (sp0[j] == 0) + { + sp0[j] = gContestResources->field_1c[var_38].unk0[i]; + spC[j]++; + } + } + else + { + spC[j]++; + } + } + } + } + + sp14[0] = sp0[0]; + r3 = spC[0]; + count = 0; + for (i = 1; sp0[i] != 0xFFFF; i++) + { + if (r3 < spC[i]) + { + sp14[0] = sp0[i]; + r3 = spC[i]; + count = 1; + } + else if (r3 == spC[i]) + { + sp14[count] = sp0[i]; + count++; + } + } + + gContestResources->field_1c[var_38].unkA = sp14[Random() % count]; +} + +static void sub_80DF4F8(void) +{ + s32 i; + u32 bits; + u8 r7; + u8 r9, r10; + u8 count; + u8 r5; + u8 r2; + u16 var; + u8 r4; + u8 r6; + u8 sp0[4]; + + if (gContestFinalStandings[gContestPlayerMonIndex] != 0) + return; + + r7 = 0; + for (i = 0; i < 4; i++) + { + if (gContestFinalStandings[i] == 0) + r7 = i; + } + + r9 = 0; + r10 = 0; + for (i = 0; i < 4; i++) + { + if (gContestMonConditions[r7] < gContestMonConditions[i]) + r9++; + if (gUnknown_02039F18[r7] < gUnknown_02039F18[i]) + r10++; + } + + bits = gContestResources->field_1c[r7].unkC; + count = 0; + for (i = 0; i < 8; bits >>= 1, i++) + { + if (bits & 1) + count++; + } + + r5 = Random() % count; + bits = gContestResources->field_1c[r7].unkC; + count = 0; + r2 = 0; + for (i = 0; i < 8; bits >>= 1, r2++, i++) + { + if (!(bits & 1)) + continue; + if (r5 == count) + break; + count++; + } + + var = 1 << r2; + if (r7 == 0) + { + sp0[0] = 1; + r4 = gContestResources->field_1c[1].unkD; + i = 2; + } + else + { + sp0[0] = 0; + r4 = gContestResources->field_1c[0].unkD; + i = 1; + } + + r5 = 1; + for (; i < 4; i++) + { + if (i != r7) + { + if (r4 < gContestResources->field_1c[i].unkD) + { + sp0[0] = i; + r4 = gContestResources->field_1c[i].unkD; + r5 = 1; + } + else if (r4 == gContestResources->field_1c[i].unkD) + { + sp0[r5] = i; + r5++; + } + } + } + + r6 = sp0[Random() % r5]; + r2 = 0x80; + for (i = 0; i < 8; r2 >>= 1, i++) + { + r4 = gContestResources->field_1c[r6].unkD & r2; + if (r4) + break; + } + + ContestLiveUpdates_BeforeInterview_1(r9); + ContestLiveUpdates_BeforeInterview_2(r10); + ContestLiveUpdates_BeforeInterview_3(var); + ContestLiveUpdates_BeforeInterview_4(gContestResources->field_1c[r7].unkA); + ContestLiveUpdates_BeforeInterview_5(r4, r6); +} + +// Unused +void sub_80DF704(u8 arg0) +{ + if (gHeap[0x1A000] == 0) + { + if (arg0 == 0) + gHeap[0x1A000] = 2; + else + gHeap[0x1A000] = 3; + } + else + { + gHeap[0x1A000] = 0; + } + + if (gHeap[0x1A000] == 0) + { + sub_80DAEA4(); + sub_80DB2BC(); + } + else + { + sub_80DF750(); + } +} + +static void sub_80DF750(void) +{ + u8 i; + s8 j; + u8 text1[20]; + u8 text2[20]; + u8 *txtPtr; + u32 bits; + + if (gUnknown_020322D5 == 0) + return; + if (gHeap[0x1A000] != 2 && gHeap[0x1A000] != 3) + return; + + for (i = 0; i < 4; i++) + FillWindowPixelBuffer(i, 0); + + if (gHeap[0x1A000] == 2) + { + for (i = 0; i < 4; i++) + { + txtPtr = StringCopy(text1, gText_CDot); + Contest_PrintTextToBg0WindowAt(gUnknown_02039F26[i], text1, 5, 1, 7); + bits = gContestResources->field_1c[i].unkC; + for (j = 7; j > -1; j--) // Weird loop. + { + txtPtr = ConvertIntToDecimalStringN(txtPtr, bits & 1, STR_CONV_MODE_LEFT_ALIGN, 1); + bits >>= 1; + } + + for (j = 0; j < 5; j++) + text2[j] = text1[j]; + + text2[j] = EOS; + Contest_PrintTextToBg0WindowAt(gUnknown_02039F26[i], text2, 5, 1, 7); + Contest_PrintTextToBg0WindowAt(gUnknown_02039F26[i], text1 + j, 55, 1, 7); + } + } + else + { + for (i = 0; i < 4; i++) + { + StringCopy(text1, gText_BDot); + bits = gContestResources->field_1c[i].unkD; + txtPtr = &text1[2]; + for (j = 7; j > -1; j--) // Weird loop. + { + txtPtr = ConvertIntToDecimalStringN(txtPtr, bits & 1, STR_CONV_MODE_LEFT_ALIGN, 1); + bits >>= 1; + } + + for (j = 0; j < 5; j++) + text2[j] = text1[j]; + + text2[j] = EOS; + Contest_PrintTextToBg0WindowAt(gUnknown_02039F26[i], text2, 5, 1, 7); + Contest_PrintTextToBg0WindowAt(gUnknown_02039F26[i], text1 + j, 55, 1, 7); + } + } + sub_80DB2BC(); +} + +static u8 sub_80DF940(u8 *nickname) +{ + u8 ret = GAME_LANGUAGE; + + if (nickname[0] == EXT_CTRL_CODE_BEGIN && nickname[1] == EXT_CTRL_CODE_JPN) + return LANGUAGE_ENGLISH; + + if (StringLength(nickname) < 6) + { + while (*nickname != EOS) + { + if ((*nickname >= CHAR_A && *nickname <= CHAR_z) + || (*nickname >= CHAR_0 && *nickname <= CHAR_9) + || *nickname == CHAR_SPACE + || *nickname == CHAR_PERIOD + || *nickname == CHAR_COMMA + || *nickname == CHAR_EXCL_MARK + || *nickname == CHAR_QUESTION_MARK + || *nickname == CHAR_MALE + || *nickname == CHAR_FEMALE + || *nickname == CHAR_SLASH + || *nickname == CHAR_HYPHEN + || *nickname == CHAR_ELLIPSIS + || *nickname == CHAR_DBL_QUOT_LEFT + || *nickname == CHAR_DBL_QUOT_RIGHT + || *nickname == CHAR_SGL_QUOT_LEFT + || *nickname == CHAR_DBL_QUOT_LEFT) // Most likely a typo, CHAR_SGL_QUOT_RIGHT should be here instead. + { + nickname++; + } + else + { + ret = LANGUAGE_JAPANESE; + break; + } + } + } + + return ret; +} + +static void sub_80DF9D4(u8 *playerName) +{ + u8 chr = playerName[5]; + + playerName[5] = EOS; + playerName[PLAYER_NAME_LENGTH] = chr; +} + +static void sub_80DF9E0(u8 *monName, s32 language) +{ + u8 chr; + + StripExtCtrlCodes(monName); + if (language == LANGUAGE_JAPANESE) + { + monName[5] = EOS; + monName[POKEMON_NAME_LENGTH] = EXT_CTRL_CODE_BEGIN; + } + else + { + chr = monName[5]; + monName[5] = EOS; + monName[POKEMON_NAME_LENGTH] = chr; + } +} + +void sub_80DFA08(struct ContestPokemon *mon, s32 language) +{ + u8 *name = mon->nickname; + + if (language == LANGUAGE_JAPANESE) + { + ConvertInternationalString(name, sub_80DF940(name)); + } + else if (name[POKEMON_NAME_LENGTH] == EXT_CTRL_CODE_BEGIN) + { + ConvertInternationalString(name, LANGUAGE_JAPANESE); + } + else + { + name[5] = name[POKEMON_NAME_LENGTH]; + name[POKEMON_NAME_LENGTH] = EOS; + } + + name = mon->trainerName; + if (language == LANGUAGE_JAPANESE) + { + name[PLAYER_NAME_LENGTH] = EOS; + name[6] = name[4]; + name[5] = name[3]; + name[4] = name[2]; + name[3] = name[1]; + name[2] = mon->trainerName[0]; + name[1] = EXT_CTRL_CODE_JPN; + name[0] = EXT_CTRL_CODE_BEGIN; + } + else + { + name[5] = name[PLAYER_NAME_LENGTH]; + name[PLAYER_NAME_LENGTH] = EOS; + } +} diff --git a/src/contest_link_80F57C4.c b/src/contest_link_80F57C4.c index 721a4f870..381fb34fa 100644 --- a/src/contest_link_80F57C4.c +++ b/src/contest_link_80F57C4.c @@ -3,7 +3,6 @@ #include "bg.h" #include "contest.h" #include "contest_link_80F57C4.h" -#include "contest_painting.h" #include "decompress.h" #include "dma3.h" #include "event_data.h" @@ -67,10 +66,9 @@ struct ContestLink80F57C4 u8 *unkC[4]; }; -extern const struct CompressedSpriteSheet gMonFrontPicTable[]; - -extern struct ContestLink80F57C4 *gUnknown_0203A034; +EWRAM_DATA struct ContestLink80F57C4 *gUnknown_0203A034 = NULL; +extern const struct CompressedSpriteSheet gMonFrontPicTable[]; extern const struct BgTemplate gUnknown_0858D888[4]; extern const struct WindowTemplate gUnknown_0858D898[]; extern const struct CompressedSpriteSheet gUnknown_0858D878[]; @@ -138,7 +136,7 @@ void sub_80F57C4(void) InitBgsFromTemplates(0, gUnknown_0858D888, ARRAY_COUNT(gUnknown_0858D888)); for (i = 0; i < 4; i++) SetBgTilemapBuffer(i, gUnknown_0203A034->unkC[i]); - + InitWindows(gUnknown_0858D898); DeactivateAllTextPrinters(); SetGpuReg(REG_OFFSET_MOSAIC, 0); @@ -720,7 +718,7 @@ static void sub_80F66B4(u8 taskId) { nationalDexNum = SpeciesToNationalPokedexNum(gContestMons[i].species); GetSetPokedexFlag(nationalDexNum, FLAG_SET_SEEN); - } + } } gTasks[taskId].data[10] = 0; @@ -761,7 +759,7 @@ static void sub_80F67C4(u8 taskId) { if (!(gIsLinkContest & 0x1)) BravoTrainerPokemonProfile_BeforeInterview2(gContestFinalStandings[gContestPlayerMonIndex]); - + BeginHardwarePaletteFade(0xFF, 0, 0, 16, 0); gTasks[taskId].func = sub_80F6820; } @@ -1282,7 +1280,7 @@ static void sub_80F6F68(struct Sprite *sprite) struct Sprite *sprite2 = &gSprites[sprite->data[i]]; sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64; } - + if (sprite->pos1.x == sprite->data[4]) sprite->callback = sub_80F6FDC; } @@ -1348,7 +1346,7 @@ static void sub_80F7144(void) sprite->invisible = 1; for (i = 0; i < 3; i++) gSprites[sprite->data[i]].invisible = 1; - + gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); diff --git a/src/contest_painting.c b/src/contest_painting.c index 0ed169a77..71a110aa8 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -20,10 +20,11 @@ #include "window.h" #include "constants/rgb.h" -extern u16 (*gUnknown_03006190)[][32]; -extern struct ContestWinner *gUnknown_030061C0; -extern u16 *gContestPaintingMonPalette; -extern struct Unk030061A0 gUnknown_030061A0; +// IWRAM common +u16 (*gUnknown_03006190)[][32]; +struct Unk030061A0 gUnknown_030061A0; +struct ContestWinner *gUnknown_030061C0; +u16 *gContestPaintingMonPalette; // IWRAM bss IWRAM_DATA u8 gContestPaintingState; @@ -103,7 +104,7 @@ const u8 *const gContestRankTextPointers[] = gContestLink, }; -const struct BgTemplate gUnknown_085B07E8[] = +const struct BgTemplate gUnknown_085B07E8[] = { { .bg = 1, @@ -116,7 +117,7 @@ const struct BgTemplate gUnknown_085B07E8[] = }, }; -const struct WindowTemplate gUnknown_085B07EC = +const struct WindowTemplate gUnknown_085B07EC = { .bg = 1, .tilemapLeft = 2, diff --git a/src/contest_painting_effects.c b/src/contest_painting_effects.c index 187a0f196..142ad7bc9 100644 --- a/src/contest_painting_effects.c +++ b/src/contest_painting_effects.c @@ -3,14 +3,17 @@ #include "contest_painting.h" #include "constants/rgb.h" -extern u8 gUnknown_03006164; -extern u16 (*gUnknown_03006168)[][32]; -extern u8 gUnknown_0300616C; -extern u8 gUnknown_03006170; -extern u8 gUnknown_03006174; -extern u8 gUnknown_03006178; -extern u8 gUnknown_0300617C; -extern u8 gUnknown_03006180; +// IWRAM common +u8 gUnknown_03006164; +u16 (*gUnknown_03006168)[][32]; +u8 gUnknown_0300616C; +u8 gUnknown_03006170; +u8 gUnknown_03006174; +u8 gUnknown_03006178; +u8 gUnknown_0300617C; +u8 gUnknown_03006180; +u16 gUnknown_03006184; +u16 gUnknown_03006188; // this file's functions void sub_8125230(void); diff --git a/src/daycare.c b/src/daycare.c index 6bdbd987e..b75fab292 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -1244,15 +1244,15 @@ static void DaycarePrintMonInfo(u8 windowId, s32 daycareSlotId, u8 y) static void Task_HandleDaycareLevelMenuInput(u8 taskId) { - u32 var = ListMenuHandleInputGetItemId(gTasks[taskId].tMenuListTaskId); + u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuListTaskId); if (gMain.newKeys & A_BUTTON) { - switch (var) + switch (input) { case 0: case 1: - gSpecialVar_Result = var; + gSpecialVar_Result = input; break; case 5: gSpecialVar_Result = 2; diff --git a/src/decoration.c b/src/decoration.c index 36d9ba5f9..2ac49b98c 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -526,14 +526,14 @@ void sub_8126B80(u8 taskId) PlaySE(SE_SELECT); sSecretBasePCMenuActions[sSecretBasePCMenuCursorPos].func.void_u8(taskId); break; - case -2: + case MENU_NOTHING_CHOSEN: sSecretBasePCMenuCursorPos = Menu_GetCursorPos(); if ((s8)menuPos != sSecretBasePCMenuCursorPos) { sub_8126C08(); } break; - case -1: + case MENU_B_PRESSED: PlaySE(SE_SELECT); SecretBasePC_Cancel(taskId); break; @@ -713,12 +713,12 @@ void sub_8127088(u8 taskId) input = Menu_ProcessInput(); switch (input) { - case -1: + case MENU_B_PRESSED: case 8: PlaySE(SE_SELECT); sub_812719C(taskId); break; - case -2: + case MENU_NOTHING_CHOSEN: break; default: PlaySE(SE_SELECT); @@ -933,13 +933,13 @@ void sub_812764C(u8 taskId) data = gTasks[taskId].data; if (!gPaletteFade.active) { - input = ListMenuHandleInputGetItemId(data[13]); + input = ListMenu_ProcessInput(data[13]); ListMenuGetScrollAndRow(data[13], &sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo); switch (input) { - case -1: + case LIST_NOTHING_CHOSEN: break; - case -2: + case LIST_B_PRESSED: PlaySE(SE_SELECT); SecretBasePC_SelectedDecorActions[data[11]][1](taskId); break; diff --git a/src/dragon.c b/src/dragon.c index 4a2ac1c51..9b39a8a30 100644 --- a/src/dragon.c +++ b/src/dragon.c @@ -5,8 +5,6 @@ #include "trig.h" #include "constants/rgb.h" -extern u16 gUnknown_0203A100[]; - void sub_8113064(struct Sprite *); void sub_81131B4(struct Sprite *); void sub_8113224(struct Sprite *); @@ -17,6 +15,8 @@ static void sub_81134B8(u8); static void sub_8113574(struct Task *); static void sub_811369C(struct Sprite *); +EWRAM_DATA static u16 gUnknown_0203A100[7] = {0}; + const union AnimCmd gUnknown_08596E60[] = { ANIMCMD_FRAME(0, 4), diff --git a/src/evolution_scene.c b/src/evolution_scene.c index c97e2d10f..4bf7701be 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -9,6 +9,7 @@ #include "evolution_graphics.h" #include "gpu_regs.h" #include "link.h" +#include "link_rfu.h" #include "m4a.h" #include "main.h" #include "menu.h" @@ -16,10 +17,12 @@ #include "palette.h" #include "pokedex.h" #include "pokemon.h" +#include "pokemon_summary_screen.h" #include "scanline_effect.h" #include "sound.h" #include "sprite.h" #include "string_util.h" +#include "strings.h" #include "task.h" #include "text.h" #include "text_window.h" @@ -39,22 +42,18 @@ struct EvoInfo u16 savedPalette[48]; }; +// EWRAM vars static EWRAM_DATA struct EvoInfo *sEvoStructPtr = NULL; static EWRAM_DATA u16 *sEvoMovingBgPtr = NULL; +// IWRAM common +void (*gCB2_AfterEvolution)(void); + #define sEvoCursorPos gBattleCommunication[1] // when learning a new move #define sEvoGraphicsTaskID gBattleCommunication[2] -extern const struct WindowTemplate gUnknown_0833900C; extern const struct CompressedSpriteSheet gMonFrontPicTable[]; -// strings -extern const u8 gText_CommunicationStandby5[]; - -extern void ShowSelectMovePokemonSummaryScreen(struct Pokemon *party, u8 monId, u8 partyCount, void *CB2_ptr, u16 move); -extern u8 sub_81C1B94(void); -extern void sub_800E084(void); - // this file's functions static void Task_EvolutionScene(u8 taskID); static void Task_TradeEvolutionScene(u8 taskID); diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 7423216a4..b1291f0ce 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -90,7 +90,7 @@ static bool8 sub_808B618(void); static bool8 PlayerIsAnimActive(void); static bool8 PlayerCheckIfAnimFinishedOrInactive(void); -static void PlayerRun(u8); +static void PlayerRun(u8); static void PlayerNotOnBikeCollide(u8); static void PlayerNotOnBikeCollideWithFarawayIslandMew(u8); @@ -343,7 +343,7 @@ static bool8 TryInterruptEventObjectSpecialAnim(struct EventObject *playerEventO u8 r5 = direction; register u8 r6 asm("r6") = direction; #endif - //a very bad HACK + //a very bad HACK if (EventObjectIsMovementOverridden(playerEventObj) && !EventObjectClearHeldMovementIfFinished(playerEventObj)) @@ -821,24 +821,14 @@ void SetPlayerAvatarTransitionFlags(u16 transitionFlags) static void DoPlayerAvatarTransition(void) { u8 i; - u32 flags = gPlayerAvatar.unk1; + u8 flags = gPlayerAvatar.unk1; if (flags != 0) { for (i = 0; i < 8; i++, flags >>= 1) { -#ifdef NONMATCHING if (flags & 1) - { gUnknown_084974B8[i](&gEventObjects[gPlayerAvatar.eventObjectId]); - } -#else - if (flags & 1) - { - register void (*const *funcs)(struct EventObject *) asm("r0") = gUnknown_084974B8; - funcs[i](&gEventObjects[gPlayerAvatar.eventObjectId]); - } -#endif } gPlayerAvatar.unk1 = 0; } @@ -1151,7 +1141,7 @@ void PlayerGetDestCoords(s16 *x, s16 *y) u8 player_get_pos_including_state_based_drift(s16 *x, s16 *y) { struct EventObject *object = &gEventObjects[gPlayerAvatar.eventObjectId]; - + if (object->heldMovementActive && !object->heldMovementFinished && !gSprites[object->spriteId].data[2]) { *x = object->currentCoords.x; @@ -1765,7 +1755,7 @@ static bool8 Fishing2(struct Task *task) static bool8 Fishing3(struct Task *task) { AlignFishingAnimationFrames(); - + // Wait one second task->tFrameCounter++; if (task->tFrameCounter >= 60) diff --git a/src/field_specials.c b/src/field_specials.c index 0dc1bf18b..f2ebf2b8e 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -2603,9 +2603,9 @@ static void sub_813A46C(s32 itemIndex, bool8 onInit, struct ListMenu *list) static void sub_813A4EC(u8 taskId) { struct Task *task = &gTasks[taskId]; - s32 itemId = ListMenuHandleInputGetItemId(task->data[14]); + s32 input = ListMenu_ProcessInput(task->data[14]); - switch (itemId) + switch (input) { case LIST_NOTHING_CHOSEN: break; @@ -2615,13 +2615,13 @@ static void sub_813A4EC(u8 taskId) sub_813A570(taskId); break; default: - gSpecialVar_Result = itemId; + gSpecialVar_Result = input; PlaySE(SE_SELECT); if (!task->data[6]) { sub_813A570(taskId); } - else if (itemId == task->data[1] - 1) + else if (input == task->data[1] - 1) { sub_813A570(taskId); } diff --git a/src/field_weather.c b/src/field_weather.c index f0615dabf..0db635c60 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -17,7 +17,7 @@ #include "trig.h" #include "gpu_regs.h" -#define MACRO1(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) +#define DROUGHT_COLOR_INDEX(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) enum { @@ -65,15 +65,21 @@ static void None_Init(void); static void None_Main(void); static u8 None_Finish(void); -// EWRAM EWRAM_DATA struct Weather gWeather = {0}; EWRAM_DATA static u8 sFieldEffectPaletteGammaTypes[32] = {0}; -// IWRAM bss IWRAM_DATA static const u8 *sPaletteGammaTypes; -// CONST -extern const u16 gUnknown_0854014C[][4096]; +// The drought weather effect uses a precalculated color lookup table. Presumably this +// is because the underlying color shift calculation is slow. +const u16 sDroughtWeatherColors[][0x1000] = { + INCBIN_U16("graphics/weather/drought/colors_0.bin"), + INCBIN_U16("graphics/weather/drought/colors_1.bin"), + INCBIN_U16("graphics/weather/drought/colors_2.bin"), + INCBIN_U16("graphics/weather/drought/colors_3.bin"), + INCBIN_U16("graphics/weather/drought/colors_4.bin"), + INCBIN_U16("graphics/weather/drought/colors_5.bin"), +}; // This is a pointer to gWeather. All code in this file accesses gWeather directly, // while code in other field weather files accesses gWeather through this pointer. @@ -513,7 +519,7 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) { for (i = 0; i < 16; i++) { - gPlttBufferFaded[palOffset] = gUnknown_0854014C[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; + gPlttBufferFaded[palOffset] = sDroughtWeatherColors[gammaIndex][DROUGHT_COLOR_INDEX(gPlttBufferUnfaded[palOffset])]; palOffset++; } } @@ -619,7 +625,7 @@ static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 bl b1 = color1.b; offset = ((b1 & 0x1E) << 7) | ((g1 & 0x1E) << 3) | ((r1 & 0x1E) >> 1); - color2 = *(struct RGBColor *)&gUnknown_0854014C[gammaIndex][offset]; + color2 = *(struct RGBColor *)&sDroughtWeatherColors[gammaIndex][offset]; r2 = color2.r; g2 = color2.g; b2 = color2.b; diff --git a/src/graphics.c b/src/graphics.c index 287a1f5d6..90b705d2f 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1023,8 +1023,8 @@ const u32 gBattleAnimSpriteSheet_262[] = INCBIN_U32("graphics/battle_anims/sprit const u32 gBattleAnimSpritePalette_262[] = INCBIN_U32("graphics/battle_anims/sprites/262.gbapal.lz"); const u32 gContestNextTurnGfx[] = INCBIN_U32("graphics/contest/nextturn.4bpp.lz"); -const u8 gUnknown_08D8E9B4[] = INCBIN_U8("graphics/contest/nextturn_numbers.4bpp"); -const u8 gUnknown_08D8EA34[] = INCBIN_U8("graphics/contest/nextturn_random.4bpp"); +const u8 gContestNextTurnNumbersGfx[] = INCBIN_U8("graphics/contest/nextturn_numbers.4bpp"); +const u8 gContestNextTurnRandomGfx[] = INCBIN_U8("graphics/contest/nextturn_random.4bpp"); const u32 gBattleAnimSpriteSheet_264[] = INCBIN_U32("graphics/battle_anims/sprites/264.4bpp.lz"); const u32 gBattleAnimSpritePalette_264[] = INCBIN_U32("graphics/battle_anims/sprites/264.gbapal.lz"); @@ -530,7 +530,7 @@ static void sub_810B6C4(struct Sprite *sprite) { s16 targetX, targetY, attackerX, attackerY; s16 i; - + sprite->oam.tileNum += 7; targetX = GetBattlerSpriteCoord(gBattleAnimTarget, 2); targetY = GetBattlerSpriteCoord(gBattleAnimTarget, 3); @@ -811,7 +811,7 @@ void AnimIceBeamParticle(struct Sprite *sprite) sprite->callback = StartAnimLinearTranslation; } -// Animates the ice crystals at the end of Ice Punch, Ice Beam, Tri Attack, +// Animates the ice crystals at the end of Ice Punch, Ice Beam, Tri Attack, // Weather Ball (Hail), Blizzard, and Powder Snow. // arg 0: target x offset // arg 1: target y offset @@ -917,7 +917,7 @@ void AnimSwirlingSnowball_Step2(struct Sprite *sprite) sprite->pos2.x = 0; sprite->data[0] = 128; - tempVar = GetBattlerSide(gBattleAnimAttacker) != 0 ? 20 : -20; + tempVar = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 20 : -20; sprite->data[3] = Sin(sprite->data[0], tempVar); sprite->data[4] = Cos(sprite->data[0], 0xF); @@ -1069,7 +1069,7 @@ void AnimWaveFromCenterOfTarget(struct Sprite *sprite) sprite->pos1.y += gBattleAnimArgs[1]; } - sprite->data[0]++; + sprite->data[0]++; } else { @@ -1099,9 +1099,9 @@ void InitSwirlingFogAnim(struct Sprite *sprite) else { SetAverageBattlerPositions(gBattleAnimAttacker, 0, &sprite->pos1.x, &sprite->pos1.y); - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->pos1.x -= gBattleAnimArgs[0]; - else + else sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; @@ -1109,18 +1109,18 @@ void InitSwirlingFogAnim(struct Sprite *sprite) battler = gBattleAnimAttacker; } - else + else { if (gBattleAnimArgs[5] == 0) { InitSpritePosToAnimTarget(sprite, FALSE); } - else + else { SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y); if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER) sprite->pos1.x -= gBattleAnimArgs[0]; - else + else sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; @@ -1130,7 +1130,7 @@ void InitSwirlingFogAnim(struct Sprite *sprite) } sprite->data[7] = battler; - if (gBattleAnimArgs[5] == 0 || !IsDoubleBattle()) + if (gBattleAnimArgs[5] == 0 || !IsDoubleBattle()) tempVar = 0x20; else tempVar = 0x40; @@ -1161,7 +1161,7 @@ void AnimSwirlingFogAnim(struct Sprite *sprite) sprite->pos2.y += Cos(sprite->data[5], -6); if ((u16)(sprite->data[5] - 64) <= 0x7F) - sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]); + sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]); else sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]) + 1; @@ -1195,7 +1195,7 @@ void AnimTask_Haze1(u8 taskId) LoadBgTiles(subStruct.bgId, gWeatherFog1Tiles, 0x800, subStruct.tilesOffset); sub_80A6D60(&subStruct, gBattleAnimFogTilemap, 0); LoadPalette(&gUnknown_083970E8, subStruct.unk8 * 16, 32); - + gTasks[taskId].func = AnimTask_Haze2; } @@ -1208,62 +1208,63 @@ void AnimTask_Haze2(u8 taskId) switch (gTasks[taskId].data[12]) { - case 0: - if (++gTasks[taskId].data[10] == 4) - { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[9]++; - gTasks[taskId].data[11] = gUnknown_08595C5C[gTasks[taskId].data[9]]; - - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); - if (gTasks[taskId].data[11] == 9) - { - gTasks[taskId].data[12]++; - gTasks[taskId].data[11] = 0; - } - } - break; - case 1: - if (++gTasks[taskId].data[11] == 0x51) + case 0: + if (++gTasks[taskId].data[10] == 4) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[9]++; + gTasks[taskId].data[11] = gUnknown_08595C5C[gTasks[taskId].data[9]]; + + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); + if (gTasks[taskId].data[11] == 9) { - gTasks[taskId].data[11] = 9; gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; } - break; - case 2: - if (++gTasks[taskId].data[10] == 4) + } + break; + case 1: + if (++gTasks[taskId].data[11] == 0x51) + { + gTasks[taskId].data[11] = 9; + gTasks[taskId].data[12]++; + } + break; + case 2: + if (++gTasks[taskId].data[10] == 4) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11]--; + + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); + if (gTasks[taskId].data[11] == 0) { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[11]--; - - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); - if (gTasks[taskId].data[11] == 0) - { - gTasks[taskId].data[12]++; - gTasks[taskId].data[11] = 0; - } + gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; } - break; - case 3: - sub_80A6B30(&subStruct); - sub_80A6C68(1); - sub_80A6C68(2); - - gTasks[taskId].data[12]++; - - // fall through - case 4: - if (!IsContest()) - SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); - - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - SetGpuReg(REG_OFFSET_BLDCNT, 0); - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); - SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); - DestroyAnimVisualTask(taskId); + } + break; + case 3: + sub_80A6B30(&subStruct); + sub_80A6C68(1); + sub_80A6C68(2); + + gTasks[taskId].data[12]++; + + // fall through + case 4: + if (!IsContest()) + SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + DestroyAnimVisualTask(taskId); + break; } -} +} // Throws the ball in Mist Ball. // arg 0: initial x pixel offset @@ -1301,7 +1302,7 @@ void AnimTask_LoadMistTiles(u8 taskId) LoadBgTiles(subStruct.bgId, gWeatherFog1Tiles, 0x800, subStruct.tilesOffset); sub_80A6D60(&subStruct, gBattleAnimFogTilemap, 0); LoadPalette(&gUnknown_083970E8, subStruct.unk8 * 16, 32); - + gTasks[taskId].data[15] = -1; gTasks[taskId].func = AnimTask_OverlayFogTiles; } @@ -1315,54 +1316,55 @@ void AnimTask_OverlayFogTiles(u8 taskId) switch (gTasks[taskId].data[12]) { - case 0: - gTasks[taskId].data[9] += 1; - gTasks[taskId].data[11] = gUnknown_08595C88[gTasks[taskId].data[9]]; - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 17 - gTasks[taskId].data[11])); - if (gTasks[taskId].data[11] == 5) + case 0: + gTasks[taskId].data[9] += 1; + gTasks[taskId].data[11] = gUnknown_08595C88[gTasks[taskId].data[9]]; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 17 - gTasks[taskId].data[11])); + if (gTasks[taskId].data[11] == 5) + { + gTasks[taskId].data[12]++; + gTasks[taskId].data[11] = 0; + } + break; + case 1: + if (++gTasks[taskId].data[11] == 0x51) + { + gTasks[taskId].data[11] = 5; + gTasks[taskId].data[12]++; + } + break; + case 2: + if (++gTasks[taskId].data[10] == 4) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11] -= 1; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); + if (gTasks[taskId].data[11] == 0) { gTasks[taskId].data[12]++; gTasks[taskId].data[11] = 0; } - break; - case 1: - if (++gTasks[taskId].data[11] == 0x51) - { - gTasks[taskId].data[11] = 5; - gTasks[taskId].data[12]++; - } - break; - case 2: - if (++gTasks[taskId].data[10] == 4) - { - gTasks[taskId].data[10] = 0; - gTasks[taskId].data[11] -= 1; - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); - if (gTasks[taskId].data[11] == 0) - { - gTasks[taskId].data[12]++; - gTasks[taskId].data[11] = 0; - } - } - break; - case 3: - sub_80A6B30(&subStruct); - sub_80A6C68(1); - sub_80A6C68(2); - - gTasks[taskId].data[12]++; - - // fall through - case 4: - if (!IsContest()) - SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); - - gBattle_BG1_X = 0; - gBattle_BG1_Y = 0; - SetGpuReg(REG_OFFSET_BLDCNT, 0); - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); - SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); - DestroyAnimVisualTask(taskId); + } + break; + case 3: + sub_80A6B30(&subStruct); + sub_80A6C68(1); + sub_80A6C68(2); + + gTasks[taskId].data[12]++; + + // fall through + case 4: + if (!IsContest()) + SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + DestroyAnimVisualTask(taskId); + break; } } @@ -1390,7 +1392,7 @@ void InitPoisonGasCloudAnim(struct Sprite *sprite) if ((sprite->data[7] & 0x8000) && !(gBattlerPositions[gBattleAnimAttacker] & 1)) sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1; - sprite->data[6] = 1; + sprite->data[6] = 1; } sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); @@ -1410,7 +1412,7 @@ void InitPoisonGasCloudAnim(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + gBattleAnimArgs[4]; sprite->data[7] |= GetBattlerSpriteBGPriority(gBattleAnimTarget) << 8; - } + } if (IsContest()) { @@ -1425,8 +1427,6 @@ void InitPoisonGasCloudAnim(struct Sprite *sprite) void MovePoisonGasCloud(struct Sprite *sprite) { int value; - register s16 value2 asm("r5"); - int unused; switch (sprite->data[7] & 0xFF) { @@ -1441,8 +1441,7 @@ void MovePoisonGasCloud(struct Sprite *sprite) if (sprite->data[0] <= 0) { - value2 = 80; - sprite->data[0] = value2; + sprite->data[0] = 80; sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); sprite->data[1] = sprite->pos1.x; sprite->data[2] = sprite->pos1.x; @@ -1450,10 +1449,12 @@ void MovePoisonGasCloud(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = sprite->pos1.y + 29; sprite->data[7]++; - if (!IsContest() && gBattlerPositions[gBattleAnimTarget] & 1) + if (IsContest()) + sprite->data[5] = 80; + else if (GET_BATTLER_SIDE2(gBattleAnimTarget) != B_SIDE_PLAYER) sprite->data[5] = 204; else - sprite->data[5] = value2; + sprite->data[5] = 80; sprite->pos2.y = 0; value = gSineTable[sprite->data[5]]; @@ -1490,13 +1491,13 @@ void MovePoisonGasCloud(struct Sprite *sprite) if (sprite->data[0] <= 0) { - asm("mov r5, #0"); // unused local variable? - unused = 0; sprite->data[0] = 0x300; sprite->data[1] = sprite->pos1.x += sprite->pos2.x; sprite->data[3] = sprite->pos1.y += sprite->pos2.y; sprite->data[4] = sprite->pos1.y + 4; - if (!IsContest() && gBattlerPositions[gBattleAnimTarget] & 1) + if (IsContest()) + sprite->data[2] = -0x10; + else if (GET_BATTLER_SIDE2(gBattleAnimTarget) != B_SIDE_PLAYER) sprite->data[2] = 0x100; else sprite->data[2] = -0x10; @@ -1535,43 +1536,43 @@ void AnimTask_Hail2(u8 taskId) struct Task *task = &gTasks[taskId]; switch (task->data[0]) { - case 0: - if (++task->data[4] > 2) - { - task->data[4] = 0; - task->data[5] = 0; - task->data[2] = 0; - task->data[0]++; - } - break; - case 1: - if (task->data[5] == 0) + case 0: + if (++task->data[4] > 2) + { + task->data[4] = 0; + task->data[5] = 0; + task->data[2] = 0; + task->data[0]++; + } + break; + case 1: + if (task->data[5] == 0) + { + if (GenerateHailParticle(task->data[3], task->data[2], taskId, 1)) + task->data[1]++; + + if (++task->data[2] == 3) { - if (GenerateHailParticle(task->data[3], task->data[2], taskId, 1)) - task->data[1]++; - - if (++task->data[2] == 3) - { - if (++task->data[3] == 10) - task->data[0]++; - else - task->data[0]--; - } + if (++task->data[3] == 10) + task->data[0]++; else - { - task->data[5] = 1; - } - + task->data[0]--; } else { - task->data[5]--; + task->data[5] = 1; } - break; - case 2: - if (task->data[1] == 0) - DestroyAnimVisualTask(taskId); - break; + + } + else + { + task->data[5]--; + } + break; + case 2: + if (task->data[1] == 0) + DestroyAnimVisualTask(taskId); + break; } } @@ -1587,7 +1588,7 @@ bool8 GenerateHailParticle(u8 a, u8 b, u8 taskId, u8 c) u8 spriteId; // struct Sprite *sprite; s16 spriteX; - + if (unk != 2) { battler = GetBattlerAtPosition(hailData->unk2); @@ -1820,7 +1821,7 @@ void AnimHailBegin(struct Sprite *sprite) if (sprite->data[0] == 1 && sprite->data[5] == 0) { - spriteId = CreateSprite(&gUnknown_08595B68, + spriteId = CreateSprite(&gUnknown_08595B68, sprite->data[3], sprite->data[4], sprite->subpriority); sprite->data[0] = spriteId; @@ -1935,6 +1936,6 @@ void AnimTask_GetRolloutCounter(u8 taskId) { u8 arg = gBattleAnimArgs[0]; - gBattleAnimArgs[arg] = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1; + gBattleAnimArgs[arg] = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1; DestroyAnimVisualTask(taskId); } diff --git a/src/item_menu.c b/src/item_menu.c index a220f02ef..24a50aa9a 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -1102,7 +1102,7 @@ void Task_BagMenu(u8 taskId) } else { - int listPosition = ListMenuHandleInputGetItemId(data[0]); + int listPosition = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], scrollPos, cursorPos); switch (listPosition) { @@ -1304,7 +1304,7 @@ void bag_menu_swap_items(u8 taskId) void sub_81AC3C0(u8 taskId) { s16* data = gTasks[taskId].data; - int r7; + int input; if (sub_81221EC() != TRUE) { @@ -1316,15 +1316,15 @@ void sub_81AC3C0(u8 taskId) } else { - r7 = ListMenuHandleInputGetItemId(data[0]); + input = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket], &gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket]); sub_80D4FC8(0); sub_80D4FEC(gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket]); - switch (r7) + switch (input) { - case -1: + case LIST_NOTHING_CHOSEN: break; - case -2: + case LIST_B_PRESSED: PlaySE(SE_SELECT); if (gMain.newKeys & A_BUTTON) sub_81AC498(taskId); @@ -1546,9 +1546,9 @@ void Task_HandleInBattleItemMenuInput(u8 taskId) s8 r4 = Menu_ProcessInputNoWrap(); switch (r4) { - case -2: + case MENU_NOTHING_CHOSEN: break; - case -1: + case MENU_B_PRESSED: PlaySE(SE_SELECT); gUnknown_08613FB4[4].func.void_u8(taskId); break; diff --git a/src/item_use.c b/src/item_use.c index 6a7f6cec0..0ea5f6acf 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -38,8 +38,6 @@ #include "constants/songs.h" #include "constants/vars.h" -extern void(*gUnknown_0203A0F4)(u8 taskId); -extern void (*gUnknown_03006328)(u8, TaskFunc); extern void unknown_ItemMenu_Confirm(u8 taskId); extern void sub_81C5B14(u8 taskId); extern void ScriptUnfreezeEventObjects(void); @@ -100,6 +98,9 @@ void sub_80FDBEC(void); bool8 sub_80FDE2C(void); void ItemUseOutOfBattle_CannotUse(u8 taskId); +// EWRAM variables +EWRAM_DATA static void(*gUnknown_0203A0F4)(u8 taskId) = NULL; + // .rodata static const MainCallback gUnknown_085920D8[] = diff --git a/src/learn_move.c b/src/learn_move.c index 4db83861e..7a6916013 100644 --- a/src/learn_move.c +++ b/src/learn_move.c @@ -638,7 +638,7 @@ static void HideSpritesAndPrintTeachText(bool8 a) static void HandleInput(bool8 showContest) { - s32 itemId = ListMenuHandleInputGetItemId(sLearnMoveStruct->listMenuTask); + s32 itemId = ListMenu_ProcessInput(sLearnMoveStruct->listMenuTask); ListMenuGetScrollAndRow(sLearnMoveStruct->listMenuTask, &sLearnMoveStruct2.listOffset, &sLearnMoveStruct2.listRow); switch (itemId) diff --git a/src/list_menu.c b/src/list_menu.c index 2476fae26..7a9547661 100644 --- a/src/list_menu.c +++ b/src/list_menu.c @@ -334,7 +334,7 @@ s32 DoMysteryGiftListMenu(struct WindowTemplate *windowTemplate, struct ListMenu sMysteryGiftLinkMenu.state = 1; break; case 1: - sMysteryGiftLinkMenu.currItemId = ListMenuHandleInputGetItemId(sMysteryGiftLinkMenu.listTaskId); + sMysteryGiftLinkMenu.currItemId = ListMenu_ProcessInput(sMysteryGiftLinkMenu.listTaskId); if (gMain.newKeys & A_BUTTON) { sMysteryGiftLinkMenu.state = 2; @@ -406,7 +406,7 @@ u8 ListMenuInitInRect(struct ListMenuTemplate *listMenuTemplate, struct ListMenu return taskId; } -s32 ListMenuHandleInputGetItemId(u8 listTaskId) +s32 ListMenu_ProcessInput(u8 listTaskId) { struct ListMenu *list = (void*) gTasks[listTaskId].data; diff --git a/src/m4a.c b/src/m4a.c new file mode 100644 index 000000000..7b4441ca4 --- /dev/null +++ b/src/m4a.c @@ -0,0 +1,1779 @@ +#include "gba/m4a_internal.h" + +extern const u8 gCgb3Vol[]; + +#define BSS_CODE __attribute__((section(".bss.code"))) + +BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0}; + +struct SoundInfo gSoundInfo; +struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES]; +struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES]; +void *gMPlayJumpTable[36]; +struct CgbChannel gCgbChans[4]; +struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2]; +struct PokemonCrySong gPokemonCrySong; +struct MusicPlayerInfo gMPlayInfo_BGM; +struct MusicPlayerInfo gMPlayInfo_SE1; +struct MusicPlayerInfo gMPlayInfo_SE2; +struct MusicPlayerInfo gMPlayInfo_SE3; +u8 gMPlayMemAccArea[0x10]; + +u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust) +{ + u32 val1; + u32 val2; + u32 fineAdjustShifted = fineAdjust << 24; + + if (key > 178) + { + key = 178; + fineAdjustShifted = 255 << 24; + } + + val1 = gScaleTable[key]; + val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4); + + val2 = gScaleTable[key + 1]; + val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4); + + return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted)); +} + +void UnusedDummyFunc(void) +{ +} + +void MPlayContinue(struct MusicPlayerInfo *mplayInfo) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; + mplayInfo->ident = ID_NUMBER; + } +} + +void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aSoundInit(void) +{ + s32 i; + + CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); + + SoundInit(&gSoundInfo); + MPlayExtender(gCgbChans); + m4aSoundMode(SOUND_MODE_DA_BIT_8 + | SOUND_MODE_FREQ_13379 + | (12 << SOUND_MODE_MASVOL_SHIFT) + | (5 << SOUND_MODE_MAXCHN_SHIFT)); + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + { + struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info; + MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8); + mplayInfo->unk_B = gMPlayTable[i].unk_A; + mplayInfo->memAccArea = gMPlayMemAccArea; + } + + memcpy(&gPokemonCrySong, &gPokemonCrySongTemplate, sizeof(struct PokemonCrySong)); + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + { + struct MusicPlayerInfo *mplayInfo = &gPokemonCryMusicPlayers[i]; + struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; + MPlayOpen(mplayInfo, track, 2); + track->chan = 0; + } +} + +void m4aSoundMain(void) +{ + SoundMain(); +} + +void m4aSongNumStart(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + MPlayStart(mplay->info, song->header); +} + +void m4aSongNumStartOrChange(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader != song->header) + { + MPlayStart(mplay->info, song->header); + } + else + { + if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0 + || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)) + { + MPlayStart(mplay->info, song->header); + } + } +} + +void m4aSongNumStartOrContinue(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader != song->header) + MPlayStart(mplay->info, song->header); + else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0) + MPlayStart(mplay->info, song->header); + else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE) + MPlayContinue(mplay->info); +} + +void m4aSongNumStop(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader == song->header) + m4aMPlayStop(mplay->info); +} + +void m4aSongNumContinue(u16 n) +{ + const struct MusicPlayer *mplayTable = gMPlayTable; + const struct Song *songTable = gSongTable; + const struct Song *song = &songTable[n]; + const struct MusicPlayer *mplay = &mplayTable[song->ms]; + + if (mplay->info->songHeader == song->header) + MPlayContinue(mplay->info); +} + +void m4aMPlayAllStop(void) +{ + s32 i; + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + m4aMPlayStop(gMPlayTable[i].info); + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + m4aMPlayStop(&gPokemonCryMusicPlayers[i]); +} + +void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo) +{ + MPlayContinue(mplayInfo); +} + +void m4aMPlayAllContinue(void) +{ + s32 i; + + for (i = 0; i < NUM_MUSIC_PLAYERS; i++) + MPlayContinue(gMPlayTable[i].info); + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + MPlayContinue(&gPokemonCryMusicPlayers[i]); +} + +void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + MPlayFadeOut(mplayInfo, speed); +} + +void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->fadeOC = speed; + mplayInfo->fadeOI = speed; + mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN; + mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo) +{ + s32 trackCount = mplayInfo->trackCount; + struct MusicPlayerTrack *track = mplayInfo->tracks; + + while (trackCount > 0) + { + if (track->flags & MPT_FLG_EXIST) + { + if (track->flags & MPT_FLG_START) + { + Clear64byte(track); + track->flags = MPT_FLG_EXIST; + track->bendRange = 2; + track->volX = 64; + track->lfoSpeed = 22; + track->tone.type = 1; + } + } + + trackCount--; + track++; + } +} + +void MPlayExtender(struct CgbChannel *cgbChans) +{ + struct SoundInfo *soundInfo; + u32 ident; + + REG_SOUNDCNT_X = SOUND_MASTER_ENABLE + | SOUND_4_ON + | SOUND_3_ON + | SOUND_2_ON + | SOUND_1_ON; + REG_SOUNDCNT_L = 0; // set master volume to zero + REG_NR12 = 0x8; + REG_NR22 = 0x8; + REG_NR42 = 0x8; + REG_NR14 = 0x80; + REG_NR24 = 0x80; + REG_NR44 = 0x80; + REG_NR30 = 0; + REG_NR50 = 0x77; + + soundInfo = SOUND_INFO_PTR; + + ident = soundInfo->ident; + + if (ident != ID_NUMBER) + return; + + soundInfo->ident++; + + gMPlayJumpTable[8] = ply_memacc; + gMPlayJumpTable[17] = ply_lfos; + gMPlayJumpTable[19] = ply_mod; + gMPlayJumpTable[28] = ply_xcmd; + gMPlayJumpTable[29] = ply_endtie; + gMPlayJumpTable[30] = SampleFreqSet; + gMPlayJumpTable[31] = TrackStop; + gMPlayJumpTable[32] = FadeOutBody; + gMPlayJumpTable[33] = TrkVolPitSet; + + soundInfo->cgbChans = (struct CgbChannel *)cgbChans; + soundInfo->CgbSound = CgbSound; + soundInfo->CgbOscOff = CgbOscOff; + soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq; + soundInfo->maxLines = MAX_LINES; + + CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4); + + cgbChans[0].ty = 1; + cgbChans[0].panMask = 0x11; + cgbChans[1].ty = 2; + cgbChans[1].panMask = 0x22; + cgbChans[2].ty = 3; + cgbChans[2].panMask = 0x44; + cgbChans[3].ty = 4; + cgbChans[3].panMask = 0x88; + + soundInfo->ident = ident; +} + +void MusicPlayerJumpTableCopy(void) +{ + asm("swi 0x2A"); +} + +void ClearChain(void *x) +{ + void (*func)(void *) = *(&gMPlayJumpTable[34]); + func(x); +} + +void Clear64byte(void *x) +{ + void (*func)(void *) = *(&gMPlayJumpTable[35]); + func(x); +} + +void SoundInit(struct SoundInfo *soundInfo) +{ + soundInfo->ident = 0; + + if (REG_DMA1CNT & (DMA_REPEAT << 16)) + REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + if (REG_DMA2CNT & (DMA_REPEAT << 16)) + REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + REG_DMA1CNT_H = DMA_32BIT; + REG_DMA2CNT_H = DMA_32BIT; + REG_SOUNDCNT_X = SOUND_MASTER_ENABLE + | SOUND_4_ON + | SOUND_3_ON + | SOUND_2_ON + | SOUND_1_ON; + REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT + | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT + | SOUND_ALL_MIX_FULL; + REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40; + + REG_DMA1SAD = (s32)soundInfo->pcmBuffer; + REG_DMA1DAD = (s32)®_FIFO_A; + REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE; + REG_DMA2DAD = (s32)®_FIFO_B; + + SOUND_INFO_PTR = soundInfo; + CpuFill32(0, soundInfo, sizeof(struct SoundInfo)); + + soundInfo->maxChans = 8; + soundInfo->masterVolume = 15; + soundInfo->plynote = (u32)ply_note; + soundInfo->CgbSound = DummyFunc; + soundInfo->CgbOscOff = (void (*)(u8))DummyFunc; + soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc; + soundInfo->ExtVolPit = (u32)DummyFunc; + + MPlayJumpTableCopy(gMPlayJumpTable); + + soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable; + + SampleFreqSet(SOUND_MODE_FREQ_13379); + + soundInfo->ident = ID_NUMBER; +} + +void SampleFreqSet(u32 freq) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + freq = (freq & 0xF0000) >> 16; + soundInfo->freq = freq; + soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; + soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; + + // LCD refresh rate 59.7275Hz + soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000; + + // CPU frequency 16.78Mhz + soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1; + + // Turn off timer 0. + REG_TM0CNT_H = 0; + + // cycles per LCD fresh 280896 + REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank); + + m4aSoundVSyncOn(); + + while (*(vu8 *)REG_ADDR_VCOUNT == 159) + ; + + while (*(vu8 *)REG_ADDR_VCOUNT != 159) + ; + + REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK; +} + +void m4aSoundMode(u32 mode) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + u32 temp; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL); + + if (temp) + soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL; + + temp = mode & SOUND_MODE_MAXCHN; + + if (temp) + { + struct SoundChannel *chan; + + soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; + + temp = MAX_DIRECTSOUND_CHANNELS; + chan = &soundInfo->chans[0]; + + while (temp != 0) + { + chan->status = 0; + temp--; + chan++; + } + } + + temp = mode & SOUND_MODE_MASVOL; + + if (temp) + soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT; + + temp = mode & SOUND_MODE_DA_BIT; + + if (temp) + { + temp = (temp & 0x300000) >> 14; + REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp; + } + + temp = mode & SOUND_MODE_FREQ; + + if (temp) + { + m4aSoundVSyncOff(); + SampleFreqSet(temp); + } + + soundInfo->ident = ID_NUMBER; +} + +void SoundClear(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + s32 i; + void *chan; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + i = MAX_DIRECTSOUND_CHANNELS; + chan = &soundInfo->chans[0]; + + while (i > 0) + { + ((struct SoundChannel *)chan)->status = 0; + i--; + chan = (void *)((s32)chan + sizeof(struct SoundChannel)); + } + + chan = soundInfo->cgbChans; + + if (chan) + { + i = 1; + + while (i <= 4) + { + soundInfo->CgbOscOff(i); + ((struct CgbChannel *)chan)->sf = 0; + i++; + chan = (void *)((s32)chan + sizeof(struct CgbChannel)); + } + } + + soundInfo->ident = ID_NUMBER; +} + +void m4aSoundVSyncOff(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) + { + soundInfo->ident += 10; + + if (REG_DMA1CNT & (DMA_REPEAT << 16)) + REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + if (REG_DMA2CNT & (DMA_REPEAT << 16)) + REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; + + REG_DMA1CNT_H = DMA_32BIT; + REG_DMA2CNT_H = DMA_32BIT; + + CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer)); + } +} + +void m4aSoundVSyncOn(void) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + u32 ident = soundInfo->ident; + + if (ident == ID_NUMBER) + return; + + REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; + REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; + + soundInfo->pcmDmaCounter = 0; + soundInfo->ident = ident - 10; +} + +void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount) +{ + struct SoundInfo *soundInfo; + + if (trackCount == 0) + return; + + if (trackCount > MAX_MUSICPLAYER_TRACKS) + trackCount = MAX_MUSICPLAYER_TRACKS; + + soundInfo = SOUND_INFO_PTR; + + if (soundInfo->ident != ID_NUMBER) + return; + + soundInfo->ident++; + + Clear64byte(mplayInfo); + + mplayInfo->tracks = tracks; + mplayInfo->trackCount = trackCount; + mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; + + while (trackCount != 0) + { + tracks->flags = 0; + trackCount--; + tracks++; + } + + if (soundInfo->func != 0) + { + mplayInfo->func = soundInfo->func; + mplayInfo->intp = soundInfo->intp; + soundInfo->func = 0; + } + + soundInfo->intp = (u32)mplayInfo; + soundInfo->func = (u32)MPlayMain; + soundInfo->ident = ID_NUMBER; + mplayInfo->ident = ID_NUMBER; +} + +void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader) +{ + s32 i; + u8 unk_B; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + unk_B = mplayInfo->unk_B; + + if (!unk_B + || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START)) + && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0 + || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE))) + || (mplayInfo->priority <= songHeader->priority)) + { + mplayInfo->ident++; + mplayInfo->status = 0; + mplayInfo->songHeader = songHeader; + mplayInfo->tone = songHeader->tone; + mplayInfo->priority = songHeader->priority; + mplayInfo->clock = 0; + mplayInfo->tempoD = 150; + mplayInfo->tempoI = 150; + mplayInfo->tempoU = 0x100; + mplayInfo->tempoC = 0; + mplayInfo->fadeOI = 0; + + i = 0; + track = mplayInfo->tracks; + + while (i < songHeader->trackCount && i < mplayInfo->trackCount) + { + TrackStop(mplayInfo, track); + track->flags = MPT_FLG_EXIST | MPT_FLG_START; + track->chan = 0; + track->cmdPtr = songHeader->part[i]; + i++; + track++; + } + + while (i < mplayInfo->trackCount) + { + TrackStop(mplayInfo, track); + track->flags = 0; + i++; + track++; + } + + if (songHeader->reverb & 0x80) + m4aSoundMode(songHeader->reverb); + + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo) +{ + s32 i; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + TrackStop(mplayInfo, track); + i--; + track++; + } + + mplayInfo->ident = ID_NUMBER; +} + +void FadeOutBody(struct MusicPlayerInfo *mplayInfo) +{ + s32 i; + struct MusicPlayerTrack *track; + u16 fadeOV; +#ifdef NONMATCHING + u16 mask; +#else + register u16 mask asm("r2"); +#endif // NONMATCHING + + if (mplayInfo->fadeOI == 0) + return; + + mplayInfo->fadeOC--; + mask = 0xFFFF; + + if (mplayInfo->fadeOC != 0) + return; + + mplayInfo->fadeOC = mplayInfo->fadeOI; + + if (mplayInfo->fadeOV & FADE_IN) + { + mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT); + + if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT)) + { + mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); + mplayInfo->fadeOI = 0; + } + } + else + { + mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT); + + if ((s16)(mplayInfo->fadeOV & mask) <= 0) + { + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + u32 val; + + TrackStop(mplayInfo, track); + + val = TEMPORARY_FADE; + fadeOV = mplayInfo->fadeOV; + val &= fadeOV; + + if (!val) + track->flags = 0; + + i--; + track++; + } + + if (mplayInfo->fadeOV & TEMPORARY_FADE) + mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; + else + mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; + + mplayInfo->fadeOI = 0; + return; + } + } + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + + while (i > 0) + { + if (track->flags & MPT_FLG_EXIST) + { + fadeOV = mplayInfo->fadeOV; + + track->volX = (fadeOV >> FADE_VOL_SHIFT); + track->flags |= MPT_FLG_VOLCHG; + } + + i--; + track++; + } +} + +void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + if (track->flags & MPT_FLG_VOLSET) + { + s32 x; + s32 y; + + x = (u32)(track->vol * track->volX) >> 5; + + if (track->modT == 1) + x = (u32)(x * (track->modM + 128)) >> 7; + + y = 2 * track->pan + track->panX; + + if (track->modT == 2) + y += track->modM; + + if (y < -128) + y = -128; + else if (y > 127) + y = 127; + + track->volMR = (u32)((y + 128) * x) >> 8; + track->volML = (u32)((127 - y) * x) >> 8; + } + + if (track->flags & MPT_FLG_PITSET) + { + s32 bend = track->bend * track->bendRange; + s32 x = (track->tune + bend) + * 4 + + (track->keyShift << 8) + + (track->keyShiftX << 8) + + track->pitX; + + if (track->modT == 0) + x += 16 * track->modM; + + track->keyM = x >> 8; + track->pitM = x; + } + + track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET); +} + +u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) +{ + if (chanNum == 4) + { + if (key <= 20) + { + key = 0; + } + else + { + key -= 21; + if (key > 59) + key = 59; + } + + return gNoiseTable[key]; + } + else + { + s32 val1; + s32 val2; + + if (key <= 35) + { + fineAdjust = 0; + key = 0; + } + else + { + key -= 36; + if (key > 130) + { + key = 130; + fineAdjust = 255; + } + } + + val1 = gCgbScaleTable[key]; + val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4); + + val2 = gCgbScaleTable[key + 1]; + val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4); + + return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048; + } +} + +void CgbOscOff(u8 chanNum) +{ + switch (chanNum) + { + case 1: + REG_NR12 = 8; + REG_NR14 = 0x80; + break; + case 2: + REG_NR22 = 8; + REG_NR24 = 0x80; + break; + case 3: + REG_NR30 = 0; + break; + default: + REG_NR42 = 8; + REG_NR44 = 0x80; + } +} + +static inline int CgbPan(struct CgbChannel *chan) +{ + u32 rightVolume = chan->rightVolume; + u32 leftVolume = chan->leftVolume; + + if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) + { + if (rightVolume / 2 >= leftVolume) + { + chan->pan = 0x0F; + return 1; + } + } + else + { + if (leftVolume / 2 >= rightVolume) + { + chan->pan = 0xF0; + return 1; + } + } + + return 0; +} + +void CgbModVol(struct CgbChannel *chan) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if ((soundInfo->mode & 1) || !CgbPan(chan)) + { + chan->pan = 0xFF; + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + } + else + { + // Force chan->rightVolume and chan->leftVolume to be read from memory again, + // even though there is no reason to do so. + // The command line option "-fno-gcse" achieves the same result as this. + asm("" : : : "memory"); + + chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + if (chan->eg > 15) + chan->eg = 15; + } + + chan->sg = (chan->eg * chan->su + 15) >> 4; + chan->pan &= chan->panMask; +} + +void CgbSound(void) +{ + s32 ch; + struct CgbChannel *channels; + s32 evAdd; + s32 prevC15; + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + vu8 *nrx0ptr; + vu8 *nrx1ptr; + vu8 *nrx2ptr; + vu8 *nrx3ptr; + vu8 *nrx4ptr; + + // Most comparision operations that cast to s8 perform 'and' by 0xFF. + int mask = 0xff; + + if (soundInfo->c15) + soundInfo->c15--; + else + soundInfo->c15 = 14; + + for (ch = 1, channels = soundInfo->cgbChans; ch <= 4; ch++, channels++) + { + if (!(channels->sf & 0xc7)) + continue; + + switch (ch) + { + case 1: + nrx0ptr = (vu8 *)(REG_ADDR_NR10); + nrx1ptr = (vu8 *)(REG_ADDR_NR11); + nrx2ptr = (vu8 *)(REG_ADDR_NR12); + nrx3ptr = (vu8 *)(REG_ADDR_NR13); + nrx4ptr = (vu8 *)(REG_ADDR_NR14); + break; + case 2: + nrx0ptr = (vu8 *)(REG_ADDR_NR10+1); + nrx1ptr = (vu8 *)(REG_ADDR_NR21); + nrx2ptr = (vu8 *)(REG_ADDR_NR22); + nrx3ptr = (vu8 *)(REG_ADDR_NR23); + nrx4ptr = (vu8 *)(REG_ADDR_NR24); + break; + case 3: + nrx0ptr = (vu8 *)(REG_ADDR_NR30); + nrx1ptr = (vu8 *)(REG_ADDR_NR31); + nrx2ptr = (vu8 *)(REG_ADDR_NR32); + nrx3ptr = (vu8 *)(REG_ADDR_NR33); + nrx4ptr = (vu8 *)(REG_ADDR_NR34); + break; + default: + nrx0ptr = (vu8 *)(REG_ADDR_NR30+1); + nrx1ptr = (vu8 *)(REG_ADDR_NR41); + nrx2ptr = (vu8 *)(REG_ADDR_NR42); + nrx3ptr = (vu8 *)(REG_ADDR_NR43); + nrx4ptr = (vu8 *)(REG_ADDR_NR44); + break; + } + + prevC15 = soundInfo->c15; + evAdd = *nrx2ptr; + + if (channels->sf & 0x80) + { + if (!(channels->sf & 0x40)) + { + channels->sf = 3; + channels->mo = 3; + CgbModVol(channels); + switch (ch) + { + case 1: + *nrx0ptr = channels->sw; + // fallthrough + case 2: + *nrx1ptr = ((u32)channels->wp << 6) + channels->le; + goto loc_82E0E30; + case 3: + if ((u32)channels->wp != channels->cp) + { + *nrx0ptr = 0x40; + REG_WAVE_RAM0 = channels->wp[0]; + REG_WAVE_RAM1 = channels->wp[1]; + REG_WAVE_RAM2 = channels->wp[2]; + REG_WAVE_RAM3 = channels->wp[3]; + channels->cp = (u32)channels->wp; + } + *nrx0ptr = 0; + *nrx1ptr = channels->le; + if (channels->le) + channels->n4 = -64; + else + channels->n4 = -128; + break; + default: + *nrx1ptr = channels->le; + *nrx3ptr = (u32)channels->wp << 3; + loc_82E0E30: + evAdd = channels->at + 8; + if (channels->le) + channels->n4 = 64; + else + channels->n4 = 0; + break; + } + channels->ec = channels->at; + if ((s8)(channels->at & mask)) + { + channels->ev = 0; + goto EC_MINUS; + } + else + { + goto loc_82E0F96; + } + } + else + { + goto loc_82E0E82; + } + } + else if (channels->sf & 0x04) + { + channels->echoLength--; + if ((s8)(channels->echoLength & mask) <= 0) + { + loc_82E0E82: + CgbOscOff(ch); + channels->sf = 0; + goto LAST_LABEL; + } + goto loc_82E0FD6; + } + else if ((channels->sf & 0x40) && (channels->sf & 0x03)) + { + channels->sf &= 0xfc; + channels->ec = channels->re; + if ((s8)(channels->re & mask)) + { + channels->mo |= 1; + if (ch != 3) + { + evAdd = channels->re; + } + goto EC_MINUS; + } + else + { + goto loc_82E0F02; + } + } + else + { + loc_82E0ED0: + if (channels->ec == 0) + { + if (ch == 3) + { + channels->mo |= 1; + } + CgbModVol(channels); + if ((channels->sf & 0x3) == 0) + { + channels->ev--; + if ((s8)(channels->ev & mask) <= 0) + { + loc_82E0F02: + channels->ev = ((channels->eg * channels->echoVolume) + 0xFF) >> 8; + if (channels->ev) + { + channels->sf |= 0x4; + channels->mo |= 1; + if (ch != 3) + { + evAdd = 8; + } + goto loc_82E0FD6; + } + else + { + goto loc_82E0E82; + } + } + else + { + channels->ec = channels->re; + } + } + else if ((channels->sf & 0x3) == 1) + { + loc_82E0F3A: + channels->ev = channels->sg; + channels->ec = 7; + } + else if ((channels->sf & 0x3) == 2) + { + int ev, sg; + + channels->ev--; + ev = (s8)(channels->ev & mask); + sg = (s8)(channels->sg); + if (ev <= sg) + { + loc_82E0F5A: + if (channels->su == 0) + { + channels->sf &= 0xfc; + goto loc_82E0F02; + } + else + { + channels->sf--; + channels->mo |= 1; + if (ch != 3) + { + evAdd = 8; + } + goto loc_82E0F3A; + } + } + else + { + channels->ec = channels->de; + } + } + else + { + channels->ev++; + if ((u8)(channels->ev & mask) >= channels->eg) + { + loc_82E0F96: + channels->sf--; + channels->ec = channels->de; + if ((u8)(channels->ec & mask)) + { + channels->mo |= 1; + channels->ev = channels->eg; + if (ch != 3) + { + evAdd = channels->de; + } + } + else + { + goto loc_82E0F5A; + } + } + else + { + channels->ec = channels->at; + } + } + } + } + + EC_MINUS: + channels->ec--; + if (prevC15 == 0) + { + prevC15--; + goto loc_82E0ED0; + } + + loc_82E0FD6: + if (channels->mo & 0x2) + { + if (ch < 4 && (channels->ty & 0x08)) + { + int biasH = REG_SOUNDBIAS_H; + + if (biasH < 64) + { + channels->fr = (channels->fr + 2) & 0x7fc; + } + else if (biasH < 128) + { + channels->fr = (channels->fr + 1) & 0x7fe; + } + } + if (ch != 4) + { + *nrx3ptr = channels->fr; + } + else + { + *nrx3ptr = (*nrx3ptr & 0x08) | channels->fr; + } + channels->n4 = (channels->n4 & 0xC0) + (*((u8*)(&channels->fr) + 1)); + *nrx4ptr = (s8)(channels->n4 & mask); + } + + if (channels->mo & 1) + { + REG_NR51 = (REG_NR51 & ~channels->panMask) | channels->pan; + if (ch == 3) + { + *nrx2ptr = gCgb3Vol[channels->ev]; + if (channels->n4 & 0x80) + { + *nrx0ptr = 0x80; + *nrx4ptr = channels->n4; + channels->n4 &= 0x7f; + } + } + else + { + evAdd &= 0xf; + *nrx2ptr = (channels->ev << 4) + evAdd; + *nrx4ptr = channels->n4 | 0x80; + if (ch == 1 && !(*nrx0ptr & 0x08)) + { + *nrx4ptr = channels->n4 | 0x80; + } + } + } + + LAST_LABEL: + channels->mo = 0; + } +} + +void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo) +{ + if (mplayInfo->ident == ID_NUMBER) + { + mplayInfo->ident++; + mplayInfo->tempoU = tempo; + mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8; + mplayInfo->ident = ID_NUMBER; + } +} + +void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->volX = volume / 4; + track->flags |= MPT_FLG_VOLCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->keyShiftX = pitch >> 8; + track->pitX = pitch; + track->flags |= MPT_FLG_PITCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->panX = pan; + track->flags |= MPT_FLG_VOLCHG; + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void ClearModM(struct MusicPlayerTrack *track) +{ + track->lfoSpeedC = 0; + track->modM = 0; + + if (track->modT == 0) + track->flags |= MPT_FLG_PITCHG; + else + track->flags |= MPT_FLG_VOLCHG; +} + +void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->mod = modDepth; + + if (!track->mod) + ClearModM(track); + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed) +{ + s32 i; + u32 bit; + struct MusicPlayerTrack *track; + + if (mplayInfo->ident != ID_NUMBER) + return; + + mplayInfo->ident++; + + i = mplayInfo->trackCount; + track = mplayInfo->tracks; + bit = 1; + + while (i > 0) + { + if (trackBits & bit) + { + if (track->flags & MPT_FLG_EXIST) + { + track->lfoSpeed = lfoSpeed; + + if (!track->lfoSpeed) + ClearModM(track); + } + } + + i--; + track++; + bit <<= 1; + } + + mplayInfo->ident = ID_NUMBER; +} + +#define MEMACC_COND_JUMP(cond) \ +if (cond) \ + goto cond_true; \ +else \ + goto cond_false; \ + +void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 op; + u8 *addr; + u8 data; + + op = *track->cmdPtr; + track->cmdPtr++; + + addr = mplayInfo->memAccArea + *track->cmdPtr; + track->cmdPtr++; + + data = *track->cmdPtr; + track->cmdPtr++; + + switch (op) + { + case 0: + *addr = data; + return; + case 1: + *addr += data; + return; + case 2: + *addr -= data; + return; + case 3: + *addr = mplayInfo->memAccArea[data]; + return; + case 4: + *addr += mplayInfo->memAccArea[data]; + return; + case 5: + *addr -= mplayInfo->memAccArea[data]; + return; + case 6: + MEMACC_COND_JUMP(*addr == data) + return; + case 7: + MEMACC_COND_JUMP(*addr != data) + return; + case 8: + MEMACC_COND_JUMP(*addr > data) + return; + case 9: + MEMACC_COND_JUMP(*addr >= data) + return; + case 10: + MEMACC_COND_JUMP(*addr <= data) + return; + case 11: + MEMACC_COND_JUMP(*addr < data) + return; + case 12: + MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data]) + return; + case 13: + MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data]) + return; + case 14: + MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data]) + return; + case 15: + MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data]) + return; + case 16: + MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data]) + return; + case 17: + MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data]) + return; + default: + return; + } + +cond_true: + { + void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]); + func(mplayInfo, track); + return; + } + +cond_false: + track->cmdPtr += 4; +} + +void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 n = *track->cmdPtr; + track->cmdPtr++; + + gXcmdTable[n](mplayInfo, track); +} + +void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]); + func(mplayInfo, track); +} + +#define READ_XCMD_BYTE(var, n) \ +{ \ + u32 byte = track->cmdPtr[(n)]; \ + byte <<= n * 8; \ + (var) &= ~(0xFF << (n * 8)); \ + (var) |= byte; \ +} + +void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 wav; + + READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable + READ_XCMD_BYTE(wav, 1) + READ_XCMD_BYTE(wav, 2) + READ_XCMD_BYTE(wav, 3) + + track->tone.wav = (struct WaveData *)wav; + track->cmdPtr += 4; +} + +void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.type = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.attack = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.decay = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.sustain = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.release = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->echoVolume = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->echoLength = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.length = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + track->tone.pan_sweep = *track->cmdPtr; + track->cmdPtr++; +} + +void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 unk; + + READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable + READ_XCMD_BYTE(unk, 1) + + if (track->unk_3A < (u16)unk) + { + track->unk_3A++; + track->cmdPtr -= 2; + track->wait = 1; + } + else + { + track->unk_3A = 0; + track->cmdPtr += 2; + } +} + +void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) +{ + u32 unk; + + READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable + READ_XCMD_BYTE(unk, 1) + READ_XCMD_BYTE(unk, 2) + READ_XCMD_BYTE(unk, 3) + + track->unk_3C = unk; + track->cmdPtr += 4; +} + +void DummyFunc(void) +{ +} + +struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone) +{ + u32 maxClock = 0; + s32 maxClockIndex = 0; + s32 i; + struct MusicPlayerInfo *mplayInfo; + + for (i = 0; i < MAX_POKEMON_CRIES; i++) + { + struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; + + if (!track->flags && (!track->chan || track->chan->track != track)) + goto start_song; + + if (maxClock < gPokemonCryMusicPlayers[i].clock) + { + maxClock = gPokemonCryMusicPlayers[i].clock; + maxClockIndex = i; + } + } + + i = maxClockIndex; + +start_song: + mplayInfo = &gPokemonCryMusicPlayers[i]; + mplayInfo->ident++; + +#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong)) +#define CRY_OFS(field) offsetof(struct PokemonCrySong, field) + + memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong)); + + *(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone; + *(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0); + *(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1); + *(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont); + +#undef CRY_OFS +#undef CRY + + mplayInfo->ident = ID_NUMBER; + + MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i])); + + return mplayInfo; +} + +void SetPokemonCryVolume(u8 val) +{ + gPokemonCrySong.volumeValue = val & 0x7F; +} + +void SetPokemonCryPanpot(s8 val) +{ + gPokemonCrySong.panValue = (val + C_V) & 0x7F; +} + +void SetPokemonCryPitch(s16 val) +{ + s16 b = val + 0x80; + u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue; + gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F; + gPokemonCrySong.tuneValue = (b >> 1) & 0x7F; + gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F; +} + +void SetPokemonCryLength(u16 val) +{ + gPokemonCrySong.unkCmd0CParam = val; +} + +void SetPokemonCryRelease(u8 val) +{ + gPokemonCrySong.releaseValue = val; +} + +void SetPokemonCryProgress(u32 val) +{ + gPokemonCrySong.unkCmd0DParam = val; +} + +int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo) +{ + struct MusicPlayerTrack *track = mplayInfo->tracks; + + if (track->chan && track->chan->track == track) + return 1; + else + return 0; +} + +void SetPokemonCryChorus(s8 val) +{ + if (val) + { + gPokemonCrySong.trackCount = 2; + gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F; + } + else + { + gPokemonCrySong.trackCount = 1; + } +} + +void SetPokemonCryStereo(u32 val) +{ + struct SoundInfo *soundInfo = SOUND_INFO_PTR; + + if (val) + { + REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT + | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT + | SOUND_ALL_MIX_FULL; + soundInfo->mode &= ~1; + } + else + { + REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT + | SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT + | SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL; + soundInfo->mode |= 1; + } +} + +void SetPokemonCryPriority(u8 val) +{ + gPokemonCrySong.priority = val; +} diff --git a/src/m4a_2.c b/src/m4a_2.c deleted file mode 100644 index 0625f05d1..000000000 --- a/src/m4a_2.c +++ /dev/null @@ -1,912 +0,0 @@ -#include "gba/m4a_internal.h" - -#define BSS_CODE __attribute__((section(".bss.code"))) - -BSS_CODE ALIGNED(4) char SoundMainRAM_Buffer[0x800] = {0}; - -struct SoundInfo gSoundInfo; -struct PokemonCrySong gPokemonCrySongs[MAX_POKEMON_CRIES]; -struct MusicPlayerInfo gPokemonCryMusicPlayers[MAX_POKEMON_CRIES]; -void *gMPlayJumpTable[36]; -struct CgbChannel gCgbChans[4]; -struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2]; -struct PokemonCrySong gPokemonCrySong; -struct MusicPlayerInfo gMPlayInfo_BGM; -struct MusicPlayerInfo gMPlayInfo_SE1; -struct MusicPlayerInfo gMPlayInfo_SE2; -struct MusicPlayerInfo gMPlayInfo_SE3; -u8 gMPlayMemAccArea[0x10]; - -u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust) -{ - u32 val1; - u32 val2; - u32 fineAdjustShifted = fineAdjust << 24; - - if (key > 178) - { - key = 178; - fineAdjustShifted = 255 << 24; - } - - val1 = gScaleTable[key]; - val1 = gFreqTable[val1 & 0xF] >> (val1 >> 4); - - val2 = gScaleTable[key + 1]; - val2 = gFreqTable[val2 & 0xF] >> (val2 >> 4); - - return umul3232H32(wav->freq, val1 + umul3232H32(val2 - val1, fineAdjustShifted)); -} - -void UnusedDummyFunc() -{ -} - -void MPlayContinue(struct MusicPlayerInfo *mplayInfo) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; - mplayInfo->ident = ID_NUMBER; - } -} - -void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->fadeOC = speed; - mplayInfo->fadeOI = speed; - mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aSoundInit(void) -{ - s32 i; - - CpuCopy32((void *)((s32)SoundMainRAM & ~1), SoundMainRAM_Buffer, sizeof(SoundMainRAM_Buffer)); - - SoundInit(&gSoundInfo); - MPlayExtender(gCgbChans); - m4aSoundMode(SOUND_MODE_DA_BIT_8 - | SOUND_MODE_FREQ_13379 - | (12 << SOUND_MODE_MASVOL_SHIFT) - | (5 << SOUND_MODE_MAXCHN_SHIFT)); - - for (i = 0; i < NUM_MUSIC_PLAYERS; i++) - { - struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info; - MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8); - mplayInfo->unk_B = gMPlayTable[i].unk_A; - mplayInfo->memAccArea = gMPlayMemAccArea; - } - - memcpy(&gPokemonCrySong, &gPokemonCrySongTemplate, sizeof(struct PokemonCrySong)); - - for (i = 0; i < MAX_POKEMON_CRIES; i++) - { - struct MusicPlayerInfo *mplayInfo = &gPokemonCryMusicPlayers[i]; - struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; - MPlayOpen(mplayInfo, track, 2); - track->chan = 0; - } -} - -void m4aSoundMain(void) -{ - SoundMain(); -} - -void m4aSongNumStart(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - MPlayStart(mplay->info, song->header); -} - -void m4aSongNumStartOrChange(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader != song->header) - { - MPlayStart(mplay->info, song->header); - } - else - { - if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0 - || (mplay->info->status & MUSICPLAYER_STATUS_PAUSE)) - { - MPlayStart(mplay->info, song->header); - } - } -} - -void m4aSongNumStartOrContinue(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader != song->header) - MPlayStart(mplay->info, song->header); - else if ((mplay->info->status & MUSICPLAYER_STATUS_TRACK) == 0) - MPlayStart(mplay->info, song->header); - else if (mplay->info->status & MUSICPLAYER_STATUS_PAUSE) - MPlayContinue(mplay->info); -} - -void m4aSongNumStop(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader == song->header) - m4aMPlayStop(mplay->info); -} - -void m4aSongNumContinue(u16 n) -{ - const struct MusicPlayer *mplayTable = gMPlayTable; - const struct Song *songTable = gSongTable; - const struct Song *song = &songTable[n]; - const struct MusicPlayer *mplay = &mplayTable[song->ms]; - - if (mplay->info->songHeader == song->header) - MPlayContinue(mplay->info); -} - -void m4aMPlayAllStop(void) -{ - s32 i; - - for (i = 0; i < NUM_MUSIC_PLAYERS; i++) - m4aMPlayStop(gMPlayTable[i].info); - - for (i = 0; i < MAX_POKEMON_CRIES; i++) - m4aMPlayStop(&gPokemonCryMusicPlayers[i]); -} - -void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo) -{ - MPlayContinue(mplayInfo); -} - -void m4aMPlayAllContinue(void) -{ - s32 i; - - for (i = 0; i < NUM_MUSIC_PLAYERS; i++) - MPlayContinue(gMPlayTable[i].info); - - for (i = 0; i < MAX_POKEMON_CRIES; i++) - MPlayContinue(&gPokemonCryMusicPlayers[i]); -} - -void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - MPlayFadeOut(mplayInfo, speed); -} - -void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->fadeOC = speed; - mplayInfo->fadeOI = speed; - mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT) | TEMPORARY_FADE; - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->fadeOC = speed; - mplayInfo->fadeOI = speed; - mplayInfo->fadeOV = (0 << FADE_VOL_SHIFT) | FADE_IN; - mplayInfo->status &= ~MUSICPLAYER_STATUS_PAUSE; - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo) -{ - s32 trackCount = mplayInfo->trackCount; - struct MusicPlayerTrack *track = mplayInfo->tracks; - - while (trackCount > 0) - { - if (track->flags & MPT_FLG_EXIST) - { - if (track->flags & MPT_FLG_START) - { - Clear64byte(track); - track->flags = MPT_FLG_EXIST; - track->bendRange = 2; - track->volX = 64; - track->lfoSpeed = 22; - track->tone.type = 1; - } - } - - trackCount--; - track++; - } -} - -void MPlayExtender(struct CgbChannel *cgbChans) -{ - struct SoundInfo *soundInfo; - u32 ident; - - REG_SOUNDCNT_X = SOUND_MASTER_ENABLE - | SOUND_4_ON - | SOUND_3_ON - | SOUND_2_ON - | SOUND_1_ON; - REG_SOUNDCNT_L = 0; // set master volume to zero - REG_NR12 = 0x8; - REG_NR22 = 0x8; - REG_NR42 = 0x8; - REG_NR14 = 0x80; - REG_NR24 = 0x80; - REG_NR44 = 0x80; - REG_NR30 = 0; - REG_NR50 = 0x77; - - soundInfo = SOUND_INFO_PTR; - - ident = soundInfo->ident; - - if (ident != ID_NUMBER) - return; - - soundInfo->ident++; - - gMPlayJumpTable[8] = ply_memacc; - gMPlayJumpTable[17] = ply_lfos; - gMPlayJumpTable[19] = ply_mod; - gMPlayJumpTable[28] = ply_xcmd; - gMPlayJumpTable[29] = ply_endtie; - gMPlayJumpTable[30] = SampleFreqSet; - gMPlayJumpTable[31] = TrackStop; - gMPlayJumpTable[32] = FadeOutBody; - gMPlayJumpTable[33] = TrkVolPitSet; - - soundInfo->cgbChans = (struct CgbChannel *)cgbChans; - soundInfo->CgbSound = CgbSound; - soundInfo->CgbOscOff = CgbOscOff; - soundInfo->MidiKeyToCgbFreq = MidiKeyToCgbFreq; - soundInfo->maxLines = MAX_LINES; - - CpuFill32(0, cgbChans, sizeof(struct CgbChannel) * 4); - - cgbChans[0].ty = 1; - cgbChans[0].panMask = 0x11; - cgbChans[1].ty = 2; - cgbChans[1].panMask = 0x22; - cgbChans[2].ty = 3; - cgbChans[2].panMask = 0x44; - cgbChans[3].ty = 4; - cgbChans[3].panMask = 0x88; - - soundInfo->ident = ident; -} - -void MusicPlayerJumpTableCopy(void) -{ - asm("swi 0x2A"); -} - -void ClearChain(void *x) -{ - void (*func)(void *) = *(&gMPlayJumpTable[34]); - func(x); -} - -void Clear64byte(void *x) -{ - void (*func)(void *) = *(&gMPlayJumpTable[35]); - func(x); -} - -void SoundInit(struct SoundInfo *soundInfo) -{ - soundInfo->ident = 0; - - if (REG_DMA1CNT & (DMA_REPEAT << 16)) - REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - if (REG_DMA2CNT & (DMA_REPEAT << 16)) - REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - REG_DMA1CNT_H = DMA_32BIT; - REG_DMA2CNT_H = DMA_32BIT; - REG_SOUNDCNT_X = SOUND_MASTER_ENABLE - | SOUND_4_ON - | SOUND_3_ON - | SOUND_2_ON - | SOUND_1_ON; - REG_SOUNDCNT_H = SOUND_B_FIFO_RESET | SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT - | SOUND_A_FIFO_RESET | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT - | SOUND_ALL_MIX_FULL; - REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40; - - REG_DMA1SAD = (s32)soundInfo->pcmBuffer; - REG_DMA1DAD = (s32)®_FIFO_A; - REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE; - REG_DMA2DAD = (s32)®_FIFO_B; - - SOUND_INFO_PTR = soundInfo; - CpuFill32(0, soundInfo, sizeof(struct SoundInfo)); - - soundInfo->maxChans = 8; - soundInfo->masterVolume = 15; - soundInfo->plynote = (u32)ply_note; - soundInfo->CgbSound = DummyFunc; - soundInfo->CgbOscOff = (void (*)(u8))DummyFunc; - soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc; - soundInfo->ExtVolPit = (u32)DummyFunc; - - MPlayJumpTableCopy(gMPlayJumpTable); - - soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable; - - SampleFreqSet(SOUND_MODE_FREQ_13379); - - soundInfo->ident = ID_NUMBER; -} - -void SampleFreqSet(u32 freq) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - freq = (freq & 0xF0000) >> 16; - soundInfo->freq = freq; - soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1]; - soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank; - - // LCD refresh rate 59.7275Hz - soundInfo->pcmFreq = (597275 * soundInfo->pcmSamplesPerVBlank + 5000) / 10000; - - // CPU frequency 16.78Mhz - soundInfo->divFreq = (16777216 / soundInfo->pcmFreq + 1) >> 1; - - // Turn off timer 0. - REG_TM0CNT_H = 0; - - // cycles per LCD fresh 280896 - REG_TM0CNT_L = -(280896 / soundInfo->pcmSamplesPerVBlank); - - m4aSoundVSyncOn(); - - while (*(vu8 *)REG_ADDR_VCOUNT == 159) - ; - - while (*(vu8 *)REG_ADDR_VCOUNT != 159) - ; - - REG_TM0CNT_H = TIMER_ENABLE | TIMER_1CLK; -} - -void m4aSoundMode(u32 mode) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - u32 temp; - - if (soundInfo->ident != ID_NUMBER) - return; - - soundInfo->ident++; - - temp = mode & (SOUND_MODE_REVERB_SET | SOUND_MODE_REVERB_VAL); - - if (temp) - soundInfo->reverb = temp & SOUND_MODE_REVERB_VAL; - - temp = mode & SOUND_MODE_MAXCHN; - - if (temp) - { - struct SoundChannel *chan; - - soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT; - - temp = MAX_DIRECTSOUND_CHANNELS; - chan = &soundInfo->chans[0]; - - while (temp != 0) - { - chan->status = 0; - temp--; - chan++; - } - } - - temp = mode & SOUND_MODE_MASVOL; - - if (temp) - soundInfo->masterVolume = temp >> SOUND_MODE_MASVOL_SHIFT; - - temp = mode & SOUND_MODE_DA_BIT; - - if (temp) - { - temp = (temp & 0x300000) >> 14; - REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | temp; - } - - temp = mode & SOUND_MODE_FREQ; - - if (temp) - { - m4aSoundVSyncOff(); - SampleFreqSet(temp); - } - - soundInfo->ident = ID_NUMBER; -} - -void SoundClear(void) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - s32 i; - void *chan; - - if (soundInfo->ident != ID_NUMBER) - return; - - soundInfo->ident++; - - i = MAX_DIRECTSOUND_CHANNELS; - chan = &soundInfo->chans[0]; - - while (i > 0) - { - ((struct SoundChannel *)chan)->status = 0; - i--; - chan = (void *)((s32)chan + sizeof(struct SoundChannel)); - } - - chan = soundInfo->cgbChans; - - if (chan) - { - i = 1; - - while (i <= 4) - { - soundInfo->CgbOscOff(i); - ((struct CgbChannel *)chan)->sf = 0; - i++; - chan = (void *)((s32)chan + sizeof(struct CgbChannel)); - } - } - - soundInfo->ident = ID_NUMBER; -} - -void m4aSoundVSyncOff(void) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1) - { - soundInfo->ident += 10; - - if (REG_DMA1CNT & (DMA_REPEAT << 16)) - REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - if (REG_DMA2CNT & (DMA_REPEAT << 16)) - REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4; - - REG_DMA1CNT_H = DMA_32BIT; - REG_DMA2CNT_H = DMA_32BIT; - - CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer)); - } -} - -void m4aSoundVSyncOn(void) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - u32 ident = soundInfo->ident; - - if (ident == ID_NUMBER) - return; - - REG_DMA1CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; - REG_DMA2CNT_H = DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT; - - soundInfo->pcmDmaCounter = 0; - soundInfo->ident = ident - 10; -} - -void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tracks, u8 trackCount) -{ - struct SoundInfo *soundInfo; - - if (trackCount == 0) - return; - - if (trackCount > MAX_MUSICPLAYER_TRACKS) - trackCount = MAX_MUSICPLAYER_TRACKS; - - soundInfo = SOUND_INFO_PTR; - - if (soundInfo->ident != ID_NUMBER) - return; - - soundInfo->ident++; - - Clear64byte(mplayInfo); - - mplayInfo->tracks = tracks; - mplayInfo->trackCount = trackCount; - mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; - - while (trackCount != 0) - { - tracks->flags = 0; - trackCount--; - tracks++; - } - - if (soundInfo->func != 0) - { - mplayInfo->func = soundInfo->func; - mplayInfo->intp = soundInfo->intp; - soundInfo->func = 0; - } - - soundInfo->intp = (u32)mplayInfo; - soundInfo->func = (u32)MPlayMain; - soundInfo->ident = ID_NUMBER; - mplayInfo->ident = ID_NUMBER; -} - -void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader) -{ - s32 i; - u8 unk_B; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - unk_B = mplayInfo->unk_B; - - if (!unk_B - || ((!mplayInfo->songHeader || !(mplayInfo->tracks[0].flags & MPT_FLG_START)) - && ((mplayInfo->status & MUSICPLAYER_STATUS_TRACK) == 0 - || (mplayInfo->status & MUSICPLAYER_STATUS_PAUSE))) - || (mplayInfo->priority <= songHeader->priority)) - { - mplayInfo->ident++; - mplayInfo->status = 0; - mplayInfo->songHeader = songHeader; - mplayInfo->tone = songHeader->tone; - mplayInfo->priority = songHeader->priority; - mplayInfo->clock = 0; - mplayInfo->tempoD = 150; - mplayInfo->tempoI = 150; - mplayInfo->tempoU = 0x100; - mplayInfo->tempoC = 0; - mplayInfo->fadeOI = 0; - - i = 0; - track = mplayInfo->tracks; - - while (i < songHeader->trackCount && i < mplayInfo->trackCount) - { - TrackStop(mplayInfo, track); - track->flags = MPT_FLG_EXIST | MPT_FLG_START; - track->chan = 0; - track->cmdPtr = songHeader->part[i]; - i++; - track++; - } - - while (i < mplayInfo->trackCount) - { - TrackStop(mplayInfo, track); - track->flags = 0; - i++; - track++; - } - - if (songHeader->reverb & 0x80) - m4aSoundMode(songHeader->reverb); - - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo) -{ - s32 i; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { - TrackStop(mplayInfo, track); - i--; - track++; - } - - mplayInfo->ident = ID_NUMBER; -} - -void FadeOutBody(struct MusicPlayerInfo *mplayInfo) -{ - s32 i; - struct MusicPlayerTrack *track; - u16 fadeOI = mplayInfo->fadeOI; - register u32 temp asm("r3"); - register u16 mask asm("r2"); - - if (fadeOI == 0) - return; - - mplayInfo->fadeOC--; - - temp = 0xFFFF; - mask = temp; - - if (mplayInfo->fadeOC != 0) - return; - - mplayInfo->fadeOC = fadeOI; - - if (mplayInfo->fadeOV & FADE_IN) - { - mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT); - - if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT)) - { - mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT); - mplayInfo->fadeOI = 0; - } - } - else - { - mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT); - - if ((s16)(mplayInfo->fadeOV & mask) <= 0) - { - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { - register u32 fadeOV asm("r7"); - u32 val; - - TrackStop(mplayInfo, track); - - val = TEMPORARY_FADE; - fadeOV = mplayInfo->fadeOV; - val &= fadeOV; - - if (!val) - track->flags = 0; - - i--; - track++; - } - - if (mplayInfo->fadeOV & TEMPORARY_FADE) - mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE; - else - mplayInfo->status = MUSICPLAYER_STATUS_PAUSE; - - mplayInfo->fadeOI = 0; - return; - } - } - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - - while (i > 0) - { - if (track->flags & MPT_FLG_EXIST) - { - track->volX = (mplayInfo->fadeOV >> FADE_VOL_SHIFT); - track->flags |= MPT_FLG_VOLCHG; - } - - i--; - track++; - } -} - -void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - if (track->flags & MPT_FLG_VOLSET) - { - s32 x; - s32 y; - - x = (u32)(track->vol * track->volX) >> 5; - - if (track->modT == 1) - x = (u32)(x * (track->modM + 128)) >> 7; - - y = 2 * track->pan + track->panX; - - if (track->modT == 2) - y += track->modM; - - if (y < -128) - y = -128; - else if (y > 127) - y = 127; - - track->volMR = (u32)((y + 128) * x) >> 8; - track->volML = (u32)((127 - y) * x) >> 8; - } - - if (track->flags & MPT_FLG_PITSET) - { - s32 bend = track->bend * track->bendRange; - register s32 x asm("r1") = track->tune; - x += bend; - x *= 4; - x += (track->keyShift << 8); - x += (track->keyShiftX << 8); - x += track->pitX; - - if (track->modT == 0) - x += 16 * track->modM; - - track->keyM = x >> 8; - track->pitM = x; - } - - track->flags &= ~(MPT_FLG_PITSET | MPT_FLG_VOLSET); -} - -u32 MidiKeyToCgbFreq(u8 chanNum, u8 key, u8 fineAdjust) -{ - if (chanNum == 4) - { - if (key <= 20) - { - key = 0; - } - else - { - key -= 21; - if (key > 59) - key = 59; - } - - return gNoiseTable[key]; - } - else - { - s32 val1; - s32 val2; - - if (key <= 35) - { - fineAdjust = 0; - key = 0; - } - else - { - key -= 36; - if (key > 130) - { - key = 130; - fineAdjust = 255; - } - } - - val1 = gCgbScaleTable[key]; - val1 = gCgbFreqTable[val1 & 0xF] >> (val1 >> 4); - - val2 = gCgbScaleTable[key + 1]; - val2 = gCgbFreqTable[val2 & 0xF] >> (val2 >> 4); - - return val1 + ((fineAdjust * (val2 - val1)) >> 8) + 2048; - } -} - -void CgbOscOff(u8 chanNum) -{ - switch (chanNum) - { - case 1: - REG_NR12 = 8; - REG_NR14 = 0x80; - break; - case 2: - REG_NR22 = 8; - REG_NR24 = 0x80; - break; - case 3: - REG_NR30 = 0; - break; - default: - REG_NR42 = 8; - REG_NR44 = 0x80; - } -} - -static inline int CgbPan(struct CgbChannel *chan) -{ - u32 rightVolume = chan->rightVolume; - u32 leftVolume = chan->leftVolume; - - if ((rightVolume = (u8)rightVolume) >= (leftVolume = (u8)leftVolume)) - { - if (rightVolume / 2 >= leftVolume) - { - chan->pan = 0x0F; - return 1; - } - } - else - { - if (leftVolume / 2 >= rightVolume) - { - chan->pan = 0xF0; - return 1; - } - } - - return 0; -} - -void CgbModVol(struct CgbChannel *chan) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - if ((soundInfo->mode & 1) || !CgbPan(chan)) - { - chan->pan = 0xFF; - chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; - } - else - { - // Force chan->rightVolume and chan->leftVolume to be read from memory again, - // even though there is no reason to do so. - // The command line option "-fno-gcse" achieves the same result as this. - asm("" : : : "memory"); - - chan->eg = (u32)(chan->rightVolume + chan->leftVolume) >> 4; - if (chan->eg > 15) - chan->eg = 15; - } - - chan->sg = (chan->eg * chan->su + 15) >> 4; - chan->pan &= chan->panMask; -} diff --git a/src/m4a_4.c b/src/m4a_4.c deleted file mode 100644 index e645fbef5..000000000 --- a/src/m4a_4.c +++ /dev/null @@ -1,545 +0,0 @@ -#include "gba/m4a_internal.h" - -void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo) -{ - if (mplayInfo->ident == ID_NUMBER) - { - mplayInfo->ident++; - mplayInfo->tempoU = tempo; - mplayInfo->tempoI = (mplayInfo->tempoD * mplayInfo->tempoU) >> 8; - mplayInfo->ident = ID_NUMBER; - } -} - -void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->volX = volume / 4; - track->flags |= MPT_FLG_VOLCHG; - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->keyShiftX = pitch >> 8; - track->pitX = pitch; - track->flags |= MPT_FLG_PITCHG; - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->panX = pan; - track->flags |= MPT_FLG_VOLCHG; - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void ClearModM(struct MusicPlayerTrack *track) -{ - track->lfoSpeedC = 0; - track->modM = 0; - - if (track->modT == 0) - track->flags |= MPT_FLG_PITCHG; - else - track->flags |= MPT_FLG_VOLCHG; -} - -void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->mod = modDepth; - - if (!track->mod) - ClearModM(track); - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed) -{ - s32 i; - u32 bit; - struct MusicPlayerTrack *track; - - if (mplayInfo->ident != ID_NUMBER) - return; - - mplayInfo->ident++; - - i = mplayInfo->trackCount; - track = mplayInfo->tracks; - bit = 1; - - while (i > 0) - { - if (trackBits & bit) - { - if (track->flags & MPT_FLG_EXIST) - { - track->lfoSpeed = lfoSpeed; - - if (!track->lfoSpeed) - ClearModM(track); - } - } - - i--; - track++; - bit <<= 1; - } - - mplayInfo->ident = ID_NUMBER; -} - -#define MEMACC_COND_JUMP(cond) \ -if (cond) \ - goto cond_true; \ -else \ - goto cond_false; \ - -void ply_memacc(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 op; - u8 *addr; - u8 data; - - op = *track->cmdPtr; - track->cmdPtr++; - - addr = mplayInfo->memAccArea + *track->cmdPtr; - track->cmdPtr++; - - data = *track->cmdPtr; - track->cmdPtr++; - - switch (op) - { - case 0: - *addr = data; - return; - case 1: - *addr += data; - return; - case 2: - *addr -= data; - return; - case 3: - *addr = mplayInfo->memAccArea[data]; - return; - case 4: - *addr += mplayInfo->memAccArea[data]; - return; - case 5: - *addr -= mplayInfo->memAccArea[data]; - return; - case 6: - MEMACC_COND_JUMP(*addr == data) - return; - case 7: - MEMACC_COND_JUMP(*addr != data) - return; - case 8: - MEMACC_COND_JUMP(*addr > data) - return; - case 9: - MEMACC_COND_JUMP(*addr >= data) - return; - case 10: - MEMACC_COND_JUMP(*addr <= data) - return; - case 11: - MEMACC_COND_JUMP(*addr < data) - return; - case 12: - MEMACC_COND_JUMP(*addr == mplayInfo->memAccArea[data]) - return; - case 13: - MEMACC_COND_JUMP(*addr != mplayInfo->memAccArea[data]) - return; - case 14: - MEMACC_COND_JUMP(*addr > mplayInfo->memAccArea[data]) - return; - case 15: - MEMACC_COND_JUMP(*addr >= mplayInfo->memAccArea[data]) - return; - case 16: - MEMACC_COND_JUMP(*addr <= mplayInfo->memAccArea[data]) - return; - case 17: - MEMACC_COND_JUMP(*addr < mplayInfo->memAccArea[data]) - return; - default: - return; - } - -cond_true: - { - void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[1]); - func(mplayInfo, track); - return; - } - -cond_false: - track->cmdPtr += 4; -} - -void ply_xcmd(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 n = *track->cmdPtr; - track->cmdPtr++; - - gXcmdTable[n](mplayInfo, track); -} - -void ply_xxx(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - void (*func)(struct MusicPlayerInfo *, struct MusicPlayerTrack *) = *(&gMPlayJumpTable[0]); - func(mplayInfo, track); -} - -#define READ_XCMD_BYTE(var, n) \ -{ \ - u32 byte = track->cmdPtr[(n)]; \ - byte <<= n * 8; \ - (var) &= ~(0xFF << (n * 8)); \ - (var) |= byte; \ -} - -void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 wav; - - READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable - READ_XCMD_BYTE(wav, 1) - READ_XCMD_BYTE(wav, 2) - READ_XCMD_BYTE(wav, 3) - - track->tone.wav = (struct WaveData *)wav; - track->cmdPtr += 4; -} - -void ply_xtype(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.type = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xatta(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.attack = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xdeca(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.decay = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xsust(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.sustain = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xrele(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.release = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xiecv(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->echoVolume = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xiecl(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->echoLength = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xleng(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.length = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xswee(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - track->tone.pan_sweep = *track->cmdPtr; - track->cmdPtr++; -} - -void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 unk; - - READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable - READ_XCMD_BYTE(unk, 1) - - if (track->unk_3A < (u16)unk) - { - track->unk_3A++; - track->cmdPtr -= 2; - track->wait = 1; - } - else - { - track->unk_3A = 0; - track->cmdPtr += 2; - } -} - -void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) -{ - u32 unk; - - READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable - READ_XCMD_BYTE(unk, 1) - READ_XCMD_BYTE(unk, 2) - READ_XCMD_BYTE(unk, 3) - - track->unk_3C = unk; - track->cmdPtr += 4; -} - -void DummyFunc(void) -{ -} - -struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone) -{ - u32 maxClock = 0; - s32 maxClockIndex = 0; - s32 i; - struct MusicPlayerInfo *mplayInfo; - - for (i = 0; i < MAX_POKEMON_CRIES; i++) - { - struct MusicPlayerTrack *track = &gPokemonCryTracks[i * 2]; - - if (!track->flags && (!track->chan || track->chan->track != track)) - goto start_song; - - if (maxClock < gPokemonCryMusicPlayers[i].clock) - { - maxClock = gPokemonCryMusicPlayers[i].clock; - maxClockIndex = i; - } - } - - i = maxClockIndex; - -start_song: - mplayInfo = &gPokemonCryMusicPlayers[i]; - mplayInfo->ident++; - -#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong)) -#define CRY_OFS(field) offsetof(struct PokemonCrySong, field) - - memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong)); - - *(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone; - *(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0); - *(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1); - *(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont); - -#undef CRY_OFS -#undef CRY - - mplayInfo->ident = ID_NUMBER; - - MPlayStart(mplayInfo, (struct SongHeader *)(&gPokemonCrySongs[i])); - - return mplayInfo; -} - -void SetPokemonCryVolume(u8 val) -{ - gPokemonCrySong.volumeValue = val & 0x7F; -} - -void SetPokemonCryPanpot(s8 val) -{ - gPokemonCrySong.panValue = (val + C_V) & 0x7F; -} - -void SetPokemonCryPitch(s16 val) -{ - s16 b = val + 0x80; - u8 a = gPokemonCrySong.tuneValue2 - gPokemonCrySong.tuneValue; - gPokemonCrySong.tieKeyValue = (b >> 8) & 0x7F; - gPokemonCrySong.tuneValue = (b >> 1) & 0x7F; - gPokemonCrySong.tuneValue2 = (a + ((b >> 1) & 0x7F)) & 0x7F; -} - -void SetPokemonCryLength(u16 val) -{ - gPokemonCrySong.unkCmd0CParam = val; -} - -void SetPokemonCryRelease(u8 val) -{ - gPokemonCrySong.releaseValue = val; -} - -void SetPokemonCryProgress(u32 val) -{ - gPokemonCrySong.unkCmd0DParam = val; -} - -int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo) -{ - struct MusicPlayerTrack *track = mplayInfo->tracks; - - if (track->chan && track->chan->track == track) - return 1; - else - return 0; -} - -void SetPokemonCryChorus(s8 val) -{ - if (val) - { - gPokemonCrySong.trackCount = 2; - gPokemonCrySong.tuneValue2 = (val + gPokemonCrySong.tuneValue) & 0x7F; - } - else - { - gPokemonCrySong.trackCount = 1; - } -} - -void SetPokemonCryStereo(u32 val) -{ - struct SoundInfo *soundInfo = SOUND_INFO_PTR; - - if (val) - { - REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT - | SOUND_A_TIMER_0 | SOUND_A_RIGHT_OUTPUT - | SOUND_ALL_MIX_FULL; - soundInfo->mode &= ~1; - } - else - { - REG_SOUNDCNT_H = SOUND_B_TIMER_0 | SOUND_B_LEFT_OUTPUT | SOUND_B_RIGHT_OUTPUT - | SOUND_A_TIMER_0 | SOUND_A_LEFT_OUTPUT | SOUND_A_RIGHT_OUTPUT - | SOUND_B_MIX_HALF | SOUND_A_MIX_HALF | SOUND_CGB_MIX_FULL; - soundInfo->mode |= 1; - } -} - -void SetPokemonCryPriority(u8 val) -{ - gPokemonCrySong.priority = val; -} diff --git a/src/map_name_popup.c b/src/map_name_popup.c index c13747006..0d88815c0 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -1,6 +1,4 @@ #include "global.h" -#include "constants/region_map_sections.h" -#include "constants/weather.h" #include "bg.h" #include "event_data.h" #include "gpu_regs.h" @@ -14,6 +12,9 @@ #include "string_util.h" #include "task.h" #include "text.h" +#include "constants/layouts.h" +#include "constants/region_map_sections.h" +#include "constants/weather.h" // enums enum MapPopUp_Themes @@ -305,7 +306,7 @@ static void ShowMapNamePopUpWindow(void) if (InBattlePyramid()) { - if (gMapHeader.mapLayoutId == 0x17A) + if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP) { withoutPrefixPtr = &(mapDisplayHeader[3]); mapDisplayHeaderSource = gBattlePyramid_MapHeaderStrings[7]; diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c index 930f1f35b..fd8e74c0a 100644 --- a/src/mauville_old_man.c +++ b/src/mauville_old_man.c @@ -572,9 +572,6 @@ static void Task_BardSong(u8 taskId) struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard; u8 *str = gStringVar4 + task->tCharIndex; u16 wordLen = 0; - // Can't get it to match without hacking - u32 temp; - register s16 zero asm("r1"); while (*str != CHAR_SPACE && *str != CHAR_NEWLINE @@ -588,17 +585,22 @@ static void Task_BardSong(u8 taskId) sUnknownBardRelated = MACRO2(bard->songLyrics[task->tCurrWord]); else sUnknownBardRelated = MACRO2(bard->temporaryLyrics[task->tCurrWord]); - temp = gBardSong.length / wordLen; - zero = 0; - gBardSong.length = temp; + + gBardSong.length /= wordLen; if (gBardSong.length <= 0) gBardSong.length = 1; task->tCurrWord++; + if (task->data[2] == 0) + { task->tState = 3; + task->data[1] = 0; + } else + { task->tState = 5; - task->data[1] = zero; + task->data[1] = 0; + } } break; case 5: @@ -1180,9 +1182,9 @@ static void Task_StoryListMenu(u8 taskId) // Task_StoryListMenu break; case 1: selection = Menu_ProcessInput(); - if (selection == -2) + if (selection == MENU_NOTHING_CHOSEN) break; - if (selection == -1 || selection == GetFreeStorySlot()) + if (selection == MENU_B_PRESSED || selection == GetFreeStorySlot()) { gSpecialVar_Result = 0; } diff --git a/src/overworld.c b/src/overworld.c index a67b4b68f..8d4c24ff6 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -55,6 +55,7 @@ #include "wild_encounter.h" #include "frontier_util.h" #include "constants/abilities.h" +#include "constants/layouts.h" #include "constants/map_types.h" #include "constants/maps.h" #include "constants/region_map_sections.h" @@ -886,7 +887,7 @@ static void mli0_load_map(u32 a1) LoadCurrentMapData(); if (!(sUnknown_020322D8 & 1)) { - if (gMapHeader.mapLayoutId == 0x169) + if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_EMPTY_SQUARE) sub_81AA1D8(); else if (InTrainerHill()) sub_81D5DF8(); @@ -914,7 +915,7 @@ static void mli0_load_map(u32 a1) mapheader_run_script_with_tag_x3(); UpdateLocationHistoryForRoamer(); RoamerMoveToOtherLocationSet(); - if (gMapHeader.mapLayoutId == 0x169) + if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_EMPTY_SQUARE) InitBattlePyramidMap(0); else if (InTrainerHill()) InitTrainerHillMap(); @@ -1753,7 +1754,7 @@ void CB2_ContinueSavedGame(void) LoadSaveblockMapHeader(); ClearDiveAndHoleWarps(); trainerHillMapId = GetCurrentTrainerHillMapId(); - if (gMapHeader.mapLayoutId == 0x169) + if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_EMPTY_SQUARE) sub_81AA2F8(); else if (trainerHillMapId != 0 && trainerHillMapId != 6) sub_81D5F48(); @@ -1763,7 +1764,7 @@ void CB2_ContinueSavedGame(void) UnfreezeEventObjects(); DoTimeBasedEvents(); sub_8084788(); - if (gMapHeader.mapLayoutId == 0x169) + if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_EMPTY_SQUARE) InitBattlePyramidMap(1); else if (trainerHillMapId != 0) InitTrainerHillMap(); diff --git a/src/palette.c b/src/palette.c index deb07b066..be5143876 100644 --- a/src/palette.c +++ b/src/palette.c @@ -154,7 +154,7 @@ void ReadPlttIntoBuffers(void) bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targetY, u16 blendColor) { u8 temp; - register u32 _blendColor asm("r8") = blendColor; + u16 color = blendColor; if (gPaletteFade.active) { @@ -175,7 +175,7 @@ bool8 BeginNormalPaletteFade(u32 selectedPalettes, s8 delay, u8 startY, u8 targe gPaletteFade_delay = delay; gPaletteFade.y = startY; gPaletteFade.targetY = targetY; - gPaletteFade.blendColor = _blendColor; + gPaletteFade.blendColor = color; gPaletteFade.active = 1; gPaletteFade.mode = NORMAL_FADE; @@ -881,7 +881,7 @@ void TintPalette_SepiaTone(u16 *palette, u16 count) { s32 r, g, b, i; u32 gray; - + for (i = 0; i < count; i++) { r = (*palette >> 0) & 0x1F; diff --git a/src/party_menu.c b/src/party_menu.c index a8c98faec..15b5d24d8 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -119,6 +119,7 @@ struct Struct203CEDC u8 unkC; }; +// EWRAM vars static EWRAM_DATA struct Struct203CEC4 *gUnknown_0203CEC4 = NULL; EWRAM_DATA struct Struct203CEC8 gUnknown_0203CEC8 = {0}; static EWRAM_DATA struct Struct203CEDC *gUnknown_0203CEDC = NULL; @@ -134,7 +135,8 @@ static EWRAM_DATA u16 gUnknown_0203CEFC = 0; static EWRAM_DATA u16 gUnknown_0203CEFE = 0; // unused EWRAM_DATA u8 gUnknown_0203CF00[3] = {0}; -extern void (*gUnknown_03006328)(u8, TaskFunc); +// IWRAM common +void (*gUnknown_03006328)(u8, TaskFunc); static void reset_brm(void); static void PartyMenuInitCallback(void); @@ -2087,7 +2089,8 @@ static bool8 RenderPartyMenuBoxes(void) RenderPartyMenuBox(gUnknown_0203CEC4->data[0]); if (++gUnknown_0203CEC4->data[0] == 6) return TRUE; - return FALSE; + else + return FALSE; } static u8* GetPartyMiscGraphicsTile(u16 tileId) @@ -2130,7 +2133,8 @@ static bool8 party_menu_add_per_mon_objects(void) party_menu_add_per_mon_objects_internal(gUnknown_0203CEC4->data[0]); if (++gUnknown_0203CEC4->data[0] == 6) return TRUE; - return FALSE; + else + return FALSE; } static void sub_81B0F28(void) @@ -2202,6 +2206,7 @@ void sub_81B0FCC(u8 slot, u8 b) static u8 GetPartyBoxPalBitfield(u8 slot, u8 b) { u8 returnVar = 0; + if (b == 1) returnVar |= 1; if (GetMonData(&gPlayerParty[slot], MON_DATA_HP) == 0) @@ -2321,7 +2326,8 @@ static s8* sub_81B13EC(void) { if (gUnknown_0203CEC8.unkB == 8 || gUnknown_0203CEC8.unkB == 10) return &gUnknown_0203CEC8.unkA; - return &gUnknown_0203CEC8.unk9; + else + return &gUnknown_0203CEC8.unk9; } static void sub_81B140C(u8 taskId, s8 *ptr) @@ -2836,7 +2842,7 @@ static void sub_81B1DB8(struct Pokemon *mon, u16 item) SetMonData(mon, MON_DATA_HELD_ITEM, itemBytes); } -static u8 sub_81B1E00(struct Pokemon* mon) +static u8 TryTakeMonItem(struct Pokemon* mon) { u16 item = GetMonData(mon, MON_DATA_HELD_ITEM); @@ -4265,7 +4271,7 @@ static void CursorCb_TakeItem(u8 taskId) PlaySE(SE_SELECT); sub_81B302C(&gUnknown_0203CEC4->unkC[0]); sub_81B302C(&gUnknown_0203CEC4->unkC[1]); - switch (sub_81B1E00(mon)) + switch (TryTakeMonItem(mon)) { case 0: GetMonNickname(mon, gStringVar1); @@ -5203,7 +5209,7 @@ void sub_81B617C(void) bool8 inBattle; u8 i; u8 msgIdMaybe; - register TaskFunc task asm("r0"); + TaskFunc task; if (gMain.inBattle) { @@ -5215,6 +5221,7 @@ void sub_81B617C(void) inBattle = FALSE; doubleBattleStatus = 0; } + if (GetItemEffectType(gSpecialVar_ItemId) == 10) { gUnknown_0203CEC8.unk9 = 0; @@ -5231,9 +5238,14 @@ void sub_81B617C(void) } else { - msgIdMaybe = (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_TM_HM) ? 4 : 5; + if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_TM_HM) + msgIdMaybe = 4; + else + msgIdMaybe = 5; + task = sub_81B1370; } + InitPartyMenu(inBattle, doubleBattleStatus, 3, 1, msgIdMaybe, task, callback); } @@ -5263,9 +5275,11 @@ static bool8 IsHPRecoveryItem(u16 item) effect = gSaveBlock1Ptr->enigmaBerry.itemEffect; else effect = gItemEffectTable[item - ITEM_POTION]; + if ((effect[4] & 4) != 0) return TRUE; - return FALSE; + else + return FALSE; } static void GetMedicineItemEffectMessage(u16 item) @@ -5575,6 +5589,7 @@ void dp05_ether(u8 taskId, TaskFunc task) effect = gSaveBlock1Ptr->enigmaBerry.itemEffect; else effect = gItemEffectTable[item - ITEM_POTION]; + if ((effect[4] & 0x10) == 0) { gUnknown_0203CEC8.unkE = 0; @@ -6196,151 +6211,69 @@ void sub_81B7C74(u8 taskId, TaskFunc task) u8 GetItemEffectType(u16 item) { const u8 *itemEffect; -#ifndef NONMATCHING - register u8 itemEffect0 asm("r1"); - register u8 itemEffect3 asm("r3"); - register u32 itemEffect0_r0 asm("r0"); // u32 to prevent shifting when transferring itemEffect0 to this - u8 mask; -#else -#define itemEffect0 itemEffect[0] -#define itemEffect3 itemEffect[3] -#define mask 0x3F -#endif + u32 statusCure; if (!IS_POKEMON_ITEM(item)) - { return 22; - } + + // Read the item's effect properties. + if (item == ITEM_ENIGMA_BERRY) + itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect; else + itemEffect = gItemEffectTable[item - ITEM_POTION]; + + if ((itemEffect[0] & 0x3F) || itemEffect[1] || itemEffect[2] || (itemEffect[3] & 0x80)) + return 0; + else if (itemEffect[0] & 0x40) + return 10; + else if (itemEffect[3] & 0x40) + return 1; + + statusCure = itemEffect[3] & 0x3F; + if (statusCure || (itemEffect[0] >> 7)) { - // Read the item's effect properties. - if (item == ITEM_ENIGMA_BERRY) - { - itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect; - } + if (statusCure == 0x20) + return 4; + else if (statusCure == 0x10) + return 3; + else if (statusCure == 0x8) + return 5; + else if (statusCure == 0x4) + return 6; + else if (statusCure == 0x2) + return 7; + else if (statusCure == 0x1) + return 8; + else if (itemEffect[0] >> 7 && !statusCure) + return 9; else - { - itemEffect = gItemEffectTable[item - ITEM_POTION]; - } - -#ifndef NONMATCHING - itemEffect0 = itemEffect[0]; - mask = 0x3F; -#endif + return 11; + } - if ((itemEffect0 & mask) || itemEffect[1] || itemEffect[2]) - { - return 0; - } -#ifndef NONMATCHING - itemEffect3 = itemEffect[3]; -#endif - if (itemEffect3 & 0x80) - { - return 0; - } - else if (itemEffect0 & 0x40) - { - return 10; - } - else if (itemEffect3 & 0x40) - { - return 1; - } - else if ((itemEffect3 & mask) || (itemEffect0 >> 7)) - { - if ((itemEffect3 & mask) == 0x20) - { - return 4; - } - else if ((itemEffect3 & mask) == 0x10) - { - return 3; - } - else if ((itemEffect3 & mask) == 0x8) - { - return 5; - } - else if ((itemEffect3 & mask) == 0x4) - { - return 6; - } - else if ((itemEffect3 & mask) == 0x2) - { - return 7; - } - else if ((itemEffect3 & mask) == 0x1) - { - return 8; - } - // alternate fakematching - // itemEffect0_r0 = itemEffect0 >> 7; - // asm(""); // increase live length for greg - // if ((itemEffect0_r0 != 0) && (itemEffect3 & mask) == 0) -#ifndef NONMATCHING - else if (((itemEffect0_r0 = itemEffect0 >> 7) != 0) && (itemEffect3 & mask) == 0) -#else - else if (((itemEffect[0] >> 7) != 0) && (itemEffect[3] & 0x3F) == 0) -#endif - { - return 9; - } - else - { - return 11; - } - } - else if (itemEffect[4] & 0x44) - { - return 2; - } - else if (itemEffect[4] & 0x2) - { - return 12; - } - else if (itemEffect[4] & 0x1) - { - return 13; - } - else if (itemEffect[5] & 0x8) - { - return 14; - } - else if (itemEffect[5] & 0x4) - { - return 15; - } - else if (itemEffect[5] & 0x2) - { - return 16; - } - else if (itemEffect[5] & 0x1) - { - return 17; - } - else if (itemEffect[4] & 0x80) - { - return 18; - } - else if (itemEffect[4] & 0x20) - { - return 19; - } - else if (itemEffect[5] & 0x10) - { - return 20; - } - else if (itemEffect[4] & 0x18) - { - return 21; - } + if (itemEffect[4] & 0x44) + return 2; + else if (itemEffect[4] & 0x2) + return 12; + else if (itemEffect[4] & 0x1) + return 13; + else if (itemEffect[5] & 0x8) + return 14; + else if (itemEffect[5] & 0x4) + return 15; + else if (itemEffect[5] & 0x2) + return 16; + else if (itemEffect[5] & 0x1) + return 17; + else if (itemEffect[4] & 0x80) + return 18; + else if (itemEffect[4] & 0x20) + return 19; + else if (itemEffect[5] & 0x10) + return 20; + else if (itemEffect[4] & 0x18) + return 21; + else return 22; - } -#ifdef NONMATCHING -#undef itemEffect0 -#undef itemEffect3 -#undef mask -#endif } static void sub_81B7E4C(u8 taskId) diff --git a/src/player_pc.c b/src/player_pc.c index 474cecaf5..0d08a5e7b 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -355,11 +355,11 @@ static void PlayerPCProcessMenuInput(u8 taskId) else inputOptionId = Menu_ProcessInputNoWrap(); - switch(inputOptionId) + switch (inputOptionId) { - case -2: + case MENU_NOTHING_CHOSEN: break; - case -1: + case MENU_B_PRESSED: PlaySE(SE_SELECT); sub_8198070(data[4], FALSE); ClearWindowTilemap(data[4]); @@ -464,13 +464,13 @@ static void ItemStorageMenuProcessInput(u8 taskId) r5 = Menu_GetCursorPos(); inputOptionId = Menu_ProcessInput(); r2 = Menu_GetCursorPos(); - switch(inputOptionId) + switch (inputOptionId) { - case -2: + case MENU_NOTHING_CHOSEN: if (r5 != r2) ItemStorageMenuPrint(gPCText_OptionDescList[r2]); break; - case -1: + case MENU_B_PRESSED: PlaySE(SE_SELECT); ItemStorage_Exit(taskId); break; @@ -638,14 +638,14 @@ static void Mailbox_ProcessInput(u8 taskId) if (!gPaletteFade.active) { - inputOptionId = ListMenuHandleInputGetItemId(data[5]); + inputOptionId = ListMenu_ProcessInput(data[5]); ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); - switch(inputOptionId) + switch (inputOptionId) { - case -1: + case LIST_NOTHING_CHOSEN: break; - case -2: + case LIST_B_PRESSED: PlaySE(SE_SELECT); RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorId); Mailbox_ReturnToPlayerPC(taskId); @@ -1145,13 +1145,13 @@ static void ItemStorage_ProcessInput(u8 taskId) } else { - id = ListMenuHandleInputGetItemId(data[5]); + id = ListMenu_ProcessInput(data[5]); ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); switch(id) { - case -1: + case LIST_NOTHING_CHOSEN: break; - case -2: + case LIST_B_PRESSED: PlaySE(SE_SELECT); ItemStorage_GoBackToPlayerPCMenu(taskId); break; @@ -1218,21 +1218,23 @@ static void sub_816C4FC(u8 taskId) ItemStorage_DoItemSwap(taskId, FALSE); return; } - id = ListMenuHandleInputGetItemId(data[5]); + id = ListMenu_ProcessInput(data[5]); ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); sub_81223FC(gUnknown_0203BCC4->spriteIds, 7, 0); sub_816C690(playerPCItemPageInfo.cursorPos); switch(id) { - case -1: + case LIST_NOTHING_CHOSEN: break; - case -2: + case LIST_B_PRESSED: if (gMain.newKeys & A_BUTTON) { ItemStorage_DoItemSwap(taskId, FALSE); } else + { ItemStorage_DoItemSwap(taskId, TRUE); + } break; default: ItemStorage_DoItemSwap(taskId, FALSE); diff --git a/src/pokeblock.c b/src/pokeblock.c index 7c07f9655..3fd4f34df 100644 --- a/src/pokeblock.c +++ b/src/pokeblock.c @@ -998,7 +998,7 @@ static void Task_HandlePokeblockMenuInput(u8 taskId) else { u16 oldPosition = sSavedPokeblockData.lastItemPos; - s32 itemId = ListMenuHandleInputGetItemId(data[0]); + s32 itemId = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos); if (oldPosition != sSavedPokeblockData.lastItemPos) @@ -1044,7 +1044,7 @@ static void Task_HandlePokeblocksSwapInput(u8 taskId) { u16 i = sSavedPokeblockData.lastItemPage; u16 var = sSavedPokeblockData.lastItemPos; - s32 itemId = ListMenuHandleInputGetItemId(data[0]); + s32 itemId = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos); if (i != sSavedPokeblockData.lastItemPage || var != sSavedPokeblockData.lastItemPos) diff --git a/src/pokedex.c b/src/pokedex.c index f99a8226a..c47ada5b8 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -30,8 +30,6 @@ #include "constants/songs.h" #include "constants/species.h" -extern u8 gDexCryScreenState; - // EWRAM static EWRAM_DATA struct PokedexView *sPokedexView = NULL; static EWRAM_DATA u16 gUnknown_02039B50 = 0; diff --git a/src/pokedex_cry_screen.c b/src/pokedex_cry_screen.c index 4a9227b99..c385141d5 100755 --- a/src/pokedex_cry_screen.c +++ b/src/pokedex_cry_screen.c @@ -39,7 +39,10 @@ static void sub_8145824(u8, s16, u8); static void sub_814596C(struct Sprite *); static void sub_8145B24(s8); -extern u8 gDexCryScreenState; +// IWRAM common +u8 gDexCryScreenState; + +// EWRAM vars static EWRAM_DATA struct PokedexCryScreen *sDexCryScreen = NULL; static EWRAM_DATA u8 *sCryWaveformWindowTiledata = NULL; static EWRAM_DATA struct PokedexCryVolumeMeter *sCryVolumeMeter = NULL; diff --git a/src/pokemon.c b/src/pokemon.c index 1e07ee168..5f1664450 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -37,6 +37,7 @@ #include "constants/battle_move_effects.h" #include "constants/hold_effects.h" #include "constants/items.h" +#include "constants/layouts.h" #include "constants/moves.h" #include "constants/songs.h" #include "constants/species.h" @@ -5242,14 +5243,14 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov { gAbsentBattlerFlags &= ~gBitTable[battlerId]; CopyPlayerPartyMonToBattleData(battlerId, pokemon_order_func(gBattlerPartyIndexes[battlerId])); - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleResults.unk4 < 255) - gBattleResults.unk4++; + if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleResults.numRevivesUsed < 255) + gBattleResults.numRevivesUsed++; } else { gAbsentBattlerFlags &= ~gBitTable[gActiveBattler ^ 2]; - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleResults.unk4 < 255) - gBattleResults.unk4++; + if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleResults.numRevivesUsed < 255) + gBattleResults.numRevivesUsed++; } } } @@ -5289,8 +5290,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov gBattleMons[battlerId].hp = dataUnsigned; if (!(r10 & 0x10) && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { - if (gBattleResults.unk3 < 255) - gBattleResults.unk3++; + if (gBattleResults.numHealingItemsUsed < 255) + gBattleResults.numHealingItemsUsed++; // I have to re-use this variable to match. r5 = gActiveBattler; gActiveBattler = battlerId; @@ -5329,7 +5330,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov SetMonData(mon, MON_DATA_PP1 + r5, &dataUnsigned); if (gMain.inBattle && battlerId != 4 && !(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[battlerId].unk18_b & gBitTable[r5])) + && !(gDisableStructs[battlerId].mimickedMoves & gBitTable[r5])) gBattleMons[battlerId].pp[r5] = dataUnsigned; retVal = FALSE; } @@ -5354,7 +5355,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); if (gMain.inBattle && battlerId != 4 && !(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[battlerId].unk18_b & gBitTable[moveIndex])) + && !(gDisableStructs[battlerId].mimickedMoves & gBitTable[moveIndex])) gBattleMons[battlerId].pp[moveIndex] = dataUnsigned; retVal = FALSE; } @@ -6848,7 +6849,7 @@ void SetWildMonHeldItem(void) var1 = 20; var2 = 80; } - if (gMapHeader.mapLayoutId == 0x1A4) + if (gMapHeader.mapLayoutId == LAYOUT_ALTERING_CAVE) { s32 alteringCaveId = GetWildMonTableIdInAlteringCave(species); if (alteringCaveId != 0) diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index bcbb60e21..ecb8f4950 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -1238,7 +1238,6 @@ const u16* GetValidMonIconPalettePtr(u16 species) return gMonIconPaletteTable[gMonIconPaletteIndices[species]].data; } -// TODO: try to find a way to avoid using asm statement u8 UpdateMonIconFrame(struct Sprite *sprite) { u8 result = 0; @@ -1262,10 +1261,7 @@ u8 UpdateMonIconFrame(struct Sprite *sprite) (u8 *)sprite->images + (sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame), (u8 *)(OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP), sSpriteImageSizes[sprite->oam.shape][sprite->oam.size]); - { - register u8 duration asm("r0") = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; - sprite->animDelayCounter = duration; - } + sprite->animDelayCounter = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration & 0xFF; sprite->animCmdIndex++; result = sprite->animCmdIndex; break; diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 78fec2fc5..c0aec4ddd 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -1753,7 +1753,7 @@ static void Task_PokemonStorageSystemPC(u8 taskId) task->data[2] = Menu_ProcessInput(); switch(task->data[2]) { - case -2: + case MENU_NOTHING_CHOSEN: task->data[3] = task->data[1]; if (gMain.newKeys & DPAD_UP && --task->data[3] < 0) task->data[3] = 4; @@ -1767,7 +1767,7 @@ static void Task_PokemonStorageSystemPC(u8 taskId) AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3); } break; - case -1: + case MENU_B_PRESSED: case 4: sub_819746C(task->data[15], TRUE); ScriptContext2_Disable(); diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 14bfba4ad..d878d2c9e 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -43,10 +43,11 @@ #include "constants/items.h" #include "constants/moves.h" #include "constants/region_map_sections.h" +#include "constants/rgb.h" #include "constants/songs.h" #include "constants/species.h" -static EWRAM_DATA struct UnkSummaryStruct +static EWRAM_DATA struct PssData { /*0x00*/ union { struct Pokemon *mons; @@ -135,21 +136,21 @@ static bool8 SummaryScreen_DecompressGraphics(void); static void CopyMonToSummaryStruct(struct Pokemon* a); static bool8 ExtractMonDataToSummaryStruct(struct Pokemon* a); static void sub_81C0348(void); -static void sub_81C0484(u8 taskId); -static void sub_81C0510(u8 taskId); -static void sub_81C0604(u8 taskId, s8 a); +static void CloseSummaryScreen(u8 taskId); +static void HandleInput(u8 taskId); +static void ChangePokemon(u8 taskId, s8 a); static void sub_81C0704(u8 taskId); static s8 sub_81C08F8(s8 a); static s8 sub_81C09B4(s8 a); static bool8 sub_81C0A50(struct Pokemon* mon); -static void sub_81C0A8C(u8 taskId, s8 a); +static void ChangePage(u8 taskId, s8 a); static void sub_81C0B8C(u8 taskId); static void sub_81C0C68(u8 taskId); static void sub_81C0CC4(u8 taskId); static void sub_81C0D44(u8 taskId); static void sub_81C0E24(void); static void sub_81C0E48(u8 taskId); -static void sub_81C0F44(u8 taskId); +static void HandleInput_MoveSelect(u8 taskId); static bool8 sub_81C1040(void); static void sub_81C1070(s16* a, s8 b, u8* c); static void sub_81C11F4(u8 a); @@ -173,21 +174,21 @@ static void sub_81C20F0(u8 taskId); static void sub_81C2194(u16 *a, u16 b, u8 c); static void sub_81C2228(struct Pokemon* mon); static void DrawExperienceProgressBar(struct Pokemon* mon); -static void sub_81C240C(u16 a); +static void DrawContestMoveHearts(u16 move); static void sub_81C2524(void); -static void sub_81C2554(void); +static void ResetWindows(void); static void sub_81C25E8(void); static void sub_81C2628(void); static void sub_81C2794(void); static void sub_81C27DC(struct Pokemon *mon, u16 a); static void PrintPageNamesAndStatsPageToWindows(void); -static void sub_81C2AFC(u8 a); -static void sub_81C2C38(u8 a); +static void CreatePageWindowTilemaps(u8 a); +static void ClearPageWindowTilemaps(u8 a); static void SummaryScreen_RemoveWindowByIndex(u8 a); -static void sub_81C2D9C(u8 a); -static void sub_81C2DE4(u8 a); -static void sub_81C2E00(void); -static void sub_81C2E40(u8 taskId); +static void PrintPageSpecificText(u8 a); +static void CreateTextPrinterTask(u8 a); +static void PrintInfoPageText(void); +static void Task_PrintInfoPage(u8 taskId); static void PrintMonOTName(void); static void PrintMonOTID(void); static void PrintMonAbilityName(void); @@ -203,39 +204,39 @@ static void PrintEggOTName(void); static void PrintEggOTID(void); static void PrintEggState(void); static void PrintEggMemo(void); -static void sub_81C3554(u8 taskId); +static void Task_PrintSkillsPage(u8 taskId); static void PrintHeldItemName(void); -static void sub_81C3530(void); +static void PrintSkillsPageText(void); static void PrintRibbonCount(void); static void BufferLeftColumnStats(void); static void PrintLeftColumnStats(void); static void BufferRightColumnStats(void); static void PrintRightColumnStats(void); static void PrintExpPointsNextLevel(void); -static void sub_81C3984(void); -static void sub_81C39F0(u8 taskId); +static void PrintBattleMoves(void); +static void Task_PrintBattleMoves(u8 taskId); static void PrintMoveNameAndPP(u8 a); -static void sub_81C3D08(void); -static void sub_81C3D54(u8 taskId); +static void PrintContestMoves(void); +static void Task_PrintContestMoves(u8 taskId); static void PrintContestMoveDescription(u8 a); static void PrintMoveDetails(u16 a); static void PrintNewMoveDetailsOrCancelText(void); static void sub_81C4064(void); static void sub_81C40A0(u8 a, u8 b); static void PrintHMMovesCantBeForgotten(void); -static void sub_81C4190(void); -static void sub_81C4204(u8 a, u8 b); -static void sub_81C424C(void); -static void sub_81C4280(void); -static void sub_81C42C8(void); -static void sub_81C43A0(void); -static void sub_81C4420(void); -static void sub_81C4484(void); -static void sub_81C44F0(void); +static void ResetSpriteIds(void); +static void SetSpriteInvisibility(u8 spriteArrayId, bool8 invisible); +static void HidePageSpecificSprites(void); +static void SetTypeIcons(void); +static void CreateMoveTypeIcons(void); +static void SetMonTypeIcons(void); +static void SetMoveTypeIcons(void); +static void SetContestMoveTypeIcons(void); +static void SetNewMoveTypeIcon(void); static void sub_81C4568(u8 a, u8 b); -static u8 sub_81C45F4(struct Pokemon *a, s16 *b); +static u8 CreatePokemonSprite(struct Pokemon *a, s16 *b); static u8 sub_81C47B4(struct Pokemon *unused); -static void sub_81C4844(struct Sprite *); +static void SpriteCB_Pokemon(struct Sprite *); static void sub_81C48F0(void); static void CreateMonMarkingsSprite(struct Pokemon *mon); static void RemoveAndCreateMonMarkingsSprite(struct Pokemon *mon); @@ -626,22 +627,26 @@ static const u8 sTextColors_861CD2C[][3] = {0, 5, 6}, {0, 7, 8} }; + static const u8 gUnknown_0861CD53[] = INCBIN_U8("graphics/interface/summary_a_button.4bpp"); static const u8 gUnknown_0861CDD3[] = INCBIN_U8("graphics/interface/summary_b_button.4bpp"); -static void (*const gUnknown_0861CE54[])(void) = + +static void (*const sTextPrinterFunctions[])(void) = { - sub_81C2E00, - sub_81C3530, - sub_81C3984, - sub_81C3D08 + PrintInfoPageText, + PrintSkillsPageText, + PrintBattleMoves, + PrintContestMoves }; -static void (*const gUnknown_0861CE64[])(u8 taskId) = + +static void (*const sTextPrinterTasks[])(u8 taskId) = { - sub_81C2E40, - sub_81C3554, - sub_81C39F0, - sub_81C3D54 + Task_PrintInfoPage, + Task_PrintSkillsPage, + Task_PrintBattleMoves, + Task_PrintContestMoves }; + static const u8 gUnknown_0861CE74[] = _("{COLOR LIGHT_RED}{SHADOW GREEN}"); static const u8 gUnknown_0861CE7B[] = _("{COLOR WHITE}{SHADOW DARK_GREY}"); static const u8 gUnknown_0861CE82[] = _("{SPECIAL_F7 0x00}/{SPECIAL_F7 0x01}\n{SPECIAL_F7 0x02}\n{SPECIAL_F7 0x03}"); @@ -968,13 +973,13 @@ static const union AnimCmd *const sSpriteAnimTable_StatusCondition[] = { sSpriteAnim_StatusPokerus, sSpriteAnim_StatusFaint, }; -static const struct CompressedSpriteSheet gUnknown_0861D0F8 = +static const struct CompressedSpriteSheet sStatusIconsSpriteSheet = { .data = gStatusGfx_Icons, .size = 0x380, .tag = 30001 }; -static const struct CompressedSpritePalette gUnknown_0861D100 = +static const struct CompressedSpritePalette sStatusIconsSpritePalette = { .data = gStatusPal_Icons, .tag = 30001 @@ -1104,7 +1109,7 @@ static bool8 SummaryScreen_LoadGraphics(void) gMain.state++; break; case 7: - sub_81C2554(); + ResetWindows(); gMain.state++; break; case 8: @@ -1129,7 +1134,7 @@ static bool8 SummaryScreen_LoadGraphics(void) gMain.state++; break; case 13: - sub_81C2D9C(pssData->currPageIndex); + PrintPageSpecificText(pssData->currPageIndex); gMain.state++; break; case 14: @@ -1137,17 +1142,17 @@ static bool8 SummaryScreen_LoadGraphics(void) gMain.state++; break; case 15: - sub_81C2AFC(pssData->currPageIndex); + CreatePageWindowTilemaps(pssData->currPageIndex); gMain.state++; break; case 16: - sub_81C4190(); - sub_81C42C8(); + ResetSpriteIds(); + CreateMoveTypeIcons(); pssData->unk40F0 = 0; gMain.state++; break; case 17: - pssData->spriteIds[0] = sub_81C45F4(&pssData->currentMon, &pssData->unk40F0); + pssData->spriteIds[0] = CreatePokemonSprite(&pssData->currentMon, &pssData->unk40F0); if (pssData->spriteIds[0] != 0xFF) { pssData->unk40F0 = 0; @@ -1167,12 +1172,12 @@ static bool8 SummaryScreen_LoadGraphics(void) gMain.state++; break; case 21: - sub_81C4280(); + SetTypeIcons(); gMain.state++; break; case 22: if (pssData->mode != PSS_MODE_SELECT_MOVE) - CreateTask(sub_81C0510, 0); + CreateTask(HandleInput, 0); else CreateTask(sub_81C171C, 0); gMain.state++; @@ -1182,7 +1187,7 @@ static bool8 SummaryScreen_LoadGraphics(void) gMain.state++; break; case 24: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); gPaletteFade.bufferTransferDisabled = 0; gMain.state++; break; @@ -1259,11 +1264,11 @@ static bool8 SummaryScreen_DecompressGraphics(void) pssData->unk40F0++; break; case 9: - LoadCompressedSpriteSheet(&gUnknown_0861D0F8); + LoadCompressedSpriteSheet(&sStatusIconsSpriteSheet); pssData->unk40F0++; break; case 10: - LoadCompressedSpritePalette(&gUnknown_0861D100); + LoadCompressedSpritePalette(&sStatusIconsSpritePalette); pssData->unk40F0++; break; case 11: @@ -1374,7 +1379,7 @@ static void sub_81C0348(void) } else { - sub_81C240C(pssData->summary.moves[pssData->firstMoveIndex]); + DrawContestMoveHearts(pssData->summary.moves[pssData->firstMoveIndex]); sub_81C2194(pssData->bgTilemapBuffers[PSS_PAGE_BATTLE_MOVES][0], 3, 0); sub_81C2194(pssData->bgTilemapBuffers[PSS_PAGE_CONTEST_MOVES][0], 1, 0); SetBgTilemapBuffer(1, pssData->bgTilemapBuffers[PSS_PAGE_CONTEST_MOVES][0]); @@ -1402,13 +1407,13 @@ static void sub_81C0434(void) Free(pssData); } -static void sub_81C044C(u8 taskId) +static void BeginCloseSummaryScreen(u8 taskId) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_81C0484; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gTasks[taskId].func = CloseSummaryScreen; } -static void sub_81C0484(u8 taskId) +static void CloseSummaryScreen(u8 taskId) { if (sub_81221EC() != TRUE && !gPaletteFade.active) { @@ -1426,25 +1431,25 @@ static void sub_81C0484(u8 taskId) } } -static void sub_81C0510(u8 taskId) +static void HandleInput(u8 taskId) { if (sub_81221EC() != TRUE && !gPaletteFade.active) { if (gMain.newKeys & DPAD_UP) { - sub_81C0604(taskId, -1); + ChangePokemon(taskId, -1); } else if (gMain.newKeys & DPAD_DOWN) { - sub_81C0604(taskId, 1); + ChangePokemon(taskId, 1); } else if ((gMain.newKeys & DPAD_LEFT) || GetLRKeysState() == 1) { - sub_81C0A8C(taskId, -1); + ChangePage(taskId, -1); } else if ((gMain.newKeys & DPAD_RIGHT) || GetLRKeysState() == 2) { - sub_81C0A8C(taskId, 1); + ChangePage(taskId, 1); } else if (gMain.newKeys & A_BUTTON) { @@ -1454,7 +1459,7 @@ static void sub_81C0510(u8 taskId) { sub_81C48F0(); PlaySE(SE_SELECT); - sub_81C044C(taskId); + BeginCloseSummaryScreen(taskId); } else { @@ -1467,12 +1472,12 @@ static void sub_81C0510(u8 taskId) { sub_81C48F0(); PlaySE(SE_SELECT); - sub_81C044C(taskId); + BeginCloseSummaryScreen(taskId); } } } -static void sub_81C0604(u8 taskId, s8 a) +static void ChangePokemon(u8 taskId, s8 a) { s8 r4_2; @@ -1510,7 +1515,7 @@ static void sub_81C0604(u8 taskId, s8 a) PlaySE(SE_SELECT); if (pssData->summary.unk7 != 0) { - sub_81C4204(2, 1); + SetSpriteInvisibility(2, 1); ClearWindowTilemap(13); schedule_bg_copy_tilemap_to_vram(0); sub_81C2074(0, 2); @@ -1559,7 +1564,7 @@ static void sub_81C0704(u8 taskId) data[1] = 0; break; case 8: - pssData->spriteIds[0] = sub_81C45F4(&pssData->currentMon, &data[1]); + pssData->spriteIds[0] = CreatePokemonSprite(&pssData->currentMon, &data[1]); if (pssData->spriteIds[0] == 0xFF) return; gSprites[pssData->spriteIds[0]].data[2] = 1; @@ -1567,13 +1572,13 @@ static void sub_81C0704(u8 taskId) data[1] = 0; break; case 9: - sub_81C4280(); + SetTypeIcons(); break; case 10: sub_81C25E8(); break; case 11: - sub_81C2D9C(pssData->currPageIndex); + PrintPageSpecificText(pssData->currPageIndex); sub_81C2524(); break; case 12: @@ -1583,7 +1588,7 @@ static void sub_81C0704(u8 taskId) if (sub_81221EC() == 0 && FuncIsActiveTask(sub_81C20F0) == 0) { data[0] = 0; - gTasks[taskId].func = sub_81C0510; + gTasks[taskId].func = HandleInput; } return; } @@ -1656,7 +1661,7 @@ static bool8 sub_81C0A50(struct Pokemon* mon) return FALSE; } -static void sub_81C0A8C(u8 taskId, s8 b) +static void ChangePage(u8 taskId, s8 b) { struct PokeSummary *summary = &pssData->summary; s16 *data = gTasks[taskId].data; @@ -1669,15 +1674,15 @@ static void sub_81C0A8C(u8 taskId, s8 b) return; PlaySE(SE_SELECT); - sub_81C2C38(pssData->currPageIndex); + ClearPageWindowTilemaps(pssData->currPageIndex); pssData->currPageIndex += b; data[0] = 0; if (b == 1) SetTaskFuncWithFollowupFunc(taskId, sub_81C0B8C, gTasks[taskId].func); else SetTaskFuncWithFollowupFunc(taskId, sub_81C0CC4, gTasks[taskId].func); - sub_81C2DE4(pssData->currPageIndex); - sub_81C424C(); + CreateTextPrinterTask(pssData->currPageIndex); + HidePageSpecificSprites(); } static void sub_81C0B8C(u8 taskId) @@ -1717,8 +1722,8 @@ static void sub_81C0C68(u8 taskId) data[1] = 0; data[0] = 0; sub_81C1BA0(); - sub_81C2AFC(pssData->currPageIndex); - sub_81C4280(); + CreatePageWindowTilemaps(pssData->currPageIndex); + SetTypeIcons(); sub_81C0E24(); SwitchTaskToFollowupFunc(taskId); } @@ -1766,8 +1771,8 @@ static void sub_81C0D44(u8 taskId) data[1] = 0; data[0] = 0; sub_81C1BA0(); - sub_81C2AFC(pssData->currPageIndex); - sub_81C4280(); + CreatePageWindowTilemaps(pssData->currPageIndex); + SetTypeIcons(); sub_81C0E24(); SwitchTaskToFollowupFunc(taskId); } @@ -1797,15 +1802,15 @@ static void sub_81C0E48(u8 taskId) sub_81C2194(pssData->bgTilemapBuffers[PSS_PAGE_CONTEST_MOVES][0], 1, 0); PrintMoveDetails(move); PrintNewMoveDetailsOrCancelText(); - sub_81C44F0(); + SetNewMoveTypeIcon(); schedule_bg_copy_tilemap_to_vram(0); schedule_bg_copy_tilemap_to_vram(1); schedule_bg_copy_tilemap_to_vram(2); sub_81C4AF8(8); - gTasks[taskId].func = sub_81C0F44; + gTasks[taskId].func = HandleInput_MoveSelect; } -static void sub_81C0F44(u8 taskId) +static void HandleInput_MoveSelect(u8 taskId) { u8 id = taskId; s16 *data = gTasks[taskId].data; @@ -1883,7 +1888,7 @@ static void sub_81C1070(s16 *a, s8 b, u8 *c) if (move != 0) break; } - sub_81C240C(move); + DrawContestMoveHearts(move); schedule_bg_copy_tilemap_to_vram(1); schedule_bg_copy_tilemap_to_vram(2); PrintMoveDetails(move); @@ -1930,7 +1935,7 @@ static void sub_81C11F4(u8 taskId) schedule_bg_copy_tilemap_to_vram(0); schedule_bg_copy_tilemap_to_vram(1); schedule_bg_copy_tilemap_to_vram(2); - gTasks[taskId].func = sub_81C0510; + gTasks[taskId].func = HandleInput; } static void sub_81C129C(u8 taskId) @@ -2003,10 +2008,10 @@ static void sub_81C13B0(u8 taskId, bool8 b) move = pssData->summary.moves[pssData->firstMoveIndex]; PrintMoveDetails(move); - sub_81C240C(move); + DrawContestMoveHearts(move); schedule_bg_copy_tilemap_to_vram(1); schedule_bg_copy_tilemap_to_vram(2); - gTasks[taskId].func = sub_81C0F44; + gTasks[taskId].func = HandleInput_MoveSelect; } static void SwapMonMoves(struct Pokemon *mon, u8 moveIndex1, u8 moveIndex2) @@ -2081,7 +2086,7 @@ static void SwapBoxMonMoves(struct BoxPokemon *mon, u8 moveIndex1, u8 moveIndex2 static void sub_81C171C(u8 taskId) { - sub_81C44F0(); + SetNewMoveTypeIcon(); sub_81C4AF8(8); gTasks[taskId].func = sub_81C174C; } @@ -2106,11 +2111,11 @@ static void sub_81C174C(u8 taskId) } else if (gMain.newKeys & DPAD_LEFT || GetLRKeysState() == 1) { - sub_81C0A8C(taskId, -1); + ChangePage(taskId, -1); } else if (gMain.newKeys & DPAD_RIGHT || GetLRKeysState() == 2) { - sub_81C0A8C(taskId, 1); + ChangePage(taskId, 1); } else if (gMain.newKeys & A_BUTTON) { @@ -2120,7 +2125,7 @@ static void sub_81C174C(u8 taskId) PlaySE(SE_SELECT); gUnknown_0203CF21 = pssData->firstMoveIndex; gSpecialVar_0x8005 = gUnknown_0203CF21; - sub_81C044C(taskId); + BeginCloseSummaryScreen(taskId); } else { @@ -2135,7 +2140,7 @@ static void sub_81C174C(u8 taskId) PlaySE(SE_SELECT); gUnknown_0203CF21 = 4; gSpecialVar_0x8005 = 4; - sub_81C044C(taskId); + BeginCloseSummaryScreen(taskId); } } } @@ -2191,7 +2196,7 @@ static void sub_81C1940(u8 taskId) ClearWindowTilemap(13); move = pssData->summary.moves[pssData->firstMoveIndex]; gTasks[taskId].func = sub_81C174C; - sub_81C0A8C(taskId, -1); + ChangePage(taskId, -1); sub_81C1DA4(9, -2); sub_81C1EFC(9, -2, move); } @@ -2205,7 +2210,7 @@ static void sub_81C1940(u8 taskId) ClearWindowTilemap(13); move = pssData->summary.moves[pssData->firstMoveIndex]; gTasks[taskId].func = sub_81C174C; - sub_81C0A8C(taskId, 1); + ChangePage(taskId, 1); sub_81C1DA4(9, -2); sub_81C1EFC(9, -2, move); } @@ -2415,7 +2420,7 @@ static void sub_81C1F80(u8 taskId) { if (pssData->currPageIndex == 3 && FuncIsActiveTask(sub_81C0B8C) == 0) PutWindowTilemap(15); - sub_81C240C(data[2]); + DrawContestMoveHearts(data[2]); } else { @@ -2566,7 +2571,7 @@ static void DrawExperienceProgressBar(struct Pokemon *unused) schedule_bg_copy_tilemap_to_vram(2); } -static void sub_81C240C(u16 move) +static void DrawContestMoveHearts(u16 move) { u16 *tilemap = pssData->bgTilemapBuffers[PSS_PAGE_CONTEST_MOVES][1]; u8 i; @@ -2618,7 +2623,7 @@ static void sub_81C2524(void) ChangeBgX(3, 0, 0); } -static void sub_81C2554(void) +static void ResetWindows(void) { u8 i; InitWindows(gUnknown_0861CC24); @@ -2628,7 +2633,7 @@ static void sub_81C2554(void) { FillWindowPixelBuffer(i, 0); } - for (i = 0; i < 8; i++) + for (i = 0; i < ARRAY_COUNT(pssData->windowIds); i++) { pssData->windowIds[i] = 0xFF; } @@ -2782,7 +2787,7 @@ static void PrintPageNamesAndStatsPageToWindows(void) SummaryScreen_PrintTextOnWindow(15, gText_Jam, 0, 17, 0, 1); } -static void sub_81C2AFC(u8 a) +static void CreatePageWindowTilemaps(u8 page) { u8 i; @@ -2791,22 +2796,22 @@ static void sub_81C2AFC(u8 a) ClearWindowTilemap(2); ClearWindowTilemap(3); - switch (a) + switch (page) { - case 0: + case PSS_PAGE_INFO: PutWindowTilemap(0); PutWindowTilemap(4); if (sub_81A6BF4() == TRUE || sub_81B9E94() == TRUE) PutWindowTilemap(8); PutWindowTilemap(9); break; - case 1: + case PSS_PAGE_SKILLS: PutWindowTilemap(1); PutWindowTilemap(10); PutWindowTilemap(11); PutWindowTilemap(12); break; - case 2: + case PSS_PAGE_BATTLE_MOVES: PutWindowTilemap(2); if (pssData->mode == PSS_MODE_SELECT_MOVE) { @@ -2818,7 +2823,7 @@ static void sub_81C2AFC(u8 a) PutWindowTilemap(5); } break; - case 3: + case PSS_PAGE_CONTEST_MOVES: PutWindowTilemap(3); if (pssData->mode == PSS_MODE_SELECT_MOVE) { @@ -2832,7 +2837,7 @@ static void sub_81C2AFC(u8 a) break; } - for (i = 0; i < 8; i++) + for (i = 0; i < ARRAY_COUNT(pssData->windowIds); i++) { PutWindowTilemap(pssData->windowIds[i]); } @@ -2840,23 +2845,23 @@ static void sub_81C2AFC(u8 a) schedule_bg_copy_tilemap_to_vram(0); } -static void sub_81C2C38(u8 a) +static void ClearPageWindowTilemaps(u8 page) { u8 i; - switch (a) + switch (page) { - case 0: + case PSS_PAGE_INFO: ClearWindowTilemap(4); if (sub_81A6BF4() == TRUE || sub_81B9E94() == TRUE) ClearWindowTilemap(8); ClearWindowTilemap(9); break; - case 1: + case PSS_PAGE_SKILLS: ClearWindowTilemap(10); ClearWindowTilemap(11); ClearWindowTilemap(12); break; - case 2: + case PSS_PAGE_BATTLE_MOVES: if (pssData->mode == PSS_MODE_SELECT_MOVE) { if (pssData->newMove != MOVE_NONE || pssData->firstMoveIndex != MAX_MON_MOVES) @@ -2867,7 +2872,7 @@ static void sub_81C2C38(u8 a) ClearWindowTilemap(5); } break; - case 3: + case PSS_PAGE_CONTEST_MOVES: if (pssData->mode == PSS_MODE_SELECT_MOVE) { if (pssData->newMove != MOVE_NONE || pssData->firstMoveIndex != MAX_MON_MOVES) @@ -2880,7 +2885,7 @@ static void sub_81C2C38(u8 a) break; } - for (i = 0; i < 8; i++) + for (i = 0; i < ARRAY_COUNT(pssData->windowIds); i++) { SummaryScreen_RemoveWindowByIndex(i); } @@ -2910,23 +2915,23 @@ static void SummaryScreen_RemoveWindowByIndex(u8 windowIndex) } } -static void sub_81C2D9C(u8 pageIndex) +static void PrintPageSpecificText(u8 pageIndex) { u16 i; - for (i = 0; i < 8; i++) + for (i = 0; i < ARRAY_COUNT(pssData->windowIds); i++) { if (pssData->windowIds[i] != 0xFF) FillWindowPixelBuffer(pssData->windowIds[i], 0); } - gUnknown_0861CE54[pageIndex](); + sTextPrinterFunctions[pageIndex](); } -static void sub_81C2DE4(u8 pageIndex) +static void CreateTextPrinterTask(u8 pageIndex) { - CreateTask(gUnknown_0861CE64[pageIndex], 16); + CreateTask(sTextPrinterTasks[pageIndex], 16); } -static void sub_81C2E00(void) +static void PrintInfoPageText(void) { if (pssData->summary.isEgg) { @@ -2946,7 +2951,7 @@ static void sub_81C2E00(void) } } -static void sub_81C2E40(u8 taskId) +static void Task_PrintInfoPage(u8 taskId) { s16 *data = gTasks[taskId].data; switch (data[0]) @@ -3074,7 +3079,7 @@ static void PrintMonTrainerMemo(void) static void BufferNatureString(void) { - struct UnkSummaryStruct *sumStruct = pssData; + struct PssData *sumStruct = pssData; DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gNatureNamePointers[sumStruct->summary.nature]); DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, gText_EmptyString5); } @@ -3200,7 +3205,7 @@ static void PrintEggMemo(void) SummaryScreen_PrintTextOnWindow(AddWindowFromTemplateList(gUnknown_0861CCCC, 3), text, 0, 1, 0, 0); } -static void sub_81C3530(void) +static void PrintSkillsPageText(void) { PrintHeldItemName(); PrintRibbonCount(); @@ -3211,7 +3216,7 @@ static void sub_81C3530(void) PrintExpPointsNextLevel(); } -static void sub_81C3554(u8 taskId) +static void Task_PrintSkillsPage(u8 taskId) { s16 *data = gTasks[taskId].data; @@ -3357,7 +3362,7 @@ static void PrintExpPointsNextLevel(void) SummaryScreen_PrintTextOnWindow(windowId, gStringVar1, offset, 17, 0, 0); } -static void sub_81C3984(void) +static void PrintBattleMoves(void) { PrintMoveNameAndPP(0); PrintMoveNameAndPP(1); @@ -3379,7 +3384,7 @@ static void sub_81C3984(void) } } -static void sub_81C39F0(u8 taskId) +static void Task_PrintBattleMoves(u8 taskId) { s16 *data = gTasks[taskId].data; @@ -3430,7 +3435,7 @@ static void PrintMoveNameAndPP(u8 moveIndex) u32 ppState; const u8 *text; u32 offset; - struct UnkSummaryStruct *summaryStruct = pssData; + struct PssData *summaryStruct = pssData; u8 moveNameWindowId = AddWindowFromTemplateList(gUnknown_0861CD14, 0); u8 ppValueWindowId = AddWindowFromTemplateList(gUnknown_0861CD14, 1); u16 move = summaryStruct->summary.moves[moveIndex]; @@ -3493,7 +3498,7 @@ static void PrintMovePowerAndAccuracy(u16 moveIndex) } } -static void sub_81C3D08(void) +static void PrintContestMoves(void) { PrintMoveNameAndPP(0); PrintMoveNameAndPP(1); @@ -3507,7 +3512,7 @@ static void sub_81C3D08(void) } } -static void sub_81C3D54(u8 taskId) +static void Task_PrintContestMoves(u8 taskId) { s16 *data = gTasks[taskId].data; s16 dataa = data[0] - 1; @@ -3641,11 +3646,11 @@ static void PrintHMMovesCantBeForgotten(void) SummaryScreen_PrintTextOnWindow(windowId, gText_HMMovesCantBeForgotten2, 6, 1, 0, 0); } -static void sub_81C4190(void) +static void ResetSpriteIds(void) { u8 i; - for (i = 0; i < 28; i++) + for (i = 0; i < ARRAY_COUNT(pssData->spriteIds); i++) { pssData->spriteIds[i] = 0xFF; } @@ -3660,41 +3665,42 @@ static void DestroySpriteInArray(u8 spriteArrayId) } } -static void sub_81C4204(u8 spriteArrayId, bool8 invisible) +static void SetSpriteInvisibility(u8 spriteArrayId, bool8 invisible) { gSprites[pssData->spriteIds[spriteArrayId]].invisible = invisible; } -static void sub_81C424C(void) +static void HidePageSpecificSprites(void) { +// Keeps Pokémon, caught ball and status sprites visible. u8 i; - for (i = 3; i < 28; i++) + for (i = 3; i < ARRAY_COUNT(pssData->spriteIds); i++) { if (pssData->spriteIds[i] != 0xFF) - sub_81C4204(i, TRUE); + SetSpriteInvisibility(i, TRUE); } } -static void sub_81C4280(void) +static void SetTypeIcons(void) { switch (pssData->currPageIndex) { - case 0: - sub_81C43A0(); + case PSS_PAGE_INFO: + SetMonTypeIcons(); break; - case 2: - sub_81C4420(); - sub_81C44F0(); + case PSS_PAGE_BATTLE_MOVES: + SetMoveTypeIcons(); + SetNewMoveTypeIcon(); break; - case 3: - sub_81C4484(); - sub_81C44F0(); + case PSS_PAGE_CONTEST_MOVES: + SetContestMoveTypeIcons(); + SetNewMoveTypeIcon(); break; } } -static void sub_81C42C8(void) +static void CreateMoveTypeIcons(void) { u8 i; @@ -3703,7 +3709,7 @@ static void sub_81C42C8(void) if (pssData->spriteIds[i] == 0xFF) pssData->spriteIds[i] = CreateSprite(&sSpriteTemplate_MoveTypes, 0, 0, 2); - sub_81C4204(i, TRUE); + SetSpriteInvisibility(i, TRUE); } } @@ -3714,16 +3720,16 @@ static void SetMoveTypeSpritePosAndType(u8 typeId, u8 x, u8 y, u8 spriteArrayId) sprite->oam.paletteNum = sMoveTypeToOamPaletteNum[typeId]; sprite->pos1.x = x + 16; sprite->pos1.y = y + 8; - sub_81C4204(spriteArrayId, FALSE); + SetSpriteInvisibility(spriteArrayId, FALSE); } -static void sub_81C43A0(void) +static void SetMonTypeIcons(void) { struct PokeSummary *summary = &pssData->summary; if (summary->isEgg) { SetMoveTypeSpritePosAndType(TYPE_MYSTERY, 120, 48, 3); - sub_81C4204(4, TRUE); + SetSpriteInvisibility(4, TRUE); } else { @@ -3731,16 +3737,16 @@ static void sub_81C43A0(void) if (gBaseStats[summary->species].type1 != gBaseStats[summary->species].type2) { SetMoveTypeSpritePosAndType(gBaseStats[summary->species].type2, 0xA0, 0x30, 4); - sub_81C4204(4, FALSE); + SetSpriteInvisibility(4, FALSE); } else { - sub_81C4204(4, TRUE); + SetSpriteInvisibility(4, TRUE); } } } -static void sub_81C4420(void) +static void SetMoveTypeIcons(void) { u8 i; struct PokeSummary *summary = &pssData->summary; @@ -3749,11 +3755,11 @@ static void sub_81C4420(void) if (summary->moves[i] != MOVE_NONE) SetMoveTypeSpritePosAndType(gBattleMoves[summary->moves[i]].type, 0x55, 0x20 + (i * 0x10), i + 3); else - sub_81C4204(i + 3, TRUE); + SetSpriteInvisibility(i + 3, TRUE); } } -static void sub_81C4484(void) +static void SetContestMoveTypeIcons(void) { u8 i; struct PokeSummary *summary = &pssData->summary; @@ -3762,15 +3768,15 @@ static void sub_81C4484(void) if (summary->moves[i] != MOVE_NONE) SetMoveTypeSpritePosAndType(NUMBER_OF_MON_TYPES + gContestMoves[summary->moves[i]].contestCategory, 0x55, 0x20 + (i * 0x10), i + 3); else - sub_81C4204(i + 3, TRUE); + SetSpriteInvisibility(i + 3, TRUE); } } -static void sub_81C44F0(void) +static void SetNewMoveTypeIcon(void) { if (pssData->newMove == MOVE_NONE) { - sub_81C4204(7, TRUE); + SetSpriteInvisibility(7, TRUE); } else { @@ -3800,7 +3806,7 @@ static void sub_81C4568(u8 a0, u8 a1) sprite2->animEnded = FALSE; } -static u8 sub_81C45F4(struct Pokemon *mon, s16 *a1) +static u8 CreatePokemonSprite(struct Pokemon *mon, s16 *a1) { const struct CompressedSpritePalette *pal; struct PokeSummary *summary = &pssData->summary; @@ -3847,17 +3853,17 @@ static u8 sub_81C45F4(struct Pokemon *mon, s16 *a1) } } (*a1)++; - return -1; + return 0xFF; case 1: pal = GetMonSpritePalStructFromOtIdPersonality(summary->species2, summary->OTID, summary->pid); LoadCompressedSpritePalette(pal); SetMultiuseSpriteTemplateToPokemon(pal->tag, 1); (*a1)++; - return -1; + return 0xFF; } } -static void sub_81C4778(void) +static void PlayMonCry(void) { struct PokeSummary *summary = &pssData->summary; if (!summary->isEgg) @@ -3883,7 +3889,7 @@ static u8 sub_81C47B4(struct Pokemon *unused) sprite->data[0] = summary->species2; sprite->data[2] = 0; - gSprites[spriteId].callback = sub_81C4844; + gSprites[spriteId].callback = SpriteCB_Pokemon; sprite->oam.priority = 0; if (!IsMonSpriteNotFlipped(summary->species2)) @@ -3898,14 +3904,14 @@ static u8 sub_81C47B4(struct Pokemon *unused) return spriteId; } -static void sub_81C4844(struct Sprite *sprite) +static void SpriteCB_Pokemon(struct Sprite *sprite) { struct PokeSummary *summary = &pssData->summary; if (!gPaletteFade.active && sprite->data[2] != 1) { sprite->data[1] = IsMonSpriteNotFlipped(sprite->data[0]); - sub_81C4778(); + PlayMonCry(); PokemonSummaryDoMonAnimation(sprite, sprite->data[0], summary->isEgg); } } @@ -4000,11 +4006,11 @@ static void CreateSetStatusSprite(void) if (anim != 0) { StartSpriteAnim(&gSprites[*spriteId], anim - 1); - sub_81C4204(2, FALSE); + SetSpriteInvisibility(2, FALSE); } else { - sub_81C4204(2, TRUE); + SetSpriteInvisibility(2, TRUE); } } diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 0dae76f02..c11dc55e7 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -782,7 +782,7 @@ void sub_818603C(u8 arg0) movePp.moves[j] = gBattleMons[battlerId].moves[array1[j]]; movePp.pp[j] = gBattleMons[battlerId].pp[array1[j]]; array3[j] = ppBonuses[array1[j]]; - array2[j] = (gDisableStructs[battlerId].unk18_b & gBitTable[j]) >> j; + array2[j] = (gDisableStructs[battlerId].mimickedMoves & gBitTable[j]) >> j; } for (j = 0; j < MAX_MON_MOVES; j++) { @@ -790,11 +790,11 @@ void sub_818603C(u8 arg0) gBattleMons[battlerId].pp[j] = movePp.pp[j]; } gBattleMons[battlerId].ppBonuses = 0; - gDisableStructs[battlerId].unk18_b = 0; + gDisableStructs[battlerId].mimickedMoves = 0; for (j = 0; j < MAX_MON_MOVES; j++) { gBattleMons[battlerId].ppBonuses |= (array3[j]) << (j << 1); - gDisableStructs[battlerId].unk18_b |= (array2[j]) << (j); + gDisableStructs[battlerId].mimickedMoves |= (array2[j]) << (j); } if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED)) diff --git a/src/rom_8011DC0.c b/src/rom_8011DC0.c index 41f7eeee7..9bdd86167 100644 --- a/src/rom_8011DC0.c +++ b/src/rom_8011DC0.c @@ -189,8 +189,6 @@ extern u16 gUnknown_02022C3C; extern u8 gUnknown_02022C20[]; extern u8 gFieldLinkPlayerCount; extern u8 gUnknown_03005DB4; -extern struct MailStruct gUnknown_020321C0[PARTY_SIZE]; -extern u8 gUnknown_02032298[2]; // IWRAM vars IWRAM_DATA struct UnkStruct_Leader *gUnknown_03000DA0; @@ -1105,7 +1103,7 @@ void sub_80134E8(u8 taskId) RedrawListMenu(data->listTaskId); break; case 0: - id = ListMenuHandleInputGetItemId(data->listTaskId); + id = ListMenu_ProcessInput(data->listTaskId); if (gMain.newKeys & A_BUTTON && id != -1) { // this unused variable along with the assignment is needed to match @@ -2176,7 +2174,7 @@ void sub_8014F48(u8 taskId) RedrawListMenu(data->listTaskId); break; case 0: - id = ListMenuHandleInputGetItemId(data->listTaskId); + id = ListMenu_ProcessInput(data->listTaskId); if (gMain.newKeys & A_BUTTON && id != -1) { // this unused variable along with the assignment is needed to match @@ -2340,7 +2338,7 @@ void sub_80152F4(u8 taskId) break; case 0: if (data->field_13 != 0) - id = ListMenuHandleInputGetItemId(data->listTaskId); + id = ListMenu_ProcessInput(data->listTaskId); if (data->field_14 > 120) { if (data->field_0->arr[0].field_1A_0 == 1 && !data->field_0->arr[0].unk.field_0.unk_0a_7) diff --git a/src/script_menu.c b/src/script_menu.c index a4f4c6086..7180bfc60 100644 --- a/src/script_menu.c +++ b/src/script_menu.c @@ -1170,9 +1170,9 @@ static void Task_HandleMultichoiceInput(u8 taskId) sub_80E2A94(tMultichoiceId); } - if (selection != -2) + if (selection != MENU_NOTHING_CHOSEN) { - if (selection == -1) + if (selection == MENU_B_PRESSED) { if (tIgnoreBPress) return; diff --git a/src/secret_base.c b/src/secret_base.c index de5fae077..adcab9cbc 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -953,13 +953,13 @@ void sub_80E9E90(u8 taskId) s32 input; data = gTasks[taskId].data; - input = ListMenuHandleInputGetItemId(data[5]); + input = ListMenu_ProcessInput(data[5]); ListMenuGetScrollAndRow(data[5], &data[2], &data[1]); switch (input) { - case -1: + case LIST_NOTHING_CHOSEN: break; - case -2: + case LIST_B_PRESSED: PlaySE(SE_SELECT); DestroyListMenuTask(data[5], NULL, NULL); RemoveScrollIndicatorArrowPair(data[8]); @@ -1002,11 +1002,11 @@ void sub_80E9FB0(u8 taskId) input = Menu_ProcessInputNoWrap(); switch (input) { - case -1: + case MENU_B_PRESSED: PlaySE(SE_SELECT); sub_80EA18C(taskId); break; - case -2: + case MENU_NOTHING_CHOSEN: break; default: PlaySE(SE_SELECT); diff --git a/src/shop.c b/src/shop.c index c44cbca12..8eefd5e97 100755 --- a/src/shop.c +++ b/src/shop.c @@ -328,9 +328,9 @@ static void Task_ShopMenu(u8 taskId) s8 inputCode = Menu_ProcessInputNoWrap(); switch (inputCode) { - case LIST_B_PRESSED: + case MENU_NOTHING_CHOSEN: break; - case LIST_NOTHING_CHOSEN: + case MENU_B_PRESSED: PlaySE(SE_SELECT); Task_HandleShopMenuQuit(taskId); break; @@ -911,7 +911,7 @@ static void Task_BuyMenu(u8 taskId) if (!gPaletteFade.active) { - s32 itemId = ListMenuHandleInputGetItemId(tListTaskId); + s32 itemId = ListMenu_ProcessInput(tListTaskId); ListMenuGetScrollAndRow(tListTaskId, &gShopDataPtr->scrollOffset, &gShopDataPtr->selectedRow); switch (itemId) diff --git a/src/sound.c b/src/sound.c index c63183bdc..ebb4fad75 100644 --- a/src/sound.c +++ b/src/sound.c @@ -34,13 +34,33 @@ extern struct MusicPlayerInfo gMPlayInfo_SE2; extern struct MusicPlayerInfo gMPlayInfo_SE3; extern struct ToneData gCryTable[]; extern struct ToneData gCryTable2[]; -extern const struct Fanfare sFanfares[]; static void Task_Fanfare(u8 taskId); static void CreateFanfareTask(void); static void Task_DuckBGMForPokemonCry(u8 taskId); static void RestoreBGMVolumeAfterPokemonCry(void); +static const struct Fanfare sFanfares[] = { + { MUS_FANFA1, 80 }, + { MUS_FANFA4, 160 }, + { MUS_FANFA5, 220 }, + { MUS_ME_WAZA, 220 }, + { MUS_ME_ASA, 160 }, + { MUS_ME_BACHI, 340 }, + { MUS_ME_WASURE, 180 }, + { MUS_ME_KINOMI, 120 }, + { MUS_ME_TAMA, 710 }, + { MUS_ME_B_BIG, 250 }, + { MUS_ME_B_SMALL, 150 }, + { MUS_ME_ZANNEN, 160 }, + { MUS_RG_POKEFUE, 450 }, + { MUS_RG_FAN5, 170 }, + { MUS_RG_FAN2, 196 }, + { MUS_ME_POINTGET, 313 }, + { MUS_ME_SYMBOLGET, 318 }, + { MUS_ME_TORE_EYE, 135 }, +}; + #define CRY_VOLUME 120 // was 125 in R/S void InitMapMusic(void) diff --git a/src/trader.c b/src/trader.c index e23efb4ce..b5c159fb9 100644 --- a/src/trader.c +++ b/src/trader.c @@ -113,9 +113,9 @@ void Task_HandleGetDecorationMenuInput(u8 taskId) switch (input) { - case -2: + case MENU_NOTHING_CHOSEN: break; - case -1: + case MENU_B_PRESSED: case 4: PlaySE(SE_SELECT); sub_8133BE4(taskId, 0); diff --git a/src/trainer_card.c b/src/trainer_card.c index b7bd5cc1d..49a62284f 100755 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -93,6 +93,7 @@ struct TrainerCardData extern u8 sub_80D30A0(u16); // EWRAM +EWRAM_DATA struct TrainerCard gTrainerCards[4] = {0}; EWRAM_DATA static struct TrainerCardData *sData = NULL; //this file's functions diff --git a/src/trainer_hill.c b/src/trainer_hill.c index e0a236286..309ffdb1d 100644 --- a/src/trainer_hill.c +++ b/src/trainer_hill.c @@ -24,6 +24,7 @@ #include "constants/event_object_movement_constants.h" #include "constants/event_objects.h" #include "constants/items.h" +#include "constants/layouts.h" #include "constants/moves.h" #include "constants/maps.h" #include "constants/species.h" @@ -324,7 +325,7 @@ void ResetTrainerHillResults(void) static u8 GetFloorId(void) { - return gMapHeader.mapLayoutId - 159; + return gMapHeader.mapLayoutId - LAYOUT_TRAINER_HILL_1F; } u8 GetTrainerHillOpponentClass(u16 trainerId) @@ -385,7 +386,7 @@ static void SetUpDataStruct(void) if (sHillData == NULL) { sHillData = AllocZeroed(sizeof(*sHillData)); - sHillData->floorId = gMapHeader.mapLayoutId - 159; + sHillData->floorId = gMapHeader.mapLayoutId - LAYOUT_TRAINER_HILL_1F; CpuCopy32(sDataPerTag[gSaveBlock1Ptr->trainerHill.tag], &sHillData->tag, sizeof(sHillData->tag)); nullsub_2(); } @@ -803,10 +804,10 @@ bool32 InTrainerHill(void) { bool32 ret; - if (gMapHeader.mapLayoutId == 0x19F - || gMapHeader.mapLayoutId == 0x1A0 - || gMapHeader.mapLayoutId == 0x1A1 - || gMapHeader.mapLayoutId == 0x1A2) + if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_HILL_1F + || gMapHeader.mapLayoutId == LAYOUT_TRAINER_HILL_2F + || gMapHeader.mapLayoutId == LAYOUT_TRAINER_HILL_3F + || gMapHeader.mapLayoutId == LAYOUT_TRAINER_HILL_4F) ret = TRUE; else ret = FALSE; @@ -818,17 +819,17 @@ u8 GetCurrentTrainerHillMapId(void) { u8 ret; - if (gMapHeader.mapLayoutId == 0x19F) + if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_HILL_1F) ret = 1; - else if (gMapHeader.mapLayoutId == 0x1A0) + else if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_HILL_2F) ret = 2; - else if (gMapHeader.mapLayoutId == 0x1A1) + else if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_HILL_3F) ret = 3; - else if (gMapHeader.mapLayoutId == 0x1A2) + else if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_HILL_4F) ret = 4; - else if (gMapHeader.mapLayoutId == 0x1A3) + else if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_HILL_ROOF) ret = 5; - else if (gMapHeader.mapLayoutId == 0x19E) + else if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_HILL_ENTRANCE) ret = 6; else ret = 0; @@ -840,7 +841,7 @@ static bool32 sub_81D6100(void) { bool32 ret; - if (gMapHeader.mapLayoutId == 0x1A3) + if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_HILL_ROOF) ret = TRUE; else ret = FALSE; diff --git a/src/trainer_see.c b/src/trainer_see.c index 3846eca46..bc5d9cbc3 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -1,5 +1,4 @@ #include "global.h" -#include "constants/battle_setup.h" #include "battle_setup.h" #include "event_data.h" #include "event_object_movement.h" @@ -14,6 +13,8 @@ #include "trainer_hill.h" #include "util.h" #include "battle_pyramid.h" +#include "constants/battle_setup.h" +#include "constants/event_object_movement_constants.h" #include "constants/field_effects.h" extern void sub_809BE48(u16 npcId); @@ -33,17 +34,17 @@ static u8 GetTrainerApproachDistanceWest(struct EventObject *trainerObj, s16 ran static u8 GetTrainerApproachDistanceEast(struct EventObject *trainerObj, s16 range, s16 x, s16 y); static bool8 sub_80B4178(u8 taskId, struct Task *task, struct EventObject *trainerObj); -static bool8 sub_80B417C(u8 taskId, struct Task *task, struct EventObject *trainerObj); -static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct EventObject *trainerObj); -static bool8 sub_80B4200(u8 taskId, struct Task *task, struct EventObject *trainerObj); -static bool8 sub_80B425C(u8 taskId, struct Task *task, struct EventObject *trainerObj); -static bool8 sub_80B4318(u8 taskId, struct Task *task, struct EventObject *trainerObj); -static bool8 sub_80B435C(u8 taskId, struct Task *task, struct EventObject *trainerObj); -static bool8 sub_80B4390(u8 taskId, struct Task *task, struct EventObject *trainerObj); -static bool8 sub_80B43AC(u8 taskId, struct Task *task, struct EventObject *trainerObj); -static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct EventObject *trainerObj); -static bool8 sub_80B4438(u8 taskId, struct Task *task, struct EventObject *trainerObj); -static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 TrainerExclamationMark(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 WaitTrainerExclamationMark(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 TrainerMoveToPlayer(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 PlayerFaceApproachingTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 WaitPlayerFaceApproachingTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 RevealDisguisedTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 WaitRevealDisguisedTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 RevealHiddenTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 PopOutOfAshHiddenTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 JumpInPlaceHiddenTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 WaitRevealHiddenTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj); static void SpriteCB_TrainerIcons(struct Sprite *sprite); @@ -73,25 +74,25 @@ static u8 (*const sDirectionalApproachDistanceFuncs[])(struct EventObject *train static bool8 (*const sTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct EventObject *trainerObj) = { sub_80B4178, - sub_80B417C, - sub_80B41C0, - sub_80B4200, - sub_80B425C, - sub_80B4318, - sub_80B435C, - sub_80B4390, - sub_80B43AC, - sub_80B43E0, - sub_80B4438, - sub_80B44AC + TrainerExclamationMark, + WaitTrainerExclamationMark, + TrainerMoveToPlayer, + PlayerFaceApproachingTrainer, + WaitPlayerFaceApproachingTrainer, + RevealDisguisedTrainer, + WaitRevealDisguisedTrainer, + RevealHiddenTrainer, + PopOutOfAshHiddenTrainer, + JumpInPlaceHiddenTrainer, + WaitRevealHiddenTrainer, }; static bool8 (*const sTrainerSeeFuncList2[])(u8 taskId, struct Task *task, struct EventObject *trainerObj) = { - sub_80B43AC, - sub_80B43E0, - sub_80B4438, - sub_80B44AC, + RevealHiddenTrainer, + PopOutOfAshHiddenTrainer, + JumpInPlaceHiddenTrainer, + WaitRevealHiddenTrainer, }; static const struct OamData sOamData_Icons = @@ -433,7 +434,7 @@ static bool8 sub_80B4178(u8 taskId, struct Task *task, struct EventObject *train return FALSE; } -static bool8 sub_80B417C(u8 taskId, struct Task *task, struct EventObject *trainerObj) +static bool8 TrainerExclamationMark(u8 taskId, struct Task *task, struct EventObject *trainerObj) { u8 direction; @@ -445,7 +446,7 @@ static bool8 sub_80B417C(u8 taskId, struct Task *task, struct EventObject *train return TRUE; } -static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct EventObject *trainerObj) +static bool8 WaitTrainerExclamationMark(u8 taskId, struct Task *task, struct EventObject *trainerObj) { if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON)) { @@ -454,17 +455,17 @@ static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct EventObject *train else { task->tFuncId++; - if (trainerObj->movementType == 57 || trainerObj->movementType == 58) + if (trainerObj->movementType == MOVEMENT_TYPE_TREE_DISGUISE || trainerObj->movementType == MOVEMENT_TYPE_MOUNTAIN_DISGUISE) task->tFuncId = 6; - if (trainerObj->movementType == 63) + if (trainerObj->movementType == MOVEMENT_TYPE_HIDDEN) task->tFuncId = 8; return TRUE; } } -static bool8 sub_80B4200(u8 taskId, struct Task *task, struct EventObject *trainerObj) +static bool8 TrainerMoveToPlayer(u8 taskId, struct Task *task, struct EventObject *trainerObj) { - if (!(EventObjectIsMovementOverridden(trainerObj)) || EventObjectClearHeldMovementIfFinished(trainerObj)) + if (!EventObjectIsMovementOverridden(trainerObj) || EventObjectClearHeldMovementIfFinished(trainerObj)) { if (task->tTrainerRange) { @@ -473,14 +474,14 @@ static bool8 sub_80B4200(u8 taskId, struct Task *task, struct EventObject *train } else { - EventObjectSetHeldMovement(trainerObj, 0x3E); + EventObjectSetHeldMovement(trainerObj, MOVEMENT_ACTION_FACE_PLAYER); task->tFuncId++; } } return FALSE; } -static bool8 sub_80B425C(u8 taskId, struct Task *task, struct EventObject *trainerObj) +static bool8 PlayerFaceApproachingTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj) { struct EventObject *playerObj; @@ -501,7 +502,7 @@ static bool8 sub_80B425C(u8 taskId, struct Task *task, struct EventObject *train return FALSE; } -static bool8 sub_80B4318(u8 taskId, struct Task *task, struct EventObject *trainerObj) +static bool8 WaitPlayerFaceApproachingTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj) { struct EventObject *playerObj = &gEventObjects[gPlayerAvatar.eventObjectId]; @@ -511,18 +512,18 @@ static bool8 sub_80B4318(u8 taskId, struct Task *task, struct EventObject *train return FALSE; } -static bool8 sub_80B435C(u8 taskId, struct Task *task, struct EventObject *trainerObj) +static bool8 RevealDisguisedTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj) { if (!EventObjectIsMovementOverridden(trainerObj) || EventObjectClearHeldMovementIfFinished(trainerObj)) { - EventObjectSetHeldMovement(trainerObj, 0x59); + EventObjectSetHeldMovement(trainerObj, MOVEMENT_ACTION_REVEAL_TRAINER); task->tFuncId++; } return FALSE; } -static bool8 sub_80B4390(u8 taskId, struct Task *task, struct EventObject *trainerObj) +static bool8 WaitRevealDisguisedTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj) { if (EventObjectClearHeldMovementIfFinished(trainerObj)) task->tFuncId = 3; @@ -530,18 +531,18 @@ static bool8 sub_80B4390(u8 taskId, struct Task *task, struct EventObject *train return FALSE; } -static bool8 sub_80B43AC(u8 taskId, struct Task *task, struct EventObject *trainerObj) +static bool8 RevealHiddenTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj) { if (!EventObjectIsMovementOverridden(trainerObj) || EventObjectClearHeldMovementIfFinished(trainerObj)) { - EventObjectSetHeldMovement(trainerObj, 0x3E); + EventObjectSetHeldMovement(trainerObj, MOVEMENT_ACTION_FACE_PLAYER); task->tFuncId++; } return FALSE; } -static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct EventObject *trainerObj) +static bool8 PopOutOfAshHiddenTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj) { if (EventObjectCheckHeldMovementStatus(trainerObj)) { @@ -555,7 +556,7 @@ static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct EventObject *train return FALSE; } -static bool8 sub_80B4438(u8 taskId, struct Task *task, struct EventObject *trainerObj) +static bool8 JumpInPlaceHiddenTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj) { struct Sprite *sprite; @@ -574,7 +575,7 @@ static bool8 sub_80B4438(u8 taskId, struct Task *task, struct EventObject *train return FALSE; } -static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct EventObject *trainerObj) +static bool8 WaitRevealHiddenTrainer(u8 taskId, struct Task *task, struct EventObject *trainerObj) { if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) task->tFuncId = 3; @@ -38,6 +38,7 @@ #include "secret_base.h" #include "tv.h" #include "data2.h" +#include "constants/layouts.h" // Static type declarations @@ -913,13 +914,13 @@ void ResetGabbyAndTy(void) gSaveBlock1Ptr->gabbyAndTyData.quote[0] = -1; gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn = FALSE; gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon = FALSE; - gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem = FALSE; + gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem = FALSE; gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall = FALSE; gSaveBlock1Ptr->gabbyAndTyData.onAir = FALSE; gSaveBlock1Ptr->gabbyAndTyData.valA_5 = 0; gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn2 = FALSE; gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon2 = FALSE; - gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem2 = FALSE; + gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem2 = FALSE; gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall2 = FALSE; gSaveBlock1Ptr->gabbyAndTyData.valB_4 = 0; gSaveBlock1Ptr->gabbyAndTyData.mapnum = 0; @@ -946,13 +947,13 @@ void GabbyAndTyBeforeInterview(void) { gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon = FALSE; } - if (gBattleResults.unk3 != 0) + if (gBattleResults.numHealingItemsUsed != 0) { - gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem = TRUE; + gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem = TRUE; } else { - gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem = FALSE; + gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem = FALSE; } if (!gBattleResults.usedMasterBall) { @@ -980,7 +981,7 @@ void GabbyAndTyAfterInterview(void) { gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn2 = gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn; gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon2 = gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon; - gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem2 = gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem; + gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem2 = gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem; gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall2 = gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall; gSaveBlock1Ptr->gabbyAndTyData.onAir = TRUE; gSaveBlock1Ptr->gabbyAndTyData.mapnum = gMapHeader.regionMapSectionId; @@ -1027,7 +1028,7 @@ u8 GabbyAndTyGetLastBattleTrivia(void) { return 2; } - if (gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem2) + if (gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem2) { return 3; } @@ -6141,7 +6142,7 @@ void DoTVShowInSearchOfTrainers(void) { sTVShowState = 5; } - else if (gSaveBlock1Ptr->gabbyAndTyData.playerUsedAnItem) + else if (gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem) { sTVShowState = 6; } @@ -6264,7 +6265,9 @@ static void DoTVShowTodaysRivalTrainer(void) case MAPSEC_DYNAMIC: switch (show->rivalTrainer.mapLayoutId) { - case 0x115 ... 0x117: + case LAYOUT_SS_TIDAL_CORRIDOR: + case LAYOUT_SS_TIDAL_LOWER_DECK: + case LAYOUT_SS_TIDAL_ROOMS: sTVShowState = 10; break; default: @@ -6463,7 +6466,9 @@ static void DoTVShowHoennTreasureInvestigators(void) { switch (show->treasureInvestigators.mapLayoutId) { - case 0x115 ... 0x117: + case LAYOUT_SS_TIDAL_CORRIDOR: + case LAYOUT_SS_TIDAL_LOWER_DECK: + case LAYOUT_SS_TIDAL_ROOMS: sTVShowState = 2; break; default: diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 2e6f1642a..e42bf8a23 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -1,27 +1,27 @@ #include "global.h" #include "wild_encounter.h" #include "pokemon.h" -#include "constants/species.h" #include "metatile_behavior.h" #include "fieldmap.h" #include "random.h" -#include "constants/maps.h" #include "field_player_avatar.h" -#include "constants/abilities.h" #include "event_data.h" #include "safari_zone.h" #include "overworld.h" #include "pokeblock.h" #include "battle_setup.h" #include "roamer.h" -#include "constants/game_stat.h" #include "tv.h" #include "link.h" #include "script.h" #include "battle_pike.h" #include "battle_pyramid.h" +#include "constants/abilities.h" +#include "constants/game_stat.h" #include "constants/items.h" +#include "constants/layouts.h" #include "constants/maps.h" +#include "constants/species.h" extern const u8 EventScript_RepelWoreOff[]; @@ -413,7 +413,7 @@ static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 ar level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]); if (flags & WILD_CHECK_REPEL && !IsWildLevelAllowedByRepel(level)) return FALSE; - if (gMapHeader.mapLayoutId != 0x166 && flags & WILD_CHECK_KEEN_EYE && !IsAbilityAllowingEncounter(level)) + if (gMapHeader.mapLayoutId != LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_RANDOM_ROOM3 && flags & WILD_CHECK_KEEN_EYE && !IsAbilityAllowingEncounter(level)) return FALSE; CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level); @@ -474,7 +474,7 @@ static bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility) { u32 ability = GetMonAbility(&gPlayerParty[0]); - if (ability == ABILITY_STENCH && gMapHeader.mapLayoutId == 0x169) + if (ability == ABILITY_STENCH && gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_EMPTY_SQUARE) encounterRate = encounterRate * 3 / 4; else if (ability == ABILITY_STENCH) encounterRate /= 2; @@ -522,7 +522,7 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi headerId = GetCurrentMapWildMonHeaderId(); if (headerId == 0xFFFF) { - if (gMapHeader.mapLayoutId == 0x166) + if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_RANDOM_ROOM3) { headerId = GetBattlePikeWildMonHeaderId(); if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll()) @@ -537,7 +537,7 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi BattleSetup_StartBattlePikeWildBattle(); return TRUE; } - if (gMapHeader.mapLayoutId == 0x169) + if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_EMPTY_SQUARE) { headerId = gSaveBlock2Ptr->frontier.curChallengeBattleNum; if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll()) @@ -665,7 +665,7 @@ bool8 SweetScentWildEncounter(void) headerId = GetCurrentMapWildMonHeaderId(); if (headerId == 0xFFFF) { - if (gMapHeader.mapLayoutId == 0x166) + if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_RANDOM_ROOM3) { headerId = GetBattlePikeWildMonHeaderId(); if (TryGenerateWildMon(gBattlePikeWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0) != TRUE) @@ -675,7 +675,7 @@ bool8 SweetScentWildEncounter(void) BattleSetup_StartBattlePikeWildBattle(); return TRUE; } - if (gMapHeader.mapLayoutId == 0x169) + if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_EMPTY_SQUARE) { headerId = gSaveBlock2Ptr->frontier.curChallengeBattleNum; if (TryGenerateWildMon(gBattlePyramidWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0) != TRUE) |