diff options
Diffstat (limited to 'src')
166 files changed, 33087 insertions, 8392 deletions
diff --git a/src/apprentice.c b/src/apprentice.c index ec8fea27b..5d636d05d 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -1,5 +1,6 @@ #include "global.h" #include "apprentice.h" +#include "battle.h" #include "battle_tower.h" #include "data2.h" #include "event_data.h" @@ -1298,7 +1299,7 @@ static u16 sub_819FF98(u8 arg0) knownMovesCount = j; i = 0; - while (i < 5) + while (i <= MAX_MON_MOVES) { if (Random() % 2 == 0 || var_24 == TRUE) { @@ -1317,7 +1318,7 @@ static u16 sub_819FF98(u8 arg0) if (knownMovesCount < 5) j = 0; else - j = knownMovesCount - 4; + j = knownMovesCount - MAX_MON_MOVES; for (; j < knownMovesCount; j++) { @@ -1331,7 +1332,7 @@ static u16 sub_819FF98(u8 arg0) } else { - if (knownMovesCount < 5) + if (knownMovesCount <= MAX_MON_MOVES) { var_24 = TRUE; continue; @@ -1340,10 +1341,10 @@ static u16 sub_819FF98(u8 arg0) { do { - u8 learnsetId = Random() % (knownMovesCount - 4); + u8 learnsetId = Random() % (knownMovesCount - MAX_MON_MOVES); moveId = learnset[learnsetId] & 0x1FF; valid = TRUE; - for (j = knownMovesCount - 4; j < knownMovesCount; j++) + for (j = knownMovesCount - MAX_MON_MOVES; j < knownMovesCount; j++) { if ((learnset[j] & 0x1FF) == moveId) { @@ -1400,8 +1401,8 @@ static void GetLatestLearnedMoves(u16 species, u16 *moves) } knownMovesCount = i; - if (knownMovesCount > 4) - knownMovesCount = 4; + if (knownMovesCount > MAX_MON_MOVES) + knownMovesCount = MAX_MON_MOVES; for (j = 0; j < knownMovesCount; j++) moves[j] = learnset[(i - 1) - j] & 0x1FF; @@ -1447,7 +1448,7 @@ static void sub_81A0390(u8 arg0) { gSaveBlock2Ptr->apprentices[0].party[i].species = 0; gSaveBlock2Ptr->apprentices[0].party[i].item = 0; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) gSaveBlock2Ptr->apprentices[0].party[i].moves[j] = 0; } diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index a88189870..6098e2d3a 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -320,7 +320,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) data[i] = 0; // Conditional score reset, unlike Ruby. - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (defaultScoreMoves & 1) AI_THINKING_STRUCT->score[i] = 100; @@ -333,7 +333,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) moveLimitations = CheckMoveLimitations(gActiveBattler, 0, 0xFF); // Ignore moves that aren't possible to use. - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBitTable[i] & moveLimitations) AI_THINKING_STRUCT->score[i] = 0; @@ -424,7 +424,7 @@ static u8 ChooseMoveOrAction_Singles(void) currentMoveArray[0] = AI_THINKING_STRUCT->score[0]; consideredMoveArray[0] = 0; - for (i = 1; i < 4; i++) + for (i = 1; i < MAX_MON_MOVES; i++) { if (gBattleMons[sBattler_AI].moves[i] != MOVE_NONE) { @@ -459,7 +459,7 @@ static u8 ChooseMoveOrAction_Doubles(void) s32 mostViableMovesNo; s16 mostMovePoints; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (i == sBattler_AI || gBattleMons[i].hp == 0) { @@ -506,7 +506,7 @@ static u8 ChooseMoveOrAction_Doubles(void) mostViableMovesScores[0] = AI_THINKING_STRUCT->score[0]; mostViableMovesIndices[0] = 0; mostViableMovesNo = 1; - for (j = 1; j < 4; j++) + for (j = 1; j < MAX_MON_MOVES; j++) { if (gBattleMons[sBattler_AI].moves[j] != 0) { @@ -541,7 +541,7 @@ static u8 ChooseMoveOrAction_Doubles(void) mostViableTargetsArray[0] = 0; mostViableTargetsNo = 1; - for (i = 1; i < 4; i++) + for (i = 1; i < MAX_MON_MOVES; i++) { if (mostMovePoints == bestMovePointsForTarget[i]) { @@ -594,7 +594,7 @@ static void BattleAI_DoAIProcessing(void) { AI_THINKING_STRUCT->movesetIndex++; - if (AI_THINKING_STRUCT->movesetIndex < 4 && !(AI_THINKING_STRUCT->aiAction & AI_ACTION_DO_NOT_ATTACK)) + if (AI_THINKING_STRUCT->movesetIndex < MAX_MON_MOVES && !(AI_THINKING_STRUCT->aiAction & AI_ACTION_DO_NOT_ATTACK)) AI_THINKING_STRUCT->aiState = AIState_SettingUp; else AI_THINKING_STRUCT->aiState++; @@ -610,7 +610,7 @@ static void RecordLastUsedMoveByTarget(void) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) break; @@ -627,7 +627,7 @@ void ClearBattlerMoveHistory(u8 battlerId) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) BATTLE_HISTORY->usedMoves[battlerId].moves[i] = MOVE_NONE; } @@ -1067,14 +1067,14 @@ static void BattleAICmd_if_user_has_attacking_move(void) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].power != 0) break; } - if (i == 4) + if (i == MAX_MON_MOVES) gAIScriptPtr += 5; else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); @@ -1084,14 +1084,14 @@ static void BattleAICmd_if_user_has_no_attacking_moves(void) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].power != 0) break; } - if (i != 4) + if (i != MAX_MON_MOVES) gAIScriptPtr += 5; else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); @@ -1182,7 +1182,7 @@ static void BattleAICmd_get_how_powerful_move_is(void) gMoveResultFlags = 0; gCritMultiplier = 1; - for (checkedMove = 0; checkedMove < 4; checkedMove++) + for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) { for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) { @@ -1207,13 +1207,13 @@ static void BattleAICmd_get_how_powerful_move_is(void) } } - for (checkedMove = 0; checkedMove < 4; checkedMove++) + for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) { if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex]) break; } - if (checkedMove == 4) + if (checkedMove == MAX_MON_MOVES) AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful. else AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful. @@ -1464,7 +1464,7 @@ static void BattleAICmd_get_highest_type_effectiveness(void) gCritMultiplier = 1; AI_THINKING_STRUCT->funcResult = 0; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { gBattleMoveDamage = 40; gCurrentMove = gBattleMons[sBattler_AI].moves[i]; @@ -1765,12 +1765,12 @@ static void BattleAICmd_if_has_move(void) switch (gAIScriptPtr[1]) { case AI_USER: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[sBattler_AI].moves[i] == *movePtr) break; } - if (i == 4) + if (i == MAX_MON_MOVES) gAIScriptPtr += 8; else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); @@ -1783,25 +1783,25 @@ static void BattleAICmd_if_has_move(void) } else { - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[sBattler_AI ^ BIT_FLANK].moves[i] == *movePtr) break; } } - if (i == 4) + if (i == MAX_MON_MOVES) gAIScriptPtr += 8; else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); break; case AI_TARGET: case AI_TARGET_PARTNER: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr) break; } - if (i == 4) + if (i == MAX_MON_MOVES) gAIScriptPtr += 8; else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); @@ -1818,24 +1818,24 @@ static void BattleAICmd_if_doesnt_have_move(void) { case AI_USER: case AI_USER_PARTNER: // UB: no separate check for user partner. - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[sBattler_AI].moves[i] == *movePtr) break; } - if (i != 4) + if (i != MAX_MON_MOVES) gAIScriptPtr += 8; else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); break; case AI_TARGET: case AI_TARGET_PARTNER: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr) break; } - if (i != 4) + if (i != MAX_MON_MOVES) gAIScriptPtr += 8; else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); @@ -1851,25 +1851,25 @@ static void BattleAICmd_if_has_move_with_effect(void) { case AI_USER: case AI_USER_PARTNER: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].effect == gAIScriptPtr[2]) break; } - if (i == 4) + if (i == MAX_MON_MOVES) gAIScriptPtr += 7; else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); break; case AI_TARGET: case AI_TARGET_PARTNER: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { // UB: checks sBattler_AI instead of gBattlerTarget. if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2]) break; } - if (i == 4) + if (i == MAX_MON_MOVES) gAIScriptPtr += 7; else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); @@ -1885,24 +1885,24 @@ static void BattleAICmd_if_doesnt_have_move_with_effect(void) { case AI_USER: case AI_USER_PARTNER: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if(gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].effect == gAIScriptPtr[2]) break; } - if (i != 4) + if (i != MAX_MON_MOVES) gAIScriptPtr += 7; else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); break; case AI_TARGET: case AI_TARGET_PARTNER: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2]) break; } - if (i != 4) + if (i != MAX_MON_MOVES) gAIScriptPtr += 7; else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index ad25b483c..a5958ebc6 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -49,7 +49,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) return FALSE; // Check if Pokemon has a super effective move. - for (opposingBattler = GetBattlerAtPosition(opposingPosition), i = 0; i < 4; i++) + for (opposingBattler = GetBattlerAtPosition(opposingPosition), i = 0; i < MAX_MON_MOVES; i++) { move = gBattleMons[gActiveBattler].moves[i]; if (move == MOVE_NONE) @@ -93,7 +93,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) GetMonData(&party[i], MON_DATA_SPECIES); // Unused return value. GetMonData(&party[i], MON_DATA_ALT_ABILITY); // Unused return value. - for (opposingBattler = GetBattlerAtPosition(opposingPosition), j = 0; j < 4; j++) + for (opposingBattler = GetBattlerAtPosition(opposingPosition), j = 0; j < MAX_MON_MOVES; j++) { move = GetMonData(&party[i], MON_DATA_MOVE1 + j); if (move == MOVE_NONE) @@ -262,7 +262,7 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) if (!(gAbsentBattlerFlags & gBitTable[opposingBattler])) { - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { move = gBattleMons[gActiveBattler].moves[i]; if (move == MOVE_NONE) @@ -285,7 +285,7 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) if (!(gAbsentBattlerFlags & gBitTable[opposingBattler])) { - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { move = gBattleMons[gActiveBattler].moves[i]; if (move == MOVE_NONE) @@ -400,7 +400,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) { battlerIn1 = gLastHitBy[gActiveBattler]; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { move = GetMonData(&party[i], MON_DATA_MOVE1 + j); if (move == 0) @@ -715,14 +715,14 @@ u8 GetMostSuitableMonToSwitchInto(void) // Ok, we know the mon has the right typing but does it have at least one super effective move? if (bestMonId != PARTY_SIZE) { - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i); if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBattler) & MOVE_RESULT_SUPER_EFFECTIVE) break; } - if (i != 4) + if (i != MAX_MON_MOVES) return bestMonId; // Has both the typing and at least one super effective move. invalidMons |= gBitTable[bestMonId]; // Sorry buddy, we want something better. @@ -757,7 +757,7 @@ u8 GetMostSuitableMonToSwitchInto(void) if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) continue; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { move = GetMonData(&party[i], MON_DATA_MOVE1 + j); gBattleMoveDamage = 0; diff --git a/src/battle_anim.c b/src/battle_anim.c index 1e1219800..7dd1526dd 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1605,8 +1605,8 @@ static void ScriptCmd_loadspritegfx(void) sBattleAnimScriptPtr++; index = T1_READ_16(sBattleAnimScriptPtr); - LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]); - LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]); + LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]); + LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]); sBattleAnimScriptPtr += 2; AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); gAnimFramesToWait = 1; @@ -1870,7 +1870,7 @@ static void ScriptCmd_monbg(void) else toBG_2 = TRUE; - sub_80A438C(battlerId, toBG_2, FALSE); + MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE); taskId = CreateTask(sub_80A40F4, 10); gAnimVisualTaskCount++; gTasks[taskId].data[t1_MONBG_BATTLER] = battlerId; @@ -1889,7 +1889,7 @@ static void ScriptCmd_monbg(void) else toBG_2 = TRUE; - sub_80A438C(battlerId, toBG_2, FALSE); + MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE); taskId = CreateTask(sub_80A40F4, 10); gAnimVisualTaskCount++; gTasks[taskId].data[0] = battlerId; @@ -1922,7 +1922,7 @@ bool8 IsBattlerSpriteVisible(u8 battlerId) return FALSE; } -void sub_80A438C(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible) +void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible) { struct UnknownAnimStruct2 unknownStruct; u8 battlerSpriteId; @@ -2194,7 +2194,7 @@ static void ScriptCmd_monbg_22(void) else toBG_2 = TRUE; - sub_80A438C(battlerId, toBG_2, FALSE); + MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE); } battlerId ^= BIT_FLANK; @@ -2206,7 +2206,7 @@ static void ScriptCmd_monbg_22(void) else toBG_2 = TRUE; - sub_80A438C(battlerId, toBG_2, FALSE); + MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE); } sBattleAnimScriptPtr++; @@ -2283,7 +2283,7 @@ static void ScriptCmd_setalpha(void) sBattleAnimScriptPtr++; half1 = *(sBattleAnimScriptPtr++); half2 = *(sBattleAnimScriptPtr++) << 8; - SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, half1 | half2); } diff --git a/src/battle_anim_80A5C6C.c b/src/battle_anim_80A5C6C.c index e17dde078..92815b56c 100644 --- a/src/battle_anim_80A5C6C.c +++ b/src/battle_anim_80A5C6C.c @@ -788,7 +788,7 @@ void InitSpritePosToAnimTarget(struct Sprite *sprite, bool8 respectMonPicOffsets sprite->pos1.y += gBattleAnimArgs[1]; } -void InitSpritePosToAnimAttacker(struct Sprite *sprite, u8 respectMonPicOffsets) +void InitSpritePosToAnimAttacker(struct Sprite *sprite, bool8 respectMonPicOffsets) { if (!respectMonPicOffsets) { @@ -948,7 +948,7 @@ void sub_80A6C68(u32 bgId) CopyBgTilemapBufferToVram(unkStruct.bgId); } -void sub_80A6CC0(u32 bgId, const void *src, u32 tilesOffset) +void sub_80A6CC0(u32 bgId, const u32 *src, u32 tilesOffset) { CpuFill32(0, gUnknown_0202305C, 0x2000); LZDecompressWram(src, gUnknown_0202305C); @@ -2092,17 +2092,17 @@ u8 sub_80A8394(u16 species, bool8 isBackpic, u8 a3, s16 x, s16 y, u8 subpriority return spriteId; } -void sub_80A8610(struct Sprite *sprite) +void DestroySpriteAndFreeResources_(struct Sprite *sprite) { DestroySpriteAndFreeResources(sprite); } -s16 sub_80A861C(u8 battlerId, u8 a2) +s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr) { u16 species; u32 personality; u16 letter; - u16 var; + u16 unownSpecies; int ret; const struct MonCoords *coords; struct BattleSpriteInfo *spriteInfo; @@ -2123,10 +2123,10 @@ s16 sub_80A861C(u8 battlerId, u8 a2) { letter = GET_UNOWN_LETTER(personality); if (!letter) - var = SPECIES_UNOWN; + unownSpecies = SPECIES_UNOWN; else - var = letter + SPECIES_UNOWN_B - 1; - coords = &gMonBackPicCoords[var]; + unownSpecies = letter + SPECIES_UNOWN_B - 1; + coords = &gMonBackPicCoords[unownSpecies]; } else if (species == SPECIES_CASTFORM) { @@ -2156,16 +2156,17 @@ s16 sub_80A861C(u8 battlerId, u8 a2) species = spriteInfo[battlerId].transformSpecies; personality = gTransformedPersonalities[battlerId]; } + if (species == SPECIES_UNOWN) { letter = GET_UNOWN_LETTER(personality); if (!letter) - var = SPECIES_UNOWN; + unownSpecies = SPECIES_UNOWN; else - var = letter + SPECIES_UNOWN_B - 1; - coords = &gMonBackPicCoords[var]; + unownSpecies = letter + SPECIES_UNOWN_B - 1; + coords = &gMonBackPicCoords[unownSpecies]; } - else if (species > SPECIES_EGG) + else if (species > NUM_SPECIES) { coords = &gMonBackPicCoords[0]; } @@ -2187,20 +2188,21 @@ s16 sub_80A861C(u8 battlerId, u8 a2) species = spriteInfo[battlerId].transformSpecies; personality = gTransformedPersonalities[battlerId]; } + if (species == SPECIES_UNOWN) { letter = GET_UNOWN_LETTER(personality); if (!letter) - var = SPECIES_UNOWN; + unownSpecies = SPECIES_UNOWN; else - var = letter + SPECIES_UNOWN_B - 1; - coords = &gMonFrontPicCoords[var]; + unownSpecies = letter + SPECIES_UNOWN_B - 1; + coords = &gMonFrontPicCoords[unownSpecies]; } else if (species == SPECIES_CASTFORM) { coords = &gCastformFrontSpriteCoords[gBattleMonForms[battlerId]]; } - else if (species > SPECIES_EGG) + else if (species > NUM_SPECIES) { coords = &gMonFrontPicCoords[0]; } @@ -2211,22 +2213,22 @@ s16 sub_80A861C(u8 battlerId, u8 a2) } } - switch (a2) + switch (attr) { - case 0: + case BATTLER_COORD_ATTR_HEIGHT: return (coords->coords & 0xf) * 8; - case 1: + case BATTLER_COORD_ATTR_WIDTH: return (coords->coords >> 4) * 8; - case 4: - return GetBattlerSpriteCoord(battlerId, 2) - ((coords->coords >> 4) * 4); - case 5: - return GetBattlerSpriteCoord(battlerId, 2) + ((coords->coords >> 4) * 4); - case 2: - return GetBattlerSpriteCoord(battlerId, 3) - ((coords->coords & 0xf) * 4); - case 3: - return GetBattlerSpriteCoord(battlerId, 3) + ((coords->coords & 0xf) * 4); - case 6: - ret = GetBattlerSpriteCoord(battlerId, 1) + 0x1f; + case BATTLER_COORD_ATTR_LEFT: + return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) - ((coords->coords >> 4) * 4); + case BATTLER_COORD_ATTR_RIGHT: + return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) + ((coords->coords >> 4) * 4); + case BATTLER_COORD_ATTR_TOP: + return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) - ((coords->coords & 0xf) * 4); + case BATTLER_COORD_ATTR_BOTTOM: + return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) + ((coords->coords & 0xf) * 4); + case BATTLER_COORD_ATTR_RAW_BOTTOM: + ret = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 31; return ret - coords->y_offset; default: return 0; diff --git a/src/battle_anim_80A9C70.c b/src/battle_anim_80A9C70.c index 2eea276a1..001f99d7f 100644 --- a/src/battle_anim_80A9C70.c +++ b/src/battle_anim_80A9C70.c @@ -71,8 +71,8 @@ u8 sub_80A9C70(u8 battlerId, bool8 b) u8 spriteId2; u8 i; - LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]); - LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]); + LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]); + LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]); gTasks[taskId].data[0] = battlerId; if (b) { diff --git a/src/battle_anim_8170478.c b/src/battle_anim_8170478.c index 32214b58d..5b7a4ec1c 100755 --- a/src/battle_anim_8170478.c +++ b/src/battle_anim_8170478.c @@ -388,7 +388,7 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_085E535C = }; extern const struct SpriteTemplate gUnknown_085CE388; -extern const struct SpriteTemplate gUnknown_085CE3A0; +extern const struct SpriteTemplate gMiniTwinklingStarSpriteTemplate; void unref_sub_8170478(u8 taskId) { @@ -1376,8 +1376,8 @@ static void sub_8171D60(u8 ballId) if (GetSpriteTileStartByTag(gBallOpenParticleSpritesheets[ballId].tag) == 0xFFFF) { - LoadCompressedObjectPicUsingHeap(&gBallOpenParticleSpritesheets[ballId]); - LoadCompressedObjectPaletteUsingHeap(&gBallOpenParticlePalettes[ballId]); + LoadCompressedSpriteSheetUsingHeap(&gBallOpenParticleSpritesheets[ballId]); + LoadCompressedSpritePaletteUsingHeap(&gBallOpenParticlePalettes[ballId]); } } @@ -2032,8 +2032,8 @@ void sub_8172EF0(u8 battler, struct Pokemon *mon) { if (GetSpriteTileStartByTag(0x27F9) == 0xFFFF) { - LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[233]); - LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[233]); + LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[233]); + LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[233]); } taskId1 = CreateTask(sub_8172FEC, 10); @@ -2081,12 +2081,12 @@ static void sub_8172FEC(u8 taskId) } else if (state >= 0 && gTasks[taskId].data[11] < 4) { - spriteId = CreateSprite(&gUnknown_085CE3A0, x, y, 5); + spriteId = CreateSprite(&gMiniTwinklingStarSpriteTemplate, x, y, 5); gSprites[spriteId].oam.tileNum += 4; } else { - spriteId = CreateSprite(&gUnknown_085CE3A0, x, y, 5); + spriteId = CreateSprite(&gMiniTwinklingStarSpriteTemplate, x, y, 5); gSprites[spriteId].oam.tileNum += 5; } @@ -2173,8 +2173,8 @@ void sub_81732B0(u8 taskId) { u8 paletteIndex; - LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[269]); - LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[269]); + LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[269]); + LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[269]); paletteIndex = IndexOfSpritePaletteTag(0x281D); // unused DestroyAnimVisualTask(taskId); } diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index e37d2b5b8..25eb14637 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -3297,8 +3297,8 @@ void sub_80FFFC0(u8 taskId) task->data[4] = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 1; task->data[6] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); - task->data[10] = sub_80A861C(gBattleAnimTarget, 1); - task->data[11] = sub_80A861C(gBattleAnimTarget, 0); + task->data[10] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH); + task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT); task->data[5] = (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) ? 1 : -1; task->data[9] = 56 - (task->data[5] * 64); task->data[8] = task->data[7] - task->data[9] + task->data[6]; @@ -5452,11 +5452,11 @@ static void sub_81030B0(struct Sprite* sprite) void sub_810310C(u8 battler, struct Sprite* sprite) { if (GetBattlerSide(battler) == B_SIDE_PLAYER) - sprite->pos1.x = sub_80A861C(battler, 5) + 8; + sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) + 8; else - sprite->pos1.x = sub_80A861C(battler, 4) - 8; + sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8; - sprite->pos1.y = GetBattlerSpriteCoord(battler, 3) - (s16)sub_80A861C(battler, 0) / 4; + sprite->pos1.y = GetBattlerSpriteCoord(battler, 3) - (s16)GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4; } void sub_8103164(struct Sprite* sprite) @@ -5520,7 +5520,7 @@ void sub_8103284(struct Sprite* sprite) battler = gBattleAnimTarget; sprite->pos1.x = GetBattlerSpriteCoord(battler, 0); - sprite->pos1.y = sub_80A861C(battler, 2); + sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP); if (sprite->pos1.y <= 9) sprite->pos1.y = 10; diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index 8acbf62d4..8306ada1c 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -2446,7 +2446,7 @@ void sub_8104E74(u8 taskId) task->data[3] = 0; task->data[4] = 0; task->data[5] = 0; - task->data[15] = sub_80A861C(gBattleAnimTarget, 0); + task->data[15] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT); if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1) { @@ -2531,7 +2531,7 @@ void sub_810501C(struct Sprite *sprite) sprite->data[2] = 0; sprite->data[3] = 16; sprite->data[4] = 0; - sprite->data[5] = sub_80A861C(gBattleAnimTarget, 0) + 2; + sprite->data[5] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT) + 2; sprite->data[6] = BattleAnimAdjustPanning(63); sprite->callback = sub_8105078; } @@ -3134,7 +3134,7 @@ void sub_8105EB0(u8 taskId) SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); SetGpuReg(REG_OFFSET_WININ, 0x3F1F); SetGpuReg(REG_OFFSET_WINOUT, 0x3F3F); - SetGpuReg(REG_OFFSET_BLDCNT, 0xC8); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN); SetGpuReg(REG_OFFSET_BLDY, 0x10); gTasks[taskId].data[0] = win0v; gTasks[taskId].data[1] = win0h; @@ -3390,8 +3390,8 @@ void sub_81064F8(u8 taskId) else sub_80A6D60(&unknownStruct, &gBattleAnimBackgroundTilemap_ScaryFaceOpponent, 0); - sub_80A6CC0(unknownStruct.bgId, &gUnknown_08C249F8, unknownStruct.tilesOffset); - LoadCompressedPalette(&gUnknown_08C249D0, unknownStruct.unk8 << 4, 32); + sub_80A6CC0(unknownStruct.bgId, gUnknown_08C249F8, unknownStruct.tilesOffset); + LoadCompressedPalette(gUnknown_08C249D0, unknownStruct.unk8 << 4, 32); gTasks[taskId].func = sub_81065EC; } diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index d887eeabf..018cc48e4 100755 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -22,6 +22,7 @@ #include "constants/rgb.h" #include "constants/songs.h" #include "constants/species.h" +#include "constants/weather.h" extern u8 sub_807521C(s16 x, s16 y, u8 a3); extern void sub_810E2C8(struct Sprite *); @@ -45,7 +46,7 @@ void sub_815ACD0(struct Sprite *); void sub_815B27C(struct Sprite *); void sub_815B394(struct Sprite *); void sub_815B49C(struct Sprite *); -void sub_815B570(struct Sprite *); +void AnimMiniTwinklingStar(struct Sprite *); void sub_815B70C(struct Sprite *); void sub_815BE04(struct Sprite *); void sub_815C400(struct Sprite *); @@ -61,15 +62,15 @@ void sub_815E01C(struct Sprite *); void sub_815E404(struct Sprite *); void sub_815E444(struct Sprite *); void sub_815E6D8(struct Sprite *); -void sub_815E954(struct Sprite *); -void sub_815EA14(struct Sprite *); -void sub_815EE84(struct Sprite *); -void sub_815F18C(struct Sprite *); -void sub_815F48C(struct Sprite *); +void AnimSmellingSaltExclamation(struct Sprite *); +void AnimHelpingHandClap(struct Sprite *); +void AnimForesightMagnifyingGlass(struct Sprite *); +void AnimMeteorMashStar(struct Sprite *); +void AnimBlockX(struct Sprite *); void sub_815FE80(struct Sprite *); void sub_81061C4(struct Sprite *); -void sub_8160338(struct Sprite *); -void sub_81603A8(struct Sprite *); +void AnimKnockOffStrike(struct Sprite *); +void AnimRecycle(struct Sprite *); static void sub_815A114(struct Sprite *); static void sub_815A1F4(struct Sprite *); static void sub_815A234(struct Sprite *); @@ -111,15 +112,18 @@ static void sub_815E20C(u8); static void sub_815E34C(s16, s16, s16, s16, u8, u8, s16 *, s16 *); static void sub_815E5CC(u8); static void sub_815E784(struct Sprite *); -static void sub_815E898(u8); -static void sub_815E9BC(struct Sprite *); -static void sub_815EA60(struct Sprite *); -static void sub_815ECE4(u8); -static void sub_815EF08(struct Sprite *); -static void sub_815F330(u8); -static void sub_815F4F0(struct Sprite *); -static void sub_815F79C(u8); -static void sub_815F7C4(struct Sprite *); +static void AnimTask_SmellingSaltSquishStep(u8); +static void AnimSmellingSaltExclamationStep(struct Sprite *); +static void AnimHelpingHandClapStep(struct Sprite *); +static void AnimTask_HelpingHandAttackerMovementStep(u8); +static void AnimForesightMagnifyingGlassStep(struct Sprite *); +static void AnimTask_MonToSubstituteDoll(u8); +static void AnimBlockXStep(struct Sprite *); +static void AnimTask_OdorSleuthMovementWaitFinish(u8); +static void MoveOdorSleuthClone(struct Sprite *); +static void AnimTask_TeeterDanceMovementStep(u8); +static void AnimRecycleStep(struct Sprite *); +static void AnimTask_SlackOffSquishStep(u8); const union AnimCmd gUnknown_085CE004[] = { @@ -535,7 +539,7 @@ const struct SpriteTemplate gUnknown_085CE388 = .callback = sub_815B49C, }; -const struct SpriteTemplate gUnknown_085CE3A0 = +const struct SpriteTemplate gMiniTwinklingStarSpriteTemplate = { .tileTag = ANIM_TAG_GOLD_STARS, .paletteTag = ANIM_TAG_GOLD_STARS, @@ -543,7 +547,7 @@ const struct SpriteTemplate gUnknown_085CE3A0 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_815B570, + .callback = AnimMiniTwinklingStar, }; const union AffineAnimCmd gUnknown_085CE3B8[] = @@ -589,9 +593,9 @@ const union AffineAnimCmd gUnknown_085CE430[] = const s8 gUnknown_085CE460[] = { - 0xE8, - 0x18, - 0xFC, + 0xE8, + 0x18, + 0xFC, 0x00, }; @@ -995,14 +999,14 @@ const struct SpriteTemplate gUnknown_085CE864 = .callback = sub_815E6D8, }; -const union AffineAnimCmd gUnknown_085CE87C[] = +const union AffineAnimCmd gSmellingSaltSquishAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, -16, 0, 6), AFFINEANIMCMD_FRAME(0, 16, 0, 6), AFFINEANIMCMD_END, }; -const struct SpriteTemplate gUnknown_085CE894 = +const struct SpriteTemplate gSmellingSaltExclamationSpriteTemplate = { .tileTag = ANIM_TAG_SMELLINGSALT_EFFECT, .paletteTag = ANIM_TAG_SMELLINGSALT_EFFECT, @@ -1010,10 +1014,10 @@ const struct SpriteTemplate gUnknown_085CE894 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_815E954, + .callback = AnimSmellingSaltExclamation, }; -const struct SpriteTemplate gUnknown_085CE8AC = +const struct SpriteTemplate gHelpingHandClapSpriteTemplate = { .tileTag = ANIM_TAG_TAG_HAND, .paletteTag = ANIM_TAG_TAG_HAND, @@ -1021,10 +1025,10 @@ const struct SpriteTemplate gUnknown_085CE8AC = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_815EA14, + .callback = AnimHelpingHandClap, }; -const struct SpriteTemplate gUnknown_085CE8C4 = +const struct SpriteTemplate gForesightMagnifyingGlassSpriteTemplate = { .tileTag = ANIM_TAG_MAGNIFYING_GLASS, .paletteTag = ANIM_TAG_MAGNIFYING_GLASS, @@ -1032,10 +1036,10 @@ const struct SpriteTemplate gUnknown_085CE8C4 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_815EE84, + .callback = AnimForesightMagnifyingGlass, }; -const struct SpriteTemplate gUnknown_085CE8DC = +const struct SpriteTemplate gMeteorMashStarSpriteTemplate = { .tileTag = ANIM_TAG_GOLD_STARS, .paletteTag = ANIM_TAG_GOLD_STARS, @@ -1043,7 +1047,7 @@ const struct SpriteTemplate gUnknown_085CE8DC = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_815F18C, + .callback = AnimMeteorMashStar, }; const struct SpriteTemplate gUnknown_085CE8F4 = @@ -1057,7 +1061,7 @@ const struct SpriteTemplate gUnknown_085CE8F4 = .callback = sub_81061C4, }; -const struct SpriteTemplate gUnknown_085CE90C = +const struct SpriteTemplate gBlockXSpriteTemplate = { .tileTag = ANIM_TAG_X_SIGN, .paletteTag = ANIM_TAG_X_SIGN, @@ -1065,7 +1069,7 @@ const struct SpriteTemplate gUnknown_085CE90C = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_815F48C, + .callback = AnimBlockX, }; const struct SpriteTemplate gUnknown_085CE924 = @@ -1079,72 +1083,72 @@ const struct SpriteTemplate gUnknown_085CE924 = .callback = sub_815FE80, }; -const union AnimCmd gUnknown_085CE93C[] = +const union AnimCmd gKnockOffStrikeAnimCmds[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(64, 4), ANIMCMD_END, }; -const union AnimCmd *const gUnknown_085CE948[] = +const union AnimCmd *const gKnockOffStrikeAnimTable[] = { - gUnknown_085CE93C, + gKnockOffStrikeAnimCmds, }; -const union AffineAnimCmd gUnknown_085CE94C[] = +const union AffineAnimCmd gKnockOffStrikeAffineanimCmds1[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0, 0, -4, 8), AFFINEANIMCMD_END, }; -const union AffineAnimCmd gUnknown_085CE964[] = +const union AffineAnimCmd gKnockOffStrikeAffineanimCmds2[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 4, 8), AFFINEANIMCMD_END, }; -const union AffineAnimCmd *const gUnknown_085CE97C[] = +const union AffineAnimCmd *const gKnockOffStrikeAffineAnimTable[] = { - gUnknown_085CE94C, - gUnknown_085CE964, + gKnockOffStrikeAffineanimCmds1, + gKnockOffStrikeAffineanimCmds2, }; -const struct SpriteTemplate gUnknown_085CE984 = +const struct SpriteTemplate gKnockOffStrikeSpriteTemplate = { .tileTag = ANIM_TAG_SLAM_HIT_2, .paletteTag = ANIM_TAG_SLAM_HIT_2, .oam = &gUnknown_0852497C, - .anims = gUnknown_085CE948, + .anims = gKnockOffStrikeAnimTable, .images = NULL, - .affineAnims = gUnknown_085CE97C, - .callback = sub_8160338, + .affineAnims = gKnockOffStrikeAffineAnimTable, + .callback = AnimKnockOffStrike, }; -const union AffineAnimCmd gUnknown_085CE99C[] = +const union AffineAnimCmd gRecycleSpriteAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, 0, -4, 64), AFFINEANIMCMD_JUMP(0), }; -const union AffineAnimCmd *const gUnknown_085CE9AC[] = +const union AffineAnimCmd *const gRecycleSpriteAffineAnimTable[] = { - gUnknown_085CE99C, + gRecycleSpriteAffineAnimCmds, }; -const struct SpriteTemplate gUnknown_085CE9B0 = +const struct SpriteTemplate gRecycleSpriteTemplate = { .tileTag = ANIM_TAG_RECYCLE, .paletteTag = ANIM_TAG_RECYCLE, .oam = &gUnknown_08524A9C, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = gUnknown_085CE9AC, - .callback = sub_81603A8, + .affineAnims = gRecycleSpriteAffineAnimTable, + .callback = AnimRecycle, }; -const union AffineAnimCmd gUnknown_085CE9C8[] = +const union AffineAnimCmd gSlackOffSquishAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, 16, 0, 4), AFFINEANIMCMD_FRAME(-2, 0, 0, 8), @@ -1450,11 +1454,9 @@ void sub_815A7B0(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } -// This is likely fakematching due to some strange type casting behavior. void sub_815A7EC(struct Sprite *sprite) { int var0; - int var1; if (sprite->data[0] == 0) { SetSpriteCoordsToAnimAttackerCoords(sprite); @@ -1468,16 +1470,13 @@ void sub_815A7EC(struct Sprite *sprite) } else { - var1 = -gBattleAnimArgs[2]; - sprite->data[1] = var1; - var1 = -gBattleAnimArgs[3]; - sprite->data[2] = var1; + sprite->data[1] = -1 * gBattleAnimArgs[2]; + sprite->data[2] = -1 * gBattleAnimArgs[3]; } } else { - var1 = -gBattleAnimArgs[2]; - sprite->data[1] = var1; + sprite->data[1] = -1 * gBattleAnimArgs[2]; sprite->data[2] = gBattleAnimArgs[3]; } } @@ -1486,8 +1485,8 @@ void sub_815A7EC(struct Sprite *sprite) var0 = (sprite->data[0] * 20) & 0xFF; sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; - sprite->pos2.x = (sprite->data[3] + (s32)((u32)sprite->data[3] >> 31)) >> 1; - sprite->pos2.y = Sin(var0 & 0xFF, 5) + ((s32)(sprite->data[4] + ((u32)sprite->data[4] >> 31)) >> 1); + sprite->pos2.x = sprite->data[3] / 2; + sprite->pos2.y = Sin(var0 & 0xFF, 5) + (sprite->data[4] / 2); if ((u16)(sprite->pos1.x + sprite->pos2.x) > 240) DestroyAnimSprite(sprite); @@ -1688,7 +1687,6 @@ void sub_815AC8C(u8 taskId) void sub_815ACD0(struct Sprite *sprite) { - int var0; if (gBattleAnimArgs[0] == 0) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + gBattleAnimArgs[1]; @@ -1701,11 +1699,8 @@ void sub_815ACD0(struct Sprite *sprite) } sprite->pos2.y = gBattleAnimArgs[2]; - var0 = 0; - if (sprite->pos2.y > gBattleAnimArgs[3]) - var0 = 1; - sprite->data[0] = var0; + sprite->data[0] = (sprite->pos2.y > gBattleAnimArgs[3]); sprite->data[1] = 0; sprite->data[2] = gBattleAnimArgs[4]; sprite->data[3] = gBattleAnimArgs[5]; @@ -1846,7 +1841,7 @@ static void sub_815AED8(u8 taskId) if (task->data[7]) task->data[12] = task->data[8]; else - task->data[12] = task->data[9]; + task->data[12] = task->data[9]; } i = task->data[0]; @@ -2113,7 +2108,7 @@ static void sub_815B4D4(struct Sprite *sprite) if (++sprite->data[2] % 3 == 0) { CreateSpriteAndAnimate( - &gUnknown_085CE3A0, + &gMiniTwinklingStarSpriteTemplate, sprite->pos1.x + sprite->pos2.x, sprite->pos1.y + sprite->pos2.y, sprite->subpriority + 1); @@ -2124,7 +2119,7 @@ static void sub_815B4D4(struct Sprite *sprite) DestroyAnimSprite(sprite); } -void sub_815B570(struct Sprite *sprite) +void AnimMiniTwinklingStar(struct Sprite *sprite) { u8 rand; s8 y; @@ -2388,8 +2383,8 @@ void sub_815BB84(u8 taskId) gBattle_BG1_Y = 0; } - sub_80A6CC0(unknownStruct.bgId, &gUnknown_08C2A634, unknownStruct.tilesOffset); - LoadCompressedPalette(&gUnknown_08C2A6D4, unknownStruct.unk8 << 4, 32); + sub_80A6CC0(unknownStruct.bgId, gUnknown_08C2A634, unknownStruct.tilesOffset); + LoadCompressedPalette(gUnknown_08C2A6D4, unknownStruct.unk8 << 4, 32); gTasks[taskId].data[10] = gBattle_BG1_X; gTasks[taskId].data[11] = gBattle_BG1_Y; @@ -2403,7 +2398,7 @@ void sub_815BB84(u8 taskId) gTasks[taskId].data[4] = 0; if (++gTasks[taskId].data[1] > 12) gTasks[taskId].data[1] = 12; - + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1])); if (gTasks[taskId].data[1] == 12) @@ -2459,7 +2454,7 @@ void sub_815BE04(struct Sprite *sprite) xOffset &= 0x3F; if (xOffset > 31) xOffset = 32 - xOffset; - + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + xOffset; sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 32; sprite->data[1] = gBattleAnimArgs[0]; @@ -2490,7 +2485,7 @@ static void sub_815BF44(struct Sprite *sprite) { int var0; s8 var1; - + var0 = (u16)sprite->data[2] + (u16)sprite->data[3]; var1 = var0 >> 8; sprite->pos2.y -= var1; @@ -2531,7 +2526,7 @@ static void sub_815C050(struct Sprite *sprite) register u16 d3 asm("r1"); int var0; s8 var1; - + if (!sprite->invisible) { d2 = sprite->data[2]; @@ -2594,8 +2589,8 @@ void sub_815C0A4(u8 taskId) gBattle_BG1_Y = 0; } - sub_80A6CC0(unknownStruct.bgId, &gUnknown_08C2A634, unknownStruct.tilesOffset); - LoadCompressedPalette(&gUnknown_08C2A6D4, unknownStruct.unk8 << 4, 32); + sub_80A6CC0(unknownStruct.bgId, gUnknown_08C2A634, unknownStruct.tilesOffset); + LoadCompressedPalette(gUnknown_08C2A6D4, unknownStruct.unk8 << 4, 32); gTasks[taskId].data[10] = gBattle_BG1_X; gTasks[taskId].data[11] = gBattle_BG1_Y; gTasks[taskId].data[0]++; @@ -2637,7 +2632,7 @@ void sub_815C0A4(u8 taskId) sub_80A6C68(unknownStruct.bgId); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); - + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; @@ -2893,7 +2888,7 @@ static void sub_815C7C4(u8 taskId) SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]); SetBattlerSpriteYOffsetFromRotation(task->data[15]); gSprites[task->data[15]].pos2.x = -(((temp = task->data[2]) >= 0 ? task->data[2] : temp + 63) >> 6); - + if (++task->data[1] > 8) { if (task->data[12]) @@ -3143,8 +3138,6 @@ static void sub_815CDFC(struct Sprite *sprite) } } - - extern void sub_815D160(u8); void sub_815CED8(u8 taskId) @@ -3220,7 +3213,7 @@ void sub_815CED8(u8 taskId) gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; FillPalette(RGB(31, 31, 31), (gSprites[spriteId].oam.paletteNum << 4) + 0x100, 32); gSprites[spriteId].oam.priority = priority; - SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1])); gTasks[taskId].data[0] = spriteId; @@ -3253,7 +3246,7 @@ static void sub_815D1BC(u8 taskId) if (++gTasks[taskId].data[12] == 9) { sub_80A749C(&gSprites[spriteId]); - sub_80A8610(&gSprites[spriteId]); + DestroySpriteAndFreeResources_(&gSprites[spriteId]); gTasks[taskId].func = sub_80A6814; } } @@ -3679,7 +3672,7 @@ void sub_815DCA4(u8 taskId) if (!gBattleAnimArgs[1]) DestroyAnimVisualTask(taskId); - + task->data[0] = 0; task->data[1] = 0; task->data[2] = 0; @@ -3801,7 +3794,7 @@ static void sub_815DF64(u8 taskId) BlendPalette(gTasks[taskId].data[2], 16, 8, gUnknown_085CE784[gTasks[taskId].data[0]]); if (++gTasks[taskId].data[0] > 23) gTasks[taskId].data[0] = 0; - + gTasks[taskId].data[1]--; } else @@ -3831,7 +3824,7 @@ void sub_815E01C(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; - + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + gBattleAnimArgs[0]; sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + gBattleAnimArgs[1]; if (gBattleAnimArgs[2] == 0) @@ -3888,11 +3881,11 @@ void sub_815E114(u8 taskId) } if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + sub_80A861C(gBattleAnimAttacker, 0) / 4; + task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4; else - task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) - sub_80A861C(gBattleAnimAttacker, 0) / 4; + task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4; - task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) - sub_80A861C(gBattleAnimAttacker, 0) / 4; + task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4; task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); task->func = sub_815E20C; @@ -4019,7 +4012,7 @@ void sub_815E47C(u8 taskId) task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); - task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + sub_80A861C(gBattleAnimTarget, 0) / 4; + task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT) / 4; task->data[15] = CreateSprite(&gUnknown_085CE84C, task->data[11], task->data[12], GetBattlerSpriteSubpriority(gBattleAnimTarget) - 5); if (task->data[15] != MAX_SPRITES) { @@ -4030,7 +4023,7 @@ void sub_815E47C(u8 taskId) InitAnimArcTranslation(&gSprites[task->data[15]]); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) StartSpriteAffineAnim(&gSprites[task->data[15]], 1); - + task->func = sub_815E5CC; } else @@ -4098,11 +4091,11 @@ void sub_815E6D8(struct Sprite *sprite) if (gBattleAnimArgs[1] == 0) { sprite->oam.matrixNum |= 0x8; - sprite->pos1.x = sub_80A861C(battler, 4) - 8; + sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8; } else { - sprite->pos1.x = sub_80A861C(battler, 5) + 8; + sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) + 8; } sprite->callback = sub_815E784; @@ -4154,9 +4147,12 @@ static void sub_815E784(struct Sprite *sprite) } } -void sub_815E840(u8 taskId) +// Squishes the mon horizontally a few times. +// arg 0: which mon +// arg 1: number of squishes +void AnimTask_SmellingSaltSquish(u8 taskId) { - if (gBattleAnimArgs[0] == 0) + if (gBattleAnimArgs[0] == ANIM_ATTACKER) { DestroyAnimVisualTask(taskId); } @@ -4164,12 +4160,12 @@ void sub_815E840(u8 taskId) { gTasks[taskId].data[0] = gBattleAnimArgs[1]; gTasks[taskId].data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], gUnknown_085CE87C); - gTasks[taskId].func = sub_815E898; + PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], gSmellingSaltSquishAffineAnimCmds); + gTasks[taskId].func = AnimTask_SmellingSaltSquishStep; } } -static void sub_815E898(u8 taskId) +static void AnimTask_SmellingSaltSquishStep(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -4187,7 +4183,7 @@ static void sub_815E898(u8 taskId) gSprites[task->data[15]].pos2.x = 0; if (--task->data[0]) { - PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], gUnknown_085CE87C); + PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], gSmellingSaltSquishAffineAnimCmds); task->data[1] = 0; task->data[2] = 0; } @@ -4198,17 +4194,21 @@ static void sub_815E898(u8 taskId) } } -void sub_815E954(struct Sprite *sprite) +// Blinks an exclamation image over the mon a few times. +// arg 0: which mon +// arg 1: blink delay +// arg 2: number of blinks +void AnimSmellingSaltExclamation(struct Sprite *sprite) { - if (gBattleAnimArgs[0] == 0) + if (gBattleAnimArgs[0] == ANIM_ATTACKER) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - sprite->pos1.y = sub_80A861C(gBattleAnimAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP); } else { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2); - sprite->pos1.y = sub_80A861C(gBattleAnimTarget, 2); + sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP); } if (sprite->pos1.y < 8) @@ -4218,10 +4218,10 @@ void sub_815E954(struct Sprite *sprite) sprite->data[1] = gBattleAnimArgs[1]; sprite->data[2] = 0; sprite->data[3] = gBattleAnimArgs[2]; - sprite->callback = sub_815E9BC; + sprite->callback = AnimSmellingSaltExclamationStep; } -static void sub_815E9BC(struct Sprite *sprite) +static void AnimSmellingSaltExclamationStep(struct Sprite *sprite) { if (++sprite->data[0] >= sprite->data[1]) { @@ -4233,11 +4233,14 @@ static void sub_815E9BC(struct Sprite *sprite) } } -void sub_815EA14(struct Sprite *sprite) +// Claps a hand several times. +// arg 0: which hand +// arg 1: +void AnimHelpingHandClap(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { - sprite->oam.matrixNum |= 0x8; + sprite->oam.matrixNum |= 0x8; // horizontal flip sprite->pos1.x = 100; sprite->data[7] = 1; } @@ -4248,10 +4251,10 @@ void sub_815EA14(struct Sprite *sprite) } sprite->pos1.y = 56; - sprite->callback = sub_815EA60; + sprite->callback = AnimHelpingHandClapStep; } -static void sub_815EA60(struct Sprite *sprite) +static void AnimHelpingHandClapStep(struct Sprite *sprite) { switch (sprite->data[0]) { @@ -4303,7 +4306,7 @@ static void sub_815EA60(struct Sprite *sprite) sprite->pos2.x = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3); if (sprite->data[1] == 15) sprite->oam.tileNum += 16; - + if (sprite->data[1] == 18) { sprite->data[1] = 0; @@ -4334,7 +4337,9 @@ static void sub_815EA60(struct Sprite *sprite) } } -void sub_815EC48(u8 taskId) +// Repeatedly moves the attacking mon in a horizontal lunging motion. +// No args. +void AnimTask_HelpingHandAttackerMovement(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -4363,10 +4368,10 @@ void sub_815EC48(u8 taskId) task->data[14] = 1; } - task->func = sub_815ECE4; + task->func = AnimTask_HelpingHandAttackerMovementStep; } -static void sub_815ECE4(u8 taskId) +static void AnimTask_HelpingHandAttackerMovementStep(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -4448,9 +4453,11 @@ static void sub_815ECE4(u8 taskId) } } -void sub_815EE84(struct Sprite *sprite) +// Moves a magnifying glass around in straight lines. +// arg 0: magnifying glass target mon +void AnimForesightMagnifyingGlass(struct Sprite *sprite) { - if (gBattleAnimArgs[0] == 0) + if (gBattleAnimArgs[0] == ANIM_ATTACKER) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[7] = gBattleAnimAttacker; @@ -4461,14 +4468,14 @@ void sub_815EE84(struct Sprite *sprite) } if (GetBattlerSide(sprite->data[7]) == B_SIDE_OPPONENT) - sprite->oam.matrixNum = 8; + sprite->oam.matrixNum = 8; // horizontal flip sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]); sprite->oam.objMode = ST_OAM_OBJ_BLEND; - sprite->callback = sub_815EF08; + sprite->callback = AnimForesightMagnifyingGlassStep; } -static void sub_815EF08(struct Sprite *sprite) +static void AnimForesightMagnifyingGlassStep(struct Sprite *sprite) { u16 x, y; @@ -4481,20 +4488,20 @@ static void sub_815EF08(struct Sprite *sprite) sprite->data[6] = 0; case 0: case 4: - x = sub_80A861C(sprite->data[7], 5) - 4; - y = sub_80A861C(sprite->data[7], 3) - 4; + x = GetBattlerSpriteCoordAttr(sprite->data[7], 5) - 4; + y = GetBattlerSpriteCoordAttr(sprite->data[7], 3) - 4; break; case 1: - x = sub_80A861C(sprite->data[7], 5) - 4; - y = sub_80A861C(sprite->data[7], 2) + 4; + x = GetBattlerSpriteCoordAttr(sprite->data[7], 5) - 4; + y = GetBattlerSpriteCoordAttr(sprite->data[7], 2) + 4; break; case 2: - x = sub_80A861C(sprite->data[7], 4) + 4; - y = sub_80A861C(sprite->data[7], 3) - 4; + x = GetBattlerSpriteCoordAttr(sprite->data[7], 4) + 4; + y = GetBattlerSpriteCoordAttr(sprite->data[7], 3) - 4; break; case 3: - x = sub_80A861C(sprite->data[7], 4) + 4; - y = sub_80A861C(sprite->data[7], 2) - 4; + x = GetBattlerSpriteCoordAttr(sprite->data[7], 4) + 4; + y = GetBattlerSpriteCoordAttr(sprite->data[7], 2) - 4; break; case 5: x = GetBattlerSpriteCoord(sprite->data[7], 2); @@ -4570,28 +4577,34 @@ static void sub_815EF08(struct Sprite *sprite) } } -static void sub_815F10C(struct Sprite *sprite) +static void AnimMeteorMashStarStep(struct Sprite *sprite) { sprite->pos2.x = ((sprite->data[2] - sprite->data[0]) * sprite->data[5]) / sprite->data[4]; sprite->pos2.y = ((sprite->data[3] - sprite->data[1]) * sprite->data[5]) / sprite->data[4]; if (!(sprite->data[5] & 1)) { CreateSprite( - &gUnknown_085CE3A0, + &gMiniTwinklingStarSpriteTemplate, sprite->pos1.x + sprite->pos2.x, sprite->pos1.y + sprite->pos2.y, 5); } - + if (sprite->data[5] == sprite->data[4]) DestroyAnimSprite(sprite); sprite->data[5]++; } -void sub_815F18C(struct Sprite *sprite) +// Moves a shooting star across the screen that leaves little twinkling stars behind its path. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: destination x pixel offset +// arg 3: destination y pixel offset +// arg 4: duration +void AnimMeteorMashStar(struct Sprite *sprite) { - GetBattlerSpriteCoord(gBattleAnimTarget, 2); // unused local variable - GetBattlerSpriteCoord(gBattleAnimTarget, 3); // unused local variable + s16 y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); // unused local variable + s16 x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); // unused local variable if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER || IsContest()) { @@ -4609,13 +4622,13 @@ void sub_815F18C(struct Sprite *sprite) sprite->data[4] = gBattleAnimArgs[4]; sprite->pos1.x = sprite->data[0]; sprite->pos1.y = sprite->data[1]; - sprite->callback = sub_815F10C; + sprite->callback = AnimMeteorMashStarStep; } void AnimTask_MonToSubstitute(u8 taskId) { int i; - u8 spriteId = GetAnimBattlerSpriteId(0); + u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); if (gTasks[taskId].data[0] == 0) { @@ -4648,12 +4661,12 @@ void AnimTask_MonToSubstitute(u8 taskId) for (i = 0; i < 16; i++) gTasks[taskId].data[i] = 0; - - gTasks[taskId].func = sub_815F330; + + gTasks[taskId].func = AnimTask_MonToSubstituteDoll; } } -static void sub_815F330(u8 taskId) +static void AnimTask_MonToSubstituteDoll(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); @@ -4706,27 +4719,29 @@ static void sub_815F330(u8 taskId) } } -void sub_815F48C(struct Sprite *sprite) +// Moves down an X that flickers and disappears. +// No args. +void AnimBlockX(struct Sprite *sprite) { - s16 y2; + s16 y; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 2; - y2 = -144; + y = -144; } else { sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 2; - y2 = -96; + y = -96; } sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3); - sprite->pos2.y = y2; - sprite->callback = sub_815F4F0; + sprite->pos2.y = y; + sprite->callback = AnimBlockXStep; } -static void sub_815F4F0(struct Sprite *sprite) +static void AnimBlockXStep(struct Sprite *sprite) { switch (sprite->data[0]) { @@ -4742,7 +4757,7 @@ static void sub_815F4F0(struct Sprite *sprite) case 1: sprite->data[1] += 4; sprite->pos2.y = -(gSineTable[sprite->data[1]] >> 3); - if (sprite->data[1] > 127) + if (sprite->data[1] > 0x7F) { PlaySE12WithPanning(SE_W166, BattleAnimAdjustPanning(63)); sprite->data[1] = 0; @@ -4753,7 +4768,7 @@ static void sub_815F4F0(struct Sprite *sprite) case 2: sprite->data[1] += 6; sprite->pos2.y = -(gSineTable[sprite->data[1]] >> 4); - if (sprite->data[1] > 127) + if (sprite->data[1] > 0x7F) { sprite->data[1] = 0; sprite->pos2.y = 0; @@ -4781,7 +4796,9 @@ static void sub_815F4F0(struct Sprite *sprite) } } -void sub_815F620(u8 taskId) +// Quickly moves two clones of the target mon back and forth. +// No args. +void AnimTask_OdorSleuthMovement(u8 taskId) { s16 spriteId1, spriteId2; @@ -4837,21 +4854,20 @@ void sub_815F620(u8 taskId) gSprites[spriteId1].invisible = 1; } - gSprites[spriteId2].oam.objMode = ST_OAM_OBJ_NORMAL; gSprites[spriteId1].oam.objMode = ST_OAM_OBJ_NORMAL; - gSprites[spriteId2].callback = sub_815F7C4; - gSprites[spriteId1].callback = sub_815F7C4; - gTasks[taskId].func = sub_815F79C; + gSprites[spriteId2].callback = MoveOdorSleuthClone; + gSprites[spriteId1].callback = MoveOdorSleuthClone; + gTasks[taskId].func = AnimTask_OdorSleuthMovementWaitFinish; } -static void sub_815F79C(u8 taskId) +static void AnimTask_OdorSleuthMovementWaitFinish(u8 taskId) { if (gTasks[taskId].data[0] == 0) DestroyAnimVisualTask(taskId); } -static void sub_815F7C4(struct Sprite *sprite) +static void MoveOdorSleuthClone(struct Sprite *sprite) { int zero = 0; if (++sprite->data[1] > 1) @@ -4887,3 +4903,492 @@ static void sub_815F7C4(struct Sprite *sprite) break; } } + +void AnimTask_GetReturnPowerLevel(u8 taskId) +{ + gBattleAnimArgs[7] = 0; + if (gAnimFriendship < 60) + gBattleAnimArgs[7] = 0; + if (gAnimFriendship > 60 && gAnimFriendship < 92) + gBattleAnimArgs[7] = 1; + if (gAnimFriendship > 91 && gAnimFriendship < 201) + gBattleAnimArgs[7] = 2; + if (gAnimFriendship > 200) + gBattleAnimArgs[7] = 3; + + DestroyAnimVisualTask(taskId); +} + +// Makes the mon run out of screen, run past the opposing mon, and return to its original position. +// No args. +void AnimTask_SnatchOpposingMonMove(u8 taskId) +{ + u8 spriteId, spriteId2; + int personality; + int otId; + u16 species; + u8 subpriority; + u8 isBackPic; + s16 x; + + switch (gTasks[taskId].data[0]) + { + case 0: + spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); + gTasks[taskId].data[1] += 0x800; + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) + gSprites[spriteId].pos2.x += (gTasks[taskId].data[1] >> 8); + else + gSprites[spriteId].pos2.x -= (gTasks[taskId].data[1] >> 8); + + gTasks[taskId].data[1] &= 0xFF; + x = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; + if ((u16)(x + 32) > 304) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + break; + case 1: + if (IsContest()) + { + personality = gContestResources->field_18->unk8; + otId = gContestResources->field_18->unkC; + species = gContestResources->field_18->species; + subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker); + isBackPic = 0; + x = -32; + } + else + { + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) + { + personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY); + otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID); + if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE) + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); + else + species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies; + + subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1; + isBackPic = 0; + x = 272; + } + else + { + personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY); + otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID); + if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); + else + species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies; + + subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority - 1; + isBackPic = 1; + x = -32; + } + } + + spriteId2 = sub_80A8394(species, isBackPic, 0, x, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y), subpriority, personality, otId, gBattleAnimAttacker, 0); + if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies != SPECIES_NONE) + BlendPalette((gSprites[spriteId2].oam.paletteNum * 16) | 0x100, 16, 6, RGB_WHITE); + + gTasks[taskId].data[15] = spriteId2; + gTasks[taskId].data[0]++; + break; + case 2: + spriteId2 = gTasks[taskId].data[15]; + gTasks[taskId].data[1] += 0x800; + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) + gSprites[spriteId2].pos2.x -= (gTasks[taskId].data[1] >> 8); + else + gSprites[spriteId2].pos2.x += (gTasks[taskId].data[1] >> 8); + + gTasks[taskId].data[1] &= 0xFF; + x = gSprites[spriteId2].pos1.x + gSprites[spriteId2].pos2.x; + if (gTasks[taskId].data[14] == 0) + { + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) + { + if (x < GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X)) + { + gTasks[taskId].data[14]++; + gBattleAnimArgs[7] = 0xFFFF; + } + } + else + { + if (x > GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X)) + { + gTasks[taskId].data[14]++; + gBattleAnimArgs[7] = 0xFFFF; + } + } + } + + if ((u16)(x + 32) > 304) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + } + break; + case 3: + spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); + spriteId2 = gTasks[taskId].data[15]; + DestroySpriteAndFreeResources_(&gSprites[spriteId2]); + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) + gSprites[spriteId].pos2.x = -gSprites[spriteId].pos1.x - 32; + else + gSprites[spriteId].pos2.x = 272 - gSprites[spriteId].pos1.x; + + gTasks[taskId].data[0]++; + break; + case 4: + spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); + gTasks[taskId].data[1] += 0x800; + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) + { + gSprites[spriteId].pos2.x += (gTasks[taskId].data[1] >> 8); + if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x >= GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X)) + gSprites[spriteId].pos2.x = 0; + } + else + { + gSprites[spriteId].pos2.x -= (gTasks[taskId].data[1] >> 8); + if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x <= GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X)) + gSprites[spriteId].pos2.x = 0; + } + + gTasks[taskId].data[1] = (u8)gTasks[taskId].data[1]; + if (gSprites[spriteId].pos2.x == 0) + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_815FE80(struct Sprite *sprite) +{ + switch (sprite->data[7]) + { + case 0: + if (gBattleAnimArgs[7] == -1) + { + PlaySE12WithPanning(SE_W233, BattleAnimAdjustPanning(63)); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 16; + sprite->data[0] = -32; + sprite->data[7]++; + sprite->invisible = 0; + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT && !IsContest()) + sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority - 1; + } + else + { + sprite->invisible = 1; + } + break; + case 1: + sprite->pos2.y = Sin(sprite->data[1], sprite->data[0]); + sprite->data[1] += 5; + if (sprite->data[1] > 0x7F) + { + sprite->data[0] = sprite->data[0] / 2; + sprite->data[3]++; + sprite->data[1] -= 0x7F; + } + + sprite->data[2] += 0x100; + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) + sprite->pos2.x -= (sprite->data[2] >> 8); + else + sprite->pos2.x += (sprite->data[2] >> 8); + + sprite->data[2] &= 0xFF; + if (sprite->data[3] == 2) + DestroyAnimSprite(sprite); + break; + } +} + +// Quickly moves the mon towards its partner and back. +// No args. +void AnimTask_SnatchPartnerMove(u8 taskId) +{ + s16 attackerX, targetX; + u8 spriteId; + + switch (gTasks[taskId].data[15]) + { + case 0: + attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); + targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); + gTasks[taskId].data[0] = 6; + if (attackerX > targetX) + gTasks[taskId].data[0] *= -1; + + gTasks[taskId].data[1] = attackerX; + gTasks[taskId].data[2] = targetX; + gTasks[taskId].data[15]++; + break; + case 1: + spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; + gSprites[spriteId].pos2.x += gTasks[taskId].data[0]; + if (gTasks[taskId].data[0] > 0) + { + if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x >= gTasks[taskId].data[2]) + gTasks[taskId].data[15]++; + } + else + { + if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x <= gTasks[taskId].data[2]) + gTasks[taskId].data[15]++; + } + break; + case 2: + gTasks[taskId].data[0] *= -1; + gTasks[taskId].data[15]++; + break; + case 3: + spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; + gSprites[spriteId].pos2.x += gTasks[taskId].data[0]; + if (gTasks[taskId].data[0] < 0) + { + if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x <= gTasks[taskId].data[1]) + gTasks[taskId].data[15]++; + } + else + { + if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x >= gTasks[taskId].data[1]) + gTasks[taskId].data[15]++; + } + break; + case 4: + default: + spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; + gSprites[spriteId].pos2.x = 0; + DestroyAnimVisualTask(taskId); + break; + } +} + +// Moves the mon's sprite back and forth in an unpredictable swaying motion. +// No args. +void AnimTask_TeeterDanceMovement(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + task->data[3] = GetAnimBattlerSpriteId(ANIM_ATTACKER); + task->data[4] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : -1; + task->data[6] = gSprites[task->data[3]].pos1.y; + task->data[5] = gSprites[task->data[3]].pos1.x; + task->data[9] = 0; + task->data[11] = 0; + task->data[10] = 1; + task->data[12] = 0; + task->func = AnimTask_TeeterDanceMovementStep; +} + +static void AnimTask_TeeterDanceMovementStep(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + switch (task->data[0]) + { + case 0: + task->data[11] += 8; + task->data[11] &= 0xFF; + gSprites[task->data[3]].pos2.x = gSineTable[task->data[11]] >> 5; + task->data[9] += 2; + task->data[9] &= 0xFF; + gSprites[task->data[3]].pos1.x = (gSineTable[task->data[9]] >> 3) * task->data[4] + task->data[5]; + if (task->data[9] == 0) + { + gSprites[task->data[3]].pos1.x = task->data[5]; + task->data[0]++; + } + break; + case 1: + task->data[11] += 8; + task->data[11] &= 0xFF; + gSprites[task->data[3]].pos2.x = gSineTable[task->data[11]] >> 5; + if (task->data[11] == 0) + { + gSprites[task->data[3]].pos2.x = 0; + task->data[0]++; + } + break; + case 2: + DestroyAnimVisualTask(taskId); + break; + } +} + +static void AnimKnockOffStrikeStep(struct Sprite *sprite) +{ + // These two cases are identical. + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) + { + sprite->data[1] += sprite->data[0]; + sprite->data[1] &= 0xFF; + } + else + { + sprite->data[1] += sprite->data[0]; + sprite->data[1] &= 0xFF; + } + + sprite->pos2.x = Cos(sprite->data[1], 20); + sprite->pos2.y = Sin(sprite->data[1], 20); + if (sprite->animEnded) + DestroyAnimSprite(sprite); + + sprite->data[2]++; +} + +// Animates a strike that swipes downard at the target mon. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +void AnimKnockOffStrike(struct Sprite *sprite) +{ + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) + { + sprite->pos1.x -= gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data[0] = -11; + sprite->data[1] = 192; + StartSpriteAffineAnim(sprite, 1); + } + else + { + sprite->data[0] = 11; + sprite->data[1] = 192; + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + } + + sprite->callback = AnimKnockOffStrikeStep; +} + +// Gradually fades a rotating recyle arrow sprite in and back out. +// No args. +void AnimRecycle(struct Sprite *sprite) +{ + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); + sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP); + if (sprite->pos1.y < 16) + sprite->pos1.y = 16; + + sprite->data[6] = 0; + sprite->data[7] = 16; + sprite->callback = AnimRecycleStep; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7])); +} + +static void AnimRecycleStep(struct Sprite *sprite) +{ + switch (sprite->data[2]) + { + case 0: + if (++sprite->data[0] > 1) + { + sprite->data[0] = 0; + if (!(sprite->data[1] & 1)) + { + if (sprite->data[6] < 16) + sprite->data[6]++; + } + else + { + if (sprite->data[7] != 0) + sprite->data[7]--; + } + + sprite->data[1]++; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7])); + if (sprite->data[7] == 0) + sprite->data[2]++; + } + break; + case 1: + if (++sprite->data[0] == 10) + { + sprite->data[0] = 0; + sprite->data[1] = 0; + sprite->data[2]++; + } + break; + case 2: + if (++sprite->data[0] > 1) + { + sprite->data[0] = 0; + if (!(sprite->data[1] & 1)) + { + if (sprite->data[6] != 0) + sprite->data[6]--; + } + else + { + if (sprite->data[7] < 16) + sprite->data[7]++; + } + + sprite->data[1]++; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7])); + if (sprite->data[7] == 16) + sprite->data[2]++; + } + break; + case 3: + DestroySpriteAndMatrix(sprite); + break; + } +} + +void AnimTask_GetWeather(u8 taskId) +{ + gBattleAnimArgs[7] = ANIM_WEATHER_NONE; + if (gWeatherMoveAnim & WEATHER_SUN_ANY) + gBattleAnimArgs[7] = ANIM_WEATHER_SUN; + else if (gWeatherMoveAnim & WEATHER_RAIN_ANY) + gBattleAnimArgs[7] = ANIM_WEATHER_RAIN; + else if (gWeatherMoveAnim & WEATHER_SANDSTORM_ANY) + gBattleAnimArgs[7] = ANIM_WEATHER_SANDSTORM; + else if (gWeatherMoveAnim & WEATHER_HAIL_ANY) + gBattleAnimArgs[7] = ANIM_WEATHER_HAIL; + + DestroyAnimVisualTask(taskId); +} + +// Squishes the mon sprite vertically, and shakes it back and forth. +// arg 0: which battler +void AnimTask_SlackOffSquish(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + task->data[0] = 0; + task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); + PrepareAffineAnimInTaskData(task, task->data[15], gSlackOffSquishAffineAnimCmds); + task->func = AnimTask_SlackOffSquishStep; +} + +static void AnimTask_SlackOffSquishStep(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + gTasks[taskId].data[0]++; + if (gTasks[taskId].data[0] > 16 && gTasks[taskId].data[0] < 40) + { + if (++task->data[1] > 2) + { + task->data[1] = 0; + task->data[2]++; + if (!(task->data[2] & 1)) + gSprites[task->data[15]].pos2.x = -1; + else + gSprites[task->data[15]].pos2.x = 1; + } + } + else + { + gSprites[task->data[15]].pos2.x = 0; + } + + if (!RunAffineAnimFromTaskData(&gTasks[taskId])) + DestroyAnimVisualTask(taskId); +} diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index f99b1aeac..c9d9bb99c 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -767,7 +767,7 @@ void sub_81177E4(u8 taskId) DestroyAnimVisualTask(taskId); } -void sub_8117854(u8 taskId, int unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u8 *arg8, const u8 *arg9, const u16 *palette) +void sub_8117854(u8 taskId, int unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u32 *arg8, const u32 *arg9, const u32 *palette) { u16 species; u8 spriteId, spriteId2; diff --git a/src/battle_arena.c b/src/battle_arena.c index cd2c976da..cfcb10a0d 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -8,6 +8,7 @@ #include "decompress.h" #include "event_data.h" #include "frontier_util.h" +#include "graphics.h" #include "gpu_regs.h" #include "item.h" #include "m4a.h" @@ -23,9 +24,6 @@ #include "constants/battle_frontier.h" #include "constants/moves.h" -extern const u32 gUnknown_08D854E8[]; -extern const u16 gUnknown_08D855E8[]; - // This file's functions. static void sub_81A58B4(void); static void sub_81A5964(void); @@ -499,7 +497,7 @@ u8 BattleArena_ShowJudgmentWindow(u8 *state) case 0: BeginNormalPaletteFade(0x7FFFFF1C, 4, 0, 8, 0); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); - LoadCompressedObjectPic(gUnknown_08611F74); + LoadCompressedSpriteSheet(gUnknown_08611F74); LoadCompressedPalette(gUnknown_08D855E8, 0x1F0, 0x20); gBattle_WIN0H = 0xFF; gBattle_WIN0V = 0x70; @@ -784,7 +782,7 @@ static void sub_81A58B4(void) if (!isCurrent) gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = 0; - saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); gTrainerBattleOpponent_A = 0; } diff --git a/src/battle_bg.c b/src/battle_bg.c index bb66a41fd..a072a2cda 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -11,6 +11,7 @@ #include "link.h" #include "main.h" #include "menu.h" +#include "overworld.h" #include "palette.h" #include "sound.h" #include "sprite.h" @@ -31,8 +32,6 @@ struct BattleBackground const void *palette; }; -extern u8 GetCurrentMapBattleScene(void); - // .rodata static const u16 sUnrefArray[] = {0x0300, 0x0000}; //OamData? @@ -1093,7 +1092,7 @@ void DrawBattleEntryBackground(void) LZDecompressVram(gUnknown_08D778F0, (void*)(VRAM + 0x4000)); LZDecompressVram(gUnknown_08D77B0C, (void*)(VRAM + 0x10000)); LoadCompressedPalette(gUnknown_08D77AE4, 0x60, 0x20); - SetBgAttribute(1, BG_CTRL_ATTR_MAPBASEINDEX, 1); + SetBgAttribute(1, BG_ATTR_SCREENSIZE, 1); SetGpuReg(REG_OFFSET_BG1CNT, 0x5C04); CopyToBgTilemapBuffer(1, gUnknown_08D779D8, 0, 0); CopyToBgTilemapBuffer(2, gUnknown_08D779D8, 0, 0); @@ -1103,7 +1102,7 @@ void DrawBattleEntryBackground(void) SetGpuReg(REG_OFFSET_WINOUT, 0x36); gBattle_BG1_Y = 0xFF5C; gBattle_BG2_Y = 0xFF5C; - LoadCompressedObjectPicUsingHeap(&gUnknown_0831AA00); + LoadCompressedSpriteSheetUsingHeap(&gUnknown_0831AA00); } else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER)) { @@ -1114,8 +1113,8 @@ void DrawBattleEntryBackground(void) } else { - SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 2); - SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 2); + SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 2); + SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 2); CopyToBgTilemapBuffer(1, gUnknown_08D857A8, 0, 0); CopyToBgTilemapBuffer(2, gUnknown_08D85A1C, 0, 0); CopyBgTilemapBufferToVram(1); diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index e81035fc7..33f557388 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -6,6 +6,7 @@ #include "battle_interface.h" #include "battle_message.h" #include "battle_setup.h" +#include "battle_tower.h" #include "battle_tv.h" #include "bg.h" #include "data2.h" @@ -33,7 +34,6 @@ extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon); extern void sub_81851A8(u8 *); extern u16 sub_8068B48(void); -extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId); // this file's functions static void LinkOpponentHandleGetMonData(void); @@ -581,7 +581,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst) case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { battleMon.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); @@ -628,7 +628,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_MOVES_PP_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { moveData.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); @@ -648,7 +648,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_PP_DATA_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); size++; @@ -913,7 +913,7 @@ static void SetLinkOpponentMonData(u8 monId) SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); @@ -952,7 +952,7 @@ static void SetLinkOpponentMonData(u8 monId) SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 533ec39de..78c2c409d 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -6,6 +6,7 @@ #include "battle_interface.h" #include "battle_message.h" #include "battle_setup.h" +#include "battle_tower.h" #include "battle_tv.h" #include "bg.h" #include "data2.h" @@ -31,7 +32,6 @@ extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[]; extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon); extern void sub_81851A8(u8 *); -extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId); // this file's functions static void LinkPartnerHandleGetMonData(void); @@ -466,7 +466,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst) case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); @@ -513,7 +513,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_MOVES_PP_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); @@ -533,7 +533,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_PP_DATA_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); size++; @@ -798,7 +798,7 @@ static void SetLinkPartnerMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); @@ -837,7 +837,7 @@ static void SetLinkPartnerMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 30aa3217b..4e600ea71 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -564,7 +564,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst) case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { battleMon.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); @@ -611,7 +611,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_MOVES_PP_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { moveData.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); @@ -631,7 +631,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_PP_DATA_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); size++; @@ -905,7 +905,7 @@ static void SetOpponentMonData(u8 monId) SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); @@ -944,7 +944,7 @@ static void SetOpponentMonData(u8 monId) SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 2d8fba63a..12ffca381 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -34,9 +34,6 @@ #include "constants/songs.h" #include "constants/trainers.h" -extern u8 gUnknown_0203CEE8; -extern u8 gUnknown_0203CEE9; -extern u8 gUnknown_0203CF00[]; extern struct MusicPlayerInfo gMPlayInfo_BGM; extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; @@ -406,7 +403,7 @@ static void HandleInputChooseTarget(void) do { if (--i < 0) - i = 4; // UB: array out of range + i = MAX_BATTLERS_COUNT; // UB: array out of range gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]); } while (gMultiUsePlayerCursor == gBattlersCount); @@ -707,7 +704,7 @@ static void HandleMoveSwitching(void) MoveSelectionDisplayMoveNames(); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) perMovePPBonuses[i] = (gBattleMons[gActiveBattler].ppBonuses & (3 << (i * 2))) >> (i * 2); totalPPBonuses = perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]]; @@ -715,12 +712,12 @@ static void HandleMoveSwitching(void) perMovePPBonuses[gMultiUsePlayerCursor] = totalPPBonuses; totalPPBonuses = 0; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) totalPPBonuses |= perMovePPBonuses[i] << (i * 2); gBattleMons[gActiveBattler].ppBonuses = totalPPBonuses; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { gBattleMons[gActiveBattler].moves[i] = moveInfo->moves[i]; gBattleMons[gActiveBattler].pp[i] = moveInfo->currentPp[i]; @@ -728,14 +725,14 @@ static void HandleMoveSwitching(void) if (!(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) { - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { moveStruct.moves[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i); moveStruct.currentPp[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP1 + i); } totalPPBonuses = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP_BONUSES); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) perMovePPBonuses[i] = (totalPPBonuses & (3 << (i * 2))) >> (i * 2); i = moveStruct.moves[gMoveSelectionCursor[gActiveBattler]]; @@ -751,10 +748,10 @@ static void HandleMoveSwitching(void) perMovePPBonuses[gMultiUsePlayerCursor] = totalPPBonuses; totalPPBonuses = 0; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) totalPPBonuses |= perMovePPBonuses[i] << (i * 2); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i, &moveStruct.moves[i]); SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP1 + i, &moveStruct.currentPp[i]); @@ -872,7 +869,7 @@ static void sub_80586F8(void) } else { - if (sub_800A520()) + if (IsLinkTaskFinished()) { m4aSongNumStop(SE_HINSI); gMain.inBattle = 0; @@ -891,7 +888,7 @@ void sub_80587B0(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - if (sub_800A520()) + if (IsLinkTaskFinished()) { if (gWirelessCommType == 0) sub_800AC34(); @@ -1449,7 +1446,7 @@ static void MoveSelectionDisplayMoveNames(void) struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]); gNumberOfMovesToChoose = 0; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { MoveSelectionDestroyCursorAt(i); StringCopy(gDisplayedStringBattle, gMoveNames[moveInfo->moves[i]]); @@ -1612,7 +1609,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst) case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); @@ -1659,7 +1656,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_MOVES_PP_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); @@ -1679,7 +1676,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_PP_DATA_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); size++; @@ -1953,7 +1950,7 @@ static void SetPlayerMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); @@ -1992,7 +1989,7 @@ static void SetPlayerMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 22018add4..ddb241b30 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -653,7 +653,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst) case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); @@ -700,7 +700,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_MOVES_PP_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); @@ -720,7 +720,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_PP_DATA_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); size++; @@ -985,7 +985,7 @@ static void SetPlayerPartnerMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); @@ -1024,7 +1024,7 @@ static void SetPlayerPartnerMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 1cf780264..b1b271bac 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -564,7 +564,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { battleMon.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); @@ -611,7 +611,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_MOVES_PP_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { moveData.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); @@ -631,7 +631,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_PP_DATA_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); size++; @@ -896,7 +896,7 @@ static void SetRecordedOpponentMonData(u8 monId) SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); @@ -935,7 +935,7 @@ static void SetRecordedOpponentMonData(u8 monId) SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index a788d6be3..301c1f009 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -547,7 +547,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst) case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); @@ -594,7 +594,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_MOVES_PP_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); @@ -614,7 +614,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_PP_DATA_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); size++; @@ -879,7 +879,7 @@ static void SetRecordedPlayerMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); @@ -918,7 +918,7 @@ static void SetRecordedPlayerMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index c0b496e47..ac3604054 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -463,7 +463,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) case REQUEST_ALL_BATTLE: battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); @@ -510,7 +510,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_MOVES_PP_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) { moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); @@ -530,7 +530,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) size = 2; break; case REQUEST_PP_DATA_BATTLE: - for (size = 0; size < 4; size++) + for (size = 0; size < MAX_MON_MOVES; size++) dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); size++; @@ -795,7 +795,7 @@ static void SetWallyMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species); SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); @@ -834,7 +834,7 @@ static void SetWallyMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); diff --git a/src/battle_controllers.c b/src/battle_controllers.c index a6d6e9294..70a53f332 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -6,6 +6,7 @@ #include "battle_message.h" #include "cable_club.h" #include "link.h" +#include "party_menu.h" #include "pokemon.h" #include "recorded_battle.h" #include "task.h" @@ -19,8 +20,6 @@ static EWRAM_DATA u8 sUnknown_02022D0A = 0; EWRAM_DATA struct UnusedControllerStruct gUnknown_02022D0C = {}; static EWRAM_DATA u8 sBattleBuffersTransferData[0x100] = {}; -extern void sub_81B8D64(u8 battlerId, u8 arg1); // party_menu - // this file's funcionts static void CreateTasksForSendRecvLinkBuffers(void); static void InitLinkBtlControllers(void); @@ -143,7 +142,7 @@ static void InitSinglePlayerBtlControllers(void) gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; } - gBattlersCount = 4; + gBattlersCount = MAX_BATTLERS_COUNT; sub_81B8D64(0, 0); sub_81B8D64(1, 0); @@ -226,7 +225,7 @@ static void InitSinglePlayerBtlControllers(void) gBattlerControllerFuncs[3] = SetControllerToOpponent; gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; - gBattlersCount = 4; + gBattlersCount = MAX_BATTLERS_COUNT; if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) { @@ -246,7 +245,7 @@ static void InitSinglePlayerBtlControllers(void) gBattlerControllerFuncs[3] = SetControllerToOpponent; gBattlerPositions[3] = 3; - gBattlersCount = 4; + gBattlersCount = MAX_BATTLERS_COUNT; sub_81B8D64(0, 0); sub_81B8D64(1, 0); @@ -432,7 +431,7 @@ static void InitLinkBtlControllers(void) gBattlerControllerFuncs[3] = SetControllerToLinkOpponent; gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; - gBattlersCount = 4; + gBattlersCount = MAX_BATTLERS_COUNT; } else { @@ -448,7 +447,7 @@ static void InitLinkBtlControllers(void) gBattlerControllerFuncs[2] = SetControllerToLinkOpponent; gBattlerPositions[2] = B_POSITION_OPPONENT_RIGHT; - gBattlersCount = 4; + gBattlersCount = MAX_BATTLERS_COUNT; } } else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) @@ -469,7 +468,7 @@ static void InitLinkBtlControllers(void) gBattlerControllerFuncs[3] = SetControllerToOpponent; gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; - gBattlersCount = 4; + gBattlersCount = MAX_BATTLERS_COUNT; } else { @@ -485,7 +484,7 @@ static void InitLinkBtlControllers(void) gBattlerControllerFuncs[3] = SetControllerToLinkOpponent; gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; - gBattlersCount = 4; + gBattlersCount = MAX_BATTLERS_COUNT; } sub_81B8D64(0, 0); @@ -575,7 +574,7 @@ static void InitLinkBtlControllers(void) } } - gBattlersCount = 4; + gBattlersCount = MAX_BATTLERS_COUNT; } } @@ -801,7 +800,7 @@ static void Task_HandleSendLinkBuffersData(u8 taskId) } break; case 4: - if (sub_800A520()) + if (IsLinkTaskFinished()) { blockSize = gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_LO] | (gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_HI] << 8); gTasks[taskId].data[13] = 1; diff --git a/src/battle_dome.c b/src/battle_dome.c index 514b57c97..00ae84d09 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -19,6 +19,7 @@ #include "window.h" #include "palette.h" #include "decompress.h" +#include "party_menu.h" #include "menu.h" #include "sound.h" #include "pokemon_icon.h" @@ -57,12 +58,6 @@ struct UnkStruct_860DD10 u16 src; }; -extern void sub_81B8558(void); - -extern u8 gSelectedOrderFromParty[]; - -extern const struct SpriteTemplate gUnknown_0860CFA8; - // text extern const u8 gTrainerClassNames[][0xD]; @@ -2393,7 +2388,7 @@ static void sub_818E9CC(void) if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860D0EC[battleMode][lvlMode])) gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode] = 0; - saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); gTrainerBattleOpponent_A = 0; } @@ -2559,7 +2554,7 @@ static void InitDomeTrainers(void) for (i = 0; i < 3; i++) { gSaveBlock2Ptr->frontier.domeMonIds[0][i] = GetMonData(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_SPECIES, NULL); - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) gSaveBlock2Ptr->frontier.field_EFC[i].moves[j] = GetMonData(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_MOVE1 + j, NULL); for (j = 0; j < 6; j++) gSaveBlock2Ptr->frontier.field_EFC[i].evs[j] = GetMonData(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_HP_EV + j, NULL); @@ -2819,7 +2814,7 @@ static void CreateDomeMon(u8 monPartyId, u16 tournamentTrainerId, u8 tournamentM gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].evSpread, otId); happiness = 0xFF; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonMoveSlot(&gEnemyParty[monPartyId], gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].moves[i], i); @@ -2894,7 +2889,7 @@ static s32 sub_818FCBC(u16 tournamentTrainerId, bool8 arg1) for (i = 0; i < 3; i++) { array[i] = 0; - for (moveId = 0; moveId < 4; moveId++) + for (moveId = 0; moveId < MAX_MON_MOVES; moveId++) { for (playerMonId = 0; playerMonId < 3; playerMonId++) { @@ -2922,7 +2917,7 @@ static s32 sub_818FDB8(u16 tournamentTrainerId, bool8 arg1) for (i = 0; i < 3; i++) { array[i] = 0; - for (moveId = 0; moveId < 4; moveId++) + for (moveId = 0; moveId < MAX_MON_MOVES; moveId++) { for (playerMonId = 0; playerMonId < 3; playerMonId++) { @@ -3536,7 +3531,7 @@ static void sub_8190400(u8 taskId) DecompressAndLoadBgGfxUsingHeap(2, gUnknown_08D83D50, 0x2000, 0, 0); DecompressAndLoadBgGfxUsingHeap(2, gUnknown_08D84970, 0x2000, 0, 1); DecompressAndLoadBgGfxUsingHeap(3, gUnknown_08D84F00, 0x800, 0, 1); - LoadCompressedObjectPic(gUnknown_0860CF50); + LoadCompressedSpriteSheet(gUnknown_0860CF50); LoadCompressedPalette(gUnknown_08D85358, 0, 0x200); LoadCompressedPalette(gUnknown_08D85444, 0x100, 0x200); LoadCompressedPalette(gUnknown_08D85600, 0xF0, 0x20); @@ -4853,7 +4848,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId) for (i = 0; i < 3; i++) { - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { for (k = 0; k < DOME_TOURNAMENT_TRAINERS_COUNT; k++) { @@ -5543,8 +5538,9 @@ static u16 GetWinningMove(s32 winnerTournamentId, s32 loserTournamentId, u8 roun // Calc move points of all 4 moves for all 3 pokemon hitting all 3 target mons. for (i = 0; i < 3; i++) { - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { + // TODO: Clean this up, looks like a different data structure moveScores[i * 4 + j] = 0; if (gSaveBlock2Ptr->frontier.domeTrainers[winnerTournamentId].trainerId == TRAINER_FRONTIER_BRAIN) moveIds[i * 4 + j] = GetFrontierBrainMonMove(i, j); @@ -5605,7 +5601,7 @@ static u16 GetWinningMove(s32 winnerTournamentId, s32 loserTournamentId, u8 roun goto LABEL; while (j != 0) { - for (j = 0, k = 0; k < 4 * 3; k++) + for (j = 0, k = 0; k < MAX_MON_MOVES * 3; k++) { if (bestScore < moveScores[k]) { @@ -5632,7 +5628,7 @@ static u16 GetWinningMove(s32 winnerTournamentId, s32 loserTournamentId, u8 roun moveScores[j] = 0; bestScore = 0; j = 0; - for (k = 0; k < 4 * 3; k++) + for (k = 0; k < MAX_MON_MOVES * 3; k++) j += moveScores[k]; } } @@ -5707,7 +5703,7 @@ static void sub_8194220(u8 taskId) gTasks[taskId].data[0]++; break; case 3: - LoadCompressedObjectPic(gUnknown_0860CF50); + LoadCompressedSpriteSheet(gUnknown_0860CF50); if (r10 == 0) { for (i = 0; i < (unsigned) 31; i++) @@ -6064,16 +6060,16 @@ static void sub_8194D68(void) s32 playerMonId = gSaveBlock2Ptr->frontier.selectedPartyMons[gSelectedOrderFromParty[i] - 1] - 1; s32 count; - for (moveSlot = 0; moveSlot < 4; moveSlot++) + for (moveSlot = 0; moveSlot < MAX_MON_MOVES; moveSlot++) { count = 0; - while (count < 4) + while (count < MAX_MON_MOVES) { if (GetMonData(&gSaveBlock1Ptr->playerParty[playerMonId], MON_DATA_MOVE1 + count, NULL) == GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + moveSlot, NULL)) break; count++; } - if (count == 4) + if (count == MAX_MON_MOVES) SetMonMoveSlot(&gPlayerParty[i], MOVE_SKETCH, moveSlot); } @@ -6326,7 +6322,7 @@ static void DecideRoundWinners(u8 roundId) // Calculate points for both trainers. for (monId1 = 0; monId1 < 3; monId1++) { - for (moveSlot = 0; moveSlot < 4; moveSlot++) + for (moveSlot = 0; moveSlot < MAX_MON_MOVES; moveSlot++) { for (monId2 = 0; monId2 < 3; monId2++) { @@ -6349,7 +6345,7 @@ static void DecideRoundWinners(u8 roundId) for (monId1 = 0; monId1 < 3; monId1++) { - for (moveSlot = 0; moveSlot < 4; moveSlot++) + for (moveSlot = 0; moveSlot < MAX_MON_MOVES; moveSlot++) { for (monId2 = 0; monId2 < 3; monId2++) { diff --git a/src/battle_factory.c b/src/battle_factory.c index 801b33ba7..0445d5dea 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -1,4 +1,5 @@ #include "global.h" +#include "battle.h" #include "battle_factory.h" #include "battle_factory_screen.h" #include "event_data.h" @@ -201,7 +202,7 @@ static void sub_81A5E94(void) for (i = 0; i < 3; i++) gUnknown_03006298[i] |= 0xFFFF; - saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); gTrainerBattleOpponent_A = 0; } @@ -433,7 +434,7 @@ static void sub_81A64C4(void) CalculateMonStats(&gPlayerParty[i]); friendship = 0; - for (k = 0; k < 4; k++) + for (k = 0; k < MAX_MON_MOVES; k++) SetMonMoveAvoidReturn(&gPlayerParty[i], gFacilityTrainerMons[monSetId].moves[k], k); SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &friendship); SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); @@ -473,7 +474,7 @@ static void sub_81A64C4(void) } CalculateMonStats(&gEnemyParty[i]); - for (k = 0; k < 4; k++) + for (k = 0; k < MAX_MON_MOVES; k++) SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k); SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); SetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY, &gSaveBlock2Ptr->frontier.field_E70[i + 3].abilityBit); @@ -623,7 +624,7 @@ static void sub_81A6AEC(void) for (i = 0; i < 3; i++) { u16 monSetId = gUnknown_03006298[i]; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { u8 id = GetStyleForMove(gFacilityTrainerMons[monSetId].moves[j]); stylePoints[id]++; @@ -756,7 +757,7 @@ void FillFactoryBrainParty(void) otId); friendship = 0; - for (k = 0; k < 4; k++) + for (k = 0; k < MAX_MON_MOVES; k++) SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k); SetMonData(&gEnemyParty[i], MON_DATA_FRIENDSHIP, &friendship); SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c index 60b233daf..7831ef750 100644 --- a/src/battle_factory_screen.c +++ b/src/battle_factory_screen.c @@ -1,4 +1,5 @@ #include "global.h" +#include "battle.h" #include "battle_factory_screen.h" #include "battle_factory.h" #include "sprite.h" @@ -131,12 +132,6 @@ struct FactorySwapMonsStruct bool8 unk30; }; -extern u8 gUnknown_0203CF20; - -extern const u16 gBattleFrontierHeldItems[]; -extern const struct FacilityMon gBattleFrontierMons[]; -extern const struct FacilityMon gSlateportBattleTentMons[]; -extern const struct BattleFrontierTrainer gBattleFrontierTrainers[]; extern const u32 gUnknown_085B18AC[]; // This file's functions. @@ -1167,7 +1162,7 @@ static void CB2_InitSelectScreen(void) case 4: LoadSpritePalettes(gUnknown_086103F4); LoadSpriteSheets(gUnknown_086103BC); - LoadCompressedObjectPic(gUnknown_086103E4); + LoadCompressedSpriteSheet(gUnknown_086103E4); ShowBg(0); ShowBg(1); SetVBlankCallback(Select_VblankCb); @@ -1697,7 +1692,7 @@ static void CreateFrontierFactorySelectableMons(u8 firstMonId) gFacilityTrainerMons[monSetId].evSpread, otId); happiness = 0; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j); SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness); SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); @@ -1727,7 +1722,7 @@ static void CreateTentFactorySelectableMons(u8 firstMonId) gFacilityTrainerMons[monSetId].evSpread, otId); happiness = 0; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j); SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness); SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); @@ -3171,7 +3166,7 @@ static void CB2_InitSwapScreen(void) case 4: LoadSpritePalettes(gUnknown_086106B0); LoadSpriteSheets(gUnknown_08610650); - LoadCompressedObjectPic(gUnknown_086106A0); + LoadCompressedSpriteSheet(gUnknown_086106A0); SetVBlankCallback(Swap_VblankCb); gMain.state++; break; diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index f53a6281d..3ceaef983 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -15,6 +15,7 @@ #include "task.h" #include "sprite.h" #include "sound.h" +#include "party_menu.h" #include "m4a.h" #include "constants/species.h" #include "decompress.h" @@ -42,10 +43,6 @@ extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow; extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow; extern const u8 gEnemyMonElevation[]; -extern u8 sub_80688F8(u8, u8 battlerId); -extern u8 pokemon_order_func(u8); // party menu -extern void sub_81B8C68(void); - // this file's functions static u8 sub_805D4A8(u16 move); static u16 BattlePalaceGetTargetRetValue(void); @@ -141,7 +138,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void) if (i == var1) percent = 2; - for (var2 = 0, i = 0; i < 4; i++) + for (var2 = 0, i = 0; i < MAX_MON_MOVES; i++) { if (moveInfo->moves[i] == MOVE_NONE) break; @@ -163,7 +160,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void) { var1 = 0, var2 = 0; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (sub_805D4A8(moveInfo->moves[i]) == 0 && !(gBitTable[i] & unusableMovesBits)) var1 += 0x1; @@ -184,7 +181,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void) { do { - i = Random() % 4; + i = Random() % MAX_MON_MOVES; if (!(gBitTable[i] & unusableMovesBits)) chosenMoveId = i; } while (chosenMoveId == -1); @@ -200,7 +197,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void) do { - i = Random() % 4; + i = Random() % MAX_MON_MOVES; if (!(gBitTable[i] & unusableMovesBits) && var2 == sub_805D4A8(moveInfo->moves[i])) chosenMoveId = i; } while (chosenMoveId == -1); @@ -643,7 +640,7 @@ void DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId) DecompressPicFromTable_2(&gTrainerFrontPicTable[frontPicId], gMonSpritesGfxPtr->sprites[position], SPECIES_NONE); - LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[frontPicId]); + LoadCompressedSpritePalette(&gTrainerFrontPicPaletteTable[frontPicId]); } void DecompressTrainerBackPic(u16 backPicId, u8 battlerId) @@ -675,20 +672,20 @@ void BattleLoadAllHealthBoxesGfxAtOnce(void) LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[1]); if (!IsDoubleBattle()) { - LoadCompressedObjectPic(&sSpriteSheet_SinglesPlayerHealthbox); - LoadCompressedObjectPic(&sSpriteSheet_SinglesOpponentHealthbox); + LoadCompressedSpriteSheet(&sSpriteSheet_SinglesPlayerHealthbox); + LoadCompressedSpriteSheet(&sSpriteSheet_SinglesOpponentHealthbox); numberOfBattlers = 2; } else { - LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[0]); - LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[1]); - LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[0]); - LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[1]); - numberOfBattlers = 4; + LoadCompressedSpriteSheet(&sSpriteSheets_DoublesPlayerHealthbox[0]); + LoadCompressedSpriteSheet(&sSpriteSheets_DoublesPlayerHealthbox[1]); + LoadCompressedSpriteSheet(&sSpriteSheets_DoublesOpponentHealthbox[0]); + LoadCompressedSpriteSheet(&sSpriteSheets_DoublesOpponentHealthbox[1]); + numberOfBattlers = MAX_BATTLERS_COUNT; } for (i = 0; i < numberOfBattlers; i++) - LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[i]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[i]]); } bool8 BattleLoadAllHealthBoxesGfx(u8 state) @@ -707,37 +704,37 @@ bool8 BattleLoadAllHealthBoxesGfx(u8 state) if (state == 2) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - LoadCompressedObjectPic(&sSpriteSheet_SafariHealthbox); + LoadCompressedSpriteSheet(&sSpriteSheet_SafariHealthbox); else - LoadCompressedObjectPic(&sSpriteSheet_SinglesPlayerHealthbox); + LoadCompressedSpriteSheet(&sSpriteSheet_SinglesPlayerHealthbox); } else if (state == 3) - LoadCompressedObjectPic(&sSpriteSheet_SinglesOpponentHealthbox); + LoadCompressedSpriteSheet(&sSpriteSheet_SinglesOpponentHealthbox); else if (state == 4) - LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[0]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[0]]); else if (state == 5) - LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[1]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[1]]); else retVal = TRUE; } else { if (state == 2) - LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[0]); + LoadCompressedSpriteSheet(&sSpriteSheets_DoublesPlayerHealthbox[0]); else if (state == 3) - LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[1]); + LoadCompressedSpriteSheet(&sSpriteSheets_DoublesPlayerHealthbox[1]); else if (state == 4) - LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[0]); + LoadCompressedSpriteSheet(&sSpriteSheets_DoublesOpponentHealthbox[0]); else if (state == 5) - LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[1]); + LoadCompressedSpriteSheet(&sSpriteSheets_DoublesOpponentHealthbox[1]); else if (state == 6) - LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[0]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[0]]); else if (state == 7) - LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[1]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[1]]); else if (state == 8) - LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[2]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[2]]); else if (state == 9) - LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[3]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[3]]); else retVal = TRUE; } @@ -1116,7 +1113,7 @@ void LoadAndCreateEnemyShadowSprites(void) { u8 battlerId; - LoadCompressedObjectPic(&gSpriteSheet_EnemyShadow); + LoadCompressedSpriteSheet(&gSpriteSheet_EnemyShadow); battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, GetBattlerSpriteCoord(battlerId, 0), GetBattlerSpriteCoord(battlerId, 1) + 29, 0xC8); diff --git a/src/battle_interface.c b/src/battle_interface.c index 9fd8e116a..0eb494db4 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1523,7 +1523,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, bar_data0 = 5; } - LoadCompressedObjectPicUsingHeap(&sStatusSummaryBarSpriteSheet); + LoadCompressedSpriteSheetUsingHeap(&sStatusSummaryBarSpriteSheet); LoadSpriteSheet(&sStatusSummaryBallsSpriteSheet); LoadSpritePalette(&sStatusSummaryBarSpritePal); LoadSpritePalette(&sStatusSummaryBallsSpritePal); @@ -1753,7 +1753,7 @@ static void sub_8073E08(u8 taskId) if (--gTasks[taskId].tData15 < 0) return; - SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8)); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[15], 16 - gTasks[taskId].data[15])); } if (gTasks[taskId].tData15 == 0) gTasks[taskId].func = sub_8073E64; @@ -1806,7 +1806,7 @@ static void sub_8073F98(u8 taskId) if (--gTasks[taskId].tData15 >= 0) { - SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].tData15) | ((16 - gTasks[taskId].tData15) << 8)); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[15], 16 - gTasks[taskId].data[15])); } else if (gTasks[taskId].tData15 == -1) { diff --git a/src/battle_intro.c b/src/battle_intro.c index 736e35a87..21e83ed29 100644 --- a/src/battle_intro.c +++ b/src/battle_intro.c @@ -221,8 +221,8 @@ static void BattleIntroSlide1(u8 taskId) gScanlineEffect.state = 3; gTasks[taskId].data[0]++; CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); - SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0); - SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0); + SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); + SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); } @@ -330,8 +330,8 @@ static void BattleIntroSlide2(u8 taskId) gScanlineEffect.state = 3; gTasks[taskId].data[0]++; CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); - SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0); - SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0); + SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); + SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); } @@ -418,8 +418,8 @@ static void BattleIntroSlide3(u8 taskId) gScanlineEffect.state = 3; gTasks[taskId].data[0]++; CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); - SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0); - SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0); + SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); + SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); } @@ -499,8 +499,8 @@ static void BattleIntroSlideLink(u8 taskId) { gScanlineEffect.state = 3; gTasks[taskId].data[0]++; - SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0); - SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0); + SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); + SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); } @@ -567,8 +567,8 @@ static void BattleIntroSlidePartner(u8 taskId) { CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE * 4); SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) & ~DISPCNT_WIN1_ON); - SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0); - SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0); + SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); + SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); gScanlineEffect.state = 3; diff --git a/src/battle_main.c b/src/battle_main.c index 42f204508..df1828d18 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -17,6 +17,7 @@ #include "dma3.h" #include "event_data.h" #include "evolution_scene.h" +#include "graphics.h" #include "gpu_regs.h" #include "international_string_util.h" #include "item.h" @@ -39,6 +40,7 @@ #include "sound.h" #include "sprite.h" #include "string_util.h" +#include "strings.h" #include "task.h" #include "text.h" #include "trig.h" @@ -58,9 +60,7 @@ extern struct MusicPlayerInfo gMPlayInfo_SE1; extern struct MusicPlayerInfo gMPlayInfo_SE2; -extern u8 gUnknown_0203CF00[]; -extern const u16 gBattleTextboxPalette[]; extern const struct BgTemplate gBattleBgTemplates[]; extern const struct WindowTemplate *const gBattleWindowTemplates[]; extern const u8 *const gBattleScriptsForMoveEffects[]; @@ -68,25 +68,9 @@ extern const u8 *const gBattlescriptsForBallThrow[]; extern const u8 *const gBattlescriptsForRunningByItem[]; extern const u8 *const gBattlescriptsForUsingItem[]; extern const u8 *const gBattlescriptsForSafariActions[]; -extern const struct ScanlineEffectParams gBattleIntroSlideScanlineEffectParams; - -// strings -extern const u8 gText_LinkStandby3[]; -extern const u8 gText_BattleRecordCouldntBeSaved[]; -extern const u8 gText_ShedinjaJapaneseName[]; -extern const u8 gText_Poison[]; -extern const u8 gText_Sleep[]; -extern const u8 gText_Paralysis[]; -extern const u8 gText_Burn[]; -extern const u8 gText_Ice[]; -extern const u8 gText_Confusion[]; -extern const u8 gText_Love[]; // functions -extern void sub_81B9150(void); extern void sub_80B3AF8(u8 taskId); // cable club -extern void sub_81B8FB0(u8, u8); // party menu -extern u8 pokemon_order_func(u8); // party menu // this file's functions static void CB2_InitBattleInternal(void); @@ -104,9 +88,9 @@ static void sub_8038F34(void); static void sub_80392A8(void); static void sub_803937C(void); static void sub_803939C(void); -static void sub_803980C(struct Sprite *sprite); -static void sub_8039838(struct Sprite *sprite); -static void sub_8039894(struct Sprite *sprite); +static void SpriteCb_MoveWildMonToRight(struct Sprite *sprite); +static void SpriteCb_WildMonShowHealthbox(struct Sprite *sprite); +static void SpriteCb_WildMonAnimate(struct Sprite *sprite); static void sub_80398D0(struct Sprite *sprite); static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite); static void sub_8039AF4(struct Sprite *sprite); @@ -283,6 +267,70 @@ u8 gNumberOfMovesToChoose; u8 gUnknown_03005D7C[MAX_BATTLERS_COUNT]; // rom const data +static const struct ScanlineEffectParams sIntroScanlineParams16Bit = +{ + (void *)REG_ADDR_BG3HOFS, SCANLINE_EFFECT_DMACNT_16BIT, 1 +}; + +// unused +static const struct ScanlineEffectParams sIntroScanlineParams32Bit = +{ + (void *)REG_ADDR_BG3HOFS, SCANLINE_EFFECT_DMACNT_32BIT, 1 +}; + +const struct SpriteTemplate gUnknown_0831AC88 = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8038528, +}; + +static const u8 sText_ShedinjaJpnName[] = _("ヌケニン"); // Nukenin + +const struct OamData gOamData_831ACA8 = +{ + .y = 0, + .affineMode = 1, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0 +}; + +const struct OamData gOamData_831ACB0 = +{ + .y = 0, + .affineMode = 1, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 2, + .paletteNum = 2, + .affineParam = 0 +}; + +// Unknown and unused data. Feel free to remove. +static const u16 gUnknown_0831ACB8[] = {0, 5, 0xfffe, 0}; +static const u16 *const gUnknown_0831ACC0 = gUnknown_0831ACB8; +static const u16 gUnknown_0831ACC4[] = {0xfff0, 0, 0x0400, 0, 0, 0, 0x3c00, 0, 0x7ffe, 1, 0, 0}; +static const u16 *const gUnknown_0831ACDC = gUnknown_0831ACC4; + static const s8 gUnknown_0831ACE0[] ={-32, -16, -16, -32, -32, 0, 0, 0}; // format: attacking type, defending type, damage multiplier @@ -620,7 +668,7 @@ static void CB2_InitBattleInternal(void) gScanlineEffectRegBuffers[1][i] = 0xFF10; } - ScanlineEffect_SetParams(gBattleIntroSlideScanlineEffectParams); + ScanlineEffect_SetParams(sIntroScanlineParams16Bit); } ResetPaletteFade(); @@ -938,7 +986,7 @@ static void CB2_HandleStartBattle(void) { if (gReceivedRemoteLinkPlayers != 0) { - if (sub_800A520()) + if (IsLinkTaskFinished()) { *(&gBattleStruct->field_180) = 0; *(&gBattleStruct->field_181) = 3; @@ -987,7 +1035,7 @@ static void CB2_HandleStartBattle(void) } break; case 3: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; @@ -1002,7 +1050,7 @@ static void CB2_HandleStartBattle(void) } break; case 7: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; @@ -1017,7 +1065,7 @@ static void CB2_HandleStartBattle(void) } break; case 11: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; @@ -1059,7 +1107,7 @@ static void CB2_HandleStartBattle(void) } break; case 16: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), &gRecordedBattleRngSeed, sizeof(gRecordedBattleRngSeed)); gBattleCommunication[MULTIUSE_STATE]++; @@ -1146,7 +1194,7 @@ static void CB2_HandleStartMultiPartnerBattle(void) GetBattleTowerTrainerLanguage(&language, gTrainerBattleOpponent_B); gLinkPlayers[3].language = language; - if (sub_800A520()) + if (IsLinkTaskFinished()) { *(&gBattleStruct->field_180) = 0; *(&gBattleStruct->field_181) = 3; @@ -1186,7 +1234,7 @@ static void CB2_HandleStartMultiPartnerBattle(void) } break; case 3: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; @@ -1210,7 +1258,7 @@ static void CB2_HandleStartMultiPartnerBattle(void) } break; case 5: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(struct Pokemon)); gBattleCommunication[MULTIUSE_STATE]++; @@ -1234,7 +1282,7 @@ static void CB2_HandleStartMultiPartnerBattle(void) } break; case 7: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gEnemyParty, sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; @@ -1252,7 +1300,7 @@ static void CB2_HandleStartMultiPartnerBattle(void) } break; case 9: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gEnemyParty + 2, sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; @@ -1270,7 +1318,7 @@ static void CB2_HandleStartMultiPartnerBattle(void) } break; case 11: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gEnemyParty + 4, sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; @@ -1312,7 +1360,7 @@ static void CB2_HandleStartMultiPartnerBattle(void) } break; case 14: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), &gRecordedBattleRngSeed, sizeof(gRecordedBattleRngSeed)); gBattleCommunication[MULTIUSE_STATE]++; @@ -1392,7 +1440,7 @@ static void CB2_PreInitMultiBattle(void) switch (gBattleCommunication[MULTIUSE_STATE]) { case 0: - if (gReceivedRemoteLinkPlayers != 0 && sub_800A520()) + if (gReceivedRemoteLinkPlayers != 0 && IsLinkTaskFinished()) { gUnknown_02023058 = Alloc(sizeof(struct UnknownPokemonStruct4) * 3); sub_80379F8(0); @@ -1430,7 +1478,7 @@ static void CB2_PreInitMultiBattle(void) } break; case 2: - if (sub_800A520() && !gPaletteFade.active) + if (IsLinkTaskFinished() && !gPaletteFade.active) { gBattleCommunication[MULTIUSE_STATE]++; if (gWirelessCommType) @@ -1533,7 +1581,7 @@ static void CB2_HandleStartMultiBattle(void) { if (gReceivedRemoteLinkPlayers != 0) { - if (sub_800A520()) + if (IsLinkTaskFinished()) { *(&gBattleStruct->field_180) = 0; *(&gBattleStruct->field_181) = 3; @@ -1595,7 +1643,7 @@ static void CB2_HandleStartMultiBattle(void) break; // fall through case 3: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(struct Pokemon) * 2); gBattleCommunication[MULTIUSE_STATE]++; @@ -1658,7 +1706,7 @@ static void CB2_HandleStartMultiBattle(void) } break; case 5: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(struct Pokemon)); gBattleCommunication[MULTIUSE_STATE]++; @@ -1754,7 +1802,7 @@ static void CB2_HandleStartMultiBattle(void) } break; case 8: - if (sub_800A520()) + if (IsLinkTaskFinished()) { u32* ptr = (u32*)(&gBattleStruct->field_180); ptr[0] = gBattleTypeFlags; @@ -1957,7 +2005,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir fixedIV = partyData[i].iv * 31 / 255; CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, 2, 0); - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); @@ -1991,7 +2039,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); @@ -2313,7 +2361,7 @@ static void sub_8038F34(void) gBattleCommunication[MULTIUSE_STATE]++; break; case 6: - if (sub_800A520() == TRUE) + if (IsLinkTaskFinished() == TRUE) { sub_800ADF8(); BattlePutTextOnWindow(gText_LinkStandby3, 0); @@ -2323,7 +2371,7 @@ static void sub_8038F34(void) case 7: if (!IsTextPrinterActive(0)) { - if (sub_800A520() == TRUE) + if (IsLinkTaskFinished() == TRUE) gBattleCommunication[MULTIUSE_STATE]++; } break; @@ -2498,7 +2546,7 @@ static void sub_803939C(void) } break; case 6: - if (sub_800A520() == TRUE) + if (IsLinkTaskFinished() == TRUE) { HandleBattleWindow(0x18, 8, 0x1D, 0xD, WINDOW_CLEAR); if (gMain.field_439_x4) @@ -2548,7 +2596,7 @@ static void sub_803939C(void) } break; case 11: - if (sub_800A520() == TRUE && !IsTextPrinterActive(0) && --gBattleCommunication[1] == 0) + if (IsLinkTaskFinished() == TRUE && !IsTextPrinterActive(0) && --gBattleCommunication[1] == 0) { if (gMain.field_439_x4) { @@ -2564,7 +2612,7 @@ static void sub_803939C(void) { if (gMain.field_439_x4) { - if (sub_800A520() == TRUE) + if (IsLinkTaskFinished() == TRUE) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); gBattleCommunication[1] = 0x20; @@ -2592,7 +2640,7 @@ static void TryCorrectShedinjaLanguage(struct Pokemon *mon) && GetMonData(mon, MON_DATA_LANGUAGE) != language) { GetMonData(mon, MON_DATA_NICKNAME, nickname); - if (StringCompareWithoutExtCtrlCodes(nickname, gText_ShedinjaJapaneseName) == 0) + if (StringCompareWithoutExtCtrlCodes(nickname, sText_ShedinjaJpnName) == 0) SetMonData(mon, MON_DATA_LANGUAGE, &language); } } @@ -2605,38 +2653,38 @@ u32 sub_80397C4(u32 setId, u32 tableId) #define sBattler data[0] #define sSpeciesId data[2] -void oac_poke_opponent(struct Sprite *sprite) +void SpriteCb_WildMon(struct Sprite *sprite) { - sprite->callback = sub_803980C; + sprite->callback = SpriteCb_MoveWildMonToRight; StartSpriteAnimIfDifferent(sprite, 0); BeginNormalPaletteFade(0x20000, 0, 10, 10, RGB(8, 8, 8)); } -static void sub_803980C(struct Sprite *sprite) +static void SpriteCb_MoveWildMonToRight(struct Sprite *sprite) { if ((gIntroSlideFlags & 1) == 0) { sprite->pos2.x += 2; if (sprite->pos2.x == 0) { - sprite->callback = sub_8039838; + sprite->callback = SpriteCb_WildMonShowHealthbox; } } } -static void sub_8039838(struct Sprite *sprite) +static void SpriteCb_WildMonShowHealthbox(struct Sprite *sprite) { if (sprite->animEnded) { sub_8076918(sprite->sBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[sprite->sBattler]); - sprite->callback = sub_8039894; + sprite->callback = SpriteCb_WildMonAnimate; StartSpriteAnimIfDifferent(sprite, 0); BeginNormalPaletteFade(0x20000, 0, 10, 0, RGB(8, 8, 8)); } } -static void sub_8039894(struct Sprite *sprite) +static void SpriteCb_WildMonAnimate(struct Sprite *sprite) { if (!gPaletteFade.active) { diff --git a/src/battle_message.c b/src/battle_message.c index 75f9b1da8..112ab9630 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -14,6 +14,7 @@ #include "palette.h" #include "recorded_battle.h" #include "string_util.h" +#include "strings.h" #include "text.h" #include "window.h" #include "constants/battle_string_ids.h" @@ -40,15 +41,7 @@ extern u8 gUnknown_0203C7B4; extern const u8 gTrainerClassNames[][13]; extern const u16 gUnknown_08D85620[]; -// strings -extern const u8 gText_PkmnBoxSomeonesPCFull[]; -extern const u8 gText_PkmnBoxLanettesPCFull[]; -extern const u8 gText_PkmnTransferredSomeonesPC[]; -extern const u8 gText_PkmnTransferredLanettesPC[]; - -extern u8 GetFrontierBrainTrainerClass(void); // battle_frontier_2 extern u8 GetTrainerHillOpponentClass(u16 trainerId); // pokenav -extern void CopyFrontierBrainTrainerName(u8 *txtPtr); // battle_frontier_2 extern void GetTrainerHillTrainerName(u8 *txtPtr, u16 trainerId); // pokenav extern void CopyTrainerHillTrainerText(u8 arg0, u16 trainerId); // pokenav @@ -2864,7 +2857,7 @@ static void ChooseMoveUsedParticle(u8* textBuff) s32 counter = 0; u32 i = 0; - while (counter != 4) + while (counter != MAX_MON_MOVES) { if (sGrammarMoveUsedTable[i] == 0) counter++; @@ -2876,7 +2869,7 @@ static void ChooseMoveUsedParticle(u8* textBuff) { if (counter <= 2) StringCopy(textBuff, sText_SpaceIs); // is - else if (counter <= 4) + else if (counter <= MAX_MON_MOVES) StringCopy(textBuff, sText_ApostropheS); // 's } } @@ -2907,7 +2900,7 @@ static void ChooseTypeOfMoveUsedString(u8* dst) while (*dst != EOS) dst++; - while (counter != 4) + while (counter != MAX_MON_MOVES) { if (sGrammarMoveUsedTable[i] == MOVE_NONE) counter++; diff --git a/src/battle_palace.c b/src/battle_palace.c index 4033712b6..fb8cc0729 100644 --- a/src/battle_palace.c +++ b/src/battle_palace.c @@ -69,7 +69,7 @@ static void sub_8195980(void) if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860DE98[battleMode][lvlMode])) gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = 0; - saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); gTrainerBattleOpponent_A = 0; } diff --git a/src/battle_pike.c b/src/battle_pike.c index 893796790..a4b429bd5 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -793,7 +793,7 @@ static void HealMon(struct Pokemon *mon) SetMonData(mon, MON_DATA_HP, data); ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { u16 move = GetMonData(mon, MON_DATA_MOVE1 + i); data[0] = CalculatePPWithBonus(move, ppBonuses, i); @@ -1137,7 +1137,7 @@ bool32 TryGenerateBattlePikeWildMon(bool8 checkKeenEyeIntimidate) else abilityBit = 0; SetMonData(&gEnemyParty[0], MON_DATA_ALT_ABILITY, &abilityBit); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) SetMonMoveSlot(&gEnemyParty[0], wildMons[headerId][pikeMonId].moves[i], i); CalculateMonStats(&gEnemyParty[0]); @@ -1285,7 +1285,7 @@ static void TryHealMons(u8 healCount) else { u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { u16 move = GetMonData(mon, MON_DATA_MOVE1 + j); max = CalculatePPWithBonus(move, ppBonuses, j); @@ -1546,7 +1546,7 @@ static void sub_81A86C0(void) if (curr >= max && pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS)) == 0) { u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { u16 move = GetMonData(mon, MON_DATA_MOVE1 + j); max = CalculatePPWithBonus(move, ppBonuses, j); @@ -1611,7 +1611,7 @@ static void sub_81A8830(void) static bool8 CanEncounterWildMon(u8 enemyMonLevel) { - if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)) + if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) { u8 monAbility = GetMonAbility(&gPlayerParty[0]); if (monAbility == ABILITY_KEEN_EYE || monAbility == ABILITY_INTIMIDATE) diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index 45aca91c8..2f0d35feb 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -8,7 +8,9 @@ #include "save.h" #include "strings.h" #include "fieldmap.h" +#include "party_menu.h" #include "palette.h" +#include "field_screen_effect.h" #include "field_message_box.h" #include "random.h" #include "item.h" @@ -32,9 +34,6 @@ #include "constants/moves.h" #include "constants/species.h" -extern u8 gSelectedOrderFromParty[3]; -extern void door_upload_tiles(void); - extern const struct MapLayout *const gMapLayouts[]; extern const u16 gUnknown_08D856C8[][16]; @@ -1178,14 +1177,14 @@ static void sub_81A9834(void) { if (GetMonData(&gSaveBlock1Ptr->playerParty[id], MON_DATA_SPECIES, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL)) { - for (k = 0; k < 4; k++) + for (k = 0; k < MAX_MON_MOVES; k++) { - for (l = 0; l < 4; l++) + for (l = 0; l < MAX_MON_MOVES; l++) { if (GetMonData(&gSaveBlock1Ptr->playerParty[id], MON_DATA_MOVE1 + l, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_MOVE1 + k, NULL)) break; } - if (l == 4) + if (l == MAX_MON_MOVES) SetMonMoveSlot(&gPlayerParty[j], MOVE_SKETCH, k); } gSaveBlock1Ptr->playerParty[id] = gPlayerParty[j]; @@ -1203,8 +1202,8 @@ static u8 sub_81A9998(s32 *arg0, u8 arg1, u8 arg2) { s32 i, j; u8 ret = 0; - u16 *map = gUnknown_03005DC0.map; - map += gUnknown_03005DC0.width * 7 + 7; + u16 *map = gBackupMapLayout.map; + map += gBackupMapLayout.width * 7 + 7; for (i = 0; i < 32; map += 47, i++) { @@ -1361,7 +1360,7 @@ void GenerateBattlePyramidWildMon(void) break; } - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) SetMonMoveSlot(&gEnemyParty[0], wildMons[id].moves[i], i); if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvl] >= 140) // BUG: Reading outside the array as lvl was used for mon level instead of frontier lvl mode. @@ -1494,11 +1493,11 @@ void sub_81AA078(u16 *mapArg, u8 arg1) const struct MapLayout *mapLayout = gMapLayouts[allocated[i] + 0x169]; const u16 *layoutMap = mapLayout->map; - gUnknown_03005DC0.map = mapArg; - gUnknown_03005DC0.width = mapLayout->width * 4 + 15; - gUnknown_03005DC0.height = mapLayout->height * 4 + 14; + gBackupMapLayout.map = mapArg; + gBackupMapLayout.width = mapLayout->width * 4 + 15; + gBackupMapLayout.height = mapLayout->height * 4 + 14; map = mapArg; - heightAdd = (((i / 4 * mapLayout->height) + 7) * (gUnknown_03005DC0.width)); + heightAdd = (((i / 4 * mapLayout->height) + 7) * (gBackupMapLayout.width)); widthAdd = ((i % 4 * mapLayout->width) + 7); map += heightAdd + widthAdd; for (j = 0; j < mapLayout->height; j++) diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c index 8a6348522..50baf48fd 100644 --- a/src/battle_pyramid_bag.c +++ b/src/battle_pyramid_bag.c @@ -365,7 +365,7 @@ static void sub_81C4F44(u8 taskId) { if (!gPaletteFade.active) { - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); gFieldCallback2 = hm_add_c3_without_phase_2; sub_81C4F98(3, CB2_ReturnToField); DestroyTask(taskId); @@ -547,7 +547,7 @@ static bool8 sub_81C5238(void) gPyramidBagResources->state++; break; case 3: - LoadCompressedObjectPic(&gUnknown_0861F3CC); + LoadCompressedSpriteSheet(&gUnknown_0861F3CC); gPyramidBagResources->state++; break; case 4: @@ -964,7 +964,7 @@ static void HandleMenuActionInput(u8 taskId) { if (sub_81221EC() != TRUE) { - s8 id = GetMenuCursorPos(); + s8 id = Menu_GetCursorPos(); if (gMain.newKeys & DPAD_UP) { if (id > 0 && IsValidMenuAction(id - 2)) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d399cddbb..2490d6e13 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -46,22 +46,18 @@ #include "battle_arena.h" #include "battle_pike.h" #include "battle_pyramid.h" +#include "field_specials.h" +#include "pokemon_summary_screen.h" extern struct MusicPlayerInfo gMPlayInfo_BGM; extern const u8* const gBattleScriptsForMoveEffects[]; // functions -extern void ShowSelectMovePokemonSummaryScreen(struct Pokemon* party, u8 monPartyId, u8 monCount, void (*callback)(void), u16 move); // pokemon summary screen -extern u8 sub_81C1B94(void); // pokemon summary screen extern void sub_81D388C(struct Pokemon* mon, void* statStoreLocation); // pokenav.s extern void sub_81D3640(u16 arg0, void* statStoreLocation1, void* statStoreLocation2, u8 arg3, u8 arg4, u8 arg5); // pokenav.s extern void sub_81D3784(u16 arg0, void* statStoreLocation1, u8 arg2, u8 arg3, u8 arg4); // pokenav.s -extern u8* GetMonNickname(struct Pokemon* mon, u8* dst); // party_menu -extern void sub_81B8E80(u8 battlerId, u8, u8); // party menu -extern bool8 IsMultiBattle(void); // ? extern u8 sub_813B21C(void); -extern u16 get_unknown_box_id(void); #define DEFENDER_IS_PROTECTED ((gProtectStructs[gBattlerTarget].protected) && (gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED)) @@ -4603,12 +4599,12 @@ static void atk49_moveend(void) *choicedMoveAtk = gChosenMove; LOOP: { - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] == *choicedMoveAtk) break; } - if (i == 4) + if (i == MAX_MON_MOVES) *choicedMoveAtk = 0; gBattleScripting.atk49_state++; @@ -5961,7 +5957,7 @@ static void atk5E(void) { s32 i; struct BattlePokemon *bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBattler][4]; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { gBattleMons[gActiveBattler].moves[i] = bufferPoke->moves[i]; gBattleMons[gActiveBattler].pp[i] = bufferPoke->pp[i]; @@ -6241,7 +6237,7 @@ static void atk6C_drawlvlupbox(void) { case 1: gBattle_BG2_Y = 0x60; - SetBgAttribute(2, BG_CTRL_ATTR_MOSAIC, 0); + SetBgAttribute(2, BG_ATTR_PRIORITY, 0); ShowBg(2); sub_804F17C(); gBattleScripting.atk6C_state = 2; @@ -6253,8 +6249,8 @@ static void atk6C_drawlvlupbox(void) case 3: gBattle_BG1_X = 0; gBattle_BG1_Y = 0x100; - SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 1); - SetBgAttribute(1, BG_CTRL_ATTR_MOSAIC, 0); + SetBgAttribute(0, BG_ATTR_PRIORITY, 1); + SetBgAttribute(1, BG_ATTR_PRIORITY, 0); ShowBg(0); ShowBg(1); HandleBattleWindow(0x12, 7, 0x1D, 0x13, WINDOW_x80); @@ -6300,7 +6296,7 @@ static void atk6C_drawlvlupbox(void) ClearWindowTilemap(13); CopyWindowToVram(13, 1); - SetBgAttribute(2, BG_CTRL_ATTR_MOSAIC, 2); + SetBgAttribute(2, BG_ATTR_PRIORITY, 2); ShowBg(2); gBattleScripting.atk6C_state = 10; @@ -6309,8 +6305,8 @@ static void atk6C_drawlvlupbox(void) case 10: if (!IsDma3ManagerBusyWithBgCopy()) { - SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 0); - SetBgAttribute(1, BG_CTRL_ATTR_MOSAIC, 1); + SetBgAttribute(0, BG_ATTR_PRIORITY, 0); + SetBgAttribute(1, BG_ATTR_PRIORITY, 1); ShowBg(0); ShowBg(1); gBattlescriptCurrInstr++; @@ -6656,12 +6652,12 @@ static void atk76_various(void) choicedMove = &gBattleStruct->choicedMove[gActiveBattler]; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gActiveBattler].moves[i] == *choicedMove) break; } - if (i == 4) + if (i == MAX_MON_MOVES) *choicedMove = 0; } break; @@ -7637,7 +7633,7 @@ static void atk90_tryconversiontypechange(void) // randomly changes user's type u8 moveChecked; u8 moveType; - while (validMoves < 4) + while (validMoves < MAX_MON_MOVES) { if (gBattleMons[gBattlerAttacker].moves[validMoves] == 0) break; @@ -8035,7 +8031,7 @@ static void atk9B_transformdataexecution(void) for (i = 0; i < offsetof(struct BattlePokemon, pp); i++) battleMonAttacker[i] = battleMonTarget[i]; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].pp < 5) gBattleMons[gBattlerAttacker].pp[i] = gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].pp; @@ -8101,13 +8097,13 @@ static void atk9D_mimicattackcopy(void) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] == gLastMoves[gBattlerTarget]) break; } - if (i == 4) + if (i == MAX_MON_MOVES) { gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastMoves[gBattlerTarget]; if (gBattleMoves[gLastMoves[gBattlerTarget]].pp < 5) @@ -8138,7 +8134,7 @@ static void atk9E_metronome(void) if (gCurrentMove >= MOVES_COUNT) continue; - for (i = 0; i < 4; i++); // ? + for (i = 0; i < MAX_MON_MOVES; i++); // ? i = -1; while (1) @@ -8229,13 +8225,13 @@ static void atkA3_disablelastusedattack(void) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) break; } if (gDisableStructs[gBattlerTarget].disabledMove == 0 - && i != 4 && gBattleMons[gBattlerTarget].pp[i] != 0) + && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) { PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].moves[i]) @@ -8254,7 +8250,7 @@ static void atkA4_trysetencore(void) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) break; @@ -8386,7 +8382,7 @@ static void atkA8_copymovepermanently(void) // sketch { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[i] == MOVE_SKETCH) continue; @@ -8394,7 +8390,7 @@ static void atkA8_copymovepermanently(void) // sketch break; } - if (i != 4) + if (i != MAX_MON_MOVES) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } @@ -8406,7 +8402,7 @@ static void atkA8_copymovepermanently(void) // sketch gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = gBattleMoves[gLastPrintedMoves[gBattlerTarget]].pp; gActiveBattler = gBattlerAttacker; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { movePpData.moves[i] = gBattleMons[gBattlerAttacker].moves[i]; movePpData.pp[i] = gBattleMons[gBattlerAttacker].pp[i]; @@ -8474,7 +8470,7 @@ static void atkA9_trychoosesleeptalkmove(void) s32 i; u8 unusableMovesBits = 0; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (IsInvalidForSleepTalkOrAssist(gBattleMons[gBattlerAttacker].moves[i]) || gBattleMons[gBattlerAttacker].moves[i] == MOVE_FOCUS_PUNCH @@ -8554,13 +8550,13 @@ static void atkAD_tryspiteppreduce(void) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i]) break; } - if (i != 4 && gBattleMons[gBattlerTarget].pp[i] > 1) + if (i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] > 1) { s32 ppToDeduct = (Random() & 3) + 2; if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct) @@ -9630,19 +9626,19 @@ static void atkDB_tryimprision(void) if (sideAttacker != GetBattlerSide(battlerId)) { s32 attackerMoveId; - for (attackerMoveId = 0; attackerMoveId < 4; attackerMoveId++) + for (attackerMoveId = 0; attackerMoveId < MAX_MON_MOVES; attackerMoveId++) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[gBattlerAttacker].moves[attackerMoveId] == gBattleMons[battlerId].moves[i] && gBattleMons[gBattlerAttacker].moves[attackerMoveId] != MOVE_NONE) break; } - if (i != 4) + if (i != MAX_MON_MOVES) break; } - if (attackerMoveId != 4) + if (attackerMoveId != MAX_MON_MOVES) { gStatuses3[gBattlerAttacker] |= STATUS3_IMPRISONED_OTHERS; gBattlescriptCurrInstr += 5; @@ -9706,7 +9702,7 @@ static void atkDE_asistattackselect(void) if (GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_EGG) continue; - for (moveId = 0; moveId < 4; moveId++) + for (moveId = 0; moveId < MAX_MON_MOVES; moveId++) { s32 i = 0; u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); @@ -10142,7 +10138,7 @@ static void atkEF_handleballthrow(void) ballMultiplier = 10; break; case ITEM_DIVE_BALL: - if (Overworld_GetMapTypeOfSaveblockLocation() == MAP_TYPE_UNDERWATER) + if (GetCurrentMapType() == MAP_TYPE_UNDERWATER) ballMultiplier = 35; else ballMultiplier = 10; diff --git a/src/battle_setup.c b/src/battle_setup.c index 83ced1b7c..21386016f 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -24,6 +24,7 @@ #include "window.h" #include "event_object_movement.h" #include "event_scripts.h" +#include "tv.h" #include "trainer_see.h" #include "field_message_box.h" #include "sound.h" @@ -36,6 +37,10 @@ #include "gym_leader_rematch.h" #include "battle_pike.h" #include "battle_pyramid.h" +#include "fldeff.h" +#include "fldeff_misc.h" +#include "field_control_avatar.h" +#include "mirage_tower.h" #include "constants/map_types.h" #include "constants/battle_frontier.h" @@ -57,12 +62,8 @@ struct TrainerBattleParameter }; extern bool32 InTrainerHill(void); -extern bool32 FldEffPoison_IsActive(void); -extern void RestartWildEncounterImmunitySteps(void); extern void ClearPoisonStepCounter(void); -extern void sub_81BE72C(void); extern void sub_808BCF4(void); -extern void sub_80EECC8(void); extern void sub_80AF6F0(void); extern u16 sub_81D6180(u8 localId); extern bool8 GetTrainerHillTrainerFlag(u8 eventObjId); @@ -341,14 +342,14 @@ static void Task_BattleStart(u8 taskId) if (!FldEffPoison_IsActive()) // is poison not active? { BattleTransition_StartOnField(tTransition); - sub_81BE72C(); + ClearMirageTowerPulseBlendEffect(); tState++; // go to case 1. } break; case 1: if (IsBattleTransitionDone() == TRUE) { - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_InitBattle); RestartWildEncounterImmunitySteps(); ClearPoisonStepCounter(); diff --git a/src/battle_tent.c b/src/battle_tent.c index c358deaa5..de4d9d374 100644 --- a/src/battle_tent.c +++ b/src/battle_tent.c @@ -100,7 +100,7 @@ static void sub_81B99D4(void) gSaveBlock2Ptr->frontier.field_CA8 = 0; gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0; gSaveBlock2Ptr->frontier.field_CA9_a = FALSE; - saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); } static void sub_81B9A28(void) @@ -162,7 +162,7 @@ static void sub_81B9BA0(void) gSaveBlock2Ptr->frontier.field_CA8 = 0; gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0; gSaveBlock2Ptr->frontier.field_CA9_a = FALSE; - saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); } static void sub_81B9BF4(void) @@ -217,7 +217,7 @@ static void sub_81B9D28(void) gSaveBlock2Ptr->frontier.field_CA8 = 0; gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0; gSaveBlock2Ptr->frontier.field_CA9_a = FALSE; - saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); } static void sub_81B9D7C(void) diff --git a/src/battle_tower.c b/src/battle_tower.c index 4a9e0dbc4..9e546b0c8 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -31,8 +31,6 @@ #include "constants/species.h" #include "constants/easy_chat.h" -extern const u16 gUnknown_085DFA46[]; - extern const u8 MossdeepCity_SpaceCenter_2F_EventScript_224157[]; extern const u8 MossdeepCity_SpaceCenter_2F_EventScript_224166[]; @@ -942,55 +940,55 @@ struct const u8 *const *strings; } const gUnknown_085DD500[] = { - {FACILITY_CLASS_LASS, gUnknown_085DD118}, - {FACILITY_CLASS_YOUNGSTER, gUnknown_085DD12C}, - {FACILITY_CLASS_HIKER, gUnknown_085DD140}, - {FACILITY_CLASS_BEAUTY, gUnknown_085DD154}, - {FACILITY_CLASS_FISHERMAN, gUnknown_085DD168}, - {FACILITY_CLASS_LADY, gUnknown_085DD17C}, - {FACILITY_CLASS_CYCLING_TRIATHLETE_F, gUnknown_085DD190}, - {FACILITY_CLASS_BUG_CATCHER, gUnknown_085DD1A4}, - {FACILITY_CLASS_SCHOOL_KID_M, gUnknown_085DD1B8}, - {FACILITY_CLASS_RICH_BOY, gUnknown_085DD1CC}, - {FACILITY_CLASS_BLACK_BELT, gUnknown_085DD1E0}, - {FACILITY_CLASS_TUBER_F, gUnknown_085DD1F4}, - {FACILITY_CLASS_HEX_MANIAC, gUnknown_085DD208}, - {FACILITY_CLASS_PKMN_BREEDER_M, gUnknown_085DD21C}, - {FACILITY_CLASS_RUNNING_TRIATHLETE_F, gUnknown_085DD230}, - {FACILITY_CLASS_RUNNING_TRIATHLETE_M, gUnknown_085DD244}, - {FACILITY_CLASS_BATTLE_GIRL, gUnknown_085DD258}, - {FACILITY_CLASS_CYCLING_TRIATHLETE_M, gUnknown_085DD26C}, - {FACILITY_CLASS_TUBER_M, gUnknown_085DD280}, - {FACILITY_CLASS_GUITARIST, gUnknown_085DD294}, - {FACILITY_CLASS_GENTLEMAN, gUnknown_085DD2A8}, - {FACILITY_CLASS_POKEFAN_M, gUnknown_085DD2BC}, - {FACILITY_CLASS_EXPERT_M, gUnknown_085DD2D0}, - {FACILITY_CLASS_EXPERT_F, gUnknown_085DD2E4}, - {FACILITY_CLASS_DRAGON_TAMER, gUnknown_085DD2F8}, - {FACILITY_CLASS_BIRD_KEEPER, gUnknown_085DD30C}, - {FACILITY_CLASS_NINJA_BOY, gUnknown_085DD320}, - {FACILITY_CLASS_PARASOL_LADY, gUnknown_085DD334}, - {FACILITY_CLASS_BUG_MANIAC, gUnknown_085DD348}, - {FACILITY_CLASS_SAILOR, gUnknown_085DD35C}, - {FACILITY_CLASS_COLLECTOR, gUnknown_085DD370}, - {FACILITY_CLASS_PKMN_RANGER_M, gUnknown_085DD384}, - {FACILITY_CLASS_PKMN_RANGER_F, gUnknown_085DD398}, - {FACILITY_CLASS_AROMA_LADY, gUnknown_085DD3AC}, - {FACILITY_CLASS_RUIN_MANIAC, gUnknown_085DD3C0}, - {FACILITY_CLASS_COOLTRAINER_M, gUnknown_085DD3D4}, - {FACILITY_CLASS_COOLTRAINER_F, gUnknown_085DD3E8}, - {FACILITY_CLASS_POKEMANIAC, gUnknown_085DD3FC}, - {FACILITY_CLASS_KINDLER, gUnknown_085DD410}, - {FACILITY_CLASS_CAMPER, gUnknown_085DD424}, - {FACILITY_CLASS_PICNICKER, gUnknown_085DD438}, - {FACILITY_CLASS_PSYCHIC_M, gUnknown_085DD44C}, - {FACILITY_CLASS_PSYCHIC_F, gUnknown_085DD460}, - {FACILITY_CLASS_SCHOOL_KID_F, gUnknown_085DD474}, - {FACILITY_CLASS_POKEMON_BREEDER_F, gUnknown_085DD488}, - {FACILITY_CLASS_POKEFAN_F, gUnknown_085DD49C}, - {FACILITY_CLASS_SWIMMER_F, gUnknown_085DD4B0}, - {FACILITY_CLASS_SWIMMING_TRIATHLETE_M, gUnknown_085DD4C4}, - {FACILITY_CLASS_SWIMMING_TRIATHLETE_F, gUnknown_085DD4D8}, + {FACILITY_CLASS_LASS, gUnknown_085DD118}, + {FACILITY_CLASS_YOUNGSTER, gUnknown_085DD12C}, + {FACILITY_CLASS_HIKER, gUnknown_085DD140}, + {FACILITY_CLASS_BEAUTY, gUnknown_085DD154}, + {FACILITY_CLASS_FISHERMAN, gUnknown_085DD168}, + {FACILITY_CLASS_LADY, gUnknown_085DD17C}, + {FACILITY_CLASS_CYCLING_TRIATHLETE_F, gUnknown_085DD190}, + {FACILITY_CLASS_BUG_CATCHER, gUnknown_085DD1A4}, + {FACILITY_CLASS_SCHOOL_KID_M, gUnknown_085DD1B8}, + {FACILITY_CLASS_RICH_BOY, gUnknown_085DD1CC}, + {FACILITY_CLASS_BLACK_BELT, gUnknown_085DD1E0}, + {FACILITY_CLASS_TUBER_F, gUnknown_085DD1F4}, + {FACILITY_CLASS_HEX_MANIAC, gUnknown_085DD208}, + {FACILITY_CLASS_PKMN_BREEDER_M, gUnknown_085DD21C}, + {FACILITY_CLASS_RUNNING_TRIATHLETE_F, gUnknown_085DD230}, + {FACILITY_CLASS_RUNNING_TRIATHLETE_M, gUnknown_085DD244}, + {FACILITY_CLASS_BATTLE_GIRL, gUnknown_085DD258}, + {FACILITY_CLASS_CYCLING_TRIATHLETE_M, gUnknown_085DD26C}, + {FACILITY_CLASS_TUBER_M, gUnknown_085DD280}, + {FACILITY_CLASS_GUITARIST, gUnknown_085DD294}, + {FACILITY_CLASS_GENTLEMAN, gUnknown_085DD2A8}, + {FACILITY_CLASS_POKEFAN_M, gUnknown_085DD2BC}, + {FACILITY_CLASS_EXPERT_M, gUnknown_085DD2D0}, + {FACILITY_CLASS_EXPERT_F, gUnknown_085DD2E4}, + {FACILITY_CLASS_DRAGON_TAMER, gUnknown_085DD2F8}, + {FACILITY_CLASS_BIRD_KEEPER, gUnknown_085DD30C}, + {FACILITY_CLASS_NINJA_BOY, gUnknown_085DD320}, + {FACILITY_CLASS_PARASOL_LADY, gUnknown_085DD334}, + {FACILITY_CLASS_BUG_MANIAC, gUnknown_085DD348}, + {FACILITY_CLASS_SAILOR, gUnknown_085DD35C}, + {FACILITY_CLASS_COLLECTOR, gUnknown_085DD370}, + {FACILITY_CLASS_PKMN_RANGER_M, gUnknown_085DD384}, + {FACILITY_CLASS_PKMN_RANGER_F, gUnknown_085DD398}, + {FACILITY_CLASS_AROMA_LADY, gUnknown_085DD3AC}, + {FACILITY_CLASS_RUIN_MANIAC, gUnknown_085DD3C0}, + {FACILITY_CLASS_COOLTRAINER_M, gUnknown_085DD3D4}, + {FACILITY_CLASS_COOLTRAINER_F, gUnknown_085DD3E8}, + {FACILITY_CLASS_POKEMANIAC, gUnknown_085DD3FC}, + {FACILITY_CLASS_KINDLER, gUnknown_085DD410}, + {FACILITY_CLASS_CAMPER, gUnknown_085DD424}, + {FACILITY_CLASS_PICNICKER, gUnknown_085DD438}, + {FACILITY_CLASS_PSYCHIC_M, gUnknown_085DD44C}, + {FACILITY_CLASS_PSYCHIC_F, gUnknown_085DD460}, + {FACILITY_CLASS_SCHOOL_KID_F, gUnknown_085DD474}, + {FACILITY_CLASS_POKEMON_BREEDER_F, gUnknown_085DD488}, + {FACILITY_CLASS_POKEFAN_F, gUnknown_085DD49C}, + {FACILITY_CLASS_SWIMMER_F, gUnknown_085DD4B0}, + {FACILITY_CLASS_SWIMMING_TRIATHLETE_M, gUnknown_085DD4C4}, + {FACILITY_CLASS_SWIMMING_TRIATHLETE_F, gUnknown_085DD4D8}, {FACILITY_CLASS_SWIMMER_M, gUnknown_085DD4EC} }; @@ -1165,7 +1163,7 @@ static void sub_8161F94(void) gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] = 0; ValidateBattleTowerRecordChecksums(); - saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); gTrainerBattleOpponent_A = 0; } @@ -1975,7 +1973,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) friendship = 255; // Give the chosen pokemon its specified moves. - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monSetId].moves[j], j); if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION) @@ -2014,7 +2012,7 @@ static void Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId) { CreateMonWithEVSpread(&gEnemyParty[firstMonId + i], apprentice->party[i].species, level, fixedIV, 8); friendship = 0xFF; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { if (apprentice->party[i].moves[j] == MOVE_FRUSTRATION) friendship = 0; @@ -2104,7 +2102,7 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId) otID); friendship = 0; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monSetId].moves[j], j); SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship); @@ -2132,7 +2130,7 @@ static void FillFactoryTentTrainerParty(u16 trainerId, u8 firstMonId) otID); friendship = 0; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monSetId].moves[j], j); if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION) @@ -2147,7 +2145,7 @@ static void FillFactoryTentTrainerParty(u16 trainerId, u8 firstMonId) void FrontierSpeechToString(const u16 *words) { ConvertEasyChatWordsToString(gStringVar4, words, 3, 2); - if (GetStringWidth(1, gStringVar4, -1) > 204) + if (GetStringWidth(1, gStringVar4, -1) > 204u) { s32 i = 0; @@ -2801,7 +2799,7 @@ static void sub_8164B74(void) if (battleMode == FRONTIER_MODE_LINK_MULTIS) { challengeNum = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] / 7; - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), &challengeNum, sizeof(challengeNum)); gSpecialVar_Result = 1; @@ -2838,7 +2836,7 @@ static void sub_8164B74(void) } break; case 2: - if (sub_800A520()) + if (IsLinkTaskFinished()) { SendBlock(bitmask_all_link_players_but_self(), &gSaveBlock2Ptr->frontier.field_CB4, sizeof(gSaveBlock2Ptr->frontier.field_CB4)); gSpecialVar_Result = 3; @@ -3195,7 +3193,7 @@ static void FillPartnerParty(u16 trainerId) TRUE, STEVEN_OTID); for (j = 0; j < 6; j++) SetMonData(&gPlayerParty[3 + i], MON_DATA_HP_EV + j, &sStevenMons[i].evs[j]); - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) SetMonMoveSlot(&gPlayerParty[3 + i], sStevenMons[i].moves[j], j); SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_NAME, gTrainers[TRAINER_STEVEN].trainerName); j = MALE; @@ -3224,7 +3222,7 @@ static void FillPartnerParty(u16 trainerId) gFacilityTrainerMons[monSetId].evSpread, otID); friendship = 0xFF; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { SetMonMoveSlot(&gPlayerParty[3 + i], gFacilityTrainerMons[monSetId].moves[j], j); if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION) @@ -3649,7 +3647,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) friendship = 255; // Give the chosen pokemon its specified moves. - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monSetId].moves[j], j); if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION) diff --git a/src/battle_transition.c b/src/battle_transition.c index 37a8cd63f..786d5e869 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -3,8 +3,10 @@ #include "battle_transition.h" #include "bg.h" #include "decompress.h" +#include "event_object_movement.h" #include "field_camera.h" #include "field_effect.h" +#include "field_weather.h" #include "gpu_regs.h" #include "main.h" #include "alloc.h" @@ -57,10 +59,6 @@ struct StructRectangularSpiral typedef bool8 (*TransitionStateFunc)(struct Task *task); typedef bool8 (*TransitionSpriteCallback)(struct Sprite *sprite); -extern const struct OamData gEventObjectBaseOam_32x32; - -extern void SetWeatherScreenFadeOut(void); - // this file's functions static void LaunchBattleTransitionTask(u8 transitionId); static void Task_BattleTransitionMain(u8 taskId); diff --git a/src/battle_tv.c b/src/battle_tv.c index 487b6baac..d3ca9b61f 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -746,7 +746,7 @@ void TryPutLinkBattleTvShowOnAir(void) species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL); if (species != SPECIES_NONE && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG, NULL)) { - for (sum = 0, j = 0; j < 4; j++) + for (sum = 0, j = 0; j < MAX_MON_MOVES; j++) sum += movePoints->points[0][i * 4 + j]; if (playerBestSum < sum) @@ -760,7 +760,7 @@ void TryPutLinkBattleTvShowOnAir(void) species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL); if (species != SPECIES_NONE && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG, NULL)) { - for (sum = 0, j = 0; j < 4; j++) + for (sum = 0, j = 0; j < MAX_MON_MOVES; j++) sum += movePoints->points[1][i * 4 + j]; if (opponentBestSum == sum) @@ -781,7 +781,7 @@ void TryPutLinkBattleTvShowOnAir(void) } } - for (sum = 0, i = 0, j = 0; j < 4; j++) + for (sum = 0, i = 0, j = 0; j < MAX_MON_MOVES; j++) { if (sum < movePoints->points[0][playerBestMonId * 4 + j]) { @@ -1422,7 +1422,7 @@ static void TrySetBattleSeminarShow(void) dmgByMove[gMoveSelectionCursor[gBattlerAttacker]] = gBattleMoveDamage; currMoveSaved = gCurrentMove; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { gCurrentMove = gBattleMons[gBattlerAttacker].moves[i]; powerOverride = 0; @@ -1446,7 +1446,7 @@ static void TrySetBattleSeminarShow(void) } } - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (i != gMoveSelectionCursor[gBattlerAttacker] && dmgByMove[i] > dmgByMove[gMoveSelectionCursor[gBattlerAttacker]]) { @@ -1458,7 +1458,7 @@ static void TrySetBattleSeminarShow(void) else bestMoveId = 1; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (i != gMoveSelectionCursor[gBattlerAttacker] && dmgByMove[i] > dmgByMove[bestMoveId]) bestMoveId = i; @@ -1551,7 +1551,7 @@ u8 GetBattlerMoveSlotId(u8 battlerId, u16 moveId) i = 0; while (1) { - if (i >= 4) + if (i >= MAX_MON_MOVES) break; if (GetMonData(&party[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + i, NULL) == moveId) break; diff --git a/src/battle_util.c b/src/battle_util.c index 2ddd4f550..5d8e42482 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -85,13 +85,13 @@ void PressurePPLose(u8 defender, u8 attacker, u16 move) if (gBattleMons[defender].ability != ABILITY_PRESSURE) return; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[attacker].moves[i] == move) break; } - if (i == 4) // mons don't share any moves + if (i == MAX_MON_MOVES) // mons don't share any moves return; if (gBattleMons[attacker].pp[i] != 0) @@ -116,12 +116,12 @@ void PressurePPLoseOnUsingImprision(u8 attacker) { if (atkSide != GetBattlerSide(i) && gBattleMons[i].ability == ABILITY_PRESSURE) { - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { if (gBattleMons[attacker].moves[j] == MOVE_IMPRISON) break; } - if (j != 4) + if (j != MAX_MON_MOVES) { imprisionPos = j; if (gBattleMons[attacker].pp[j] != 0) @@ -149,12 +149,12 @@ void PressurePPLoseOnUsingPerishSong(u8 attacker) { if (gBattleMons[i].ability == ABILITY_PRESSURE && i != attacker) { - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { if (gBattleMons[attacker].moves[j] == MOVE_PERISH_SONG) break; } - if (j != 4) + if (j != MAX_MON_MOVES) { perishSongPos = j; if (gBattleMons[attacker].pp[j] != 0) @@ -163,7 +163,7 @@ void PressurePPLoseOnUsingPerishSong(u8 attacker) } } - if (perishSongPos != 4 + if (perishSongPos != MAX_MON_MOVES && !(gBattleMons[attacker].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[attacker].unk18_b & gBitTable[perishSongPos])) { @@ -426,7 +426,7 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check) gPotentialItemEffectBattler = battlerId; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gBattleMons[battlerId].moves[i] == 0 && check & MOVE_LIMITATION_ZEROMOVE) unusableMoves |= gBitTable[i]; @@ -477,12 +477,12 @@ u8 GetImprisonedMovesCount(u8 battlerId, u16 move) if (battlerSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS) { s32 j; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { if (move == gBattleMons[i].moves[j]) break; } - if (j < 4) + if (j < MAX_MON_MOVES) imprisionedMoves++; } } @@ -1021,12 +1021,12 @@ u8 DoBattlerEndTurnEffects(void) if (gDisableStructs[gActiveBattler].disableTimer != 0) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gDisableStructs[gActiveBattler].disabledMove == gBattleMons[gActiveBattler].moves[i]) break; } - if (i == 4) // pokemon does not have the disabled move anymore + if (i == MAX_MON_MOVES) // pokemon does not have the disabled move anymore { gDisableStructs[gActiveBattler].disabledMove = 0; gDisableStructs[gActiveBattler].disableTimer = 0; @@ -2661,7 +2661,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; else mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { move = GetMonData(mon, MON_DATA_MOVE1 + i); changedPP = GetMonData(mon, MON_DATA_PP1 + i); @@ -2669,7 +2669,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) if (move && changedPP == 0) break; } - if (i != 4) + if (i != MAX_MON_MOVES) { u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i); if (changedPP + battlerHoldEffectParam > maxPP) diff --git a/src/battle_util2.c b/src/battle_util2.c index 70c722298..0a0f65b95 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -3,17 +3,14 @@ #include "battle_controllers.h" #include "alloc.h" #include "pokemon.h" +#include "party_menu.h" #include "event_data.h" #include "constants/abilities.h" #include "random.h" #include "battle_scripts.h" -extern u8 gUnknown_0203CF00[]; - extern void sub_81D55D0(void); extern void sub_81D5694(void); -extern u8 pokemon_order_func(u8); -extern void sub_81B8FB0(u8, u8); void AllocateBattleResources(void) { diff --git a/src/berry_blender.c b/src/berry_blender.c index 1ffdb1c38..ea9c6c4ff 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -1240,7 +1240,7 @@ static void sub_8080018(void) sBerryBlenderData->framesToWait = 0; break; case 9: - if (sub_800A520()) + if (IsLinkTaskFinished()) { ResetBlockReceivedFlags(); if (GetMultiplayerId() == 0) @@ -1297,7 +1297,7 @@ static void sub_8080018(void) } break; case 13: - if (sub_800A520()) + if (IsLinkTaskFinished()) { sBerryBlenderData->mainState++; sub_8082CB4(&sBerryBlenderData->bgAffineSrc); @@ -1342,7 +1342,7 @@ static void sub_8080018(void) sBerryBlenderData->mainState++; break; case 20: - if (sub_800A520()) + if (IsLinkTaskFinished()) { sub_800A418(); sBerryBlenderData->mainState++; @@ -2412,7 +2412,7 @@ static void CB2_HandleBlenderEndGame(void) { sBerryBlenderData->gameEndState++; } - else if (sub_800A520()) + else if (IsLinkTaskFinished()) { if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType) { @@ -2593,7 +2593,7 @@ static bool8 LinkPlayAgainHandleSaving(void) sBerryBlenderData->framesToWait = 0; break; case 1: - if (sub_800A520()) + if (IsLinkTaskFinished()) { sBerryBlenderData->field_1A0++; gSoftResetDisabled = TRUE; @@ -2612,7 +2612,7 @@ static bool8 LinkPlayAgainHandleSaving(void) } break; case 4: - if (sub_800A520()) + if (IsLinkTaskFinished()) { if (sub_8153474()) { @@ -2687,7 +2687,7 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void) sBerryBlenderData->gameEndState++; break; case 6: - if (sub_800A520()) + if (IsLinkTaskFinished()) { sBerryBlenderData->framesToWait = 0; sBerryBlenderData->gameEndState++; @@ -2706,7 +2706,7 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void) sub_800ADF8(); break; case 9: - if (sub_800A520()) + if (IsLinkTaskFinished()) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); sBerryBlenderData->gameEndState++; diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c index d87509e10..3631c083a 100644 --- a/src/berry_fix_program.c +++ b/src/berry_fix_program.c @@ -67,7 +67,7 @@ static const u16 sUnknown_08618138[] = { 0x7fff, 0x7fff, 0x318c, 0x675a, 0x043c, 0x3aff, 0x0664, 0x4bd2, 0x6546, 0x7b14, 0x7fff, 0x318c, - 0x675a, 0x0000, 0x0000, 0x0000 + 0x675a, 0, 0, 0 }; static const u8 sUnknown_08618158[] = {10, 11, 12}; @@ -124,7 +124,7 @@ void CB2_InitBerryFixProgram(void) ResetSpriteData(); ResetTasks(); ScanlineEffect_Stop(); - SetGpuReg(REG_OFFSET_DISPCNT, 0x0000); + SetGpuReg(REG_OFFSET_DISPCNT, 0); berry_fix_mb_manager = AllocZeroed(0x50); berry_fix_mb_manager->state = 0; berry_fix_mb_manager->unk1 = 6; @@ -203,13 +203,13 @@ static void berry_fix_gpu_set(void) { s32 width, left; - SetGpuReg(REG_OFFSET_BG0CNT, 0x0000); - SetGpuReg(REG_OFFSET_BG1CNT, 0x0000); - SetGpuReg(REG_OFFSET_BG0HOFS, 0x0000); - SetGpuReg(REG_OFFSET_BG0VOFS, 0x0000); - SetGpuReg(REG_OFFSET_BG1HOFS, 0x0000); - SetGpuReg(REG_OFFSET_BG1VOFS, 0x0000); - SetGpuReg(REG_OFFSET_BLDCNT, 0x0000); + SetGpuReg(REG_OFFSET_BG0CNT, 0); + SetGpuReg(REG_OFFSET_BG1CNT, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); DmaFill32(3, 0, VRAM, VRAM_SIZE); DmaFill32(3, 0, OAM, OAM_SIZE); diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c index 22f99a426..6e968fc0a 100644 --- a/src/berry_tag_screen.c +++ b/src/berry_tag_screen.c @@ -349,11 +349,11 @@ static bool8 LoadBerryTagGfx(void) sBerryTag->gfxState++; break; case 5: - LoadCompressedObjectPic(&gUnknown_0857FDEC); + LoadCompressedSpriteSheet(&gUnknown_0857FDEC); sBerryTag->gfxState++; break; default: - LoadCompressedObjectPalette(&gUnknown_0857FDF4); + LoadCompressedSpritePalette(&gUnknown_0857FDF4); return TRUE; // done } @@ -33,8 +33,8 @@ struct BgConfig2 u32 unk_3:18; void* tilemap; - u32 bg_x; - u32 bg_y; + s32 bg_x; + s32 bg_y; }; static IWRAM_DATA struct BgControl sGpuBgConfigs; @@ -77,15 +77,27 @@ void ResetBgControlStructs(void) void Unused_ResetBgControlStruct(u8 bg) { - if (IsInvalidBg(bg) == FALSE) + if (!IsInvalidBg(bg)) { sGpuBgConfigs.configs[bg] = sZeroedBgControlStruct; } } -void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound) +enum { - if (IsInvalidBg(bg) == FALSE) + BG_CTRL_ATTR_VISIBLE = 1, + BG_CTRL_ATTR_CHARBASEINDEX = 2, + BG_CTRL_ATTR_MAPBASEINDEX = 3, + BG_CTRL_ATTR_SCREENSIZE = 4, + BG_CTRL_ATTR_PALETTEMODE = 5, + BG_CTRL_ATTR_PRIORITY = 6, + BG_CTRL_ATTR_MOSAIC = 7, + BG_CTRL_ATTR_WRAPAROUND = 8, +}; + +static void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound) +{ + if (!IsInvalidBg(bg)) { if (charBaseIndex != 0xFF) { @@ -129,9 +141,9 @@ void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenS } } -u16 GetBgControlAttribute(u8 bg, u8 attributeId) +static u16 GetBgControlAttribute(u8 bg, u8 attributeId) { - if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE) + if (!IsInvalidBg(bg) && sGpuBgConfigs.configs[bg].visible) { switch (attributeId) { @@ -162,7 +174,7 @@ u8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode) u16 offset; s8 cursor; - if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE) + if (!IsInvalidBg(bg) && sGpuBgConfigs.configs[bg].visible) { switch (mode) { @@ -198,7 +210,7 @@ end: static void ShowBgInternal(u8 bg) { u16 value; - if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE) + if (!IsInvalidBg(bg) && sGpuBgConfigs.configs[bg].visible) { value = sGpuBgConfigs.configs[bg].priority | (sGpuBgConfigs.configs[bg].charBaseIndex << 2) | @@ -217,7 +229,7 @@ static void ShowBgInternal(u8 bg) static void HideBgInternal(u8 bg) { - if (IsInvalidBg(bg) == FALSE) + if (!IsInvalidBg(bg)) { sGpuBgConfigs.bgVisibilityAndMode &= ~(1 << (bg + 8)); sGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS; @@ -226,12 +238,12 @@ static void HideBgInternal(u8 bg) static void SyncBgVisibilityAndMode(void) { - SetGpuReg(0, (GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS) | sGpuBgConfigs.bgVisibilityAndMode); + SetGpuReg(REG_OFFSET_DISPCNT, (GetGpuReg(REG_OFFSET_DISPCNT) & ~DISPCNT_ALL_BG_AND_MODE_BITS) | sGpuBgConfigs.bgVisibilityAndMode); } void SetTextModeAndHideBgs(void) { - SetGpuReg(0, GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS); + SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) & ~DISPCNT_ALL_BG_AND_MODE_BITS); } static void SetBgAffineInternal(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle) @@ -312,7 +324,8 @@ void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numT for (i = 0; i < numTemplates; i++) { bg = templates[i].bg; - if (bg < 4) { + if (bg < 4) + { SetBgControlAttributes(bg, templates[i].charBaseIndex, templates[i].mapBaseIndex, @@ -396,9 +409,7 @@ u16 LoadBgTiles(u8 bg, const void* src, u16 size, u16 destOffset) u16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset) { - u8 cursor; - - cursor = LoadBgVram(bg, src, size, destOffset * 2, DISPCNT_MODE_2); + u8 cursor = LoadBgVram(bg, src, size, destOffset * 2, DISPCNT_MODE_2); if (cursor == 0xFF) { @@ -412,12 +423,11 @@ u16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset) u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset) { - u16 paletteOffset; s8 cursor; - if (IsInvalidBg32(bg) == FALSE) + if (!IsInvalidBg32(bg)) { - paletteOffset = (sGpuBgConfigs2[bg].basePalette * 0x20) + (destOffset * 2); + u16 paletteOffset = (sGpuBgConfigs2[bg].basePalette * 0x20) + (destOffset * 2); cursor = RequestDma3Copy(src, (void*)(paletteOffset + BG_PLTT), size, 0); if (cursor == -1) @@ -437,20 +447,16 @@ u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset) bool8 IsDma3ManagerBusyWithBgCopy(void) { - u8 mod; - u8 div; - s8 reqSpace; - int i; for (i = 0; i < 0x80; i++) { - div = i / 0x20; - mod = i % 0x20; + u8 div = i / 0x20; + u8 mod = i % 0x20; - if ((sDmaBusyBitfield[div] & (1 << mod)) != FALSE) + if ((sDmaBusyBitfield[div] & (1 << mod))) { - reqSpace = CheckForSpaceForDma3Request(i); + s8 reqSpace = CheckForSpaceForDma3Request(i); if (reqSpace == -1) { return TRUE; @@ -479,25 +485,25 @@ void SetBgAttribute(u8 bg, u8 attributeId, u8 value) { switch (attributeId) { - case 1: + case BG_ATTR_CHARBASEINDEX: SetBgControlAttributes(bg, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); break; - case 2: + case BG_ATTR_MAPBASEINDEX: SetBgControlAttributes(bg, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); break; - case 3: + case BG_ATTR_SCREENSIZE: SetBgControlAttributes(bg, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF); break; - case 4: + case BG_ATTR_PALETTEMODE: SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF); break; - case 7: + case BG_ATTR_PRIORITY: SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF); break; - case 5: + case BG_ATTR_MOSAIC: SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF); break; - case 6: + case BG_ATTR_WRAPAROUND: SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value); break; } @@ -507,46 +513,46 @@ u16 GetBgAttribute(u8 bg, u8 attributeId) { switch (attributeId) { - case 1: + case BG_ATTR_CHARBASEINDEX: return GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX); - case 2: + case BG_ATTR_MAPBASEINDEX: return GetBgControlAttribute(bg, BG_CTRL_ATTR_MAPBASEINDEX); - case 3: + case BG_ATTR_SCREENSIZE: return GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); - case 4: + case BG_ATTR_PALETTEMODE: return GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE); - case 7: + case BG_ATTR_PRIORITY: return GetBgControlAttribute(bg, BG_CTRL_ATTR_PRIORITY); - case 5: + case BG_ATTR_MOSAIC: return GetBgControlAttribute(bg, BG_CTRL_ATTR_MOSAIC); - case 6: + case BG_ATTR_WRAPAROUND: return GetBgControlAttribute(bg, BG_CTRL_ATTR_WRAPAROUND); - case 8: + case BG_ATTR_METRIC: switch (GetBgType(bg)) { - case 0: - return GetBgMetricTextMode(bg, 0) * 0x800; - case 1: - return GetBgMetricAffineMode(bg, 0) * 0x100; - default: - return 0; + case 0: + return GetBgMetricTextMode(bg, 0) * 0x800; + case 1: + return GetBgMetricAffineMode(bg, 0) * 0x100; + default: + return 0; } - case 9: + case BG_ATTR_TYPE: return GetBgType(bg); - case 10: + case BG_ATTR_BASETILE: return sGpuBgConfigs2[bg].baseTile; default: return -1; } } -u32 ChangeBgX(u8 bg, u32 value, u8 op) +s32 ChangeBgX(u8 bg, s32 value, u8 op) { u8 mode; u16 temp1; u16 temp2; - if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) + if (IsInvalidBg32(bg) || !GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) { return -1; } @@ -610,23 +616,23 @@ u32 ChangeBgX(u8 bg, u32 value, u8 op) return sGpuBgConfigs2[bg].bg_x; } -u32 GetBgX(u8 bg) +s32 GetBgX(u8 bg) { - if (IsInvalidBg32(bg) != FALSE) + if (IsInvalidBg32(bg)) return -1; - else if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) + else if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) return -1; else return sGpuBgConfigs2[bg].bg_x; } -u32 ChangeBgY(u8 bg, u32 value, u8 op) +s32 ChangeBgY(u8 bg, s32 value, u8 op) { u8 mode; u16 temp1; u16 temp2; - if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) + if (IsInvalidBg32(bg) || !GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) { return -1; } @@ -690,13 +696,13 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op) return sGpuBgConfigs2[bg].bg_y; } -u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) +s32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) { u8 mode; u16 temp1; u16 temp2; - if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) + if (IsInvalidBg32(bg) || !GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) { return -1; } @@ -761,11 +767,11 @@ u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) return sGpuBgConfigs2[bg].bg_y; } -u32 GetBgY(u8 bg) +s32 GetBgY(u8 bg) { - if (IsInvalidBg32(bg) != FALSE) + if (IsInvalidBg32(bg)) return -1; - else if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) + else if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) return -1; else return sGpuBgConfigs2[bg].bg_y; @@ -778,14 +784,10 @@ void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dis u8 Unused_AdjustBgMosaic(u8 a1, u8 a2) { - u16 result; - s16 test1; - s16 test2; + u16 result = GetGpuReg(REG_OFFSET_MOSAIC); + s16 test1 = result & 0xF; + s16 test2 = (result >> 4) & 0xF; - result = GetGpuReg(REG_OFFSET_MOSAIC); - - test1 = result & 0xF; - test2 = (result >> 4) & 0xF; result &= 0xFF00; switch (a2) @@ -853,7 +855,7 @@ u8 Unused_AdjustBgMosaic(u8 a1, u8 a2) void SetBgTilemapBuffer(u8 bg, void *tilemap) { - if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0) + if (!IsInvalidBg32(bg) && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) { sGpuBgConfigs2[bg].tilemap = tilemap; } @@ -861,7 +863,7 @@ void SetBgTilemapBuffer(u8 bg, void *tilemap) void UnsetBgTilemapBuffer(u8 bg) { - if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0) + if (!IsInvalidBg32(bg) && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) { sGpuBgConfigs2[bg].tilemap = NULL; } @@ -869,9 +871,9 @@ void UnsetBgTilemapBuffer(u8 bg) void* GetBgTilemapBuffer(u8 bg) { - if (IsInvalidBg32(bg) != FALSE) + if (IsInvalidBg32(bg)) return NULL; - else if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) + else if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE)) return NULL; else return sGpuBgConfigs2[bg].tilemap; @@ -879,7 +881,7 @@ void* GetBgTilemapBuffer(u8 bg) void CopyToBgTilemapBuffer(u8 bg, const void *src, u16 mode, u16 destOffset) { - if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg)) { if (mode != 0) CpuCopy16(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2)), mode); @@ -892,7 +894,7 @@ void CopyBgTilemapBufferToVram(u8 bg) { u16 sizeToLoad; - if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg)) { switch (GetBgType(bg)) { @@ -912,12 +914,12 @@ void CopyBgTilemapBufferToVram(u8 bg) void CopyToBgTilemapBufferRect(u8 bg, const void* src, u8 destX, u8 destY, u8 width, u8 height) { - const void* srcCopy; + const void *srcCopy; u16 destX16; u16 destY16; u16 mode; - if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg)) { switch (GetBgType(bg)) { @@ -1001,29 +1003,29 @@ void FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u16 y16; u16 mode; - if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg)) { switch (GetBgType(bg)) { - case 0: - for (y16 = y; y16 < (y + height); y16++) + case 0: + for (y16 = y; y16 < (y + height); y16++) + { + for (x16 = x; x16 < (x + width); x16++) { - for (x16 = x; x16 < (x + width); x16++) - { - ((u16*)sGpuBgConfigs2[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum; - } + ((u16*)sGpuBgConfigs2[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum; } - break; - case 1: - mode = GetBgMetricAffineMode(bg, 0x1); - for (y16 = y; y16 < (y + height); y16++) + } + break; + case 1: + mode = GetBgMetricAffineMode(bg, 0x1); + for (y16 = y; y16 < (y + height); y16++) + { + for (x16 = x; x16 < (x + width); x16++) { - for (x16 = x; x16 < (x + width); x16++) - { - ((u8*)sGpuBgConfigs2[bg].tilemap)[((y16 * mode) + x16)] = tileNum; - } + ((u8*)sGpuBgConfigs2[bg].tilemap)[((y16 * mode) + x16)] = tileNum; } - break; + } + break; } } } @@ -1039,52 +1041,48 @@ void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 widt u16 mode2; u16 attribute; u16 mode3; + u16 x16, y16; - u16 x16; - u16 y16; - - if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg)) { attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); mode = GetBgMetricTextMode(bg, 0x1) * 0x20; mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20; switch (GetBgType(bg)) { - case 0: - for (y16 = y; y16 < (y + height); y16++) + case 0: + for (y16 = y; y16 < (y + height); y16++) + { + for (x16 = x; x16 < (x + width); x16++) { - for (x16 = x; x16 < (x + width); x16++) - { - CopyTileMapEntry(&firstTileNum, &((u16*)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0); - firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); - } + CopyTileMapEntry(&firstTileNum, &((u16*)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0); + firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); } - break; - case 1: - mode3 = GetBgMetricAffineMode(bg, 0x1); - for (y16 = y; y16 < (y + height); y16++) + } + break; + case 1: + mode3 = GetBgMetricAffineMode(bg, 0x1); + for (y16 = y; y16 < (y + height); y16++) + { + for (x16 = x; x16 < (x + width); x16++) { - for (x16 = x; x16 < (x + width); x16++) - { - ((u8*)sGpuBgConfigs2[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum; - firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); - } + ((u8*)sGpuBgConfigs2[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum; + firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); } - break; + } + break; } } } u16 GetBgMetricTextMode(u8 bg, u8 whichMetric) { - u8 attribute; - - attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); + u8 screenSize = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); switch (whichMetric) { case 0: - switch (attribute) + switch (screenSize) { case 0: return 1; @@ -1096,7 +1094,7 @@ u16 GetBgMetricTextMode(u8 bg, u8 whichMetric) } break; case 1: - switch (attribute) + switch (screenSize) { case 0: return 1; @@ -1109,7 +1107,7 @@ u16 GetBgMetricTextMode(u8 bg, u8 whichMetric) } break; case 2: - switch (attribute) + switch (screenSize) { case 0: case 1: @@ -1125,14 +1123,12 @@ u16 GetBgMetricTextMode(u8 bg, u8 whichMetric) u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric) { - u8 attribute; - - attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); + u8 screenSize = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); switch (whichMetric) { case 0: - switch (attribute) + switch (screenSize) { case 0: return 0x1; @@ -1146,7 +1142,7 @@ u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric) break; case 1: case 2: - return 0x10 << attribute; + return 0x10 << screenSize; } return 0; } diff --git a/src/bike.c b/src/bike.c index b9d247c5d..1e91baab0 100644 --- a/src/bike.c +++ b/src/bike.c @@ -19,8 +19,6 @@ extern u8 sub_808B9BC(u8 direction); extern u8 sub_808B9A4(u8 direction); extern u8 sub_808C1B4(u8 direction); extern u8 sub_808B9D4(u8 direction); -extern void Overworld_ClearSavedMusic(void); -extern void Overworld_PlaySpecialMapMusic(void); // this file's functions static void MovePlayerOnMachBike(u8, u16, u16); diff --git a/src/blit.c b/src/blit.c index b4d5f7de5..26a63fe9b 100644 --- a/src/blit.c +++ b/src/blit.c @@ -1,12 +1,12 @@ #include "global.h" #include "blit.h" -void BlitBitmapRect4BitWithoutColorKey(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height) +void BlitBitmapRect4BitWithoutColorKey(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height) { BlitBitmapRect4Bit(src, dst, srcX, srcY, dstX, dstY, width, height, 0xFF); } -void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey) +void BlitBitmapRect4Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey) { s32 xEnd; s32 yEnd; @@ -14,7 +14,7 @@ void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 sr s32 multiplierDstY; s32 loopSrcY, loopDstY; s32 loopSrcX, loopDstX; - u8 *pixelsSrc; + const u8 *pixelsSrc; u8 *pixelsDst; s32 toOrr; s32 toAnd; @@ -103,7 +103,7 @@ void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 hei } } -void BlitBitmapRect4BitTo8Bit(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey, u8 paletteOffset) +void BlitBitmapRect4BitTo8Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey, u8 paletteOffset) { s32 palOffsetBits; s32 xEnd; @@ -112,7 +112,7 @@ void BlitBitmapRect4BitTo8Bit(struct Bitmap *src, struct Bitmap *dst, u16 srcX, s32 multiplierDstY; s32 loopSrcY, loopDstY; s32 loopSrcX, loopDstX; - u8 *pixelsSrc; + const u8 *pixelsSrc; u8 *pixelsDst; s32 colorKeyBits; diff --git a/src/cable_car.c b/src/cable_car.c index 00606c905..207a0c22d 100755 --- a/src/cable_car.c +++ b/src/cable_car.c @@ -259,7 +259,7 @@ static void CableCarMainCallback_Setup(void) break; case 2: for (i = 0; i < 3; i++) - LoadCompressedObjectPic(&gUnknown_085CDB54[i]); + LoadCompressedSpriteSheet(&gUnknown_085CDB54[i]); LoadSpritePalettes(gUnknown_085CDB74); sCableCar->mtChimneyTilemap = malloc_and_decompress(gCableCarMtChimneyTilemap, &sizeOut); @@ -351,7 +351,7 @@ static void CableCarMainCallback_Run(void) static void CleanupCableCar(void) { u8 i = 0; - + HideBg(0); HideBg(1); HideBg(2); @@ -361,7 +361,7 @@ static void CleanupCableCar(void) sub_80AB130(WEATHER_NONE); for (i = 0; i < 20; i++) gWeatherPtr->sprites.s2.ashSprites[i] = NULL; - + ResetTasks(); ResetSpriteData(); ResetPaletteFade(); diff --git a/src/cable_club.c b/src/cable_club.c index 56154d5bf..784426d53 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -845,7 +845,7 @@ static void sub_80B32B4(u8 taskId) PlayMapChosenOrBattleBGM(MUS_BATTLE20); sub_80B3260(gSpecialVar_0x8004); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); gTrainerBattleOpponent_A = 0x800; SetMainCallback2(CB2_InitBattle); gMain.savedCallback = sub_80B360C; @@ -898,7 +898,7 @@ static void sub_80B33BC(u8 taskId) data[0] = 6; break; case 6: - if (sub_800A520()) + if (IsLinkTaskFinished()) { data[0] = 7; } @@ -911,7 +911,7 @@ static void sub_80B33BC(u8 taskId) gLinkPlayers[0].linkType = 0x2211; sub_80B3260(gSpecialVar_0x8004); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); gTrainerBattleOpponent_A = 0x800; SetMainCallback2(CB2_InitBattle); gMain.savedCallback = sub_80B360C; @@ -1008,7 +1008,7 @@ void sub_80B36EC(void) LoadPlayerParty(); SavePlayerBag(); } - copy_saved_warp2_bank_and_enter_x_to_warp1(0x7F); + SetWarpDestinationToDynamicWarp(0x7F); } void sub_80B371C(void) @@ -1123,7 +1123,7 @@ static void sub_80B3894(u8 taskId) data[0]++; break; case 3: - if (sub_800A520()) + if (IsLinkTaskFinished()) { sub_8013F78(); DestroyTask(taskId); diff --git a/src/clock.c b/src/clock.c index aea6c2088..d52fde22e 100644 --- a/src/clock.c +++ b/src/clock.c @@ -1,7 +1,8 @@ #include "global.h" -#include "rom6.h" #include "event_data.h" #include "rtc.h" +#include "time_events.h" +#include "field_specials.h" #include "lottery_corner.h" #include "dewford_trend.h" #include "tv.h" @@ -11,17 +12,9 @@ #include "overworld.h" #include "wallclock.h" -// static types - -// static declarations - static void UpdatePerDay(struct Time *localTime); static void UpdatePerMinute(struct Time *localTime); -// rodata - -// text - static void InitTimeBasedEvents(void) { FlagSet(FLAG_SYS_CLOCK_SET); diff --git a/src/contest.c b/src/contest.c index 3d74109cb..949be7941 100644 --- a/src/contest.c +++ b/src/contest.c @@ -217,7 +217,6 @@ extern const u8 gText_0827D597[]; extern const struct ContestPokemon gContestOpponents[96]; extern const u8 gUnknown_085898A4[96]; extern const struct CompressedSpriteSheet gUnknown_08587C00; -extern const u8 gContest2Pal[]; extern const struct SpriteTemplate gSpriteTemplate_8587BE8; extern const struct CompressedSpriteSheet gUnknown_08587C08; extern const struct CompressedSpritePalette gUnknown_08587C10; @@ -271,7 +270,7 @@ void LoadContestBgAfterMoveAnim(void) CopyBgTilemapBufferToVram(3); LoadCompressedPalette(gUnknown_08C16E90, 0, 0x200); sub_80D782C(); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { u32 var = 5 + i; @@ -285,7 +284,7 @@ void sub_80D779C(void) ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, gUnknown_08587F34, ARRAY_COUNT(gUnknown_08587F34)); - SetBgAttribute(3, BG_CTRL_ATTR_PRIORITY, 1); + SetBgAttribute(3, BG_ATTR_WRAPAROUND, 1); for (i = 0; i < 4; i++) { SetBgTilemapBuffer(i, gContestResources->field_24[i]); @@ -474,14 +473,14 @@ void sub_80D7CB4(u8 taskId) gTasks[taskId].data[0]++; // fallthrough case 1: - if (sub_800A520()) + if (IsLinkTaskFinished()) { sub_800ADF8(); gTasks[taskId].data[0]++; } return; case 2: - if (sub_800A520() != TRUE) + if (IsLinkTaskFinished() != TRUE) return; gTasks[taskId].data[0]++; break; @@ -747,7 +746,7 @@ void sub_80D8490(u8 taskId) gBattle_BG0_Y = 0xA0; gBattle_BG2_Y = 0xA0; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { u16 move = gContestMons[gContestPlayerMonIndex].moves[i]; u8 *r5 = sp8; @@ -782,7 +781,7 @@ void sub_80D8610(u8 taskId) u8 numMoves = 0; s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gContestMons[gContestPlayerMonIndex].moves[i] != MOVE_NONE) numMoves++; @@ -2484,7 +2483,7 @@ u8 sub_80DB0C4(void) { u8 spriteId; - LoadCompressedObjectPic(&gUnknown_08587C00); + LoadCompressedSpriteSheet(&gUnknown_08587C00); LoadCompressedPalette(gContest2Pal, 0x110, 32); spriteId = CreateSprite(&gSpriteTemplate_8587BE8, 112, 36, 30); gSprites[spriteId].oam.paletteNum = 1; @@ -2496,8 +2495,8 @@ u8 sub_80DB120(void) { u8 spriteId; - LoadCompressedObjectPic(&gUnknown_08587C08); - LoadCompressedObjectPalette(&gUnknown_08587C10); + LoadCompressedSpriteSheet(&gUnknown_08587C08); + LoadCompressedSpritePalette(&gUnknown_08587C10); spriteId = CreateSprite(&gSpriteTemplate_8587C18, 96, 10, 29); gSprites[spriteId].invisible = TRUE; gSprites[spriteId].data[0] = gSprites[spriteId].oam.tileNum; diff --git a/src/contest_ai.c b/src/contest_ai.c index 1342ea102..97e8c8f29 100644 --- a/src/contest_ai.c +++ b/src/contest_ai.c @@ -1,4 +1,5 @@ #include "global.h" +#include "battle.h" #include "contest.h" #include "random.h" #include "contest_ai.h" @@ -807,14 +808,14 @@ static void ContestAICmd_check_move_has_highest_appeal(void) u16 move = gContestMons[eContestAI->contestantId].moves[eContestAI->unk4]; u8 appeal = gContestEffects[gContestMoves[move].effect].appeal; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { u16 newMove = gContestMons[eContestAI->contestantId].moves[i]; if (newMove != 0 && appeal < gContestEffects[gContestMoves[newMove].effect].appeal) break; } - if (i == 4) + if (i == MAX_MON_MOVES) eContestAI->scriptResult = TRUE; else eContestAI->scriptResult = FALSE; @@ -838,14 +839,14 @@ static void ContestAICmd_unk_2F(void) u16 move = gContestMons[eContestAI->contestantId].moves[eContestAI->unk4]; u8 jam = gContestEffects[gContestMoves[move].effect].jam; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { u16 newMove = gContestMons[eContestAI->contestantId].moves[i]; if (newMove != 0 && jam < gContestEffects[gContestMoves[newMove].effect].jam) break; } - if (i == 4) + if (i == MAX_MON_MOVES) eContestAI->scriptResult = TRUE; else eContestAI->scriptResult = FALSE; @@ -1019,7 +1020,7 @@ static void ContestAICmd_check_combo_starter(void) int i; u16 move = gContestMons[eContestAI->contestantId].moves[eContestAI->unk4]; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gContestMons[eContestAI->contestantId].moves[i]) { @@ -1065,7 +1066,7 @@ static void ContestAICmd_check_combo_finisher(void) int i; u16 move = gContestMons[eContestAI->contestantId].moves[eContestAI->unk4]; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gContestMons[eContestAI->contestantId].moves[i]) { @@ -1677,7 +1678,7 @@ static void ContestAICmd_check_for_exciting_move(void) int result = 0; int i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (gContestMons[eContestAI->contestantId].moves[i]) { @@ -1719,7 +1720,7 @@ static void ContestAICmd_unk_85(void) int i; u16 arg = T1_READ_16(gAIScriptPtr + 1); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { u16 move = gContestMons[eContestAI->contestantId].moves[i]; if (move == arg) diff --git a/src/contest_painting_effects.c b/src/contest_painting_effects.c new file mode 100644 index 000000000..187a0f196 --- /dev/null +++ b/src/contest_painting_effects.c @@ -0,0 +1,771 @@ +#include "global.h" +#include "contest_painting_effects.h" +#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; + +// this file's functions +void sub_8125230(void); +void sub_81252E8(void); +void sub_81254E0(void); +void sub_8125630(void); +void sub_8125448(void); +void sub_81257F8(void); +void sub_81258A0(void); +void sub_81256C8(void); +void sub_8125250(void); +void sub_81253A4(u8); +void sub_81250B8(u8); +void sub_8125170(u8); +void sub_8125954(u16); +u16 ConvertColorToGrayscale(u16*); +u16 sub_8125E18(u16*, u16*, u16*); +u16 ConvertCoolColor(u16*, u8); +u16 ConvertToBlackOrWhite(u16*); +u16 sub_8125C98(u16*, u16*); +u16 InvertColor(u16*); +u16 sub_8125F38(u16*, u16*, u16*); +u16 sub_8125CF4(u16*, u16*); +u16 GetCoolColorFromPersonality(u8); + +void sub_8124F2C(struct Unk030061A0 *info) +{ + gUnknown_03006168 = info->var_4; + gUnknown_0300617C = info->var_1F; + gUnknown_03006164 = info->var_19; + gUnknown_03006178 = info->var_1A; + gUnknown_03006174 = info->var_1B; + gUnknown_0300616C = info->var_1C; + gUnknown_03006180 = info->var_1D; + gUnknown_03006170 = info->var_1E; + switch (info->var_0) + { + case 2: + sub_8125230(); + break; + case 8: + sub_81252E8(); + break; + case 9: + sub_81254E0(); + sub_81253A4(gUnknown_0300617C); + break; + case 10: + sub_81254E0(); + sub_8125630(); + sub_8125448(); + case 31: + sub_8125630(); + break; + case 11: + sub_81254E0(); + sub_81257F8(); + sub_81257F8(); + sub_81258A0(); + sub_8125448(); + break; + case 13: + sub_81256C8(); + break; + case 30: + sub_81254E0(); + break; + case 32: + sub_81257F8(); + break; + case 33: + sub_81258A0(); + break; + case 6: + sub_8125250(); + sub_81250B8(3); + break; + case 36: + sub_81254E0(); + sub_81257F8(); + sub_81258A0(); + sub_8125448(); + sub_81252E8(); + sub_81252E8(); + sub_81250B8(2); + sub_8125170(4); + break; + } +} + +void sub_81250B8(u8 a0) // it changes palette someway somehow... .__. +{ + u8 i, j; + + for (i = 0; i < gUnknown_0300616C; i++) + { + u16* var2 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180]; + u16* pal = &var2[gUnknown_03006164]; + for (j = 0; j < gUnknown_03006174; j++, pal++) + { + if (!(0x8000 & *pal)) + { + u8 val = (31 & *pal); + val += a0; + if (val > 31) + val = 31; + + *pal = RGB2(val, val, val); + } + } + } +} + +void sub_8125170(u8 a0) +{ + u8 i, j; + + for (i = 0; i < gUnknown_0300616C; i++) + { + u16* var2 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180]; + u16* pal = &var2[gUnknown_03006164]; + for (j = 0; j < gUnknown_03006174; j++, pal++) + { + if (!(0x8000 & *pal)) + { + u8 val = (31 & *pal); + if (val > 31 - a0) + val = 31 - (a0 >> 1); + + *pal = RGB2(val, val, val); + } + } + } +} + +void sub_8125230(void) +{ + u32 i; + for (i = 0; i < 3200; i++) + sub_8125954(i); +} + +void sub_8125250(void) +{ + u8 i, j; + + for (i = 0; i < gUnknown_0300616C; i++) + { + u16* var2 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180]; + u16* color = &var2[gUnknown_03006164]; + for (j = 0; j < gUnknown_03006174; j++, color++) + { + if (!(0x8000 & *color)) + { + *color = ConvertColorToGrayscale(color); + } + } + } +} + +void sub_81252E8(void) +{ + u8 i, j; + + for (i = 0; i < gUnknown_03006174; i++) + { + u16* var0 = &(*gUnknown_03006168)[0][gUnknown_03006178 * gUnknown_03006180]; + u16* palette = &var0[gUnknown_03006164 + i]; + u16 color = *palette; + + j = 1; + palette += gUnknown_03006180; + while (j < gUnknown_0300616C - 1) + { + if (!(0x8000 & *palette)) + { + *palette = sub_8125E18(&color, palette, palette + gUnknown_03006180); + color = *palette; + } + + j++; + palette += gUnknown_03006180; + } + } +} + +void sub_81253A4(u8 arg0) +{ + u8 i, j; + + for (i = 0; i < gUnknown_0300616C; i++) + { + u16* var0 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180]; + u16* color = &var0[gUnknown_03006164]; + for (j = 0; j < gUnknown_03006174; j++, color++) + { + if (!(0x8000 & *color)) + { + *color = ConvertCoolColor(color, arg0); + } + } + } +} + +void sub_8125448(void) +{ + u8 i, j; + + for (i = 0; i < gUnknown_0300616C; i++) + { + u16* var0 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180]; + u16* color = &var0[gUnknown_03006164]; + for (j = 0; j < gUnknown_03006174; j++, color++) + { + if (!(0x8000 & *color)) + { + *color = ConvertToBlackOrWhite(color); + } + } + } +} + +void sub_81254E0(void) +{ + u8 i, j; + u16 *palette; + + for (i = 0; i < gUnknown_0300616C; i++) + { + u16 *var0 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180]; + palette = &var0[gUnknown_03006164]; + *palette = sub_8125C98(palette, palette + 1); + for (j = 1, palette = palette + 1; j < gUnknown_03006174 - 1; j++, palette++) + { + *palette = sub_8125C98(palette, palette + 1); + *palette = sub_8125C98(palette, palette - 1); + } + + *palette = sub_8125C98(palette, palette - 1); + } + + for (j = 0; j < gUnknown_03006174; j++) + { + u16 *var0 = &(*gUnknown_03006168)[0][gUnknown_03006178 * gUnknown_03006180]; + palette = &var0[gUnknown_03006164 + j]; + *palette = sub_8125C98(palette, palette + gUnknown_03006180); + for (i = 1, palette = palette + gUnknown_03006180; i < gUnknown_0300616C - 1; i++, palette += gUnknown_03006180) + { + *palette = sub_8125C98(palette, palette + gUnknown_03006180); + *palette = sub_8125C98(palette, palette - gUnknown_03006180); + } + + *palette = sub_8125C98(palette, palette - gUnknown_03006180); + } +} + +void sub_8125630(void) +{ + u8 i, j; + + for (i = 0; i < gUnknown_0300616C; i++) + { + u16 *var0 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180]; + u16 *color = &var0[gUnknown_03006164]; + for (j = 0; j < gUnknown_03006174; j++, color++) + { + if (!(0x8000 & *color)) + { + *color = InvertColor(color); + } + } + } +} + +void sub_81256C8(void) +{ + u8 i, j; + u16 *palette; + u16 color; + + palette = (*gUnknown_03006168)[0]; + for (i = 0; i < 64; i++) + { + for (j = 0; j < 64; j++, palette++) + { + if (!(0x8000 & *palette)) + { + *palette = InvertColor(palette); + } + } + } + + for (j = 0; j < 64; j++) + { + palette = &(*gUnknown_03006168)[0][j]; + color = *palette; + *palette = 0x8000; + for (i = 1, palette += 64; i < 63; i++, palette += 64) + { + if (!(0x8000 & *palette)) + { + *palette = sub_8125F38(&color, palette, palette + 64); + color = *palette; + } + } + + *palette = 0x8000; + palette = &(*gUnknown_03006168)[0][j]; + color = *palette; + *palette = 0x8000; + for (i = 1, palette += 64; i < 63; i++, palette += 64) + { + if (!(0x8000 & *palette)) + { + *palette = sub_8125F38(&color, palette, palette + 64); + color = *palette; + } + } + + *palette = 0x8000; + } + + palette = (*gUnknown_03006168)[0]; + for (i = 0; i < 64; i++) + { + for (j = 0; j < 64; j++, palette++) + { + if (!(0x8000 & *palette)) + { + *palette = InvertColor(palette); + } + } + } +} + +void sub_81257F8(void) +{ + u8 i, j; + + for (i = 0; i < gUnknown_0300616C; i++) + { + u16 *var0 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180]; + u16 *palette = &var0[gUnknown_03006164]; + u16 color = *palette; + for (j = 1, palette++; j < gUnknown_03006174 - 1; j++, palette++) + { + if (!(0x8000 & *palette)) + { + *palette = sub_8125CF4(&color, palette); + color = *palette; + } + } + } +} + +void sub_81258A0(void) +{ + u8 i, j; + + for (i = 0; i < gUnknown_03006174; i++) + { + u16* var0 = &(*gUnknown_03006168)[0][gUnknown_03006178 * gUnknown_03006180]; + u16* palette = &var0[gUnknown_03006164 + i]; + u16 color = *palette; + for (j = 1, palette += gUnknown_03006180; j < gUnknown_0300616C - 1; j++, palette += gUnknown_03006180) + { + if (!(0x8000 & *palette)) + { + *palette = sub_8125CF4(&color, palette); + color = *palette; + } + } + } +} + +struct Unk8125954 +{ + u8 unk0; + u8 unk1; + u16 unk2; +}; + +extern const u8 gUnknown_085A1F94[][3]; + +void sub_8125954(u16 arg0) +{ + u8 i; + u8 r5, r9; + struct Unk8125954 unkStruct[6]; + + unkStruct[0].unk0 = gUnknown_085A1F94[arg0][0]; + unkStruct[0].unk1 = gUnknown_085A1F94[arg0][1]; + unkStruct[0].unk2 = (gUnknown_085A1F94[arg0][2] >> 3) & 7; + + r9 = (gUnknown_085A1F94[arg0][2] >> 1) & 3; + r5 = gUnknown_085A1F94[arg0][2] & 1; + for (i = 1; i < unkStruct[0].unk2; i++) + { + if (!r5) + { + unkStruct[i].unk0 = unkStruct[0].unk0 - i; + unkStruct[i].unk1 = unkStruct[0].unk1 + i; + } + else + { + unkStruct[i].unk0 = unkStruct[0].unk0 + 1; + unkStruct[i].unk1 = unkStruct[0].unk1 - 1; + } + + if (unkStruct[i].unk0 > 63 || unkStruct[i].unk1 > 63) + { + unkStruct[0].unk2 = i - 1; + break; + } + + unkStruct[i].unk2 = unkStruct[0].unk2 - i; + } + + for (i = 0; i < unkStruct[0].unk2; i++) + { + u16 *pal = &(*gUnknown_03006168)[unkStruct[i].unk1 * 2][unkStruct[i].unk0]; + + if (!(0x8000 & *pal)) + { + u16 r = (*pal) & 0x1F; + u16 g = (*pal >> 5) & 0x1F; + u16 b = (*pal >> 10) & 0x1F; + + switch (r9) + { + case 0: + case 1: + switch (((gUnknown_085A1F94[arg0][2] >> 3) & 7) % 3) + { + case 0: + if (r >= unkStruct[i].unk2) + r -= unkStruct[i].unk2; + else + r = 0; + break; + case 1: + if (g >= unkStruct[i].unk2) + g -= unkStruct[i].unk2; + else + g = 0; + break; + case 2: + if (b >= unkStruct[i].unk2) + b -= unkStruct[i].unk2; + else + b = 0; + break; + } + break; + case 2: + case 3: + r += unkStruct[i].unk2; + g += unkStruct[i].unk2; + b += unkStruct[i].unk2; + if (r > 31) + r = 31; + if (g > 31) + g = 31; + if (b > 31) + b = 31; + break; + } + + *pal = RGB2(r, g, b); + } + } +} + +u16 ConvertColorToGrayscale(u16 *color) +{ + s32 clr = *color; + s32 r = clr & 0x1F; + s32 g = (clr >> 5) & 0x1F; + s32 b = (clr >> 10) & 0x1F; + s32 gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; + return RGB2(gray, gray, gray); +} + +// The dark colors are the colored edges of the Cool painting effect. +// Everything else is white. +u16 ConvertCoolColor(u16 *color, u8 personality) +{ + u16 red = *color & 0x1F; + u16 green = (*color >> 5) & 0x1F; + u16 blue = (*color >> 10) & 0x1F; + + if (red < 17 && green < 17 && blue < 17) + return GetCoolColorFromPersonality(personality); + else + return RGB_WHITE; +} + +// Based on the given value, which comes from the first 8 bits of +// the mon's personality value, return a color. +u16 GetCoolColorFromPersonality(u8 personality) +{ + u16 red = 0; + u16 green = 0; + u16 blue = 0; + u8 strength = (personality / 6) % 3; + u8 colorType = personality % 6; + + switch (colorType) + { + case 0: + // Teal color + green = 21 - strength; + blue = green; + red = 0; + break; + case 1: + // Yellow color + blue = 0; + red = 21 - strength; + green = red; + break; + case 2: + // Purple color + blue = 21 - strength; + green = 0; + red = blue; + break; + case 3: + // Red color + blue = 0; + green = 0; + red = 23 - strength; + break; + case 4: + // Blue color + blue = 23 - strength; + green = 0; + red = 0; + break; + case 5: + // Green color + blue = 0; + green = 23 - strength; + red = 0; + break; + } + + return RGB2(red, green, blue); +} + +u16 ConvertToBlackOrWhite(u16 *color) +{ + u16 red = *color & 0x1F; + u16 green = (*color >> 5) & 0x1F; + u16 blue = (*color >> 10) & 0x1F; + + if (red < 17 && green < 17 && blue < 17) + return RGB_BLACK; + else + return RGB_WHITE; +} + +u16 sub_8125C98(u16 *colorA, u16 *colorB) +{ + if (*colorA) + { + if (*colorA & 0x8000) + return 0x8000; + if (*colorB & 0x8000) + return RGB_BLACK; + + return *colorA; + } + + return RGB_BLACK; +} + +u16 InvertColor(u16 *color) +{ + u16 red = *color & 0x1F; + u16 green = (*color >> 5) & 0x1F; + u16 blue = (*color >> 10) & 0x1F; + + red = 31 - red; + green = 31 - green; + blue = 31 - blue; + + return RGB2(red, green, blue); +} + +u16 sub_8125CF4(u16 *a0, u16 *a1) +{ + u16 sp0[2][3]; + u16 spC[3]; + u8 r4; + u16 r2; + u16 r, g, b; + + if (*a0 == *a1) + return *a1; + + sp0[0][0] = (*a0 >> 0) & 0x1F; + sp0[0][1] = (*a0 >> 5) & 0x1F; + sp0[0][2] = (*a0 >> 10) & 0x1F; + sp0[1][0] = (*a1 >> 0) & 0x1F; + sp0[1][1] = (*a1 >> 5) & 0x1F; + sp0[1][2] = (*a1 >> 10) & 0x1F; + + if (sp0[0][0] > 25 && sp0[0][1] > 25 && sp0[0][2] > 25) + return *a1; + if (sp0[1][0] > 25 && sp0[1][1] > 25 && sp0[1][2] > 25) + return *a1; + + for (r4 = 0; r4 < 3; r4++) + { + if (sp0[0][r4] > sp0[1][r4]) + spC[r4] = sp0[0][r4] - sp0[1][r4]; + else + spC[r4] = sp0[1][r4] - sp0[0][r4]; + } + + if (spC[0] >= spC[1]) + { + if (spC[0] >= spC[2]) + r2 = spC[0]; + else if (spC[1] >= spC[2]) + r2 = spC[1]; + else + r2 = spC[2]; + } + else + { + if (spC[1] >= spC[2]) + r2 = spC[1]; + else if (spC[2] >= spC[0]) + r2 = spC[2]; + else + r2 = spC[0]; + } + + r = (sp0[1][0] * (31 - r2 / 2)) / 31; + g = (sp0[1][1] * (31 - r2 / 2)) / 31; + b = (sp0[1][2] * (31 - r2 / 2)) / 31; + return RGB2(r, g, b); +} + +u16 sub_8125E18(u16 * a0, u16 * a1, u16 * a2) +{ + u16 red, green, blue; + u16 avg0, avg1, avg2; + u16 diff1, diff2; + u32 minimum; + u16 factor; + + if (*a0 == *a1 && *a2 == *a1) + return *a1; + + red = (*a1 >> 0) & 0x1F; + green = (*a1 >> 5) & 0x1F; + blue = (*a1 >> 10) & 0x1F; + + avg0 = (((*a0 >> 0) & 0x1F) + ((*a0 >> 5) & 0x1F) + ((*a0 >> 10) & 0x1F)) / 3; + avg1 = (((*a1 >> 0) & 0x1F) + ((*a1 >> 5) & 0x1F) + ((*a1 >> 10) & 0x1F)) / 3; + avg2 = (((*a2 >> 0) & 0x1F) + ((*a2 >> 5) & 0x1F) + ((*a2 >> 10) & 0x1F)) / 3; + + if (avg0 == avg1 && avg2 == avg1) + return *a1; + + if (avg0 > avg1) + diff1 = avg0 - avg1; + else + diff1 = avg1 - avg0; + + if (avg2 > avg1) + diff2 = avg2 - avg1; + else + diff2 = avg1 - avg2; + + if (diff1 >= diff2) + minimum = diff1; + else + minimum = diff2; + + factor = 31 - minimum / 2; + red = red * factor / 31; + green = green * factor / 31; + blue = blue * factor / 31; + return RGB2(red, green, blue); +} + +u16 sub_8125F38(u16 *a0, u16 *a1, u16 *a2) +{ + u16 red, green, blue; + u16 avg0, avg1, avg2; + u16 diff1, diff2; + u32 minimum; + u16 factor; + + if (*a0 == *a1 && *a2 == *a1) + return *a1; + + red = (*a1 >> 0) & 0x1F; + green = (*a1 >> 5) & 0x1F; + blue = (*a1 >> 10) & 0x1F; + + avg0 = (((*a0 >> 0) & 0x1F) + ((*a0 >> 5) & 0x1F) + ((*a0 >> 10) & 0x1F)) / 3; + avg1 = (((*a1 >> 0) & 0x1F) + ((*a1 >> 5) & 0x1F) + ((*a1 >> 10) & 0x1F)) / 3; + avg2 = (((*a2 >> 0) & 0x1F) + ((*a2 >> 5) & 0x1F) + ((*a2 >> 10) & 0x1F)) / 3; + + if (avg0 == avg1 && avg2 == avg1) + return *a1; + + if (avg0 > avg1) + diff1 = avg0 - avg1; + else + diff1 = avg1 - avg0; + + if (avg2 > avg1) + diff2 = avg2 - avg1; + else + diff2 = avg1 - avg2; + + if (diff1 >= diff2) + minimum = diff1; + else + minimum = diff2; + + factor = 31 - minimum; + red = red * factor / 31; + green = green * factor / 31; + blue = blue * factor / 31; + return RGB2(red, green, blue); +} + +/* +void sub_8126058(struct Unk030061A0 *arg0) +{ + u16 i, j, k; + u8 r5 = arg0->var_1D >> 3; + u8 var_24 = arg0->var_1E >> 3; + u16 (*var_2C)[][32] = arg0->var_4; + u32 var_28 = arg0->var_10; + + if (arg0->var_16 == 2) + { + for (i = 0; i < var_24; i++) + { + for (j = 0; j < r5; j++) + { + for (k = 0; k < 8; k++) + { + (*var_2C)[][]; + } + } + } + } +} +*/ diff --git a/src/credits.c b/src/credits.c index 67ab97481..3639d36e4 100644 --- a/src/credits.c +++ b/src/credits.c @@ -1102,7 +1102,6 @@ static const struct SpriteTemplate gUnknown_085E7068 = .callback = sub_81772B8, }; -void sub_8175620(void); static void sub_8175744(u8 taskIdA); static void sub_8175774(u8 taskIdA); static void sub_8175808(u8 taskIdA); @@ -1964,9 +1963,9 @@ static bool8 sub_8176AB0(u8 data, u8 taskIdA) case 2: if (gSaveBlock2Ptr->playerGender == MALE) { - LoadCompressedObjectPic(gUnknown_085F5334); - LoadCompressedObjectPic(gUnknown_085F53BC); - LoadCompressedObjectPic(gUnknown_085F5354); + LoadCompressedSpriteSheet(gUnknown_085F5334); + LoadCompressedSpriteSheet(gUnknown_085F53BC); + LoadCompressedSpriteSheet(gUnknown_085F5354); LoadSpritePalettes(gUnknown_085F5384); spriteId = intro_create_brendan_sprite(120, 46); @@ -1981,9 +1980,9 @@ static bool8 sub_8176AB0(u8 data, u8 taskIdA) } else { - LoadCompressedObjectPic(gUnknown_085F5344); - LoadCompressedObjectPic(gUnknown_085F53AC); - LoadCompressedObjectPic(gUnknown_085F5354); + LoadCompressedSpriteSheet(gUnknown_085F5344); + LoadCompressedSpriteSheet(gUnknown_085F53AC); + LoadCompressedSpriteSheet(gUnknown_085F5354); LoadSpritePalettes(gUnknown_085F5384); spriteId = intro_create_may_sprite(120, 46); @@ -2220,8 +2219,8 @@ static void sub_8177050(struct Sprite *sprite) } else { - SetGpuReg(REG_OFFSET_BLDCNT, 0xF40); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x10); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); sprite->oam.objMode = 1; sprite->data[3] = 16; sprite->data[0] += 1; diff --git a/src/dark.c b/src/dark.c index d4a4f0b8a..ecd466da8 100644 --- a/src/dark.c +++ b/src/dark.c @@ -1,11 +1,29 @@ #include "global.h" #include "battle_anim.h" +#include "contest.h" +#include "gpu_regs.h" +#include "graphics.h" +#include "palette.h" +#include "scanline_effect.h" +#include "trig.h" +#include "util.h" #include "constants/rgb.h" -extern void sub_81138D4(struct Sprite *); -extern void sub_81139DC(struct Sprite *); -extern void sub_8113A90(struct Sprite *); -extern void sub_81144BC(struct Sprite *); +void sub_81138D4(struct Sprite *); +void sub_81139DC(struct Sprite *); +void sub_8113A90(struct Sprite *); +void sub_81144BC(struct Sprite *); +static void sub_811375C(u8); +static void sub_811381C(u8); +static void sub_8113950(struct Sprite *); +static void sub_8113A18(struct Sprite *); +static void sub_8113A58(struct Sprite *); +static void sub_8113B90(struct Sprite *); +static void sub_8113D60(u8); +static void sub_81140C8(u8); +static void sub_8114244(struct Task *); +static void sub_8114374(u8); +static void sub_8114748(u8); const struct SpriteTemplate gUnknown_08596FC8 = { @@ -167,3 +185,797 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_8597138 = .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_81144BC, }; + +void sub_81136E8(u8 taskId) +{ + int battler; + gTasks[taskId].data[0] = gBattleAnimArgs[0]; + battler = gBattleAnimAttacker; + gTasks[taskId].data[1] = 16; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); + if (GetBattlerSpriteBGPriorityRank(battler) == 1) + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); + else + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); + + gTasks[taskId].func = sub_811375C; +} + +static void sub_811375C(u8 taskId) +{ + u8 blendA = gTasks[taskId].data[1] >> 8; + u8 blendB = gTasks[taskId].data[1]; + if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0]) + { + blendA++; + blendB--; + gTasks[taskId].data[1] = BLDALPHA_BLEND(blendB, blendA); + SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]); + gTasks[taskId].data[2] = 0; + if (blendA == 16) + { + gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = 1; + DestroyAnimVisualTask(taskId); + } + } + else + { + gTasks[taskId].data[2]++; + } +} + +void sub_81137E4(u8 taskId) +{ + gTasks[taskId].data[0] = gBattleAnimArgs[0]; + gTasks[taskId].data[1] = BLDALPHA_BLEND(0, 16); + gTasks[taskId].func = sub_811381C; + SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]); +} + +static void sub_811381C(u8 taskId) +{ + u8 blendA = gTasks[taskId].data[1] >> 8; + u8 blendB = gTasks[taskId].data[1]; + if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0]) + { + blendA--; + blendB++; + gTasks[taskId].data[1] = (blendA << 8) | blendB; + SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]); + gTasks[taskId].data[2] = 0; + if (blendA == 0) + { + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + DestroyAnimVisualTask(taskId); + } + } + else + { + gTasks[taskId].data[2]++; + } +} + +void sub_8113888(u8 taskId) +{ + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); + if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); + else + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); + + DestroyAnimVisualTask(taskId); +} + +void sub_81138D4(struct Sprite *sprite) +{ + sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); + sprite->data[3] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); + sprite->data[0] = 0x7E; + InitSpriteDataForLinearTranslation(sprite); + sprite->data[3] = -sprite->data[1]; + sprite->data[4] = -sprite->data[2]; + sprite->data[6] = 0xFFD8; + sprite->callback = sub_8113950; + sprite->callback(sprite); +} + +static void sub_8113950(struct Sprite *sprite) +{ + sprite->data[3] += sprite->data[1]; + sprite->data[4] += sprite->data[2]; + sprite->pos2.x = sprite->data[3] >> 8; + sprite->pos2.y = sprite->data[4] >> 8; + if (sprite->data[7] == 0) + { + sprite->data[3] += sprite->data[1]; + sprite->data[4] += sprite->data[2]; + sprite->pos2.x = sprite->data[3] >> 8; + sprite->pos2.y = sprite->data[4] >> 8; + sprite->data[0]--; + } + + sprite->pos2.y += Sin(sprite->data[5], sprite->data[6]); + sprite->data[5] = (sprite->data[5] + 3) & 0xFF; + if (sprite->data[5] > 0x7F) + { + sprite->data[5] = 0; + sprite->data[6] += 20; + sprite->data[7]++; + } + + if (--sprite->data[0] == 0) + DestroyAnimSprite(sprite); +} + +void sub_81139DC(struct Sprite *sprite) +{ + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]); + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = gBattleAnimArgs[4]; + sprite->data[2] = gBattleAnimArgs[5]; + sprite->callback = sub_8113A18; +} + +static void sub_8113A18(struct Sprite *sprite) +{ + sprite->data[4] += sprite->data[0]; + sprite->data[5] += sprite->data[1]; + sprite->pos2.x = sprite->data[4] >> 8; + sprite->pos2.y = sprite->data[5] >> 8; + if (++sprite->data[3] == sprite->data[2]) + sprite->callback = sub_8113A58; +} + +static void sub_8113A58(struct Sprite *sprite) +{ + sprite->data[4] -= sprite->data[0]; + sprite->data[5] -= sprite->data[1]; + sprite->pos2.x = sprite->data[4] >> 8; + sprite->pos2.y = sprite->data[5] >> 8; + if (--sprite->data[3] == 0) + DestroySpriteAndMatrix(sprite); +} + +void sub_8113A90(struct Sprite *sprite) +{ + u8 battler; + s8 xOffset; + + if (gBattleAnimArgs[0] == 0) + battler = gBattleAnimAttacker; + else + battler = gBattleAnimTarget; + + xOffset = 20; + sprite->oam.tileNum += 4; + + switch (gBattleAnimArgs[1]) + { + case 0: + sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 8; + sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 8; + break; + case 1: + sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 14; + sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 16; + break; + case 2: + sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) + 8; + sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 8; + StartSpriteAffineAnim(sprite, 1); + xOffset = -20; + break; + case 3: + sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) + 14; + sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 16; + StartSpriteAffineAnim(sprite, 1); + xOffset = -20; + break; + } + + sprite->data[0] = 32; + sprite->data[2] = sprite->pos1.x + xOffset; + sprite->data[4] = sprite->pos1.y + 12; + sprite->data[5] = -12; + + InitAnimArcTranslation(sprite); + sprite->callback = sub_8113B90; +} + +static void sub_8113B90(struct Sprite *sprite) +{ + if (TranslateAnimArc(sprite)) + DestroySpriteAndMatrix(sprite); +} + +void sub_8113BAC(u8 taskId) +{ + struct ScanlineEffectParams scanlineParams; + struct UnknownAnimStruct2 unknownStruct; + u16 i; + u8 pos; + int var0; + struct Task *task = &gTasks[taskId]; + + task->data[7] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 31; + task->data[6] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) - 7; + task->data[5] = task->data[7]; + task->data[4] = task->data[6]; + task->data[13] = (task->data[7] - task->data[6]) << 8; + + pos = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); + task->data[14] = pos - 32; + task->data[15] = pos + 32; + + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) + task->data[8] = -12; + else + task->data[8] = -64; + + task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker); + if (task->data[3] == 1) + { + sub_80A6B30(&unknownStruct); + task->data[10] = gBattle_BG1_Y; + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); + FillPalette(0, unknownStruct.unk8 << 4, 32); + scanlineParams.dmaDest = ®_BG1VOFS; + var0 = WINOUT_WIN01_BG1; + if (!IsContest()) + gBattle_BG2_X += 240; + } + else + { + task->data[10] = gBattle_BG2_Y; + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); + FillPalette(0, 144, 32); + scanlineParams.dmaDest = ®_BG2VOFS; + var0 = WINOUT_WIN01_BG2; + if (!IsContest()) + gBattle_BG1_X += 240; + } + + scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; + scanlineParams.initState = 1; + scanlineParams.unused9 = 0; + task->data[11] = 0; + task->data[12] = 16; + task->data[0] = 0; + task->data[1] = 0; + task->data[2] = 0; + sub_8114374(3); + for (i = 0; i < 112; i++) + { + gScanlineEffectRegBuffers[0][i] = task->data[10]; + gScanlineEffectRegBuffers[1][i] = task->data[10]; + } + + ScanlineEffect_SetParams(scanlineParams); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | (var0 ^ (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR))); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + gBattle_WIN0V = 160; + + task->func = sub_8113D60; +} + +static void sub_8113D60(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (++task->data[1] > 1) + { + task->data[1] = 0; + if (++task->data[2] & 1) + { + if (task->data[11] != 12) + task->data[11]++; + } + else + { + if (task->data[12] != 8) + task->data[12]--; + } + + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12])); + + if (task->data[11] == 12 && task->data[12] == 8) + task->data[0]++; + } + break; + case 1: + task->data[4] -= 8; + sub_8114244(task); + + if (task->data[4] < task->data[8]) + task->data[0]++; + break; + case 2: + task->data[4] -= 8; + sub_8114244(task); + task->data[14] += 4; + task->data[15] -= 4; + + if (task->data[14] >= task->data[15]) + task->data[14] = task->data[15]; + + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + + if (task->data[14] == task->data[15]) + task->data[0]++; + break; + case 3: + gScanlineEffect.state = 3; + task->data[0]++; + break; + case 4: + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_8113E78(u8 taskId) +{ + struct UnknownAnimStruct2 unknownStruct; + struct ScanlineEffectParams scanlineParams; + u8 x; + u16 i; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (IsContest() == TRUE) + { + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); + DestroyAnimVisualTask(taskId); + } + else + { + task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget); + if (task->data[3] == 1) + { + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); + gBattle_BG2_X += 240; + } + else + { + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); + gBattle_BG1_X += 240; + } + + task->data[0]++; + } + break; + case 1: + if (task->data[3] == 1) + { + sub_80A6B30(&unknownStruct); + task->data[10] = gBattle_BG1_Y; + FillPalette(0, unknownStruct.unk8 << 4, 32); + } + else + { + task->data[10] = gBattle_BG2_Y; + FillPalette(0, 144, 32); + } + + sub_8114374(3); + task->data[0]++; + break; + case 2: + task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 31; + task->data[6] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) - 7; + task->data[13] = (task->data[7] - task->data[6]) << 8; + x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); + task->data[14] = x - 4; + task->data[15] = x + 4; + + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) + task->data[8] = -12; + else + task->data[8] = -64; + + task->data[4] = task->data[8]; + task->data[5] = task->data[8]; + task->data[11] = 12; + task->data[12] = 8; + task->data[0]++; + break; + case 3: + if (task->data[3] == 1) + scanlineParams.dmaDest = ®_BG1VOFS; + else + scanlineParams.dmaDest = ®_BG2VOFS; + + for (i = 0; i < 112; i++) + { + gScanlineEffectRegBuffers[0][i] = task->data[10] + (159 - i); + gScanlineEffectRegBuffers[1][i] = task->data[10] + (159 - i); + } + + scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; + scanlineParams.initState = 1; + scanlineParams.unused9 = 0; + ScanlineEffect_SetParams(scanlineParams); + task->data[0]++; + break; + case 4: + if (task->data[3] == 1) + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); + else + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); + + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + gBattle_WIN0V = 160; + + task->data[0] = 0; + task->data[1] = 0; + task->data[2] = 0; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8)); + task->func = sub_81140C8; + break; + } +} + +static void sub_81140C8(u8 taskId) +{ + u8 pos; + u16 i; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[5] += 8; + if (task->data[5] >= task->data[7]) + task->data[5] = task->data[7]; + + sub_8114244(task); + if (task->data[5] == task->data[7]) + task->data[0]++; + break; + case 1: + if (task->data[15] - task->data[14] < 0x40) + { + task->data[14] -= 4; + task->data[15] += 4; + } + else + { + task->data[1] = 1; + } + + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + task->data[4] += 8; + if (task->data[4] >= task->data[6]) + task->data[4] = task->data[6]; + + sub_8114244(task); + if (task->data[4] == task->data[6] && task->data[1]) + { + task->data[1] = 0; + task->data[0]++; + } + break; + case 2: + if (++task->data[1] > 1) + { + task->data[1] = 0; + task->data[2]++; + if (task->data[2] & 1) + { + if (task->data[11]) + task->data[11]--; + } + else + { + if (task->data[12] < 16) + task->data[12]++; + } + + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12])); + if (task->data[11] == 0 && task->data[12] == 16) + task->data[0]++; + } + break; + case 3: + gScanlineEffect.state = 3; + task->data[0]++; + break; + case 4: + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); + DestroyAnimVisualTask(taskId); + break; + } +} + +static void sub_8114244(struct Task *task) +{ + int var0, var1; + s16 var2; + s16 i; + int var4; + + var2 = task->data[5] - task->data[4]; + if (var2 != 0) + { + var0 = task->data[13] / var2; + var1 = task->data[6] << 8; + + for (i = 0; i < task->data[4]; i++) + { + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159); + } + + for (i = task->data[4]; i <= task->data[5]; i++) + { + if (i >= 0) + { + s16 var3 = (var1 >> 8) - i; + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var3 + task->data[10]; + } + + var1 += var0; + } + + var4 = task->data[10] - (i - 159); + for (i = i; i < task->data[7]; i++) + { + if (i >= 0) + { + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var4; + var4--; + } + } + } + else + { + var4 = task->data[10] + 159; + for (i = 0; i < 112; i++) + { + gScanlineEffectRegBuffers[0][i] = var4; + gScanlineEffectRegBuffers[1][i] = var4; + var4--; + } + } +} + +static void sub_8114374(u8 priority) +{ + u16 i; + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + u8 spriteId = GetAnimBattlerSpriteId(i); + if (spriteId != 0xFF) + gSprites[spriteId].oam.priority = priority; + } +} + +void sub_81143C0(u8 taskId) +{ + u8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? 1 : 0; + MoveBattlerSpriteToBG(gBattleAnimAttacker, toBG2, TRUE); + gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = 0; + + if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) + { + MoveBattlerSpriteToBG(gBattleAnimAttacker ^ 2, toBG2 ^ 1, TRUE); + gSprites[gBattlerSpriteIds[gBattleAnimAttacker ^ 2]].invisible = 0; + } + + DestroyAnimVisualTask(taskId); +} + +void sub_8114470(u8 taskId) +{ + u8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? 1 : 0; + sub_80A477C(toBG2); + + if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) + sub_80A477C(toBG2 ^ 1); + + DestroyAnimVisualTask(taskId); +} + +void sub_81144BC(struct Sprite *sprite) +{ + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + StartSpriteAnim(sprite, gBattleAnimArgs[2]); + sprite->callback = RunStoredCallbackWhenAnimEnds; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + +void sub_81144F8(u8 taskId) +{ + u16 species; + u8 spriteId; + u8 newSpriteId; + u16 paletteNum; + struct UnknownAnimStruct2 unknownStruct; + int var0 = 0; + + gBattle_WIN0H = var0; + gBattle_WIN0V = var0; + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12)); + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0); + SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); + if (!IsContest()) + SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); + + if (IsDoubleBattle() && !IsContest()) + { + if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT) + { + if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)) == TRUE) + { + gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority--; + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + var0 = 1; + } + } + } + + if (IsContest()) + { + species = gContestResources->field_18->species; + } + else + { + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); + else + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); + } + + spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); + newSpriteId = sub_80A89C8(gBattleAnimAttacker, spriteId, species); + + sub_80A6B30(&unknownStruct); + sub_80A6D48(unknownStruct.bgId, gUnknown_08C1D210); + sub_80A6CC0(unknownStruct.bgId, gUnknown_08C1D0AC, unknownStruct.tilesOffset); + LoadCompressedPalette(gUnknown_08C1D1E8, unknownStruct.unk8 << 4, 32); + + gBattle_BG1_X = -gSprites[spriteId].pos1.x + 96; + gBattle_BG1_Y = -gSprites[spriteId].pos1.y + 32; + paletteNum = 16 + gSprites[spriteId].oam.paletteNum; + + if (gBattleAnimArgs[1] == 0) + SetGreyscaleOrOriginalPalette(paletteNum, FALSE); + else + BlendPalette(paletteNum * 16, 16, 11, gBattleAnimArgs[2]); + + gTasks[taskId].data[0] = newSpriteId; + gTasks[taskId].data[1] = gBattleAnimArgs[0]; + gTasks[taskId].data[2] = gBattleAnimArgs[1]; + gTasks[taskId].data[3] = gBattleAnimArgs[2]; + gTasks[taskId].data[6] = var0; + gTasks[taskId].func = sub_8114748; +} + +static void sub_8114748(u8 taskId) +{ + struct UnknownAnimStruct2 unknownStruct; + u16 paletteNum; + u8 spriteId; + u8 taskIdCopy = taskId; + + gTasks[taskIdCopy].data[10] += 4; + gBattle_BG1_X -= 4; + if (gTasks[taskIdCopy].data[10] == 128) + { + gTasks[taskIdCopy].data[10] = 0; + gBattle_BG1_X += 128; + gTasks[taskIdCopy].data[11]++; + if (gTasks[taskIdCopy].data[11] == 2) + { + spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); + paletteNum = 16 + gSprites[spriteId].oam.paletteNum; + if (gTasks[taskIdCopy].data[1] == 0) + SetGreyscaleOrOriginalPalette(paletteNum, 1); + + DestroySprite(&gSprites[gTasks[taskIdCopy].data[0]]); + sub_80A6B30(&unknownStruct); + sub_80A6C68(unknownStruct.bgId); + if (gTasks[taskIdCopy].data[6] == 1) + gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority++; + } + else if (gTasks[taskIdCopy].data[11] == 3) + { + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); + if (!IsContest()) + SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); + + SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + DestroyAnimVisualTask(taskId); + } + } +} + +void sub_811489C(u8 taskId) +{ + u8 spriteId; + u8 battler; + bool8 calcSpriteId = FALSE; + u8 position = B_POSITION_PLAYER_LEFT; + + switch (gBattleAnimArgs[0]) + { + case 0: + case 1: + case 2: + case 3: + spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); + break; + case 4: + position = B_POSITION_PLAYER_LEFT; + calcSpriteId = TRUE; + break; + case 5: + position = B_POSITION_PLAYER_RIGHT; + calcSpriteId = TRUE; + break; + case 6: + position = B_POSITION_OPPONENT_LEFT; + calcSpriteId = TRUE; + break; + case 7: + position = B_POSITION_OPPONENT_RIGHT; + calcSpriteId = TRUE; + break; + default: + spriteId = 0xFF; + break; + } + + if (calcSpriteId) + { + battler = GetBattlerAtPosition(position); + if (IsBattlerSpriteVisible(battler)) + spriteId = gBattlerSpriteIds[battler]; + else + spriteId = 0xFF; + } + + if (spriteId != 0xFF) + SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]); + + DestroyAnimVisualTask(taskId); +} + +void sub_8114960(u8 taskId) +{ + if (gAnimMoveTurn < 2) + gBattleAnimArgs[7] = 0; + + if (gAnimMoveTurn == 2) + gBattleAnimArgs[7] = 1; + + DestroyAnimVisualTask(taskId); +} diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h index 078304888..86ebb620b 100644 --- a/src/data/pokemon/base_stats.h +++ b/src/data/pokemon/base_stats.h @@ -1,7 +1,40 @@ -// Maximum value for a female pokemon is 254 (MON_FEMALE) which is 100% female. -// 255 (MON_GENDERLESS) is reserved for genderless pokemon. +// Maximum value for a female Pokmon is 254 (MON_FEMALE) which is 100% female. +// 255 (MON_GENDERLESS) is reserved for genderless Pokmon. #define PERCENT_FEMALE(percent) min(254, ((percent * 255) / 100)) +#define OLD_UNOWN_BASE_STATS \ + { \ + .baseHP = 50, \ + .baseAttack = 150, \ + .baseDefense = 50, \ + .baseSpAttack = 150, \ + .baseSpDefense = 50, \ + .baseSpeed = 150, \ + .type1 = TYPE_NORMAL, \ + .type2 = TYPE_NORMAL, \ + .catchRate = 3, \ + .expYield = 1, \ + .evYield_HP = 2, \ + .evYield_Attack = 2, \ + .evYield_Defense = 2, \ + .evYield_Speed = 2, \ + .evYield_SpAttack = 2, \ + .evYield_SpDefense = 2, \ + .item1 = ITEM_NONE, \ + .item2 = ITEM_NONE, \ + .genderRatio = MON_GENDERLESS, \ + .eggCycles = 120, \ + .friendship = 0, \ + .growthRate = GROWTH_MEDIUM_FAST, \ + .eggGroup1 = EGG_GROUP_UNDISCOVERED,\ + .eggGroup2 = EGG_GROUP_UNDISCOVERED,\ + .ability1 = ABILITY_NONE, \ + .ability2 = ABILITY_NONE, \ + .safariZoneFleeRate = 0, \ + .bodyColor = BODY_COLOR_BLACK, \ + .noFlip = FALSE, \ + } + const struct BaseStats gBaseStats[] = { [SPECIES_NONE] = {0}, @@ -8289,830 +8322,55 @@ const struct BaseStats gBaseStats[] = .noFlip = FALSE, }, - [SPECIES_OLD_UNOWN_B] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_B] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_C] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_C] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_D] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_D] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_E] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_E] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_F] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_F] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_G] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_G] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_H] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_H] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_I] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_I] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_J] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_J] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_K] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_K] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_L] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_L] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_M] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_M] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_N] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_N] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_O] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_O] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_P] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_P] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_Q] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_Q] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_R] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_R] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_S] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_S] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_T] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_T] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_U] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_U] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_V] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_V] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_W] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_W] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_X] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_X] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_Y] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_Y] = OLD_UNOWN_BASE_STATS, - [SPECIES_OLD_UNOWN_Z] = - { - .baseHP = 50, - .baseAttack = 150, - .baseDefense = 50, - .baseSpeed = 150, - .baseSpAttack = 150, - .baseSpDefense = 50, - .type1 = TYPE_NORMAL, - .type2 = TYPE_NORMAL, - .catchRate = 3, - .expYield = 1, - .evYield_HP = 2, - .evYield_Attack = 2, - .evYield_Defense = 2, - .evYield_Speed = 2, - .evYield_SpAttack = 2, - .evYield_SpDefense = 2, - .item1 = ITEM_NONE, - .item2 = ITEM_NONE, - .genderRatio = MON_GENDERLESS, - .eggCycles = 120, - .friendship = 0, - .growthRate = GROWTH_MEDIUM_FAST, - .eggGroup1 = EGG_GROUP_UNDISCOVERED, - .eggGroup2 = EGG_GROUP_UNDISCOVERED, - .ability1 = ABILITY_NONE, - .ability2 = ABILITY_NONE, - .safariZoneFleeRate = 0, - .bodyColor = BODY_COLOR_BLACK, - .noFlip = FALSE, - }, + [SPECIES_OLD_UNOWN_Z] = OLD_UNOWN_BASE_STATS, [SPECIES_TREECKO] = { diff --git a/src/data/pokemon/tutor_learnsets.h b/src/data/pokemon/tutor_learnsets.h new file mode 100644 index 000000000..27fb40621 --- /dev/null +++ b/src/data/pokemon/tutor_learnsets.h @@ -0,0 +1,5783 @@ +#define TUTOR_MOVE_MEGA_PUNCH 0 +#define TUTOR_MOVE_SWORDS_DANCE 1 +#define TUTOR_MOVE_MEGA_KICK 2 +#define TUTOR_MOVE_BODY_SLAM 3 +#define TUTOR_MOVE_DOUBLE_EDGE 4 +#define TUTOR_MOVE_COUNTER 5 +#define TUTOR_MOVE_SEISMIC_TOSS 6 +#define TUTOR_MOVE_MIMIC 7 +#define TUTOR_MOVE_METRONOME 8 +#define TUTOR_MOVE_SOFT_BOILED 9 +#define TUTOR_MOVE_DREAM_EATER 10 +#define TUTOR_MOVE_THUNDER_WAVE 11 +#define TUTOR_MOVE_EXPLOSION 12 +#define TUTOR_MOVE_ROCK_SLIDE 13 +#define TUTOR_MOVE_SUBSTITUTE 14 +#define TUTOR_MOVE_DYNAMIC_PUNCH 15 +#define TUTOR_MOVE_ROLLOUT 16 +#define TUTOR_MOVE_PSYCH_UP 17 +#define TUTOR_MOVE_SNORE 18 +#define TUTOR_MOVE_ICY_WIND 19 +#define TUTOR_MOVE_ENDURE 20 +#define TUTOR_MOVE_MUD_SLAP 21 +#define TUTOR_MOVE_ICE_PUNCH 22 +#define TUTOR_MOVE_SWAGGER 23 +#define TUTOR_MOVE_SLEEP_TALK 24 +#define TUTOR_MOVE_SWIFT 25 +#define TUTOR_MOVE_DEFENSE_CURL 26 +#define TUTOR_MOVE_THUNDER_PUNCH 27 +#define TUTOR_MOVE_FIRE_PUNCH 28 +#define TUTOR_MOVE_FURY_CUTTER 29 + +const u16 gTutorMoves[] = +{ + [TUTOR_MOVE_MEGA_PUNCH] = MOVE_MEGA_PUNCH, + [TUTOR_MOVE_SWORDS_DANCE] = MOVE_SWORDS_DANCE, + [TUTOR_MOVE_MEGA_KICK] = MOVE_MEGA_KICK, + [TUTOR_MOVE_BODY_SLAM] = MOVE_BODY_SLAM, + [TUTOR_MOVE_DOUBLE_EDGE] = MOVE_DOUBLE_EDGE, + [TUTOR_MOVE_COUNTER] = MOVE_COUNTER, + [TUTOR_MOVE_SEISMIC_TOSS] = MOVE_SEISMIC_TOSS, + [TUTOR_MOVE_MIMIC] = MOVE_MIMIC, + [TUTOR_MOVE_METRONOME] = MOVE_METRONOME, + [TUTOR_MOVE_SOFT_BOILED] = MOVE_SOFT_BOILED, + [TUTOR_MOVE_DREAM_EATER] = MOVE_DREAM_EATER, + [TUTOR_MOVE_THUNDER_WAVE] = MOVE_THUNDER_WAVE, + [TUTOR_MOVE_EXPLOSION] = MOVE_EXPLOSION, + [TUTOR_MOVE_ROCK_SLIDE] = MOVE_ROCK_SLIDE, + [TUTOR_MOVE_SUBSTITUTE] = MOVE_SUBSTITUTE, + [TUTOR_MOVE_DYNAMIC_PUNCH] = MOVE_DYNAMIC_PUNCH, + [TUTOR_MOVE_ROLLOUT] = MOVE_ROLLOUT, + [TUTOR_MOVE_PSYCH_UP] = MOVE_PSYCH_UP, + [TUTOR_MOVE_SNORE] = MOVE_SNORE, + [TUTOR_MOVE_ICY_WIND] = MOVE_ICY_WIND, + [TUTOR_MOVE_ENDURE] = MOVE_ENDURE, + [TUTOR_MOVE_MUD_SLAP] = MOVE_MUD_SLAP, + [TUTOR_MOVE_ICE_PUNCH] = MOVE_ICE_PUNCH, + [TUTOR_MOVE_SWAGGER] = MOVE_SWAGGER, + [TUTOR_MOVE_SLEEP_TALK] = MOVE_SLEEP_TALK, + [TUTOR_MOVE_SWIFT] = MOVE_SWIFT, + [TUTOR_MOVE_DEFENSE_CURL] = MOVE_DEFENSE_CURL, + [TUTOR_MOVE_THUNDER_PUNCH] = MOVE_THUNDER_PUNCH, + [TUTOR_MOVE_FIRE_PUNCH] = MOVE_FIRE_PUNCH, + [TUTOR_MOVE_FURY_CUTTER] = MOVE_FURY_CUTTER, +}; + +#define TUTOR_LEARNSET(moves) ((u32)(moves)) +#define TUTOR(move) ((u64)1 << (TUTOR_##move)) + +static const u32 sTutorLearnsets[] = +{ + [SPECIES_NONE] = TUTOR_LEARNSET(0), + + [SPECIES_BULBASAUR] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_IVYSAUR] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_VENUSAUR] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_CHARMANDER] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_CHARMELEON] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_CHARIZARD] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SQUIRTLE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_WARTORTLE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_BLASTOISE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_CATERPIE] = TUTOR_LEARNSET(0), + + [SPECIES_METAPOD] = TUTOR_LEARNSET(0), + + [SPECIES_BUTTERFREE] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_WEEDLE] = TUTOR_LEARNSET(0), + + [SPECIES_KAKUNA] = TUTOR_LEARNSET(0), + + [SPECIES_BEEDRILL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_PIDGEY] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_PIDGEOTTO] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_PIDGEOT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_RATTATA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_RATICATE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_SPEAROW] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_FEAROW] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_EKANS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_ARBOK] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_PIKACHU] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH)), + + [SPECIES_RAICHU] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH)), + + [SPECIES_SANDSHREW] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SANDSLASH] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_NIDORAN_F] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_NIDORINA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_NIDOQUEEN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_NIDORAN_M] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_NIDORINO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_NIDOKING] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_CLEFAIRY] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SOFT_BOILED) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_CLEFABLE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SOFT_BOILED) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_VULPIX] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_NINETALES] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_JIGGLYPUFF] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_WIGGLYTUFF] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_ZUBAT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_GOLBAT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_ODDISH] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_GLOOM] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_VILEPLUME] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_PARAS] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_PARASECT] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_VENONAT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_VENOMOTH] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_DIGLETT] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_DUGTRIO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_MEOWTH] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_PERSIAN] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_PSYDUCK] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_GOLDUCK] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_MANKEY] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_PRIMEAPE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_GROWLITHE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_ARCANINE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_POLIWAG] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_POLIWHIRL] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_POLIWRATH] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_ABRA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_KADABRA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_ALAKAZAM] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_MACHOP] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_MACHOKE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_MACHAMP] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_BELLSPROUT] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_WEEPINBELL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_VICTREEBEL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_TENTACOOL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_TENTACRUEL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_GEODUDE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_GRAVELER] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_GOLEM] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_PONYTA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_RAPIDASH] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SLOWPOKE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SLOWBRO] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_MAGNEMITE] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_MAGNETON] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_FARFETCHD] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_DODUO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_DODRIO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SEEL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_DEWGONG] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_GRIMER] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_MUK] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_SHELLDER] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_CLOYSTER] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_GASTLY] = TUTOR_LEARNSET(TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_HAUNTER] = TUTOR_LEARNSET(TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_GENGAR] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_ONIX] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_DROWZEE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_HYPNO] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_KRABBY] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_KINGLER] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_VOLTORB] = TUTOR_LEARNSET(TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_ELECTRODE] = TUTOR_LEARNSET(TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_EXEGGCUTE] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_EXEGGUTOR] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_CUBONE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_MAROWAK] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_HITMONLEE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_HITMONCHAN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_LICKITUNG] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_KOFFING] = TUTOR_LEARNSET(TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_WEEZING] = TUTOR_LEARNSET(TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_RHYHORN] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_RHYDON] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_CHANSEY] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SOFT_BOILED) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_TANGELA] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_KANGASKHAN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_HORSEA] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SEADRA] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_GOLDEEN] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SEAKING] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_STARYU] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_STARMIE] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_MR_MIME] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_SCYTHER] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_JYNX] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_ELECTABUZZ] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_MAGMAR] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_PINSIR] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_TAUROS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_MAGIKARP] = TUTOR_LEARNSET(0), + + [SPECIES_GYARADOS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_LAPRAS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_DITTO] = TUTOR_LEARNSET(0), + + [SPECIES_EEVEE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_VAPOREON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_JOLTEON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_FLAREON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_PORYGON] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_OMANYTE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_OMASTAR] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_KABUTO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_KABUTOPS] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_AERODACTYL] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SNORLAX] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_ARTICUNO] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_ZAPDOS] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_MOLTRES] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_DRATINI] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_DRAGONAIR] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_DRAGONITE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_MEWTWO] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_MEW] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SOFT_BOILED) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_CHIKORITA] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_BAYLEEF] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_MEGANIUM] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_CYNDAQUIL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_QUILAVA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_TYPHLOSION] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_TOTODILE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_CROCONAW] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_FERALIGATR] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SENTRET] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_FURRET] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_HOOTHOOT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_NOCTOWL] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_LEDYBA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH)), + + [SPECIES_LEDIAN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH)), + + [SPECIES_SPINARAK] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_ARIADOS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_CROBAT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_CHINCHOU] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_LANTURN] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_PICHU] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_CLEFFA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SOFT_BOILED) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_IGGLYBUFF] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_TOGEPI] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SOFT_BOILED) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_TOGETIC] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SOFT_BOILED) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_NATU] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_XATU] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_MAREEP] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_FLAAFFY] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_AMPHAROS] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_BELLOSSOM] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_MARILL] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_AZUMARILL] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_SUDOWOODO] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_POLITOED] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_HOPPIP] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_SKIPLOOM] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_JUMPLUFF] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_AIPOM] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SUNKERN] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_SUNFLORA] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_YANMA] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_WOOPER] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_QUAGSIRE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_ESPEON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_UMBREON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_MURKROW] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SLOWKING] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_MISDREAVUS] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_UNOWN] = TUTOR_LEARNSET(0), + + [SPECIES_WOBBUFFET] = TUTOR_LEARNSET(0), + + [SPECIES_GIRAFARIG] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_PINECO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_FORRETRESS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_DUNSPARCE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_GLIGAR] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_STEELIX] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_SNUBBULL] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_GRANBULL] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_QWILFISH] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_SCIZOR] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SHUCKLE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_HERACROSS] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SNEASEL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_TEDDIURSA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_URSARING] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SLUGMA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_MAGCARGO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_SWINUB] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_PILOSWINE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_CORSOLA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_REMORAID] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_OCTILLERY] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_DELIBIRD] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_MANTINE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SKARMORY] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_HOUNDOUR] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_HOUNDOOM] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_KINGDRA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_PHANPY] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_DONPHAN] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_PORYGON2] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_STANTLER] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SMEARGLE] = TUTOR_LEARNSET(0), + + [SPECIES_TYROGUE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_HITMONTOP] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SMOOCHUM] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_ELEKID] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_MAGBY] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_MILTANK] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_BLISSEY] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SOFT_BOILED) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_RAIKOU] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_ENTEI] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SUICUNE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_LARVITAR] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_PUPITAR] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_TYRANITAR] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_LUGIA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_HO_OH] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_CELEBI] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_TREECKO] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_GROVYLE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SCEPTILE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_TORCHIC] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_COMBUSKEN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_BLAZIKEN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_MUDKIP] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_MARSHTOMP] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_SWAMPERT] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_POOCHYENA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_MIGHTYENA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_ZIGZAGOON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_LINOONE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_WURMPLE] = TUTOR_LEARNSET(0), + + [SPECIES_SILCOON] = TUTOR_LEARNSET(0), + + [SPECIES_BEAUTIFLY] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_CASCOON] = TUTOR_LEARNSET(0), + + [SPECIES_DUSTOX] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_LOTAD] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_LOMBRE] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_LUDICOLO] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_SEEDOT] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_NUZLEAF] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SHIFTRY] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_NINCADA] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_NINJASK] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SHEDINJA] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_TAILLOW] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SWELLOW] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SHROOMISH] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_BRELOOM] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SPINDA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_WINGULL] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_PELIPPER] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_SURSKIT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_MASQUERAIN] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_WAILMER] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_WAILORD] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_SKITTY] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_DELCATTY] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_KECLEON] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_BALTOY] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_CLAYDOL] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_NOSEPASS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_TORKOAL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_SABLEYE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_BARBOACH] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_WHISCASH] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_LUVDISC] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_CORPHISH] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_CRAWDAUNT] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_FEEBAS] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_MILOTIC] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_CARVANHA] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SHARPEDO] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_TRAPINCH] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_VIBRAVA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_FLYGON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_MAKUHITA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_HARIYAMA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_ELECTRIKE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_MANECTRIC] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_NUMEL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_CAMERUPT] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_SPHEAL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_SEALEO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_WALREIN] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_CACNEA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_CACTURNE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SNORUNT] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_GLALIE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_LUNATONE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_SOLROCK] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_AZURILL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_SPOINK] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_GRUMPIG] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_PLUSLE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH)), + + [SPECIES_MINUN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH)), + + [SPECIES_MAWILE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH)), + + [SPECIES_MEDITITE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_MEDICHAM] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_SWABLU] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_ALTARIA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_WYNAUT] = TUTOR_LEARNSET(0), + + [SPECIES_DUSKULL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_DUSCLOPS] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_ROSELIA] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SLAKOTH] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_VIGOROTH] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SLAKING] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_GULPIN] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_SWALOT] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_TROPIUS] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_WHISMUR] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_LOUDRED] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_EXPLOUD] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_CLAMPERL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_HUNTAIL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_GOREBYSS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT)), + + [SPECIES_ABSOL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SHUPPET] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_BANETTE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_SEVIPER] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_ZANGOOSE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_RELICANTH] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_ARON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_LAIRON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_AGGRON] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_CASTFORM] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_VOLBEAT] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH)), + + [SPECIES_ILLUMISE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH)), + + [SPECIES_LILEEP] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_CRADILY] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK)), + + [SPECIES_ANORITH] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_ARMALDO] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_RALTS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_KIRLIA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_GARDEVOIR] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_BAGON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SHELGON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_SALAMENCE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_BELDUM] = TUTOR_LEARNSET(0), + + [SPECIES_METANG] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_METAGROSS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_REGIROCK] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_REGICE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH)), + + [SPECIES_REGISTEEL] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_EXPLOSION) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH)), + + [SPECIES_KYOGRE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL)), + + [SPECIES_GROUDON] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_SWORDS_DANCE) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_RAYQUAZA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_LATIAS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_LATIOS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_FURY_CUTTER)), + + [SPECIES_JIRACHI] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_METRONOME) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_DEFENSE_CURL) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_DEOXYS] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH) + | TUTOR(MOVE_MEGA_KICK) + | TUTOR(MOVE_BODY_SLAM) + | TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_COUNTER) + | TUTOR(MOVE_SEISMIC_TOSS) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_THUNDER_WAVE) + | TUTOR(MOVE_ROCK_SLIDE) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_DYNAMIC_PUNCH) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_MUD_SLAP) + | TUTOR(MOVE_ICE_PUNCH) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_SWIFT) + | TUTOR(MOVE_THUNDER_PUNCH) + | TUTOR(MOVE_FIRE_PUNCH)), + + [SPECIES_CHIMECHO] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE) + | TUTOR(MOVE_MIMIC) + | TUTOR(MOVE_DREAM_EATER) + | TUTOR(MOVE_SUBSTITUTE) + | TUTOR(MOVE_ROLLOUT) + | TUTOR(MOVE_PSYCH_UP) + | TUTOR(MOVE_SNORE) + | TUTOR(MOVE_ICY_WIND) + | TUTOR(MOVE_ENDURE) + | TUTOR(MOVE_SWAGGER) + | TUTOR(MOVE_SLEEP_TALK) + | TUTOR(MOVE_DEFENSE_CURL)), + +}; + diff --git a/src/daycare.c b/src/daycare.c index 131540f6e..6bdbd987e 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -16,33 +16,16 @@ #include "menu.h" #include "international_string_util.h" #include "script.h" +#include "strings.h" #include "task.h" #include "window.h" +#include "party_menu.h" #include "list_menu.h" #include "overworld.h" #define EGG_MOVES_ARRAY_COUNT 10 #define EGG_LVL_UP_MOVES_ARRAY_COUNT 50 -// text -extern const u8 gText_MaleSymbol4[]; -extern const u8 gText_FemaleSymbol4[]; -extern const u8 gText_GenderlessSymbol[]; -extern const u8 gText_NewLine2[]; -extern const u8 gText_Exit4[]; -extern const u8 gText_Lv[]; -extern const u8 gExpandedPlaceholder_Empty[]; -extern const u8 gText_Exit[]; -extern const u8 gDaycareText_GetAlongVeryWell[]; -extern const u8 gDaycareText_GetAlong[]; -extern const u8 gDaycareText_DontLikeOther[]; -extern const u8 gDaycareText_PlayOther[]; - -extern u8 GetCursorSelectionMonId(void); -extern u16 ItemIdToBattleMoveId(u16); -extern void sub_819746C(u8, bool8); -extern void sub_81B9328(void); - // this file's functions static void ClearDaycareMonMail(struct DayCareMail *mail); static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare); @@ -653,7 +636,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru u16 i, j; numSharedParentMoves = 0; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { sHatchedEggMotherMoves[i] = 0; sHatchedEggFatherMoves[i] = 0; @@ -665,7 +648,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru sHatchedEggLevelUpMoves[i] = 0; numLevelUpMoves = GetLevelUpMovesBySpecies(GetMonData(egg, MON_DATA_SPECIES), sHatchedEggLevelUpMoves); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { sHatchedEggFatherMoves[i] = GetBoxMonData(father, MON_DATA_MOVE1 + i); sHatchedEggMotherMoves[i] = GetBoxMonData(mother, MON_DATA_MOVE1 + i); @@ -673,7 +656,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru numEggMoves = GetEggMoves(egg, sHatchedEggEggMoves); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (sHatchedEggFatherMoves[i] != MOVE_NONE) { @@ -692,7 +675,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru break; } } - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (sHatchedEggFatherMoves[i] != MOVE_NONE) { @@ -706,18 +689,18 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru } } } - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (sHatchedEggFatherMoves[i] == MOVE_NONE) break; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { if (sHatchedEggFatherMoves[i] == sHatchedEggMotherMoves[j] && sHatchedEggFatherMoves[i] != MOVE_NONE) sHatchedEggFinalMoves[numSharedParentMoves++] = sHatchedEggFatherMoves[i]; } } - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (sHatchedEggFinalMoves[i] == MOVE_NONE) break; @@ -901,7 +884,7 @@ static bool8 _DoEggActions_CheckHatch(struct DayCare *daycare) for (i = 0; i < DAYCARE_MON_COUNT; i++) { - if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SANITY_BIT2)) + if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SANITY_HAS_SPECIES)) daycare->mons[i].steps++, validEggs++; } @@ -922,7 +905,7 @@ static bool8 _DoEggActions_CheckHatch(struct DayCare *daycare) { if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) continue; - if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT1)) + if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_BAD_EGG)) continue; steps = GetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP); diff --git a/src/decompress.c b/src/decompress.c index 24d23209f..949b96990 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -22,7 +22,7 @@ void LZDecompressVram(const u32 *src, void *dest) LZ77UnCompVram(src, dest); } -u16 LoadCompressedObjectPic(const struct CompressedSpriteSheet *src) +u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src) { struct SpriteSheet dest; @@ -33,7 +33,7 @@ u16 LoadCompressedObjectPic(const struct CompressedSpriteSheet *src) return LoadSpriteSheet(&dest); } -void LoadCompressedObjectPicOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) +void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) { struct SpriteSheet dest; @@ -44,7 +44,7 @@ void LoadCompressedObjectPicOverrideBuffer(const struct CompressedSpriteSheet *s LoadSpriteSheet(&dest); } -void LoadCompressedObjectPalette(const struct CompressedSpritePalette *src) +void LoadCompressedSpritePalette(const struct CompressedSpritePalette *src) { struct SpritePalette dest; @@ -54,7 +54,7 @@ void LoadCompressedObjectPalette(const struct CompressedSpritePalette *src) LoadSpritePalette(&dest); } -void LoadCompressedObjectPaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer) +void LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer) { struct SpritePalette dest; @@ -66,7 +66,7 @@ void LoadCompressedObjectPaletteOverrideBuffer(const struct CompressedSpritePale void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void* buffer, s32 species) { - if (species > SPECIES_EGG) + if (species > NUM_SPECIES) LZ77UnCompWram(gMonFrontPicTable[0].data, buffer); else LZ77UnCompWram(src->data, buffer); @@ -102,7 +102,7 @@ void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 else LZ77UnCompWram(gMonFrontPicTable[i].data, dest); } - else if (species > SPECIES_EGG) // is species unknown? draw the ? icon + else if (species > NUM_SPECIES) // is species unknown? draw the ? icon LZ77UnCompWram(gMonFrontPicTable[0].data, dest); else LZ77UnCompWram(src->data, dest); @@ -465,7 +465,7 @@ u32 GetDecompressedDataSize(const u32 *ptr) return (ptr8[3] << 16) | (ptr8[2] << 8) | (ptr8[1]); } -bool8 LoadCompressedObjectPicUsingHeap(const struct CompressedSpriteSheet* src) +bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet* src) { struct SpriteSheet dest; void* buffer; @@ -482,7 +482,7 @@ bool8 LoadCompressedObjectPicUsingHeap(const struct CompressedSpriteSheet* src) return FALSE; } -bool8 LoadCompressedObjectPaletteUsingHeap(const struct CompressedSpritePalette *src) +bool8 LoadCompressedSpritePaletteUsingHeap(const struct CompressedSpritePalette *src) { struct SpritePalette dest; void* buffer; @@ -499,7 +499,7 @@ bool8 LoadCompressedObjectPaletteUsingHeap(const struct CompressedSpritePalette void DecompressPicFromTable_2(const struct CompressedSpriteSheet *src, void* buffer, s32 species) // a copy of DecompressPicFromTable { - if (species > SPECIES_EGG) + if (species > NUM_SPECIES) LZ77UnCompWram(gMonFrontPicTable[0].data, buffer); else LZ77UnCompWram(src->data, buffer); @@ -523,7 +523,7 @@ void LoadSpecialPokePic_2(const struct CompressedSpriteSheet *src, void *dest, s else LZ77UnCompWram(gMonFrontPicTable[i].data, dest); } - else if (species > SPECIES_EGG) // is species unknown? draw the ? icon + else if (species > NUM_SPECIES) // is species unknown? draw the ? icon LZ77UnCompWram(gMonFrontPicTable[0].data, dest); else LZ77UnCompWram(src->data, dest); @@ -546,7 +546,7 @@ void HandleLoadSpecialPokePic_2(const struct CompressedSpriteSheet *src, void *d void DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void* buffer, s32 species) { - if (species > SPECIES_EGG) + if (species > NUM_SPECIES) LZ77UnCompWram(gMonFrontPicTable[0].data, buffer); else LZ77UnCompWram(src->data, buffer); @@ -581,7 +581,7 @@ void LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src else LZ77UnCompWram(gMonFrontPicTable[i].data, dest); } - else if (species > SPECIES_EGG) // is species unknown? draw the ? icon + else if (species > NUM_SPECIES) // is species unknown? draw the ? icon LZ77UnCompWram(gMonFrontPicTable[0].data, dest); else LZ77UnCompWram(src->data, dest); diff --git a/src/decoration.c b/src/decoration.c index dd691721a..438f2cbd1 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -519,7 +519,7 @@ void sub_8126B80(u8 taskId) if (!gPaletteFade.active) { - menuPos = GetMenuCursorPos(); + menuPos = Menu_GetCursorPos(); switch (Menu_ProcessInput()) { default: @@ -527,7 +527,7 @@ void sub_8126B80(u8 taskId) sSecretBasePCMenuActions[sSecretBasePCMenuCursorPos].func.void_u8(taskId); break; case -2: - sSecretBasePCMenuCursorPos = GetMenuCursorPos(); + sSecretBasePCMenuCursorPos = Menu_GetCursorPos(); if ((s8)menuPos != sSecretBasePCMenuCursorPos) { sub_8126C08(); @@ -1131,7 +1131,7 @@ void sub_8127ACC(u8 taskId) void sub_8127B04(u8 taskId) { DrawWholeMapView(); - Overworld_SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]); + SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]); WarpIntoMap(); } @@ -2065,7 +2065,7 @@ u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 decor) LoadSpriteSheet(&sheet); palette.data = GetDecorationIconPicOrPalette(decor, 1); palette.tag = paletteTag; - LoadCompressedObjectPalette(&palette); + LoadCompressedSpritePalette(&palette); template = malloc(sizeof(struct SpriteTemplate)); *template = gItemIconSpriteTemplate; template->tileTag = tilesTag; diff --git a/src/dma3_manager.c b/src/dma3_manager.c index 28df9d932..51fa7072d 100644 --- a/src/dma3_manager.c +++ b/src/dma3_manager.c @@ -1,9 +1,6 @@ #include "global.h" #include "dma3.h" -// Maximum amount of data we will transfer in one operation -#define MAX_DMA_BLOCK_SIZE 0x1000 - #define MAX_DMA_REQUESTS 128 #define DMA_REQUEST_COPY32 1 @@ -40,49 +37,6 @@ void ClearDma3Requests(void) gDma3ManagerLocked = FALSE; } -#define Dma3CopyLarge_(src, dest, size, bit) \ -{ \ - const void *_src = src; \ - void *_dest = dest; \ - u32 _size = size; \ - while (1) \ - { \ - if (_size <= MAX_DMA_BLOCK_SIZE) \ - { \ - DmaCopy##bit(3, _src, _dest, _size); \ - break; \ - } \ - DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \ - _src += MAX_DMA_BLOCK_SIZE; \ - _dest += MAX_DMA_BLOCK_SIZE; \ - _size -= MAX_DMA_BLOCK_SIZE; \ - } \ -} - -#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16) -#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32) - -#define Dma3FillLarge_(value, dest, size, bit) \ -{ \ - void *_dest = dest; \ - u32 _size = size; \ - while (1) \ - { \ - if (_size <= MAX_DMA_BLOCK_SIZE) \ - { \ - DmaFill##bit(3, value, _dest, _size); \ - break; \ - } \ - DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \ - _dest += MAX_DMA_BLOCK_SIZE; \ - _size -= MAX_DMA_BLOCK_SIZE; \ - } \ -} - -#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16) -#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32) - - void ProcessDma3Requests(void) { u16 bytesTransferred; diff --git a/src/dragon.c b/src/dragon.c index 68577988e..4a2ac1c51 100644 --- a/src/dragon.c +++ b/src/dragon.c @@ -274,8 +274,8 @@ void sub_8113250(struct Sprite *sprite) sprite->data[4] = 0; sprite->data[5] = 1; sprite->data[6] = gBattleAnimArgs[0]; - r5 = sub_80A861C(gBattlerAttacker, 0); - r0 = sub_80A861C(gBattlerAttacker, 1); + r5 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_HEIGHT); + r0 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_WIDTH); if (r5 > r0) sprite->data[7] = r5 / 2; else diff --git a/src/easy_chat.c b/src/easy_chat.c index c4bc02e42..c84895df5 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -364,7 +364,7 @@ void easy_chat_input_maybe(void) default: return; } - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); sub_811A20C(gSpecialVar_0x8004, words, CB2_ReturnToFieldContinueScript, sizeParam); } @@ -383,7 +383,7 @@ static void sub_811A7E4(void) { lilycoveLady = &gSaveBlock1Ptr->lilycoveLady; lilycoveLady->quiz.unk_016 = -1; - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); sub_811A8F0(); } return; diff --git a/src/egg_hatch.c b/src/egg_hatch.c index ed25a2c68..e1d94889a 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -23,6 +23,7 @@ #include "bg.h" #include "m4a.h" #include "window.h" +#include "graphics.h" #include "constants/abilities.h" #include "daycare.h" #include "overworld.h" @@ -30,6 +31,7 @@ #include "field_weather.h" #include "international_string_util.h" #include "naming_screen.h" +#include "pokemon_storage_system.h" #include "field_screen_effect.h" #include "battle.h" // to get rid of later @@ -51,19 +53,10 @@ struct EggHatchData }; extern const struct CompressedSpriteSheet gMonFrontPicTable[]; -extern const u8 gBattleTextboxTiles[]; -extern const u8 gBattleTextboxTilemap[]; -extern const u8 gBattleTextboxPalette[]; -extern const u16 gTradeGba2_Pal[]; // palette, gameboy advance -extern const u32 gTradeGba_Gfx[]; // tileset gameboy advance extern const u32 gUnknown_08331F60[]; // tilemap gameboy circle extern const u8 gText_HatchedFromEgg[]; extern const u8 gText_NickHatchPrompt[]; -extern void PlayRainSoundEffect(void); -extern u16 sub_80D22D0(void); -extern u8 CountPartyAliveNonEggMonsExcept(u8); - static void Task_EggHatch(u8 taskID); static void CB2_EggHatch_0(void); static void CB2_EggHatch_1(void); @@ -382,7 +375,7 @@ static void AddHatchedMonToParty(u8 id) caughtLvl = 0; SetMonData(mon, MON_DATA_MET_LEVEL, &caughtLvl); - mapNameID = sav1_map_get_name(); + mapNameID = GetCurrentRegionMapSectionId(); SetMonData(mon, MON_DATA_MET_LOCATION, &mapNameID); MonRestorePP(mon); @@ -442,7 +435,7 @@ static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16* speciesLoc HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid); - LoadCompressedObjectPalette(GetMonSpritePalStruct(mon)); + LoadCompressedSpritePalette(GetMonSpritePalStruct(mon)); *speciesLoc = species; } break; @@ -474,7 +467,7 @@ static void Task_EggHatch(u8 taskID) { if (!gPaletteFade.active) { - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_EggHatch_0); gFieldCallback = sub_80AF168; DestroyTask(taskID); @@ -505,7 +498,7 @@ static void CB2_EggHatch_0(void) ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); - SetBgAttribute(1, BG_CTRL_ATTR_MOSAIC, 2); + SetBgAttribute(1, BG_ATTR_PRIORITY, 2); SetBgTilemapBuffer(1, Alloc(0x1000)); SetBgTilemapBuffer(0, Alloc(0x2000)); @@ -876,7 +869,7 @@ u8 GetEggStepsToSubtract(void) u8 count, i; for (count = CalculatePlayerPartyCount(), i = 0; i < count; i++) { - if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT3)) + if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_EGG)) { u8 ability = GetMonAbility(&gPlayerParty[i]); if (ability == ABILITY_MAGMA_ARMOR || ability == ABILITY_FLAME_BODY) @@ -888,7 +881,7 @@ u8 GetEggStepsToSubtract(void) u16 sub_80722E0(void) { - u16 value = sub_80D22D0(); - value += CountPartyAliveNonEggMonsExcept(6); - return value; + u16 aliveNonEggMonsCount = CountStorageNonEggMons(); + aliveNonEggMonsCount += CountPartyAliveNonEggMonsExcept(6); + return aliveNonEggMonsCount; } diff --git a/src/electric.c b/src/electric.c index ed495fa59..142a9ca09 100644 --- a/src/electric.c +++ b/src/electric.c @@ -6,7 +6,6 @@ #include "sound.h" extern void sub_810E2C8(struct Sprite *); -extern bool8 sub_810B614(struct Task *task, u8 taskId); extern void TranslateAnimSpriteToTargetMonLocation(struct Sprite *); static void sub_810A1A8(struct Sprite *); @@ -38,6 +37,8 @@ static void sub_810B1F0(struct Sprite *); static void sub_810B23C(struct Sprite *); static bool8 sub_810B430(struct Task *task, u8 taskId); static void sub_810B51C(struct Sprite *); +static bool8 sub_810B614(struct Task *task, u8 taskId); +static void sub_810B684(struct Sprite *sprite); const union AnimCmd gUnknown_085956A4[] = { @@ -462,7 +463,7 @@ static void sub_810A1A8(struct Sprite *sprite) sprite->pos1.x -= gBattleAnimArgs[0]; else sprite->pos1.x += gBattleAnimArgs[0]; - + sprite->pos1.y += gBattleAnimArgs[1]; sprite->callback = sub_810A1F8; } @@ -479,7 +480,7 @@ static void sub_810A214(struct Sprite *sprite) sprite->pos1.x -= gBattleAnimArgs[0]; else sprite->pos1.x += gBattleAnimArgs[0]; - + sprite->callback = sub_810A258; } @@ -493,7 +494,7 @@ static void sub_810A274(struct Sprite *sprite) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); - + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->pos1.x -= gBattleAnimArgs[0]; @@ -615,7 +616,7 @@ static void sub_810A5BC(struct Sprite *sprite) { if (IsContest() || GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[1]; sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; sprite->data[3] = gBattleAnimArgs[0]; @@ -686,17 +687,16 @@ void sub_810A7DC(u8 taskId) gTasks[taskId].func = sub_810A834; } -#ifdef NONMATCHING // couldn't get the proper tail merging in the "CreateSprite" switch cases.(ported from ruby) static void sub_810A834(u8 taskId) { u16 r8; + u16 r2; s16 r12; - s16 r2; u8 spriteId = 0; u8 r7 = 0; u8 sp = gTasks[taskId].data[2]; - s16 r4 = gTasks[taskId].data[0]; - s16 r6 = gTasks[taskId].data[1]; + s16 x = gTasks[taskId].data[0]; + s16 y = gTasks[taskId].data[1]; if (!gTasks[taskId].data[2]) { @@ -714,27 +714,31 @@ static void sub_810A834(u8 taskId) switch (gTasks[taskId].data[10]) { case 0: - r8 += r2 * 0; - spriteId = CreateSprite(&gUnknown_08595828, r4, r6 + (r12 * 1), 2); + r12 *= 1; + spriteId = CreateSprite(&gUnknown_08595828, x, y + r12, 2); r7++; break; case 2: + r12 *= 2; r8 += r2; - spriteId = CreateSprite(&gUnknown_08595828, r4, r6 + (r12 * 2), 2); + spriteId = CreateSprite(&gUnknown_08595828, x, y + r12, 2); r7++; break; case 4: + r12 *= 3; r8 += r2 * 2; - spriteId = CreateSprite(&gUnknown_08595828, r4, r6 + (r12 * 3), 2); + spriteId = CreateSprite(&gUnknown_08595828, x, y + r12, 2); r7++; break; case 6: + r12 *= 4; r8 += r2 * 3; - spriteId = CreateSprite(&gUnknown_08595828, r4, r6 + (r12 * 4), 2); + spriteId = CreateSprite(&gUnknown_08595828, x, y + r12, 2); r7++; break; case 8: - spriteId = CreateSprite(&gUnknown_08595828, r4, r6 + (r12 * 5), 2); + r12 *= 5; + spriteId = CreateSprite(&gUnknown_08595828, x, y + r12, 2); r7++; break; case 10: @@ -751,211 +755,6 @@ static void sub_810A834(u8 taskId) gTasks[taskId].data[10]++; } -#else -NAKED -static void sub_810A834(u8 taskId) -{ - asm_unified("\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ - movs r5, 0\n\ - movs r7, 0\n\ - ldr r1, =gTasks\n\ - lsls r0, 2\n\ - add r0, r9\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldrb r2, [r0, 0xC]\n\ - str r2, [sp]\n\ - ldrh r4, [r0, 0x8]\n\ - ldrh r6, [r0, 0xA]\n\ - movs r3, 0xC\n\ - ldrsh r0, [r0, r3]\n\ - mov r10, r1\n\ - cmp r0, 0\n\ - bne _0810A878\n\ - movs r0, 0\n\ - mov r8, r0\n\ - movs r2, 0x1\n\ - movs r1, 0x10\n\ - mov r12, r1\n\ - b _0810A882\n\ - .pool\n\ -_0810A878:\n\ - movs r2, 0x10\n\ - mov r12, r2\n\ - movs r3, 0x8\n\ - mov r8, r3\n\ - movs r2, 0x4\n\ -_0810A882:\n\ - mov r0, r9\n\ - lsls r1, r0, 2\n\ - adds r0, r1, r0\n\ - lsls r0, 3\n\ - add r0, r10\n\ - movs r3, 0x1C\n\ - ldrsh r0, [r0, r3]\n\ - mov r10, r1\n\ - cmp r0, 0xA\n\ - bhi _0810A978\n\ - lsls r0, 2\n\ - ldr r1, =_0810A8A4\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .pool\n\ - .align 2, 0\n\ -_0810A8A4:\n\ - .4byte _0810A8D0\n\ - .4byte _0810A978\n\ - .4byte _0810A8E4\n\ - .4byte _0810A978\n\ - .4byte _0810A904\n\ - .4byte _0810A978\n\ - .4byte _0810A91A\n\ - .4byte _0810A978\n\ - .4byte _0810A93C\n\ - .4byte _0810A978\n\ - .4byte _0810A970\n\ -_0810A8D0:\n\ - ldr r0, =gUnknown_08595828\n\ - lsls r1, r4, 16\n\ - asrs r1, 16\n\ - lsls r2, r6, 16\n\ - asrs r2, 16\n\ - mov r4, r12\n\ - lsls r3, r4, 16\n\ - b _0810A952\n\ - .pool\n\ -_0810A8E4:\n\ - mov r0, r12\n\ - lsls r3, r0, 17\n\ - mov r1, r8\n\ - adds r0, r1, r2\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ - ldr r0, =gUnknown_08595828\n\ - lsls r1, r4, 16\n\ - asrs r1, 16\n\ - lsls r2, r6, 16\n\ - asrs r2, 16\n\ - b _0810A952\n\ - .pool\n\ -_0810A904:\n\ - mov r3, r12\n\ - lsls r0, r3, 16\n\ - asrs r0, 16\n\ - lsls r3, r0, 1\n\ - adds r3, r0\n\ - lsls r0, r2, 1\n\ - add r0, r8\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ - b _0810A946\n\ -_0810A91A:\n\ - mov r0, r12\n\ - lsls r3, r0, 18\n\ - lsls r0, r2, 1\n\ - adds r0, r2\n\ - add r0, r8\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ - ldr r0, =gUnknown_08595828\n\ - lsls r1, r4, 16\n\ - asrs r1, 16\n\ - lsls r2, r6, 16\n\ - asrs r2, 16\n\ - b _0810A952\n\ - .pool\n\ -_0810A93C:\n\ - mov r1, r12\n\ - lsls r0, r1, 16\n\ - asrs r0, 16\n\ - lsls r3, r0, 2\n\ - adds r3, r0\n\ -_0810A946:\n\ - ldr r0, =gUnknown_08595828\n\ - lsls r1, r4, 16\n\ - asrs r1, 16\n\ - lsls r2, r6, 16\n\ - asrs r2, 16\n\ - lsls r3, 16\n\ -_0810A952:\n\ - asrs r3, 16\n\ - adds r2, r3\n\ - lsls r2, 16\n\ - asrs r2, 16\n\ - movs r3, 0x2\n\ - bl CreateSprite\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - b _0810A978\n\ - .pool\n\ -_0810A970:\n\ - mov r0, r9\n\ - bl DestroyAnimVisualTask\n\ - b _0810A9BC\n\ -_0810A978:\n\ - cmp r7, 0\n\ - beq _0810A9AC\n\ - ldr r4, =gSprites\n\ - lsls r3, r5, 4\n\ - adds r3, r5\n\ - lsls r3, 2\n\ - adds r0, r3, r4\n\ - ldrh r5, [r0, 0x4]\n\ - lsls r2, r5, 22\n\ - lsrs r2, 22\n\ - add r2, r8\n\ - ldr r6, =0x000003ff\n\ - adds r1, r6, 0\n\ - ands r2, r1\n\ - ldr r1, =0xfffffc00\n\ - ands r1, r5\n\ - orrs r1, r2\n\ - strh r1, [r0, 0x4]\n\ - mov r1, sp\n\ - ldrh r1, [r1]\n\ - strh r1, [r0, 0x2E]\n\ - adds r4, 0x1C\n\ - adds r3, r4\n\ - ldr r1, [r3]\n\ - bl _call_via_r1\n\ -_0810A9AC:\n\ - ldr r0, =gTasks\n\ - mov r1, r10\n\ - add r1, r9\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldrh r0, [r1, 0x1C]\n\ - adds r0, 0x1\n\ - strh r0, [r1, 0x1C]\n\ -_0810A9BC:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - "); -} -#endif static void sub_810A9DC(struct Sprite *sprite) { @@ -1002,7 +801,7 @@ void sub_810AAFC(u8 taskId) { struct Task *task = &gTasks[taskId]; - if (!gBattleAnimArgs[0]) + if (!gBattleAnimArgs[0]) { task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); task->data[15] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); @@ -1188,7 +987,7 @@ void sub_810AE5C(u8 taskId) } else task->data[0]++; - + } break; case 2: @@ -1334,6 +1133,7 @@ static void sub_810B23C(struct Sprite *sprite) case 1: if (sprite->affineAnimEnded) DestroySpriteAndMatrix(sprite); + break; } } @@ -1493,3 +1293,29 @@ void sub_810B55C(u8 taskId) break; } } + +bool8 sub_810B614(struct Task *task, u8 taskId) +{ + u8 spriteId = CreateSprite(&gUnknown_085956C0, task->data[13], task->data[14], task->data[12]); + + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].callback = sub_810B684; + gSprites[spriteId].data[6] = taskId; + gSprites[spriteId].data[7] = 10; + task->data[10]++; + } + if (task->data[14] >= task->data[15]) + return TRUE; + task->data[14] += 32; + return FALSE; +} + +static void sub_810B684(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + gTasks[sprite->data[6]].data[sprite->data[7]]--; + DestroySprite(sprite); + } +} diff --git a/src/event_obj_lock.c b/src/event_obj_lock.c index 8c324ea82..566b4931d 100644 --- a/src/event_obj_lock.c +++ b/src/event_obj_lock.c @@ -6,6 +6,7 @@ #include "script_movement.h" #include "task.h" #include "trainer_see.h" +#include "constants/event_objects.h" bool8 walkrun_is_standing_still(void) { @@ -89,20 +90,20 @@ void LockSelectedEventObject(void) void ScriptUnfreezeEventObjects(void) { - u8 objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0); - EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]); + u8 playerObjectId = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0); + EventObjectClearHeldMovementIfFinished(&gEventObjects[playerObjectId]); sub_80D338C(); UnfreezeEventObjects(); } void sub_8098524(void) { - u8 objectId; + u8 playerObjectId; if (gEventObjects[gSelectedEventObject].active) EventObjectClearHeldMovementIfFinished(&gEventObjects[gSelectedEventObject]); - objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0); - EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]); + playerObjectId = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0); + EventObjectClearHeldMovementIfFinished(&gEventObjects[playerObjectId]); sub_80D338C(); UnfreezeEventObjects(); } diff --git a/src/event_object_movement.c b/src/event_object_movement.c index ffa8f53c9..7cee717bf 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -6420,7 +6420,7 @@ bool8 MovementAction_FacePlayer_Step0(struct EventObject *eventObject, struct Sp { u8 playerObjectId; - if (!TryGetEventObjectIdByLocalIdAndMap(0xFF, 0, 0, &playerObjectId)) + if (!TryGetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0, &playerObjectId)) { FaceDirection(eventObject, sprite, GetDirectionToFace(eventObject->currentCoords.x, eventObject->currentCoords.y, gEventObjects[playerObjectId].currentCoords.x, gEventObjects[playerObjectId].currentCoords.y)); } @@ -6432,7 +6432,7 @@ bool8 MovementAction_FaceAwayPlayer_Step0(struct EventObject *eventObject, struc { u8 playerObjectId; - if (!TryGetEventObjectIdByLocalIdAndMap(0xFF, 0, 0, &playerObjectId)) + if (!TryGetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0, &playerObjectId)) { FaceDirection(eventObject, sprite, GetOppositeDirection(GetDirectionToFace(eventObject->currentCoords.x, eventObject->currentCoords.y, gEventObjects[playerObjectId].currentCoords.x, gEventObjects[playerObjectId].currentCoords.y))); } diff --git a/src/evolution_graphics.c b/src/evolution_graphics.c index 022599dfb..bfd46978c 100644 --- a/src/evolution_graphics.c +++ b/src/evolution_graphics.c @@ -251,7 +251,7 @@ static void CreatePostEvoSparkleSet2(u8 arg0) void LoadEvoSparkleSpriteAndPal(void) { - LoadCompressedObjectPicUsingHeap(&sEvoSparkleSpriteSheets[0]); + LoadCompressedSpriteSheetUsingHeap(&sEvoSparkleSpriteSheets[0]); LoadSpritePalettes(sEvoSparkleSpritePals); } diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 1070c69e9..c97e2d10f 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -1,33 +1,34 @@ #include "global.h" -#include "evolution_scene.h" -#include "evolution_graphics.h" -#include "sprite.h" #include "alloc.h" -#include "task.h" -#include "palette.h" -#include "main.h" -#include "text.h" -#include "text_window.h" -#include "pokemon.h" -#include "string_util.h" #include "battle.h" -#include "scanline_effect.h" +#include "battle_message.h" +#include "bg.h" +#include "data2.h" #include "decompress.h" +#include "evolution_scene.h" +#include "evolution_graphics.h" +#include "gpu_regs.h" +#include "link.h" #include "m4a.h" +#include "main.h" #include "menu.h" +#include "overworld.h" +#include "palette.h" #include "pokedex.h" -#include "constants/species.h" +#include "pokemon.h" +#include "scanline_effect.h" #include "sound.h" -#include "constants/songs.h" -#include "overworld.h" -#include "battle_message.h" -#include "constants/battle_string_ids.h" -#include "gpu_regs.h" -#include "bg.h" -#include "link.h" -#include "util.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "text_window.h" #include "trig.h" -#include "data2.h" +#include "trade.h" +#include "util.h" +#include "constants/battle_string_ids.h" +#include "constants/species.h" +#include "constants/songs.h" struct EvoInfo { @@ -50,12 +51,8 @@ extern const struct CompressedSpriteSheet gMonFrontPicTable[]; // strings extern const u8 gText_CommunicationStandby5[]; -extern void sub_807B154(void); -extern void sub_807F19C(void); -extern void sub_807B140(void); extern void ShowSelectMovePokemonSummaryScreen(struct Pokemon *party, u8 monId, u8 partyCount, void *CB2_ptr, u16 move); extern u8 sub_81C1B94(void); -extern void sub_807F1A8(u8 arg0, const u8 *arg1, u8 arg2); extern void sub_800E084(void); // this file's functions @@ -1479,20 +1476,20 @@ static void InitMovingBackgroundTask(bool8 isLink) if (!isLink) { - SetGpuReg(REG_OFFSET_BLDCNT, 0x442); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x808); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG2); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG2_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); - SetBgAttribute(innerBgId, BG_CTRL_ATTR_MOSAIC, 2); - SetBgAttribute(outerBgId, BG_CTRL_ATTR_MOSAIC, 2); + SetBgAttribute(innerBgId, BG_ATTR_PRIORITY, 2); + SetBgAttribute(outerBgId, BG_ATTR_PRIORITY, 2); ShowBg(1); ShowBg(2); } else { - SetGpuReg(REG_OFFSET_BLDCNT, 0x842); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x808); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); } @@ -1529,8 +1526,8 @@ static void sub_8140174(void) gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; - SetBgAttribute(1, BG_CTRL_ATTR_MOSAIC, sub_80391E0(1, 5)); - SetBgAttribute(2, BG_CTRL_ATTR_MOSAIC, sub_80391E0(2, 5)); + SetBgAttribute(1, BG_ATTR_PRIORITY, sub_80391E0(1, 5)); + SetBgAttribute(2, BG_ATTR_PRIORITY, sub_80391E0(2, 5)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); Free(sEvoMovingBgPtr); } diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 3774ef2b3..e6a859c84 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -27,7 +27,9 @@ #include "trainer_see.h" #include "wild_encounter.h" #include "constants/bg_event_constants.h" +#include "constants/event_objects.h" #include "constants/map_types.h" +#include "constants/maps.h" #include "constants/songs.h" extern bool32 sub_8196034(void); @@ -50,12 +52,12 @@ static bool32 TrySetupDiveDownScript(void); static bool32 TrySetupDiveEmergeScript(void); static bool8 TryStartStepBasedScript(struct MapPosition *, u16, u16); static bool8 CheckStandardWildEncounter(u16); -static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *, u16, u8); +static bool8 TryArrowWarp(struct MapPosition *, u16, u8); static bool8 IsWarpMetatileBehavior(u16); static bool8 IsArrowWarpMetatileBehavior(u16, u8); static s8 GetWarpEventAtMapPosition(struct MapHeader *, struct MapPosition *); -static void sub_809CEB0(struct MapHeader *, s8, struct MapPosition *); -static bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8); +static void SetupWarp(struct MapHeader *, s8, struct MapPosition *); +static bool8 TryDoorWarp(struct MapPosition *, u16, u8); static s8 GetWarpEventAtPosition(struct MapHeader *, u16, u16, u8); static u8 *GetCoordEventScriptAtPosition(struct MapHeader *, u16, u16, u8); static struct BgEvent *GetBackgroundEventAtPosition(struct MapHeader *, u16, u16, u8); @@ -72,8 +74,8 @@ void FieldClearPlayerInput(struct FieldInput *input) input->checkStandardWildEncounter = FALSE; input->pressedStartButton = FALSE; input->pressedSelectButton = FALSE; - input->input_field_0_4 = FALSE; - input->input_field_0_5 = FALSE; + input->heldDirection = FALSE; + input->heldDirection2 = FALSE; input->tookStep = FALSE; input->pressedBButton = FALSE; input->input_field_1_0 = FALSE; @@ -105,8 +107,8 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) if (heldKeys & (DPAD_UP | DPAD_DOWN | DPAD_LEFT | DPAD_RIGHT)) { - input->input_field_0_4 = TRUE; - input->input_field_0_5 = TRUE; + input->heldDirection = TRUE; + input->heldDirection2 = TRUE; } } @@ -152,15 +154,15 @@ int ProcessPlayerFieldInput(struct FieldInput *input) if (input->tookStep) { IncrementGameStat(GAME_STAT_STEPS); - increment_var_x4026_on_birth_island_modulo_100(); + IncrementBirthIslandRockStepCount(); if (TryStartStepBasedScript(&position, metatileBehavior, playerDirection) == TRUE) return TRUE; } if (input->checkStandardWildEncounter && CheckStandardWildEncounter(metatileBehavior) == TRUE) return TRUE; - if (input->input_field_0_4 && input->dpadDirection == playerDirection) + if (input->heldDirection && input->dpadDirection == playerDirection) { - if (mapheader_run_first_tag2_script_list_match_conditionally(&position, metatileBehavior, playerDirection) == TRUE) + if (TryArrowWarp(&position, metatileBehavior, playerDirection) == TRUE) return TRUE; } @@ -169,9 +171,9 @@ int ProcessPlayerFieldInput(struct FieldInput *input) if (input->pressedAButton && TryStartInteractionScript(&position, metatileBehavior, playerDirection) == TRUE) return TRUE; - if (input->input_field_0_5 && input->dpadDirection == playerDirection) + if (input->heldDirection2 && input->dpadDirection == playerDirection) { - if (map_warp_consider_2_to_inside(&position, metatileBehavior, playerDirection) == TRUE) + if (TryDoorWarp(&position, metatileBehavior, playerDirection) == TRUE) return TRUE; } if (input->pressedAButton && TrySetupDiveDownScript() == TRUE) @@ -265,7 +267,7 @@ const u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatil else eventObjectId = GetEventObjectIdByXYZ(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->height); - if (eventObjectId == 16 || gEventObjects[eventObjectId].localId == 0xFF) + if (eventObjectId == EVENT_OBJECTS_COUNT || gEventObjects[eventObjectId].localId == EVENT_OBJ_ID_PLAYER) return NULL; for (i = 0; i < 4; i++) @@ -286,14 +288,14 @@ static const u8 *GetInteractedEventObjectScript(struct MapPosition *position, u8 const u8 *script; eventObjectId = GetEventObjectIdByXYZ(position->x, position->y, position->height); - if (eventObjectId == 16 || gEventObjects[eventObjectId].localId == 0xFF) + if (eventObjectId == EVENT_OBJECTS_COUNT || gEventObjects[eventObjectId].localId == EVENT_OBJ_ID_PLAYER) { if (MetatileBehavior_IsCounter(metatileBehavior) != TRUE) return NULL; // Look for an event object on the other side of the counter. eventObjectId = GetEventObjectIdByXYZ(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->height); - if (eventObjectId == 16 || gEventObjects[eventObjectId].localId == 0xFF) + if (eventObjectId == EVENT_OBJECTS_COUNT || gEventObjects[eventObjectId].localId == EVENT_OBJ_ID_PLAYER) return NULL; } @@ -302,13 +304,10 @@ static const u8 *GetInteractedEventObjectScript(struct MapPosition *position, u8 gSpecialVar_Facing = direction; if (InTrainerHill() == TRUE) - { script = sub_81D62AC(); - } else - { script = GetEventObjectScriptPointerByEventObjectId(eventObjectId); - } + script = GetRamScript(gSpecialVar_LastTalked, script); return script; } @@ -379,7 +378,7 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me if (MetatileBehavior_IsCableBoxResults1(metatileBehavior) == TRUE) return EventScript_CableBoxResults; if (MetatileBehavior_IsPokeblockFeeder(metatileBehavior) == TRUE) - return EventScript_2A4BAC; + return EventScript_PokeBlockFeeder; if (MetatileBehavior_IsTrickHousePuzzleDoor(metatileBehavior) == TRUE) return Route110_TrickHouseEntrance_EventScript_26A22A; if (MetatileBehavior_IsRegionMap(metatileBehavior) == TRUE) @@ -685,15 +684,15 @@ static bool8 CheckStandardWildEncounter(u16 metatileBehavior) return FALSE; } -static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *position, u16 metatileBehavior, u8 direction) +static bool8 TryArrowWarp(struct MapPosition *position, u16 metatileBehavior, u8 direction) { s8 warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position); if (IsArrowWarpMetatileBehavior(metatileBehavior, direction) == TRUE && warpEventId != -1) { StoreInitialPlayerAvatarState(); - sub_809CEB0(&gMapHeader, warpEventId, position); - sub_80AF734(); + SetupWarp(&gMapHeader, warpEventId, position); + DoWarp(); return TRUE; } return FALSE; @@ -706,7 +705,7 @@ static bool8 TryStartWarpEventScript(struct MapPosition *position, u16 metatileB if (warpEventId != -1 && IsWarpMetatileBehavior(metatileBehavior) == TRUE) { StoreInitialPlayerAvatarState(); - sub_809CEB0(&gMapHeader, warpEventId, position); + SetupWarp(&gMapHeader, warpEventId, position); if (MetatileBehavior_IsEscalator(metatileBehavior) == TRUE) { sub_80AF80C(metatileBehavior); @@ -742,7 +741,7 @@ static bool8 TryStartWarpEventScript(struct MapPosition *position, u16 metatileB sub_80AF87C(); return TRUE; } - sub_80AF734(); + DoWarp(); return TRUE; } return FALSE; @@ -785,7 +784,7 @@ static s8 GetWarpEventAtMapPosition(struct MapHeader *mapHeader, struct MapPosit return GetWarpEventAtPosition(mapHeader, position->x - 7, position->y - 7, position->height); } -static void sub_809CEB0(struct MapHeader *unused, s8 warpEventId, struct MapPosition *position) +static void SetupWarp(struct MapHeader *unused, s8 warpEventId, struct MapPosition *position) { const struct WarpEvent *warpEvent; @@ -818,23 +817,23 @@ static void sub_809CEB0(struct MapHeader *unused, s8 warpEventId, struct MapPosi warpEvent = &gMapHeader.events->warps[warpEventId]; } - if (warpEvent->mapNum == 0x7F) + if (warpEvent->mapNum == MAP_NUM(NONE)) { - copy_saved_warp2_bank_and_enter_x_to_warp1(warpEvent->warpId); + SetWarpDestinationToDynamicWarp(warpEvent->warpId); } else { const struct MapHeader *mapHeader; - warp1_set_2(warpEvent->mapGroup, warpEvent->mapNum, warpEvent->warpId); - sub_8084D5C(position->x, position->y); + SetWarpDestinationToMapWarp(warpEvent->mapGroup, warpEvent->mapNum, warpEvent->warpId); + UpdateEscapeWarp(position->x, position->y); mapHeader = Overworld_GetMapHeaderByGroupAndId(warpEvent->mapGroup, warpEvent->mapNum); - if (mapHeader->events->warps[warpEvent->warpId].mapNum == 0x7F) - saved_warp2_set(mapHeader->events->warps[warpEventId].warpId, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, warpEventId); + if (mapHeader->events->warps[warpEvent->warpId].mapNum == MAP_NUM(NONE)) + SetDynamicWarp(mapHeader->events->warps[warpEventId].warpId, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, warpEventId); } } -static bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 metatileBehavior, u8 direction) +static bool8 TryDoorWarp(struct MapPosition *position, u16 metatileBehavior, u8 direction) { s8 warpEventId; @@ -842,17 +841,18 @@ static bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 met { if (MetatileBehavior_IsOpenSecretBaseDoor(metatileBehavior) == TRUE) { - sub_80E9668(position, gMapHeader.events); + WarpIntoSecretBase(position, gMapHeader.events); return TRUE; } + if (MetatileBehavior_IsWarpDoor(metatileBehavior) == TRUE) { warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position); if (warpEventId != -1 && IsWarpMetatileBehavior(metatileBehavior) == TRUE) { StoreInitialPlayerAvatarState(); - sub_809CEB0(&gMapHeader, warpEventId, position); - sub_80AF7D0(); + SetupWarp(&gMapHeader, warpEventId, position); + DoDoorWarp(); return TRUE; } } @@ -947,7 +947,7 @@ bool8 dive_warp(struct MapPosition *position, u16 metatileBehavior) if (SetDiveWarpEmerge(position->x - 7, position->y - 7)) { StoreInitialPlayerAvatarState(); - sp13E_warp_to_last_warp(); + DoDiveWarp(); PlaySE(SE_W291); return TRUE; } @@ -957,7 +957,7 @@ bool8 dive_warp(struct MapPosition *position, u16 metatileBehavior) if (SetDiveWarpDive(position->x - 7, position->y - 7)) { StoreInitialPlayerAvatarState(); - sp13E_warp_to_last_warp(); + DoDiveWarp(); PlaySE(SE_W291); return TRUE; } @@ -1002,6 +1002,6 @@ int SetCableClubWarp(void) GetPlayerMovementDirection(); //unnecessary GetPlayerPosition(&position); MapGridGetMetatileBehaviorAt(position.x, position.y); //unnecessary - sub_809CEB0(&gMapHeader, GetWarpEventAtMapPosition(&gMapHeader, &position), &position); + SetupWarp(&gMapHeader, GetWarpEventAtMapPosition(&gMapHeader, &position), &position); return 0; } diff --git a/src/field_effect.c b/src/field_effect.c index 1442c611a..badf57b16 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -9,9 +9,10 @@ #include "field_screen_effect.h" #include "field_weather.h" #include "fieldmap.h" -#include "fldeff_groundshake.h" +#include "fldeff.h" #include "gpu_regs.h" #include "main.h" +#include "mirage_tower.h" #include "menu.h" #include "metatile_behavior.h" #include "overworld.h" @@ -229,7 +230,7 @@ static void sub_80B9A60(struct Task *); static void sub_80B9BE8(u8 taskId); static void sub_80B9DB8(struct Sprite* sprite); -static void sub_80B9EDC(u8 taskId); +static void Fldeff_MoveDeoxysRock_Step(u8 taskId); // Static RAM declarations @@ -733,8 +734,8 @@ bool8 FieldEffectActiveListContains(u8 id) u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer) { struct SpriteTemplate spriteTemplate; - LoadCompressedObjectPaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer); - LoadCompressedObjectPicOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer); + LoadCompressedSpritePaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer); + LoadCompressedSpriteSheetOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer); spriteTemplate.tileTag = gTrainerFrontPicTable[trainerSpriteID].tag; spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[trainerSpriteID].tag; spriteTemplate.oam = &gNewGameBirchOamAttributes; @@ -2170,7 +2171,7 @@ static void EscapeRopeFieldEffect_Step1(struct Task *task) if (task->data[14] == 0 && !gPaletteFade.active && BGMusicStopped() == TRUE) { SetEventObjectDirection(eventObject, task->data[15]); - sub_8084E14(); + SetWarpDestinationToEscapeWarp(); WarpIntoMap(); gFieldCallback = mapldr_080859D4; SetMainCallback2(CB2_LoadMap); @@ -2325,13 +2326,13 @@ static void TeleportFieldEffectTask4(struct Task *task) { if (task->data[5] == FALSE) { - sub_81BE72C(); + ClearMirageTowerPulseBlendEffect(); task->data[5] = TRUE; } if (BGMusicStopped() == TRUE) { - Overworld_SetWarpDestToLastHealLoc(); + SetWarpDestinationToLastHealLocation(); WarpIntoMap(); SetMainCallback2(CB2_LoadMap); gFieldCallback = mapldr_08085D88; @@ -2442,7 +2443,7 @@ static void sub_80B8410(struct Task *task) bool8 FldEff_FieldMoveShowMon(void) { u8 taskId; - if (is_map_type_1_2_3_5_or_6(Overworld_GetMapTypeOfSaveblockLocation()) == TRUE) + if (is_map_type_1_2_3_5_or_6(GetCurrentMapType()) == TRUE) { taskId = CreateTask(sub_80B8554, 0xff); } else @@ -3643,7 +3644,7 @@ static void sub_80B9DB8(struct Sprite* sprite) DestroySprite(sprite); } -bool8 sub_80B9E28(struct Sprite* sprite) +bool8 Fldeff_MoveDeoxysRock(struct Sprite* sprite) { u8 eventObjectIdBuffer; if (!TryGetEventObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &eventObjectIdBuffer)) @@ -3657,7 +3658,7 @@ bool8 sub_80B9E28(struct Sprite* sprite) xPos = (gFieldEffectArguments[3] - xPos) * 16; yPos = (gFieldEffectArguments[4] - yPos) * 16; ShiftEventObjectCoords(object, gFieldEffectArguments[3] + 7, gFieldEffectArguments[4] + 7); - taskId = CreateTask(sub_80B9EDC, 0x50); + taskId = CreateTask(Fldeff_MoveDeoxysRock_Step, 0x50); gTasks[taskId].data[1] = object->spriteId; gTasks[taskId].data[2] = gSprites[object->spriteId].pos1.x + xPos; gTasks[taskId].data[3] = gSprites[object->spriteId].pos1.y + yPos; @@ -3667,7 +3668,7 @@ bool8 sub_80B9E28(struct Sprite* sprite) return FALSE; } -static void sub_80B9EDC(u8 taskId) +static void Fldeff_MoveDeoxysRock_Step(u8 taskId) { // BUG: Possible divide by zero s16 *data = gTasks[taskId].data; diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 3046eccd5..53fd87e61 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -1228,13 +1228,11 @@ u32 ShowTreeDisguiseFieldEffect(void) return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, 24, 4); } - u32 ShowMountainDisguiseFieldEffect(void) { return ShowDisguiseFieldEffect(FLDEFF_MOUNTAIN_DISGUISE, 25, 3); } - u32 ShowSandDisguiseFieldEffect(void) { return ShowDisguiseFieldEffect(FLDEFF_SAND_DISGUISE, 28, 2); @@ -1579,3 +1577,19 @@ static void sub_81561FC(struct Sprite *sprite, u8 z, u8 offset) } } } + +// Unused data. Feel free to remove. +static const u8 gUnknown_085CDC6E[] = +{ + 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, + 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, + 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00 +}; diff --git a/src/field_message_box.c b/src/field_message_box.c index 46da9e9e5..5e23b5f6b 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -8,21 +8,21 @@ extern bool32 sub_8196094(void); extern void sub_8196080(u8*); -EWRAM_DATA u8 gUnknown_020375BC = 0; +static EWRAM_DATA u8 sFieldMessageBoxMode = 0; -void textbox_fdecode_auto_and_task_add(u8*, int); -void textbox_auto_and_task_add(void); +static void textbox_fdecode_auto_and_task_add(u8*, bool32); +static void textbox_auto_and_task_add(void); -void sub_8098128(void) +void InitFieldMessageBox(void) { - gUnknown_020375BC = 0; + sFieldMessageBoxMode = 0; gTextFlags.canABSpeedUpPrint = 0; gTextFlags.useAlternateDownArrow = 0; gTextFlags.autoScroll = 0; gTextFlags.forceMidTextSpeed = 0; } -void sub_8098154(u8 taskId) +static void sub_8098154(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -39,18 +39,18 @@ void sub_8098154(u8 taskId) case 2: if (RunTextPrintersAndIsPrinter0Active() != 1) { - gUnknown_020375BC = 0; + sFieldMessageBoxMode = 0; DestroyTask(taskId); } } } -void task_add_textbox(void) +static void task_add_textbox(void) { CreateTask(sub_8098154, 0x50); } -void task_del_textbox(void) +static void task_del_textbox(void) { u8 taskId = FindTaskIdByFunc(sub_8098154); if (taskId != 0xFF) @@ -59,10 +59,10 @@ void task_del_textbox(void) bool8 ShowFieldMessage(u8 *str) { - if (gUnknown_020375BC != 0) + if (sFieldMessageBoxMode != 0) return FALSE; textbox_fdecode_auto_and_task_add(str, 1); - gUnknown_020375BC = 2; + sFieldMessageBoxMode = 2; return TRUE; } @@ -70,57 +70,57 @@ void sub_8098214(u8 taskId) { if (!sub_8196094()) { - gUnknown_020375BC = 0; + sFieldMessageBoxMode = 0; DestroyTask(taskId); } } bool8 sub_8098238(u8 *str) { - if (gUnknown_020375BC != 0) + if (sFieldMessageBoxMode != 0) return FALSE; StringExpandPlaceholders(gStringVar4, str); CreateTask(sub_8098214, 0); sub_8196080(str); - gUnknown_020375BC = 2; + sFieldMessageBoxMode = 2; return TRUE; } bool8 ShowFieldAutoScrollMessage(u8 *str) { - if (gUnknown_020375BC != 0) + if (sFieldMessageBoxMode != 0) return FALSE; - gUnknown_020375BC = 3; + sFieldMessageBoxMode = 3; textbox_fdecode_auto_and_task_add(str, 0); return TRUE; } bool8 sub_80982A0(u8 *str) { - gUnknown_020375BC = 3; + sFieldMessageBoxMode = 3; textbox_fdecode_auto_and_task_add(str, 1); return TRUE; } bool8 sub_80982B8(void) { - if (gUnknown_020375BC != 0) + if (sFieldMessageBoxMode != 0) return FALSE; - gUnknown_020375BC = 2; + sFieldMessageBoxMode = 2; textbox_auto_and_task_add(); return TRUE; } -void textbox_fdecode_auto_and_task_add(u8* str, int a) +static void textbox_fdecode_auto_and_task_add(u8* str, bool32 allowSkippingDelayWithButtonPress) { StringExpandPlaceholders(gStringVar4, str); - AddTextPrinterForMessage(a); + AddTextPrinterForMessage(allowSkippingDelayWithButtonPress); task_add_textbox(); } -void textbox_auto_and_task_add(void) +static void textbox_auto_and_task_add(void) { - AddTextPrinterForMessage(1); + AddTextPrinterForMessage(TRUE); task_add_textbox(); } @@ -128,17 +128,17 @@ void HideFieldMessageBox(void) { task_del_textbox(); sub_8197434(0, 1); - gUnknown_020375BC = 0; + sFieldMessageBoxMode = 0; } u8 GetFieldMessageBoxMode(void) { - return gUnknown_020375BC; + return sFieldMessageBoxMode; } bool8 IsFieldMessageBoxHidden(void) { - if (gUnknown_020375BC == 0) + if (sFieldMessageBoxMode == 0) return TRUE; return FALSE; } @@ -147,11 +147,11 @@ void sub_8098358(void) { task_del_textbox(); NewMenuHelpers_DrawStdWindowFrame(0, 1); - gUnknown_020375BC = 0; + sFieldMessageBoxMode = 0; } void sub_8098374(void) { task_del_textbox(); - gUnknown_020375BC = 0; + sFieldMessageBoxMode = 0; } diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index a5aa23e32..7423216a4 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -723,7 +723,7 @@ static bool8 sub_808B1BC(s16 x, s16 y, u8 direction) { if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) && MapGridGetZCoordAt(x, y) == 3 - && GetEventObjectIdByXYZ(x, y, 3) == 16) + && GetEventObjectIdByXYZ(x, y, 3) == EVENT_OBJECTS_COUNT) { sub_808C750(direction); return TRUE; @@ -791,12 +791,9 @@ bool8 IsPlayerCollidingWithFarawayIslandMew(u8 direction) playerY = object->currentCoords.y; MoveCoords(direction, &playerX, &playerY); - mewObjectId = GetEventObjectIdByLocalIdAndMap(1, 0x39, 0x1A); - - if (mewObjectId == 16) - { + mewObjectId = GetEventObjectIdByLocalIdAndMap(1, MAP_NUM(FARAWAY_ISLAND_INTERIOR), MAP_GROUP(FARAWAY_ISLAND_INTERIOR)); + if (mewObjectId == EVENT_OBJECTS_COUNT) return FALSE; - } object = &gEventObjects[mewObjectId]; mewPrevX = object->previousCoords.x; @@ -1310,7 +1307,7 @@ bool8 PartyHasMonWithSurf(void) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE) break; - if (pokemon_has_move(&gPlayerParty[i], MOVE_SURF)) + if (MonKnowsMove(&gPlayerParty[i], MOVE_SURF)) return TRUE; } } @@ -1389,7 +1386,7 @@ void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) u8 eventObjectId; struct EventObject *eventObject; - playerEventObjTemplate.localId = 0xFF; + playerEventObjTemplate.localId = EVENT_OBJ_ID_PLAYER; playerEventObjTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, gender); playerEventObjTemplate.x = x - 7; playerEventObjTemplate.y = y - 7; @@ -1845,7 +1842,7 @@ static bool8 Fishing6(struct Task *task) } else { - if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)) + if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) { u8 ability = GetMonAbility(&gPlayerParty[0]); if (ability == ABILITY_SUCTION_CUPS || ability == ABILITY_STICKY_HOLD) diff --git a/src/field_poison.c b/src/field_poison.c index 7aaab902f..fac17dea9 100644 --- a/src/field_poison.c +++ b/src/field_poison.c @@ -122,7 +122,7 @@ s32 DoPoisonFieldEffect(void) u32 numFainted = 0; for (i = 0; i < PARTY_SIZE; i++) { - if (GetMonData(pokemon, MON_DATA_SANITY_BIT2) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN) + if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN) { hp = GetMonData(pokemon, MON_DATA_HP); if (hp == 0 || --hp == 0) diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index b0572b393..b9e9272d4 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -17,6 +17,7 @@ #include "load_save.h" #include "main.h" #include "menu.h" +#include "mirage_tower.h" #include "event_obj_lock.h" #include "metatile_behavior.h" #include "palette.h" @@ -34,7 +35,6 @@ extern bool32 sub_81D6534(void); extern bool8 walkrun_is_standing_still(void); extern void ScriptUnfreezeEventObjects(void); -extern void sub_81BE72C(void); extern void sub_80FB768(void); extern void sub_808D194(void); extern void sub_808D1C8(void); @@ -89,7 +89,7 @@ static void palette_bg_faded_fill_black(void) void pal_fill_for_maplights(void) { u8 previousMapType = GetLastUsedWarpMapType(); - switch (GetMapPairFadeFromType(previousMapType, Overworld_GetMapTypeOfSaveblockLocation())) + switch (GetMapPairFadeFromType(previousMapType, GetCurrentMapType())) { case 0: palette_bg_faded_fill_black(); @@ -115,7 +115,7 @@ void pal_fill_black(void) void WarpFadeScreen(void) { - u8 currentMapType = Overworld_GetMapTypeOfSaveblockLocation(); + u8 currentMapType = GetCurrentMapType(); switch (GetMapPairFadeToType(currentMapType, GetDestinationWarpMapHeader()->mapType)) { case 0: @@ -215,7 +215,7 @@ static void sub_80AF234(u8 taskId) task->data[0]++; break; case 1: - if (!sub_800A520()) + if (!IsLinkTaskFinished()) { if (++task->data[1] > 1800) sub_8011170(0x6000); @@ -248,7 +248,7 @@ void sub_80AF2B4(u8 taskId) task->data[0]++; break; case 1: - if (sub_800A520()) + if (IsLinkTaskFinished()) { task->data[0]++; } @@ -498,7 +498,7 @@ static bool32 sub_80AF71C(void) return FALSE; } -void sub_80AF734(void) +void DoWarp(void) { ScriptContext2_Enable(); TryFadeOutOldMapMusic(); @@ -509,7 +509,7 @@ void sub_80AF734(void) CreateTask(sub_80AFA0C, 10); } -void sp13E_warp_to_last_warp(void) +void DoDiveWarp(void) { ScriptContext2_Enable(); TryFadeOutOldMapMusic(); @@ -529,16 +529,16 @@ void sub_80AF79C(void) CreateTask(sub_80AFA0C, 10); } -void sub_80AF7D0(void) +void DoDoorWarp(void) { ScriptContext2_Enable(); gFieldCallback = mapldr_default; CreateTask(sub_80AFA88, 10); } -void sp13F_fall_to_last_warp(void) +void DoFallWarp(void) { - sp13E_warp_to_last_warp(); + DoDiveWarp(); gFieldCallback = sub_80B6B68; } @@ -673,7 +673,7 @@ static void sub_80AFA0C(u8 taskId) { if (task->data[1] == 0) { - sub_81BE72C(); + ClearMirageTowerPulseBlendEffect(); task->data[1] = 1; } if (BGMusicStopped()) diff --git a/src/field_special_scene.c b/src/field_special_scene.c index 1cabf63d6..579188f36 100644 --- a/src/field_special_scene.c +++ b/src/field_special_scene.c @@ -1,7 +1,12 @@ #include "global.h" #include "event_data.h" #include "event_object_movement.h" +#include "field_camera.h" +#include "field_screen_effect.h" +#include "field_specials.h" +#include "fieldmap.h" #include "main.h" +#include "overworld.h" #include "palette.h" #include "script.h" #include "script_movement.h" @@ -13,14 +18,6 @@ #define SECONDS(value) ((signed) (60.0 * value + 0.5)) -extern u8 GetSSTidalLocation(s8 *, s8 *, s16 *, s16 *); // should be in field_specials.h -extern void Overworld_SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y); -extern bool32 CountSSTidalStep(u16); -extern void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused); -extern void sp13E_warp_to_last_warp(void); -extern void saved_warp2_set(int unused, s8 mapGroup, s8 mapNum, s8 warpId); -extern void sub_80AF8B8(void); - // porthole states enum { @@ -30,20 +27,13 @@ enum EXIT_PORTHOLE, }; -extern void SetCameraPanning(s16 x, s16 y); -extern void SetCameraPanningCallback(void ( *callback)()); -extern void InstallCameraPanAheadCallback(); -extern void pal_fill_black(void); -extern void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatileId); -extern void DrawWholeMapView(); - //. rodata static const s8 gTruckCamera_HorizontalTable[] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, -1, -1, -1, 0}; const u8 gUnknown_0858E8AB[] = {0x18, 0xFE}; const u8 gUnknown_0858E8AD[] = {0x17, 0xFE}; // .text -void Task_Truck3(u8); +static void Task_Truck3(u8); s16 GetTruckCameraBobbingY(int a1) { @@ -121,7 +111,7 @@ void Task_Truck2(u8 taskId) } } -void Task_Truck3(u8 taskId) +static void Task_Truck3(u8 taskId) { s16 *data = gTasks[taskId].data; s16 cameraXpan; @@ -256,7 +246,7 @@ bool8 sub_80FB59C(void) } else { - Overworld_SetWarpDestination(mapGroup, mapNum, -1, x, y); + SetWarpDestination(mapGroup, mapNum, -1, x, y); return TRUE; } } @@ -312,8 +302,8 @@ void Task_HandlePorthole(u8 taskId) case EXIT_PORTHOLE: // exit porthole. FlagClear(0x4001); FlagClear(0x4000); - copy_saved_warp2_bank_and_enter_x_to_warp1(0); - sp13E_warp_to_last_warp(); + SetWarpDestinationToDynamicWarp(0); + DoDiveWarp(); DestroyTask(taskId); break; } @@ -349,7 +339,7 @@ void sub_80FB7A4(void) FlagSet(FLAG_SYS_CRUISE_MODE); FlagSet(0x4001); FlagSet(0x4000); - saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); sub_80FB59C(); sub_80AF8B8(); } diff --git a/src/field_specials.c b/src/field_specials.c index 3f945fcfb..5883e0245 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -47,6 +47,7 @@ #include "constants/event_objects.h" #include "constants/field_effects.h" #include "constants/items.h" +#include "constants/map_types.h" #include "constants/maps.h" #include "constants/songs.h" #include "constants/species.h" @@ -115,9 +116,9 @@ static void sub_813A738(u8 taskId); static void sub_813A600(u8 taskId); static void sub_813A664(u8 taskId); static void sub_813ABD4(u16 a0); -static void task_deoxys_sound(u8 taskId); -static void sub_813B0B4(u8 a0); -static void sub_813B160(u8 taskId); +static void Task_DeoxysRockInteraction(u8 taskId); +static void ChangeDeoxysRockLevel(u8 a0); +static void WaitForDeoxysRockMovement(u8 taskId); static void sub_813B57C(u8 taskId); static void sub_813B824(u8 taskId); static void _fwalk(u8 taskId); @@ -391,11 +392,11 @@ bool32 sub_8138120(void) { switch (gMapHeader.mapType) { - case 1: - case 2: - case 3: - case 6: - if (++(*GetVarPointer(VAR_0x40F3)) < 0xA) + case MAP_TYPE_TOWN: + case MAP_TYPE_CITY: + case MAP_TYPE_ROUTE: + case MAP_TYPE_6: + if (++(*GetVarPointer(VAR_0x40F3)) < 10) { return FALSE; } @@ -945,11 +946,11 @@ void CableCarWarp(void) { if (gSpecialVar_0x8004 != 0) { - Overworld_SetWarpDestination(MAP_GROUP(ROUTE112_CABLE_CAR_STATION), MAP_NUM(ROUTE112_CABLE_CAR_STATION), -1, 6, 4); + SetWarpDestination(MAP_GROUP(ROUTE112_CABLE_CAR_STATION), MAP_NUM(ROUTE112_CABLE_CAR_STATION), -1, 6, 4); } else { - Overworld_SetWarpDestination(MAP_GROUP(MT_CHIMNEY_CABLE_CAR_STATION), MAP_NUM(MT_CHIMNEY_CABLE_CAR_STATION), -1, 6, 4); + SetWarpDestination(MAP_GROUP(MT_CHIMNEY_CABLE_CAR_STATION), MAP_NUM(MT_CHIMNEY_CABLE_CAR_STATION), -1, 6, 4); } } @@ -1266,7 +1267,7 @@ void IsGrassTypeInParty(void) for (i = 0; i < PARTY_SIZE; i++) { pokemon = &gPlayerParty[i]; - if (GetMonData(pokemon, MON_DATA_SANITY_BIT2) && !GetMonData(pokemon, MON_DATA_IS_EGG)) + if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) { species = GetMonData(pokemon, MON_DATA_SPECIES); if (gBaseStats[species].type1 == TYPE_GRASS || gBaseStats[species].type2 == TYPE_GRASS) @@ -1658,7 +1659,7 @@ bool8 sub_813990C(void) for (i = 0; i < partyCount; i++) { - if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT1) == 1) + if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_BAD_EGG) == 1) return TRUE; } @@ -1725,7 +1726,7 @@ const u16 gUnknown_085B2C06[][3] = void SetDepartmentStoreFloorVar(void) { u8 deptStoreFloor; - switch (gSaveBlock1Ptr->warp2.mapNum) + switch (gSaveBlock1Ptr->dynamicWarp.mapNum) { case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F): deptStoreFloor = 4; @@ -1757,9 +1758,9 @@ u16 sub_81399F4(void) gUnknown_0203AB60 = 0; gUnknown_0203AB62 = 0; - if (gSaveBlock1Ptr->warp2.mapGroup == 13) + if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_1F)) { - switch (gSaveBlock1Ptr->warp2.mapNum) + switch (gSaveBlock1Ptr->dynamicWarp.mapNum) { case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F): gUnknown_0203AB60 = 0; @@ -3193,7 +3194,7 @@ void sub_813AEB4(void) i = 0; do { - if (gUnknown_0861500C[i] == gUnknown_085B320C[temp2]) + if (gTutorMoves[i] == gUnknown_085B320C[temp2]) { gSpecialVar_0x8005 = i; break; @@ -3206,7 +3207,7 @@ void sub_813AEB4(void) i = 0; do { - if (gUnknown_0861500C[i] == gUnknown_085B31F8[temp2]) + if (gTutorMoves[i] == gUnknown_085B31F8[temp2]) { gSpecialVar_0x8005 = i; break; @@ -3233,12 +3234,12 @@ void sub_813AF48(void) } } -void sub_813AFC8(void) +void DoDeoxysRockInteraction(void) { - CreateTask(task_deoxys_sound, 8); + CreateTask(Task_DeoxysRockInteraction, 8); } -static const u16 gUnknown_085B3280[][16] = { +static const u16 sDeoxysRockPalettes[][16] = { INCBIN_U16("graphics/misc/deoxys1.gbapal"), INCBIN_U16("graphics/misc/deoxys2.gbapal"), INCBIN_U16("graphics/misc/deoxys3.gbapal"), @@ -3252,25 +3253,25 @@ static const u16 gUnknown_085B3280[][16] = { INCBIN_U16("graphics/misc/deoxys11.gbapal"), }; -static const u8 gUnknown_085B33E0[][2] = { - { 0x0f, 0x0c }, - { 0x0b, 0x0e }, - { 0x0f, 0x08 }, - { 0x13, 0x0e }, - { 0x0c, 0x0b }, - { 0x12, 0x0b }, - { 0x0f, 0x0e }, - { 0x0b, 0x0e }, - { 0x13, 0x0e }, - { 0x0f, 0x0f }, - { 0x0f, 0x0a }, +static const u8 sDeoxysRockCoords[][2] = { + { 15, 12 }, + { 11, 14 }, + { 15, 8 }, + { 19, 14 }, + { 12, 11 }, + { 18, 11 }, + { 15, 14 }, + { 11, 14 }, + { 19, 14 }, + { 15, 15 }, + { 15, 10 }, }; -static void task_deoxys_sound(u8 taskId) +static void Task_DeoxysRockInteraction(u8 taskId) { - static const u8 gUnknown_085B33F6[] = { 0x04, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x06, 0x03, 0x03 }; + static const u8 sStoneMaxStepCounts[] = { 4, 8, 8, 8, 4, 4, 4, 6, 3, 3 }; - if (FlagGet(FLAG_0x8D4) == TRUE) + if (FlagGet(FLAG_DEOXYS_ROCK_COMPLETE) == TRUE) { gSpecialVar_Result = 3; EnableBothScriptContexts(); @@ -3278,100 +3279,92 @@ static void task_deoxys_sound(u8 taskId) } else { - u16 temp1 = VarGet(VAR_0x4035); - u16 temp2 = VarGet(VAR_0x4034); + u16 rockLevel = VarGet(VAR_DEOXYS_ROCK_LEVEL); + u16 stepCount = VarGet(VAR_DEOXYS_ROCK_STEP_COUNT); - VarSet(VAR_0x4034, 0); - if (temp1 != 0 && gUnknown_085B33F6[temp1 - 1] < temp2) + VarSet(VAR_DEOXYS_ROCK_STEP_COUNT, 0); + if (rockLevel != 0 && sStoneMaxStepCounts[rockLevel - 1] < stepCount) { - sub_813B0B4(0); - VarSet(VAR_0x4035, 0); + // Player failed to take the shortest path to the stone, so it resets. + ChangeDeoxysRockLevel(0); + VarSet(VAR_DEOXYS_ROCK_LEVEL, 0); gSpecialVar_Result = 0; DestroyTask(taskId); } - else if (temp1 == 10) + else if (rockLevel == 10) { - FlagSet(FLAG_0x8D4); + FlagSet(FLAG_DEOXYS_ROCK_COMPLETE); gSpecialVar_Result = 2; EnableBothScriptContexts(); DestroyTask(taskId); } else { - temp1++; - sub_813B0B4(temp1); - VarSet(VAR_0x4035, temp1); + rockLevel++; + ChangeDeoxysRockLevel(rockLevel); + VarSet(VAR_DEOXYS_ROCK_LEVEL, rockLevel); gSpecialVar_Result = 1; DestroyTask(taskId); } } } -static void sub_813B0B4(u8 a0) +static void ChangeDeoxysRockLevel(u8 rockLevel) { u8 eventObjectId; - LoadPalette(&gUnknown_085B3280[a0], 0x1A0, 8); + LoadPalette(&sDeoxysRockPalettes[rockLevel], 0x1A0, 8); TryGetEventObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &eventObjectId); - if (a0 == 0) - { + if (rockLevel == 0) PlaySE(SE_W109); - } else - { PlaySE(SE_RG_DEOMOV); - } - - CreateTask(sub_813B160, 8); + CreateTask(WaitForDeoxysRockMovement, 8); gFieldEffectArguments[0] = 1; gFieldEffectArguments[1] = 58; gFieldEffectArguments[2] = 26; - gFieldEffectArguments[3] = gUnknown_085B33E0[a0][0]; - gFieldEffectArguments[4] = gUnknown_085B33E0[a0][1]; + gFieldEffectArguments[3] = sDeoxysRockCoords[rockLevel][0]; + gFieldEffectArguments[4] = sDeoxysRockCoords[rockLevel][1]; - if (a0 == 0) - { + if (rockLevel == 0) gFieldEffectArguments[5] = 60; - } else - { gFieldEffectArguments[5] = 5; - } - FieldEffectStart(FLDEFF_66); - Overworld_SetEventObjTemplateCoords(1, gUnknown_085B33E0[a0][0], gUnknown_085B33E0[a0][1]); + FieldEffectStart(FLDEFF_MOVE_DEOXYS_ROCK); + Overworld_SetEventObjTemplateCoords(1, sDeoxysRockCoords[rockLevel][0], sDeoxysRockCoords[rockLevel][1]); } -static void sub_813B160(u8 taskId) +static void WaitForDeoxysRockMovement(u8 taskId) { - if (FieldEffectActiveListContains(FLDEFF_66) == FALSE) + if (FieldEffectActiveListContains(FLDEFF_MOVE_DEOXYS_ROCK) == FALSE) { EnableBothScriptContexts(); DestroyTask(taskId); } } -void increment_var_x4026_on_birth_island_modulo_100(void) +void IncrementBirthIslandRockStepCount(void) { - u16 var = VarGet(VAR_0x4034); + u16 var = VarGet(VAR_DEOXYS_ROCK_STEP_COUNT); if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(BIRTH_ISLAND_EXTERIOR) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BIRTH_ISLAND_EXTERIOR)) { var++; if (var > 99) { - VarSet(VAR_0x4034, 0); + VarSet(VAR_DEOXYS_ROCK_STEP_COUNT, 0); } else { - VarSet(VAR_0x4034, var); + VarSet(VAR_DEOXYS_ROCK_STEP_COUNT, var); } } } void sub_813B1D0(void) { - LoadPalette(&gUnknown_085B3280[(u8)VarGet(VAR_0x4035)], 0x1A0, 8); + LoadPalette(&sDeoxysRockPalettes[(u8)VarGet(VAR_DEOXYS_ROCK_LEVEL)], 0x1A0, 8); BlendPalettes(0x04000000, 16, 0); } @@ -3616,7 +3609,7 @@ static void sub_813B57C(u8 taskId) } break; case 1: - if (sub_800A520() == TRUE) + if (IsLinkTaskFinished() == TRUE) { if (GetMultiplayerId() == 0) { @@ -3657,7 +3650,7 @@ static void sub_813B57C(u8 taskId) } break; case 3: - if (sub_800A520() == TRUE) + if (IsLinkTaskFinished() == TRUE) { if (GetMultiplayerId() != 0) { @@ -3709,14 +3702,14 @@ static void sub_813B57C(u8 taskId) } break; case 7: - if (sub_800A520() == 1) + if (IsLinkTaskFinished() == 1) { sub_800ADF8(); gTasks[taskId].data[0]++; } break; case 8: - if (sub_800A520() == 1) + if (IsLinkTaskFinished() == 1) { gTasks[taskId].data[0]++; } @@ -3813,11 +3806,11 @@ void sub_813B9A0(void) { if (gSaveBlock1Ptr->lastHealLocation.mapGroup == MAP_GROUP(DEWFORD_TOWN) && gSaveBlock1Ptr->lastHealLocation.mapNum == MAP_NUM(DEWFORD_TOWN)) { - Overworld_SetHealLocationWarp(3); + SetLastHealLocationWarp(3); } } -bool32 sub_813B9C0(void) +bool8 sub_813B9C0(void) { static const u16 gUnknown_085B3444[] = { MAP_OLDALE_TOWN_POKEMON_CENTER_1F, diff --git a/src/fieldmap.c b/src/fieldmap.c index 11161b8df..d2ff34b1c 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -1,11 +1,11 @@ #include "global.h" #include "bg.h" #include "fieldmap.h" +#include "fldeff.h" #include "fldeff_misc.h" -#include "fldeff_cut.h" -#include "fldeff_groundshake.h" #include "frontier_util.h" #include "menu.h" +#include "mirage_tower.h" #include "overworld.h" #include "palette.h" #include "pokenav.h" @@ -24,84 +24,94 @@ struct ConnectionFlags u8 east:1; }; -EWRAM_DATA static u16 gUnknown_02032318[0x2800] = {0}; +EWRAM_DATA static u16 gBackupMapData[MAX_MAP_DATA_SIZE] = {0}; EWRAM_DATA struct MapHeader gMapHeader = {0}; EWRAM_DATA struct Camera gCamera = {0}; -EWRAM_DATA static struct ConnectionFlags gUnknown_02037340 = {0}; +EWRAM_DATA static struct ConnectionFlags gMapConnectionFlags = {0}; EWRAM_DATA static u32 sFiller_02037344 = 0; // without this, the next file won't align properly -struct BackupMapLayout gUnknown_03005DC0; +struct BackupMapLayout gBackupMapLayout; static const struct ConnectionFlags sDummyConnectionFlags = {0}; +static void InitMapLayoutData(struct MapHeader *mapHeader); +static void InitBackupMapLayoutData(u16 *map, u16 width, u16 height); +static void FillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); +static void FillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); +static void FillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); +static void FillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); +static void InitBackupMapLayoutConnections(struct MapHeader *mapHeader); +static void LoadSavedMapView(void); +static bool8 SkipCopyingMetatileFromSavedMap(u16* mapMetatilePtr, u16 mapWidth, u8 yMode); + struct MapHeader const *const mapconnection_get_mapheader(struct MapConnection *connection) { return Overworld_GetMapHeaderByGroupAndId(connection->mapGroup, connection->mapNum); } -void not_trainer_hill_battle_pyramid(void) +void InitMap(void) { - mapheader_copy_mapdata_with_padding(&gMapHeader); + InitMapLayoutData(&gMapHeader); sub_80E8EE0(gMapHeader.events); mapheader_run_script_with_tag_x1(); } -void sub_8087D74(void) +void InitMapFromSavedGame(void) { - mapheader_copy_mapdata_with_padding(&gMapHeader); + InitMapLayoutData(&gMapHeader); sub_80E9238(0); sub_80E8EE0(gMapHeader.events); - mapdata_from_sav2(); + LoadSavedMapView(); mapheader_run_script_with_tag_x1(); - UpdateTVScreensOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height); + UpdateTVScreensOnMap(gBackupMapLayout.width, gBackupMapLayout.height); } -void battle_pyramid_map_load_related(u8 a0) +void InitBattlePyramidMap(u8 a0) { - CpuFastFill(0x03ff03ff, gUnknown_02032318, sizeof(gUnknown_02032318)); - sub_81AA078(gUnknown_02032318, a0); + CpuFastFill(0x03ff03ff, gBackupMapData, sizeof(gBackupMapData)); + sub_81AA078(gBackupMapData, a0); } -void trainer_hill_map_load_related(void) +void InitTrainerHillMap(void) { - CpuFastFill(0x03ff03ff, gUnknown_02032318, sizeof(gUnknown_02032318)); - sub_81D5FB4(gUnknown_02032318); + CpuFastFill(0x03ff03ff, gBackupMapData, sizeof(gBackupMapData)); + sub_81D5FB4(gBackupMapData); } -void mapheader_copy_mapdata_with_padding(struct MapHeader *mapHeader) +static void InitMapLayoutData(struct MapHeader *mapHeader) { struct MapLayout const *mapLayout; int width; int height; mapLayout = mapHeader->mapLayout; - CpuFastFill16(0x03ff, gUnknown_02032318, sizeof(gUnknown_02032318)); - gUnknown_03005DC0.map = gUnknown_02032318; + CpuFastFill16(0x03ff, gBackupMapData, sizeof(gBackupMapData)); + gBackupMapLayout.map = gBackupMapData; width = mapLayout->width + 15; - gUnknown_03005DC0.width = width; + gBackupMapLayout.width = width; height = mapLayout->height + 14; - gUnknown_03005DC0.height = height; - if (width * height <= 0x2800) + gBackupMapLayout.height = height; + if (width * height <= MAX_MAP_DATA_SIZE) { - map_copy_with_padding(mapLayout->map, mapLayout->width, mapLayout->height); - mapheader_copy_mapdata_of_adjacent_maps(mapHeader); + InitBackupMapLayoutData(mapLayout->map, mapLayout->width, mapLayout->height); + InitBackupMapLayoutConnections(mapHeader); } } -void map_copy_with_padding(u16 *map, u16 width, u16 height) +static void InitBackupMapLayoutData(u16 *map, u16 width, u16 height) { u16 *dest; int y; - dest = gUnknown_03005DC0.map; - dest += gUnknown_03005DC0.width * 7 + 7; + dest = gBackupMapLayout.map; + dest += gBackupMapLayout.width * 7 + 7; for (y = 0; y < height; y++) { CpuCopy16(map, dest, width * 2); - dest += width + 0xf; + dest += width + 15; map += width; } } -void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader) +static void InitBackupMapLayoutConnections(struct MapHeader *mapHeader) { int count; struct MapConnection *connection; @@ -111,56 +121,54 @@ void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader) { count = mapHeader->connections->count; connection = mapHeader->connections->connections; - - gUnknown_02037340 = sDummyConnectionFlags; + gMapConnectionFlags = sDummyConnectionFlags; for (i = 0; i < count; i++, connection++) { struct MapHeader const *cMap = mapconnection_get_mapheader(connection); u32 offset = connection->offset; - switch (connection->direction) { case CONNECTION_SOUTH: - fillSouthConnection(mapHeader, cMap, offset); - gUnknown_02037340.south = 1; + FillSouthConnection(mapHeader, cMap, offset); + gMapConnectionFlags.south = 1; break; case CONNECTION_NORTH: - fillNorthConnection(mapHeader, cMap, offset); - gUnknown_02037340.north = 1; + FillNorthConnection(mapHeader, cMap, offset); + gMapConnectionFlags.north = 1; break; case CONNECTION_WEST: - fillWestConnection(mapHeader, cMap, offset); - gUnknown_02037340.west = 1; + FillWestConnection(mapHeader, cMap, offset); + gMapConnectionFlags.west = 1; break; case CONNECTION_EAST: - fillEastConnection(mapHeader, cMap, offset); - gUnknown_02037340.east = 1; + FillEastConnection(mapHeader, cMap, offset); + gMapConnectionFlags.east = 1; break; } } } } -void sub_8087F54(int x, int y, struct MapHeader const *mapHeader, int x2, int y2, int width, int height) +static void sub_8087F54(int x, int y, struct MapHeader const *connectedMapHeader, int x2, int y2, int width, int height) { int i; u16 *src; u16 *dest; int mapWidth; - mapWidth = mapHeader->mapLayout->width; - src = &mapHeader->mapLayout->map[mapWidth * y2 + x2]; - dest = &gUnknown_03005DC0.map[gUnknown_03005DC0.width * y + x]; + mapWidth = connectedMapHeader->mapLayout->width; + src = &connectedMapHeader->mapLayout->map[mapWidth * y2 + x2]; + dest = &gBackupMapLayout.map[gBackupMapLayout.width * y + x]; for (i = 0; i < height; i++) { CpuCopy16(src, dest, width * 2); - dest += gUnknown_03005DC0.width; + dest += gBackupMapLayout.width; src += mapWidth; } } -void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +static void FillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { int x, y; int x2; @@ -176,26 +184,26 @@ void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader con { x2 = -x; x += cWidth; - if (x < gUnknown_03005DC0.width) + if (x < gBackupMapLayout.width) { width = x; } else { - width = gUnknown_03005DC0.width; + width = gBackupMapLayout.width; } x = 0; } else { x2 = 0; - if (x + cWidth < gUnknown_03005DC0.width) + if (x + cWidth < gBackupMapLayout.width) { width = cWidth; } else { - width = gUnknown_03005DC0.width - x; + width = gBackupMapLayout.width - x; } } @@ -207,7 +215,7 @@ void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader con } } -void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +static void FillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { int x; int x2, y2; @@ -224,26 +232,26 @@ void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader con { x2 = -x; x += cWidth; - if (x < gUnknown_03005DC0.width) + if (x < gBackupMapLayout.width) { width = x; } else { - width = gUnknown_03005DC0.width; + width = gBackupMapLayout.width; } x = 0; } else { x2 = 0; - if (x + cWidth < gUnknown_03005DC0.width) + if (x + cWidth < gBackupMapLayout.width) { width = cWidth; } else { - width = gUnknown_03005DC0.width - x; + width = gBackupMapLayout.width - x; } } @@ -256,7 +264,7 @@ void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader con } } -void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +static void FillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { int y; int x2, y2; @@ -271,26 +279,26 @@ void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader cons if (y < 0) { y2 = -y; - if (y + cHeight < gUnknown_03005DC0.height) + if (y + cHeight < gBackupMapLayout.height) { height = y + cHeight; } else { - height = gUnknown_03005DC0.height; + height = gBackupMapLayout.height; } y = 0; } else { y2 = 0; - if (y + cHeight < gUnknown_03005DC0.height) + if (y + cHeight < gBackupMapLayout.height) { height = cHeight; } else { - height = gUnknown_03005DC0.height - y; + height = gBackupMapLayout.height - y; } } @@ -302,7 +310,7 @@ void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader cons } } -void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +static void FillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { int x, y; int y2; @@ -316,26 +324,26 @@ void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader cons if (y < 0) { y2 = -y; - if (y + cHeight < gUnknown_03005DC0.height) + if (y + cHeight < gBackupMapLayout.height) { height = y + cHeight; } else { - height = gUnknown_03005DC0.height; + height = gBackupMapLayout.height; } y = 0; } else { y2 = 0; - if (y + cHeight < gUnknown_03005DC0.height) + if (y + cHeight < gBackupMapLayout.height) { height = cHeight; } else { - height = gUnknown_03005DC0.height - y; + height = gBackupMapLayout.height - y; } } @@ -364,10 +372,10 @@ u8 MapGridGetZCoordAt(int x, int y) int i; u16 *border; - if (x >= 0 && x < gUnknown_03005DC0.width - && y >= 0 && y < gUnknown_03005DC0.height) + if (x >= 0 && x < gBackupMapLayout.width + && y >= 0 && y < gBackupMapLayout.height) { - block = gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y]; + block = gBackupMapLayout.map[x + gBackupMapLayout.width * y]; } else { @@ -392,10 +400,10 @@ u8 MapGridIsImpassableAt(int x, int y) int i; u16 *border; - if (x >= 0 && x < gUnknown_03005DC0.width - && y >= 0 && y < gUnknown_03005DC0.height) + if (x >= 0 && x < gBackupMapLayout.width + && y >= 0 && y < gBackupMapLayout.height) { - block = gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y]; + block = gBackupMapLayout.map[x + gBackupMapLayout.width * y]; } else { @@ -421,10 +429,10 @@ u32 MapGridGetMetatileIdAt(int x, int y) u16 *border; u16 block2; - if (x >= 0 && x < gUnknown_03005DC0.width - && y >= 0 && y < gUnknown_03005DC0.height) + if (x >= 0 && x < gBackupMapLayout.width + && y >= 0 && y < gBackupMapLayout.height) { - block = gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y]; + block = gBackupMapLayout.map[x + gBackupMapLayout.width * y]; } else { @@ -462,22 +470,22 @@ u8 MapGridGetMetatileLayerTypeAt(int x, int y) void MapGridSetMetatileIdAt(int x, int y, u16 metatile) { int i; - if (x >= 0 && x < gUnknown_03005DC0.width - && y >= 0 && y < gUnknown_03005DC0.height) + if (x >= 0 && x < gBackupMapLayout.width + && y >= 0 && y < gBackupMapLayout.height) { - i = x + y * gUnknown_03005DC0.width; - gUnknown_03005DC0.map[i] = (gUnknown_03005DC0.map[i] & 0xf000) | (metatile & 0xfff); + i = x + y * gBackupMapLayout.width; + gBackupMapLayout.map[i] = (gBackupMapLayout.map[i] & 0xf000) | (metatile & 0xfff); } } void MapGridSetMetatileEntryAt(int x, int y, u16 metatile) { int i; - if (x >= 0 && x < gUnknown_03005DC0.width - && y >= 0 && y < gUnknown_03005DC0.height) + if (x >= 0 && x < gBackupMapLayout.width + && y >= 0 && y < gBackupMapLayout.height) { - i = x + gUnknown_03005DC0.width * y; - gUnknown_03005DC0.map[i] = metatile; + i = x + gBackupMapLayout.width * y; + gBackupMapLayout.map[i] = metatile; } } @@ -507,76 +515,75 @@ void save_serialize_map(void) u16 *mapView; int width; mapView = gSaveBlock1Ptr->mapView; - width = gUnknown_03005DC0.width; + width = gBackupMapLayout.width; x = gSaveBlock1Ptr->pos.x; y = gSaveBlock1Ptr->pos.y; for (i = y; i < y + 14; i++) { for (j = x; j < x + 15; j++) { - *mapView++ = gUnknown_02032318[width * i + j]; + *mapView++ = gBackupMapData[width * i + j]; } } } -int sub_8088438(void) +static bool32 SavedMapViewIsEmpty(void) { u16 i; - u32 r2; - r2 = 0; + u32 marker = 0; + + // BUG: This loop extends past the bounds of the mapView array. Its size is only 0x100. for (i = 0; i < 0x200; i++) - { - r2 |= gSaveBlock1Ptr->mapView[i]; - } - if (r2 == 0) - { - return 1; - } - return 0; + marker |= gSaveBlock1Ptr->mapView[i]; + + if (marker == 0) + return TRUE; + else + return FALSE; } -void sav2_mapdata_clear(void) +static void ClearSavedMapView(void) { CpuFill16(0, gSaveBlock1Ptr->mapView, sizeof(gSaveBlock1Ptr->mapView)); } -void mapdata_from_sav2(void) +static void LoadSavedMapView(void) { - u8 a0; + u8 yMode; int i, j; int x, y; u16 *mapView; int width; mapView = gSaveBlock1Ptr->mapView; - if (!sub_8088438()) + if (!SavedMapViewIsEmpty()) { - width = gUnknown_03005DC0.width; + width = gBackupMapLayout.width; x = gSaveBlock1Ptr->pos.x; y = gSaveBlock1Ptr->pos.y; for (i = y; i < y + 14; i++) { if (i == y && i != 0) - a0 = 0; + yMode = 0; else if (i == y + 13 && i != gMapHeader.mapLayout->height - 1) - a0 = 1; + yMode = 1; else - a0 = -1; + yMode = 0xFF; for (j = x; j < x + 15; j++) { - if (!sub_8088BF0(&gUnknown_02032318[j + width * i], width, a0)) - gUnknown_02032318[j + width * i] = *mapView; + if (!SkipCopyingMetatileFromSavedMap(&gBackupMapData[j + width * i], width, yMode)) + gBackupMapData[j + width * i] = *mapView; mapView++; } } for (j = x; j < x + 15; j++) { if (y != 0) - sub_80D423C(j, y - 1); + FixLongGrassMetatilesWindowTop(j, y - 1); if (i < gMapHeader.mapLayout->height - 1) - sub_80D42B8(j, y + 13); + FixLongGrassMetatilesWindowBottom(j, y + 13); } - sav2_mapdata_clear(); + ClearSavedMapView(); } } @@ -592,7 +599,7 @@ void sub_80885C4(u8 a1) int x, y; int i, j; mapView = gSaveBlock1Ptr->mapView; - width = gUnknown_03005DC0.width; + width = gBackupMapLayout.width; r9 = 0; r8 = 0; x0 = gSaveBlock1Ptr->pos.x; @@ -627,13 +634,13 @@ void sub_80885C4(u8 a1) desti = width * (y + y0); srci = (y + r8) * 15 + r9; src = &mapView[srci + i]; - dest = &gUnknown_02032318[x0 + desti + j]; + dest = &gBackupMapData[x0 + desti + j]; *dest = *src; i++; j++; } } - sav2_mapdata_clear(); + ClearSavedMapView(); } int GetMapBorderIdAt(int x, int y) @@ -641,12 +648,12 @@ int GetMapBorderIdAt(int x, int y) struct MapLayout const *mapLayout; u16 block, block2; int i, j; - if (x >= 0 && x < gUnknown_03005DC0.width - && y >= 0 && y < gUnknown_03005DC0.height) + if (x >= 0 && x < gBackupMapLayout.width + && y >= 0 && y < gBackupMapLayout.height) { - i = gUnknown_03005DC0.width; + i = gBackupMapLayout.width; i *= y; - block = gUnknown_03005DC0.map[x + i]; + block = gBackupMapLayout.map[x + i]; if (block == 0x3ff) { goto fail; @@ -668,9 +675,9 @@ fail: return -1; success: - if (x >= (gUnknown_03005DC0.width - 8)) + if (x >= (gBackupMapLayout.width - 8)) { - if (!gUnknown_02037340.east) + if (!gMapConnectionFlags.east) { return -1; } @@ -678,15 +685,15 @@ success: } else if (x < 7) { - if (!gUnknown_02037340.west) + if (!gMapConnectionFlags.west) { return -1; } return CONNECTION_WEST; } - else if (y >= (gUnknown_03005DC0.height - 7)) + else if (y >= (gBackupMapLayout.height - 7)) { - if (!gUnknown_02037340.south) + if (!gMapConnectionFlags.south) { return -1; } @@ -694,7 +701,7 @@ success: } else if (y < 7) { - if (!gUnknown_02037340.north) + if (!gMapConnectionFlags.north) { return -1; } @@ -763,7 +770,7 @@ bool8 CameraMove(int x, int y) else { save_serialize_map(); - sub_81BE72C(); + ClearMirageTowerPulseBlendEffect(); old_x = gSaveBlock1Ptr->pos.x; old_y = gSaveBlock1Ptr->pos.y; connection = sub_8088950(direction, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y); @@ -891,13 +898,13 @@ void sub_8088B3C(u16 x, u16 y) gSaveBlock1Ptr->pos.y = y - 7; } -void sav1_camera_get_focus_coords(u16 *x, u16 *y) +void GetCameraFocusCoords(u16 *x, u16 *y) { *x = gSaveBlock1Ptr->pos.x + 7; *y = gSaveBlock1Ptr->pos.y + 7; } -void SetCameraCoords(u16 x, u16 y) +void SetPlayerCoords(u16 x, u16 y) { gSaveBlock1Ptr->pos.x = x; gSaveBlock1Ptr->pos.y = y; @@ -911,26 +918,26 @@ void GetCameraCoords(u16 *x, u16 *y) void sub_8088B94(int x, int y, int a2) { - if (x >= 0 && x < gUnknown_03005DC0.width && y >= 0 && y < gUnknown_03005DC0.height) + if (x >= 0 && x < gBackupMapLayout.width && y >= 0 && y < gBackupMapLayout.height) { if (a2 != 0) - gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y] |= 0xC00; + gBackupMapLayout.map[x + gBackupMapLayout.width * y] |= 0xC00; else - gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y] &= 0xF3FF; + gBackupMapLayout.map[x + gBackupMapLayout.width * y] &= 0xF3FF; } } -bool8 sub_8088BF0(u16* a0, u16 a1, u8 a2) +static bool8 SkipCopyingMetatileFromSavedMap(u16* mapMetatilePtr, u16 mapWidth, u8 yMode) { - if (a2 == 0xFF) + if (yMode == 0xFF) return FALSE; - if (a2 == 0) - a0 -= a1; + if (yMode == 0) + mapMetatilePtr -= mapWidth; else - a0 += a1; + mapMetatilePtr += mapWidth; - if (sub_80FADE4(*a0 & 0x3FF, a2) == 1) + if (sub_80FADE4(*mapMetatilePtr & 0x3FF, yMode) == 1) return TRUE; return FALSE; } @@ -986,7 +993,7 @@ void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOffset, u1 } else { - LoadCompressedPalette((u16*)tileset->palettes, destOffset, size); + LoadCompressedPalette((u32*)tileset->palettes, destOffset, size); nullsub_3(destOffset, size >> 1); } } diff --git a/src/fight.c b/src/fight.c index b7ca2e87a..c924effae 100644 --- a/src/fight.c +++ b/src/fight.c @@ -486,8 +486,8 @@ void sub_810CF30(struct Sprite *sprite) sprite->pos1.x = GetBattlerSpriteCoord(battler, 2); sprite->pos1.y = GetBattlerSpriteCoord(battler, 3); - xMod = sub_80A861C(battler, 1) / 2; - yMod = sub_80A861C(battler, 0) / 4; + xMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_WIDTH) / 2; + yMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4; x = Random2() % xMod; y = Random2() % yMod; diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c index 6a310efd2..348a1f46c 100644 --- a/src/fldeff_cut.c +++ b/src/fldeff_cut.c @@ -5,12 +5,11 @@ #include "field_effect.h" #include "field_player_avatar.h" #include "fieldmap.h" -#include "fldeff_cut.h" +#include "fldeff.h" #include "alloc.h" #include "metatile_behavior.h" #include "overworld.h" #include "party_menu.h" -#include "rom6.h" #include "script.h" #include "sound.h" #include "sprite.h" @@ -625,7 +624,7 @@ static void CutGrassSpriteCallbackEnd(struct Sprite *sprite) ScriptContext1_SetupScript(FarawayIsland_Interior_EventScript_267EDB); } -void sub_80D423C(s16 x, s16 y) +void FixLongGrassMetatilesWindowTop(s16 x, s16 y) { u8 metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); if (MetatileBehavior_IsLongGrass_Duplicate(metatileBehavior)) @@ -648,7 +647,7 @@ void sub_80D423C(s16 x, s16 y) } } -void sub_80D42B8(s16 x, s16 y) +void FixLongGrassMetatilesWindowBottom(s16 x, s16 y) { if (MapGridGetMetatileIdAt(x, y) == METATILE_ID_GRASS) { diff --git a/src/fldeff_dig.c b/src/fldeff_dig.c new file mode 100644 index 000000000..b39d25182 --- /dev/null +++ b/src/fldeff_dig.c @@ -0,0 +1,63 @@ +#include "global.h" +#include "braille_puzzles.h" +#include "field_effect.h" +#include "field_player_avatar.h" +#include "fldeff.h" +#include "item_use.h" +#include "overworld.h" +#include "party_menu.h" +#include "sprite.h" +#include "constants/field_effects.h" + +// static functions +static void hm2_dig(void); +static void sub_8135780(void); + +// text +bool8 SetUpFieldMove_Dig(void) +{ + if (CanUseEscapeRopeOnCurrMap() == TRUE) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = hm2_dig; + return TRUE; + } + else + { + return FALSE; + } +} + +static void hm2_dig(void) +{ + Overworld_ResetStateAfterDigEscRope(); + FieldEffectStart(FLDEFF_USE_DIG); + gFieldEffectArguments[0] = GetCursorSelectionMonId(); +} + +bool8 FldEff_UseDig(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_8135780 >> 16; + gTasks[taskId].data[9] = (u32)sub_8135780; + if (!ShouldDoBrailleDigEffect()) + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); + return FALSE; +} + +static void sub_8135780(void) +{ + u8 taskId; + + FieldEffectActiveListRemove(FLDEFF_USE_DIG); + if (ShouldDoBrailleDigEffect()) + { + DoBrailleDigEffect(); + } + else + { + taskId = CreateTask(task08_080A1C44, 8); + gTasks[taskId].data[0] = 0; + } +} diff --git a/src/fldeff_escalator.c b/src/fldeff_escalator.c index 7d3e07123..3d00fb162 100644 --- a/src/fldeff_escalator.c +++ b/src/fldeff_escalator.c @@ -2,18 +2,19 @@ #include "field_camera.h" #include "field_player_avatar.h" #include "fieldmap.h" +#include "fldeff.h" #include "task.h" static EWRAM_DATA u8 sEscalatorAnim_TaskId = 0; -void sub_80E12E8(u8 taskId, const s16 *list, u16 c) +static void sub_80E12E8(u8 taskId, const s16 *list, u16 c) { s16 r5 = gTasks[taskId].data[4] - 1; s16 r3 = gTasks[taskId].data[5] - 1; s16 r4 = gTasks[taskId].data[1]; s16 y; s16 x; - + if (gTasks[taskId].data[2] == 0) { for (y = 0; y < 3; y++) @@ -21,7 +22,7 @@ void sub_80E12E8(u8 taskId, const s16 *list, u16 c) for (x = 0; x < 3; x++) { s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); - + if (list[r4] == metatileId) { if (r4 != 2) @@ -39,7 +40,7 @@ void sub_80E12E8(u8 taskId, const s16 *list, u16 c) for (x = 0; x < 3; x++) { s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); - + if (list[2 - r4] == metatileId) { if (r4 != 2) @@ -60,7 +61,7 @@ static const u16 gUnknown_08589AD2[] = {0x2A0, 0x2A2, 0x2A4}; static const u16 gUnknown_08589AD8[] = {0x2A1, 0x2A3, 0x2A5}; static const u16 gUnknown_08589ADE[] = {0x2A8, 0x2AA, 0x2AC}; -void sub_80E1444(u8 taskId) +static void sub_80E1444(u8 taskId) { s16 *data = gTasks[taskId].data; @@ -100,7 +101,7 @@ void sub_80E1444(u8 taskId) } } -u8 sub_80E150C(u16 var) +static u8 sub_80E150C(u16 var) { u8 taskId = CreateTask(sub_80E1444, 0); s16 *data = gTasks[taskId].data; diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c index 8862caa9f..f3bd76cbf 100644 --- a/src/fldeff_flash.c +++ b/src/fldeff_flash.c @@ -3,12 +3,12 @@ #include "event_data.h" #include "event_scripts.h" #include "field_effect.h" +#include "fldeff.h" #include "gpu_regs.h" #include "main.h" #include "overworld.h" #include "palette.h" #include "party_menu.h" -#include "rom6.h" #include "script.h" #include "sound.h" #include "sprite.h" @@ -156,7 +156,7 @@ static bool8 sub_8137304(void) { u8 i; u8 v0 = GetLastUsedWarpMapType(); - u8 v1 = Overworld_GetMapTypeOfSaveblockLocation(); + u8 v1 = GetCurrentMapType(); for (i = 0; gUnknown_085B27C8[i].unk0; i++) { diff --git a/src/fldeff_groundshake.c b/src/fldeff_groundshake.c deleted file mode 100644 index 44ffd60f9..000000000 --- a/src/fldeff_groundshake.c +++ /dev/null @@ -1,320 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "event_object_movement.h" -#include "field_camera.h" -#include "alloc.h" -#include "random.h" -#include "roulette_util.h" -#include "script.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "constants/flags.h" -#include "constants/songs.h" - -// structures -struct Struct203CF18 { - u8 taskId; - struct InnerStruct203CF18 unk4; -}; //size = 0xC8 - -// extern data -extern const struct SpriteSheet gUnknown_08617D94[]; -extern const s16 gUnknown_08617D64[][3]; - -// static functions -static void sub_81BE808(u8 taskId); -static void sub_81BE900(u8 taskId); -static void sub_81BE968(void); -static void sub_81BE9C0(u8 taskId); -static void sub_81BEA00(u8 taskId); -static void sub_81BEA20(void); -static void sub_81BEAD8(struct Sprite* sprite); - -// rodata -const struct InnerStruct203CF18_3 gUnknown_08617E18 = { - .unk0 = 0x433b, - .unk2 = 0x61, - .unk4 = 0x0F, - .unk5 = 0x05, - .unk6 = 0xFF, - .unk7_0 = 0xB, - .unk7_4 = 0x1, - .unk7_6 = 0, - .unk7_7 = 1, -}; - -static const union AnimCmd gSpriteAnim_8617E20[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd *const gSpriteAnimTable_8617E28[] = -{ - gSpriteAnim_8617E20, -}; - -static const struct OamData gUnknown_08617E2C = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 0, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -static const struct SpriteTemplate gUnknown_08617E34 = { - .tileTag = 0x0FA0, - .paletteTag = 0xFFFF, - .oam = &gUnknown_08617E2C, - .anims = gSpriteAnimTable_8617E28, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81BEAD8 -}; - -static const union AnimCmd gSpriteAnim_8617E4C[] = -{ - ANIMCMD_FRAME(0, 12), - ANIMCMD_JUMP(0), -}; - -static const union AnimCmd *const gSpriteAnim_8617E54[] = -{ - gSpriteAnim_8617E4C, -}; - -static const struct OamData gSpriteAnim_8617E58 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 0, - .paletteNum = 0, - .affineParam = 0, -}; - -static const struct SpriteTemplate gUnknown_08617E60 = { - .tileTag = 0x0FA0, - .paletteTag = 0xFFFF, - .oam = &gSpriteAnim_8617E58, - .anims = gSpriteAnim_8617E54, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81BEAD8 -}; - -// ewram -EWRAM_DATA struct Struct203CF18 *gUnknown_0203CF18 = NULL; - -// text -bool8 sub_81BE66C(void) -{ - if (!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A)) - return 0; - return FlagGet(FLAG_0x14E); -} - -void sub_81BE698(u8 taskId) -{ - sub_8151E50(&(gUnknown_0203CF18->unk4)); -} - -void sub_81BE6AC(void) -{ - gUnknown_0203CF18 = NULL; -} - -void sub_81BE6B8(void) -{ - if(gUnknown_0203CF18 != NULL) - { - gUnknown_0203CF18 = NULL; - return; - } - if(!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A) || !FlagGet(FLAG_0x14E)) - return; - - gUnknown_0203CF18 = (struct Struct203CF18 *)AllocZeroed(sizeof(struct Struct203CF18)); - sub_8151B3C(&(gUnknown_0203CF18->unk4)); - sub_8151B68(&(gUnknown_0203CF18->unk4), &gUnknown_08617E18); - sub_8151CA8(&(gUnknown_0203CF18->unk4), 1, 1); - gUnknown_0203CF18->taskId = CreateTask(sub_81BE698, 0xFF); -} - -void sub_81BE72C(void) -{ - if(!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A) || !FlagGet(FLAG_0x14E) || gUnknown_0203CF18 == NULL) - return; - if(FuncIsActiveTask(sub_81BE698)) - DestroyTask(gUnknown_0203CF18->taskId); - sub_8151D28(&(gUnknown_0203CF18->unk4), 1, 1); - sub_8151C50(&(gUnknown_0203CF18->unk4), 1, 1); - Free(gUnknown_0203CF18); - gUnknown_0203CF18 = NULL; -} - -void sub_81BE79C(void) -{ - u16 rand; - bool8 chance; - - if(VarGet(VAR_0x40CB) != 0) - { - FlagClear(FLAG_0x14E); - return; - } - rand = Random(); - chance = rand & 1; - if(FlagGet(FLAG_0x09D) == TRUE) - chance = TRUE; - if(chance) - { - FlagSet(FLAG_0x14E); - sub_81BE6B8(); - return; - } - FlagClear(FLAG_0x14E); -} - -void sub_81BE7F4(void) -{ - CreateTask(sub_81BE808, 0x8); -} - -static void sub_81BE808(u8 taskId) -{ - u8 eventObjectIdBuffer; - struct EventObject *fieldEventObject; - struct EventObject *playerAvatarEventObject; - - TryGetEventObjectIdByLocalIdAndMap(0x2D, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &eventObjectIdBuffer); - fieldEventObject = &(gEventObjects[eventObjectIdBuffer]); - gSprites[fieldEventObject->spriteId].pos2.y += 4; - playerAvatarEventObject = &(gEventObjects[gPlayerAvatar.eventObjectId]); - - if((gSprites[fieldEventObject->spriteId].pos1.y + gSprites[fieldEventObject->spriteId].pos2.y) >= - (gSprites[playerAvatarEventObject->spriteId].pos1.y + gSprites[playerAvatarEventObject->spriteId].pos2.y)) - { - DestroyTask(taskId); - EnableBothScriptContexts(); - } -} - -static void sp136_strengh_sound(u8 a, u8 b, u8 c, u8 d) -{ - u8 taskId; - - taskId = CreateTask(sub_81BE900, 0x9); - gTasks[taskId].data[0] = b; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = c; - gTasks[taskId].data[3] = d; - gTasks[taskId].data[4] = a; - SetCameraPanningCallback(NULL); - PlaySE(SE_W070); -} - -static void sub_81BE900(u8 taskId) -{ - s16 *data; - - data = gTasks[taskId].data; - data[1]++; - if((data[1] % data[3]) == 0) - { - data[1] = 0; - data[2]--; - data[0] = -data[0]; - data[4] = -data[4]; - SetCameraPanning(data[0], data[4]); - if(!data[2]) - { - sub_81BE968(); - DestroyTask(taskId); - InstallCameraPanAheadCallback(); - } - } -} - -static void sub_81BE968(void) -{ - u8 taskId; - - taskId = FindTaskIdByFunc(sub_81BE9C0); - if(taskId != 0xFF) - gTasks[taskId].data[0]++; -} - -void sub_81BE994(void) -{ - LoadSpriteSheets(gUnknown_08617D94); - sub_81BEA20(); - CreateTask(sub_81BE9C0, 0x8); - sp136_strengh_sound(2, 1, 16, 3); -} - -static void sub_81BE9C0(u8 taskId) -{ - u16 *data; - - data = gTasks[taskId].data; - data[1]++; - if(data[1] == 1000 || data[0] == 17) - gTasks[taskId].func = sub_81BEA00; -} - -static void sub_81BEA00(u8 taskId) -{ - FreeSpriteTilesByTag(4000); - DestroyTask(taskId); - EnableBothScriptContexts(); -} - -static void sub_81BEA20(void) -{ - u8 i; - u8 spriteId; - - for(i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gUnknown_08617E60, gUnknown_08617D64[i][0] + 120, gUnknown_08617D64[i][1], 8); - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].oam.paletteNum = 0; - gSprites[spriteId].data[0] = i; - } - for(i = 0; i < 8; i++) - { - spriteId = CreateSprite(&gUnknown_08617E34, gUnknown_08617D64[i][0] + 115, gUnknown_08617D64[i][1] - 3, 8); - gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].oam.paletteNum = 0; - gSprites[spriteId].data[0] = i; - } -} - -static void sub_81BEAD8(struct Sprite* sprite) -{ - sprite->data[1] += 2; - sprite->pos2.y = (sprite->data[1] / 2); - if(((sprite->pos1.y) + (sprite->pos2.y)) > gUnknown_08617D64[sprite->data[0]][2]) - { - DestroySprite(sprite); - sub_81BE968(); - } -} diff --git a/src/fldeff_misc.c b/src/fldeff_misc.c index 79f0a8ede..df4576a7f 100644 --- a/src/fldeff_misc.c +++ b/src/fldeff_misc.c @@ -4,15 +4,17 @@ #include "script.h" #include "sound.h" #include "task.h" -#include "rom6.h" #include "strings.h" #include "party_menu.h" #include "fieldmap.h" #include "field_effect.h" #include "field_camera.h" #include "field_player_avatar.h" +#include "fldeff.h" +#include "fldeff_misc.h" #include "secret_base.h" #include "event_data.h" +#include "event_scripts.h" #include "event_object_movement.h" #include "metatile_behavior.h" #include "string_util.h" @@ -20,70 +22,71 @@ #include "constants/metatile_behaviors.h" #include "constants/songs.h" #include "constants/vars.h" -#include "fldeff_misc.h" -void sub_80F9C90(u8); -void sub_80F9DFC(u8); +extern struct MapPosition gPlayerFacingPosition; -void Task_SecretBasePCTurnOn(u8); +static void sub_80F9C90(u8); +static void sub_80F9DFC(u8); -void Task_PopSecretBaseBalloon(u8); -void DoBalloonSoundEffect(s16); +static void Task_SecretBasePCTurnOn(u8); -void Task_WateringBerryTreeAnim_1(u8); -void Task_WateringBerryTreeAnim_2(u8); -void Task_WateringBerryTreeAnim_3(u8); +static void Task_PopSecretBaseBalloon(u8); +static void DoBalloonSoundEffect(s16); -void sub_80F9C44(TaskFunc, u16, u16, u8); +static void Task_WateringBerryTreeAnim_1(u8); +static void Task_WateringBerryTreeAnim_2(u8); +static void Task_WateringBerryTreeAnim_3(u8); -void FieldCallback_SecretBaseCave(void); +static void sub_80F9C44(TaskFunc, u16, u16, u8); + +static void FieldCallback_SecretBaseCave(void); static void CaveEntranceSpriteCallback1(struct Sprite *); static void CaveEntranceSpriteCallback2(struct Sprite *); static void CaveEntranceSpriteCallbackEnd(struct Sprite *); static void StartSecretBaseCaveFieldEffect(void); -void FieldCallback_SecretBaseTree(void); +static void FieldCallback_SecretBaseTree(void); static void TreeEntranceSpriteCallback1(struct Sprite *); static void TreeEntranceSpriteCallback2(struct Sprite *); static void TreeEntranceSpriteCallbackEnd(struct Sprite *); static void StartSecretBaseTreeFieldEffect(void); -void FieldCallback_SecretBaseShrub(void); +static void FieldCallback_SecretBaseShrub(void); static void ShrubEntranceSpriteCallback1(struct Sprite *); static void ShrubEntranceSpriteCallback2(struct Sprite *); static void ShrubEntranceSpriteCallbackEnd(struct Sprite *); static void StartSecretBaseShrubFieldEffect(void); -void SpriteCB_SandPillar_0(struct Sprite *); -void SpriteCB_SandPillar_1(struct Sprite *); -void SpriteCB_SandPillar_2(struct Sprite *); - -const u8 gSpriteImage_858D978[] = INCBIN_U8("graphics/unknown/858E588/0.4bpp"); -const u8 gSpriteImage_858D9F8[] = INCBIN_U8("graphics/unknown/858E588/1.4bpp"); -const u8 gSpriteImage_858DA78[] = INCBIN_U8("graphics/unknown/858E588/2.4bpp"); -const u8 gSpriteImage_858DAF8[] = INCBIN_U8("graphics/unknown/858E588/3.4bpp"); -const u8 gSpriteImage_858DB78[] = INCBIN_U8("graphics/unknown/858E588/4.4bpp"); - -const u8 gUnusedEmptySpace_858DBF8[32] = {0}; - -const u16 gFieldEffectObjectPalette7[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_07.gbapal"); -const u8 gSpriteImage_858DC38[] = INCBIN_U8("graphics/unknown/858E5D8/0.4bpp"); -const u8 gSpriteImage_858DCB8[] = INCBIN_U8("graphics/unknown/858E5D8/1.4bpp"); -const u8 gSpriteImage_858DD38[] = INCBIN_U8("graphics/unknown/858E5D8/2.4bpp"); -const u8 gSpriteImage_858DDB8[] = INCBIN_U8("graphics/unknown/858E5D8/3.4bpp"); -const u8 gSpriteImage_858DE38[] = INCBIN_U8("graphics/unknown/858E5D8/4.4bpp"); -const u8 gSpriteImage_858DEB8[] = INCBIN_U8("graphics/unknown/858E5B0/0.4bpp"); -const u8 gSpriteImage_858DF38[] = INCBIN_U8("graphics/unknown/858E5B0/1.4bpp"); -const u8 gSpriteImage_858DFB8[] = INCBIN_U8("graphics/unknown/858E5B0/2.4bpp"); -const u8 gSpriteImage_858E038[] = INCBIN_U8("graphics/unknown/858E5B0/3.4bpp"); -const u8 gSpriteImage_858E0B8[] = INCBIN_U8("graphics/unknown/858E5B0/4.4bpp"); -const u8 gSpriteImage_858E138[] = INCBIN_U8("graphics/unknown/858E5B0/5.4bpp"); -const u16 gFieldEffectObjectPalette8[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_08.gbapal"); -const u8 gSpriteImage_858E1D8[] = INCBIN_U8("graphics/unknown/858E674/0.4bpp"); -const u8 gSpriteImage_858E2D8[] = INCBIN_U8("graphics/unknown/858E674/1.4bpp"); -const u8 gSpriteImage_858E3D8[] = INCBIN_U8("graphics/unknown/858E674/2.4bpp"); - -const struct OamData gOamData_858E4D8 = +static void SpriteCB_SandPillar_0(struct Sprite *); +static void SpriteCB_SandPillar_1(struct Sprite *); +static void SpriteCB_SandPillar_2(struct Sprite *); + +static const u8 gSpriteImage_858D978[] = INCBIN_U8("graphics/unknown/858E588/0.4bpp"); +static const u8 gSpriteImage_858D9F8[] = INCBIN_U8("graphics/unknown/858E588/1.4bpp"); +static const u8 gSpriteImage_858DA78[] = INCBIN_U8("graphics/unknown/858E588/2.4bpp"); +static const u8 gSpriteImage_858DAF8[] = INCBIN_U8("graphics/unknown/858E588/3.4bpp"); +static const u8 gSpriteImage_858DB78[] = INCBIN_U8("graphics/unknown/858E588/4.4bpp"); + +static const u8 gUnusedEmptySpace_858DBF8[32] = {0}; + +static const u16 gFieldEffectObjectPalette7[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_07.gbapal"); +static const u8 gSpriteImage_858DC38[] = INCBIN_U8("graphics/unknown/858E5D8/0.4bpp"); +static const u8 gSpriteImage_858DCB8[] = INCBIN_U8("graphics/unknown/858E5D8/1.4bpp"); +static const u8 gSpriteImage_858DD38[] = INCBIN_U8("graphics/unknown/858E5D8/2.4bpp"); +static const u8 gSpriteImage_858DDB8[] = INCBIN_U8("graphics/unknown/858E5D8/3.4bpp"); +static const u8 gSpriteImage_858DE38[] = INCBIN_U8("graphics/unknown/858E5D8/4.4bpp"); +static const u8 gSpriteImage_858DEB8[] = INCBIN_U8("graphics/unknown/858E5B0/0.4bpp"); +static const u8 gSpriteImage_858DF38[] = INCBIN_U8("graphics/unknown/858E5B0/1.4bpp"); +static const u8 gSpriteImage_858DFB8[] = INCBIN_U8("graphics/unknown/858E5B0/2.4bpp"); +static const u8 gSpriteImage_858E038[] = INCBIN_U8("graphics/unknown/858E5B0/3.4bpp"); +static const u8 gSpriteImage_858E0B8[] = INCBIN_U8("graphics/unknown/858E5B0/4.4bpp"); +static const u8 gSpriteImage_858E138[] = INCBIN_U8("graphics/unknown/858E5B0/5.4bpp"); +static const u16 gFieldEffectObjectPalette8[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_08.gbapal"); +static const u8 gSpriteImage_858E1D8[] = INCBIN_U8("graphics/unknown/858E674/0.4bpp"); +static const u8 gSpriteImage_858E2D8[] = INCBIN_U8("graphics/unknown/858E674/1.4bpp"); +static const u8 gSpriteImage_858E3D8[] = INCBIN_U8("graphics/unknown/858E674/2.4bpp"); + +static const struct OamData gOamData_858E4D8 = { .y = 0, .x = 0, @@ -95,7 +98,7 @@ const struct OamData gOamData_858E4D8 = .priority = 2, }; -const union AnimCmd gSpriteAnim_858E4E0[] = +static const union AnimCmd gSpriteAnim_858E4E0[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), @@ -105,7 +108,7 @@ const union AnimCmd gSpriteAnim_858E4E0[] = ANIMCMD_END, }; -const union AnimCmd gSpriteAnim_858E4F8[] = +static const union AnimCmd gSpriteAnim_858E4F8[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), @@ -115,7 +118,7 @@ const union AnimCmd gSpriteAnim_858E4F8[] = ANIMCMD_END, }; -const union AnimCmd gSpriteAnim_858E510[] = +static const union AnimCmd gSpriteAnim_858E510[] = { ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(3, 8), @@ -125,7 +128,7 @@ const union AnimCmd gSpriteAnim_858E510[] = ANIMCMD_END, }; -const union AnimCmd gSpriteAnim_858E528[] = +static const union AnimCmd gSpriteAnim_858E528[] = { ANIMCMD_FRAME(0, 8, .hFlip = TRUE), ANIMCMD_FRAME(1, 8, .hFlip = TRUE), @@ -135,7 +138,7 @@ const union AnimCmd gSpriteAnim_858E528[] = ANIMCMD_END, }; -const union AnimCmd gSpriteAnim_858E540[] = +static const union AnimCmd gSpriteAnim_858E540[] = { ANIMCMD_FRAME(4, 8, .hFlip = TRUE), ANIMCMD_FRAME(3, 8, .hFlip = TRUE), @@ -145,7 +148,7 @@ const union AnimCmd gSpriteAnim_858E540[] = ANIMCMD_END, }; -const union AnimCmd gSpriteAnim_858E558[] = +static const union AnimCmd gSpriteAnim_858E558[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), @@ -155,12 +158,12 @@ const union AnimCmd gSpriteAnim_858E558[] = ANIMCMD_END, }; -const union AnimCmd *const gSpriteAnimTable_858E570[] = +static const union AnimCmd *const gSpriteAnimTable_858E570[] = { gSpriteAnim_858E4E0, }; -const union AnimCmd *const gSpriteAnimTable_858E574[] = +static const union AnimCmd *const gSpriteAnimTable_858E574[] = { gSpriteAnim_858E4F8, gSpriteAnim_858E510, @@ -168,12 +171,12 @@ const union AnimCmd *const gSpriteAnimTable_858E574[] = gSpriteAnim_858E540, }; -const union AnimCmd *const gSpriteAnimTable_858E584[] = +static const union AnimCmd *const gSpriteAnimTable_858E584[] = { gSpriteAnim_858E558, }; -const struct SpriteFrameImage gUnknown_858E588[] = +static const struct SpriteFrameImage gUnknown_858E588[] = { {gSpriteImage_858D978, 0x80}, {gSpriteImage_858D9F8, 0x80}, @@ -182,7 +185,7 @@ const struct SpriteFrameImage gUnknown_858E588[] = {gSpriteImage_858DB78, 0x80}, }; -const struct SpriteFrameImage gUnknown_858E5B0[] = +static const struct SpriteFrameImage gUnknown_858E5B0[] = { {gSpriteImage_858DEB8, 0x80}, {gSpriteImage_858DF38, 0x80}, @@ -191,7 +194,7 @@ const struct SpriteFrameImage gUnknown_858E5B0[] = {gSpriteImage_858E0B8, 0x80}, }; -const struct SpriteFrameImage gUnknown_858E5D8[] = +static const struct SpriteFrameImage gUnknown_858E5D8[] = { {gSpriteImage_858DC38, 0x80}, {gSpriteImage_858DCB8, 0x80}, @@ -200,7 +203,7 @@ const struct SpriteFrameImage gUnknown_858E5D8[] = {gSpriteImage_858DE38, 0x80}, }; -const struct SpriteTemplate gUnknown_0858E600 = +static const struct SpriteTemplate gUnknown_0858E600 = { .tileTag = 0xFFFF, .paletteTag = 0x1003, @@ -211,7 +214,7 @@ const struct SpriteTemplate gUnknown_0858E600 = .callback = CaveEntranceSpriteCallback1, }; -const struct SpriteTemplate gUnknown_0858E618 = +static const struct SpriteTemplate gUnknown_0858E618 = { .tileTag = 0xFFFF, .paletteTag = 0x1008, @@ -222,7 +225,7 @@ const struct SpriteTemplate gUnknown_0858E618 = .callback = TreeEntranceSpriteCallback1, }; -const struct SpriteTemplate gUnknown_0858E630 = +static const struct SpriteTemplate gUnknown_0858E630 = { .tileTag = 0xFFFF, .paletteTag = 0x1008, @@ -236,7 +239,7 @@ const struct SpriteTemplate gUnknown_0858E630 = const struct SpritePalette gFieldEffectObjectPaletteInfo7 = {gFieldEffectObjectPalette7, 0x1003}; const struct SpritePalette gFieldEffectObjectPaletteInfo8 = {gFieldEffectObjectPalette8, 0x1008}; -const struct OamData gOamData_858E658 = +static const struct OamData gOamData_858E658 = { .x = 0, .y = 0, @@ -248,7 +251,7 @@ const struct OamData gOamData_858E658 = .priority = 2, }; -const union AnimCmd gSpriteAnim_858E660[] = +static const union AnimCmd gSpriteAnim_858E660[] = { ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(1, 6), @@ -256,19 +259,19 @@ const union AnimCmd gSpriteAnim_858E660[] = ANIMCMD_END, }; -const union AnimCmd *const gSpriteAnimTable_858E670[] = +static const union AnimCmd *const gSpriteAnimTable_858E670[] = { gSpriteAnim_858E660, }; -const struct SpriteFrameImage gUnknown_0858E674[] = +static const struct SpriteFrameImage gUnknown_0858E674[] = { {gSpriteImage_858E1D8, 0x100}, {gSpriteImage_858E2D8, 0x100}, {gSpriteImage_858E3D8, 0x100}, }; -const struct SpriteTemplate gUnknown_0858E68C = +static const struct SpriteTemplate gUnknown_0858E68C = { .tileTag = 0xFFFF, .paletteTag = 0x100E, @@ -340,7 +343,7 @@ bool8 sub_80F9C30(void) return FuncIsActiveTask(sub_80F9DFC); } -void sub_80F9C44(void (*taskfunc) (u8), u16 a1, u16 a2, u8 a3) +static void sub_80F9C44(void (*taskfunc) (u8), u16 a1, u16 a2, u8 a3) { u8 taskId = CreateTask(taskfunc, a3); @@ -350,12 +353,11 @@ void sub_80F9C44(void (*taskfunc) (u8), u16 a1, u16 a2, u8 a3) gTasks[taskId].func(taskId); } -#ifdef NONMATCHING -void sub_80F9C90(u8 taskId) +static void sub_80F9C90(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch(task->data[0]) + switch (task->data[0]) { case 0: task->data[3] = 0x78; @@ -365,7 +367,7 @@ void sub_80F9C90(u8 taskId) SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4])); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[5], task->data[6])); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6])); SetGpuReg(REG_OFFSET_WININ, 0x3F); SetGpuReg(REG_OFFSET_WINOUT, 0); @@ -374,7 +376,7 @@ void sub_80F9C90(u8 taskId) task->data[7] = GetGpuReg(REG_OFFSET_BLDCNT); task->data[8] = GetGpuReg(REG_OFFSET_BLDY); - SetGpuReg(REG_OFFSET_BLDCNT, 0xBF); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_ALL | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, 0x10); break; @@ -400,7 +402,7 @@ void sub_80F9C90(u8 taskId) task->data[5] -= task->data[2]; task->data[6] += task->data[2]; - if (task->data[5] < 1 || task->data[2] > 0x9F) + if (task->data[5] < 1 || task->data[6] > 0x9F) { task->data[5] = 0; task->data[6] = 0xA0; @@ -416,189 +418,10 @@ void sub_80F9C90(u8 taskId) DestroyTask(taskId); return; } - task->data[0] += 1; + task->data[0]++; } -#else -NAKED -void sub_80F9C90(u8 taskId) -{ - asm_unified("\tpush {r4,r5,lr}\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tlsls r0, r5, 2\n" - "\tadds r0, r5\n" - "\tlsls r0, 3\n" - "\tldr r1, =gTasks\n" - "\tadds r4, r0, r1\n" - "\tmovs r1, 0x8\n" - "\tldrsh r0, [r4, r1]\n" - "\tcmp r0, 0x1\n" - "\tbeq _080F9D10\n" - "\tcmp r0, 0x1\n" - "\tbgt _080F9CB8\n" - "\tcmp r0, 0\n" - "\tbeq _080F9CC2\n" - "\tb _080F9DDE\n" - "\t.pool\n" - "_080F9CB8:\n" - "\tcmp r0, 0x2\n" - "\tbeq _080F9D32\n" - "\tcmp r0, 0x3\n" - "\tbeq _080F9D94\n" - "\tb _080F9DDE\n" - "_080F9CC2:\n" - "\tmovs r0, 0x78\n" - "\tstrh r0, [r4, 0xE]\n" - "\tstrh r0, [r4, 0x10]\n" - "\tmovs r0, 0x50\n" - "\tstrh r0, [r4, 0x12]\n" - "\tmovs r0, 0x51\n" - "\tstrh r0, [r4, 0x14]\n" - "\tmovs r1, 0x80\n" - "\tlsls r1, 6\n" - "\tmovs r0, 0\n" - "\tbl SetGpuRegBits\n" - "\tldrh r1, [r4, 0xE]\n" - "\tlsls r1, 8\n" - "\tldrh r0, [r4, 0x10]\n" - "\torrs r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tmovs r0, 0x40\n" - "\tbl SetGpuReg\n" - "\tldrh r1, [r4, 0x12]\n" - "\tlsls r1, 8\n" - "\tldrh r0, [r4, 0x14]\n" - "\torrs r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tmovs r0, 0x44\n" - "\tbl SetGpuReg\n" - "\tmovs r0, 0x48\n" - "\tmovs r1, 0x3F\n" - "\tbl SetGpuReg\n" - "\tmovs r0, 0x4A\n" - "\tmovs r1, 0\n" - "\tbl SetGpuReg\n" - "\tb _080F9DEE\n" - "_080F9D10:\n" - "\tmovs r0, 0x50\n" - "\tbl GetGpuReg\n" - "\tstrh r0, [r4, 0x16]\n" - "\tmovs r0, 0x54\n" - "\tbl GetGpuReg\n" - "\tstrh r0, [r4, 0x18]\n" - "\tmovs r0, 0x50\n" - "\tmovs r1, 0xBF\n" - "\tbl SetGpuReg\n" - "\tmovs r0, 0x54\n" - "\tmovs r1, 0x10\n" - "\tbl SetGpuReg\n" - "\tb _080F9DEE\n" - "_080F9D32:\n" - "\tldrh r0, [r4, 0xE]\n" - "\tldrh r1, [r4, 0xA]\n" - "\tsubs r0, r1\n" - "\tmovs r5, 0\n" - "\tstrh r0, [r4, 0xE]\n" - "\tldrh r2, [r4, 0x10]\n" - "\tadds r1, r2\n" - "\tstrh r1, [r4, 0x10]\n" - "\tlsls r0, 16\n" - "\tcmp r0, 0\n" - "\tble _080F9D50\n" - "\tlsls r0, r1, 16\n" - "\tasrs r0, 16\n" - "\tcmp r0, 0xEF\n" - "\tble _080F9D76\n" - "_080F9D50:\n" - "\tstrh r5, [r4, 0xE]\n" - "\tmovs r0, 0xF0\n" - "\tstrh r0, [r4, 0x10]\n" - "\tmovs r0, 0x54\n" - "\tmovs r1, 0\n" - "\tbl SetGpuReg\n" - "\tldrh r1, [r4, 0x16]\n" - "\tmovs r0, 0x50\n" - "\tbl SetGpuReg\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tmovs r1, 0\n" - "\tmovs r2, 0\n" - "\tbl BlendPalettes\n" - "\tldr r0, =gPlttBufferFaded\n" - "\tstrh r5, [r0]\n" - "_080F9D76:\n" - "\tldrh r1, [r4, 0xE]\n" - "\tlsls r1, 8\n" - "\tldrh r0, [r4, 0x10]\n" - "\torrs r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tmovs r0, 0x40\n" - "\tbl SetGpuReg\n" - "\tmovs r1, 0xE\n" - "\tldrsh r0, [r4, r1]\n" - "\tb _080F9DD8\n" - "\t.pool\n" - "_080F9D94:\n" - "\tldrh r0, [r4, 0x12]\n" - "\tldrh r1, [r4, 0xC]\n" - "\tsubs r0, r1\n" - "\tstrh r0, [r4, 0x12]\n" - "\tldrh r2, [r4, 0x14]\n" - "\tadds r1, r2\n" - "\tstrh r1, [r4, 0x14]\n" - "\tlsls r0, 16\n" - "\tcmp r0, 0\n" - "\tble _080F9DB0\n" - "\tlsls r0, r1, 16\n" - "\tasrs r0, 16\n" - "\tcmp r0, 0x9F\n" - "\tble _080F9DC2\n" - "_080F9DB0:\n" - "\tmovs r0, 0\n" - "\tstrh r0, [r4, 0x12]\n" - "\tmovs r0, 0xA0\n" - "\tstrh r0, [r4, 0x14]\n" - "\tmovs r1, 0x80\n" - "\tlsls r1, 6\n" - "\tmovs r0, 0\n" - "\tbl ClearGpuRegBits\n" - "_080F9DC2:\n" - "\tldrh r1, [r4, 0x12]\n" - "\tlsls r1, 8\n" - "\tldrh r0, [r4, 0x14]\n" - "\torrs r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tmovs r0, 0x44\n" - "\tbl SetGpuReg\n" - "\tmovs r1, 0x12\n" - "\tldrsh r0, [r4, r1]\n" - "_080F9DD8:\n" - "\tcmp r0, 0\n" - "\tbne _080F9DF4\n" - "\tb _080F9DEE\n" - "_080F9DDE:\n" - "\tldrh r1, [r4, 0x16]\n" - "\tmovs r0, 0x50\n" - "\tbl SetGpuReg\n" - "\tadds r0, r5, 0\n" - "\tbl DestroyTask\n" - "\tb _080F9DF4\n" - "_080F9DEE:\n" - "\tldrh r0, [r4, 0x8]\n" - "\tadds r0, 0x1\n" - "\tstrh r0, [r4, 0x8]\n" - "_080F9DF4:\n" - "\tpop {r4,r5}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif -void sub_80F9DFC(u8 taskId) +static void sub_80F9DFC(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -629,7 +452,7 @@ void sub_80F9DFC(u8 taskId) { task->data[5] = 0x50; task->data[6] = 0x51; - SetGpuReg(REG_OFFSET_BLDCNT, 0xBF); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_ALL | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, 0x10); } SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6])); @@ -660,16 +483,16 @@ void sub_80F9DFC(u8 taskId) DestroyTask(taskId); return; } - task->data[0] += 1; + task->data[0]++; } -void SetCurrentSecretBase(void) +static void SetCurrentSecretBase(void) { sub_80E9608(&gPlayerFacingPosition, gMapHeader.events); sub_80E8B6C(); } -void AdjustSecretPowerSpritePixelOffsets(void) +static void AdjustSecretPowerSpritePixelOffsets(void) { if (gPlayerAvatar.flags & 0x6) { @@ -756,7 +579,7 @@ bool8 SetUpFieldMove_SecretPower(void) return FALSE; } -void FieldCallback_SecretBaseCave(void) +static void FieldCallback_SecretBaseCave(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); ScriptContext1_SetupScript(EventScript_275A86); @@ -818,7 +641,7 @@ static void CaveEntranceSpriteCallbackEnd(struct Sprite *sprite) EnableBothScriptContexts(); } -void FieldCallback_SecretBaseTree(void) +static void FieldCallback_SecretBaseTree(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); ScriptContext1_SetupScript(EventScript_275ADF); @@ -892,7 +715,7 @@ static void TreeEntranceSpriteCallbackEnd(struct Sprite *sprite) EnableBothScriptContexts(); } -void FieldCallback_SecretBaseShrub(void) +static void FieldCallback_SecretBaseShrub(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); ScriptContext1_SetupScript(EventScript_275B38); @@ -956,7 +779,7 @@ static void ShrubEntranceSpriteCallbackEnd(struct Sprite *sprite) EnableBothScriptContexts(); } -u32 FldEff_SecretBasePCTurnOn(void) +bool8 FldEff_SecretBasePCTurnOn(void) { s16 x, y; u8 taskId; @@ -968,10 +791,10 @@ u32 FldEff_SecretBasePCTurnOn(void) gTasks[taskId].data[1] = y; gTasks[taskId].data[2] = 0; - return 0; + return FALSE; } -void Task_SecretBasePCTurnOn(u8 taskId) +static void Task_SecretBasePCTurnOn(u8 taskId) { s16 *data = gTasks[taskId].data; @@ -1025,7 +848,7 @@ void PopSecretBaseBalloon(s16 metatileId, s16 x, s16 y) gTasks[taskId].data[4] = 1; } -void Task_PopSecretBaseBalloon(u8 taskId) +static void Task_PopSecretBaseBalloon(u8 taskId) { s16 *data = gTasks[taskId].data; @@ -1049,7 +872,7 @@ void Task_PopSecretBaseBalloon(u8 taskId) } } -void DoBalloonSoundEffect(s16 metatileId) +static void DoBalloonSoundEffect(s16 metatileId) { switch (metatileId) { @@ -1078,7 +901,7 @@ bool8 FldEff_NopA700(void) return FALSE; } -void DoSecretBaseBreakableDoorEffect(s16 x, s16 y) +static void DoSecretBaseBreakableDoorEffect(s16 x, s16 y) { PlaySE(SE_TOY_KABE); MapGridSetMetatileIdAt(x, y, 630); @@ -1087,7 +910,7 @@ void DoSecretBaseBreakableDoorEffect(s16 x, s16 y) CurrentMapDrawMetatileAt(x, y - 1); } -void Task_ShatterSecretBaseBreakableDoor(u8 taskId) +static void Task_ShatterSecretBaseBreakableDoor(u8 taskId) { if (gTasks[taskId].data[0] == 7) { @@ -1118,7 +941,7 @@ void ShatterSecretBaseBreakableDoor(s16 x, s16 y) } #define tMetatileID data[0] -void Task_SecretBaseMusicNoteMatSound(u8 taskId) +static void Task_SecretBaseMusicNoteMatSound(u8 taskId) { if (gTasks[taskId].data[1] == 7) { @@ -1167,7 +990,7 @@ void PlaySecretBaseMusicNoteMatSound(s16 metatileId) } #undef tMetatileID -void SpriteCB_GlitterMatSparkle(struct Sprite *sprite) +static void SpriteCB_GlitterMatSparkle(struct Sprite *sprite) { sprite->data[0]++; @@ -1222,30 +1045,30 @@ bool8 FldEff_SandPillar(void) gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y, 148); - + break; - + case DIR_WEST: CreateSprite(&gUnknown_0858E68C, gSprites[gPlayerAvatar.spriteId].oam.x - 8, gSprites[gPlayerAvatar.spriteId].oam.y + 16, 148); - + break; - + case DIR_EAST: CreateSprite(&gUnknown_0858E68C, gSprites[gPlayerAvatar.spriteId].oam.x + 24, gSprites[gPlayerAvatar.spriteId].oam.y + 16, 148); - + break; } return FALSE; } -void SpriteCB_SandPillar_0(struct Sprite *sprite) +static void SpriteCB_SandPillar_0(struct Sprite *sprite) { PlaySE(SE_W088); @@ -1253,16 +1076,16 @@ void SpriteCB_SandPillar_0(struct Sprite *sprite) MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 3586); else MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 644); - + MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], 522); CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1); CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]); - + sprite->data[0] = 0; sprite->callback = SpriteCB_SandPillar_1; } -void SpriteCB_SandPillar_1(struct Sprite *sprite) +static void SpriteCB_SandPillar_1(struct Sprite *sprite) { if (sprite->data[0] < 18) { @@ -1277,7 +1100,7 @@ void SpriteCB_SandPillar_1(struct Sprite *sprite) } } -void SpriteCB_SandPillar_2(struct Sprite *sprite) +static void SpriteCB_SandPillar_2(struct Sprite *sprite) { FieldEffectStop(sprite, FLDEFF_SAND_PILLAR); EnableBothScriptContexts(); @@ -1343,71 +1166,30 @@ void GetShieldToyTVDecorationInfo(void) } } -#ifdef NONMATCHING -bool8 sub_80FADE4(u16 arg0, u8 arg1) +bool8 sub_80FADE4(u16 metatileId, u8 arg1) { - if (CurrentMapIsSecretBase()) + if (!CurrentMapIsSecretBase()) + return FALSE; + + if (!arg1) { - if (arg1 == 0) - { - if ((u16)(arg0 + 0xfffffd7b) <= 1 || (arg0 == 0x237)) - return TRUE; - } - else - { - if (arg0 == 0x28d || arg0 == 0x23f) - return TRUE; - } + if (metatileId == 0x285 || metatileId == 0x286) + return TRUE; + if (metatileId == 0x237) + return TRUE; + } + else + { + if (metatileId == 0x28d) + return TRUE; + if (metatileId == 0x23F) + return TRUE; } + return FALSE; } -#else -NAKED -bool8 sub_80FADE4(u16 arg0, u8 arg1) -{ - asm_unified("\tpush {r4-r6,lr}\n" - "\tlsls r0, 16\n" - "\tlsrs r4, r0, 16\n" - "\tadds r6, r4, 0\n" - "\tlsls r1, 24\n" - "\tlsrs r5, r1, 24\n" - "\tbl CurrentMapIsSecretBase\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _080FAE28\n" - "\tcmp r5, 0\n" - "\tbne _080FAE1C\n" - "\tldr r1, =0xfffffd7b\n" - "\tadds r0, r4, r1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x1\n" - "\tbls _080FAE10\n" - "\tldr r0, =0x00000237\n" - "\tcmp r4, r0\n" - "\tbne _080FAE28\n" - "_080FAE10:\n" - "\tmovs r0, 0x1\n" - "\tb _080FAE2A\n" - "\t.pool\n" - "_080FAE1C:\n" - "\tldr r0, =0x0000028d\n" - "\tcmp r4, r0\n" - "\tbeq _080FAE10\n" - "\tldr r0, =0x0000023f\n" - "\tcmp r6, r0\n" - "\tbeq _080FAE10\n" - "_080FAE28:\n" - "\tmovs r0, 0\n" - "_080FAE2A:\n" - "\tpop {r4-r6}\n" - "\tpop {r1}\n" - "\tbx r1\n" - "\t.pool"); -} -#endif -void Task_FieldPoisonEffect(u8 taskId) +static void Task_FieldPoisonEffect(u8 taskId) { s16 *data = gTasks[taskId].data; @@ -1441,15 +1223,15 @@ bool32 FldEffPoison_IsActive(void) return FuncIsActiveTask(Task_FieldPoisonEffect); } -void Task_WateringBerryTreeAnim_0(u8 taskId) +static void Task_WateringBerryTreeAnim_0(u8 taskId) { gTasks[taskId].func = Task_WateringBerryTreeAnim_1; } -void Task_WateringBerryTreeAnim_1(u8 taskId) +static void Task_WateringBerryTreeAnim_1(u8 taskId) { struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - + if (!EventObjectIsMovementOverridden(playerEventObj) || EventObjectClearHeldMovementIfFinished(playerEventObj)) { @@ -1459,23 +1241,23 @@ void Task_WateringBerryTreeAnim_1(u8 taskId) } } -void Task_WateringBerryTreeAnim_2(u8 taskId) +static void Task_WateringBerryTreeAnim_2(u8 taskId) { struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - + if (EventObjectClearHeldMovementIfFinished(playerEventObj)) { s16 value = gTasks[taskId].data[1]++; - + if (value < 10) EventObjectSetHeldMovement(playerEventObj, GetWalkInPlaceNormalMovementAction(GetPlayerFacingDirection())); - + else gTasks[taskId].func = Task_WateringBerryTreeAnim_3; } } -void Task_WateringBerryTreeAnim_3(u8 taskId) +static void Task_WateringBerryTreeAnim_3(u8 taskId) { SetPlayerAvatarTransitionFlags(sub_808BCD0()); DestroyTask(taskId); diff --git a/src/rom6.c b/src/fldeff_rocksmash.c index 8043730d2..9181b5532 100644 --- a/src/rom6.c +++ b/src/fldeff_rocksmash.c @@ -5,10 +5,10 @@ #include "event_scripts.h" #include "field_effect.h" #include "field_player_avatar.h" +#include "fldeff.h" #include "item_use.h" #include "overworld.h" #include "party_menu.h" -#include "rom6.h" #include "script.h" #include "sound.h" #include "sprite.h" @@ -26,8 +26,6 @@ static void sub_813552C(u8 taskId); static void sub_813561C(u8 taskId); static void sub_81356C4(void); static void sub_8135714(void); -static void hm2_dig(void); -static void sub_8135780(void); // extern RAM loc extern struct MapPosition gPlayerFacingPosition; @@ -162,51 +160,3 @@ static void sub_8135714(void) FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH); EnableBothScriptContexts(); } - -bool8 SetUpFieldMove_Dig(void) -{ - if (CanUseEscapeRopeOnCurrMap() == TRUE) - { - gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; - gPostMenuFieldCallback = hm2_dig; - return TRUE; - } - else - { - return FALSE; - } -} - -static void hm2_dig(void) -{ - Overworld_ResetStateAfterDigEscRope(); - FieldEffectStart(FLDEFF_USE_DIG); - gFieldEffectArguments[0] = GetCursorSelectionMonId(); -} - -bool8 FldEff_UseDig(void) -{ - u8 taskId = oei_task_add(); - - gTasks[taskId].data[8] = (u32)sub_8135780 >> 16; - gTasks[taskId].data[9] = (u32)sub_8135780; - if (!ShouldDoBrailleDigEffect()) - SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); - return FALSE; -} - -static void sub_8135780(void) -{ - u8 taskId; - - FieldEffectActiveListRemove(FLDEFF_USE_DIG); - if (ShouldDoBrailleDigEffect()) - { - DoBrailleDigEffect(); - } - else - { - taskId = CreateTask(task08_080A1C44, 8); - gTasks[taskId].data[0] = 0; - } -} diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c index f796ecea6..c57ab8cdc 100644 --- a/src/fldeff_strength.c +++ b/src/fldeff_strength.c @@ -2,8 +2,8 @@ #include "event_data.h" #include "event_scripts.h" #include "field_effect.h" +#include "fldeff.h" #include "party_menu.h" -#include "rom6.h" #include "script.h" #include "string_util.h" #include "task.h" diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c index cd8fa400d..a187353ff 100644 --- a/src/fldeff_sweetscent.c +++ b/src/fldeff_sweetscent.c @@ -5,9 +5,10 @@ #include "field_player_avatar.h" #include "field_screen_effect.h" #include "field_weather.h" +#include "fldeff.h" +#include "mirage_tower.h" #include "palette.h" #include "party_menu.h" -#include "rom6.h" #include "script.h" #include "sound.h" #include "sprite.h" @@ -21,8 +22,6 @@ static void FieldCallback_SweetScent(void); static void StartSweetScentFieldEffect(void); static void TrySweetScentEncounter(u8 taskId); static void FailSweetScentEncounter(u8 taskId); -void sub_81BE6B8(void); -void sub_81BE72C(void); bool8 SetUpFieldMove_SweetScent(void) { @@ -65,7 +64,7 @@ static void TrySweetScentEncounter(u8 taskId) { if (!gPaletteFade.active) { - sub_81BE72C(); + ClearMirageTowerPulseBlendEffect(); BlendPalettes(0x00000040, 8, RGB_RED); if (gTasks[taskId].data[0] == 64) { @@ -78,7 +77,7 @@ static void TrySweetScentEncounter(u8 taskId) { gTasks[taskId].func = FailSweetScentEncounter; BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, RGB_RED); - sub_81BE6B8(); + TryStartMirageTowerPulseBlendEffect(); } } else diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c index 8562908bd..cbf8ee6cc 100644 --- a/src/fldeff_teleport.c +++ b/src/fldeff_teleport.c @@ -1,9 +1,9 @@ #include "global.h" #include "field_effect.h" #include "field_player_avatar.h" +#include "fldeff.h" #include "party_menu.h" #include "overworld.h" -#include "rom6.h" #include "task.h" #include "constants/field_effects.h" diff --git a/src/fossil_specials.c b/src/fossil_specials.c deleted file mode 100644 index dfdb999a9..000000000 --- a/src/fossil_specials.c +++ /dev/null @@ -1,561 +0,0 @@ -#include "global.h" -#include "constants/flags.h" -#include "constants/songs.h" -#include "bg.h" -#include "event_data.h" -#include "field_camera.h" -#include "event_object_movement.h" -#include "fieldmap.h" -#include "global.fieldmap.h" -#include "gpu_regs.h" -#include "alloc.h" -#include "menu.h" -#include "random.h" -#include "script.h" -#include "sound.h" -#include "sprite.h" -#include "task.h" -#include "window.h" - -#define MIRAGE_TOWER_GFX_LENGTH (32 + sizeof(gMirageTower_Gfx)) -#define MIRAGE_TOWER_PALETTE_LENGTH 0x800 -#define ROOT_FOSSIL_GFX_LENGTH sizeof(gRootFossil_Gfx) -#define ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH 0x100 - -struct Struct8617DA4 -{ - u8 x; - u8 y; - u16 tileId; -}; - -struct Struct203CF10 -{ - u8 *buffer; - u8 currIndex; -}; - -struct DynamicSpriteFrameImage -{ - u8 *data; - u16 size; -}; - -struct Struct203CF0C -{ - u8 *frameImageTiles; - struct DynamicSpriteFrameImage *frameImage; - u8 spriteId; - u16 *unkC; - u16 unk10; -}; - -// static functions -static void sub_81BED50(u8 taskId); -static void sub_81BEBF4(u8 taskId); -static void sub_81BF028(u8 taskId); -static void sub_81BF248(struct Sprite *); -static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e); - -// .rodata -static const u8 gUnknown_08617274[32] = {0}; -static const u8 gMirageTower_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower.4bpp"); -static const u16 gUnknown_08617B94[] = INCBIN_U16("graphics/misc/mirage_tower.bin"); -static const u16 gRootFossil_Pal[] = INCBIN_U16("graphics/misc/fossil.gbapal"); -static const u8 gRootFossil_Gfx[] = INCBIN_U8("graphics/misc/fossil.4bpp"); -static const u8 gMirageTowerCrumbles_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower_crumbles.4bpp"); -static const u16 gMirageTowerCrumbles_Palette[] = INCBIN_U16("graphics/misc/mirage_tower_crumbles.gbapal"); - -const s16 gUnknown_08617D64[][3] = -{ - { 0, 10, 65}, - { 17, 3, 50}, - {-12, 0, 75}, - { 10, 15, 90}, - { 7, 8, 65}, - {-18, 5, 75}, - { 22, -10, 55}, - {-24, -4, 65}, -}; - -const struct SpriteSheet gUnknown_08617D94[] = -{ - {gMirageTowerCrumbles_Gfx, 0x0080, 0x0fa0}, - {NULL} -}; - -static const struct Struct8617DA4 gUnknown_08617DA4[] = -{ - {0x12, 0x35, 0x251}, - {0x13, 0x35, 0x251}, - {0x14, 0x35, 0x251}, - {0x12, 0x36, 0x251}, - {0x13, 0x36, 0x251}, - {0x14, 0x36, 0x251}, - {0x12, 0x37, 0x251}, - {0x13, 0x37, 0x251}, - {0x14, 0x37, 0x251}, - {0x12, 0x38, 0x251}, - {0x13, 0x38, 0x251}, - {0x14, 0x38, 0x251}, - {0x12, 0x39, 0x259}, - {0x13, 0x39, 0x259}, - {0x14, 0x39, 0x259}, - {0x12, 0x3A, 0x121}, - {0x13, 0x3A, 0x121}, - {0x14, 0x3A, 0x121}, -}; - -static const union AnimCmd gSpriteAnim_8617DEC[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_END, -}; - -static const struct OamData gOamData_8617DF4 = -{ - .y = 0, - .affineMode = 0, - .objMode = 0, - .mosaic = 0, - .bpp = 0, - .shape = 0, - .x = 0, - .matrixNum = 0, - .size = 1, - .tileNum = 0, - .priority = 0, - .paletteNum = 3, - .affineParam = 0, -}; - -static const union AnimCmd *const gSpriteAnimTable_8617DFC[] = -{ - gSpriteAnim_8617DEC, -}; - -static const struct SpriteTemplate gUnknown_08617E00 = -{ - 0xFFFF, 0xFFFF, &gOamData_8617DF4, gSpriteAnimTable_8617DFC, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -// EWRAM -EWRAM_DATA static u8* sUnknown_0203CF04 = NULL; -EWRAM_DATA static u8* sUnknown_0203CF08 = NULL; -EWRAM_DATA static struct Struct203CF0C *sUnknown_0203CF0C = NULL; -EWRAM_DATA static struct Struct203CF10 *sUnknown_0203CF10 = NULL; -EWRAM_DATA static u16 *sUnknown_0203CF14 = NULL; - -// IWRAM bss -IWRAM_DATA static u16 gUnknown_030012A8[8]; - -// text -void sub_81BEB24(void) -{ - u8 i; - for (i = 0; i < (sizeof(gUnknown_08617DA4)/sizeof(gUnknown_08617DA4[0])); i++) - MapGridSetMetatileIdAt(gUnknown_08617DA4[i].x + 7, gUnknown_08617DA4[i].y + 7, gUnknown_08617DA4[i].tileId); - DrawWholeMapView(); -} - -void sub_81BEB54(void) -{ - CreateTask(sub_81BED50, 9); -} - -void sub_81BEB68(void) -{ - CreateTask(sub_81BEBF4, 9); -} - -void sub_81BEB7C(void) -{ - CreateTask(sub_81BF028, 9); -} - -void sub_81BEB90(void) -{ - SetGpuReg(REG_OFFSET_BG0HOFS, sUnknown_0203CF14[0]); - SetGpuReg(REG_OFFSET_BG0VOFS, sUnknown_0203CF14[1]); -} - -void sub_81BEBB4(u8 taskId) -{ - if (!(gTasks[taskId].data[0])) - { - sUnknown_0203CF14[0] = -sUnknown_0203CF14[0]; - gTasks[taskId].data[0] = 2; - sub_81BEB90(); - } - else - { - gTasks[taskId].data[0]--; - } -} - -static void sub_81BEBF4(u8 taskId) -{ - u8 zero; - - switch (gTasks[taskId].data[0]) - { - case 0: - FreeAllWindowBuffers(); - SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 2); - gTasks[taskId].data[0]++; - break; - case 1: - sUnknown_0203CF04 = (u8 *)AllocZeroed(MIRAGE_TOWER_GFX_LENGTH); - sUnknown_0203CF08 = (u8 *)AllocZeroed(MIRAGE_TOWER_PALETTE_LENGTH); - ChangeBgX(0, 0, 0); - ChangeBgY(0, 0, 0); - gTasks[taskId].data[0]++; - break; - case 2: - CpuSet(gUnknown_08617274, sUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH / 2); - LoadBgTiles(0, sUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH, 0); - gTasks[taskId].data[0]++; - break; - case 3: - SetBgTilemapBuffer(0, sUnknown_0203CF08); - CopyToBgTilemapBufferRect_ChangePalette(0, &gUnknown_08617B94, 12, 29, 6, 12, 17); - CopyBgTilemapBufferToVram(0); - gTasks[taskId].data[0]++; - break; - case 4: - ShowBg(0); - gTasks[taskId].data[0]++; - break; - case 5: - sub_81BEB24(); - gTasks[taskId].data[0]++; - break; - case 6: - sUnknown_0203CF14 = Alloc(4); - zero = 0; - sUnknown_0203CF14[0] = 2; - sUnknown_0203CF14[1] = zero; - CreateTask(sub_81BEBB4, 0xA); - DestroyTask(taskId); - EnableBothScriptContexts(); - break; - } -} - -#define OUTER_BUFFER_LENGTH 0x60 -#define INNER_BUFFER_LENGTH 0x30 -static void sub_81BED50(u8 taskId) -{ - u8 anotherTaskId, j; - u16 i; - u8 index; - - switch (gTasks[taskId].data[0]) - { - case 1: - sUnknown_0203CF10 = AllocZeroed(OUTER_BUFFER_LENGTH * sizeof(struct Struct203CF10)); - break; - case 3: - if (gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1)) - { - if (gTasks[taskId].data[1] > 1) - { - index = gTasks[taskId].data[3]; - sUnknown_0203CF10[index].buffer = Alloc(INNER_BUFFER_LENGTH); - for (i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++) - sUnknown_0203CF10[index].buffer[i] = i; - for (i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++) - { - u16 rand1, rand2, temp; - - rand1 = Random() % 0x30; - rand2 = Random() % 0x30; - SWAP(sUnknown_0203CF10[index].buffer[rand2], sUnknown_0203CF10[index].buffer[rand1], temp); - } - if (gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1)) - gTasks[taskId].data[3]++; - gTasks[taskId].data[1] = 0; - } - gTasks[taskId].data[1]++; - } - index = gTasks[taskId].data[3]; - for (i = (u8)(gTasks[taskId].data[2]); i < index; i++) - { - for (j = 0; j < 1; j++) - { - sub_81BF2B8(sUnknown_0203CF04, - ((((OUTER_BUFFER_LENGTH - 1) - i) * INNER_BUFFER_LENGTH) + sUnknown_0203CF10[i].buffer[(sUnknown_0203CF10[i].currIndex)++]), - 0, INNER_BUFFER_LENGTH, 1); - } - if (sUnknown_0203CF10[i].currIndex > (INNER_BUFFER_LENGTH - 1)) - { - FREE_AND_SET_NULL(sUnknown_0203CF10[i].buffer); - gTasks[taskId].data[2]++; - if ((i % 2) == 1) - sUnknown_0203CF14[1]--; - } - } - LoadBgTiles(0, sUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH, 0); - if (sUnknown_0203CF10[OUTER_BUFFER_LENGTH - 1].currIndex > (INNER_BUFFER_LENGTH - 1)) - break; - return; - case 4: - UnsetBgTilemapBuffer(0); - anotherTaskId = FindTaskIdByFunc(sub_81BEBB4); - if (anotherTaskId != 0xFF) - DestroyTask(anotherTaskId); - sUnknown_0203CF14[1] = sUnknown_0203CF14[0] = 0; - sub_81BEB90(); - break; - case 5: - FREE_AND_SET_NULL(sUnknown_0203CF14); - FREE_AND_SET_NULL(sUnknown_0203CF10); - FREE_AND_SET_NULL(sUnknown_0203CF04); - FREE_AND_SET_NULL(sUnknown_0203CF08); - break; - case 6: - SetGpuRegBits(REG_OFFSET_BG2CNT, 0x2); - SetGpuRegBits(REG_OFFSET_BG0CNT, 0x0); - SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 0); - sub_81971D0(); - break; - case 7: - ShowBg(0); - break; - case 8: - DestroyTask(taskId); - EnableBothScriptContexts(); - break; - } - gTasks[taskId].data[0]++; -} - -static void sub_81BF028(u8 taskId) -{ - u16 i; - u8 *buffer; - - switch (gTasks[taskId].data[0]) - { - case 1: - sUnknown_0203CF0C = AllocZeroed(sizeof(*sUnknown_0203CF0C)); - sUnknown_0203CF0C->frameImageTiles = AllocZeroed(ROOT_FOSSIL_GFX_LENGTH); - sUnknown_0203CF0C->frameImage = AllocZeroed(sizeof(*sUnknown_0203CF0C->frameImage)); - sUnknown_0203CF0C->unkC = AllocZeroed(ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)); - sUnknown_0203CF0C->unk10 = 0; - break; - case 2: - buffer = sUnknown_0203CF0C->frameImageTiles; - for (i = 0; i < ROOT_FOSSIL_GFX_LENGTH; i++, buffer++) - *buffer = gRootFossil_Gfx[i]; - break; - case 3: - sUnknown_0203CF0C->frameImage->data = sUnknown_0203CF0C->frameImageTiles; - sUnknown_0203CF0C->frameImage->size = ROOT_FOSSIL_GFX_LENGTH; - break; - case 4: - { - struct SpriteTemplate fossilTemplate; - - fossilTemplate = gUnknown_08617E00; - fossilTemplate.images = (struct SpriteFrameImage *)(sUnknown_0203CF0C->frameImage); - sUnknown_0203CF0C->spriteId = CreateSprite(&fossilTemplate, 128, -16, 1); - gSprites[sUnknown_0203CF0C->spriteId].centerToCornerVecX = 0; - gSprites[sUnknown_0203CF0C->spriteId].data[0] = gSprites[sUnknown_0203CF0C->spriteId].pos1.x; - gSprites[sUnknown_0203CF0C->spriteId].data[1] = 1; - } - case 5: - for (i = 0; i < ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH; i++) - sUnknown_0203CF0C->unkC[i] = i; - break; - case 6: - for (i = 0; i < (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)); i++) - { - u16 rand1, rand2, temp; - - rand1 = Random() % 0x100; - rand2 = Random() % 0x100; - SWAP(sUnknown_0203CF0C->unkC[rand2], sUnknown_0203CF0C->unkC[rand1], temp); - } - gSprites[sUnknown_0203CF0C->spriteId].callback = sub_81BF248; - break; - case 7: - if (gSprites[sUnknown_0203CF0C->spriteId].callback != SpriteCallbackDummy) - return; - DestroySprite(&gSprites[sUnknown_0203CF0C->spriteId]); - FREE_AND_SET_NULL(sUnknown_0203CF0C->unkC);; - FREE_AND_SET_NULL(sUnknown_0203CF0C->frameImage); - FREE_AND_SET_NULL(sUnknown_0203CF0C->frameImageTiles); - FREE_AND_SET_NULL(sUnknown_0203CF0C); - break; - case 8: - EnableBothScriptContexts(); - break; - } - - gTasks[taskId].data[0]++; -} - -static void sub_81BF248(struct Sprite *sprite) -{ - if (sUnknown_0203CF0C->unk10 >= (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH)) - { - sprite->callback = SpriteCallbackDummy; - } - else if (sprite->pos1.y >= 0x60) - { - u8 i; - for (i = 0; i < 2; i++) - { - sub_81BF2B8(sUnknown_0203CF0C->frameImageTiles, sUnknown_0203CF0C->unkC[sUnknown_0203CF0C->unk10++], 0, 16, 0); - } - StartSpriteAnim(sprite, 0); - } - else - { - sprite->pos1.y++; - } -} - -#ifdef NONMATCHING -static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e) -{ - u8 r5, r4, r0, r2; - u16 var; - - r4 = r5 = b / d; - gUnknown_030012A8[0] = r4; - - r0 = r2 = b % d; - gUnknown_030012A8[1] = r2; - - r4 &= 7; - r2 &= 7; - gUnknown_030012A8[2] = r4; - gUnknown_030012A8[3] = r2; - - r0 /= 8; - r5 /= 8; - gUnknown_030012A8[4] = r0; - gUnknown_030012A8[5] = r5; - - var = ((d / 8) * (r5 * 64)) + (r0 * 64); - gUnknown_030012A8[6] = var; - - var += (r4 * 8) + r2; - gUnknown_030012A8[7] = var; - - // This part is non-matching. 99% sure it IS functionally equivalent, though. - b = (b & 1) ^ 1; - c = (c << ((b) << 2)) | (15 << ((b ^ 1) << 2)); - - a[(var / 2) + (e * 32)] &= c; -} - -#else -NAKED -static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e) -{ - asm_unified("\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - str r0, [sp]\n\ - mov r10, r1\n\ - adds r6, r2, 0\n\ - mov r8, r3\n\ - ldr r0, [sp, 0x28]\n\ - mov r9, r0\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - mov r10, r1\n\ - lsls r6, 24\n\ - lsrs r6, 24\n\ - mov r0, r8\n\ - lsls r0, 24\n\ - mov r8, r0\n\ - lsrs r7, r0, 24\n\ - mov r1, r9\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r9, r1\n\ - mov r0, r10\n\ - adds r1, r7, 0\n\ - bl __divsi3\n\ - adds r5, r0, 0\n\ - lsls r5, 24\n\ - lsrs r4, r5, 24\n\ - ldr r3, =gUnknown_030012A8\n\ - strh r4, [r3]\n\ - mov r0, r10\n\ - adds r1, r7, 0\n\ - str r3, [sp, 0x4]\n\ - bl __modsi3\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - ldr r3, [sp, 0x4]\n\ - strh r2, [r3, 0x2]\n\ - movs r1, 0x7\n\ - ands r4, r1\n\ - ands r2, r1\n\ - strh r4, [r3, 0x4]\n\ - strh r2, [r3, 0x6]\n\ - lsrs r0, 27\n\ - lsrs r5, 27\n\ - strh r0, [r3, 0x8]\n\ - strh r5, [r3, 0xA]\n\ - mov r1, r8\n\ - lsrs r1, 27\n\ - lsls r1, 6\n\ - mov r8, r1\n\ - mov r1, r8\n\ - muls r1, r5\n\ - lsls r0, 6\n\ - adds r1, r0\n\ - lsls r1, 16\n\ - lsrs r1, 16\n\ - strh r1, [r3, 0xC]\n\ - lsls r4, 3\n\ - adds r4, r2\n\ - adds r1, r4\n\ - lsls r4, r1, 16\n\ - lsrs r4, 17\n\ - strh r1, [r3, 0xE]\n\ - movs r1, 0x1\n\ - mov r0, r10\n\ - ands r1, r0\n\ - movs r2, 0x1\n\ - eors r1, r2\n\ - lsls r0, r1, 2\n\ - lsls r6, r0\n\ - eors r1, r2\n\ - lsls r1, 2\n\ - movs r0, 0xF\n\ - lsls r0, r1\n\ - orrs r6, r0\n\ - lsls r6, 24\n\ - lsrs r6, 24\n\ - mov r1, r9\n\ - lsls r1, 5\n\ - mov r9, r1\n\ - add r9, r4\n\ - ldr r1, [sp]\n\ - add r1, r9\n\ - ldrb r0, [r1]\n\ - ands r6, r0\n\ - strb r6, [r1]\n\ - add sp, 0x8\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - "); -} -#endif // NONMATCHING diff --git a/src/frontier_util.c b/src/frontier_util.c index 2fc58241a..40b1edbe3 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -2185,15 +2185,15 @@ static void sub_81A447C(void) u16 monId = gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1; if (monId < PARTY_SIZE) { - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { - for (k = 0; k < 4; k++) + for (k = 0; k < MAX_MON_MOVES; k++) { if (GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_MOVE1 + k, NULL) == GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j, NULL)) break; } - if (k == 4) + if (k == MAX_MON_MOVES) SetMonMoveSlot(&gPlayerParty[i], MOVE_SKETCH, j); } gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1] = gPlayerParty[i]; @@ -2407,9 +2407,9 @@ void sub_81A4C30(void) i = gPlayerPartyCount; LoadPlayerParty(); - sub_8076D5C(); + SetContinueGameWarpStatusToDynamicWarp(); TrySavingData(SAVE_LINK); - sav2_gender2_inplace_and_xFE(); + ClearContinueGameWarpStatus2(); gPlayerPartyCount = i; for (i = 0; i < PARTY_SIZE; i++) @@ -2511,7 +2511,7 @@ void CreateFrontierBrainPokemon(void) for (j = 0; j < NUM_STATS; j++) SetMonData(&gEnemyParty[monPartyId], MON_DATA_HP_EV + j, &sFrontierBrainsMons[facility][symbol][i].evs[j]); friendship = 0xFF; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { SetMonMoveSlot(&gEnemyParty[monPartyId], sFrontierBrainsMons[facility][symbol][i].moves[j], j); if (sFrontierBrainsMons[facility][symbol][i].moves[j] == MOVE_FRUSTRATION) diff --git a/src/ghost.c b/src/ghost.c index a755783b7..d26a4d1cb 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -800,7 +800,7 @@ void sub_81123C4(u8 taskId) task->data[10] = gBattleAnimArgs[0]; baseX = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); - baseY = sub_80A861C(gBattleAnimAttacker, 3); + baseY = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM); if (!IsContest()) { for (battler = 0; battler < 4; battler++) @@ -813,7 +813,7 @@ void sub_81123C4(u8 taskId) if (spriteId != MAX_SPRITES) { x = GetBattlerSpriteCoord(battler, 2); - y = sub_80A861C(battler, 3); + y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_BOTTOM); gSprites[spriteId].data[0] = baseX << 4; gSprites[spriteId].data[1] = baseY << 4; gSprites[spriteId].data[2] = ((x - baseX) << 4) / gBattleAnimArgs[1]; @@ -1168,7 +1168,7 @@ void sub_8112C6C(u8 taskId) task->data[1] = 16; task->data[9] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); task->data[10] = GetBattlerYCoordWithElevation(gBattleAnimAttacker); - task->data[11] = (sub_80A861C(gBattleAnimAttacker, 1) / 2) + 8; + task->data[11] = (GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2) + 8; task->data[7] = 0; task->data[5] = GetBattlerSpriteBGPriority(gBattleAnimAttacker); task->data[6] = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 2; diff --git a/src/gpu_regs.c b/src/gpu_regs.c index 2d48b304a..e5ff4fe8f 100644 --- a/src/gpu_regs.c +++ b/src/gpu_regs.c @@ -72,16 +72,20 @@ void SetGpuReg(u8 regOffset, u16 value) GPU_REG_BUF(regOffset) = value; vcount = REG_VCOUNT & 0xFF; - if ((vcount >= 161 && vcount <= 225) - || (REG_DISPCNT & DISPCNT_FORCED_BLANK)) { + if ((vcount >= 161 && vcount <= 225) || (REG_DISPCNT & DISPCNT_FORCED_BLANK)) + { CopyBufferedValueToGpuReg(regOffset); - } else { + } + else + { s32 i; sGpuRegBufferLocked = TRUE; - for (i = 0; i < GPU_REG_BUF_SIZE && sGpuRegWaitingList[i] != EMPTY_SLOT; i++) { - if (sGpuRegWaitingList[i] == regOffset) { + for (i = 0; i < GPU_REG_BUF_SIZE && sGpuRegWaitingList[i] != EMPTY_SLOT; i++) + { + if (sGpuRegWaitingList[i] == regOffset) + { sGpuRegBufferLocked = FALSE; return; } @@ -99,15 +103,20 @@ void SetGpuReg_ForcedBlank(u8 regOffset, u16 value) { GPU_REG_BUF(regOffset) = value; - if (REG_DISPCNT & DISPCNT_FORCED_BLANK) { + if (REG_DISPCNT & DISPCNT_FORCED_BLANK) + { CopyBufferedValueToGpuReg(regOffset); - } else { + } + else + { s32 i; sGpuRegBufferLocked = TRUE; - for (i = 0; i < GPU_REG_BUF_SIZE && sGpuRegWaitingList[i] != EMPTY_SLOT; i++) { - if (sGpuRegWaitingList[i] == regOffset) { + for (i = 0; i < GPU_REG_BUF_SIZE && sGpuRegWaitingList[i] != EMPTY_SLOT; i++) + { + if (sGpuRegWaitingList[i] == regOffset) + { sGpuRegBufferLocked = FALSE; return; } @@ -144,7 +153,8 @@ void ClearGpuRegBits(u8 regOffset, u16 mask) static void SyncRegIE(void) { - if (sShouldSyncRegIE) { + if (sShouldSyncRegIE) + { u16 temp = REG_IME; REG_IME = 0; REG_IE = sRegIE; diff --git a/src/graphics.c b/src/graphics.c index c0deb2883..b2de074bc 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -897,9 +897,9 @@ const u32 gBattleStatMask6_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat6 const u32 gBattleStatMask7_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat7.gbapal.lz"); const u32 gBattleStatMask8_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat8.gbapal.lz"); -const u8 gUnknown_08C2DC68[] = INCBIN_U8("graphics/battle_anims/masks/cure_bubbles.4bpp.lz"); -const u16 gUnknown_08C2DDA4[] = INCBIN_U16("graphics/battle_anims/masks/cure_bubbles.gbapal.lz"); -const u8 gUnknown_08C2DDC4[] = INCBIN_U8("graphics/battle_anims/masks/cure_bubbles.bin.lz"); +const u32 gUnknown_08C2DC68[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.4bpp.lz"); +const u32 gUnknown_08C2DDA4[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.gbapal.lz"); +const u32 gUnknown_08C2DDC4[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.bin.lz"); const u32 gBattleAnimSpritePalette_245[] = INCBIN_U32("graphics/battle_anims/sprites/245.gbapal.lz"); const u32 gBattleAnimSpriteSheet_245[] = INCBIN_U32("graphics/battle_anims/sprites/245.4bpp.lz"); diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index f7792e935..3f217b782 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -14,7 +14,9 @@ #include "constants/songs.h" #include "decompress.h" #include "save.h" +#include "strings.h" #include "window.h" +#include "credits.h" #include "bg.h" #include "constants/species.h" #include "constants/game_stat.h" @@ -28,6 +30,7 @@ #include "event_data.h" #include "overworld.h" #include "menu.h" +#include "fldeff_misc.h" #include "trainer_pokemon_sprites.h" #include "data2.h" #include "rom_81520A8.h" @@ -59,37 +62,11 @@ static EWRAM_DATA u32 sUnknown_0203BCD4 = 0; static EWRAM_DATA struct HallofFameTeam *sHofMonPtr = NULL; static EWRAM_DATA struct HofGfx *sHofGfxPtr = NULL; -extern bool8 gHasHallOfFameRecords; extern struct MusicPlayerInfo gMPlayInfo_BGM; #define HALL_OF_FAME_MAX_TEAMS 50 -// strings -extern const u8 gText_SavingDontTurnOffPower[]; -extern const u8 gText_LeagueChamp[]; -extern const u8 gText_HOFNumber[]; -extern const u8 gText_PickNextCancel[]; -extern const u8 gText_PickCancel[]; -extern const u8 gText_UnkCtrlF800Exit[]; -extern const u8 gText_HOFCorrupted[]; -extern const u8 gText_WelcomeToHOF[]; -extern const u8 gText_Number[]; -extern const u8 gText_Level[]; -extern const u8 gText_IDNumber[]; -extern const u8 gText_Name[]; -extern const u8 gText_MainMenuTime[]; - -extern void sub_8175620(void); -extern bool8 sub_80F9C30(void); -extern void sub_8198314(void); extern void ReturnFromHallOfFamePC(void); -extern void sub_8198180(const u8 *src, u8, u8); -extern void sub_80F9BF4(u16, u16, u8); -extern void sub_81980F0(u8, u8, u8, u8, u16); -extern void sub_80F9BCC(u16, u16, u8); -extern bool8 sub_80F9C1C(void); -extern void sub_81971D0(void); -extern void sub_8197200(void); // this file's functions static void ClearVramOamPltt_LoadHofPal(void); @@ -378,8 +355,8 @@ static bool8 InitHallOfFameScreen(void) gMain.state++; break; case 2: - SetGpuReg(REG_OFFSET_BLDCNT, 0x3F42); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x710); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 7)); SetGpuReg(REG_OFFSET_BLDY, 0); sub_8174FAC(); sHofGfxPtr->state = 0; @@ -840,8 +817,8 @@ void CB2_DoHallOfFamePC(void) { u8 taskId, i; - SetGpuReg(REG_OFFSET_BLDCNT, 0x3F42); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x710); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 7)); SetGpuReg(REG_OFFSET_BLDY, 0); taskId = CreateTask(Task_HofPC_CopySaveData, 0); @@ -1088,7 +1065,7 @@ static void Task_HofPC_HandleExit(u8 taskId) static void Task_HofPC_PrintDataIsCorrupted(u8 taskId) { - sub_8198180(gText_UnkCtrlF800Exit, 8, 1); + sub_8198180(gText_UnkCtrlF800Exit, 8, TRUE); NewMenuHelpers_DrawDialogueFrame(0, 0); AddTextPrinterParameterized2(0, 1, gText_HOFCorrupted, 0, NULL, 2, 1, 3); CopyWindowToVram(0, 3); @@ -1283,8 +1260,8 @@ static void sub_8174F70(void) ResetAllPicSprites(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; - LoadCompressedObjectPic(sHallOfFame_ConfettiSpriteSheet); - LoadCompressedObjectPalette(sHallOfFame_ConfettiSpritePalette); + LoadCompressedSpriteSheet(sHallOfFame_ConfettiSpriteSheet); + LoadCompressedSpritePalette(sHallOfFame_ConfettiSpritePalette); } static void sub_8174FAC(void) @@ -1322,7 +1299,7 @@ static bool8 sub_8175024(void) CopyBgTilemapBufferToVram(3); break; case 3: - sub_81971D0(); + InitStandardTextBoxWindows(); sub_8197200(); break; case 4: @@ -1475,8 +1452,8 @@ static void sub_8175364(u8 taskId) gSpecialVar_0x8004 = var; gSpecialVar_0x8005 = 0xFFFF; } - LoadCompressedObjectPic(sHallOfFame_ConfettiSpriteSheet); - LoadCompressedObjectPalette(sHallOfFame_ConfettiSpritePalette); + LoadCompressedSpriteSheet(sHallOfFame_ConfettiSpriteSheet); + LoadCompressedSpritePalette(sHallOfFame_ConfettiSpritePalette); data[0]++; break; case 1: @@ -1,21 +1,54 @@ #include "global.h" #include "battle_anim.h" +#include "bg.h" +#include "field_weather.h" +#include "gpu_regs.h" +#include "graphics.h" +#include "main.h" +#include "palette.h" +#include "random.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" +#include "constants/battle_anim.h" #include "constants/rgb.h" -extern void sub_810B6C4(struct Sprite *); -extern void sub_810B8AC(struct Sprite *); -extern void sub_810B8EC(struct Sprite *); -extern void sub_810B974(struct Sprite *); -extern void sub_810BA24(struct Sprite *); -extern void sub_810BC94(struct Sprite *); -extern void sub_810BE48(struct Sprite *); -extern void sub_810BED0(struct Sprite *); -extern void sub_810C2F0(struct Sprite *); -extern void sub_810C560(struct Sprite *); -extern void sub_810CB58(struct Sprite *); +struct HailStruct { + s32 unk0:10; + s32 unk1:10; + s32 unk2:8; + s32 unk3:4; +}; + +static void sub_810B6C4(struct Sprite *); +extern void sub_810B848(struct Sprite *); +extern void AnimIcePunchSwirlingParticle(struct Sprite *); +extern void AnimIceBeamParticle(struct Sprite *); +extern void AnimIceEffectParticle(struct Sprite *); +extern void AnimFlickerIceEffectParticle(struct Sprite *); +extern void AnimSwirlingSnowball_Step1(struct Sprite *); +extern void AnimSwirlingSnowball_Step2(struct Sprite *); +extern void AnimSwirlingSnowball_Step3(struct Sprite *); +extern void AnimSwirlingSnowball_End(struct Sprite *); +extern void AnimMoveParticleBeyondTarget(struct Sprite *); +extern void AnimWiggleParticleTowardsTarget(struct Sprite *); +extern void AnimWaveFromCenterOfTarget(struct Sprite *); +extern void InitSwirlingFogAnim(struct Sprite *); +extern void AnimSwirlingFogAnim(struct Sprite *); +extern void AnimThrowMistBall(struct Sprite *); +extern void InitPoisonGasCloudAnim(struct Sprite *); +extern void MovePoisonGasCloud(struct Sprite *); +extern void AnimHailBegin(struct Sprite *); +extern void AnimHailContinue(struct Sprite *); extern void sub_80A8EE4(struct Sprite *); -extern void unc_080B06FC(struct Sprite *); -extern void sub_810CD4C(struct Sprite *); +extern void InitIceBallAnim(struct Sprite *); +extern void AnimThrowIceBall(struct Sprite *); +extern void InitIceBallParticle(struct Sprite *); +extern void AnimIceBallParticle(struct Sprite *); +void AnimTask_Haze2(u8); +void AnimTask_OverlayFogTiles(u8); +void AnimTask_Hail2(u8); +bool8 GenerateHailParticle(u8, u8, u8, u8); const union AnimCmd gUnknown_08595A48[] = { @@ -127,7 +160,7 @@ const struct SpriteTemplate gUnknown_08595AD0 = .anims = gUnknown_08595AA8, .images = NULL, .affineAnims = gUnknown_08595ACC, - .callback = sub_810B8AC, + .callback = AnimIcePunchSwirlingParticle, }; const struct SpriteTemplate gUnknown_08595AE8 = @@ -138,7 +171,7 @@ const struct SpriteTemplate gUnknown_08595AE8 = .anims = gUnknown_08595AAC, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810B8AC, + .callback = AnimIcePunchSwirlingParticle, }; const union AffineAnimCmd gUnknown_08595B00[] = @@ -160,7 +193,7 @@ const struct SpriteTemplate gUnknown_08595B14 = .anims = gUnknown_08595AA8, .images = NULL, .affineAnims = gUnknown_08595B10, - .callback = sub_810B8EC, + .callback = AnimIceBeamParticle, }; const struct SpriteTemplate gUnknown_08595B2C = @@ -171,7 +204,7 @@ const struct SpriteTemplate gUnknown_08595B2C = .anims = gUnknown_08595AAC, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810B8EC, + .callback = AnimIceBeamParticle, }; const union AffineAnimCmd gUnknown_08595B44[] = @@ -195,7 +228,7 @@ const struct SpriteTemplate gUnknown_08595B68 = .anims = gUnknown_08595AA8, .images = NULL, .affineAnims = gUnknown_08595B64, - .callback = sub_810B974, + .callback = AnimIceEffectParticle, }; const struct SpriteTemplate gUnknown_08595B80 = @@ -206,7 +239,7 @@ const struct SpriteTemplate gUnknown_08595B80 = .anims = gUnknown_08595AAC, .images = NULL, .affineAnims = gUnknown_08595B64, - .callback = sub_810B974, + .callback = AnimIceEffectParticle, }; const struct SpriteTemplate gUnknown_08595B98 = @@ -217,7 +250,7 @@ const struct SpriteTemplate gUnknown_08595B98 = .anims = gUnknown_08595AB0, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810BA24, + .callback = AnimSwirlingSnowball_Step1, }; const struct SpriteTemplate gUnknown_08595BB0 = @@ -228,7 +261,7 @@ const struct SpriteTemplate gUnknown_08595BB0 = .anims = gUnknown_08595AB4, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810BC94, + .callback = AnimMoveParticleBeyondTarget, }; const struct SpriteTemplate gUnknown_08595BC8 = @@ -239,7 +272,7 @@ const struct SpriteTemplate gUnknown_08595BC8 = .anims = gUnknown_08595AB0, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810BC94, + .callback = AnimMoveParticleBeyondTarget, }; const union AnimCmd gUnknown_08595BE0[] = @@ -267,7 +300,7 @@ const struct SpriteTemplate gUnknown_08595C04 = .anims = gUnknown_08595C00, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810BE48, + .callback = AnimWaveFromCenterOfTarget, }; const union AnimCmd gUnknown_08595C1C[] = @@ -290,7 +323,7 @@ const struct SpriteTemplate gUnknown_08595C2C = .anims = gUnknown_08595C28, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810BED0, + .callback = InitSwirlingFogAnim, }; const struct SpriteTemplate gUnknown_08595C44 = @@ -301,7 +334,7 @@ const struct SpriteTemplate gUnknown_08595C44 = .anims = gUnknown_08595C28, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810BED0, + .callback = InitSwirlingFogAnim, }; const u8 gUnknown_08595C5C[] = @@ -317,7 +350,7 @@ const struct SpriteTemplate gUnknown_08595C70 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810C2F0, + .callback = AnimThrowMistBall, }; const u8 gUnknown_08595C88[] = @@ -333,21 +366,21 @@ const struct SpriteTemplate gUnknown_08595C9C = .anims = gUnknown_08595C28, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810C560, + .callback = InitPoisonGasCloudAnim, }; -const u8 gUnknown_08595CB4[][4] = +const struct HailStruct gUnknown_08595CB4[] = { - {0x64, 0xE0, 0x01, 0x20}, - {0x55, 0xE0, 0x01, 0x00}, - {0xF2, 0xE0, 0x11, 0x10}, - {0x42, 0xE0, 0x21, 0x10}, - {0xB6, 0xE0, 0x31, 0x00}, - {0x3C, 0xE0, 0x01, 0x20}, - {0xD6, 0xE0, 0x11, 0x00}, - {0x71, 0xE0, 0x01, 0x10}, - {0xD2, 0xE0, 0x31, 0x10}, - {0x26, 0xE0, 0x21, 0x00}, + {100, 120, 0, 2}, + {85, 120, 0, 0}, + {242, 120, 1, 1}, + {66, 120, 2, 1}, + {182, 120, 3, 0}, + {60, 120, 0, 2}, + {214, 120, 1, 0}, + {113, 120, 0, 1}, + {210, 120, 3, 1}, + {38, 120, 2, 0}, }; const union AffineAnimCmd gUnknown_08595CDC[] = @@ -394,7 +427,7 @@ const struct SpriteTemplate gUnknown_08595D2C = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gUnknown_08595D1C, - .callback = sub_810CB58, + .callback = AnimHailBegin, }; const struct SpriteTemplate gUnknown_08595D44 = @@ -476,7 +509,7 @@ const struct SpriteTemplate gUnknown_08595DE4 = .anims = gUnknown_08595D78, .images = NULL, .affineAnims = gUnknown_08595DD0, - .callback = unc_080B06FC, + .callback = InitIceBallAnim, }; const struct SpriteTemplate gUnknown_08595DFC = @@ -487,5 +520,1421 @@ const struct SpriteTemplate gUnknown_08595DFC = .anims = gUnknown_08595AAC, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810CD4C, + .callback = InitIceBallParticle, }; + + +// probably unused +#ifdef NONMATCHING +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); + attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); + attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = gBattleAnimArgs[0] + attackerX; + sprite->data[2] = gBattleAnimArgs[2] + targetX; + sprite->data[3] = gBattleAnimArgs[1] + attackerY; + sprite->data[4] = gBattleAnimArgs[3] + targetY; + sub_80A64EC(sprite); + while ((targetX >= -32 && targetX <= 272) && (targetY >= -32 && targetY <= 192)) + { + targetX += sprite->data[1]; + targetY += sprite->data[2]; + } + sprite->data[1] = -sprite->data[1]; + sprite->data[2] = -sprite->data[2]; + while ((attackerX >= -32 && attackerX <= 272) && (attackerY >= -32 && attackerY <= 192)) + { + attackerX += sprite->data[1]; + attackerY += sprite->data[2]; + } + sprite->pos1.x = attackerX; + sprite->pos1.y = attackerY; + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = attackerX; + sprite->data[2] = targetX; + sprite->data[3] = attackerY; + sprite->data[4] = targetY; + sub_80A64EC(sprite); + sprite->data[3] = gBattleAnimArgs[5]; + sprite->data[4] = gBattleAnimArgs[6]; + sprite->callback = sub_810B848; +} +#else +NAKED +static void sub_810B6C4(struct Sprite *sprite) +{ + asm_unified("push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + adds r5, r0, 0\n\ + ldrh r2, [r5, 0x4]\n\ + lsls r1, r2, 22\n\ + lsrs r1, 22\n\ + adds r1, 0x7\n\ + ldr r3, =0x000003ff\n\ + adds r0, r3, 0\n\ + ands r1, r0\n\ + ldr r0, =0xfffffc00\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strh r0, [r5, 0x4]\n\ + ldr r4, =gBattleAnimTarget\n\ + ldrb r0, [r4]\n\ + movs r1, 0x2\n\ + bl GetBattlerSpriteCoord\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r9, r0\n\ + ldrb r0, [r4]\n\ + movs r1, 0x3\n\ + bl GetBattlerSpriteCoord\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + ldr r4, =gBattleAnimAttacker\n\ + ldrb r0, [r4]\n\ + movs r1, 0x2\n\ + bl GetBattlerSpriteCoord\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + ldrb r0, [r4]\n\ + movs r1, 0x3\n\ + str r3, [sp]\n\ + bl GetBattlerSpriteCoord\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + ldr r1, =gBattleAnimArgs\n\ + ldrh r0, [r1, 0x8]\n\ + strh r0, [r5, 0x2E]\n\ + ldrh r0, [r1]\n\ + ldr r3, [sp]\n\ + adds r0, r3\n\ + strh r0, [r5, 0x30]\n\ + ldrh r0, [r1, 0x4]\n\ + mov r4, r9\n\ + adds r0, r4, r0\n\ + strh r0, [r5, 0x32]\n\ + ldrh r0, [r1, 0x2]\n\ + adds r0, r6\n\ + strh r0, [r5, 0x34]\n\ + ldrh r0, [r1, 0x6]\n\ + mov r7, r8\n\ + adds r0, r7, r0\n\ + strh r0, [r5, 0x36]\n\ + adds r0, r5, 0\n\ + bl sub_80A64EC\n\ + adds r4, 0x20\n\ + movs r0, 0x98\n\ + lsls r0, 1\n\ + mov r12, r0\n\ + ldr r3, [sp]\n\ + cmp r4, r12\n\ + bhi _0810B79E\n\ + adds r0, r7, 0\n\ + adds r0, 0x20\n\ + ldrh r1, [r5, 0x30]\n\ + ldrh r2, [r5, 0x32]\n\ + cmp r0, 0xE0\n\ + bhi _0810B79E\n\ + adds r4, r1, 0\n\ + mov r10, r12\n\ +_0810B76A:\n\ + mov r7, r9\n\ + lsls r1, r7, 16\n\ + asrs r1, 16\n\ + adds r1, r4\n\ + lsls r1, 16\n\ + mov r7, r8\n\ + lsls r0, r7, 16\n\ + asrs r0, 16\n\ + adds r0, r2\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r8, r0\n\ + lsrs r0, r1, 16\n\ + mov r9, r0\n\ + movs r7, 0x80\n\ + lsls r7, 14\n\ + adds r1, r7\n\ + lsrs r1, 16\n\ + cmp r1, r10\n\ + bhi _0810B79E\n\ + mov r1, r8\n\ + lsls r0, r1, 16\n\ + adds r0, r7\n\ + lsrs r0, 16\n\ + cmp r0, 0xE0\n\ + bls _0810B76A\n\ +_0810B79E:\n\ + ldrh r0, [r5, 0x30]\n\ + negs r7, r0\n\ + strh r7, [r5, 0x30]\n\ + ldrh r0, [r5, 0x32]\n\ + negs r4, r0\n\ + strh r4, [r5, 0x32]\n\ + lsls r0, r3, 16\n\ + movs r1, 0x80\n\ + lsls r1, 14\n\ + adds r0, r1\n\ + lsrs r0, 16\n\ + movs r2, 0x98\n\ + lsls r2, 1\n\ + mov r12, r2\n\ + ldr r1, =gBattleAnimArgs\n\ + mov r10, r1\n\ + cmp r0, r12\n\ + bhi _0810B80A\n\ + lsls r1, r6, 16\n\ + movs r2, 0x80\n\ + lsls r2, 14\n\ + adds r0, r1, r2\n\ + b _0810B802\n\ + .pool\n\ +_0810B7E0:\n\ + lsls r1, r3, 16\n\ + asrs r1, 16\n\ + adds r1, r7\n\ + lsls r1, 16\n\ + asrs r0, r2, 16\n\ + adds r0, r4\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + lsrs r3, r1, 16\n\ + movs r0, 0x80\n\ + lsls r0, 14\n\ + adds r1, r0\n\ + lsrs r1, 16\n\ + cmp r1, r12\n\ + bhi _0810B80A\n\ + lsls r1, r6, 16\n\ + adds r0, r1, r0\n\ +_0810B802:\n\ + lsrs r0, 16\n\ + adds r2, r1, 0\n\ + cmp r0, 0xE0\n\ + bls _0810B7E0\n\ +_0810B80A:\n\ + strh r3, [r5, 0x20]\n\ + strh r6, [r5, 0x22]\n\ + mov r1, r10\n\ + ldrh r0, [r1, 0x8]\n\ + strh r0, [r5, 0x2E]\n\ + strh r3, [r5, 0x30]\n\ + mov r2, r9\n\ + strh r2, [r5, 0x32]\n\ + strh r6, [r5, 0x34]\n\ + mov r3, r8\n\ + strh r3, [r5, 0x36]\n\ + adds r0, r5, 0\n\ + bl sub_80A64EC\n\ + mov r7, r10\n\ + ldrh r0, [r7, 0xA]\n\ + strh r0, [r5, 0x34]\n\ + ldrh r0, [r7, 0xC]\n\ + strh r0, [r5, 0x36]\n\ + ldr r0, =sub_810B848\n\ + str r0, [r5, 0x1C]\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n"); +} +#endif + +void sub_810B848(struct Sprite *sprite) +{ + if (sprite->data[0] != 0) + { + sprite->data[5] += sprite->data[1]; + sprite->data[6] += sprite->data[2]; + sprite->pos2.x = sprite->data[5]; + sprite->pos2.y = sprite->data[6]; + sprite->pos2.x += Sin(sprite->data[7], sprite->data[3]); + sprite->pos2.y += Sin(sprite->data[7], sprite->data[3]); + sprite->data[7] = (sprite->data[7] + sprite->data[4]) & 0xFF; + sprite->data[0]--; + } + else + { + DestroyAnimSprite(sprite); + } +} + +// Animates the swirling ice crystals in Ice Punch. +// arg 0: initial position angle around circle (0-256) +void AnimIcePunchSwirlingParticle(struct Sprite *sprite) +{ + sprite->data[0] = gBattleAnimArgs[0]; + sprite->data[1] = 60; + sprite->data[2] = 9; + sprite->data[3] = 30; + sprite->data[4] = -512; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); + sprite->callback = TranslateSpriteInGrowingCircleOverDuration; + sprite->callback(sprite); +} + +// Animates the ice particles in Ice Beam. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: target x offset +// arg 3: target y offset +// arg 4: duration +void AnimIceBeamParticle(struct Sprite *sprite) +{ + InitSpritePosToAnimAttacker(sprite, TRUE); + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); + + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + sprite->data[2] -= gBattleAnimArgs[2]; + else + sprite->data[2] += gBattleAnimArgs[2]; + + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3]; + sprite->data[0] = gBattleAnimArgs[4]; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); + sprite->callback = StartAnimLinearTranslation; +} + +// 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 +// arg 2: ??? unknown boolean +void AnimIceEffectParticle(struct Sprite *sprite) +{ + if (gBattleAnimArgs[2] == 0) + { + InitSpritePosToAnimTarget(sprite, TRUE); + } + else + { + SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->pos1.x, &sprite->pos1.y); + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + } + + StoreSpriteCallbackInData6(sprite, AnimFlickerIceEffectParticle); + sprite->callback = RunStoredCallbackWhenAffineAnimEnds; +} + +void AnimFlickerIceEffectParticle(struct Sprite *sprite) +{ + sprite->invisible ^= 1; + sprite->data[0] += 1; + if (sprite->data[0] == 20) + DestroySpriteAndMatrix(sprite); +} + +// Animates the small snowballs that swirl around the target in Blizzard and Icy Wind. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: target x offset +// arg 3: target y offset +// arg 4: particle speed +// arg 5: multiple targets? (boolean) +void AnimSwirlingSnowball_Step1(struct Sprite *sprite) +{ + int i; + s16 tempDataHolder[8]; + + InitSpritePosToAnimAttacker(sprite, TRUE); + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = sprite->pos1.x; + sprite->data[3] = sprite->pos1.y; + + if (!gBattleAnimArgs[5]) + { + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3]; + } + else + { + SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]); + } + + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + sprite->data[2] -= gBattleAnimArgs[2]; + else + sprite->data[2] += gBattleAnimArgs[2]; + + for (i = 0; i < 8; i++) + tempDataHolder[i] = sprite->data[i]; + + InitAnimFastLinearTranslationWithSpeed(sprite); + sprite->data[1] ^= 1; + sprite->data[2] ^= 1; + + while (1) + { + sprite->data[0] = 1; + AnimFastTranslateLinear(sprite); + + if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272 + || sprite->pos1.y + sprite->pos2.y > 160 + || sprite->pos1.y + sprite->pos2.y < -16) + break; + } + + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + + for (i = 0; i < 8; i++) + sprite->data[i] = tempDataHolder[i]; + + sprite->callback = sub_80A718C; + StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step2); +} + +void AnimSwirlingSnowball_Step2(struct Sprite *sprite) +{ + s16 tempVar; + + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + sprite->data[0] = 128; + + tempVar = GetBattlerSide(gBattleAnimAttacker) != 0 ? 20 : -20; + + sprite->data[3] = Sin(sprite->data[0], tempVar); + sprite->data[4] = Cos(sprite->data[0], 0xF); + sprite->data[5] = 0; + sprite->callback = AnimSwirlingSnowball_Step3; + sprite->callback(sprite); +} + +void AnimSwirlingSnowball_Step3(struct Sprite *sprite) +{ + s16 tempVar; + tempVar = GetBattlerSide(gBattleAnimAttacker) != 0 ? 20 : -20; + + if (sprite->data[5] <= 31) + { + sprite->pos2.x = Sin(sprite->data[0], tempVar) - sprite->data[3]; + sprite->pos2.y = Cos(sprite->data[0], 15) - sprite->data[4]; + sprite->data[0] = (sprite->data[0] + 16) & 0xFF; + sprite->data[5] += 1; + } + else + { + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + sprite->data[4] = 0; + sprite->data[3] = 0; + sprite->callback = AnimSwirlingSnowball_End; + } +} + +void AnimSwirlingSnowball_End(struct Sprite *sprite) +{ + sprite->data[0] = 1; + AnimFastTranslateLinear(sprite); + + if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272 + || sprite->pos1.y + sprite->pos2.y > 256 + || sprite->pos1.y + sprite->pos2.y < -16) + DestroyAnimSprite(sprite); +} + +// Moves particles towards the target mon and off the screen. Used to animate +// the large snowballs in Blizzard and the small snowballs in Powder Snow. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: target x offset +// arg 3: target y offset +// arg 4: speed +// arg 5: wave amplitude +// arg 6: wave frequency +// arg 7: multiple targets? (boolean) +void AnimMoveParticleBeyondTarget(struct Sprite *sprite) +{ + int i; + s16 tempDataHolder[8]; + + InitSpritePosToAnimAttacker(sprite, TRUE); + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = sprite->pos1.x; + sprite->data[3] = sprite->pos1.y; + + if (!gBattleAnimArgs[7]) + { + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); + } + else + { + SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]); + } + + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + sprite->data[2] -= gBattleAnimArgs[2]; + else + sprite->data[2] += gBattleAnimArgs[2]; + + sprite->data[4] += gBattleAnimArgs[3]; + InitAnimFastLinearTranslationWithSpeed(sprite); + for (i = 0; i < 8; i++) + tempDataHolder[i] = sprite->data[i]; + + sprite->data[1] ^= 1; + sprite->data[2] ^= 1; + + while (1) + { + sprite->data[0] = 1; + AnimFastTranslateLinear(sprite); + if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272 + || sprite->pos1.y + sprite->pos2.y > 160 + || sprite->pos1.y + sprite->pos2.y < -16) + break; + } + + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + + for (i = 0; i < 8; i++) + sprite->data[i] = tempDataHolder[i]; + + sprite->data[5] = gBattleAnimArgs[5]; + sprite->data[6] = gBattleAnimArgs[6]; + sprite->callback = AnimWiggleParticleTowardsTarget; +} + +// Moves particles in a sine wave towards the target. +void AnimWiggleParticleTowardsTarget(struct Sprite *sprite) +{ + AnimFastTranslateLinear(sprite); + if (sprite->data[0] == 0) + sprite->data[0] = 1; + + sprite->pos2.y += Sin(sprite->data[7], sprite->data[5]); + sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF; + if (sprite->data[0] == 1) + { + if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272 + || sprite->pos1.y + sprite->pos2.y > 160 + || sprite->pos1.y + sprite->pos2.y < -16) + DestroyAnimSprite(sprite); + } +} + +// Animates the ice pilar wave used by Icy Wind. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: ??? unknown boolean +void AnimWaveFromCenterOfTarget(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + if (gBattleAnimArgs[2] == 0) + { + InitSpritePosToAnimTarget(sprite, FALSE); + } + else + { + SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y); + + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + } + + sprite->data[0]++; + } + else + { + if (sprite->animEnded) + DestroyAnimSprite(sprite); + } +} + +// Animates the fog that swirls around the mon in Mist and Smog. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: change in y pixels per rotation +// arg 3: duration +// arg 4: animate on opponent? (boolean) +// arg 5: ??? unknown boolean +void InitSwirlingFogAnim(struct Sprite *sprite) +{ + s16 tempVar; + u8 battler; + + if (gBattleAnimArgs[4] == 0) + { + if (gBattleAnimArgs[5] == 0) + { + InitSpritePosToAnimAttacker(sprite, FALSE); + } + else + { + SetAverageBattlerPositions(gBattleAnimAttacker, 0, &sprite->pos1.x, &sprite->pos1.y); + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + sprite->pos1.x -= gBattleAnimArgs[0]; + else + sprite->pos1.x += gBattleAnimArgs[0]; + + sprite->pos1.y += gBattleAnimArgs[1]; + } + + battler = gBattleAnimAttacker; + } + else + { + if (gBattleAnimArgs[5] == 0) + { + InitSpritePosToAnimTarget(sprite, FALSE); + } + else + { + SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y); + if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER) + sprite->pos1.x -= gBattleAnimArgs[0]; + else + sprite->pos1.x += gBattleAnimArgs[0]; + + sprite->pos1.y += gBattleAnimArgs[1]; + } + + battler = gBattleAnimTarget; + } + + sprite->data[7] = battler; + if (gBattleAnimArgs[5] == 0 || !IsDoubleBattle()) + tempVar = 0x20; + else + tempVar = 0x40; + + sprite->data[6] = tempVar; + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) + sprite->pos1.y += 8; + + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[2]; + + InitAnimLinearTranslation(sprite); + + sprite->data[5] = 64; + sprite->callback = AnimSwirlingFogAnim; + sprite->callback(sprite); +} + +// Animates swirling fog initialized by InitSwirlingFogAnim. +void AnimSwirlingFogAnim(struct Sprite *sprite) +{ + if (!AnimTranslateLinear(sprite)) + { + sprite->pos2.x += Sin(sprite->data[5], sprite->data[6]); + sprite->pos2.y += Cos(sprite->data[5], -6); + + if ((u16)(sprite->data[5] - 64) <= 0x7F) + sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]); + else + sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]) + 1; + + sprite->data[5] = (sprite->data[5] + 3) & 0xFF; + } + else + { + DestroyAnimSprite(sprite); + } +} + +// Fades mons to black and places foggy overlay in Haze. +void AnimTask_Haze1(u8 taskId) +{ + struct UnknownAnimStruct2 subStruct; + + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); + + if (!IsContest()) + SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); + SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); + + sub_80A6B30(&subStruct); + LoadBgTiles(subStruct.bgId, gWeatherFog1Tiles, 0x800, subStruct.tilesOffset); + sub_80A6D60(&subStruct, gBattleAnimFogTilemap, 0); + LoadPalette(&gUnknown_083970E8, subStruct.unk8 * 16, 32); + + gTasks[taskId].func = AnimTask_Haze2; +} + +void AnimTask_Haze2(u8 taskId) +{ + struct UnknownAnimStruct2 subStruct; + + gBattle_BG1_X += -1; + gBattle_BG1_Y += 0; + + 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) + { + 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[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); + } +} + +// Throws the ball in Mist Ball. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: targey x offset +// arg 3: target y offset +// arg 4: duration +// arg 5: ??? unknown (seems to vibrate target mon somehow) +void AnimThrowMistBall(struct Sprite *sprite) +{ + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); + sprite->callback = TranslateAnimSpriteToTargetMonLocation; +} + +// Displays misty background in Mist Ball. +void AnimTask_LoadMistTiles(u8 taskId) +{ + struct UnknownAnimStruct2 subStruct; + + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); + + if (!IsContest()) + SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); + SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); + + sub_80A6B30(&subStruct); + 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; +} + +void AnimTask_OverlayFogTiles(u8 taskId) +{ + struct UnknownAnimStruct2 subStruct; + + gBattle_BG1_X += gTasks[taskId].data[15]; + gBattle_BG1_Y += 0; + + 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) + { + 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); + } +} + +// Initializes gas clouds in the Poison Gas animation. +// arg 0: duration +// arg 1: ? target x offset +// arg 2: ? target y offset +// arg 3: ? swirl start x +// arg 4: ? swirl start y +// arg 5: ??? unknown +// arg 6: ??? unknown +// arg 7: ??? unknown boolean +void InitPoisonGasCloudAnim(struct Sprite *sprite) +{ + sprite->data[0] = gBattleAnimArgs[0]; + + if (GetBattlerSpriteCoord(gBattleAnimAttacker, 2) < GetBattlerSpriteCoord(gBattleAnimTarget, 2)) + sprite->data[7] = 0x8000; + + if (!(gBattlerPositions[gBattleAnimTarget] & 1)) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + + if ((sprite->data[7] & 0x8000) && !(gBattlerPositions[gBattleAnimAttacker] & 1)) + sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1; + + sprite->data[6] = 1; + } + + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); + if (gBattleAnimArgs[7]) + { + sprite->data[1] = sprite->pos1.x + gBattleAnimArgs[1]; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[3]; + sprite->data[3] = sprite->pos1.y + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[4]; + sprite->data[7] |= GetBattlerSpriteBGPriority(gBattleAnimTarget) << 8; + } + else + { + sprite->data[1] = sprite->pos1.x + gBattleAnimArgs[1]; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 0) + gBattleAnimArgs[3]; + sprite->data[3] = sprite->pos1.y + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + gBattleAnimArgs[4]; + sprite->data[7] |= GetBattlerSpriteBGPriority(gBattleAnimTarget) << 8; + } + + if (IsContest()) + { + sprite->data[6] = 1; + sprite->subpriority = 0x80; + } + + InitAnimLinearTranslation(sprite); + sprite->callback = MovePoisonGasCloud; +} + +void MovePoisonGasCloud(struct Sprite *sprite) +{ + int value; + register s16 value2 asm("r5"); + int unused; + + switch (sprite->data[7] & 0xFF) + { + case 0: + AnimTranslateLinear(sprite); + value = gSineTable[sprite->data[5]]; + sprite->pos2.x += value >> 4; + if (sprite->data[6]) + sprite->data[5] = (sprite->data[5] - 8) & 0xFF; + else + sprite->data[5] = (sprite->data[5] + 8) & 0xFF; + + if (sprite->data[0] <= 0) + { + value2 = 80; + sprite->data[0] = value2; + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x; + sprite->pos1.y += sprite->pos2.y; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + 29; + sprite->data[7]++; + if (!IsContest() && gBattlerPositions[gBattleAnimTarget] & 1) + sprite->data[5] = 204; + else + sprite->data[5] = value2; + + sprite->pos2.y = 0; + value = gSineTable[sprite->data[5]]; + sprite->pos2.x = value >> 3; + sprite->data[5] = (sprite->data[5] + 2) & 0xFF; + InitAnimLinearTranslation(sprite); + } + break; + case 1: + AnimTranslateLinear(sprite); + value = gSineTable[sprite->data[5]]; + sprite->pos2.x += value >> 3; + sprite->pos2.y += (gSineTable[sprite->data[5] + 0x40] * -3) >> 8; + if (!IsContest()) + { + u16 var0 = sprite->data[5] - 0x40; + if (var0 <= 0x7F) + sprite->oam.priority = sprite->data[7] >> 8; + else + sprite->oam.priority = (sprite->data[7] >> 8) + 1; + + sprite->data[5] = (sprite->data[5] + 4) & 0xFF; + } + else + { + u16 var0 = sprite->data[5] - 0x40; + if (var0 <= 0x7F) + sprite->subpriority = 128; + else + sprite->subpriority = 140; + + sprite->data[5] = (sprite->data[5] - 4) & 0xFF; + } + + 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) + sprite->data[2] = 0x100; + else + sprite->data[2] = -0x10; + + sprite->data[7]++; + sprite->pos2.x = sprite->pos2.y = 0; + sub_80A6FD4(sprite); + } + break; + case 2: + if (AnimTranslateLinear(sprite)) + { + if (sprite->oam.affineMode & 1) + { + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = ST_OAM_AFFINE_OFF; + } + + DestroySprite(sprite); + gAnimVisualTaskCount--; + } + break; + } +} + +// Creates Hail. +void AnimTask_Hail1(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->func = AnimTask_Hail2; +} + +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) + { + 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]--; + } + else + { + task->data[5] = 1; + } + + } + else + { + task->data[5]--; + } + break; + case 2: + if (task->data[1] == 0) + DestroyAnimVisualTask(taskId); + break; + } +} + +#ifdef NONMATCHING +bool8 GenerateHailParticle(u8 a, u8 b, u8 taskId, u8 c) +{ + bool8 possibleBool = FALSE; + // s8 unk = gUnknown_08595CB4[a].unk3; + const struct HailStruct *hailData = &gUnknown_08595CB4[a]; + s8 unk = hailData->unk3; + u8 battler; + s16 battlerX, battlerY; + u8 spriteId; + // struct Sprite *sprite; + s16 spriteX; + + if (unk != 2) + { + battler = GetBattlerAtPosition(hailData->unk2); + if (IsBattlerSpriteVisible(battler)) + { + possibleBool = TRUE; + battlerX = GetBattlerSpriteCoord(battler, 2); + battlerY = GetBattlerSpriteCoord(battler, 3); + switch (unk) + { + case 0: + battlerX -= GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_WIDTH) / 6; + battlerY -= GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 6; + break; + case 1: + battlerX += GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_WIDTH) / 6; + battlerY += GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 6; + break; + } + } + } + else + { + battlerX = (hailData->unk0); + battlerY = (hailData->unk1); + } + spriteX = battlerX - ((battlerY + 8) / 2); + spriteId = CreateSprite(&gUnknown_08595D2C, spriteX, -8, 18); + if (spriteId == MAX_SPRITES) + return FALSE; + // sprite = &gSprites[spriteId]; + StartSpriteAffineAnim(&gSprites[spriteId], b); + gSprites[spriteId].data[0] = possibleBool; + gSprites[spriteId].data[3] = battlerX; + gSprites[spriteId].data[4] = battlerY; + gSprites[spriteId].data[5] = b; + gSprites[spriteId].data[6] = taskId; + gSprites[spriteId].data[7] = c; + return TRUE; +} +#else +NAKED +bool8 GenerateHailParticle(u8 a, u8 b, u8 taskId, u8 c) +{ + asm_unified("push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + lsls r0, 24\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r9, r1\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + str r2, [sp]\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + mov r10, r3\n\ + movs r1, 0\n\ + str r1, [sp, 0x4]\n\ + ldr r1, =gUnknown_08595CB4\n\ + lsrs r0, 22\n\ + adds r4, r0, r1\n\ + ldrb r0, [r4, 0x3]\n\ + lsls r0, 24\n\ + asrs r0, 28\n\ + mov r8, r0\n\ + cmp r0, 0x2\n\ + beq _0810CAD0\n\ + ldrh r0, [r4, 0x2]\n\ + lsls r0, 20\n\ + lsrs r0, 24\n\ + bl GetBattlerAtPosition\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + adds r0, r5, 0\n\ + bl IsBattlerSpriteVisible\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0810CAD0\n\ + movs r0, 0x1\n\ + str r0, [sp, 0x4]\n\ + adds r0, r5, 0\n\ + movs r1, 0x2\n\ + bl GetBattlerSpriteCoord\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + adds r0, r5, 0\n\ + movs r1, 0x3\n\ + bl GetBattlerSpriteCoord\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + mov r1, r8\n\ + cmp r1, 0\n\ + beq _0810CA60\n\ + cmp r1, 0x1\n\ + beq _0810CA96\n\ + b _0810CAE2\n\ + .pool\n\ +_0810CA60:\n\ + adds r0, r5, 0\n\ + movs r1, 0x1\n\ + bl GetBattlerSpriteCoordAttr\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + movs r1, 0x6\n\ + bl __divsi3\n\ + lsls r1, r7, 16\n\ + asrs r1, 16\n\ + subs r1, r0\n\ + lsls r1, 16\n\ + lsrs r7, r1, 16\n\ + adds r0, r5, 0\n\ + movs r1, 0\n\ + bl GetBattlerSpriteCoordAttr\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + movs r1, 0x6\n\ + bl __divsi3\n\ + lsls r1, r6, 16\n\ + asrs r1, 16\n\ + subs r1, r0\n\ + b _0810CACA\n\ +_0810CA96:\n\ + adds r0, r5, 0\n\ + movs r1, 0x1\n\ + bl GetBattlerSpriteCoordAttr\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + movs r1, 0x6\n\ + bl __divsi3\n\ + lsls r1, r7, 16\n\ + asrs r1, 16\n\ + adds r1, r0\n\ + lsls r1, 16\n\ + lsrs r7, r1, 16\n\ + adds r0, r5, 0\n\ + movs r1, 0\n\ + bl GetBattlerSpriteCoordAttr\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + movs r1, 0x6\n\ + bl __divsi3\n\ + lsls r1, r6, 16\n\ + asrs r1, 16\n\ + adds r1, r0\n\ +_0810CACA:\n\ + lsls r1, 16\n\ + lsrs r6, r1, 16\n\ + b _0810CAE2\n\ +_0810CAD0:\n\ + ldrh r0, [r4]\n\ + lsls r0, 22\n\ + asrs r0, 6\n\ + lsrs r7, r0, 16\n\ + ldr r0, [r4]\n\ + lsls r0, 12\n\ + asrs r0, 22\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ +_0810CAE2:\n\ + lsls r0, r6, 16\n\ + asrs r0, 16\n\ + adds r0, 0x8\n\ + lsrs r1, r0, 31\n\ + adds r0, r1\n\ + asrs r0, 1\n\ + lsls r1, r7, 16\n\ + asrs r1, 16\n\ + subs r1, r0\n\ + ldr r0, =gUnknown_08595D2C\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + movs r2, 0x8\n\ + negs r2, r2\n\ + movs r3, 0x12\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x40\n\ + beq _0810CB44\n\ + lsls r4, r5, 4\n\ + adds r4, r5\n\ + lsls r4, 2\n\ + ldr r0, =gSprites\n\ + adds r4, r0\n\ + adds r0, r4, 0\n\ + mov r1, r9\n\ + bl StartSpriteAffineAnim\n\ + mov r0, sp\n\ + ldrh r0, [r0, 0x4]\n\ + strh r0, [r4, 0x2E]\n\ + strh r7, [r4, 0x34]\n\ + strh r6, [r4, 0x36]\n\ + mov r1, r9\n\ + strh r1, [r4, 0x38]\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + strh r0, [r4, 0x3A]\n\ + mov r1, r10\n\ + strh r1, [r4, 0x3C]\n\ + movs r0, 0x1\n\ + b _0810CB46\n\ + .pool\n\ +_0810CB44:\n\ + movs r0, 0\n\ +_0810CB46:\n\ + add sp, 0x8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n"); +} +#endif + +void AnimHailBegin(struct Sprite *sprite) +{ + u8 spriteId; + + sprite->pos1.x += 4; + sprite->pos1.y += 8; + + if (sprite->pos1.x < sprite->data[3] && sprite->pos1.y < sprite->data[4]) + return; + + if (sprite->data[0] == 1 && sprite->data[5] == 0) + { + spriteId = CreateSprite(&gUnknown_08595B68, + sprite->data[3], sprite->data[4], sprite->subpriority); + + sprite->data[0] = spriteId; + if (spriteId != 64) + { + gSprites[sprite->data[0]].callback = AnimHailContinue; + gSprites[sprite->data[0]].data[6] = sprite->data[6]; + gSprites[sprite->data[0]].data[7] = sprite->data[7]; + } + + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); + } + else + { + gTasks[sprite->data[6]].data[sprite->data[7]]--; + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); + } +} + +void AnimHailContinue(struct Sprite *sprite) +{ + if (++sprite->data[0] == 20) + { + gTasks[sprite->data[6]].data[sprite->data[7]]--; + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); + } +} + +// Initializes the animation for Ice Ball. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: target x offset +// arg 3: target y offset +// arg 4: duration +// arg 5: arc height (negative) +void InitIceBallAnim(struct Sprite *sprite) +{ + u8 animNum = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1; + + if (animNum > 4) + animNum = 4; + + StartSpriteAffineAnim(sprite, animNum); + InitSpritePosToAnimAttacker(sprite, 1); + + sprite->data[0] = gBattleAnimArgs[4]; + + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3]; + sprite->data[5] = gBattleAnimArgs[5]; + + InitAnimArcTranslation(sprite); + + sprite->callback = AnimThrowIceBall; +} + +// Throws the ball of ice in Ice Ball. +void AnimThrowIceBall(struct Sprite *sprite) +{ + if (!TranslateAnimArc(sprite)) + return; + + StartSpriteAnim(sprite, 1); + sprite->callback = RunStoredCallbackWhenAnimEnds; + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); +} + +// Initializes the particles that scatter at the end of the Ice Ball animation. +void InitIceBallParticle(struct Sprite *sprite) +{ + s16 randA, randB; + + sprite->oam.tileNum += 8; + InitSpritePosToAnimTarget(sprite, TRUE); + + randA = (Random2() & 0xFF) + 256; + randB = Random2() & 0x1FF; + + if (randB > 0xFF) + randB = 256 - randB; + + sprite->data[1] = randA; + sprite->data[2] = randB; + sprite->callback = AnimIceBallParticle; +} + +// Animates the particles created by InitIceBallParticle. +void AnimIceBallParticle(struct Sprite *sprite) +{ + sprite->data[3] += sprite->data[1]; + sprite->data[4] += sprite->data[2]; + + if (sprite->data[1] & 1) + sprite->pos2.x = -(sprite->data[3] >> 8); + else + sprite->pos2.x = sprite->data[3] >> 8; + + sprite->pos2.y = sprite->data[4] >> 8; + + if (++sprite->data[0] == 21) + DestroyAnimSprite(sprite); +} + +// Counter for Ice Ball. +void AnimTask_GetRolloutCounter(u8 taskId) +{ + u8 arg = gBattleAnimArgs[0]; + + gBattleAnimArgs[arg] = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1; + DestroyAnimVisualTask(taskId); +} diff --git a/src/intro.c b/src/intro.c index 94692e6ec..18a899fb0 100644 --- a/src/intro.c +++ b/src/intro.c @@ -1044,10 +1044,10 @@ static void Task_IntroLoadPart1Graphics(u8 taskId) SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(20) | BGCNT_16COLOR | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(18) | BGCNT_16COLOR | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(16) | BGCNT_16COLOR | BGCNT_TXT256x512); - LoadCompressedObjectPic(gUnknown_085E4FDC); - LoadCompressedObjectPic(gUnknown_085E4FEC); + LoadCompressedSpriteSheet(gUnknown_085E4FDC); + LoadCompressedSpriteSheet(gUnknown_085E4FEC); LoadSpritePalettes(gUnknown_085E4FFC); - LoadCompressedObjectPic(gUnknown_085E4A74); + LoadCompressedSpriteSheet(gUnknown_085E4A74); LoadSpritePalettes(gUnknown_085E4A84); CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1F0, 0x20); CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1E1, 0x1E); @@ -1204,16 +1204,16 @@ static void Task_IntroStartBikeRide(u8 taskId) u8 spriteId; if (gUnknown_0203BCC8 == 0) - LoadCompressedObjectPic(gIntro2BrendanSpriteSheet); + LoadCompressedSpriteSheet(gIntro2BrendanSpriteSheet); else - LoadCompressedObjectPic(gIntro2MaySpriteSheet); + LoadCompressedSpriteSheet(gIntro2MaySpriteSheet); - LoadCompressedObjectPic(gIntro2BicycleSpriteSheet); - LoadCompressedObjectPic(gIntro2FlygonSpriteSheet); + LoadCompressedSpriteSheet(gIntro2BicycleSpriteSheet); + LoadCompressedSpriteSheet(gIntro2FlygonSpriteSheet); for (spriteId = 0; spriteId < 3; spriteId++) { - LoadCompressedObjectPic(&gUnknown_085E4AE8[spriteId]); + LoadCompressedSpriteSheet(&gUnknown_085E4AE8[spriteId]); } LoadSpritePalettes(gUnknown_085F530C); @@ -1542,8 +1542,8 @@ static void Task_IntroLoadPart1Graphics3(u8 taskId) LZDecompressVram(gIntro3GroudonTilemap, (void *)(VRAM + 0xC000)); LZDecompressVram(gIntro3LegendBgGfx, (void *)(VRAM + 0x4000)); LZDecompressVram(gIntro3GroudonBgTilemap, (void *)(VRAM + 0xE000)); - LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]); - LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]); + LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]); + LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]); CpuCopy16(gIntro3BgPal, gPlttBufferUnfaded, sizeof(gIntro3BgPal)); gTasks[taskId].func = Task_IntroLoadPart1Graphics4; } @@ -1764,7 +1764,7 @@ static void Task_IntroLoadPart1Graphics9(u8 taskId) LZDecompressVram(gIntro3KyogreGfx, (void *)VRAM); LZDecompressVram(gIntro3KyogreTilemap, (void *)(VRAM + 0xC000)); LZDecompressVram(gIntro3KyogreBgTilemap, (void *)(VRAM + 0xE000)); - LoadCompressedObjectPic(gUnknown_085E4C88); + LoadCompressedSpriteSheet(gUnknown_085E4C88); LoadSpritePalette(gUnknown_085E4C98); BeginNormalPaletteFade(0xFFFFFFFE, 0, 0x10, 0, RGB_WHITEALPHA); gTasks[taskId].func = Task_IntroFadeIn0; @@ -2092,7 +2092,7 @@ static void Task_IntroFadeIn5(u8 taskId) gTasks[taskId].data[0] = 0; gTasks[taskId].data[6] = 1; gTasks[taskId].data[7] = 0; - LoadCompressedObjectPicUsingHeap(gUnknown_085E4BF4); + LoadCompressedSpriteSheetUsingHeap(gUnknown_085E4BF4); LoadSpritePalettes(gUnknown_085E4C04); } @@ -2169,7 +2169,7 @@ static void Task_IntroFadeIn7(u8 taskId) { u8 newTaskId; - LoadCompressedObjectPic(gUnknown_085E5048); + LoadCompressedSpriteSheet(gUnknown_085E5048); LoadSpritePalettes(gUnknown_085E5058); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP diff --git a/src/intro_credits_graphics.c b/src/intro_credits_graphics.c index 20a360901..d85e58938 100644 --- a/src/intro_credits_graphics.c +++ b/src/intro_credits_graphics.c @@ -341,7 +341,7 @@ void load_intro_part2_graphics(u8 a) LZ77UnCompVram(gUnknown_085F0DBC, (void *)(VRAM)); LZ77UnCompVram(gUnknown_085F1398, (void *)(VRAM + 0x3000)); LoadPalette(&gUnknown_085F0CFC, 0, 96); - LoadCompressedObjectPic(gUnknown_085F5064); + LoadCompressedSpriteSheet(gUnknown_085F5064); LoadPalette(&gUnknown_085F1668, 256, 32); sub_817B76C(); break; @@ -349,7 +349,7 @@ void load_intro_part2_graphics(u8 a) LZ77UnCompVram(gUnknown_085F1824, (void *)(VRAM)); LZ77UnCompVram(gUnknown_085F1EAC, (void *)(VRAM + 0x3000)); LoadPalette(&gUnknown_085F17E4, 0, 32); - LoadCompressedObjectPic(gUnknown_085F50EC); + LoadCompressedSpriteSheet(gUnknown_085F50EC); LoadPalette(&gUnknown_085F21B0, 256, 32); sub_817B788(); break; @@ -447,7 +447,7 @@ void sub_817B1C8(u8 a) LZ77UnCompVram(gUnknown_085F0DBC, (void *)(VRAM)); LZ77UnCompVram(gUnknown_085F1398, (void *)(VRAM + 0x3000)); LoadPalette(&gUnknown_085F0CFC, 0, 96); - LoadCompressedObjectPic(gUnknown_085F5064); + LoadCompressedSpriteSheet(gUnknown_085F5064); LZ77UnCompVram(gUnknown_085F16A8, (void *)(VRAM + 0x10000)); LoadPalette(&gUnknown_085F1668, 256, 32); sub_817B76C(); @@ -457,7 +457,7 @@ void sub_817B1C8(u8 a) LZ77UnCompVram(gUnknown_085F0DBC, (void *)(VRAM)); LZ77UnCompVram(gUnknown_085F1398, (void *)(VRAM + 0x3000)); LoadPalette(&gUnknown_085F0D5C, 0, 96); - LoadCompressedObjectPic(gUnknown_085F5064); + LoadCompressedSpriteSheet(gUnknown_085F5064); LZ77UnCompVram(gUnknown_085F16A8, (void *)(VRAM + 0x10000)); LoadPalette(&gUnknown_085F1688, 256, 32); sub_817B76C(); @@ -468,7 +468,7 @@ void sub_817B1C8(u8 a) LZ77UnCompVram(gUnknown_085F1824, (void *)(VRAM)); LZ77UnCompVram(gUnknown_085F1EAC, (void *)(VRAM + 0x3000)); LoadPalette(&gUnknown_085F1804, 0, 32); - LoadCompressedObjectPic(gUnknown_085F50EC); + LoadCompressedSpriteSheet(gUnknown_085F50EC); LoadPalette(&gUnknown_085F1804, 256, 32); sub_817B788(); break; @@ -477,7 +477,7 @@ void sub_817B1C8(u8 a) LZ77UnCompVram(gUnknown_085F235C, (void *)(VRAM)); LZ77UnCompVram(gUnknown_085F2568, (void *)(VRAM + 0x3000)); LoadPalette(&gUnknown_085F231C, 0, 64); - LoadCompressedObjectPic(gUnknown_085F5180); + LoadCompressedSpriteSheet(gUnknown_085F5180); LoadPalette(&gUnknown_085F2548, 256, 32); sub_817B7A4(); break; diff --git a/src/item_icon.c b/src/item_icon.c index d037782bd..e9379dbba 100644 --- a/src/item_icon.c +++ b/src/item_icon.c @@ -107,7 +107,7 @@ u8 AddItemIconSprite(u16 tilesTag, u16 paletteTag, u16 itemId) spritePalette.data = GetItemIconPicOrPalette(itemId, 1); spritePalette.tag = paletteTag; - LoadCompressedObjectPalette(&spritePalette); + LoadCompressedSpritePalette(&spritePalette); spriteTemplate = Alloc(sizeof(*spriteTemplate)); CpuCopy16(&gItemIconSpriteTemplate, spriteTemplate, sizeof(*spriteTemplate)); @@ -144,7 +144,7 @@ u8 AddCustomItemIconSprite(struct SpriteTemplate *customSpriteTemplate, u16 tile spritePalette.data = GetItemIconPicOrPalette(itemId, 1); spritePalette.tag = paletteTag; - LoadCompressedObjectPalette(&spritePalette); + LoadCompressedSpritePalette(&spritePalette); spriteTemplate = Alloc(sizeof(*spriteTemplate)); CpuCopy16(customSpriteTemplate, spriteTemplate, sizeof(*spriteTemplate)); diff --git a/src/item_menu.c b/src/item_menu.c index 32c42ac31..a220f02ef 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -713,13 +713,13 @@ bool8 load_bag_menu_graphics(void) break; case 3: if (IsWallysBag() == TRUE || gSaveBlock2Ptr->playerGender == MALE) - LoadCompressedObjectPic(&gUnknown_0857FB34); + LoadCompressedSpriteSheet(&gUnknown_0857FB34); else - LoadCompressedObjectPic(&gUnknown_0857FB3C); + LoadCompressedSpriteSheet(&gUnknown_0857FB3C); gUnknown_0203CE54->unk834++; break; case 4: - LoadCompressedObjectPalette(&gUnknown_0857FB44); + LoadCompressedSpritePalette(&gUnknown_0857FB44); gUnknown_0203CE54->unk834++; break; default: @@ -1564,7 +1564,7 @@ void Task_HandleOutOfBattleItemMenuInput(u8 taskId) { if (sub_81221EC() != TRUE) { - s8 cursorPos = GetMenuCursorPos(); + s8 cursorPos = Menu_GetCursorPos(); if (gMain.newKeys & DPAD_UP) { if (cursorPos > 0 && sub_81ACDFC(cursorPos - 2)) diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c index 894574ec9..669195b33 100644 --- a/src/item_menu_icons.c +++ b/src/item_menu_icons.c @@ -583,7 +583,7 @@ static void sub_80D5070(u8 berryId) pal.data = gBerryPicTable[berryId].pal; pal.tag = 0x7544; - LoadCompressedObjectPalette(&pal); + LoadCompressedSpritePalette(&pal); LZDecompressWram(gBerryPicTable[berryId].tiles, &gDecompressionBuffer[0x1000]); sub_80D5018(&gDecompressionBuffer[0x1000], &gDecompressionBuffer[0]); } diff --git a/src/item_use.c b/src/item_use.c index f82071a17..91fdc81c8 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -32,6 +32,7 @@ #include "task.h" #include "text.h" #include "constants/bg_event_constants.h" +#include "constants/event_objects.h" #include "constants/flags.h" #include "constants/items.h" #include "constants/songs.h" @@ -570,15 +571,15 @@ u8 sub_80FD9B0(s16 itemX, s16 itemY) void sub_80FDA24(u8 direction) { - EventObjectClearHeldMovementIfFinished(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - EventObjectClearHeldMovement(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - UnfreezeEventObject(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + EventObjectClearHeldMovementIfFinished(&gEventObjects[GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0)]); + EventObjectClearHeldMovement(&gEventObjects[GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0)]); + UnfreezeEventObject(&gEventObjects[GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0)]); PlayerTurnInPlace(direction); } void sub_80FDA94(u8 taskId) { - if (EventObjectCheckHeldMovementStatus(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE) + if (EventObjectCheckHeldMovementStatus(&gEventObjects[GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0)]) == TRUE) DisplayItemMessageOnField(taskId, gText_ItemFinderNearby, sub_80FD5CC); } @@ -586,7 +587,7 @@ void sub_80FDADC(u8 taskId) { s16 *data = gTasks[taskId].data; - if (EventObjectCheckHeldMovementStatus(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE + if (EventObjectCheckHeldMovementStatus(&gEventObjects[GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0)]) == TRUE || data[2] == FALSE) { sub_80FDA24(gUnknown_085920E4[data[5]]); @@ -627,7 +628,7 @@ void sub_80FDC00(u8 taskId) { if (!gPaletteFade.active) { - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); OpenPokeblockCase(0, CB2_ReturnToField); DestroyTask(taskId); } diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index 1012a8e08..3d4f8a90d 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -5,7 +5,9 @@ #include "global.h" #include "main.h" #include "overworld.h" -#include "rom6.h" +#include "fldeff.h" +#include "field_specials.h" +#include "pokeblock.h" #include "event_data.h" #include "script.h" #include "random.h" diff --git a/src/link.c b/src/link.c index 79df699ef..69373f773 100644 --- a/src/link.c +++ b/src/link.c @@ -1080,7 +1080,7 @@ bool8 sub_800A4D8(u8 a0) return FALSE; } -bool8 sub_800A520(void) +bool8 IsLinkTaskFinished(void) { if (gWirelessCommType == TRUE) { diff --git a/src/link_rfu.c b/src/link_rfu.c index 2c6e22475..0625e4af4 100644 --- a/src/link_rfu.c +++ b/src/link_rfu.c @@ -2244,7 +2244,7 @@ void sub_800E0E8(void) { if (GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag) == 0xFFFF) { - LoadCompressedObjectPic(&sWirelessStatusIndicatorSpriteSheet); + LoadCompressedSpriteSheet(&sWirelessStatusIndicatorSpriteSheet); } LoadSpritePalette(&sWirelessStatusIndicatorSpritePalette); gWirelessStatusIndicatorSpriteId = 0xFF; @@ -4123,7 +4123,7 @@ void sub_8010AAC(u8 taskId) gTasks[taskId].data[0]++; break; case 5: - if (sub_800A520() && GetBlockReceivedStatus() & 1) + if (IsLinkTaskFinished() && GetBlockReceivedStatus() & 1) { CpuFill16(0, gBlockRecvBuffer, sizeof(struct UnkRfuStruct_8010A14)); ResetBlockReceivedFlag(0); @@ -4162,7 +4162,7 @@ void sub_8010D0C(u8 taskId) } break; case 1: - if (sub_800A520()) + if (IsLinkTaskFinished()) gTasks[taskId].data[0]++; break; case 2: diff --git a/src/list_menu.c b/src/list_menu.c index caf4b798d..2476fae26 100644 --- a/src/list_menu.c +++ b/src/list_menu.c @@ -1074,7 +1074,7 @@ u8 AddScrollIndicatorArrowPair(const struct ScrollArrowsTemplate *arrowInfo, u16 spriteSheet.data = sRedArrowOtherGfx; spriteSheet.size = 0x100; spriteSheet.tag = arrowInfo->tileTag; - LoadCompressedObjectPic(&spriteSheet); + LoadCompressedSpriteSheet(&spriteSheet); if (arrowInfo->palTag == SPRITE_INVALID_TAG) { @@ -1320,7 +1320,7 @@ static u8 ListMenuAddRedOutlineCursorObject(struct CursorStruct *cursor) spriteSheet.data = sSelectorOutlineGfx; spriteSheet.size = 0x100; spriteSheet.tag = cursor->tileTag; - LoadCompressedObjectPic(&spriteSheet); + LoadCompressedSpriteSheet(&spriteSheet); if (cursor->palTag == SPRITE_INVALID_TAG) { @@ -1405,7 +1405,7 @@ static u8 ListMenuAddRedArrowCursorObject(struct CursorStruct *cursor) spriteSheet.data = sRedArrowGfx; spriteSheet.size = 0x80; spriteSheet.tag = cursor->tileTag; - LoadCompressedObjectPic(&spriteSheet); + LoadCompressedSpriteSheet(&spriteSheet); if (cursor->palTag == SPRITE_INVALID_TAG) { diff --git a/src/load_save.c b/src/load_save.c index 8ecf89959..a7593d007 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -1,12 +1,14 @@ #include "global.h" -#include "gba/flash_internal.h" +#include "alloc.h" +#include "item.h" #include "load_save.h" #include "main.h" +#include "overworld.h" #include "pokemon.h" +#include "pokemon_storage_system.h" #include "random.h" -#include "alloc.h" -#include "item.h" -#include "overworld.h" +#include "save_location.h" +#include "gba/flash_internal.h" #include "decoration_inventory.h" static void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey); @@ -135,30 +137,30 @@ void MoveSaveBlocks_ResetHeap(void) gSaveBlock2Ptr->encryptionKey = encryptionKey; } -u32 GetSecretBase2Field_9(void) +u32 UseContinueGameWarp(void) { - return gSaveBlock2Ptr->specialSaveWarp & 1; + return gSaveBlock2Ptr->specialSaveWarpFlags & CONTINUE_GAME_WARP; } -void ClearSecretBase2Field_9(void) +void ClearContinueGameWarpStatus(void) { - gSaveBlock2Ptr->specialSaveWarp &= ~1; + gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP; } -void SetSecretBase2Field_9(void) +void SetContinueGameWarpStatus(void) { - gSaveBlock2Ptr->specialSaveWarp |= 1; + gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP; } -void sub_8076D5C(void) +void SetContinueGameWarpStatusToDynamicWarp(void) { - sub_8084FAC(0); - gSaveBlock2Ptr->specialSaveWarp |= 1; + SetContinueGameWarpToDynamicWarp(0); + gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP; } -void sav2_gender2_inplace_and_xFE(void) +void ClearContinueGameWarpStatus2(void) { - gSaveBlock2Ptr->specialSaveWarp &= ~1; + gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP; } void SavePlayerParty(void) diff --git a/src/mail.c b/src/mail.c index 7b096ed00..45e96e85e 100644 --- a/src/mail.c +++ b/src/mail.c @@ -170,29 +170,29 @@ static const u16 sUnknown_0859F2B0[][2] = { static const struct MailGraphics sUnknown_0859F2B8[] = { { - gMailPalette_Orange, gMailTiles_Orange, gMailTilemap_Orange, 0x02c0, 0x0000, 0x294a, 0x6739 + gMailPalette_Orange, gMailTiles_Orange, gMailTilemap_Orange, 0x02c0, 0, 0x294a, 0x6739 }, { - gMailPalette_Harbor, gMailTiles_Harbor, gMailTilemap_Harbor, 0x02e0, 0x0000, 0x7fff, 0x4631 + gMailPalette_Harbor, gMailTiles_Harbor, gMailTilemap_Harbor, 0x02e0, 0, 0x7fff, 0x4631 }, { - gMailPalette_Glitter, gMailTiles_Glitter, gMailTilemap_Glitter, 0x0400, 0x0000, 0x294a, 0x6739 + gMailPalette_Glitter, gMailTiles_Glitter, gMailTilemap_Glitter, 0x0400, 0, 0x294a, 0x6739 }, { - gMailPalette_Mech, gMailTiles_Mech, gMailTilemap_Mech, 0x01e0, 0x0000, 0x7fff, 0x4631 + gMailPalette_Mech, gMailTiles_Mech, gMailTilemap_Mech, 0x01e0, 0, 0x7fff, 0x4631 }, { - gMailPalette_Wood, gMailTiles_Wood, gMailTilemap_Wood, 0x02e0, 0x0000, 0x7fff, 0x4631 + gMailPalette_Wood, gMailTiles_Wood, gMailTilemap_Wood, 0x02e0, 0, 0x7fff, 0x4631 }, { - gMailPalette_Wave, gMailTiles_Wave, gMailTilemap_Wave, 0x0300, 0x0000, 0x294a, 0x6739 + gMailPalette_Wave, gMailTiles_Wave, gMailTilemap_Wave, 0x0300, 0, 0x294a, 0x6739 }, { - gMailPalette_Bead, gMailTiles_Bead, gMailTilemap_Bead, 0x0140, 0x0000, 0x7fff, 0x4631 + gMailPalette_Bead, gMailTiles_Bead, gMailTilemap_Bead, 0x0140, 0, 0x7fff, 0x4631 }, { - gMailPalette_Shadow, gMailTiles_Shadow, gMailTilemap_Shadow, 0x0300, 0x0000, 0x7fff, 0x4631 + gMailPalette_Shadow, gMailTiles_Shadow, gMailTilemap_Shadow, 0x0300, 0, 0x7fff, 0x4631 }, { - gMailPalette_Tropic, gMailTiles_Tropic, gMailTilemap_Tropic, 0x0220, 0x0000, 0x294a, 0x6739 + gMailPalette_Tropic, gMailTiles_Tropic, gMailTilemap_Tropic, 0x0220, 0, 0x294a, 0x6739 }, { - gMailPalette_Dream, gMailTiles_Dream, gMailTilemap_Dream, 0x0340, 0x0000, 0x294a, 0x6739 + gMailPalette_Dream, gMailTiles_Dream, gMailTilemap_Dream, 0x0340, 0, 0x294a, 0x6739 }, { - gMailPalette_Fab, gMailTiles_Fab, gMailTilemap_Fab, 0x02a0, 0x0000, 0x294a, 0x6739 + gMailPalette_Fab, gMailTiles_Fab, gMailTilemap_Fab, 0x02a0, 0, 0x294a, 0x6739 }, { - gMailPalette_Retro, gMailTiles_Retro, gMailTilemap_Retro, 0x0520, 0x0000, 0x294a, 0x6739 + gMailPalette_Retro, gMailTiles_Retro, gMailTilemap_Retro, 0x0520, 0, 0x294a, 0x6739 } }; @@ -306,7 +306,7 @@ static bool8 MailReadBuildGraphics(void) case 0: SetVBlankCallback(NULL); ScanlineEffect_Stop(); - SetGpuReg(REG_OFFSET_DISPCNT, 0x0000); + SetGpuReg(REG_OFFSET_DISPCNT, 0); break; case 1: CpuFill16(0, (void *)OAM, OAM_SIZE); @@ -323,16 +323,16 @@ static bool8 MailReadBuildGraphics(void) case 5: FreeAllSpritePalettes(); reset_temp_tile_data_buffers(); - SetGpuReg(REG_OFFSET_BG0HOFS, 0x0000); - SetGpuReg(REG_OFFSET_BG0VOFS, 0x0000); - SetGpuReg(REG_OFFSET_BG1HOFS, 0x0000); - SetGpuReg(REG_OFFSET_BG1VOFS, 0x0000); - SetGpuReg(REG_OFFSET_BG2VOFS, 0x0000); - SetGpuReg(REG_OFFSET_BG2HOFS, 0x0000); - SetGpuReg(REG_OFFSET_BG3HOFS, 0x0000); - SetGpuReg(REG_OFFSET_BG3VOFS, 0x0000); - SetGpuReg(REG_OFFSET_BLDCNT, 0x0000); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x0000); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); break; case 6: ResetBgsAndClearDma3BusyFlags(0); diff --git a/src/main_menu.c b/src/main_menu.c index e11f783eb..4cd5c8e14 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -1394,7 +1394,7 @@ static void Task_NewGameBirchSpeech_ChooseGender(u8 taskId) gTasks[taskId].func = Task_NewGameBirchSpeech_WhatsYourName; break; } - gender2 = GetMenuCursorPos(); + gender2 = Menu_GetCursorPos(); if (gender2 != gTasks[taskId].tPlayerGender) { gTasks[taskId].tPlayerGender = gender2; diff --git a/src/menu.c b/src/menu.c index 61096138a..f1b35b42e 100644 --- a/src/menu.c +++ b/src/menu.c @@ -48,8 +48,8 @@ struct Menu bool8 APressMuted; }; -static EWRAM_DATA u8 gStartMenuWindowId = 0; -static EWRAM_DATA u8 gUnknown_0203CD8D = 0; +static EWRAM_DATA u8 sStartMenuWindowId = 0; +static EWRAM_DATA u8 sMapNamePopupWindowId = 0; static EWRAM_DATA struct Menu gUnknown_0203CD90 = {0}; static EWRAM_DATA u16 gUnknown_0203CD9C = 0; static EWRAM_DATA u8 gUnknown_0203CD9E = 0; @@ -63,7 +63,7 @@ static EWRAM_DATA void *gUnknown_0203CDAC[0x20] = {NULL}; const u16 gUnknown_0860F074[] = INCBIN_U16("graphics/interface/860F074.gbapal"); static const u8 gUnknown_0860F094[] = { 8, 4, 1 }; -static const struct WindowTemplate gUnknown_0860F098[] = +static const struct WindowTemplate sStandardTextBox_WindowTemplates[] = { { .bg = 0, @@ -77,7 +77,7 @@ static const struct WindowTemplate gUnknown_0860F098[] = DUMMY_WIN_TEMPLATE }; -static const struct WindowTemplate gUnknown_0860F0A8 = +static const struct WindowTemplate sYesNo_WindowTemplates = { .bg = 0, .tilemapLeft = 21, @@ -132,19 +132,19 @@ extern void sub_8197BB4(u8, u8, u8, u8, u8, u8); extern void sub_8197E30(u8, u8, u8, u8, u8, u8); extern void DrawWindowBorder(u8, u8, u8, u8, u8, u8); extern void sub_81980A8(u8, u8, u8, u8, u8, u8); -extern u8 MoveMenuCursor(s8); +extern u8 Menu_MoveCursor(s8); extern u8 sub_8199134(s8, s8); extern void sub_8198C78(void); extern void task_free_buf_after_copying_tile_data_to_vram(u8 taskId); -void sub_81971D0(void) +void InitStandardTextBoxWindows(void) { - InitWindows(gUnknown_0860F098); - gStartMenuWindowId = 0xFF; - gUnknown_0203CD8D = 0xFF; + InitWindows(sStandardTextBox_WindowTemplates); + sStartMenuWindowId = 0xFF; + sMapNamePopupWindowId = 0xFF; } -void sub_81971F4(void) +void FreeAllOverworldWindowBuffers(void) { FreeAllWindowBuffers(); } @@ -460,12 +460,12 @@ void DisplayItemMessageOnField(u8 taskId, const u8 *string, TaskFunc callback) void DisplayYesNoMenu(void) { - CreateYesNoMenu(&gUnknown_0860F0A8, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 0); + CreateYesNoMenu(&sYesNo_WindowTemplates, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 0); } void sub_8197948(u8 initialCursorPos) { - CreateYesNoMenu(&gUnknown_0860F0A8, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, initialCursorPos); + CreateYesNoMenu(&sYesNo_WindowTemplates, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, initialCursorPos); } u32 GetPlayerTextSpeed(void) @@ -486,22 +486,22 @@ u8 GetPlayerTextSpeedDelay(void) u8 sub_81979C4(u8 a1) { - if (gStartMenuWindowId == 0xFF) - gStartMenuWindowId = sub_8198AA4(0, 0x16, 1, 7, (a1 * 2) + 2, 0xF, 0x139); - return gStartMenuWindowId; + if (sStartMenuWindowId == 0xFF) + sStartMenuWindowId = sub_8198AA4(0, 0x16, 1, 7, (a1 * 2) + 2, 0xF, 0x139); + return sStartMenuWindowId; } u8 GetStartMenuWindowId(void) { - return gStartMenuWindowId; + return sStartMenuWindowId; } void RemoveStartMenuWindow(void) { - if (gStartMenuWindowId != 0xFF) + if (sStartMenuWindowId != 0xFF) { - RemoveWindow(gStartMenuWindowId); - gStartMenuWindowId = 0xFF; + RemoveWindow(sStartMenuWindowId); + sStartMenuWindowId = 0xFF; } } @@ -517,22 +517,22 @@ u16 sub_8197A38(void) u8 AddMapNamePopUpWindow(void) { - if (gUnknown_0203CD8D == 0xFF) - gUnknown_0203CD8D = sub_8198AA4(0, 1, 1, 10, 3, 14, 0x107); - return gUnknown_0203CD8D; + if (sMapNamePopupWindowId == 0xFF) + sMapNamePopupWindowId = sub_8198AA4(0, 1, 1, 10, 3, 14, 0x107); + return sMapNamePopupWindowId; } u8 GetMapNamePopUpWindowId(void) { - return gUnknown_0203CD8D; + return sMapNamePopupWindowId; } void RemoveMapNamePopUpWindow(void) { - if (gUnknown_0203CD8D != 0xFF) + if (sMapNamePopupWindowId != 0xFF) { - RemoveWindow(gUnknown_0203CD8D); - gUnknown_0203CD8D = 0xFF; + RemoveWindow(sMapNamePopupWindowId); + sMapNamePopupWindowId = 0xFF; } } @@ -910,7 +910,7 @@ u8 sub_8198348(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numC else gUnknown_0203CD90.cursorPos = pos; - MoveMenuCursor(0); + Menu_MoveCursor(0); return gUnknown_0203CD90.cursorPos; } @@ -935,7 +935,7 @@ void RedrawMenuCursor(u8 oldPos, u8 newPos) AddTextPrinterParameterized(gUnknown_0203CD90.windowId, gUnknown_0203CD90.fontId, gText_SelectorArrow3, gUnknown_0203CD90.left, gUnknown_0203CD90.optionHeight * newPos + gUnknown_0203CD90.top, 0, 0); } -u8 MoveMenuCursor(s8 cursorDelta) +u8 Menu_MoveCursor(s8 cursorDelta) { u8 oldPos = gUnknown_0203CD90.cursorPos; int newPos = gUnknown_0203CD90.cursorPos + cursorDelta; @@ -951,7 +951,7 @@ u8 MoveMenuCursor(s8 cursorDelta) return gUnknown_0203CD90.cursorPos; } -u8 MoveMenuCursorNoWrapAround(s8 cursorDelta) +u8 Menu_MoveCursorNoWrapAround(s8 cursorDelta) { u8 oldPos = gUnknown_0203CD90.cursorPos; int newPos = gUnknown_0203CD90.cursorPos + cursorDelta; @@ -967,7 +967,7 @@ u8 MoveMenuCursorNoWrapAround(s8 cursorDelta) return gUnknown_0203CD90.cursorPos; } -u8 GetMenuCursorPos(void) +u8 Menu_GetCursorPos(void) { return gUnknown_0203CD90.cursorPos; } @@ -987,13 +987,13 @@ s8 Menu_ProcessInput(void) else if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); return MENU_NOTHING_CHOSEN; } else if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); return MENU_NOTHING_CHOSEN; } @@ -1016,13 +1016,13 @@ s8 Menu_ProcessInputNoWrap(void) } else if (gMain.newKeys & DPAD_UP) { - if (oldPos != MoveMenuCursorNoWrapAround(-1)) + if (oldPos != Menu_MoveCursorNoWrapAround(-1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } else if (gMain.newKeys & DPAD_DOWN) { - if (oldPos != MoveMenuCursorNoWrapAround(1)) + if (oldPos != Menu_MoveCursorNoWrapAround(1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } @@ -1045,13 +1045,13 @@ s8 ProcessMenuInput_other(void) else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); return MENU_NOTHING_CHOSEN; } else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); return MENU_NOTHING_CHOSEN; } @@ -1074,13 +1074,13 @@ s8 Menu_ProcessInputNoWrapAround_other(void) } else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) { - if (oldPos != MoveMenuCursorNoWrapAround(-1)) + if (oldPos != Menu_MoveCursorNoWrapAround(-1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) { - if (oldPos != MoveMenuCursorNoWrapAround(1)) + if (oldPos != Menu_MoveCursorNoWrapAround(1)) PlaySE(SE_SELECT); return MENU_NOTHING_CHOSEN; } @@ -1588,7 +1588,7 @@ u8 InitMenuInUpperLeftCorner(u8 windowId, u8 itemCount, u8 initialCursorPos, boo else gUnknown_0203CD90.cursorPos = pos; - return MoveMenuCursor(0); + return Menu_MoveCursor(0); } u8 InitMenuInUpperLeftCornerPlaySoundWhenAPressed(u8 windowId, u8 itemCount, u8 initialCursorPos) @@ -1797,9 +1797,9 @@ bool8 free_temp_tile_data_buffers_if_possible(void) } } -void *decompress_and_copy_tile_data_to_vram(u8 bgId, const void *src, int size, u16 offset, u8 mode) +void *decompress_and_copy_tile_data_to_vram(u8 bgId, const void *src, u32 size, u16 offset, u8 mode) { - int sizeOut; + u32 sizeOut; if (gUnknown_0203CDA8 < ARRAY_COUNT(gUnknown_0203CDAC)) { void *ptr = malloc_and_decompress(src, &sizeOut); @@ -1815,9 +1815,9 @@ void *decompress_and_copy_tile_data_to_vram(u8 bgId, const void *src, int size, return NULL; } -void DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, int size, u16 offset, u8 mode) +void DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, u32 size, u16 offset, u8 mode) { - int sizeOut; + u32 sizeOut; void *ptr = malloc_and_decompress(src, &sizeOut); if (!size) size = sizeOut; @@ -1838,7 +1838,7 @@ void task_free_buf_after_copying_tile_data_to_vram(u8 taskId) } } -void *malloc_and_decompress(const void *src, int *size) +void *malloc_and_decompress(const void *src, u32 *size) { void *ptr; u8 *sizeAsBytes = (u8 *)size; @@ -1934,8 +1934,8 @@ void sub_8199D98(void) void sub_8199DF0(u32 bg, u8 a1, int a2, int a3) { - int temp = (!GetBgAttribute(bg, 4)) ? 0x20 : 0x40; - void *addr = (void *)((GetBgAttribute(bg, 1) * 0x4000) + (GetBgAttribute(bg, 10) + a2) * temp); + int temp = (!GetBgAttribute(bg, BG_ATTR_PALETTEMODE)) ? 0x20 : 0x40; + void *addr = (void *)((GetBgAttribute(bg, BG_ATTR_CHARBASEINDEX) * 0x4000) + (GetBgAttribute(bg, BG_ATTR_BASETILE) + a2) * temp); RequestDma3Fill(a1 << 24 | a1 << 16 | a1 << 8 | a1, addr + VRAM, a3 * temp, 1); } diff --git a/src/menu_helpers.c b/src/menu_helpers.c index a3c0be36a..0adc6228e 100644 --- a/src/menu_helpers.c +++ b/src/menu_helpers.c @@ -394,8 +394,8 @@ void sub_8122298(u16 *arg0, u16 *arg1, u8 arg2, u8 arg3, u8 arg4) void LoadListMenuArrowsGfx(void) { - LoadCompressedObjectPic(&gUnknown_0859F514); - LoadCompressedObjectPalette(&gUnknown_0859F51C); + LoadCompressedSpriteSheet(&gUnknown_0859F514); + LoadCompressedSpritePalette(&gUnknown_0859F51C); } void sub_8122344(u8 *spriteIds, u8 count) diff --git a/src/mirage_tower.c b/src/mirage_tower.c new file mode 100644 index 000000000..a8dd5d9de --- /dev/null +++ b/src/mirage_tower.c @@ -0,0 +1,868 @@ +#include "global.h" +#include "alloc.h" +#include "bg.h" +#include "event_data.h" +#include "event_object_movement.h" +#include "field_camera.h" +#include "fieldmap.h" +#include "gpu_regs.h" +#include "menu.h" +#include "random.h" +#include "roulette_util.h" +#include "script.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "window.h" +#include "constants/flags.h" +#include "constants/maps.h" +#include "constants/rgb.h" +#include "constants/songs.h" + +struct MirageTowerPulseBlend { + u8 taskId; + struct PulseBlend pulseBlend; +}; + +struct MetatileCoords +{ + u8 x; + u8 y; + u16 metatileId; +}; + +struct BgRegOffsets +{ + u16 bgHOFS; + u16 bgVOFS; +}; + +struct Struct203CF10 +{ + u8 *buffer; + u8 currIndex; +}; + +struct DynamicSpriteFrameImage +{ + u8 *data; + u16 size; +}; + +struct Struct203CF0C +{ + u8 *frameImageTiles; + struct DynamicSpriteFrameImage *frameImage; + u8 spriteId; + u16 *unkC; + u16 unk10; +}; + +#define MIRAGE_TOWER_GFX_LENGTH (sizeof(sBlankTile_Gfx) + sizeof(sMirageTower_Gfx)) +#define ROOT_FOSSIL_GFX_LENGTH sizeof(sRootFossil_Gfx) +#define ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH 0x100 + +// extern data +extern const struct SpriteSheet gMirageTowerCeilingCrumbleSpriteSheets[]; +extern const s16 sCeilingCrumblePositions[][3]; + +// static functions +static void PlayerDescendMirageTower(u8 taskId); +static void DoScreenShake(u8 taskId); +static void IncrementCeilingCrumbleFinishedCount(void); +static void WaitCeilingCrumble(u8 taskId); +static void FinishCeilingCrumbleTask(u8 taskId); +static void CreateCeilingCrumbleSprites(void); +static void MoveCeilingCrumbleSprite(struct Sprite* sprite); +static void DoMirageTowerDisintegration(u8 taskId); +static void InitMirageTowerShake(u8 taskId); +static void DoFossilFallAndSink(u8 taskId); +static void sub_81BF248(struct Sprite *); +static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e); + +// rodata +static const u8 sBlankTile_Gfx[32] = {0}; +static const u8 sMirageTower_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower.4bpp"); +static const u16 sMirageTowerTilemap[] = INCBIN_U16("graphics/misc/mirage_tower.bin"); +static const u16 sRootFossil_Pal[] = INCBIN_U16("graphics/misc/fossil.gbapal"); +static const u8 sRootFossil_Gfx[] = INCBIN_U8("graphics/misc/fossil.4bpp"); +static const u8 sMirageTowerCrumbles_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower_crumbles.4bpp"); +static const u16 sMirageTowerCrumbles_Palette[] = INCBIN_U16("graphics/misc/mirage_tower_crumbles.gbapal"); + +const s16 sCeilingCrumblePositions[][3] = +{ + { 0, 10, 65}, + { 17, 3, 50}, + {-12, 0, 75}, + { 10, 15, 90}, + { 7, 8, 65}, + {-18, 5, 75}, + { 22, -10, 55}, + {-24, -4, 65}, +}; + +const struct SpriteSheet gMirageTowerCeilingCrumbleSpriteSheets[] = +{ + {sMirageTowerCrumbles_Gfx, 0x0080, 4000}, + {NULL} +}; + +static const struct MetatileCoords sInvisibleMirageTowerMetatiles[] = +{ + {18, 53, 0x251}, + {19, 53, 0x251}, + {20, 53, 0x251}, + {18, 54, 0x251}, + {19, 54, 0x251}, + {20, 54, 0x251}, + {18, 55, 0x251}, + {19, 55, 0x251}, + {20, 55, 0x251}, + {18, 56, 0x251}, + {19, 56, 0x251}, + {20, 56, 0x251}, + {18, 57, 0x259}, + {19, 57, 0x259}, + {20, 57, 0x259}, + {18, 58, 0x121}, + {19, 58, 0x121}, + {20, 58, 0x121}, +}; + +static const union AnimCmd gSpriteAnim_8617DEC[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const struct OamData gOamData_8617DF4 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 3, + .affineParam = 0, +}; + +static const union AnimCmd *const gSpriteAnimTable_8617DFC[] = +{ + gSpriteAnim_8617DEC, +}; + +static const struct SpriteTemplate gUnknown_08617E00 = +{ + 0xFFFF, 0xFFFF, &gOamData_8617DF4, gSpriteAnimTable_8617DFC, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +const struct PulseBlendSettings gMirageTowerPulseBlendSettings = { + .blendColor = RGB(27, 25, 16), + .paletteOffset = 0x61, + .numColors = 15, + .delay = 5, + .numFadeCycles = -1, + .maxBlendCoeff = 11, + .fadeType = 1, + .restorePaletteOnUnload = FALSE, + .unk7_7 = 1, +}; + +static const union AnimCmd sCeilingCrumble2AnimCmd[] = +{ + ANIMCMD_FRAME(0, 12), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd *const sCeilingCrumble2AnimCmds[] = +{ + sCeilingCrumble2AnimCmd, +}; + +static const struct OamData sCeilingCrumble2OamData = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteTemplate sCeilingCrumbleSpriteTemplate2 = { + .tileTag = 4000, + .paletteTag = 0xFFFF, + .oam = &sCeilingCrumble2OamData, + .anims = sCeilingCrumble2AnimCmds, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = MoveCeilingCrumbleSprite +}; + +static const union AnimCmd sCeilingCrumble1AnimCmd[] = +{ + ANIMCMD_FRAME(0, 12), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd *const sCeilingCrumble1AnimCmds[] = +{ + sCeilingCrumble1AnimCmd, +}; + +static const struct OamData sCeilingCrumble1OamData = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteTemplate sCeilingCrumbleSpriteTemplate1 = { + .tileTag = 4000, + .paletteTag = 0xFFFF, + .oam = &sCeilingCrumble1OamData, + .anims = sCeilingCrumble1AnimCmds, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = MoveCeilingCrumbleSprite +}; + +EWRAM_DATA static u8* sMirageTowerGfxBuffer = NULL; +EWRAM_DATA static u8* sMirageTowerTilemapBuffer = NULL; +EWRAM_DATA static struct Struct203CF0C *sUnknown_0203CF0C = NULL; +EWRAM_DATA static struct Struct203CF10 *sUnknown_0203CF10 = NULL; +EWRAM_DATA static struct BgRegOffsets *sBgShakeOffsets = NULL; +EWRAM_DATA struct MirageTowerPulseBlend *sMirageTowerPulseBlend = NULL; + +IWRAM_DATA static u16 gUnknown_030012A8[8]; + +bool8 IsMirageTowerVisible(void) +{ + if (!(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE111) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE111))) + return FALSE; + return FlagGet(FLAG_MIRAGE_TOWER_VISIBLE); +} + +static void UpdateMirageTowerPulseBlend(u8 taskId) +{ + UpdatePulseBlend(&sMirageTowerPulseBlend->pulseBlend); +} + +void ClearMirageTowerPulseBlend(void) +{ + sMirageTowerPulseBlend = NULL; +} + +void TryStartMirageTowerPulseBlendEffect(void) +{ + if (sMirageTowerPulseBlend) + { + sMirageTowerPulseBlend = NULL; + return; + } + + if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(ROUTE111) + || gSaveBlock1Ptr->location.mapNum != MAP_NUM(ROUTE111) + || !FlagGet(FLAG_MIRAGE_TOWER_VISIBLE)) + return; + + sMirageTowerPulseBlend = AllocZeroed(sizeof(*sMirageTowerPulseBlend)); + InitPulseBlend(&sMirageTowerPulseBlend->pulseBlend); + InitPulseBlendPaletteSettings(&sMirageTowerPulseBlend->pulseBlend, &gMirageTowerPulseBlendSettings); + MarkUsedPulseBlendPalettes(&sMirageTowerPulseBlend->pulseBlend, 0x1, TRUE); + sMirageTowerPulseBlend->taskId = CreateTask(UpdateMirageTowerPulseBlend, 0xFF); +} + +void ClearMirageTowerPulseBlendEffect(void) +{ + if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(ROUTE111) + || gSaveBlock1Ptr->location.mapNum != MAP_NUM(ROUTE111) + || !FlagGet(FLAG_MIRAGE_TOWER_VISIBLE) + || sMirageTowerPulseBlend == NULL) + return; + + if (FuncIsActiveTask(UpdateMirageTowerPulseBlend)) + DestroyTask(sMirageTowerPulseBlend->taskId); + + UnmarkUsedPulseBlendPalettes(&sMirageTowerPulseBlend->pulseBlend, 0x1, TRUE); + UnloadUsedPulseBlendPalettes(&sMirageTowerPulseBlend->pulseBlend, 0x1, TRUE); + FREE_AND_SET_NULL(sMirageTowerPulseBlend); +} + +void SetMirageTowerVisibility(void) +{ + u16 rand; + bool8 visible; + + if (VarGet(VAR_0x40CB)) + { + FlagClear(FLAG_MIRAGE_TOWER_VISIBLE); + return; + } + + rand = Random(); + visible = rand & 1; + if (FlagGet(FLAG_FORCE_MIRAGE_TOWER_VISIBLE) == TRUE) + visible = TRUE; + + if (visible) + { + FlagSet(FLAG_MIRAGE_TOWER_VISIBLE); + TryStartMirageTowerPulseBlendEffect(); + return; + } + + FlagClear(FLAG_MIRAGE_TOWER_VISIBLE); +} + +void StartPlayerDescendMirageTower(void) +{ + CreateTask(PlayerDescendMirageTower, 8); +} + +static void PlayerDescendMirageTower(u8 taskId) +{ + u8 eventObjectId; + struct EventObject *fakePlayerEventObject; + struct EventObject *playerEventObject; + + TryGetEventObjectIdByLocalIdAndMap(45, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &eventObjectId); + fakePlayerEventObject = &gEventObjects[eventObjectId]; + gSprites[fakePlayerEventObject->spriteId].pos2.y += 4; + playerEventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if ((gSprites[fakePlayerEventObject->spriteId].pos1.y + gSprites[fakePlayerEventObject->spriteId].pos2.y) >= + (gSprites[playerEventObject->spriteId].pos1.y + gSprites[playerEventObject->spriteId].pos2.y)) + { + DestroyTask(taskId); + EnableBothScriptContexts(); + } +} + +static void StartScreenShake(u8 yShakeOffset, u8 xShakeOffset, u8 numShakes, u8 shakeDelay) +{ + u8 taskId = CreateTask(DoScreenShake, 9); + gTasks[taskId].data[0] = xShakeOffset; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = numShakes; + gTasks[taskId].data[3] = shakeDelay; + gTasks[taskId].data[4] = yShakeOffset; + SetCameraPanningCallback(NULL); + PlaySE(SE_W070); +} + +static void DoScreenShake(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + data[1]++; + if (data[1] % data[3] == 0) + { + data[1] = 0; + data[2]--; + data[0] = -data[0]; + data[4] = -data[4]; + SetCameraPanning(data[0], data[4]); + if (data[2] == 0) + { + IncrementCeilingCrumbleFinishedCount(); + DestroyTask(taskId); + InstallCameraPanAheadCallback(); + } + } +} + +static void IncrementCeilingCrumbleFinishedCount(void) +{ + u8 taskId = FindTaskIdByFunc(WaitCeilingCrumble); + if (taskId != 0xFF) + gTasks[taskId].data[0]++; +} + +void DoMirageTowerCeilingCrumble(void) +{ + LoadSpriteSheets(gMirageTowerCeilingCrumbleSpriteSheets); + CreateCeilingCrumbleSprites(); + CreateTask(WaitCeilingCrumble, 8); + StartScreenShake(2, 1, 16, 3); +} + +static void WaitCeilingCrumble(u8 taskId) +{ + u16 *data = gTasks[taskId].data; + data[1]++; + // Either wait 1000 frames, or until all 16 crumble sprites and the one screen-shake task are completed. + if (data[1] == 1000 || data[0] == 17) + gTasks[taskId].func = FinishCeilingCrumbleTask; +} + +static void FinishCeilingCrumbleTask(u8 taskId) +{ + FreeSpriteTilesByTag(4000); + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +static void CreateCeilingCrumbleSprites(void) +{ + u8 i; + u8 spriteId; + + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&sCeilingCrumbleSpriteTemplate1, sCeilingCrumblePositions[i][0] + 120, sCeilingCrumblePositions[i][1], 8); + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].oam.paletteNum = 0; + gSprites[spriteId].data[0] = i; + } + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&sCeilingCrumbleSpriteTemplate2, sCeilingCrumblePositions[i][0] + 115, sCeilingCrumblePositions[i][1] - 3, 8); + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].oam.paletteNum = 0; + gSprites[spriteId].data[0] = i; + } +} + +static void MoveCeilingCrumbleSprite(struct Sprite* sprite) +{ + sprite->data[1] += 2; + sprite->pos2.y = sprite->data[1] / 2; + if(((sprite->pos1.y) + (sprite->pos2.y)) > sCeilingCrumblePositions[sprite->data[0]][2]) + { + DestroySprite(sprite); + IncrementCeilingCrumbleFinishedCount(); + } +} + +static void SetInvisibleMirageTowerMetatiles(void) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sInvisibleMirageTowerMetatiles); i++) + MapGridSetMetatileIdAt(sInvisibleMirageTowerMetatiles[i].x + 7, sInvisibleMirageTowerMetatiles[i].y + 7, sInvisibleMirageTowerMetatiles[i].metatileId); + DrawWholeMapView(); +} + +void StartMirageTowerDisintegration(void) +{ + CreateTask(DoMirageTowerDisintegration, 9); +} + +void StartMirageTowerShake(void) +{ + CreateTask(InitMirageTowerShake, 9); +} + +void StartMirageTowerFossilFallAndSink(void) +{ + CreateTask(DoFossilFallAndSink, 9); +} + +static void SetBgShakeOffsets(void) +{ + SetGpuReg(REG_OFFSET_BG0HOFS, sBgShakeOffsets->bgHOFS); + SetGpuReg(REG_OFFSET_BG0VOFS, sBgShakeOffsets->bgVOFS); +} + +static void UpdateBgShake(u8 taskId) +{ + if (!gTasks[taskId].data[0]) + { + sBgShakeOffsets->bgHOFS = -sBgShakeOffsets->bgHOFS; + gTasks[taskId].data[0] = 2; + SetBgShakeOffsets(); + } + else + { + gTasks[taskId].data[0]--; + } +} + +static void InitMirageTowerShake(u8 taskId) +{ + u8 zero; + + switch (gTasks[taskId].data[0]) + { + case 0: + FreeAllWindowBuffers(); + SetBgAttribute(0, BG_ATTR_PRIORITY, 2); + gTasks[taskId].data[0]++; + break; + case 1: + sMirageTowerGfxBuffer = (u8 *)AllocZeroed(MIRAGE_TOWER_GFX_LENGTH); + sMirageTowerTilemapBuffer = (u8 *)AllocZeroed(BG_SCREEN_SIZE); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + gTasks[taskId].data[0]++; + break; + case 2: + CpuSet(sBlankTile_Gfx, sMirageTowerGfxBuffer, MIRAGE_TOWER_GFX_LENGTH / 2); + LoadBgTiles(0, sMirageTowerGfxBuffer, MIRAGE_TOWER_GFX_LENGTH, 0); + gTasks[taskId].data[0]++; + break; + case 3: + SetBgTilemapBuffer(0, sMirageTowerTilemapBuffer); + CopyToBgTilemapBufferRect_ChangePalette(0, &sMirageTowerTilemap, 12, 29, 6, 12, 17); + CopyBgTilemapBufferToVram(0); + gTasks[taskId].data[0]++; + break; + case 4: + ShowBg(0); + gTasks[taskId].data[0]++; + break; + case 5: + SetInvisibleMirageTowerMetatiles(); + gTasks[taskId].data[0]++; + break; + case 6: + sBgShakeOffsets = Alloc(sizeof(*sBgShakeOffsets)); + zero = 0; + sBgShakeOffsets->bgHOFS = 2; + sBgShakeOffsets->bgVOFS = zero; + CreateTask(UpdateBgShake, 10); + DestroyTask(taskId); + EnableBothScriptContexts(); + break; + } +} + +#define OUTER_BUFFER_LENGTH 0x60 +#define INNER_BUFFER_LENGTH 0x30 +static void DoMirageTowerDisintegration(u8 taskId) +{ + u8 bgShakeTaskId, j; + u16 i; + u8 index; + + switch (gTasks[taskId].data[0]) + { + case 1: + sUnknown_0203CF10 = AllocZeroed(OUTER_BUFFER_LENGTH * sizeof(struct Struct203CF10)); + break; + case 3: + if (gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1)) + { + if (gTasks[taskId].data[1] > 1) + { + index = gTasks[taskId].data[3]; + sUnknown_0203CF10[index].buffer = Alloc(INNER_BUFFER_LENGTH); + for (i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++) + sUnknown_0203CF10[index].buffer[i] = i; + for (i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++) + { + u16 rand1, rand2, temp; + + rand1 = Random() % 0x30; + rand2 = Random() % 0x30; + SWAP(sUnknown_0203CF10[index].buffer[rand2], sUnknown_0203CF10[index].buffer[rand1], temp); + } + if (gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1)) + gTasks[taskId].data[3]++; + gTasks[taskId].data[1] = 0; + } + gTasks[taskId].data[1]++; + } + index = gTasks[taskId].data[3]; + for (i = (u8)(gTasks[taskId].data[2]); i < index; i++) + { + for (j = 0; j < 1; j++) + { + sub_81BF2B8(sMirageTowerGfxBuffer, + ((((OUTER_BUFFER_LENGTH - 1) - i) * INNER_BUFFER_LENGTH) + sUnknown_0203CF10[i].buffer[(sUnknown_0203CF10[i].currIndex)++]), + 0, INNER_BUFFER_LENGTH, 1); + } + if (sUnknown_0203CF10[i].currIndex > (INNER_BUFFER_LENGTH - 1)) + { + FREE_AND_SET_NULL(sUnknown_0203CF10[i].buffer); + gTasks[taskId].data[2]++; + if ((i % 2) == 1) + sBgShakeOffsets->bgVOFS--; + } + } + LoadBgTiles(0, sMirageTowerGfxBuffer, MIRAGE_TOWER_GFX_LENGTH, 0); + if (sUnknown_0203CF10[OUTER_BUFFER_LENGTH - 1].currIndex > (INNER_BUFFER_LENGTH - 1)) + break; + return; + case 4: + UnsetBgTilemapBuffer(0); + bgShakeTaskId = FindTaskIdByFunc(UpdateBgShake); + if (bgShakeTaskId != 0xFF) + DestroyTask(bgShakeTaskId); + sBgShakeOffsets->bgVOFS = sBgShakeOffsets->bgHOFS = 0; + SetBgShakeOffsets(); + break; + case 5: + FREE_AND_SET_NULL(sBgShakeOffsets); + FREE_AND_SET_NULL(sUnknown_0203CF10); + FREE_AND_SET_NULL(sMirageTowerGfxBuffer); + FREE_AND_SET_NULL(sMirageTowerTilemapBuffer); + break; + case 6: + SetGpuRegBits(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2)); + SetGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0)); + SetBgAttribute(0, BG_ATTR_PRIORITY, 0); + InitStandardTextBoxWindows(); + break; + case 7: + ShowBg(0); + break; + case 8: + DestroyTask(taskId); + EnableBothScriptContexts(); + break; + } + gTasks[taskId].data[0]++; +} + +static void DoFossilFallAndSink(u8 taskId) +{ + u16 i; + u8 *buffer; + + switch (gTasks[taskId].data[0]) + { + case 1: + sUnknown_0203CF0C = AllocZeroed(sizeof(*sUnknown_0203CF0C)); + sUnknown_0203CF0C->frameImageTiles = AllocZeroed(ROOT_FOSSIL_GFX_LENGTH); + sUnknown_0203CF0C->frameImage = AllocZeroed(sizeof(*sUnknown_0203CF0C->frameImage)); + sUnknown_0203CF0C->unkC = AllocZeroed(ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)); + sUnknown_0203CF0C->unk10 = 0; + break; + case 2: + buffer = sUnknown_0203CF0C->frameImageTiles; + for (i = 0; i < ROOT_FOSSIL_GFX_LENGTH; i++, buffer++) + *buffer = sRootFossil_Gfx[i]; + break; + case 3: + sUnknown_0203CF0C->frameImage->data = sUnknown_0203CF0C->frameImageTiles; + sUnknown_0203CF0C->frameImage->size = ROOT_FOSSIL_GFX_LENGTH; + break; + case 4: + { + struct SpriteTemplate fossilTemplate; + + fossilTemplate = gUnknown_08617E00; + fossilTemplate.images = (struct SpriteFrameImage *)(sUnknown_0203CF0C->frameImage); + sUnknown_0203CF0C->spriteId = CreateSprite(&fossilTemplate, 128, -16, 1); + gSprites[sUnknown_0203CF0C->spriteId].centerToCornerVecX = 0; + gSprites[sUnknown_0203CF0C->spriteId].data[0] = gSprites[sUnknown_0203CF0C->spriteId].pos1.x; + gSprites[sUnknown_0203CF0C->spriteId].data[1] = 1; + } + case 5: + for (i = 0; i < ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH; i++) + sUnknown_0203CF0C->unkC[i] = i; + break; + case 6: + for (i = 0; i < (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)); i++) + { + u16 rand1, rand2, temp; + + rand1 = Random() % 0x100; + rand2 = Random() % 0x100; + SWAP(sUnknown_0203CF0C->unkC[rand2], sUnknown_0203CF0C->unkC[rand1], temp); + } + gSprites[sUnknown_0203CF0C->spriteId].callback = sub_81BF248; + break; + case 7: + if (gSprites[sUnknown_0203CF0C->spriteId].callback != SpriteCallbackDummy) + return; + DestroySprite(&gSprites[sUnknown_0203CF0C->spriteId]); + FREE_AND_SET_NULL(sUnknown_0203CF0C->unkC);; + FREE_AND_SET_NULL(sUnknown_0203CF0C->frameImage); + FREE_AND_SET_NULL(sUnknown_0203CF0C->frameImageTiles); + FREE_AND_SET_NULL(sUnknown_0203CF0C); + break; + case 8: + EnableBothScriptContexts(); + break; + } + + gTasks[taskId].data[0]++; +} + +static void sub_81BF248(struct Sprite *sprite) +{ + if (sUnknown_0203CF0C->unk10 >= (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH)) + { + sprite->callback = SpriteCallbackDummy; + } + else if (sprite->pos1.y >= 96) + { + u8 i; + for (i = 0; i < 2; i++) + sub_81BF2B8(sUnknown_0203CF0C->frameImageTiles, sUnknown_0203CF0C->unkC[sUnknown_0203CF0C->unk10++], 0, 16, 0); + + StartSpriteAnim(sprite, 0); + } + else + { + sprite->pos1.y++; + } +} + +#ifdef NONMATCHING +static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e) +{ + u8 r5, r4, r0, r2; + u16 var; + + r4 = r5 = b / d; + gUnknown_030012A8[0] = r4; + + r0 = r2 = b % d; + gUnknown_030012A8[1] = r2; + + r4 &= 7; + r2 &= 7; + gUnknown_030012A8[2] = r4; + gUnknown_030012A8[3] = r2; + + r0 /= 8; + r5 /= 8; + gUnknown_030012A8[4] = r0; + gUnknown_030012A8[5] = r5; + + var = ((d / 8) * (r5 * 64)) + (r0 * 64); + gUnknown_030012A8[6] = var; + + var += (r4 * 8) + r2; + gUnknown_030012A8[7] = var; + + // This part is non-matching. 99% sure it IS functionally equivalent, though. + b = (b & 1) ^ 1; + c = (c << ((b) << 2)) | (15 << ((b ^ 1) << 2)); + + a[(var / 2) + (e * 32)] &= c; +} + +#else +NAKED +static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + str r0, [sp]\n\ + mov r10, r1\n\ + adds r6, r2, 0\n\ + mov r8, r3\n\ + ldr r0, [sp, 0x28]\n\ + mov r9, r0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + mov r10, r1\n\ + lsls r6, 24\n\ + lsrs r6, 24\n\ + mov r0, r8\n\ + lsls r0, 24\n\ + mov r8, r0\n\ + lsrs r7, r0, 24\n\ + mov r1, r9\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r9, r1\n\ + mov r0, r10\n\ + adds r1, r7, 0\n\ + bl __divsi3\n\ + adds r5, r0, 0\n\ + lsls r5, 24\n\ + lsrs r4, r5, 24\n\ + ldr r3, =gUnknown_030012A8\n\ + strh r4, [r3]\n\ + mov r0, r10\n\ + adds r1, r7, 0\n\ + str r3, [sp, 0x4]\n\ + bl __modsi3\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + ldr r3, [sp, 0x4]\n\ + strh r2, [r3, 0x2]\n\ + movs r1, 0x7\n\ + ands r4, r1\n\ + ands r2, r1\n\ + strh r4, [r3, 0x4]\n\ + strh r2, [r3, 0x6]\n\ + lsrs r0, 27\n\ + lsrs r5, 27\n\ + strh r0, [r3, 0x8]\n\ + strh r5, [r3, 0xA]\n\ + mov r1, r8\n\ + lsrs r1, 27\n\ + lsls r1, 6\n\ + mov r8, r1\n\ + mov r1, r8\n\ + muls r1, r5\n\ + lsls r0, 6\n\ + adds r1, r0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + strh r1, [r3, 0xC]\n\ + lsls r4, 3\n\ + adds r4, r2\n\ + adds r1, r4\n\ + lsls r4, r1, 16\n\ + lsrs r4, 17\n\ + strh r1, [r3, 0xE]\n\ + movs r1, 0x1\n\ + mov r0, r10\n\ + ands r1, r0\n\ + movs r2, 0x1\n\ + eors r1, r2\n\ + lsls r0, r1, 2\n\ + lsls r6, r0\n\ + eors r1, r2\n\ + lsls r1, 2\n\ + movs r0, 0xF\n\ + lsls r0, r1\n\ + orrs r6, r0\n\ + lsls r6, 24\n\ + lsrs r6, 24\n\ + mov r1, r9\n\ + lsls r1, 5\n\ + mov r9, r1\n\ + add r9, r4\n\ + ldr r1, [sp]\n\ + add r1, r9\n\ + ldrb r0, [r1]\n\ + ands r6, r0\n\ + strb r6, [r1]\n\ + add sp, 0x8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + "); +} +#endif // NONMATCHING diff --git a/src/mon_markings.c b/src/mon_markings.c index 30015dbef..48f0f5ecb 100644 --- a/src/mon_markings.c +++ b/src/mon_markings.c @@ -390,7 +390,6 @@ void sub_811FAF8(void) } } - bool8 sub_811FBA4(void) { u16 i; diff --git a/src/money.c b/src/money.c index a347f818d..faf830637 100644 --- a/src/money.c +++ b/src/money.c @@ -186,8 +186,8 @@ void HideMoneyBox(void) void AddMoneyLabelObject(u16 x, u16 y) { - LoadCompressedObjectPic(&sSpriteSheet_MoneyLabel); - LoadCompressedObjectPalette(&sSpritePalette_MoneyLabel); + LoadCompressedSpriteSheet(&sSpriteSheet_MoneyLabel); + LoadCompressedSpritePalette(&sSpritePalette_MoneyLabel); sMoneyLabelSpriteId = CreateSprite(&sSpriteTemplate_MoneyLabel, x, y, 0); } diff --git a/src/mossdeep_gym.c b/src/mossdeep_gym.c index 07920fe4c..d8adbe0c6 100644 --- a/src/mossdeep_gym.c +++ b/src/mossdeep_gym.c @@ -5,6 +5,7 @@ #include "mossdeep_gym.h" #include "script_movement.h" #include "constants/event_object_movement_constants.h" +#include "constants/event_objects.h" // Movement scripts. extern const u8 gUnknown_08612698[]; @@ -52,7 +53,7 @@ void FinishMossdeepGymTiles(void) if (gUnknown_0203CE50 != NULL) FREE_AND_SET_NULL(gUnknown_0203CE50); - id = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0); + id = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0); EventObjectClearHeldMovementIfFinished(&gEventObjects[id]); sub_80D338C(); } diff --git a/src/naming_screen.c b/src/naming_screen.c index e6d146b85..c310ceb9f 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -362,7 +362,7 @@ static void NamingScreen_InitBGs(void) ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); - sub_81971D0(); + InitStandardTextBoxWindows(); sub_8197200(); for (i = 0; i < 5; i++) diff --git a/src/new_game.c b/src/new_game.c index 4804b28f3..8ecd48bc7 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -27,6 +27,7 @@ #include "pokedex.h" #include "apprentice.h" #include "frontier_util.h" +#include "constants/maps.h" extern u16 gSaveFileStatus; extern u8 gUnknown_030060B0; @@ -135,7 +136,7 @@ static void ClearFrontierRecord(void) static void WarpToTruck(void) { - Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck + SetWarpDestination(MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK), -1, -1, -1); WarpIntoMap(); } @@ -168,7 +169,7 @@ void NewGameInitData(void) ClearFrontierRecord(); ClearSav1(); ClearMailData(); - gSaveBlock2Ptr->specialSaveWarp = 0; + gSaveBlock2Ptr->specialSaveWarpFlags = 0; gSaveBlock2Ptr->field_A8 = 0; InitPlayerTrainerId(); PlayTimeCounter_Reset(); diff --git a/src/overworld.c b/src/overworld.c index 6998c9d98..ef424cff8 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -31,6 +31,7 @@ #include "map_name_popup.h" #include "menu.h" #include "metatile_behavior.h" +#include "mirage_tower.h" #include "money.h" #include "new_game.h" #include "palette.h" @@ -56,8 +57,10 @@ #include "constants/abilities.h" #include "constants/map_types.h" #include "constants/maps.h" +#include "constants/region_map_sections.h" #include "constants/songs.h" #include "constants/species.h" +#include "constants/weather.h" // event scripts extern const u8 EventScript_WhiteOut[]; @@ -99,7 +102,6 @@ extern void ApplyNewEncryptionKeyToWord(u32 *word, u32 newKey); extern void mapheader_run_script_with_tag_x5(void); extern void ResetFieldTasksArgs(void); extern void sub_80A0A2C(void); -extern void not_trainer_hill_battle_pyramid(void); extern void apply_map_tileset2_palette(const struct MapLayout *); extern void copy_map_tileset2_to_vram_2(const struct MapLayout *); extern void RestartWildEncounterImmunitySteps(void); @@ -112,9 +114,7 @@ extern void sub_81AA1D8(void); extern void c2_change_map(void); extern void sub_81D5DF8(void); extern void sub_80EB218(void); -extern void sub_81BE72C(void); extern void sub_80AF3C8(void); -extern void sub_81971F4(void); extern void sub_808B578(void); extern void sub_80AF314(void); extern void sub_80AF214(void); @@ -125,17 +125,12 @@ extern void sub_80AF168(void); extern void sub_80AF3C8(void); extern void ExecuteTruckSequence(void); extern void sub_80A0A38(void); -extern void trainer_hill_map_load_related(void); -extern void sub_8087D74(void); -extern void battle_pyramid_map_load_related(u8); extern void WriteFlashScanlineEffectBuffer(u8); -extern void sub_80E9238(u8); extern void sub_81AA2F8(void); extern void sub_8195E10(void); extern void sub_80EDB44(void); extern void sub_81D64C0(void); -extern void sub_81BE6AC(void); -extern void sub_8098128(void); +extern void InitFieldMessageBox(void); extern void copy_map_tileset1_to_vram(const struct MapLayout *); extern void copy_map_tileset2_to_vram(const struct MapLayout *); extern void FieldUpdateBgTilemapScroll(void); @@ -146,11 +141,9 @@ extern bool8 warp0_in_pokecenter(void); extern void ResetAllPicSprites(void); extern void FieldEffectActiveListClear(void); extern void SetUpFieldTasks(void); -extern void sub_81BE6B8(void); extern void ShowStartMenu(void); extern void sub_80AEE84(void); extern void mapldr_default(void); -extern void sub_8088B3C(u16, u16); extern bool32 sub_800F0B8(void); extern bool32 sub_8009F3C(void); extern void sub_8010198(void); @@ -341,7 +334,7 @@ const struct UCoords32 gDirectionToVectors[] = }, }; -static const struct BgTemplate gUnknown_08339DAC[] = +static const struct BgTemplate sOverworldBgTemplates[] = { { .bg = 0, @@ -435,7 +428,7 @@ void DoWhiteOut(void) SetMoney(&gSaveBlock1Ptr->money, GetMoney(&gSaveBlock1Ptr->money) / 2); HealPlayerParty(); Overworld_ResetStateAfterWhiteOut(); - Overworld_SetWarpDestToLastHealLoc(); + SetWarpDestinationToLastHealLocation(); WarpIntoMap(); } @@ -617,7 +610,7 @@ void ApplyCurrentWarp(void) gFixedHoleWarp = sDummyWarpData; } -void set_warp2_warp3_to_neg_1(void) +static void ClearDiveAndHoleWarps(void) { gFixedDiveWarp = sDummyWarpData; gFixedHoleWarp = sDummyWarpData; @@ -698,68 +691,66 @@ void WarpIntoMap(void) SetPlayerCoordsFromWarp(); } -void Overworld_SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +void SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { SetWarpData(&sWarpDestination, mapGroup, mapNum, warpId, x, y); } -void warp1_set_2(s8 mapGroup, s8 mapNum, s8 warpId) +void SetWarpDestinationToMapWarp(s8 mapGroup, s8 mapNum, s8 warpId) { - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, -1, -1); + SetWarpDestination(mapGroup, mapNum, warpId, -1, -1); } -void saved_warp2_set(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId) +void SetDynamicWarp(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId) { - SetWarpData(&gSaveBlock1Ptr->warp2, mapGroup, mapNum, warpId, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y); + SetWarpData(&gSaveBlock1Ptr->dynamicWarp, mapGroup, mapNum, warpId, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y); } -void saved_warp2_set_2(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +void SetDynamicWarpWithCoords(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - SetWarpData(&gSaveBlock1Ptr->warp2, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gSaveBlock1Ptr->dynamicWarp, mapGroup, mapNum, warpId, x, y); } -void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused) +void SetWarpDestinationToDynamicWarp(u8 unusedWarpId) { - sWarpDestination = gSaveBlock1Ptr->warp2; + sWarpDestination = gSaveBlock1Ptr->dynamicWarp; } -void sub_8084CCC(u8 a1) +void SetWarpDestinationToHealLocation(u8 healLocationId) { - const struct HealLocation *warp = GetHealLocation(a1); - + const struct HealLocation *warp = GetHealLocation(healLocationId); if (warp) - Overworld_SetWarpDestination(warp->group, warp->map, -1, warp->x, warp->y); + SetWarpDestination(warp->group, warp->map, -1, warp->x, warp->y); } -void Overworld_SetWarpDestToLastHealLoc(void) +void SetWarpDestinationToLastHealLocation(void) { sWarpDestination = gSaveBlock1Ptr->lastHealLocation; } -void Overworld_SetHealLocationWarp(u8 healLocationId) +void SetLastHealLocationWarp(u8 healLocationId) { const struct HealLocation *healLocation = GetHealLocation(healLocationId); - - if (healLocation != NULL) + if (healLocation) SetWarpData(&gSaveBlock1Ptr->lastHealLocation, healLocation->group, healLocation->map, -1, healLocation->x, healLocation->y); } -void sub_8084D5C(s16 a1, s16 a2) +void UpdateEscapeWarp(s16 x, s16 y) { - u8 currMapType = Overworld_GetMapTypeOfSaveblockLocation(); + u8 currMapType = GetCurrentMapType(); u8 destMapType = GetMapTypeByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum); if (is_map_type_1_2_3_5_or_6(currMapType) && is_map_type_1_2_3_5_or_6(destMapType) != TRUE) - sub_8084DD4(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, a1 - 7, a2 - 6); + SetEscapeWarp(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x - 7, y - 6); } -void sub_8084DD4(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +void SetEscapeWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - SetWarpData(&gSaveBlock1Ptr->warp4, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gSaveBlock1Ptr->escapeWarp, mapGroup, mapNum, warpId, x, y); } -void sub_8084E14(void) +void SetWarpDestinationToEscapeWarp(void) { - sWarpDestination = gSaveBlock1Ptr->warp4; + sWarpDestination = gSaveBlock1Ptr->escapeWarp; } void SetFixedDiveWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) @@ -767,7 +758,7 @@ void SetFixedDiveWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) SetWarpData(&gFixedDiveWarp, mapGroup, mapNum, warpId, x, y); } -static void SetFixedDiveWarpAsDestination(void) +static void SetWarpDestinationToDiveWarp(void) { sWarpDestination = gFixedDiveWarp; } @@ -777,34 +768,34 @@ void SetFixedHoleWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) SetWarpData(&gFixedHoleWarp, mapGroup, mapNum, warpId, x, y); } -void SetFixedHoleWarpAsDestination(s16 x, s16 y) +void SetWarpDestinationToFixedHoleWarp(s16 x, s16 y) { if (IsDummyWarp(&gFixedHoleWarp) == TRUE) sWarpDestination = gLastUsedWarp; else - Overworld_SetWarpDestination(gFixedHoleWarp.mapGroup, gFixedHoleWarp.mapNum, -1, x, y); + SetWarpDestination(gFixedHoleWarp.mapGroup, gFixedHoleWarp.mapNum, -1, x, y); } -void warp1_set_to_sav1w(void) +static void SetWarpDestinationToContinueGameWarp(void) { - sWarpDestination = gSaveBlock1Ptr->warp1; + sWarpDestination = gSaveBlock1Ptr->continueGameWarp; } -void sub_8084F2C(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +void SetContinueGameWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - SetWarpData(&gSaveBlock1Ptr->warp1, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gSaveBlock1Ptr->continueGameWarp, mapGroup, mapNum, warpId, x, y); } -void sub_8084F6C(u8 a1) +void SetContinueGameWarpToHealLocation(u8 healLocationId) { - const struct HealLocation *warp = GetHealLocation(a1); + const struct HealLocation *warp = GetHealLocation(healLocationId); if (warp) - SetWarpData(&gSaveBlock1Ptr->warp1, warp->group, warp->map, -1, warp->x, warp->y); + SetWarpData(&gSaveBlock1Ptr->continueGameWarp, warp->group, warp->map, -1, warp->x, warp->y); } -void sub_8084FAC(int unused) +void SetContinueGameWarpToDynamicWarp(int unused) { - gSaveBlock1Ptr->warp1 = gSaveBlock1Ptr->warp2; + gSaveBlock1Ptr->continueGameWarp = gSaveBlock1Ptr->dynamicWarp; } const struct MapConnection *GetMapConnection(u8 dir) @@ -829,14 +820,14 @@ static bool8 SetDiveWarp(u8 dir, u16 x, u16 y) if (connection != NULL) { - Overworld_SetWarpDestination(connection->mapGroup, connection->mapNum, -1, x, y); + SetWarpDestination(connection->mapGroup, connection->mapNum, -1, x, y); } else { mapheader_run_script_with_tag_x6(); if (IsDummyWarp(&gFixedDiveWarp)) return FALSE; - SetFixedDiveWarpAsDestination(); + SetWarpDestinationToDiveWarp(); } return TRUE; } @@ -855,7 +846,7 @@ void mliX_load_map(u8 mapGroup, u8 mapNum) { s32 paletteIndex; - Overworld_SetWarpDestination(mapGroup, mapNum, -1, -1, -1); + SetWarpDestination(mapGroup, mapNum, -1, -1, -1); if (gMapHeader.regionMapSectionId != 0x3A) sub_8085810(); @@ -873,7 +864,7 @@ void mliX_load_map(u8 mapGroup, u8 mapNum) SetDefaultFlashLevel(); Overworld_ClearSavedMusic(); mapheader_run_script_with_tag_x3(); - not_trainer_hill_battle_pyramid(); + InitMap(); copy_map_tileset2_to_vram_2(gMapHeader.mapLayout); apply_map_tileset2_palette(gMapHeader.mapLayout); @@ -887,7 +878,7 @@ void mliX_load_map(u8 mapGroup, u8 mapNum) ResetFieldTasksArgs(); mapheader_run_script_with_tag_x5(); - if (gMapHeader.regionMapSectionId != 0x3A || gMapHeader.regionMapSectionId != sLastMapSectionId) + if (gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER || gMapHeader.regionMapSectionId != sLastMapSectionId) ShowMapNamePopup(); } @@ -928,15 +919,15 @@ static void mli0_load_map(u32 a1) UpdateLocationHistoryForRoamer(); RoamerMoveToOtherLocationSet(); if (gMapHeader.mapLayoutId == 0x169) - battle_pyramid_map_load_related(0); + InitBattlePyramidMap(0); else if (InTrainerHill()) - trainer_hill_map_load_related(); + InitTrainerHillMap(); else - not_trainer_hill_battle_pyramid(); + InitMap(); if (a1 != 1 && indoors) { - UpdateTVScreensOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height); + UpdateTVScreensOnMap(gBackupMapLayout.width, gBackupMapLayout.height); sub_80E9238(1); } } @@ -966,7 +957,7 @@ void StoreInitialPlayerAvatarState(void) static struct InitialPlayerAvatarState *GetInitialPlayerAvatarState(void) { struct InitialPlayerAvatarState playerStruct; - u8 mapType = Overworld_GetMapTypeOfSaveblockLocation(); + u8 mapType = GetCurrentMapType(); u16 metatileBehavior = GetCenterScreenMetatileBehavior(); u8 transitionFlags = GetAdjustedInitialTransitionFlags(&gInitialPlayerAvatarState, metatileBehavior, mapType); playerStruct.transitionFlags = transitionFlags; @@ -1053,7 +1044,7 @@ u8 Overworld_GetFlashLevel(void) return gSaveBlock1Ptr->flashLevel; } -void sub_8085524(u16 mapLayoutId) +void SetCurrentMapLayout(u16 mapLayoutId) { gSaveBlock1Ptr->mapLayoutId = mapLayoutId; gMapHeader.mapLayout = GetMapLayout(); @@ -1162,11 +1153,11 @@ u16 GetCurrLocationDefaultMusic(void) // Play the desert music only when the sandstorm is active on Route 111. if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE111) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE111) - && GetSav1Weather() == 8) + && GetSav1Weather() == WEATHER_SANDSTORM) return MUS_ASHROAD; music = GetLocationMusic(&gSaveBlock1Ptr->location); - if (music != 0x7FFF) + if (music != MUS_ROUTE_118) { return music; } @@ -1182,7 +1173,7 @@ u16 GetCurrLocationDefaultMusic(void) u16 GetWarpDestinationMusic(void) { u16 music = GetLocationMusic(&sWarpDestination); - if (music != 0x7FFF) + if (music != MUS_ROUTE_118) { return music; } @@ -1209,7 +1200,7 @@ void Overworld_PlaySpecialMapMusic(void) { if (gSaveBlock1Ptr->savedMusic) music = gSaveBlock1Ptr->savedMusic; - else if (Overworld_GetMapTypeOfSaveblockLocation() == MAP_TYPE_UNDERWATER) + else if (GetCurrentMapType() == MAP_TYPE_UNDERWATER) music = MUS_DEEPDEEP; else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) music = MUS_NAMINORI; @@ -1287,8 +1278,8 @@ void TryFadeOutOldMapMusic(void) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SOOTOPOLIS_CITY) && sWarpDestination.mapGroup == MAP_GROUP(SOOTOPOLIS_CITY) && sWarpDestination.mapNum == MAP_NUM(SOOTOPOLIS_CITY) - && sWarpDestination.x == 0x1D - && sWarpDestination.y == 0x35) + && sWarpDestination.x == 29 + && sWarpDestination.y == 53) return; FadeOutMapMusic(GetMapMusicFadeoutSpeed()); } @@ -1340,7 +1331,7 @@ void UpdateAmbientCry(s16 *state, u16 *delayCounter) monsCount = CalculatePlayerPartyCount(); for (i = 0; i < monsCount; i++) { - if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT3) + if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_EGG) && GetMonAbility(&gPlayerParty[0]) == ABILITY_SWARM) { divBy = 2; @@ -1390,7 +1381,7 @@ u8 GetMapTypeByWarpData(struct WarpData *warp) return GetMapTypeByGroupAndId(warp->mapGroup, warp->mapNum); } -u8 Overworld_GetMapTypeOfSaveblockLocation(void) +u8 GetCurrentMapType(void) { return GetMapTypeByWarpData(&gSaveBlock1Ptr->location); } @@ -1432,12 +1423,12 @@ bool8 Overworld_MapTypeIsIndoors(u8 mapType) return FALSE; } -u8 sav1_saved_warp2_map_get_name(void) +u8 GetSavedWarpRegionMapSectionId(void) { - return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->warp2.mapGroup, gSaveBlock1Ptr->warp2.mapNum)->regionMapSectionId; + return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->dynamicWarp.mapGroup, gSaveBlock1Ptr->dynamicWarp.mapNum)->regionMapSectionId; } -u8 sav1_map_get_name(void) +u8 GetCurrentRegionMapSectionId(void) { return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->regionMapSectionId; } @@ -1447,30 +1438,30 @@ u8 GetCurrentMapBattleScene(void) return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->battleType; } -static void overworld_bg_setup(void) +static void InitOverworldBgs(void) { - InitBgsFromTemplates(0, gUnknown_08339DAC, ARRAY_COUNT(gUnknown_08339DAC)); - SetBgAttribute(1, BG_CTRL_ATTR_PALETTEMODE, 1); - SetBgAttribute(2, BG_CTRL_ATTR_PALETTEMODE, 1); - SetBgAttribute(3, BG_CTRL_ATTR_PALETTEMODE, 1); - gBGTilemapBuffers2 = AllocZeroed(0x800); - gBGTilemapBuffers1 = AllocZeroed(0x800); - gBGTilemapBuffers3 = AllocZeroed(0x800); + InitBgsFromTemplates(0, sOverworldBgTemplates, ARRAY_COUNT(sOverworldBgTemplates)); + SetBgAttribute(1, BG_ATTR_MOSAIC, 1); + SetBgAttribute(2, BG_ATTR_MOSAIC, 1); + SetBgAttribute(3, BG_ATTR_MOSAIC, 1); + gBGTilemapBuffers2 = AllocZeroed(BG_SCREEN_SIZE); + gBGTilemapBuffers1 = AllocZeroed(BG_SCREEN_SIZE); + gBGTilemapBuffers3 = AllocZeroed(BG_SCREEN_SIZE); SetBgTilemapBuffer(1, gBGTilemapBuffers2); SetBgTilemapBuffer(2, gBGTilemapBuffers1); SetBgTilemapBuffer(3, gBGTilemapBuffers3); - sub_81971D0(); + InitStandardTextBoxWindows(); } -void overworld_free_bg_tilemaps(void) +void CleanupOverworldWindowsAndTilemaps(void) { - sub_81BE72C(); - sub_81971F4(); - if (gBGTilemapBuffers3 != NULL) + ClearMirageTowerPulseBlendEffect(); + FreeAllOverworldWindowBuffers(); + if (gBGTilemapBuffers3) FREE_AND_SET_NULL(gBGTilemapBuffers3); - if (gBGTilemapBuffers1 != NULL) + if (gBGTilemapBuffers1) FREE_AND_SET_NULL(gBGTilemapBuffers1); - if (gBGTilemapBuffers2 != NULL) + if (gBGTilemapBuffers2) FREE_AND_SET_NULL(gBGTilemapBuffers2); } @@ -1764,7 +1755,7 @@ void CB2_ContinueSavedGame(void) sub_81A3908(); LoadSaveblockMapHeader(); - set_warp2_warp3_to_neg_1(); + ClearDiveAndHoleWarps(); trainerHillMapId = GetCurrentTrainerHillMapId(); if (gMapHeader.mapLayoutId == 0x169) sub_81AA2F8(); @@ -1777,20 +1768,20 @@ void CB2_ContinueSavedGame(void) DoTimeBasedEvents(); sub_8084788(); if (gMapHeader.mapLayoutId == 0x169) - battle_pyramid_map_load_related(1); + InitBattlePyramidMap(1); else if (trainerHillMapId != 0) - trainer_hill_map_load_related(); + InitTrainerHillMap(); else - sub_8087D74(); + InitMapFromSavedGame(); PlayTimeCounter_Start(); ScriptContext1_Init(); ScriptContext2_Disable(); sub_8195E10(); - if (GetSecretBase2Field_9() == 1) + if (UseContinueGameWarp() == TRUE) { - ClearSecretBase2Field_9(); - warp1_set_to_sav1w(); + ClearContinueGameWarpStatus(); + SetWarpDestinationToContinueGameWarp(); WarpIntoMap(); sub_80EDB44(); SetMainCallback2(CB2_LoadMap); @@ -1863,7 +1854,7 @@ static bool32 map_loading_iteration_3(u8 *state) switch (*state) { case 0: - overworld_bg_setup(); + InitOverworldBgs(); ScriptContext1_Init(); ScriptContext2_Disable(); sub_80867C8(); @@ -2121,7 +2112,7 @@ static void do_load_map_stuff_loop(u8 *state) static void sub_80867C8(void) { - sub_81BE6AC(); + ClearMirageTowerPulseBlend(); MoveSaveBlocks_ResetHeap(); } @@ -2149,8 +2140,8 @@ static void InitOverworldGraphicsRegisters(void) clear_scheduled_bg_copies_to_vram(); reset_temp_tile_data_buffers(); SetGpuReg(REG_OFFSET_MOSAIC, 0); - SetGpuReg(REG_OFFSET_WININ, 0x1F1F); - SetGpuReg(REG_OFFSET_WINOUT, 0x101); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WINOBJ_BG0); SetGpuReg(REG_OFFSET_WIN0H, 0xFF); SetGpuReg(REG_OFFSET_WIN0V, 0xFF); SetGpuReg(REG_OFFSET_WIN1H, 0xFFFF); @@ -2158,7 +2149,7 @@ static void InitOverworldGraphicsRegisters(void) SetGpuReg(REG_OFFSET_BLDCNT, gUnknown_82EC7C4[1] | gUnknown_82EC7C4[2] | gUnknown_82EC7C4[3] | BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(13, 7)); - overworld_bg_setup(); + InitOverworldBgs(); schedule_bg_copy_tilemap_to_vram(1); schedule_bg_copy_tilemap_to_vram(2); schedule_bg_copy_tilemap_to_vram(3); @@ -2176,7 +2167,7 @@ static void InitOverworldGraphicsRegisters(void) ShowBg(1); ShowBg(2); ShowBg(3); - sub_8098128(); + InitFieldMessageBox(); } static void sub_8086988(u32 a1) @@ -2199,7 +2190,7 @@ static void sub_8086988(u32 a1) if (!a1) SetUpFieldTasks(); mapheader_run_script_with_tag_x5(); - sub_81BE6B8(); + TryStartMirageTowerPulseBlendEffect(); } static void sub_80869DC(void) @@ -2219,7 +2210,7 @@ static void mli4_mapscripts_and_other(void) gTotalCameraPixelOffsetX = 0; gTotalCameraPixelOffsetY = 0; ResetEventObjects(); - sav1_camera_get_focus_coords(&x, &y); + GetCameraFocusCoords(&x, &y); player = GetInitialPlayerAvatarState(); InitPlayerAvatar(x, y, player->direction, gSaveBlock2Ptr->playerGender); SetPlayerAvatarTransitionFlags(player->transitionFlags); @@ -2254,7 +2245,7 @@ static void sub_8086AC8(void) static void sub_8086AE4(void) { u16 x, y; - sav1_camera_get_focus_coords(&x, &y); + GetCameraFocusCoords(&x, &y); sub_8088B3C(x + gUnknown_03005DB4, y); } @@ -2263,7 +2254,7 @@ static void sub_8086B14(void) u16 i; u16 x, y; - sav1_camera_get_focus_coords(&x, &y); + GetCameraFocusCoords(&x, &y); x -= gUnknown_03005DB4; for (i = 0; i < gFieldLinkPlayerCount; i++) diff --git a/src/palette.c b/src/palette.c index 1e92f4bba..deb07b066 100644 --- a/src/palette.c +++ b/src/palette.c @@ -77,7 +77,7 @@ static const u8 sRoundedDownGrayscaleMap[] = { 31, 31 }; -void LoadCompressedPalette(const void *src, u16 offset, u16 size) +void LoadCompressedPalette(const u32 *src, u16 offset, u16 size) { LZDecompressWram(src, gPaletteDecompressionBuffer); CpuCopy16(gPaletteDecompressionBuffer, gPlttBufferUnfaded + offset, size); diff --git a/src/party_menu.c b/src/party_menu.c index f9977fb89..00432e6db 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -22,7 +22,8 @@ #include "field_specials.h" #include "field_weather.h" #include "fieldmap.h" -#include "fldeff_softboiled.h" +#include "fldeff.h" +#include "fldeff_misc.h" #include "frontier_util.h" #include "gpu_regs.h" #include "graphics.h" @@ -72,14 +73,16 @@ #include "constants/species.h" #include "constants/vars.h" -enum { +enum +{ CAN_LEARN_MOVE, CANNOT_LEARN_MOVE, ALREADY_KNOWS_MOVE, CANNOT_LEARN_MOVE_IS_EGG }; -struct Unk_Rodata1 { +struct Unk_Rodata1 +{ void (*unk0)(u8, u8, u8, u8, u8, u8); u8 unk4[24]; u8 unk1C; @@ -88,7 +91,8 @@ struct Unk_Rodata1 { u8 unk1F; }; -struct Struct203CEC4 { +struct Struct203CEC4 +{ TaskFunc unk0; MainCallback exitCallback; u32 unk8_0:1; @@ -104,9 +108,10 @@ struct Struct203CEC4 { s16 data[16]; }; -struct Struct203CEDC { - struct Unk_Rodata1 *unk0; - u8 *unk4; +struct Struct203CEDC +{ + const struct Unk_Rodata1 *unk0; + const u8 *unk4; u8 windowId; u8 unk9; u8 unkA; @@ -114,351 +119,1421 @@ struct Struct203CEDC { u8 unkC; }; -struct Struct8615C08 { - const u8 *textPtr; - TaskFunc func; -}; - -struct Struct8615D9C { - bool8 (*fieldMoveFunc)(void); - u8 msgID; -}; - -EWRAM_DATA struct Struct203CEC4 *gUnknown_0203CEC4 = NULL; +static EWRAM_DATA struct Struct203CEC4 *gUnknown_0203CEC4 = NULL; EWRAM_DATA struct Struct203CEC8 gUnknown_0203CEC8 = {0}; -EWRAM_DATA struct Struct203CEDC *gUnknown_0203CEDC = NULL; -EWRAM_DATA u8 *gUnknown_0203CEE0 = NULL; -EWRAM_DATA u8 *gUnknown_0203CEE4 = NULL; +static EWRAM_DATA struct Struct203CEDC *gUnknown_0203CEDC = NULL; +static EWRAM_DATA u8 *gUnknown_0203CEE0 = NULL; +static EWRAM_DATA u8 *gUnknown_0203CEE4 = NULL; EWRAM_DATA u8 gUnknown_0203CEE8 = 0; EWRAM_DATA u8 gUnknown_0203CEE9 = 0; EWRAM_DATA MainCallback gPostMenuFieldCallback = NULL; -EWRAM_DATA u16 *gUnknown_0203CEF0 = 0; -EWRAM_DATA u16 *gUnknown_0203CEF4 = 0; +static EWRAM_DATA u16 *gUnknown_0203CEF0 = 0; +static EWRAM_DATA u16 *gUnknown_0203CEF4 = 0; EWRAM_DATA u8 gSelectedOrderFromParty[4] = {0}; -EWRAM_DATA u16 gUnknown_0203CEFC = 0; -EWRAM_DATA u16 gUnknown_0203CEFE = 0; // unused +static EWRAM_DATA u16 gUnknown_0203CEFC = 0; +static EWRAM_DATA u16 gUnknown_0203CEFE = 0; // unused EWRAM_DATA u8 gUnknown_0203CF00[3] = {0}; -// BELOW TO BE CONVERTED TO C - -extern u32 gUnknown_08615048[]; // tutor compatibility table -extern struct BgTemplate gUnknown_086156B8[]; -extern struct Unk_Rodata1 gUnknown_086156C4[2]; -// extern struct Unk_Rodata1 gUnknown_086156E4; -extern u8 gUnknown_08615704[][6][8]; -extern u8 gUnknown_086157C4[]; -extern u8 gUnknown_086157E0[]; -extern const u8 gUnknown_086157FC[][3]; -extern struct WindowTemplate gUnknown_08615810[]; -extern struct WindowTemplate gUnknown_08615850[]; -extern struct WindowTemplate gUnknown_086158D0[]; -extern struct WindowTemplate gUnknown_08615890[]; -extern struct WindowTemplate gUnknown_08615908; -extern struct WindowTemplate gUnknown_08615910; -extern struct WindowTemplate gUnknown_08615918; -extern struct WindowTemplate gUnknown_08615920; -extern struct WindowTemplate gUnknown_08615928; -extern struct WindowTemplate gUnknown_08615930; -extern struct WindowTemplate gUnknown_08615938; -extern struct WindowTemplate gUnknown_08615940; -extern struct WindowTemplate gUnknown_08615948; -extern struct WindowTemplate gUnknown_08615950; -extern struct WindowTemplate gUnknown_08615958; -extern struct WindowTemplate gUnknown_08615960; -extern struct WindowTemplate gUnknown_08615968; -extern struct WindowTemplate gUnknown_08615970; -extern u8 gUnknown_08615988[]; -extern u8 gUnknown_086159CE[]; -extern u8 gUnknown_08615A14[]; -extern u8 gUnknown_08615A4A[]; -extern u8 gUnknown_08615A80[]; -extern u8 gUnknown_08615AB6[]; -extern u8 gUnknown_08615AB8[]; -extern u8 gUnknown_08615ABA[]; -extern u8 gUnknown_08615ABD[]; -extern u8 gUnknown_08615AC0[]; -extern u8 gUnknown_08615AC3[]; -extern u8 gUnknown_08615AC5[]; -extern u8 gUnknown_08615AC7[]; -extern u8 gUnknown_08615AC9[]; -extern u8 gUnknown_08615ACB[]; -extern u8 gUnknown_08615ACD[]; -extern u8 gUnknown_08615AD0[]; -extern u8 gUnknown_08615AD3[]; -extern u8 gUnknown_08615AD6[]; -extern u8 gUnknown_08615AD9[]; -extern u8 gUnknown_08615ADC[]; -extern u8 gUnknown_08615ADF[]; -extern u8 gUnknown_08615AE2[]; -extern u8 gUnknown_08615AE5[]; -extern u8 gUnknown_08615AE8[]; -extern u8 gUnknown_08615AEB[]; -extern u8 gUnknown_08615AEE[]; -extern u8 gUnknown_08615AF1[]; -extern const u8 *gUnknown_08615AF4[]; -extern const u8 *gUnknown_08615B60[]; -extern struct Struct8615C08 gUnknown_08615C08[]; -extern u8 *gUnknown_08615D38[]; -extern u8 gUnknown_08615D70[]; -extern const u16 gUnknown_08615D7E[]; -extern const struct Struct8615D9C gUnknown_08615D9C[]; -extern const u8 *gUnknown_08615E0C[]; -extern const struct SpriteSheet gUnknown_08615EB0; -extern const struct SpritePalette gUnknown_08615EB8; -extern struct SpriteTemplate gSpriteTemplate_8615EC0; -extern const struct CompressedSpriteSheet gUnknown_08615EF8; -extern const struct CompressedSpritePalette gUnknown_08615F00; -extern struct SpriteTemplate gSpriteTemplate_8615F08; -extern const struct CompressedSpriteSheet gUnknown_08615F70; -extern struct SpriteTemplate gSpriteTemplate_8615F78; -extern const struct CompressedSpriteSheet gUnknown_08615FF8; -extern const struct CompressedSpritePalette gUnknown_08616000; -extern struct SpriteTemplate gSpriteTemplate_8616008; -extern u8 gUnknown_08616020[]; -extern u16 gUnknown_08616040[]; - -// ABOVE TO BE CONVERTED TO C - extern void (*gUnknown_03006328)(u8, TaskFunc); -void reset_brm(void); -void PartyMenuInitCallback(void); -bool8 PartyMenuSetup(void); -void sub_81B209C(void); -void PartyMenuExit(void); -bool8 AllocPartyMenuBg(void); -bool8 AllocPartyMiscGfx(void); -void sub_81B239C(u8); -void PartyMenuInitHelperStructs(u8); -void LoadHeldItemIcons(void); -void LoadPartyMenuPokeballGfx(void); -void LoadPartyMenuAilmentGfx(void); -bool8 party_menu_add_per_mon_objects(void); -bool8 RenderPartyMenuBoxes(void); -void sub_81B0F28(void); -void sub_81B2428(u8); -void display_pokemon_menu_message(u32); -void PartyMenuExitTask(u8); -void FreePartyPointers(void); -void PartyPaletteBufferCopy(u8); -void sub_81B0CEC(u8); -void UpdateSelectedPartyBox(struct Struct203CEDC *, u8); -void sub_81B2720(u8); -void DisplayPartyPokemonSelectForRelearner(u8); -void DisplayPartyPokemonSelectForContest(u8); -void DisplayPartyPokemonSelectForBattle(u8); -void sub_81B0B98(u8); -void DisplayPartyPokemonSelectHeldItemRelated(u8); -bool8 sub_81B0BFC(u8); -void DisplayPartyPokemonData(u8); -void sub_81B0FCC(u8, u8); -void DisplayPartyPokemonNickname(struct Pokemon *, struct Struct203CEDC *, u8); -void DisplayPartyPokemonLevelCheck(struct Pokemon *, struct Struct203CEDC *, u8); -void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *, struct Struct203CEDC *, u8); -void DisplayPartyPokemonHPCheck(struct Pokemon *, struct Struct203CEDC *, u8); -void DisplayPartyPokemonMaxHPCheck(struct Pokemon *, struct Struct203CEDC *, u8); -void DisplayPartyPokemonHPBarCheck(struct Pokemon *, struct Struct203CEDC *); -void DisplayPartyPokemonOtherText(u8, struct Struct203CEDC *, u8); -u8 sub_81B8830(void); -bool8 GetBattleEntryEligibility(struct Pokemon *); -bool8 sub_81B218C(u8); -void DisplayPartyPokemonSelectToTeachMove(u8, u16, u8); -u8 CanPartyPokemonLearnTMTutor(struct Pokemon *, u16, u8); -void DisplayPartyPokemonBarDetail(u8, const u8*, u8, u8*); -void DisplayPartyPokemonLevel(u8, struct Struct203CEDC *); -void DisplayPartyPokemonGender(u8, u16, u8*, struct Struct203CEDC *); -void DisplayPartyPokemonHP(u16, struct Struct203CEDC *); -void DisplayPartyPokemonMaxHP(u16, struct Struct203CEDC *); -void DisplayPartyPokemonHPBar(u16, u16, struct Struct203CEDC *); -void party_menu_link_mon_icon_anim(u16, u32, struct Struct203CEDC *, u8, u32); -void party_menu_link_mon_held_item_object(u16, u16, struct Struct203CEDC *); -void party_menu_link_mon_pokeball_object(u16, struct Struct203CEDC *); -void party_menu_link_mon_status_condition_object(u16, u8, struct Struct203CEDC *); -void party_menu_held_item_object(struct Pokemon *, struct Struct203CEDC *); -void party_menu_pokeball_object(struct Pokemon *, struct Struct203CEDC *); -void party_menu_icon_anim(struct Pokemon *, struct Struct203CEDC *, u32); -void party_menu_status_condition_object(struct Pokemon *, struct Struct203CEDC *); -u8 sub_81B5F74(u8, u8); -void sub_81B120C(void); -u8 sub_81B5F34(u8, u8); -void AnimateSelectedPartyIcon(u8, u8); -void sub_81B5F98(u8, u8); -u8 GetPartyBoxPalBitfield(u8, u8); -bool8 PartyBoxPal_ParnterOrDisqualifiedInArena(u8); -u8 sub_81B8F38(u8); -void c3_0811FAB4(u8); -void sub_81B9080(void); -void sub_81B4F88(void); -void sub_81B15D0(u8, s8*); -void sub_81B140C(u8, s8*); -u16 PartyMenuButtonHandler(s8*); -s8* sub_81B13EC(void); -bool8 sub_81B15A4(u8*); -void sub_81B302C(u8*); -void sub_81B9140(void); -void sub_81B6794(u8); -void sub_81B7E4C(u8); -void sub_81B8474(u8); -void sub_81B7FAC(u8); -void sub_81B3938(u8); -void sub_81B21AC(u8, u8); -void sub_81B36FC(u8); -void sub_81B407C(u8); -void sub_81B2210(u8); -bool8 sub_81B1660(u8); -const u8* sub_81B88BC(void); -u8 sub_81B1B5C(const u8*, u8); -void sub_81B16D4(u8); -void sub_81B334C(void); -void sub_81B1708(u8); -bool8 sub_81B1BD4(void); -void sub_81B1C1C(u8); -void sub_81B8558(void); -void UpdateCurrentPartySelection(s8*, s8); -void SetNewPartySelectTarget1(s8*, s8); -void SetNewPartySelectTarget2(s8*, s8); -s8 sub_81B1B00(s8, s8); -void sub_81B3300(const u8*); -void sub_81B1B8C(u8); -void DisplayPartyPokemonHPCheck(struct Pokemon*, struct Struct203CEDC*, u8); -void DisplayPartyPokemonHPBarCheck(struct Pokemon*, struct Struct203CEDC*); -bool16 sub_81B2134(struct Pokemon*); -bool16 sub_81B2164(struct Pokemon*); -void sub_81B2248(u8); -void sub_81B227C(u8); -bool8 sub_81B2370(u16, u8); -u16 sub_81B2360(u8); -bool8 sub_81B314C(void); -void sub_81B3414(struct Pokemon*, u8); -u8 sub_81B8A2C(struct Pokemon*); -u8 sub_81B856C(s8); -void sub_81B469C(u8); -void sub_81B3730(u8); -void sub_81B3828(void); -void pokemon_change_order(void); -void sub_81B3894(void); -void sub_81B3CC0(u8); -void sub_81B3D48(u8); -void swap_pokemon_and_oams(void); -void sub_81B3E60(u8); -void sub_81B41C4(void); -void c2_8123744(void); -void sub_81B452C(void); -void sub_81B4350(u8); -void sub_81B42D0(u8); -void sub_81B43A8(u8); -void sub_81B43DC(u8); -void sub_81B44FC(u8); -void sub_81B4578(void); -void sub_81B4624(u8); -void sub_81B5C94(struct Pokemon*, struct Struct203CEDC*); -void sub_81B48A8(u8); -void sub_81B48DC(u8); -void sub_81B4988(u8); -void sub_81B4A98(void); -void sub_81B4AE0(void); -void sub_81B4B6C(u8); -void sub_81B4BA0(u8); -void sub_81B4C60(u8); -void sub_81B4C94(u8); -bool8 sub_81B8A7C(void); -void sub_81B53FC(u8); -void sub_81B5430(u8); -void task_brm_cancel_1_on_keypad_a_or_b(u8); -void sub_81B5674(u8); -void sub_81B57DC(void); -void sub_81B5864(void); -void sub_81B56A4(u8); -void sub_81B56D8(u8); -void task_launch_hm_phase_2(u8); -u16 brm_get_selected_species(void); -void sub_81B5B38(u8, struct Pokemon*); -void UpdatePartyMonIconFrame(struct Sprite*); -void UpdatePartyMonIconFrameAndBounce(struct Sprite*); -void sub_81B5CB0(u16, struct Struct203CEDC*); -void sub_81B5DF0(u8, u8); -void sub_81B5E74(struct Sprite*); -void party_menu_get_status_condition_and_update_object(struct Pokemon*, struct Struct203CEDC*); -void party_menu_update_status_condition_object(u8, struct Struct203CEDC*); -u8 sub_81B8984(void); -void sub_81B6280(u8); -void c2_815ABFC(void); -u8 GetItemEffectType(u16); -void sub_81B672C(u8); -u16 sub_81B691C(struct Pokemon*, u8); -void option_menu_get_string(u8, u8*); -void sub_81B6BB4(u8); -void ether_effect_related_2(u8); -void ether_effect_related(u8); -void sub_81B6EB4(u8); -void sub_81B6FF4(u8); -void sub_81B6F60(u8); -void sub_81B6F98(u8); -void sub_81B77AC(u8); -void sub_81B7028(u8); -void sub_81B7088(u8); -void sub_81B7230(u8); -void sub_81B70B8(void); -void sub_81B70F0(void); -void sub_81B711C(u8); -void sub_81B7154(u8); -void sub_81B71D4(u8); -void sub_81B7294(u8); -void sub_81B72C8(u8); -void sub_81B73E4(u8); -void sub_81B79A0(struct Pokemon*, s16*); -void sub_81B754C(u8, struct Pokemon*); -void sub_81B75D4(u8); -void sub_81B767C(u8); -void sub_81B7634(u8); -void sub_81B76C8(u8); -void sub_81B7704(u8); -void sub_81B7810(u8); -void sub_81B787C(u8); -void sub_81B7910(u8, u16); -void sub_81B7A28(u8); -void task_sacred_ash_party_loop(u8); -void sub_81B7C10(u8); -void sub_81B8044(u8); -void sub_81B83B8(u8); -void sub_81B82A0(u8); -void sub_81B83F0(u16); -void sub_81B814C(void); -void sub_81B8088(u8); -void sub_81B8104(u8); -void sub_81B81A8(void); -bool8 sub_81B841C(u16); -void sub_81B8230(u8); -void sub_81B82D4(u8); -void sub_81B879C(u8); -void sub_81B8558(void); -bool8 GetBattleEntryEligibility(struct Pokemon*); -bool8 sub_81B8770(u8); -u8 sub_81B8888(void); -u8 sub_81B885C(void); -void sub_81B87E8(u8); -u8 pokemon_order_func(u8); -void sub_81B8FB0(u8, u8); -void sub_81B8C88(u8*, bool8); -void sub_81B8D88(u8*, u8, u8); -void sub_81B917C(u8); -void sub_81B91B4(u8); -void sub_81B9294(u8); -void sub_81B9240(u8); -void sub_81B9390(void); -void task_hm_without_phase_2(u8); -void sub_81B9424(u8); -void sub_81B9470(void); -void sub_81B94D0(u8); -void sub_81B953C(u8); -void sub_81B9588(void); -void sub_81B9640(u8); -void sub_81B97DC(struct Pokemon*, u8, u8); - -void InitPartyMenu(u8 a, u8 b, u8 c, u8 d, u8 e, TaskFunc task, MainCallback callback) +static void reset_brm(void); +static void PartyMenuInitCallback(void); +static bool8 PartyMenuSetup(void); +static void sub_81B209C(void); +static void PartyMenuExit(void); +static bool8 AllocPartyMenuBg(void); +static bool8 AllocPartyMiscGfx(void); +static void sub_81B239C(u8); +static void PartyMenuInitHelperStructs(u8); +static void LoadPartyMenuPokeballGfx(void); +static void LoadPartyMenuAilmentGfx(void); +static bool8 party_menu_add_per_mon_objects(void); +static bool8 RenderPartyMenuBoxes(void); +static void sub_81B0F28(void); +static void sub_81B2428(u8); +static void PartyMenuExitTask(u8); +static void FreePartyPointers(void); +static void PartyPaletteBufferCopy(u8); +static void sub_81B0CEC(u8); +static void UpdateSelectedPartyBox(struct Struct203CEDC *, u8); +static void sub_81B2720(u8); +static void DisplayPartyPokemonSelectForRelearner(u8); +static void DisplayPartyPokemonSelectForContest(u8); +static void DisplayPartyPokemonSelectForBattle(u8); +static void sub_81B0B98(u8); +static void DisplayPartyPokemonSelectHeldItemRelated(u8); +static bool8 sub_81B0BFC(u8); +static void DisplayPartyPokemonData(u8); +static void DisplayPartyPokemonNickname(struct Pokemon *, struct Struct203CEDC *, u8); +static void DisplayPartyPokemonLevelCheck(struct Pokemon *, struct Struct203CEDC *, u8); +static void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *, struct Struct203CEDC *, u8); +static void DisplayPartyPokemonHPCheck(struct Pokemon *, struct Struct203CEDC *, u8); +static void DisplayPartyPokemonMaxHPCheck(struct Pokemon *, struct Struct203CEDC *, u8); +static void DisplayPartyPokemonHPBarCheck(struct Pokemon *, struct Struct203CEDC *); +static void DisplayPartyPokemonOtherText(u8, struct Struct203CEDC *, u8); +static u8 sub_81B8830(void); +static bool8 GetBattleEntryEligibility(struct Pokemon *); +static bool8 sub_81B218C(u8); +static void DisplayPartyPokemonSelectToTeachMove(u8, u16, u8); +static u8 CanMonLearnTMTutor(struct Pokemon *, u16, u8); +static void DisplayPartyPokemonBarDetail(u8, const u8*, u8, const u8*); +static void DisplayPartyPokemonLevel(u8, struct Struct203CEDC *); +static void DisplayPartyPokemonGender(u8, u16, u8*, struct Struct203CEDC *); +static void DisplayPartyPokemonHP(u16, struct Struct203CEDC *); +static void DisplayPartyPokemonMaxHP(u16, struct Struct203CEDC *); +static void DisplayPartyPokemonHPBar(u16, u16, struct Struct203CEDC *); +static void party_menu_link_mon_icon_anim(u16, u32, struct Struct203CEDC *, u8, u32); +static void party_menu_link_mon_held_item_object(u16, u16, struct Struct203CEDC *); +static void party_menu_link_mon_pokeball_object(u16, struct Struct203CEDC *); +static void party_menu_link_mon_status_condition_object(u16, u8, struct Struct203CEDC *); +static void party_menu_held_item_object(struct Pokemon *, struct Struct203CEDC *); +static void party_menu_pokeball_object(struct Pokemon *, struct Struct203CEDC *); +static void party_menu_icon_anim(struct Pokemon *, struct Struct203CEDC *, u32); +static void party_menu_status_condition_object(struct Pokemon *, struct Struct203CEDC *); +static u8 sub_81B5F74(u8, u8); +static void sub_81B120C(void); +static u8 sub_81B5F34(u8, u8); +static void AnimateSelectedPartyIcon(u8, u8); +static void sub_81B5F98(u8, u8); +static u8 GetPartyBoxPalBitfield(u8, u8); +static bool8 PartyBoxPal_ParnterOrDisqualifiedInArena(u8); +static u8 sub_81B8F38(u8); +static void c3_0811FAB4(u8); +static void sub_81B9080(void); +static void sub_81B4F88(void); +static void sub_81B15D0(u8, s8*); +static void sub_81B140C(u8, s8*); +static u16 PartyMenuButtonHandler(s8*); +static s8* sub_81B13EC(void); +static bool8 sub_81B15A4(u8*); +static void sub_81B302C(u8*); +static void sub_81B9140(void); +static void sub_81B6794(u8); +static void sub_81B7E4C(u8); +static void sub_81B8474(u8); +static void sub_81B7FAC(u8); +static void sub_81B3938(u8); +static void sub_81B21AC(u8, u8); +static void sub_81B36FC(u8); +static void sub_81B407C(u8); +static void sub_81B2210(u8); +static bool8 sub_81B1660(u8); +static const u8* sub_81B88BC(void); +static void sub_81B16D4(u8); +static void sub_81B334C(void); +static void sub_81B1708(u8); +static void sub_81B1C1C(u8); +static void UpdateCurrentPartySelection(s8*, s8); +static void SetNewPartySelectTarget1(s8*, s8); +static void SetNewPartySelectTarget2(s8*, s8); +static s8 sub_81B1B00(s8, s8); +static void sub_81B3300(const u8*); +static void sub_81B1B8C(u8); +static void DisplayPartyPokemonHPCheck(struct Pokemon*, struct Struct203CEDC*, u8); +static void DisplayPartyPokemonHPBarCheck(struct Pokemon*, struct Struct203CEDC*); +static bool16 sub_81B2134(struct Pokemon*); +static bool16 sub_81B2164(struct Pokemon*); +static void sub_81B2248(u8); +static void sub_81B227C(u8); +static bool8 CanLearnTutorMove(u16, u8); +static u16 GetTutorMove(u8); +static bool8 sub_81B314C(void); +static void sub_81B3414(struct Pokemon*, u8); +static u8 sub_81B8A2C(struct Pokemon*); +static u8 sub_81B856C(s8); +static void sub_81B469C(u8); +static void HandleMenuInput(u8); +static void sub_81B3828(void); +static void pokemon_change_order(void); +static void sub_81B3894(void); +static void sub_81B3CC0(u8); +static void sub_81B3D48(u8); +static void swap_pokemon_and_oams(void); +static void sub_81B3E60(u8); +static void sub_81B41C4(void); +static void c2_8123744(void); +static void sub_81B452C(void); +static void sub_81B4350(u8); +static void sub_81B42D0(u8); +static void sub_81B43A8(u8); +static void sub_81B43DC(u8); +static void sub_81B44FC(u8); +static void sub_81B4578(void); +static void sub_81B4624(u8); +static void sub_81B5C94(struct Pokemon*, struct Struct203CEDC*); +static void sub_81B48A8(u8); +static void sub_81B48DC(u8); +static void sub_81B4988(u8); +static void sub_81B4A98(void); +static void sub_81B4AE0(void); +static void sub_81B4B6C(u8); +static void sub_81B4BA0(u8); +static void sub_81B4C60(u8); +static void sub_81B4C94(u8); +static bool8 sub_81B8A7C(void); +static void sub_81B53FC(u8); +static void sub_81B5430(u8); +static void task_brm_cancel_1_on_keypad_a_or_b(u8); +static void sub_81B5674(u8); +static void sub_81B57DC(void); +static void sub_81B5864(void); +static void sub_81B56A4(u8); +static void sub_81B56D8(u8); +static void task_launch_hm_phase_2(u8); +static u16 brm_get_selected_species(void); +static void sub_81B5B38(u8, struct Pokemon*); +static void UpdatePartyMonIconFrame(struct Sprite*); +static void UpdatePartyMonIconFrameAndBounce(struct Sprite*); +static void sub_81B5CB0(u16, struct Struct203CEDC*); +static void sub_81B5DF0(u8, u8); +static void sub_81B5E74(struct Sprite*); +static void party_menu_get_status_condition_and_update_object(struct Pokemon*, struct Struct203CEDC*); +static void party_menu_update_status_condition_object(u8, struct Struct203CEDC*); +static u8 sub_81B8984(void); +static void sub_81B6280(u8); +static void c2_815ABFC(void); +static void sub_81B672C(u8); +static u16 sub_81B691C(struct Pokemon*, u8); +static void option_menu_get_string(u8, u8*); +static void sub_81B6BB4(u8); +static void ether_effect_related_2(u8); +static void ether_effect_related(u8); +static void sub_81B6EB4(u8); +static void sub_81B6FF4(u8); +static void sub_81B6F60(u8); +static void sub_81B6F98(u8); +static void sub_81B77AC(u8); +static void sub_81B7028(u8); +static void sub_81B7088(u8); +static void sub_81B7230(u8); +static void sub_81B70B8(void); +static void sub_81B70F0(void); +static void sub_81B711C(u8); +static void sub_81B7154(u8); +static void sub_81B71D4(u8); +static void sub_81B7294(u8); +static void sub_81B72C8(u8); +static void sub_81B73E4(u8); +static void sub_81B79A0(struct Pokemon*, s16*); +static void sub_81B754C(u8, struct Pokemon*); +static void sub_81B75D4(u8); +static void sub_81B767C(u8); +static void sub_81B7634(u8); +static void sub_81B76C8(u8); +static void sub_81B7704(u8); +static void sub_81B7810(u8); +static void sub_81B787C(u8); +static void sub_81B7910(u8, u16); +static void sub_81B7A28(u8); +static void task_sacred_ash_party_loop(u8); +static void sub_81B7C10(u8); +static void sub_81B8044(u8); +static void sub_81B83B8(u8); +static void sub_81B82A0(u8); +static void sub_81B83F0(u16); +static void sub_81B814C(void); +static void sub_81B8088(u8); +static void sub_81B8104(u8); +static void sub_81B81A8(void); +static bool8 sub_81B841C(u16); +static void sub_81B8230(u8); +static void sub_81B82D4(u8); +static void sub_81B879C(u8); +static bool8 GetBattleEntryEligibility(struct Pokemon*); +static bool8 sub_81B8770(u8); +static u8 sub_81B8888(void); +static u8 sub_81B885C(void); +static void sub_81B87E8(u8); +static void sub_81B8C88(u8*, bool8); +static void sub_81B8D88(u8*, u8, u8); +static void sub_81B917C(u8); +static void sub_81B91B4(u8); +static void sub_81B9294(u8); +static void sub_81B9240(u8); +static void sub_81B9390(void); +static void task_hm_without_phase_2(u8); +static void sub_81B9424(u8); +static void sub_81B9470(void); +static void sub_81B94D0(u8); +static void sub_81B953C(u8); +static void sub_81B9588(void); +static void sub_81B9640(u8); +static void sub_81B97DC(struct Pokemon*, u8, u8); +static void BlitBitmapToPartyWindow_Default1(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 f); +static void BlitBitmapToPartyWindow_Default2(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 f); +static void CursorCb_Summary(u8 taskId); +static void CursorCb_Switch(u8 taskId); +static void CursorCb_Cancel1(u8 taskId); +static void CursorCb_Item(u8 taskId); +static void CursorCb_Give(u8 taskId); +static void CursorCb_TakeItem(u8 taskId); +static void CursorCb_Mail(u8 taskId); +static void CursorCb_Read(u8 taskId); +static void CursorCb_TakeMail(u8 taskId); +static void CursorCb_Cancel2(u8 taskId); +static void CursorCb_SendMon(u8 taskId); +static void CursorCb_Enter(u8 taskId); +static void CursorCb_NoEntry(u8 taskId); +static void CursorCb_Store(u8 taskId); +static void CursorCb_Register(u8 taskId); +static void CursorCb_Trade1(u8 taskId); +static void CursorCb_Trade2(u8 taskId); +static void CursorCb_Toss(u8 taskId); +static void CursorCb_FieldMove(u8 taskId); +static bool8 SetUpFieldMove_Surf(void); +static bool8 SetUpFieldMove_Fly(void); +static bool8 SetUpFieldMove_Waterfall(void); +static bool8 SetUpFieldMove_Dive(void); + +// static const data +#include "data/pokemon/tutor_learnsets.h" + +static const struct BgTemplate gUnknown_086156B8[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 28, + .screenSize = 1, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, +}; + +static const struct Unk_Rodata1 gUnknown_086156C4[] = +{ + {BlitBitmapToPartyWindow_Default1, {0x18, 0xB, 0x28, 0xD, 0x20, 0x14, 0x20, 8, 0x40, 0x14, 8, 8, 0x26, 0x25, 0x18, 8, 0x35, 0x25, 0x18, 8, 0x18, 0x23, 0x30, 3}, 0xC, 0x22, 0x40, 0x10}, + {BlitBitmapToPartyWindow_Default2, {0x16, 3, 0x28, 0xD, 0x1E, 0xC, 0x20, 8, 0x3E, 0xC, 8, 8, 0x66, 0xC, 0x18, 8, 0x75, 0xC, 0x18, 8, 0x58, 0xA, 0x30, 3}, 0x4D, 4, 0x40, 0x10}, +}; + +static const u8 gUnknown_08615704[][6][8] = +{ + { + {16, 40, 20, 50, 50, 52, 16, 34}, + {104, 18, 108, 28, 136, 27, 102, 25}, + {104, 42, 108, 52, 136, 51, 102, 49}, + {104, 66, 108, 76, 136, 75, 102, 73}, + {104, 90, 108, 100, 136, 99, 102, 97}, + {104, 114, 108, 124, 136, 123, 102, 121}, + }, + { + {16, 24, 20, 34, 50, 36, 16, 18}, + {16, 80, 20, 90, 50, 92, 16, 74}, + {104, 18, 108, 28, 136, 27, 102, 25}, + {104, 50, 108, 60, 136, 59, 102, 57}, + {104, 82, 108, 92, 136, 91, 102, 89}, + {104, 114, 108, 124, 136, 123, 102, 121}, + }, + { + {16, 24, 20, 34, 50, 36, 16, 18}, + {16, 80, 20, 90, 50, 92, 16, 74}, + {104, 26, 106, 36, 136, 35, 102, 33}, + {104, 50, 106, 60, 136, 59, 102, 57}, + {104, 82, 106, 92, 136, 91, 102, 89}, + {104, 106, 106, 116, 136, 115, 102, 113}, + }, + { + {16, 32, 20, 42, 50, 44, 16, 26}, + {104, 34, 106, 44, 136, 43, 102, 41}, + {104, 58, 106, 68, 136, 67, 102, 65}, + {16, 104, 20, 114, 50, 116, 16, 98}, + {104, 106, 106, 116, 136, 115, 102, 113}, + {104, 130, 106, 140, 136, 139, 102, 137}, + }, +}; + +static const u32 gUnknown_086157C4[] = INCBIN_U32("graphics/interface/unknown_6157C4.bin"); +static const u32 gUnknown_086157E0[] = INCBIN_U32("graphics/interface/unknown_6157E0.bin"); + +static const u8 gUnknown_086157FC[][3] = +{ + {0, 3, 2}, + {0, 1, 6}, + {0, 11, 12}, + {1, 2, 3}, + {1, 8, 9}, + {0, 1, 2}, +}; + +static const struct WindowTemplate gUnknown_08615810[] = +{ + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 3, + .width = 10, + .height = 7, + .paletteNum = 3, + .baseBlock = 0x63, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 1, + .width = 18, + .height = 3, + .paletteNum = 4, + .baseBlock = 0xA9, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 4, + .width = 18, + .height = 3, + .paletteNum = 5, + .baseBlock = 0xDF, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 7, + .width = 18, + .height = 3, + .paletteNum = 6, + .baseBlock = 0x115, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 10, + .width = 18, + .height = 3, + .paletteNum = 7, + .baseBlock = 0x14B, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 13, + .width = 18, + .height = 3, + .paletteNum = 8, + .baseBlock = 0x181, + }, + { + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 15, + .width = 28, + .height = 4, + .paletteNum = 14, + .baseBlock = 0x1DF, + }, + DUMMY_WIN_TEMPLATE +}; + +static const struct WindowTemplate gUnknown_08615850[] = +{ + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 10, + .height = 7, + .paletteNum = 3, + .baseBlock = 0x63, + }, + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 8, + .width = 10, + .height = 7, + .paletteNum = 4, + .baseBlock = 0xA9, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 1, + .width = 18, + .height = 3, + .paletteNum = 5, + .baseBlock = 0xEF, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 5, + .width = 18, + .height = 3, + .paletteNum = 6, + .baseBlock = 0x125, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 9, + .width = 18, + .height = 3, + .paletteNum = 7, + .baseBlock = 0x15B, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 13, + .width = 18, + .height = 3, + .paletteNum = 8, + .baseBlock = 0x191, + }, + { + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 15, + .width = 28, + .height = 4, + .paletteNum = 14, + .baseBlock = 0x1DF, + }, + DUMMY_WIN_TEMPLATE +}; + +static const struct WindowTemplate gUnknown_08615890[] = +{ + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 10, + .height = 7, + .paletteNum = 3, + .baseBlock = 0x63, + }, + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 8, + .width = 10, + .height = 7, + .paletteNum = 4, + .baseBlock = 0xA9, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 2, + .width = 18, + .height = 3, + .paletteNum = 5, + .baseBlock = 0xEF, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 5, + .width = 18, + .height = 3, + .paletteNum = 6, + .baseBlock = 0x125, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 9, + .width = 18, + .height = 3, + .paletteNum = 7, + .baseBlock = 0x15B, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 12, + .width = 18, + .height = 3, + .paletteNum = 8, + .baseBlock = 0x191, + }, + { + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 15, + .width = 28, + .height = 4, + .paletteNum = 14, + .baseBlock = 0x1DF, + }, + DUMMY_WIN_TEMPLATE +}; + +static const struct WindowTemplate gUnknown_086158D0[] = +{ + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 2, + .width = 10, + .height = 7, + .paletteNum = 3, + .baseBlock = 0x63, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 3, + .width = 18, + .height = 3, + .paletteNum = 5, + .baseBlock = 0xA9, + }, + { + .bg = 0, + .tilemapLeft = 12, + .tilemapTop = 6, + .width = 18, + .height = 3, + .paletteNum = 6, + .baseBlock = 0xDF, + }, + { + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 11, + .width = 10, + .height = 7, + .paletteNum = 4, + .baseBlock = 0x115, + }, + { + .bg = 2, + .tilemapLeft = 12, + .tilemapTop = 12, + .width = 18, + .height = 3, + .paletteNum = 7, + .baseBlock = 0x16B, + }, + { + .bg = 2, + .tilemapLeft = 12, + .tilemapTop = 15, + .width = 18, + .height = 3, + .paletteNum = 8, + .baseBlock = 0x1A1, + }, + DUMMY_WIN_TEMPLATE +}; + +static const struct WindowTemplate gUnknown_08615908 = +{ + .bg = 0, + .tilemapLeft = 24, + .tilemapTop = 17, + .width = 6, + .height = 2, + .paletteNum = 3, + .baseBlock = 0x1C7, +}; + +static const struct WindowTemplate gUnknown_08615910 = +{ + .bg = 0, + .tilemapLeft = 24, + .tilemapTop = 18, + .width = 6, + .height = 2, + .paletteNum = 3, + .baseBlock = 0x1C7, +}; + +static const struct WindowTemplate gUnknown_08615918 = +{ + .bg = 0, + .tilemapLeft = 24, + .tilemapTop = 16, + .width = 6, + .height = 2, + .paletteNum = 3, + .baseBlock = 0x1D3, +}; + +static const struct WindowTemplate gUnknown_08615920 = +{ + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 17, + .width = 21, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x24F, +}; + +static const struct WindowTemplate gUnknown_08615928 = +{ + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 17, + .width = 16, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x279, +}; + +static const struct WindowTemplate gUnknown_08615930 = +{ + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 17, + .width = 20, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x299, +}; + +static const struct WindowTemplate gUnknown_08615938 = +{ + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 17, + .width = 18, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x299, +}; + +static const struct WindowTemplate gUnknown_08615940 = +{ + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 17, + .width = 16, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x299, +}; + +static const struct WindowTemplate gUnknown_08615948 = +{ + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 15, + .width = 20, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x299, +}; + +static const struct WindowTemplate gUnknown_08615950 = +{ + .bg = 2, + .tilemapLeft = 23, + .tilemapTop = 13, + .width = 6, + .height = 6, + .paletteNum = 14, + .baseBlock = 0x39D, +}; + +static const struct WindowTemplate gUnknown_08615958 = +{ + .bg = 2, + .tilemapLeft = 21, + .tilemapTop = 13, + .width = 8, + .height = 6, + .paletteNum = 14, + .baseBlock = 0x39D, +}; + +static const struct WindowTemplate gUnknown_08615960 = +{ + .bg = 2, + .tilemapLeft = 19, + .tilemapTop = 11, + .width = 10, + .height = 8, + .paletteNum = 14, + .baseBlock = 0x2E9, +}; + +static const struct WindowTemplate gUnknown_08615968 = +{ + .bg = 2, + .tilemapLeft = 21, + .tilemapTop = 9, + .width = 5, + .height = 4, + .paletteNum = 14, + .baseBlock = 0x2E9, +}; + +static const struct WindowTemplate gUnknown_08615970 = +{ + .bg = 2, + .tilemapLeft = 19, + .tilemapTop = 1, + .width = 10, + .height = 11, + .paletteNum = 14, + .baseBlock = 0x2E9, +}; + +// Unused. +static const struct WindowTemplate gUnknown_08615978 = +{ + .bg = 2, + .tilemapLeft = 2, + .tilemapTop = 15, + .width = 27, + .height = 4, + .paletteNum = 14, + .baseBlock = 0x1DF, +}; + +// Unused. +static const struct WindowTemplate gUnknown_08615980 = +{ + .bg = 2, + .tilemapLeft = 0, + .tilemapTop = 13, + .width = 18, + .height = 3, + .paletteNum = 12, + .baseBlock = 0x39D, +}; + +static const u8 gUnknown_08615988[] = {24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 40, 59, 60, 58, 58, 58, 58, 58, 58, 61, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 46, 47, 47, 47, 47, 47, 47, 47, 47, 48}; +static const u8 gUnknown_086159CE[] = {24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 40, 41, 41, 41, 41, 41, 41, 41, 41, 42, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 46, 47, 47, 47, 47, 47, 47, 47, 47, 48}; +static const u8 gUnknown_08615A14[] = {43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 49, 33, 33, 33, 33, 33, 33, 33, 33, 52, 53, 51, 51, 51, 51, 51, 51, 54, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57}; +static const u8 gUnknown_08615A4A[] = {43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 49, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 50, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57}; +static const u8 gUnknown_08615A80[] = {21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39}; +static const u8 gUnknown_08615AB6[] = {11, 12}; +static const u8 gUnknown_08615AB8[] = {9, 10}; +static const u8 gUnknown_08615ABA[] = {4, 5, 6}; +static const u8 gUnknown_08615ABD[] = {1, 7, 8}; +static const u8 gUnknown_08615AC0[] = {1, 11, 12}; +static const u8 gUnknown_08615AC3[] = {59, 60}; +static const u8 gUnknown_08615AC5[] = {75, 76}; +static const u8 gUnknown_08615AC7[] = {57, 58}; +static const u8 gUnknown_08615AC9[] = {73, 74}; +static const u8 gUnknown_08615ACB[] = {89, 90}; +static const u8 gUnknown_08615ACD[] = {52, 53, 54}; +static const u8 gUnknown_08615AD0[] = {68, 69, 70}; +static const u8 gUnknown_08615AD3[] = {84, 85, 86}; +static const u8 gUnknown_08615AD6[] = {116, 117, 118}; +static const u8 gUnknown_08615AD9[] = {132, 133, 134}; +static const u8 gUnknown_08615ADC[] = {148, 149, 150}; +static const u8 gUnknown_08615ADF[] = {100, 101, 102}; +static const u8 gUnknown_08615AE2[] = {49, 55, 56}; +static const u8 gUnknown_08615AE5[] = {65, 71, 72}; +static const u8 gUnknown_08615AE8[] = {81, 87, 88}; +static const u8 gUnknown_08615AEB[] = {97, 103, 104}; +static const u8 gUnknown_08615AEE[] = {161, 167, 168}; +static const u8 gUnknown_08615AF1[] = {17, 27, 28}; + +static const u8 *const gUnknown_08615AF4[] = +{ + gUnknown_085E9E43, + gUnknown_085EA010, + gUnknown_085EA02A, + gUnknown_085E9E55, + gUnknown_085E9E64, + gUnknown_085E9E79, + gUnknown_085E9E8F, + gUnknown_085E9EBC, + gUnknown_085E9ED4, + gUnknown_085E9EE9, + gUnknown_085E9FDB, + gUnknown_085EA046, + gUnknown_085EA05B, + gUnknown_085E9F01, + gUnknown_085E9F58, + gUnknown_085E9F6F, + gUnknown_085E9F81, + gUnknown_085E9F90, + gUnknown_085E9FA7, + gUnknown_085E9FC2, + gText_EmptyString2, + gUnknown_085E9EA6, + gUnknown_085E9F16, + gUnknown_085E9F2A, + gUnknown_085E9F42, + gUnknown_085E9FF9, + gUnknown_085EA073, +}; + +static const u8 *const gUnknown_08615B60[] = +{ + gUnknown_085EA091, + gUnknown_085EA099, + gUnknown_085EA09E, + gUnknown_085EA0A4, + gUnknown_085EA0AB, + gUnknown_085EA0E7, + gUnknown_085EA0B1, + gUnknown_085EA0B6, + gUnknown_085EA0BF, + gUnknown_085EA0C5, + gUnknown_085EA0CF, + gUnknown_085EA0D7, + gUnknown_085EA0DC, +}; + +// Unknown unused data. Feel free to remove. +static const u16 gUnknown_08615B94[] = +{ + 0x0108, 0x0151, 0x0160, 0x015b, 0x002e, 0x005c, 0x0102, 0x0153, 0x014b, 0x00ed, 0x00f1, 0x010d, 0x003a, 0x003b, 0x003f, 0x0071, + 0x00b6, 0x00f0, 0x00ca, 0x00db, 0x00da, 0x004c, 0x00e7, 0x0055, 0x0057, 0x0059, 0x00d8, 0x005b, 0x005e, 0x00f7, 0x0118, 0x0068, + 0x0073, 0x015f, 0x0035, 0x00bc, 0x00c9, 0x007e, 0x013d, 0x014c, 0x0103, 0x0107, 0x0122, 0x009c, 0x00d5, 0x00a8, 0x00d3, 0x011d, + 0x0121, 0x013b, 0x000f, 0x0013, 0x0039, 0x0046, 0x0094, 0x00f9, 0x007f, 0x0123, +}; + +enum +{ + MENU_SUMMARY, + MENU_SWITCH, + MENU_CANCEL1, + MENU_ITEM, + MENU_GIVE, + MENU_TAKE_ITEM, + MENU_MAIL, + MENU_TAKE_MAIL, + MENU_READ, + MENU_CANCEL2, + MENU_SHIFT, + MENU_SEND_OUT, + MENU_ENTER, + MENU_NO_ENTRY, + MENU_STORE, + MENU_REGISTER, + MENU_TRADE1, + MENU_TRADE2, + MENU_TOSS, + MENU_FIELD_MOVES, +}; + +enum +{ + FIELD_MOVE_CUT, + FIELD_MOVE_FLASH, + FIELD_MOVE_ROCK_SMASH, + FIELD_MOVE_STRENGTH, + FIELD_MOVE_SURF, + FIELD_MOVE_FLY, + FIELD_MOVE_DIVE, + FIELD_MOVE_WATERFALL, + FIELD_MOVE_TELEPORT, + FIELD_MOVE_DIG, + FIELD_MOVE_SECRET_POWER, + FIELD_MOVE_MILK_DRINK, + FIELD_MOVE_SOFT_BOILED, + FIELD_MOVE_SWEET_SCENT, +}; + +// What a weird choice of table termination; +#define FIELD_MOVE_TERMINATOR MOVE_SWORDS_DANCE + +struct +{ + const u8 *text; + TaskFunc func; +} static const sCursorOptions[] = +{ + [MENU_SUMMARY] = {gText_Summary5, CursorCb_Summary}, + [MENU_SWITCH] = {gText_Switch2, CursorCb_Switch}, + [MENU_CANCEL1] = {gText_Cancel2, CursorCb_Cancel1}, + [MENU_ITEM] = {gText_Item, CursorCb_Item}, + [MENU_GIVE] = {gMenuText_Give, CursorCb_Give}, + [MENU_TAKE_ITEM] = {gText_Take, CursorCb_TakeItem}, + [MENU_MAIL] = {gText_Mail, CursorCb_Mail}, + [MENU_TAKE_MAIL] = {gText_Take2, CursorCb_TakeMail}, + [MENU_READ] = {gText_Read2, CursorCb_Read}, + [MENU_CANCEL2] = {gText_Cancel2, CursorCb_Cancel2}, + [MENU_SHIFT] = {gText_Shift, CursorCb_SendMon}, + [MENU_SEND_OUT] = {gText_SendOut, CursorCb_SendMon}, + [MENU_ENTER] = {gText_Enter, CursorCb_Enter}, + [MENU_NO_ENTRY] = {gText_NoEntry, CursorCb_NoEntry}, + [MENU_STORE] = {gText_Store, CursorCb_Store}, + [MENU_REGISTER] = {gText_Register, CursorCb_Register}, + [MENU_TRADE1] = {gText_Trade4, CursorCb_Trade1}, + [MENU_TRADE2] = {gText_Trade4, CursorCb_Trade2}, + [MENU_TOSS] = {gMenuText_Toss, CursorCb_Toss}, + [MENU_FIELD_MOVES + FIELD_MOVE_CUT] = {gMoveNames[MOVE_CUT], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_FLASH] = {gMoveNames[MOVE_FLASH], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_ROCK_SMASH] = {gMoveNames[MOVE_ROCK_SMASH], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_STRENGTH] = {gMoveNames[MOVE_STRENGTH], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_SURF] = {gMoveNames[MOVE_SURF], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_FLY] = {gMoveNames[MOVE_FLY], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_DIVE] = {gMoveNames[MOVE_DIVE], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_WATERFALL] = {gMoveNames[MOVE_WATERFALL], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_TELEPORT] = {gMoveNames[MOVE_TELEPORT], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_DIG] = {gMoveNames[MOVE_DIG], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_SECRET_POWER] = {gMoveNames[MOVE_SECRET_POWER], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_MILK_DRINK] = {gMoveNames[MOVE_MILK_DRINK], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_SOFT_BOILED] = {gMoveNames[MOVE_SOFT_BOILED], CursorCb_FieldMove}, + [MENU_FIELD_MOVES + FIELD_MOVE_SWEET_SCENT] = {gMoveNames[MOVE_SWEET_SCENT], CursorCb_FieldMove}, +}; + +static const u8 gUnknown_08615D10[] = {0, 1, 2}; +static const u8 gUnknown_08615D13[] = {10, 0, 2}; +static const u8 gUnknown_08615D16[] = {11, 0, 2}; +static const u8 gUnknown_08615D19[] = {0, 2}; +static const u8 gUnknown_08615D1B[] = {12, 0, 2}; +static const u8 gUnknown_08615D1E[] = {13, 0, 2}; +static const u8 gUnknown_08615D21[] = {14, 0, 2}; +static const u8 gUnknown_08615D24[] = {4, 5, 9}; +static const u8 gUnknown_08615D27[] = {8, 7, 9}; +static const u8 gUnknown_08615D2A[] = {15, 0, 2}; +static const u8 gUnknown_08615D2D[] = {16, 0, 2}; +static const u8 gUnknown_08615D30[] = {17, 0, 2}; +static const u8 gUnknown_08615D33[] = {5, 18, 2}; + +static const u8 *const gUnknown_08615D38[] = +{ + NULL, + gUnknown_08615D10, + gUnknown_08615D13, + gUnknown_08615D16, + gUnknown_08615D1B, + gUnknown_08615D1E, + gUnknown_08615D21, + gUnknown_08615D19, + gUnknown_08615D24, + gUnknown_08615D27, + gUnknown_08615D2A, + gUnknown_08615D2D, + gUnknown_08615D30, + gUnknown_08615D33, +}; + +static const u8 gUnknown_08615D70[] = {0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03}; + +static const u16 sFieldMoves[] = +{ + MOVE_CUT, MOVE_FLASH, MOVE_ROCK_SMASH, MOVE_STRENGTH, MOVE_SURF, MOVE_FLY, MOVE_DIVE, MOVE_WATERFALL, MOVE_TELEPORT, + MOVE_DIG, MOVE_SECRET_POWER, MOVE_MILK_DRINK, MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, FIELD_MOVE_TERMINATOR +}; + +struct +{ + bool8 (*fieldMoveFunc)(void); + u8 msgId; +} static const sFieldMoveCursorCallbacks[] = +{ + [FIELD_MOVE_CUT] = {SetUpFieldMove_Cut, 0x07}, + [FIELD_MOVE_FLASH] = {SetUpFieldMove_Flash, 0x0d}, + [FIELD_MOVE_ROCK_SMASH] = {SetUpFieldMove_RockSmash, 0x0d}, + [FIELD_MOVE_STRENGTH] = {SetUpFieldMove_Strength, 0x0d}, + [FIELD_MOVE_SURF] = {SetUpFieldMove_Surf, 0x08}, + [FIELD_MOVE_FLY] = {SetUpFieldMove_Fly, 0x0d}, + [FIELD_MOVE_DIVE] = {SetUpFieldMove_Dive, 0x0d}, + [FIELD_MOVE_WATERFALL] = {SetUpFieldMove_Waterfall, 0x0d}, + [FIELD_MOVE_TELEPORT] = {SetUpFieldMove_Teleport, 0x0d}, + [FIELD_MOVE_DIG] = {SetUpFieldMove_Dig, 0x0d}, + [FIELD_MOVE_SECRET_POWER] = {SetUpFieldMove_SecretPower, 0x0d}, + [FIELD_MOVE_MILK_DRINK] = {SetUpFieldMove_SoftBoiled, 0x10}, + [FIELD_MOVE_SOFT_BOILED] = {SetUpFieldMove_SoftBoiled, 0x10}, + [FIELD_MOVE_SWEET_SCENT] = {SetUpFieldMove_SweetScent, 0x0d}, +}; + +static const u8 *const gUnknown_08615E0C[] = +{ + gText_NotPkmnOtherTrainerWants, + gText_ThatIsntAnEgg, + gText_PkmnCantBeTradedNow, + gText_PkmnCantBeTradedNow, + gText_OtherTrainersPkmnCantBeTraded, + gText_EggCantBeTradedNow, + gText_OtherTrainerCantAcceptPkmn, + gText_CantTradeWithTrainer, + gText_CantTradeWithTrainer, +}; + +static const u32 gUnknown_08615E30[] = INCBIN_U32("graphics/interface/hold_icons.4bpp"); +static const u16 gUnknown_08615E70[] = INCBIN_U16("graphics/interface/hold_icons.gbapal"); + +static const struct OamData gOamData_83765EC = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd gSpriteAnim_83765F4[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83765FC[] = +{ + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_8376604[] = +{ + gSpriteAnim_83765F4, + gSpriteAnim_83765FC, +}; + +static const struct SpriteSheet gUnknown_08615EB0 = +{ + gUnknown_08615E30, sizeof(gUnknown_08615E30), 0xd750 +}; + +static const struct SpritePalette gUnknown_08615EB8 = +{ + gUnknown_08615E70, 0xd750 +}; + +static const struct SpriteTemplate gSpriteTemplate_8615EC0 = +{ + 0xd750, + 0xd750, + &gOamData_83765EC, + gSpriteAnimTable_8376604, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +static const struct OamData sOamData_8615ED8 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AnimCmd sSpriteAnim_8615EE0[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615EE8[] = +{ + ANIMCMD_FRAME(16, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_8615EF0[] = +{ + sSpriteAnim_8615EE0, + sSpriteAnim_8615EE8 +}; + +static const struct CompressedSpriteSheet gUnknown_08615EF8 = +{ + gPartyMenuPokeball_Gfx, 0x400, 0x04b0 +}; + +static const struct CompressedSpritePalette gUnknown_08615F00 = +{ + gPartyMenuPokeball_Pal, 0x04b0 +}; + +static const struct SpriteTemplate gSpriteTemplate_8615F08 = +{ + .tileTag = 0x04b0, + .paletteTag = 0x04b0, + .oam = &sOamData_8615ED8, + .anims = sSpriteAnimTable_8615EF0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct OamData sOamData_8615F20 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AnimCmd sSpriteAnim_8615F28[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615F30[] = +{ + ANIMCMD_FRAME(4, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615F38[] = +{ + ANIMCMD_FRAME(8, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615F40[] = +{ + ANIMCMD_FRAME(12, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615F48[] = +{ + ANIMCMD_FRAME(16, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615F50[] = +{ + ANIMCMD_FRAME(20, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_8615F58[] = +{ + sSpriteAnim_8615F28, + sSpriteAnim_8615F30, + sSpriteAnim_8615F38, + sSpriteAnim_8615F40, + sSpriteAnim_8615F48, + sSpriteAnim_8615F50 +}; + +static const struct CompressedSpriteSheet gUnknown_08615F70 = +{ + gPartyMenuPokeballSmall_Gfx, 0x0300, 0x04b1 +}; + +static const struct SpriteTemplate gSpriteTemplate_8615F78 = +{ + .tileTag = 1201, + .paletteTag = 1200, + .oam = &sOamData_8615F20, + .anims = sSpriteAnimTable_8615F58, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct OamData sOamData_8615F90 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AnimCmd sSpriteAnim_8615F98[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615FA0[] = +{ + ANIMCMD_FRAME(4, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615FA8[] = +{ + ANIMCMD_FRAME(8, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615FB0[] = +{ + ANIMCMD_FRAME(12, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615FB8[] = +{ + ANIMCMD_FRAME(16, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615FC0[] = +{ + ANIMCMD_FRAME(20, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615FC8[] = +{ + ANIMCMD_FRAME(24, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8615FD0[] = +{ + ANIMCMD_FRAME(28, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_8615FD8[] = +{ + sSpriteAnim_8615F98, + sSpriteAnim_8615FA0, + sSpriteAnim_8615FA8, + sSpriteAnim_8615FB0, + sSpriteAnim_8615FB8, + sSpriteAnim_8615FC0, + sSpriteAnim_8615FC8, + sSpriteAnim_8615FD0 +}; + +static const struct CompressedSpriteSheet gUnknown_08615FF8 = +{ + gStatusGfx_Icons, 0x400, 1202 +}; + +static const struct CompressedSpritePalette gUnknown_08616000 = +{ + gStatusPal_Icons, 1202 +}; + +static const struct SpriteTemplate gSpriteTemplate_8616008 = +{ + .tileTag = 1202, + .paletteTag = 1202, + .oam = &sOamData_8615F90, + .anims = sSpriteAnimTable_8615FD8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const u8 gUnknown_08616020[] = {0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00}; + +// Unused table of pointers to strings of statistics. +static const u8 *const gUnknown_08616028[] = +{ + gText_HP4, + gText_Attack3, + gText_Defense3, + gText_SpAtk4, + gText_SpDef4, + gText_Speed2 +}; + +static const u16 gTMHMMoves[] = +{ + MOVE_FOCUS_PUNCH, + MOVE_DRAGON_CLAW, + MOVE_WATER_PULSE, + MOVE_CALM_MIND, + MOVE_ROAR, + MOVE_TOXIC, + MOVE_HAIL, + MOVE_BULK_UP, + MOVE_BULLET_SEED, + MOVE_HIDDEN_POWER, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_ICE_BEAM, + MOVE_BLIZZARD, + MOVE_HYPER_BEAM, + MOVE_LIGHT_SCREEN, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_GIGA_DRAIN, + MOVE_SAFEGUARD, + MOVE_FRUSTRATION, + MOVE_SOLAR_BEAM, + MOVE_IRON_TAIL, + MOVE_THUNDERBOLT, + MOVE_THUNDER, + MOVE_EARTHQUAKE, + MOVE_RETURN, + MOVE_DIG, + MOVE_PSYCHIC, + MOVE_SHADOW_BALL, + MOVE_BRICK_BREAK, + MOVE_DOUBLE_TEAM, + MOVE_REFLECT, + MOVE_SHOCK_WAVE, + MOVE_FLAMETHROWER, + MOVE_SLUDGE_BOMB, + MOVE_SANDSTORM, + MOVE_FIRE_BLAST, + MOVE_ROCK_TOMB, + MOVE_AERIAL_ACE, + MOVE_TORMENT, + MOVE_FACADE, + MOVE_SECRET_POWER, + MOVE_REST, + MOVE_ATTRACT, + MOVE_THIEF, + MOVE_STEEL_WING, + MOVE_SKILL_SWAP, + MOVE_SNATCH, + MOVE_OVERHEAT, + MOVE_CUT, + MOVE_FLY, + MOVE_SURF, + MOVE_STRENGTH, + MOVE_FLASH, + MOVE_ROCK_SMASH, + MOVE_WATERFALL, + MOVE_DIVE, +}; + +// code +static void InitPartyMenu(u8 a, u8 b, u8 c, u8 d, u8 e, TaskFunc task, MainCallback callback) { u16 i; - + reset_brm(); gUnknown_0203CEC4 = Alloc(sizeof(struct Struct203CEC4)); if (gUnknown_0203CEC4 == NULL) @@ -476,32 +1551,32 @@ void InitPartyMenu(u8 a, u8 b, u8 c, u8 d, u8 e, TaskFunc task, MainCallback cal gUnknown_0203CEC4->unk8_1 = 0; gUnknown_0203CEC4->unk8_2 = 0xFF; gUnknown_0203CEC4->unk9_0 = 0xFF; - + if (a == 4) gUnknown_0203CEC4->unk8_0 = TRUE; else gUnknown_0203CEC4->unk8_0 = FALSE; - + if (b != 0xFF) gUnknown_0203CEC8.mode = b; - + for (i = 0; i <= 15; i++) gUnknown_0203CEC4->data[i] = 0; for (i = 0; i < 3; i++) gUnknown_0203CEC4->unkC[i] |= 0xFF; - + if (d == 0) gUnknown_0203CEC8.unk9 = 0; else if (gUnknown_0203CEC8.unk9 > 5 || GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_SPECIES) == SPECIES_NONE) gUnknown_0203CEC8.unk9 = 0; // wut why is this else if? - + gTextFlags.autoScroll = 0; CalculatePlayerPartyCount(); SetMainCallback2(PartyMenuInitCallback); } } -void PartyMenuCallback(void) +static void PartyMenuCallback(void) { RunTasks(); AnimateSprites(); @@ -510,14 +1585,14 @@ void PartyMenuCallback(void) UpdatePaletteFade(); } -void PartyMenuVBlankCallback(void) +static void PartyMenuVBlankCallback(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -void PartyMenuInitCallback(void) +static void PartyMenuInitCallback(void) { while (TRUE) { @@ -526,131 +1601,131 @@ void PartyMenuInitCallback(void) } } -bool8 PartyMenuSetup(void) +static bool8 PartyMenuSetup(void) { switch (gMain.state) { - case 0: - SetVBlankHBlankCallbacksToNull(); - ResetVramOamAndBgCntRegs(); - clear_scheduled_bg_copies_to_vram(); - gMain.state++; - break; - case 1: - ScanlineEffect_Stop(); - gMain.state++; - break; - case 2: - ResetPaletteFade(); - gPaletteFade.bufferTransferDisabled = TRUE; - gMain.state++; - break; - case 3: - ResetSpriteData(); - gMain.state++; - break; - case 4: - FreeAllSpritePalettes(); - gMain.state++; - break; - case 5: - if (!sub_81221AC()) - ResetTasks(); - gMain.state++; - break; - case 6: - sub_81B209C(); - gMain.state++; - break; - case 7: - if (!AllocPartyMenuBg()) - { - PartyMenuExit(); - return TRUE; - } - else - { - gUnknown_0203CEC4->data[0] = 0; - gMain.state++; - } - break; - case 8: - if (AllocPartyMiscGfx()) - gMain.state++; - break; - case 9: - sub_81B239C(gUnknown_0203CEC8.mode); - gMain.state++; - break; - case 10: - PartyMenuInitHelperStructs(gUnknown_0203CEC8.mode); + case 0: + SetVBlankHBlankCallbacksToNull(); + ResetVramOamAndBgCntRegs(); + clear_scheduled_bg_copies_to_vram(); + gMain.state++; + break; + case 1: + ScanlineEffect_Stop(); + gMain.state++; + break; + case 2: + ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = TRUE; + gMain.state++; + break; + case 3: + ResetSpriteData(); + gMain.state++; + break; + case 4: + FreeAllSpritePalettes(); + gMain.state++; + break; + case 5: + if (!sub_81221AC()) + ResetTasks(); + gMain.state++; + break; + case 6: + sub_81B209C(); + gMain.state++; + break; + case 7: + if (!AllocPartyMenuBg()) + { + PartyMenuExit(); + return TRUE; + } + else + { gUnknown_0203CEC4->data[0] = 0; gMain.state++; - break; - case 11: - LoadHeldItemIcons(); - gMain.state++; - break; - case 12: - LoadPartyMenuPokeballGfx(); - gMain.state++; - break; - case 13: - LoadPartyMenuAilmentGfx(); - gMain.state++; - break; - case 14: - LoadMonIconPalettes(); - gMain.state++; - break; - case 15: - if (party_menu_add_per_mon_objects()) - { - gUnknown_0203CEC4->data[0] = 0; - gMain.state++; - } - break; - case 16: - if (RenderPartyMenuBoxes()) - { - gUnknown_0203CEC4->data[0] = 0; - gMain.state++; - } - break; - case 17: - sub_81B0F28(); - gMain.state++; - break; - case 18: - sub_81B2428(gUnknown_0203CEC4->unk8_0); - gMain.state++; - break; - case 19: - gMain.state++; - break; - case 20: - CreateTask(gUnknown_0203CEC4->unk0, 0); - display_pokemon_menu_message(gUnknown_0203CEC4->unkA_0); + } + break; + case 8: + if (AllocPartyMiscGfx()) gMain.state++; - break; - case 21: - BlendPalettes(0xFFFFFFFF, 16, 0); - gPaletteFade.bufferTransferDisabled = FALSE; + break; + case 9: + sub_81B239C(gUnknown_0203CEC8.mode); + gMain.state++; + break; + case 10: + PartyMenuInitHelperStructs(gUnknown_0203CEC8.mode); + gUnknown_0203CEC4->data[0] = 0; + gMain.state++; + break; + case 11: + LoadHeldItemIcons(); + gMain.state++; + break; + case 12: + LoadPartyMenuPokeballGfx(); + gMain.state++; + break; + case 13: + LoadPartyMenuAilmentGfx(); + gMain.state++; + break; + case 14: + LoadMonIconPalettes(); + gMain.state++; + break; + case 15: + if (party_menu_add_per_mon_objects()) + { + gUnknown_0203CEC4->data[0] = 0; gMain.state++; - break; - case 22: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + } + break; + case 16: + if (RenderPartyMenuBoxes()) + { + gUnknown_0203CEC4->data[0] = 0; gMain.state++; - break; - default: - SetVBlankCallback(PartyMenuVBlankCallback); - SetMainCallback2(PartyMenuCallback); - return TRUE; + } + break; + case 17: + sub_81B0F28(); + gMain.state++; + break; + case 18: + sub_81B2428(gUnknown_0203CEC4->unk8_0); + gMain.state++; + break; + case 19: + gMain.state++; + break; + case 20: + CreateTask(gUnknown_0203CEC4->unk0, 0); + display_pokemon_menu_message(gUnknown_0203CEC4->unkA_0); + gMain.state++; + break; + case 21: + BlendPalettes(0xFFFFFFFF, 16, 0); + gPaletteFade.bufferTransferDisabled = FALSE; + gMain.state++; + break; + case 22: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + gMain.state++; + break; + default: + SetVBlankCallback(PartyMenuVBlankCallback); + SetMainCallback2(PartyMenuCallback); + return TRUE; } return FALSE; } -void PartyMenuExit(void) +static void PartyMenuExit(void) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); CreateTask(PartyMenuExitTask, 0); @@ -658,7 +1733,7 @@ void PartyMenuExit(void) SetMainCallback2(PartyMenuCallback); } -void PartyMenuExitTask(u8 taskId) +static void PartyMenuExitTask(u8 taskId) { if (!gPaletteFade.active) { @@ -668,7 +1743,7 @@ void PartyMenuExitTask(u8 taskId) } } -void reset_brm(void) +static void reset_brm(void) { gUnknown_0203CEC4 = NULL; gUnknown_0203CEE4 = NULL; @@ -676,14 +1751,15 @@ void reset_brm(void) gUnknown_0203CEE0 = NULL; } -bool8 AllocPartyMenuBg(void) +static bool8 AllocPartyMenuBg(void) { gUnknown_0203CEE4 = Alloc(0x800); if (gUnknown_0203CEE4 == NULL) return FALSE; + memset(gUnknown_0203CEE4, 0, 0x800); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_086156B8, 3); + InitBgsFromTemplates(0, gUnknown_086156B8, ARRAY_COUNT(gUnknown_086156B8)); SetBgTilemapBuffer(1, gUnknown_0203CEE4); ResetAllBgsCoordinates(); schedule_bg_copy_tilemap_to_vram(1); @@ -695,63 +1771,63 @@ bool8 AllocPartyMenuBg(void) return TRUE; } -bool8 AllocPartyMiscGfx(void) +static bool8 AllocPartyMiscGfx(void) { int sizeout; - + switch (gUnknown_0203CEC4->data[0]) { - case 0: - gUnknown_0203CEE0 = malloc_and_decompress(gPartyMenuMisc_Gfx, &sizeout); - LoadBgTiles(1, gUnknown_0203CEE0, sizeout, 0); - gUnknown_0203CEC4->data[0]++; - break; - case 1: - if (!IsDma3ManagerBusyWithBgCopy()) - { - LZDecompressWram(gPartyMenuMisc_Tilemap, gUnknown_0203CEE4); - gUnknown_0203CEC4->data[0]++; - } - break; - case 2: - LoadCompressedPalette(gPartyMenuMisc_Pal, 0, 0x160); - CpuCopy16(gPlttBufferUnfaded, gUnknown_0203CEC4->palBuffer, 0x160); - gUnknown_0203CEC4->data[0]++; - break; - case 3: - PartyPaletteBufferCopy(4); - gUnknown_0203CEC4->data[0]++; - break; - case 4: - PartyPaletteBufferCopy(5); - gUnknown_0203CEC4->data[0]++; - break; - case 5: - PartyPaletteBufferCopy(6); - gUnknown_0203CEC4->data[0]++; - break; - case 6: - PartyPaletteBufferCopy(7); - gUnknown_0203CEC4->data[0]++; - break; - case 7: - PartyPaletteBufferCopy(8); + case 0: + gUnknown_0203CEE0 = malloc_and_decompress(gPartyMenuMisc_Gfx, &sizeout); + LoadBgTiles(1, gUnknown_0203CEE0, sizeout, 0); + gUnknown_0203CEC4->data[0]++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + LZDecompressWram(gPartyMenuMisc_Tilemap, gUnknown_0203CEE4); gUnknown_0203CEC4->data[0]++; - break; - default: - return TRUE; + } + break; + case 2: + LoadCompressedPalette(gPartyMenuMisc_Pal, 0, 0x160); + CpuCopy16(gPlttBufferUnfaded, gUnknown_0203CEC4->palBuffer, 0x160); + gUnknown_0203CEC4->data[0]++; + break; + case 3: + PartyPaletteBufferCopy(4); + gUnknown_0203CEC4->data[0]++; + break; + case 4: + PartyPaletteBufferCopy(5); + gUnknown_0203CEC4->data[0]++; + break; + case 5: + PartyPaletteBufferCopy(6); + gUnknown_0203CEC4->data[0]++; + break; + case 6: + PartyPaletteBufferCopy(7); + gUnknown_0203CEC4->data[0]++; + break; + case 7: + PartyPaletteBufferCopy(8); + gUnknown_0203CEC4->data[0]++; + break; + default: + return TRUE; } return FALSE; } -void PartyPaletteBufferCopy(u8 offset) +static void PartyPaletteBufferCopy(u8 offset) { offset *= 16; CpuCopy16(&gPlttBufferUnfaded[0x30], &gPlttBufferUnfaded[offset], 32); CpuCopy16(&gPlttBufferUnfaded[0x30], &gPlttBufferFaded[offset], 32); } -void FreePartyPointers(void) +static void FreePartyPointers(void) { if (gUnknown_0203CEC4) Free(gUnknown_0203CEC4); @@ -764,12 +1840,12 @@ void FreePartyPointers(void) FreeAllWindowBuffers(); } -void PartyMenuInitHelperStructs(u8 a) +static void PartyMenuInitHelperStructs(u8 a) { u8 i; - + gUnknown_0203CEDC = Alloc(sizeof(struct Struct203CEDC[PARTY_SIZE])); - + for (i = 0; i < PARTY_SIZE; i++) { gUnknown_0203CEDC[i].unk0 = &gUnknown_086156C4[1]; @@ -787,7 +1863,7 @@ void PartyMenuInitHelperStructs(u8 a) gUnknown_0203CEDC[1].unk0 = &gUnknown_086156C4[0]; } -void RenderPartyMenuBox(u8 slot) +static void RenderPartyMenuBox(u8 slot) { if (gUnknown_0203CEC8.unk8_0 == 5 && slot > 2) { @@ -822,7 +1898,7 @@ void RenderPartyMenuBox(u8 slot) DisplayPartyPokemonSelectHeldItemRelated(slot); else if (!sub_81B0BFC(slot)) DisplayPartyPokemonData(slot); - + if (gUnknown_0203CEC8.unk8_0 == 5) sub_81B0FCC(slot, 0); else if (gUnknown_0203CEC8.unk9 == slot) @@ -835,7 +1911,7 @@ void RenderPartyMenuBox(u8 slot) } } -void DisplayPartyPokemonData(u8 slot) +static void DisplayPartyPokemonData(u8 slot) { if (GetMonData(&gPlayerParty[slot], MON_DATA_IS_EGG)) { @@ -854,10 +1930,10 @@ void DisplayPartyPokemonData(u8 slot) } } -void DisplayPartyPokemonSelectData(u8 slot, u8 stringID) +static void DisplayPartyPokemonSelectData(u8 slot, u8 stringID) { struct Pokemon *mon = &gPlayerParty[slot]; - + gUnknown_0203CEDC[slot].unk0->unk0(gUnknown_0203CEDC[slot].windowId, 0, 0, 0, 0, 1); DisplayPartyPokemonNickname(mon, &gUnknown_0203CEDC[slot], 0); if (!GetMonData(mon, MON_DATA_IS_EGG)) @@ -868,12 +1944,12 @@ void DisplayPartyPokemonSelectData(u8 slot, u8 stringID) DisplayPartyPokemonOtherText(stringID, &gUnknown_0203CEDC[slot], 0); } -void DisplayPartyPokemonSelectForBattle(u8 slot) +static void DisplayPartyPokemonSelectForBattle(u8 slot) { u8 i; struct Pokemon *mon = &gPlayerParty[slot]; u8 *ptr = gSelectedOrderFromParty; - + if (!GetBattleEntryEligibility(mon)) { DisplayPartyPokemonSelectData(slot, 7); @@ -893,23 +1969,23 @@ void DisplayPartyPokemonSelectForBattle(u8 slot) } } -void DisplayPartyPokemonSelectForContest(u8 slot) +static void DisplayPartyPokemonSelectForContest(u8 slot) { switch (sub_80DAE0C(&gPlayerParty[slot])) { - case 0: - case 3: - case 4: - DisplayPartyPokemonSelectData(slot, 7); - break; - case 1: - case 2: - DisplayPartyPokemonSelectData(slot, 6); - break; + case 0: + case 3: + case 4: + DisplayPartyPokemonSelectData(slot, 7); + break; + case 1: + case 2: + DisplayPartyPokemonSelectData(slot, 6); + break; } } -void DisplayPartyPokemonSelectForRelearner(u8 slot) +static void DisplayPartyPokemonSelectForRelearner(u8 slot) { if (GetNumberOfRelearnableMoves(&gPlayerParty[slot]) == 0) DisplayPartyPokemonSelectData(slot, 9); @@ -917,7 +1993,7 @@ void DisplayPartyPokemonSelectForRelearner(u8 slot) DisplayPartyPokemonSelectData(slot, 8); } -void sub_81B0B98(u8 slot) +static void sub_81B0B98(u8 slot) { if (sub_81B218C(slot) == TRUE) DisplayPartyPokemonSelectData(slot, 6); @@ -925,7 +2001,7 @@ void sub_81B0B98(u8 slot) DisplayPartyPokemonSelectData(slot, 7); } -void DisplayPartyPokemonSelectHeldItemRelated(u8 slot) +static void DisplayPartyPokemonSelectHeldItemRelated(u8 slot) { if (GetMonData(&gPlayerParty[slot], MON_DATA_HELD_ITEM)) DisplayPartyPokemonSelectData(slot, 11); @@ -933,11 +2009,11 @@ void DisplayPartyPokemonSelectHeldItemRelated(u8 slot) DisplayPartyPokemonSelectData(slot, 12); } -bool8 sub_81B0BFC(u8 slot) +static bool8 sub_81B0BFC(u8 slot) { struct Pokemon *currentPokemon = &gPlayerParty[slot]; u16 item = gSpecialVar_ItemId; - + if (gUnknown_0203CEC8.unkB == 12) { gSpecialVar_Result = FALSE; @@ -947,46 +2023,46 @@ bool8 sub_81B0BFC(u8 slot) { if (gUnknown_0203CEC8.unkB != 3) return FALSE; - + switch (CheckIfItemIsTMHMOrEvolutionStone(item)) { - default: + default: + return FALSE; + case 1: + DisplayPartyPokemonSelectToTeachMove(slot, item, 0); + break; + case 2: + if (!GetMonData(currentPokemon, MON_DATA_IS_EGG) && GetEvolutionTargetSpecies(currentPokemon, 3, item) != SPECIES_NONE) return FALSE; - case 1: - DisplayPartyPokemonSelectToTeachMove(slot, item, 0); - break; - case 2: - if (!GetMonData(currentPokemon, MON_DATA_IS_EGG) && GetEvolutionTargetSpecies(currentPokemon, 3, item) != SPECIES_NONE) - return FALSE; - DisplayPartyPokemonSelectData(slot, 0); - break; + DisplayPartyPokemonSelectData(slot, 0); + break; } } return TRUE; } -void DisplayPartyPokemonSelectToTeachMove(u8 slot, u16 item, u8 tutor) +static void DisplayPartyPokemonSelectToTeachMove(u8 slot, u16 item, u8 tutor) { - switch (CanPartyPokemonLearnTMTutor(&gPlayerParty[slot], item, tutor)) + switch (CanMonLearnTMTutor(&gPlayerParty[slot], item, tutor)) { - case CANNOT_LEARN_MOVE: - case CANNOT_LEARN_MOVE_IS_EGG: - DisplayPartyPokemonSelectData(slot, 9); - break; - case ALREADY_KNOWS_MOVE: - DisplayPartyPokemonSelectData(slot, 10); - break; - default: - DisplayPartyPokemonSelectData(slot, 8); - break; + case CANNOT_LEARN_MOVE: + case CANNOT_LEARN_MOVE_IS_EGG: + DisplayPartyPokemonSelectData(slot, 9); + break; + case ALREADY_KNOWS_MOVE: + DisplayPartyPokemonSelectData(slot, 10); + break; + default: + DisplayPartyPokemonSelectData(slot, 8); + break; } } -void sub_81B0CEC(u8 slot) +static void sub_81B0CEC(u8 slot) { struct Struct203CEDC *structPtr = &gUnknown_0203CEDC[slot]; u8 actualSlot = slot - 3; - + if (gUnknown_02022FF8[actualSlot].species == SPECIES_NONE) { sub_81B2720(structPtr->windowId); @@ -1006,7 +2082,7 @@ void sub_81B0CEC(u8 slot) } } -bool8 RenderPartyMenuBoxes(void) +static bool8 RenderPartyMenuBoxes(void) { RenderPartyMenuBox(gUnknown_0203CEC4->data[0]); if (++gUnknown_0203CEC4->data[0] == 6) @@ -1014,20 +2090,20 @@ bool8 RenderPartyMenuBoxes(void) return FALSE; } -u8* GetPartyMiscGraphicsTile(u16 tileId) +static u8* GetPartyMiscGraphicsTile(u16 tileId) { return &gUnknown_0203CEE0[tileId << 5]; } -void party_menu_add_per_mon_objects_internal(u8 slot) +static void party_menu_add_per_mon_objects_internal(u8 slot) { u8 actualSlot; - + if (gUnknown_0203CEC8.unk8_0 == 5 && slot > 2) { u8 status; actualSlot = slot - 3; - + if (gUnknown_02022FF8[actualSlot].species != SPECIES_NONE) { party_menu_link_mon_icon_anim(gUnknown_02022FF8[actualSlot].species, gUnknown_02022FF8[actualSlot].personality, &gUnknown_0203CEDC[slot], 0, 0); @@ -1049,7 +2125,7 @@ void party_menu_add_per_mon_objects_internal(u8 slot) } } -bool8 party_menu_add_per_mon_objects(void) +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) @@ -1057,7 +2133,7 @@ bool8 party_menu_add_per_mon_objects(void) return FALSE; } -void sub_81B0F28(void) +static void sub_81B0F28(void) { if (gUnknown_0203CEC8.unk8_0 == 5) { @@ -1082,48 +2158,48 @@ void sub_81B0F28(void) void sub_81B0FCC(u8 slot, u8 b) { u8 spriteId; - + switch (slot) { - default: - if (GetMonData(&gPlayerParty[slot], MON_DATA_SPECIES) != SPECIES_NONE) - { - UpdateSelectedPartyBox(&gUnknown_0203CEDC[slot], GetPartyBoxPalBitfield(slot, b)); - AnimateSelectedPartyIcon(gUnknown_0203CEDC[slot].unk9, b); - sub_81B5F98(gUnknown_0203CEDC[slot].unkB, b); - } - return; - case 6: + default: + if (GetMonData(&gPlayerParty[slot], MON_DATA_SPECIES) != SPECIES_NONE) + { + UpdateSelectedPartyBox(&gUnknown_0203CEDC[slot], GetPartyBoxPalBitfield(slot, b)); + AnimateSelectedPartyIcon(gUnknown_0203CEDC[slot].unk9, b); + sub_81B5F98(gUnknown_0203CEDC[slot].unkB, b); + } + return; + case 6: + if (b == 0) + sub_8199C30(1, 23, 16, 7, 2, 1); + else + sub_8199C30(1, 23, 16, 7, 2, 2); + spriteId = gUnknown_0203CEC4->unk8_2; + break; + case 7: + if (!gUnknown_0203CEC4->unk8_0) + { if (b == 0) - sub_8199C30(1, 23, 16, 7, 2, 1); + sub_8199C30(1, 23, 17, 7, 2, 1); else - sub_8199C30(1, 23, 16, 7, 2, 2); - spriteId = gUnknown_0203CEC4->unk8_2; - break; - case 7: - if (!gUnknown_0203CEC4->unk8_0) - { - if (b == 0) - sub_8199C30(1, 23, 17, 7, 2, 1); - else - sub_8199C30(1, 23, 17, 7, 2, 2); - } - else if (b == 0) - { - sub_8199C30(1, 23, 18, 7, 2, 1); - } - else - { - sub_8199C30(1, 23, 18, 7, 2, 2); - } - spriteId = gUnknown_0203CEC4->unk9_0; - break; + sub_8199C30(1, 23, 17, 7, 2, 2); + } + else if (b == 0) + { + sub_8199C30(1, 23, 18, 7, 2, 1); + } + else + { + sub_8199C30(1, 23, 18, 7, 2, 2); + } + spriteId = gUnknown_0203CEC4->unk9_0; + break; } sub_81B5F98(spriteId, b); schedule_bg_copy_tilemap_to_vram(1); } -u8 GetPartyBoxPalBitfield(u8 slot, u8 b) +static u8 GetPartyBoxPalBitfield(u8 slot, u8 b) { u8 returnVar = 0; if (b == 1) @@ -1141,22 +2217,22 @@ u8 GetPartyBoxPalBitfield(u8 slot, u8 b) } if (gUnknown_0203CEC8.unkB == 10 && slot == gUnknown_0203CEC8.unk9 ) returnVar |= 32; - + return returnVar; } -bool8 PartyBoxPal_ParnterOrDisqualifiedInArena(u8 slot) +static bool8 PartyBoxPal_ParnterOrDisqualifiedInArena(u8 slot) { if (gUnknown_0203CEC8.mode == 2 && (slot == 1 || slot == 4 || slot == 5)) return TRUE; - + if (slot < 3 && (gBattleTypeFlags & BATTLE_TYPE_ARENA) && gMain.inBattle && (gBattleStruct->arenaLostPlayerMons >> sub_81B8F38(slot) & 1)) return TRUE; - + return FALSE; } -void sub_81B120C(void) +static void sub_81B120C(void) { CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_086157C4, 23, 16, 7, 2, 17); CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_086157E0, 23, 18, 7, 2, 17); @@ -1165,40 +2241,41 @@ void sub_81B120C(void) bool8 IsMultiBattle(void) { - if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI)) == (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI) && gMain.inBattle) + if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattleTypeFlags & BATTLE_TYPE_TRAINER && gMain.inBattle) return TRUE; - return FALSE; + else + return FALSE; } -void sub_81B1288(struct Pokemon *partySlot, struct Pokemon *pokemon) +static void sub_81B1288(struct Pokemon *partySlot, struct Pokemon *pokemon) { struct Pokemon *temp = Alloc(sizeof(struct Pokemon)); - + *temp = *partySlot; *partySlot = *pokemon; *pokemon = *temp; - + Free(temp); } -void sub_81B12C0(u8 taskId) +static void sub_81B12C0(u8 taskId) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = c3_0811FAB4; } -void c3_0811FAB4(u8 taskId) +static void c3_0811FAB4(u8 taskId) { if (!gPaletteFade.active) { if (gUnknown_0203CEC8.unk8_0 == 1) sub_81B9080(); - + if (gUnknown_0203CEC4->exitCallback != NULL) SetMainCallback2(gUnknown_0203CEC4->exitCallback); else SetMainCallback2(gUnknown_0203CEC8.exitCallback); - + ResetSpriteData(); FreePartyPointers(); DestroyTask(taskId); @@ -1220,33 +2297,34 @@ void sub_81B1370(u8 taskId) if (!gPaletteFade.active && sub_81221EC() != TRUE) { s8 *ptr = sub_81B13EC(); - + switch (PartyMenuButtonHandler(ptr)) { - case 1: - sub_81B140C(taskId, ptr); - break; - case 2: - sub_81B15D0(taskId, ptr); - break; - case 8: - if (gUnknown_0203CEC4->unk8_0) - { - PlaySE(SE_SELECT); - sub_81B4F88(); - } + case 1: + sub_81B140C(taskId, ptr); + break; + case 2: + sub_81B15D0(taskId, ptr); + break; + case 8: + if (gUnknown_0203CEC4->unk8_0) + { + PlaySE(SE_SELECT); + sub_81B4F88(); + } + break; } } } -s8* sub_81B13EC(void) +static s8* sub_81B13EC(void) { if (gUnknown_0203CEC8.unkB == 8 || gUnknown_0203CEC8.unkB == 10) return &gUnknown_0203CEC8.unkA; return &gUnknown_0203CEC8.unk9; } -void sub_81B140C(u8 taskId, s8 *ptr) +static void sub_81B140C(u8 taskId, s8 *ptr) { if (*ptr == 6) { @@ -1256,73 +2334,73 @@ void sub_81B140C(u8 taskId, s8 *ptr) { switch (gUnknown_0203CEC8.unkB - 3) { - case 7: - if (sub_81B15A4((u8*)ptr)) - { - sub_81B302C(&gUnknown_0203CEC4->unkC[1]); - sub_81615A8(taskId); - } - break; - case 0: - if (sub_81B15A4((u8*)ptr)) - { - if (gUnknown_0203CEC8.unk8_0 == 1) - gUnknown_0203CEC4->exitCallback = sub_81B9140; - - sub_81B302C(&gUnknown_0203CEC4->unkC[1]); - gUnknown_03006328(taskId, sub_81B6794); - } - break; - case 9: - if (sub_81B15A4((u8*)ptr)) - { - PlaySE(SE_SELECT); - sub_81B302C(&gUnknown_0203CEC4->unkC[1]); - sub_81B7E4C(taskId); - } - break; - case 4: - if (sub_81B15A4((u8*)ptr)) - { - PlaySE(SE_SELECT); - sub_81B302C(&gUnknown_0203CEC4->unkC[1]); - sub_81B8474(taskId); - } - break; - case 2: - case 3: - if (sub_81B15A4((u8*)ptr)) - { - PlaySE(SE_SELECT); - sub_81B302C(&gUnknown_0203CEC4->unkC[1]); - sub_81B7FAC(taskId); - } - break; - case 5: + case 7: + if (sub_81B15A4((u8*)ptr)) + { + sub_81B302C(&gUnknown_0203CEC4->unkC[1]); + sub_81615A8(taskId); + } + break; + case 0: + if (sub_81B15A4((u8*)ptr)) + { + if (gUnknown_0203CEC8.unk8_0 == 1) + gUnknown_0203CEC4->exitCallback = sub_81B9140; + + sub_81B302C(&gUnknown_0203CEC4->unkC[1]); + gUnknown_03006328(taskId, sub_81B6794); + } + break; + case 9: + if (sub_81B15A4((u8*)ptr)) + { PlaySE(SE_SELECT); - sub_81B3938(taskId); - break; - case 8: + sub_81B302C(&gUnknown_0203CEC4->unkC[1]); + sub_81B7E4C(taskId); + } + break; + case 4: + if (sub_81B15A4((u8*)ptr)) + { PlaySE(SE_SELECT); - sub_81B12C0(taskId); - break; - case 10: - if (sub_81B15A4((u8*)ptr)) - { - sub_81B21AC(taskId, (u8)*ptr); - } - break; - default: - case 1: - case 6: + sub_81B302C(&gUnknown_0203CEC4->unkC[1]); + sub_81B8474(taskId); + } + break; + case 2: + case 3: + if (sub_81B15A4((u8*)ptr)) + { PlaySE(SE_SELECT); - sub_81B36FC(taskId); - break; + sub_81B302C(&gUnknown_0203CEC4->unkC[1]); + sub_81B7FAC(taskId); + } + break; + case 5: + PlaySE(SE_SELECT); + sub_81B3938(taskId); + break; + case 8: + PlaySE(SE_SELECT); + sub_81B12C0(taskId); + break; + case 10: + if (sub_81B15A4((u8*)ptr)) + { + sub_81B21AC(taskId, (u8)*ptr); + } + break; + default: + case 1: + case 6: + PlaySE(SE_SELECT); + sub_81B36FC(taskId); + break; } } } -bool8 sub_81B15A4(u8 *slotPtr) +static bool8 sub_81B15A4(u8 *slotPtr) { if (GetMonData(&gPlayerParty[*slotPtr], MON_DATA_IS_EGG) == TRUE) { @@ -1332,48 +2410,48 @@ bool8 sub_81B15A4(u8 *slotPtr) return TRUE; } -void sub_81B15D0(u8 taskId, s8 *ptr) +static void sub_81B15D0(u8 taskId, s8 *ptr) { switch (gUnknown_0203CEC8.unkB) { - case 1: - PlaySE(SE_HAZURE); - break; - case 8: - case 10: - PlaySE(SE_SELECT); - sub_81B407C(taskId); - break; - case 13: - PlaySE(SE_SELECT); - sub_81B2210(taskId); - break; - default: - PlaySE(SE_SELECT); - if (sub_81B1660(taskId) != TRUE) - { - if (!sub_81221AC()) - gSpecialVar_0x8004 = 7; - gUnknown_0203CEE8 = 0; - *ptr = 7; - sub_81B12C0(taskId); - } - break; + case 1: + PlaySE(SE_HAZURE); + break; + case 8: + case 10: + PlaySE(SE_SELECT); + sub_81B407C(taskId); + break; + case 13: + PlaySE(SE_SELECT); + sub_81B2210(taskId); + break; + default: + PlaySE(SE_SELECT); + if (sub_81B1660(taskId) != TRUE) + { + if (!sub_81221AC()) + gSpecialVar_0x8004 = 7; + gUnknown_0203CEE8 = 0; + *ptr = 7; + sub_81B12C0(taskId); + } + break; } -} +} -bool8 sub_81B1660(u8 taskId) +static bool8 sub_81B1660(u8 taskId) { const u8* stringPtr = NULL; - + if (gUnknown_0203CEC8.unk8_0 == 2) stringPtr = gText_CancelParticipation; else if (gUnknown_0203CEC8.unk8_0 == 4) stringPtr = sub_81B88BC(); - + if (stringPtr == NULL) return FALSE; - + sub_81B302C(&gUnknown_0203CEC4->unkC[1]); StringExpandPlaceholders(gStringVar4, stringPtr); sub_81B1B5C(gStringVar4, 1); @@ -1381,7 +2459,7 @@ bool8 sub_81B1660(u8 taskId) return TRUE; } -void sub_81B16D4(u8 taskId) +static void sub_81B16D4(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -1390,82 +2468,83 @@ void sub_81B16D4(u8 taskId) } } -void sub_81B1708(u8 taskId) +static void sub_81B1708(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - gUnknown_0203CEE8 = 0; - gUnknown_0203CEC8.unk9 = 7; - sub_81B8558(); - sub_81B12C0(taskId); - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - case 1: - sub_81B1C1C(taskId); - break; + case 0: + gUnknown_0203CEE8 = 0; + gUnknown_0203CEC8.unk9 = 7; + sub_81B8558(); + sub_81B12C0(taskId); + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + case 1: + sub_81B1C1C(taskId); + break; } } -u16 PartyMenuButtonHandler(s8 *ptr) +static u16 PartyMenuButtonHandler(s8 *ptr) { s8 movementDir; - + switch (gMain.newAndRepeatedKeys) { - case DPAD_UP: + case DPAD_UP: + movementDir = -1; + break; + case DPAD_DOWN: + movementDir = 1; + break; + case DPAD_LEFT: + movementDir = -2; + break; + case DPAD_RIGHT: + movementDir = 2; + break; + default: + switch (sub_812210C()) + { + case 1: movementDir = -1; break; - case DPAD_DOWN: + case 2: movementDir = 1; break; - case DPAD_LEFT: - movementDir = -2; - break; - case DPAD_RIGHT: - movementDir = 2; - break; default: - switch (sub_812210C()) - { - case 1: - movementDir = -1; - break; - case 2: - movementDir = 1; - break; - default: - movementDir = 0; - break; - } + movementDir = 0; + break; + } + break; } - + if (gMain.newKeys & START_BUTTON) return 8; - + if (movementDir) { UpdateCurrentPartySelection(ptr, movementDir); return 0; } - + if ((gMain.newKeys & A_BUTTON) && *ptr == 7) return 2; - + return gMain.newKeys & (A_BUTTON | B_BUTTON); } -#ifdef NONMATCHING -void UpdateCurrentPartySelection(s8 *ptr, s8 movementDir) +static void UpdateCurrentPartySelection(s8 *ptr, s8 movementDir) { s8 slot = *ptr; - - if (gUnknown_0203CEC8.mode == 0) + u8 mode = gUnknown_0203CEC8.mode; + + if (mode == 0) SetNewPartySelectTarget1(ptr, movementDir); else SetNewPartySelectTarget2(ptr, movementDir); - + if (*ptr != slot) { PlaySE(SE_SELECT); @@ -1473,590 +2552,168 @@ void UpdateCurrentPartySelection(s8 *ptr, s8 movementDir) sub_81B0FCC(*ptr, 1); } } -#else -NAKED -void UpdateCurrentPartySelection(s8 *ptr, s8 b) -{ - asm_unified("push {r4,r5,lr}\n\ - adds r5, r0, 0\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - ldrb r4, [r5]\n\ - ldr r0, =gUnknown_0203CEC8\n\ - ldrb r0, [r0, 0x8]\n\ - lsls r0, 26\n\ - lsrs r0, 30\n\ - cmp r0, 0\n\ - bne _081B1820\n\ - lsls r1, 24\n\ - asrs r1, 24\n\ - adds r0, r5, 0\n\ - bl SetNewPartySelectTarget1\n\ - b _081B182A\n\ - .pool\n\ -_081B1820:\n\ - lsls r1, 24\n\ - asrs r1, 24\n\ - adds r0, r5, 0\n\ - bl SetNewPartySelectTarget2\n\ -_081B182A:\n\ - movs r1, 0\n\ - ldrsb r1, [r5, r1]\n\ - lsls r4, 24\n\ - asrs r0, r4, 24\n\ - cmp r1, r0\n\ - beq _081B184C\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - lsrs r0, r4, 24\n\ - movs r1, 0\n\ - bl sub_81B0FCC\n\ - ldrb r0, [r5]\n\ - movs r1, 0x1\n\ - bl sub_81B0FCC\n\ -_081B184C:\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n"); -} -#endif -#ifdef NONMATCHING -void SetNewPartySelectTarget1(s8 *ptr, s8 b) +static void SetNewPartySelectTarget1(s8 *ptr, s8 b) { - u8 r0r2; - switch (b) { - case -1: - r0r2 = *ptr; - if (*ptr == 0) - { - *ptr = 7; - } - else if (*ptr == 6) - { + case -1: + if (*ptr == 0) + { + *ptr = 7; + } + else if (*ptr == 6) + { + *ptr = gPlayerPartyCount - 1; + } + else if (*ptr == 7) + { + if (gUnknown_0203CEC4->unk8_0) + *ptr = 6; + else *ptr = gPlayerPartyCount - 1; - } - else if (*ptr == 7) + } + else + { + (*ptr)--; + } + break; + case 1: + if (*ptr == 7) + { + *ptr = 0; + } + else + { + if (*ptr == gPlayerPartyCount - 1) { if (gUnknown_0203CEC4->unk8_0) *ptr = 6; else - *ptr = gPlayerPartyCount - 1; + *ptr = 7; } else { - *ptr = r0r2 - 1; - } - break; - case 1: - r0r2 = *ptr; - if (*ptr != 7) - { - if ((u32)*ptr == gPlayerPartyCount - 1) - { - if (gUnknown_0203CEC4->unk8_0) - *ptr = 6; - else - *ptr = 7; - } - else - { - *ptr = r0r2 + 1; - } + (*ptr)++; } + } + break; + case 2: + if (gPlayerPartyCount != 1 && *ptr == 0) + { + if (gUnknown_0203CEC4->unk8_1 == 0) + *ptr = 1; else - { - *ptr = 0; - } - break; - case 2: - if (gPlayerPartyCount != 1 && *ptr == 0) - { - if (gUnknown_0203CEC4->unk8_1 == 0) - *ptr = 1; - else - *ptr = gUnknown_0203CEC4->unk8_1; - } - break; - case -2: - if (*ptr != 0 && *ptr != 6 && *ptr != 7) - { - gUnknown_0203CEC4->unk8_1 = *ptr; - *ptr = 0; - } - break; + *ptr = gUnknown_0203CEC4->unk8_1; + } + break; + case -2: + if (*ptr != 0 && *ptr != 6 && *ptr != 7) + { + gUnknown_0203CEC4->unk8_1 = *ptr; + *ptr = 0; + } + break; } } -#else -NAKED -void SetNewPartySelectTarget1(s8 *ptr, s8 b) -{ - asm_unified("push {r4,lr}\n\ - adds r4, r0, 0\n\ - lsls r1, 24\n\ - asrs r1, 24\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - cmp r1, r0\n\ - beq _081B187A\n\ - cmp r1, r0\n\ - bgt _081B1870\n\ - subs r0, 0x1\n\ - cmp r1, r0\n\ - beq _081B1924\n\ - b _081B1952\n\ -_081B1870:\n\ - cmp r1, 0x1\n\ - beq _081B18C0\n\ - cmp r1, 0x2\n\ - beq _081B18F8\n\ - b _081B1952\n\ -_081B187A:\n\ - ldrb r0, [r4]\n\ - movs r1, 0\n\ - ldrsb r1, [r4, r1]\n\ - cmp r1, 0\n\ - bne _081B1888\n\ - movs r0, 0x7\n\ - b _081B1950\n\ -_081B1888:\n\ - cmp r1, 0x6\n\ - bne _081B1898\n\ - ldr r0, =gPlayerPartyCount\n\ - ldrb r0, [r0]\n\ - subs r0, 0x1\n\ - b _081B1950\n\ - .pool\n\ -_081B1898:\n\ - cmp r1, 0x7\n\ - bne _081B18BC\n\ - ldr r0, =gUnknown_0203CEC4\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x8]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _081B18B0\n\ - movs r0, 0x6\n\ - b _081B1950\n\ - .pool\n\ -_081B18B0:\n\ - ldr r0, =gPlayerPartyCount\n\ - ldrb r0, [r0]\n\ - subs r0, 0x1\n\ - b _081B1950\n\ - .pool\n\ -_081B18BC:\n\ - subs r0, 0x1\n\ - b _081B1950\n\ -_081B18C0:\n\ - ldrb r2, [r4]\n\ - movs r0, 0\n\ - ldrsb r0, [r4, r0]\n\ - cmp r0, 0x7\n\ - beq _081B194E\n\ - movs r1, 0\n\ - ldrsb r1, [r4, r1]\n\ - ldr r0, =gPlayerPartyCount\n\ - ldrb r0, [r0]\n\ - subs r0, 0x1\n\ - cmp r1, r0\n\ - bne _081B18F4\n\ - ldr r0, =gUnknown_0203CEC4\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x8]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _081B18F0\n\ - movs r0, 0x6\n\ - b _081B1950\n\ - .pool\n\ -_081B18F0:\n\ - movs r0, 0x7\n\ - b _081B1950\n\ -_081B18F4:\n\ - adds r0, r2, 0x1\n\ - b _081B1950\n\ -_081B18F8:\n\ - ldr r0, =gPlayerPartyCount\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1\n\ - beq _081B1952\n\ - movs r0, 0\n\ - ldrsb r0, [r4, r0]\n\ - cmp r0, 0\n\ - bne _081B1952\n\ - ldr r0, =gUnknown_0203CEC4\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x8]\n\ - lsls r0, 28\n\ - lsrs r0, 29\n\ - cmp r0, 0\n\ - bne _081B1950\n\ - movs r0, 0x1\n\ - b _081B1950\n\ - .pool\n\ -_081B1924:\n\ - movs r0, 0\n\ - ldrsb r0, [r4, r0]\n\ - cmp r0, 0\n\ - beq _081B1952\n\ - cmp r0, 0x6\n\ - beq _081B1952\n\ - cmp r0, 0x7\n\ - beq _081B1952\n\ - ldr r0, =gUnknown_0203CEC4\n\ - ldr r3, [r0]\n\ - movs r1, 0\n\ - ldrsb r1, [r4, r1]\n\ - movs r0, 0x7\n\ - ands r1, r0\n\ - lsls r1, 1\n\ - ldrb r2, [r3, 0x8]\n\ - movs r0, 0xF\n\ - negs r0, r0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r3, 0x8]\n\ -_081B194E:\n\ - movs r0, 0\n\ -_081B1950:\n\ - strb r0, [r4]\n\ -_081B1952:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n"); -} -#endif -#ifdef NONMATCHING -void SetNewPartySelectTarget2(s8 *ptr, s8 b) +static void SetNewPartySelectTarget2(s8 *ptr, s8 b) { - u8 unk; s8 unk2 = b; - u8 unk3; - + switch (b) { - case -1: - unk = *ptr; - if (*ptr == 0) - { - *ptr = 7; - } - else if (*ptr == 6) + case -1: + if (*ptr == 0) + { + *ptr = 7; + break; + } + else if (*ptr == 6) + { + *ptr = gPlayerPartyCount - 1; + break; + } + else if (*ptr == 7) + { + if (gUnknown_0203CEC4->unk8_0) { - *ptr = gPlayerPartyCount - 1; + *ptr = 6; + break; } - else if (*ptr == 7) + (*ptr)--; + } + unk2 = sub_81B1B00(*ptr, unk2); + if (unk2 != -1) + *ptr = unk2; + break; + case 1: + if (*ptr == 6) + { + *ptr = 7; + } + else if (*ptr == 7) + { + *ptr = 0; + } + else + { + unk2 = sub_81B1B00(*ptr, 1); + if (unk2 == -1) { if (gUnknown_0203CEC4->unk8_0) - { *ptr = 6; - } else - { - *ptr = unk - 1; - unk2 = sub_81B1B00(*ptr, unk2); - if (unk2 != -1) - *ptr = unk2; - } - } - else - { - unk2 = sub_81B1B00(*ptr, unk2); - if (unk2 != -1) - *ptr = unk2; - } - break; - case 1: - if (*ptr == 6) - { - *ptr = 7; - } - else if (*ptr == 7) - { - *ptr = 0; + *ptr = 7; } else { - unk2 = sub_81B1B00(*ptr, 1); - if (unk2 == -1) - { - if (gUnknown_0203CEC4->unk8_0) - *ptr = 6; - else - *ptr = 7; - } - else - { - *ptr = unk2; - } + *ptr = unk2; } - break; - case 2: - if (*ptr == 0) + } + break; + case 2: + if (*ptr == 0) + { + if (gUnknown_0203CEC4->unk8_1 == 3) { - if (gUnknown_0203CEC4->unk8_1 == 3) - { - if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES) != SPECIES_NONE) - *ptr = 3; - } - else if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES) != SPECIES_NONE) - { - *ptr = 2; - } + if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES) != SPECIES_NONE) + *ptr = 3; } - else if (*ptr == 1) + else if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES) != SPECIES_NONE) { - if (gUnknown_0203CEC4->unk8_1 == 5) - { - if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES) != SPECIES_NONE) - *ptr = 5; - } - else if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES) != SPECIES_NONE) - { - *ptr = 4; - } + *ptr = 2; } - break; - case -2: - unk3 = *ptr - 2; - if (unk3 <= 1) + } + else if (*ptr == 1) + { + if (gUnknown_0203CEC4->unk8_1 == 5) { - gUnknown_0203CEC4->unk8_1 = *ptr; - *ptr = 0; + if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES) != SPECIES_NONE) + *ptr = 5; } - else + else if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES) != SPECIES_NONE) { - unk3 = *ptr - 4; - if (unk3 <= 1) - { - gUnknown_0203CEC4->unk8_1 = *ptr; - *ptr = 1; - } + *ptr = 4; } - break; + } + break; + case -2: + if (*ptr == 2 || *ptr == 3) + { + gUnknown_0203CEC4->unk8_1 = *ptr; + *ptr = 0; + } + else if (*ptr == 4 || *ptr == 5) + { + gUnknown_0203CEC4->unk8_1 = *ptr; + *ptr = 1; + } + break; } } -#else -NAKED -void SetNewPartySelectTarget2(s8 *ptr, s8 b) -{ - asm_unified("push {r4-r6,lr}\n\ - adds r4, r0, 0\n\ - lsls r1, 24\n\ - lsrs r2, r1, 24\n\ - asrs r5, r1, 24\n\ - movs r6, 0x1\n\ - negs r6, r6\n\ - cmp r5, r6\n\ - beq _081B1988\n\ - cmp r5, r6\n\ - bgt _081B197E\n\ - movs r0, 0x2\n\ - negs r0, r0\n\ - cmp r5, r0\n\ - bne _081B197C\n\ - b _081B1A9C\n\ -_081B197C:\n\ - b _081B1AF4\n\ -_081B197E:\n\ - cmp r5, 0x1\n\ - beq _081B19E4\n\ - cmp r5, 0x2\n\ - beq _081B1A24\n\ - b _081B1AF4\n\ -_081B1988:\n\ - ldrb r1, [r4]\n\ - movs r0, 0\n\ - ldrsb r0, [r4, r0]\n\ - cmp r0, 0\n\ - bne _081B1996\n\ - movs r0, 0x7\n\ - b _081B1AF2\n\ -_081B1996:\n\ - cmp r0, 0x6\n\ - bne _081B19A8\n\ - ldr r0, =gPlayerPartyCount\n\ - ldrb r0, [r0]\n\ - subs r0, 0x1\n\ - b _081B1AF2\n\ - .pool\n\ -_081B19A8:\n\ - cmp r0, 0x7\n\ - bne _081B19C4\n\ - ldr r0, =gUnknown_0203CEC4\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x8]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _081B19C0\n\ - movs r0, 0x6\n\ - b _081B1AF2\n\ - .pool\n\ -_081B19C0:\n\ - subs r0, r1, 0x1\n\ - strb r0, [r4]\n\ -_081B19C4:\n\ - movs r0, 0\n\ - ldrsb r0, [r4, r0]\n\ - lsls r1, r2, 24\n\ - asrs r1, 24\n\ - bl sub_81B1B00\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - asrs r0, 24\n\ - movs r1, 0x1\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - bne _081B19E0\n\ - b _081B1AF4\n\ -_081B19E0:\n\ - strb r2, [r4]\n\ - b _081B1AF4\n\ -_081B19E4:\n\ - movs r0, 0\n\ - ldrsb r0, [r4, r0]\n\ - cmp r0, 0x6\n\ - bne _081B19F0\n\ - movs r0, 0x7\n\ - b _081B1AF2\n\ -_081B19F0:\n\ - cmp r0, 0x7\n\ - bne _081B19F8\n\ - movs r0, 0\n\ - b _081B1AF2\n\ -_081B19F8:\n\ - movs r0, 0\n\ - ldrsb r0, [r4, r0]\n\ - movs r1, 0x1\n\ - bl sub_81B1B00\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, r6\n\ - bne _081B19E0\n\ - ldr r0, =gUnknown_0203CEC4\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x8]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _081B1A20\n\ - movs r0, 0x6\n\ - b _081B1AF2\n\ - .pool\n\ -_081B1A20:\n\ - movs r0, 0x7\n\ - b _081B1AF2\n\ -_081B1A24:\n\ - movs r0, 0\n\ - ldrsb r0, [r4, r0]\n\ - cmp r0, 0\n\ - bne _081B1A5C\n\ - ldr r0, =gUnknown_0203CEC4\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x8]\n\ - lsls r0, 28\n\ - lsrs r6, r0, 29\n\ - cmp r6, 0x3\n\ - bne _081B1A54\n\ - ldr r0, =gPlayerParty + 300\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _081B1AF4\n\ - strb r6, [r4]\n\ - b _081B1AF4\n\ - .pool\n\ -_081B1A54:\n\ - ldr r0, =gPlayerParty + 200\n\ - b _081B1A70\n\ - .pool\n\ -_081B1A5C:\n\ - cmp r0, 0x1\n\ - bne _081B1AF4\n\ - ldr r0, =gUnknown_0203CEC4\n\ - ldr r0, [r0]\n\ - ldrb r0, [r0, 0x8]\n\ - lsls r0, 28\n\ - lsrs r5, r0, 29\n\ - cmp r5, 0x5\n\ - bne _081B1A88\n\ - ldr r0, =gPlayerParty + 500\n\ -_081B1A70:\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _081B1AF4\n\ - strb r5, [r4]\n\ - b _081B1AF4\n\ - .pool\n\ -_081B1A88:\n\ - ldr r0, =gPlayerParty + 400\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _081B1AF4\n\ - movs r0, 0x4\n\ - b _081B1AF2\n\ - .pool\n\ -_081B1A9C:\n\ - ldrb r1, [r4]\n\ - subs r0, r1, 0x2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bhi _081B1ACC\n\ - ldr r0, =gUnknown_0203CEC4\n\ - ldr r3, [r0]\n\ - movs r1, 0\n\ - ldrsb r1, [r4, r1]\n\ - movs r0, 0x7\n\ - ands r1, r0\n\ - lsls r1, 1\n\ - ldrb r2, [r3, 0x8]\n\ - movs r0, 0xF\n\ - negs r0, r0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r3, 0x8]\n\ - movs r0, 0\n\ - b _081B1AF2\n\ - .pool\n\ -_081B1ACC:\n\ - subs r0, r1, 0x4\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bhi _081B1AF4\n\ - ldr r0, =gUnknown_0203CEC4\n\ - ldr r3, [r0]\n\ - movs r1, 0\n\ - ldrsb r1, [r4, r1]\n\ - movs r0, 0x7\n\ - ands r1, r0\n\ - lsls r1, 1\n\ - ldrb r2, [r3, 0x8]\n\ - movs r0, 0xF\n\ - negs r0, r0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r3, 0x8]\n\ - movs r0, 0x1\n\ -_081B1AF2:\n\ - strb r0, [r4]\n\ -_081B1AF4:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n"); -} -#endif -s8 sub_81B1B00(s8 a, s8 b) +static s8 sub_81B1B00(s8 a, s8 b) { while (TRUE) { @@ -2077,14 +2734,14 @@ u8* GetMonNickname(struct Pokemon *mon, u8 *dest) u8 sub_81B1B5C(const u8* str, u8 b) { u8 taskId; - + sub_81B3300(str); taskId = CreateTask(sub_81B1B8C, 1); gTasks[taskId].data[0] = b; return taskId; } -void sub_81B1B8C(u8 taskId) +static void sub_81B1B8C(u8 taskId) { if (RunTextPrintersRetIsActive(6) != TRUE) { @@ -2102,7 +2759,7 @@ bool8 sub_81B1BD4(void) return FuncIsActiveTask(sub_81B1B8C); } -void sub_81B1BE8(u8 taskId) +static void sub_81B1BE8(u8 taskId) { if (sub_81221EC() != TRUE) { @@ -2111,7 +2768,7 @@ void sub_81B1BE8(u8 taskId) } } -void sub_81B1C1C(u8 taskId) +static void sub_81B1C1C(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -2129,7 +2786,7 @@ void sub_81B1C1C(u8 taskId) } } -void sub_81B1C84(struct Pokemon *mon, u16 item, u8 c, u8 unused) +static void sub_81B1C84(struct Pokemon *mon, u16 item, u8 c, u8 unused) { GetMonNickname(mon, gStringVar1); CopyItemName(item, gStringVar2); @@ -2138,7 +2795,7 @@ void sub_81B1C84(struct Pokemon *mon, u16 item, u8 c, u8 unused) schedule_bg_copy_tilemap_to_vram(2); } -void sub_81B1CD0(struct Pokemon *mon, u16 item, u8 c) +static void sub_81B1CD0(struct Pokemon *mon, u16 item, u8 c) { GetMonNickname(mon, gStringVar1); CopyItemName(item, gStringVar2); @@ -2147,7 +2804,7 @@ void sub_81B1CD0(struct Pokemon *mon, u16 item, u8 c) schedule_bg_copy_tilemap_to_vram(2); } -void sub_81B1D1C(struct Pokemon *mon, u16 item, u8 c) +static void sub_81B1D1C(struct Pokemon *mon, u16 item, u8 c) { GetMonNickname(mon, gStringVar1); CopyItemName(item, gStringVar2); @@ -2156,7 +2813,7 @@ void sub_81B1D1C(struct Pokemon *mon, u16 item, u8 c) schedule_bg_copy_tilemap_to_vram(2); } -void sub_81B1D68(u16 item, u16 item2, u8 c) +static void sub_81B1D68(u16 item, u16 item2, u8 c) { CopyItemName(item, gStringVar1); CopyItemName(item2, gStringVar2); @@ -2165,10 +2822,10 @@ void sub_81B1D68(u16 item, u16 item2, u8 c) schedule_bg_copy_tilemap_to_vram(2); } -void sub_81B1DB8(struct Pokemon *mon, u16 item) +static void sub_81B1DB8(struct Pokemon *mon, u16 item) { u8 itemBytes[2]; - + if (ItemIsMail(item) == TRUE) { if (GiveMailToMon(mon, item) == 0xFF) @@ -2179,29 +2836,29 @@ void sub_81B1DB8(struct Pokemon *mon, u16 item) SetMonData(mon, MON_DATA_HELD_ITEM, itemBytes); } -u8 sub_81B1E00(struct Pokemon* mon) +static u8 sub_81B1E00(struct Pokemon* mon) { u16 item = GetMonData(mon, MON_DATA_HELD_ITEM); - + if (item == ITEM_NONE) return 0; if (AddBagItem(item, 1) == FALSE) return 1; - + item = ITEM_NONE; SetMonData(mon, MON_DATA_HELD_ITEM, &item); return 2; } -void pokemon_item_not_removed(u16 itemUnused) +static void pokemon_item_not_removed(u16 itemUnused) { StringExpandPlaceholders(gStringVar4, gText_BagFullCouldNotRemoveItem); } -void sub_81B1E60(u8 taskId) +static void sub_81B1E60(u8 taskId) { s16 *data = gTasks[taskId].data; - + data[0] += data[2]; data[3]--; SetMonData(&gPlayerParty[data[4]], MON_DATA_HP, &data[0]); @@ -2219,7 +2876,7 @@ void sub_81B1F18(u8 taskId, u8 slot, s8 c, s16 HPDifference, TaskFunc func) { struct Pokemon *mon = &gPlayerParty[slot]; s16 *data = gTasks[taskId].data; - + data[0] = GetMonData(mon, MON_DATA_HP); data[1] = GetMonData(mon, MON_DATA_MAX_HP); data[2] = c; @@ -2229,10 +2886,10 @@ void sub_81B1F18(u8 taskId, u8 slot, s8 c, s16 HPDifference, TaskFunc func) SetTaskFuncWithFollowupFunc(taskId, sub_81B1E60, func); } -void sub_81B1FA8(u8 taskId, u8 b, u32 hp) +static void sub_81B1FA8(u8 taskId, u8 b, u32 hp) { s16 *data = gTasks[taskId].data; - + switch (b) // only case 0 is used { case 0: @@ -2275,7 +2932,7 @@ u8 pokemon_ailments_get_primary(u32 status) u8 sub_81B205C(struct Pokemon *mon) { u8 ailment; - + if (GetMonData(mon, MON_DATA_HP) == 0) return AILMENT_FNT; ailment = pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS)); @@ -2286,14 +2943,14 @@ u8 sub_81B205C(struct Pokemon *mon) return AILMENT_NONE; } -void sub_81B209C(void) +static void sub_81B209C(void) { u16 *ptr; - + if (gUnknown_0203CEC8.unk8_0 == 11) { u8 i; - + ptr = &gUnknown_0203CEC8.unkE; gUnknown_0203CEC8.unkE = 0; if (gSpecialVar_0x8005 == 0) @@ -2309,7 +2966,7 @@ void sub_81B209C(void) } } -bool16 sub_81B2134(struct Pokemon *mon) +static bool16 sub_81B2134(struct Pokemon *mon) { if (GetMonData(mon, MON_DATA_IS_EGG) != TRUE && sub_802C908(GetMonData(mon, MON_DATA_SPECIES))) return TRUE; @@ -2318,21 +2975,21 @@ bool16 sub_81B2134(struct Pokemon *mon) // Dodrio Berry Picking select? -bool16 sub_81B2164(struct Pokemon *mon) +static bool16 sub_81B2164(struct Pokemon *mon) { if (GetMonData(mon, MON_DATA_IS_EGG) != TRUE && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_DODRIO) return TRUE; return FALSE; } -bool8 sub_81B218C(u8 slot) +static bool8 sub_81B218C(u8 slot) { if (!((gUnknown_0203CEC8.unkE >> slot) & 1)) return FALSE; return TRUE; } -void sub_81B21AC(u8 taskId, u8 slot) +static void sub_81B21AC(u8 taskId, u8 slot) { if (sub_81B218C(slot) == TRUE) { @@ -2349,14 +3006,14 @@ void sub_81B21AC(u8 taskId, u8 slot) } } -void sub_81B2210(u8 taskId) +static void sub_81B2210(u8 taskId) { sub_81B1B5C(gText_CancelParticipation, 1); schedule_bg_copy_tilemap_to_vram(2); gTasks[taskId].func = sub_81B2248; } -void sub_81B2248(u8 taskId) +static void sub_81B2248(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -2365,28 +3022,29 @@ void sub_81B2248(u8 taskId) } } -void sub_81B227C(u8 taskId) +static void sub_81B227C(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - gSpecialVar_0x8004 = 7; - sub_81B12C0(taskId); - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - case 1: - gTasks[taskId].func = sub_81B1C1C; - break; + case 0: + gSpecialVar_0x8004 = 7; + sub_81B12C0(taskId); + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + case 1: + gTasks[taskId].func = sub_81B1C1C; + break; } } -u8 CanPartyPokemonLearnTMTutor(struct Pokemon *mon, u16 item, u8 tutor) +static u8 CanMonLearnTMTutor(struct Pokemon *mon, u16 item, u8 tutor) { u16 move; - + if (GetMonData(mon, MON_DATA_IS_EGG)) return CANNOT_LEARN_MOVE_IS_EGG; + if (item >= ITEM_TM01_FOCUS_PUNCH) { if (CanMonLearnTMHM(mon, item - ITEM_TM01_FOCUS_PUNCH)) @@ -2395,50 +3053,52 @@ u8 CanPartyPokemonLearnTMTutor(struct Pokemon *mon, u16 item, u8 tutor) return CANNOT_LEARN_MOVE; do {} while (0); // :morphon: } - else if (sub_81B2370(GetMonData(mon, MON_DATA_SPECIES), tutor) == FALSE) + else if (CanLearnTutorMove(GetMonData(mon, MON_DATA_SPECIES), tutor) == FALSE) { return CANNOT_LEARN_MOVE; } else { - move = sub_81B2360(tutor); + move = GetTutorMove(tutor); } - - if (pokemon_has_move(mon, move) == TRUE) + + if (MonKnowsMove(mon, move) == TRUE) return ALREADY_KNOWS_MOVE; - return CAN_LEARN_MOVE; + else + return CAN_LEARN_MOVE; } -u16 sub_81B2360(u8 tutor) +static u16 GetTutorMove(u8 tutor) { - return gUnknown_0861500C[tutor]; + return gTutorMoves[tutor]; } -bool8 sub_81B2370(u16 species, u8 tutor) +static bool8 CanLearnTutorMove(u16 species, u8 tutor) { - if (gUnknown_08615048[species] & (1 << tutor)) + if (sTutorLearnsets[species] & (1 << tutor)) return TRUE; - return FALSE; + else + return FALSE; } -void sub_81B239C(u8 a) +static void sub_81B239C(u8 a) { u8 i; - + switch (a) { - case 0: - InitWindows(gUnknown_08615810); - break; - case 1: - InitWindows(gUnknown_08615850); - break; - case 2: - InitWindows(gUnknown_08615890); - break; - default: - InitWindows(gUnknown_086158D0); - break; + case 0: + InitWindows(gUnknown_08615810); + break; + case 1: + InitWindows(gUnknown_08615850); + break; + case 2: + InitWindows(gUnknown_08615890); + break; + default: + InitWindows(gUnknown_086158D0); + break; } DeactivateAllTextPrinters(); for (i = 0; i < PARTY_SIZE; i++) @@ -2448,13 +3108,13 @@ void sub_81B239C(u8 a) LoadPalette(gUnknown_0860F074, 0xF0, 0x20); } -void sub_81B2428(bool8 a) +static void sub_81B2428(bool8 a) { u8 firstWindowId; u8 windowId; u8 offset; u8 mainOffset; - + if (gUnknown_0203CEC8.unk8_0 != 5) { if (a == TRUE) @@ -2490,16 +3150,16 @@ void sub_81B2428(bool8 a) } } -u16* GetPartyMenuPaletteFromBuffer(u8 paletteId) +static u16* GetPartyMenuPaletteFromBuffer(u8 paletteId) { return &gUnknown_0203CEC4->palBuffer[paletteId]; } -void BlitBitmapToPartyWindow(u8 windowId, u8 *b, u8 c, u8 x, u8 y, u8 width, u8 height) +static void BlitBitmapToPartyWindow(u8 windowId, const u8 *b, u8 c, u8 x, u8 y, u8 width, u8 height) { u8 *pixels = AllocZeroed(height * width * 32); u8 i, j; - + if (pixels != NULL) { for (i = 0; i < height; i++) @@ -2512,7 +3172,7 @@ void BlitBitmapToPartyWindow(u8 windowId, u8 *b, u8 c, u8 x, u8 y, u8 width, u8 } } -void BlitBitmapToPartyWindow_Default1(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 f) +static void BlitBitmapToPartyWindow_Default1(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 f) { if (width == 0 && height == 0) { @@ -2525,7 +3185,7 @@ void BlitBitmapToPartyWindow_Default1(u8 windowId, u8 x, u8 y, u8 width, u8 heig BlitBitmapToPartyWindow(windowId, gUnknown_086159CE, 10, x, y, width, height); } -void BlitBitmapToPartyWindow_Default2(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 f) +static void BlitBitmapToPartyWindow_Default2(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 f) { if (width == 0 && height == 0) { @@ -2538,15 +3198,15 @@ void BlitBitmapToPartyWindow_Default2(u8 windowId, u8 x, u8 y, u8 width, u8 heig BlitBitmapToPartyWindow(windowId, gUnknown_08615A4A, 18, x, y, width, height); } -void sub_81B2720(u8 windowId) +static void sub_81B2720(u8 windowId) { BlitBitmapToPartyWindow(windowId, gUnknown_08615A80, 18, 0, 0, 18, 3); } -void UpdateSelectedPartyBox(struct Struct203CEDC *ptr, u8 bitfield) +static void UpdateSelectedPartyBox(struct Struct203CEDC *ptr, u8 bitfield) { u8 palNum = GetWindowAttribute(ptr->windowId, WINDOW_PALETTE_NUM) * 16; - + if (bitfield & 0x40) { LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AF1[0]), gUnknown_08615AC0[0] + palNum, 2); @@ -2666,15 +3326,15 @@ void UpdateSelectedPartyBox(struct Struct203CEDC *ptr, u8 bitfield) } } -void DisplayPartyPokemonBarDetail(u8 windowId, const u8 *str, u8 color, u8 *align) +static void DisplayPartyPokemonBarDetail(u8 windowId, const u8 *str, u8 color, const u8 *align) { AddTextPrinterParameterized3(windowId, 0, align[0], align[1], gUnknown_086157FC[color], 0, str); } -void DisplayPartyPokemonNickname(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c) +static void DisplayPartyPokemonNickname(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c) { u8 nickname[POKEMON_NAME_LENGTH + 1]; - + if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) { if (c == 1) @@ -2684,7 +3344,7 @@ void DisplayPartyPokemonNickname(struct Pokemon *mon, struct Struct203CEDC *ptr, } } -void DisplayPartyPokemonLevelCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c) +static void DisplayPartyPokemonLevelCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) { @@ -2699,7 +3359,7 @@ void DisplayPartyPokemonLevelCheck(struct Pokemon *mon, struct Struct203CEDC *pt } } -void DisplayPartyPokemonLevel(u8 level, struct Struct203CEDC *ptr) +static void DisplayPartyPokemonLevel(u8 level, struct Struct203CEDC *ptr) { ConvertIntToDecimalStringN(gStringVar2, level, 0, 3); StringCopy(gStringVar1, gText_LevelSymbol); @@ -2707,40 +3367,40 @@ void DisplayPartyPokemonLevel(u8 level, struct Struct203CEDC *ptr) DisplayPartyPokemonBarDetail(ptr->windowId, gStringVar1, 0, &ptr->unk0->unk4[4]); } -void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c) +static void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c) { u8 nickname[POKEMON_NAME_LENGTH + 1]; - + if (c == 1) ptr->unk0->unk0(ptr->windowId, ptr->unk0->unk4[8] >> 3, (ptr->unk0->unk4[9] >> 3) + 1, ptr->unk0->unk4[10] >> 3, ptr->unk0->unk4[11] >> 3, 0); GetMonNickname(mon, nickname); DisplayPartyPokemonGender(GetMonGender(mon), GetMonData(mon, MON_DATA_SPECIES), nickname, ptr); } -void DisplayPartyPokemonGender(u8 gender, u16 species, u8 *nickname, struct Struct203CEDC *ptr) +static void DisplayPartyPokemonGender(u8 gender, u16 species, u8 *nickname, struct Struct203CEDC *ptr) { u8 palNum = GetWindowAttribute(ptr->windowId, WINDOW_PALETTE_NUM) * 16; - + if (species == SPECIES_NONE) return; if ((species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) && StringCompare(nickname, gSpeciesNames[species]) == 0) return; switch (gender) { - case MON_MALE: - LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC3[0]), gUnknown_08615AB6[0] + palNum, 2); - LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC3[1]), gUnknown_08615AB6[1] + palNum, 2); - DisplayPartyPokemonBarDetail(ptr->windowId, gText_MaleSymbol, 2, &ptr->unk0->unk4[8]); - break; - case MON_FEMALE: - LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC5[0]), gUnknown_08615AB6[0] + palNum, 2); - LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC5[1]), gUnknown_08615AB6[1] + palNum, 2); - DisplayPartyPokemonBarDetail(ptr->windowId, gText_FemaleSymbol, 2, &ptr->unk0->unk4[8]); - break; + case MON_MALE: + LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC3[0]), gUnknown_08615AB6[0] + palNum, 2); + LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC3[1]), gUnknown_08615AB6[1] + palNum, 2); + DisplayPartyPokemonBarDetail(ptr->windowId, gText_MaleSymbol, 2, &ptr->unk0->unk4[8]); + break; + case MON_FEMALE: + LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC5[0]), gUnknown_08615AB6[0] + palNum, 2); + LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC5[1]), gUnknown_08615AB6[1] + palNum, 2); + DisplayPartyPokemonBarDetail(ptr->windowId, gText_FemaleSymbol, 2, &ptr->unk0->unk4[8]); + break; } } -void DisplayPartyPokemonHPCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c) +static void DisplayPartyPokemonHPCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) { @@ -2751,17 +3411,17 @@ void DisplayPartyPokemonHPCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, } } -void DisplayPartyPokemonHP(u16 hp, struct Struct203CEDC *ptr) +static void DisplayPartyPokemonHP(u16 hp, struct Struct203CEDC *ptr) { u8 *strOut = ConvertIntToDecimalStringN(gStringVar1, hp, 1, 3); - + strOut[0] = CHAR_SLASH; strOut[1] = EOS; - + DisplayPartyPokemonBarDetail(ptr->windowId, gStringVar1, 0, &ptr->unk0->unk4[12]); } -void DisplayPartyPokemonMaxHPCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c) +static void DisplayPartyPokemonMaxHPCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) { @@ -2772,7 +3432,7 @@ void DisplayPartyPokemonMaxHPCheck(struct Pokemon *mon, struct Struct203CEDC *pt } } -void DisplayPartyPokemonMaxHP(u16 maxhp, struct Struct203CEDC *ptr) +static void DisplayPartyPokemonMaxHP(u16 maxhp, struct Struct203CEDC *ptr) { ConvertIntToDecimalStringN(gStringVar2, maxhp, 1, 3); StringCopy(gStringVar1, gText_Slash); @@ -2780,34 +3440,34 @@ void DisplayPartyPokemonMaxHP(u16 maxhp, struct Struct203CEDC *ptr) DisplayPartyPokemonBarDetail(ptr->windowId, gStringVar1, 0, &ptr->unk0->unk4[16]); } -void DisplayPartyPokemonHPBarCheck(struct Pokemon *mon, struct Struct203CEDC *ptr) +static void DisplayPartyPokemonHPBarCheck(struct Pokemon *mon, struct Struct203CEDC *ptr) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) DisplayPartyPokemonHPBar(GetMonData(mon, MON_DATA_HP), GetMonData(mon, MON_DATA_MAX_HP), ptr); } -void DisplayPartyPokemonHPBar(u16 hp, u16 maxhp, struct Struct203CEDC *ptr) +static void DisplayPartyPokemonHPBar(u16 hp, u16 maxhp, struct Struct203CEDC *ptr) { u8 palNum = GetWindowAttribute(ptr->windowId, WINDOW_PALETTE_NUM) * 16; u8 hpFraction; - + switch (GetHPBarLevel(hp, maxhp)) { - case HP_BAR_GREEN: - case HP_BAR_FULL: - LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC7[0]), gUnknown_08615AB8[0] + palNum, 2); - LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC7[1]), gUnknown_08615AB8[1] + palNum, 2); - break; - case HP_BAR_YELLOW: - LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC9[0]), gUnknown_08615AB8[0] + palNum, 2); - LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC9[1]), gUnknown_08615AB8[1] + palNum, 2); - break; - default: - LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615ACB[0]), gUnknown_08615AB8[0] + palNum, 2); - LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615ACB[1]), gUnknown_08615AB8[1] + palNum, 2); - break; + case HP_BAR_GREEN: + case HP_BAR_FULL: + LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC7[0]), gUnknown_08615AB8[0] + palNum, 2); + LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC7[1]), gUnknown_08615AB8[1] + palNum, 2); + break; + case HP_BAR_YELLOW: + LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC9[0]), gUnknown_08615AB8[0] + palNum, 2); + LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC9[1]), gUnknown_08615AB8[1] + palNum, 2); + break; + default: + LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615ACB[0]), gUnknown_08615AB8[0] + palNum, 2); + LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615ACB[1]), gUnknown_08615AB8[1] + palNum, 2); + break; } - + hpFraction = GetScaledHPFraction(hp, maxhp, ptr->unk0->unk4[22]); FillWindowPixelRect(ptr->windowId, gUnknown_08615AB8[1], ptr->unk0->unk4[20], ptr->unk0->unk4[21], hpFraction, 1); FillWindowPixelRect(ptr->windowId, gUnknown_08615AB8[0], ptr->unk0->unk4[20], ptr->unk0->unk4[21] + 1, hpFraction, 2); @@ -2819,89 +3479,19 @@ void DisplayPartyPokemonHPBar(u16 hp, u16 maxhp, struct Struct203CEDC *ptr) CopyWindowToVram(ptr->windowId, 2); } -#ifdef NONMATCHING -void DisplayPartyPokemonOtherText(u8 stringID, struct Struct203CEDC *ptr, u8 c) +static void DisplayPartyPokemonOtherText(u8 stringID, struct Struct203CEDC *ptr, u8 c) { if (c != 0) { - int unk = ((ptr->unk0->unk1C & 7) + ptr->unk0->unk1E + 7) / 8; - int unk2 = ((ptr->unk0->unk1D & 7) + ptr->unk0->unk1F + 7) / 8; + int unk = ((ptr->unk0->unk1C % 8) + ptr->unk0->unk1E + 7) / 8; + int unk2 = ((ptr->unk0->unk1D % 8) + ptr->unk0->unk1F + 7) / 8; ptr->unk0->unk0(ptr->windowId, ptr->unk0->unk1C >> 3, ptr->unk0->unk1D >> 3, unk, unk2, 1); } if (c != 2) AddTextPrinterParameterized3(ptr->windowId, 1, ptr->unk0->unk1C, ptr->unk0->unk1D, gUnknown_086157FC[0], 0, gUnknown_08615B60[stringID]); } -#else -NAKED -void DisplayPartyPokemonOtherText(u8 stringID, struct Struct203CEDC *ptr, u8 c) -{ - asm_unified("push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - sub sp, 0xC\n\ - adds r6, r1, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - lsls r2, 24\n\ - lsrs r7, r2, 24\n\ - cmp r7, 0\n\ - beq _081B2FF2\n\ - ldr r5, [r6]\n\ - ldrb r1, [r5, 0x1C]\n\ - movs r4, 0x7\n\ - adds r0, r1, 0\n\ - ands r0, r4\n\ - ldrb r2, [r5, 0x1E]\n\ - adds r0, r2\n\ - adds r3, r0, 0x7\n\ - asrs r3, 3\n\ - ldrb r2, [r5, 0x1D]\n\ - adds r0, r2, 0\n\ - ands r0, r4\n\ - ldrb r4, [r5, 0x1F]\n\ - adds r0, r4\n\ - adds r4, r0, 0x7\n\ - ldrb r0, [r6, 0x8]\n\ - lsrs r1, 3\n\ - lsrs r2, 3\n\ - lsrs r4, 3\n\ - str r4, [sp]\n\ - movs r4, 0x1\n\ - str r4, [sp, 0x4]\n\ - ldr r4, [r5]\n\ - bl _call_via_r4\n\ -_081B2FF2:\n\ - cmp r7, 0x2\n\ - beq _081B3018\n\ - ldrb r0, [r6, 0x8]\n\ - ldr r1, [r6]\n\ - ldrb r2, [r1, 0x1C]\n\ - ldrb r3, [r1, 0x1D]\n\ - ldr r1, =gUnknown_086157FC\n\ - str r1, [sp]\n\ - movs r1, 0\n\ - str r1, [sp, 0x4]\n\ - ldr r4, =gUnknown_08615B60\n\ - mov r5, r8\n\ - lsls r1, r5, 2\n\ - adds r1, r4\n\ - ldr r1, [r1]\n\ - str r1, [sp, 0x8]\n\ - movs r1, 0x1\n\ - bl AddTextPrinterParameterized3\n\ -_081B3018:\n\ - add sp, 0xC\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n"); -} -#endif -void sub_81B302C(u8 *ptr) +static void sub_81B302C(u8 *ptr) { if (*ptr != 0xFF) { @@ -2915,33 +3505,33 @@ void sub_81B302C(u8 *ptr) void display_pokemon_menu_message(u32 stringID) { u8 *windowPtr = &gUnknown_0203CEC4->unkC[1]; - + if (*windowPtr != 0xFF) sub_81B302C(windowPtr); - + if (stringID != 0x7F) { switch (stringID) { - case 21: - *windowPtr = AddWindow(&gUnknown_08615928); - break; - case 24: - *windowPtr = AddWindow(&gUnknown_08615930); - break; - case 25: - *windowPtr = AddWindow(&gUnknown_08615938); - break; - case 22: - case 23: - *windowPtr = AddWindow(&gUnknown_08615940); - break; - case 26: - *windowPtr = AddWindow(&gUnknown_08615948); - break; - default: - *windowPtr = AddWindow(&gUnknown_08615920); - break; + case 21: + *windowPtr = AddWindow(&gUnknown_08615928); + break; + case 24: + *windowPtr = AddWindow(&gUnknown_08615930); + break; + case 25: + *windowPtr = AddWindow(&gUnknown_08615938); + break; + case 22: + case 23: + *windowPtr = AddWindow(&gUnknown_08615940); + break; + case 26: + *windowPtr = AddWindow(&gUnknown_08615948); + break; + default: + *windowPtr = AddWindow(&gUnknown_08615920); + break; } if (stringID == 0) { @@ -2957,15 +3547,15 @@ void display_pokemon_menu_message(u32 stringID) } } -bool8 sub_81B314C(void) +static bool8 sub_81B314C(void) { struct Pokemon *party = gPlayerParty; u8 i; u8 j = 0; - + if (gUnknown_0203CEC8.unkB == 1) return TRUE; - + for (i = 0; i < 6; i++) { if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && (GetMonData(&party[i], MON_DATA_HP) != 0 || GetMonData(&party[i], MON_DATA_IS_EGG))) @@ -2976,77 +3566,77 @@ bool8 sub_81B314C(void) return FALSE; } -u8 sub_81B31B0(u8 a) +static u8 sub_81B31B0(u8 a) { struct WindowTemplate window; u8 cursorDimension; u8 fontAttribute; u8 i; - + switch (a) { - case 0: - SetWindowTemplateFields(&window, 2, 19, 19 - (gUnknown_0203CEC4->unk17 * 2), 10, gUnknown_0203CEC4->unk17 * 2, 14, 0x2E9); - break; - case 1: - window = gUnknown_08615950; - break; - case 2: - window = gUnknown_08615958; - break; - default: - window = gUnknown_08615960; - break; + case 0: + SetWindowTemplateFields(&window, 2, 19, 19 - (gUnknown_0203CEC4->unk17 * 2), 10, gUnknown_0203CEC4->unk17 * 2, 14, 0x2E9); + break; + case 1: + window = gUnknown_08615950; + break; + case 2: + window = gUnknown_08615958; + break; + default: + window = gUnknown_08615960; + break; } - + gUnknown_0203CEC4->unkC[0] = AddWindow(&window); SetWindowBorderStyle(gUnknown_0203CEC4->unkC[0], FALSE, 0x4F, 13); if (a == 3) return gUnknown_0203CEC4->unkC[0]; cursorDimension = GetMenuCursorDimensionByFont(1, 0); fontAttribute = GetFontAttribute(1, 2); - + for (i = 0; i < gUnknown_0203CEC4->unk17; i++) { u8 unk = (gUnknown_0203CEC4->unkF[i] > 18) ? 4 : 3; - AddTextPrinterParameterized4(gUnknown_0203CEC4->unkC[0], 1, cursorDimension, (i * 16) + 1, fontAttribute, 0, gUnknown_086157FC[unk], 0, gUnknown_08615C08[gUnknown_0203CEC4->unkF[i]].textPtr); + AddTextPrinterParameterized4(gUnknown_0203CEC4->unkC[0], 1, cursorDimension, (i * 16) + 1, fontAttribute, 0, gUnknown_086157FC[unk], 0, sCursorOptions[gUnknown_0203CEC4->unkF[i]].text); } - + InitMenuInUpperLeftCorner(gUnknown_0203CEC4->unkC[0], gUnknown_0203CEC4->unk17, 0, 1); schedule_bg_copy_tilemap_to_vram(2); - + return gUnknown_0203CEC4->unkC[0]; } -void sub_81B3300(const u8 *text) +static void sub_81B3300(const u8 *text) { SetWindowBorderStyle(6, FALSE, 0x4F, 13); gTextFlags.canABSpeedUpPrint = TRUE; AddTextPrinterParameterized2(6, 1, text, GetPlayerTextSpeedDelay(), 0, 2, 1, 3); } -void sub_81B334C(void) +static void sub_81B334C(void) { CreateYesNoMenu(&gUnknown_08615968, 0x4F, 13, 0); } -u8 sub_81B3364(void) +static u8 sub_81B3364(void) { gUnknown_0203CEC4->unkC[0] = AddWindow(&gUnknown_08615970); SetWindowBorderStyle(gUnknown_0203CEC4->unkC[0], FALSE, 0x4F, 13); return gUnknown_0203CEC4->unkC[0]; } -void sub_81B3394(void) +static void sub_81B3394(void) { ClearWindowTilemap(gUnknown_0203CEC4->unkC[0]); sub_81B302C(&gUnknown_0203CEC4->unkC[0]); } -void sub_81B33B4(struct Pokemon *mons, u8 a, u8 b) +static void sub_81B33B4(struct Pokemon *mons, u8 a, u8 b) { u8 i; - + if (b == 0) { sub_81B3414(mons, a); @@ -3059,23 +3649,24 @@ void sub_81B33B4(struct Pokemon *mons, u8 a, u8 b) } } -void sub_81B3414(struct Pokemon *mons, u8 a) +static void sub_81B3414(struct Pokemon *mons, u8 a) { u8 i, j; - + gUnknown_0203CEC4->unk17 = 0; AppendToList(gUnknown_0203CEC4->unkF, &gUnknown_0203CEC4->unk17, 0); for (i = 0; i < MAX_MON_MOVES; i++) { - for (j = 0; gUnknown_08615D7E[j] != MOVE_SWORDS_DANCE; j++) + for (j = 0; sFieldMoves[j] != FIELD_MOVE_TERMINATOR; j++) { - if (GetMonData(&mons[a], i + MON_DATA_MOVE1) == gUnknown_08615D7E[j]) + if (GetMonData(&mons[a], i + MON_DATA_MOVE1) == sFieldMoves[j]) { AppendToList(gUnknown_0203CEC4->unkF, &gUnknown_0203CEC4->unk17, j + 19); break; } } } + if (!InBattlePike()) { if (GetMonData(&mons[1], MON_DATA_SPECIES) != SPECIES_NONE) @@ -3088,62 +3679,62 @@ void sub_81B3414(struct Pokemon *mons, u8 a) AppendToList(gUnknown_0203CEC4->unkF, &gUnknown_0203CEC4->unk17, 2); } -u8 sub_81B353C(struct Pokemon *mon) +static u8 sub_81B353C(struct Pokemon *mon) { u32 returnVar; - + switch (gUnknown_0203CEC8.unk8_0) { + case 0: + if (InMultiBattleRoom() == TRUE || GetMonData(mon, MON_DATA_IS_EGG)) + returnVar = 1; + else + returnVar = 0; + break; + case 1: + returnVar = sub_81B8A2C(mon); + break; + case 4: + switch (sub_81B856C(gUnknown_0203CEC8.unk9)) + { + default: + returnVar = 7; + break; case 0: - if (InMultiBattleRoom() == TRUE || GetMonData(mon, MON_DATA_IS_EGG)) - returnVar = 1; - else - returnVar = 0; + returnVar = 4; break; case 1: - returnVar = sub_81B8A2C(mon); - break; - case 4: - switch (sub_81B856C(gUnknown_0203CEC8.unk9)) - { - default: - returnVar = 7; - break; - case 0: - returnVar = 4; - break; - case 1: - returnVar = 5; - break; - } - break; - case 6: - returnVar = (GetMonData(mon, MON_DATA_IS_EGG)) ? 7 : 6; - break; - case 8: - returnVar = 10; - break; - case 9: - returnVar = 11; - break; - case 10: - returnVar = 12; - break; - case 12: - returnVar = 13; - break; - default: - returnVar = 0; + returnVar = 5; break; + } + break; + case 6: + returnVar = (GetMonData(mon, MON_DATA_IS_EGG)) ? 7 : 6; + break; + case 8: + returnVar = 10; + break; + case 9: + returnVar = 11; + break; + case 10: + returnVar = 12; + break; + case 12: + returnVar = 13; + break; + default: + returnVar = 0; + break; } return returnVar; } -bool8 sub_81B3608(u8 taskId) +static bool8 sub_81B3608(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; u16 item; - + GetMonNickname(mon, gStringVar1); sub_81B302C(&gUnknown_0203CEC4->unkC[1]); if (gUnknown_0203CEC8.unk8_0 != 12) @@ -3174,53 +3765,53 @@ bool8 sub_81B3608(u8 taskId) return TRUE; } -void sub_81B36FC(u8 taskId) +static void sub_81B36FC(u8 taskId) { if (sub_81B3608(taskId)) { gTasks[taskId].data[0] = 0xFF; - gTasks[taskId].func = sub_81B3730; + gTasks[taskId].func = HandleMenuInput; } } -void sub_81B3730(u8 taskId) +static void HandleMenuInput(u8 taskId) { - s16 *data; - s8 input; - - if (gPaletteFade.active == FALSE && sub_81221EC() != TRUE) + if (!gPaletteFade.active && sub_81221EC() != TRUE) { - data = gTasks[taskId].data; + s8 input; + s16 *data = gTasks[taskId].data; + if (gUnknown_0203CEC4->unk17 <= 3) input = Menu_ProcessInputNoWrapAround_other(); else input = ProcessMenuInput_other(); - data[0] = GetMenuCursorPos(); - if (input != MENU_NOTHING_CHOSEN) + + data[0] = Menu_GetCursorPos(); + switch (input) { - if (input == MENU_B_PRESSED) - { - PlaySE(SE_SELECT); - sub_81B302C(&gUnknown_0203CEC4->unkC[2]); - gUnknown_08615C08[gUnknown_0203CEC4->unkF[gUnknown_0203CEC4->unk17 - 1]].func(taskId); - } - else - { - sub_81B302C(&gUnknown_0203CEC4->unkC[2]); - gUnknown_08615C08[gUnknown_0203CEC4->unkF[input]].func(taskId); - } + case MENU_NOTHING_CHOSEN: + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + sub_81B302C(&gUnknown_0203CEC4->unkC[2]); + sCursorOptions[gUnknown_0203CEC4->unkF[gUnknown_0203CEC4->unk17 - 1]].func(taskId); + break; + default: + sub_81B302C(&gUnknown_0203CEC4->unkC[2]); + sCursorOptions[gUnknown_0203CEC4->unkF[input]].func(taskId); + break; } } } -void sub_81B37FC(u8 taskId) +static void CursorCb_Summary(u8 taskId) { PlaySE(SE_SELECT); gUnknown_0203CEC4->exitCallback = sub_81B3828; sub_81B12C0(taskId); } -void sub_81B3828(void) +static void sub_81B3828(void) { if (gUnknown_0203CEC8.unk8_0 == 1) { @@ -3233,14 +3824,14 @@ void sub_81B3828(void) } } -void sub_81B3894(void) +static void sub_81B3894(void) { gPaletteFade.bufferTransferDisabled = TRUE; gUnknown_0203CEC8.unk9 = gUnknown_0203CF20; InitPartyMenu(gUnknown_0203CEC8.unk8_0, 0xFF, gUnknown_0203CEC8.unkB, 1, 21, sub_81B36FC, gUnknown_0203CEC8.exitCallback); } -void brm_switch(u8 taskId) +static void CursorCb_Switch(u8 taskId) { PlaySE(SE_SELECT); gUnknown_0203CEC8.unkB = 8; @@ -3252,11 +3843,11 @@ void brm_switch(u8 taskId) gTasks[taskId].func = sub_81B1370; } -void sub_81B3938(u8 taskId) +static void sub_81B3938(u8 taskId) { s16 *data = gTasks[taskId].data; u8 windowIds[2]; - + if (gUnknown_0203CEC8.unkA == gUnknown_0203CEC8.unk9) { sub_81B407C(taskId); @@ -3297,20 +3888,18 @@ void sub_81B3938(u8 taskId) } } -#ifdef NONMATCHING -bool8 sub_81B3AD8(s16 a, s16 b, u8 *c, u8 *d, u8 *e) +static bool8 sub_81B3AD8(s16 a, s16 b, u8 *c, u8 *d, u8 *e) { - - if ((a + b) < 0 || a > 31) - { + if ((a + b) < 0) return FALSE; - } + if (a > 31) + return FALSE; + if (a < 0) { - *c = -a; + *c = a * -1; *d = 0; - *e = a + b; - return TRUE; + *e = b + a; } else { @@ -3320,78 +3909,15 @@ bool8 sub_81B3AD8(s16 a, s16 b, u8 *c, u8 *d, u8 *e) *e = 32 - a; else *e = b; - return TRUE; - } + } + return TRUE; } -#else -NAKED -bool8 sub_81B3AD8(s16 a, s16 b, u8 *c, u8 *d, u8 *e) -{ - asm_unified("push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - adds r6, r2, 0\n\ - mov r12, r3\n\ - ldr r7, [sp, 0x18]\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - adds r5, r3, 0\n\ - lsls r1, 16\n\ - lsrs r2, r1, 16\n\ - mov r8, r2\n\ - lsls r0, r3, 16\n\ - asrs r1, r0, 16\n\ - lsls r0, r2, 16\n\ - asrs r0, 16\n\ - adds r4, r1, r0\n\ - cmp r4, 0\n\ - blt _081B3B02\n\ - cmp r1, 0x1F\n\ - ble _081B3B06\n\ -_081B3B02:\n\ - movs r0, 0\n\ - b _081B3B34\n\ -_081B3B06:\n\ - cmp r1, 0\n\ - bge _081B3B1A\n\ - negs r0, r1\n\ - strb r0, [r6]\n\ - movs r0, 0\n\ - mov r1, r12\n\ - strb r0, [r1]\n\ - adds r0, r2, r3\n\ - strb r0, [r7]\n\ - b _081B3B32\n\ -_081B3B1A:\n\ - movs r0, 0\n\ - strb r0, [r6]\n\ - mov r0, r12\n\ - strb r5, [r0]\n\ - cmp r4, 0x1F\n\ - ble _081B3B2E\n\ - movs r0, 0x20\n\ - subs r0, r5\n\ - strb r0, [r7]\n\ - b _081B3B32\n\ -_081B3B2E:\n\ - mov r1, r8\n\ - strb r1, [r7]\n\ -_081B3B32:\n\ - movs r0, 0x1\n\ -_081B3B34:\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n"); -} -#endif -void sub_81B3B40(const void *rectSrc, s16 a, s16 b, s16 c, s16 d, s16 e) +static void sub_81B3B40(const void *rectSrc, s16 a, s16 b, s16 c, s16 d, s16 e) { u8 f, g, h; - + if (sub_81B3AD8(a, c, &f, &g, &h)) { FillBgTilemapBufferRect_Palette0(0, 0, g, b, h, d); @@ -3400,7 +3926,7 @@ void sub_81B3B40(const void *rectSrc, s16 a, s16 b, s16 c, s16 d, s16 e) } } -void sub_81B3C0C(struct Struct203CEDC *ptr, s16 a) +static void sub_81B3C0C(struct Struct203CEDC *ptr, s16 a) { gSprites[ptr->unkB].pos2.x += a * 8; gSprites[ptr->unkA].pos2.x += a * 8; @@ -3408,20 +3934,20 @@ void sub_81B3C0C(struct Struct203CEDC *ptr, s16 a) gSprites[ptr->unkC].pos2.x += a * 8; } -void sub_81B3C60(u8 taskId) +static void sub_81B3C60(u8 taskId) { s16 *data = gTasks[taskId].data; - + if (data[10] != 0) sub_81B3C0C(&gUnknown_0203CEDC[gUnknown_0203CEC8.unk9], data[10]); if (data[11] != 0) sub_81B3C0C(&gUnknown_0203CEDC[gUnknown_0203CEC8.unkA], data[11]); } -void sub_81B3CC0(u8 taskId) +static void sub_81B3CC0(u8 taskId) { s16 *data = gTasks[taskId].data; - + if (data[10] != 0) sub_81B3B40(gUnknown_0203CEF0, data[0] + data[8], data[1], data[2], data[3], data[10]); if (data[11] != 0) @@ -3429,11 +3955,11 @@ void sub_81B3CC0(u8 taskId) schedule_bg_copy_tilemap_to_vram(0); } -void sub_81B3D48(u8 taskId) +static void sub_81B3D48(u8 taskId) { s16 *data = gTasks[taskId].data; u16 tilemapRelatedMaybe[2]; - + sub_81B3CC0(taskId); sub_81B3C60(taskId); data[8] += data[10]; @@ -3457,10 +3983,10 @@ void sub_81B3D48(u8 taskId) } } -void sub_81B3E60(u8 taskId) +static void sub_81B3E60(u8 taskId) { s16 *data = gTasks[taskId].data; - + sub_81B3CC0(taskId); sub_81B3C60(taskId); if (data[10] == 0 && data[11] == 0) @@ -3483,11 +4009,11 @@ void sub_81B3E60(u8 taskId) } } -void oamt_swap_pos(u8 *spriteIdPtr1, u8 *spriteIdPtr2) +static void oamt_swap_pos(u8 *spriteIdPtr1, u8 *spriteIdPtr2) { u8 spriteIdBuffer = *spriteIdPtr1; u16 xBuffer1, yBuffer1, xBuffer2, yBuffer2; - + *spriteIdPtr1 = *spriteIdPtr2; *spriteIdPtr2 = spriteIdBuffer; xBuffer1 = gSprites[*spriteIdPtr1].pos1.x; @@ -3501,15 +4027,15 @@ void oamt_swap_pos(u8 *spriteIdPtr1, u8 *spriteIdPtr2) gSprites[*spriteIdPtr2].pos1.x = xBuffer1; gSprites[*spriteIdPtr2].pos1.y = yBuffer1; gSprites[*spriteIdPtr2].pos2.x = xBuffer2; - gSprites[*spriteIdPtr2].pos2.y = yBuffer2; + gSprites[*spriteIdPtr2].pos2.y = yBuffer2; } -void swap_pokemon_and_oams(void) +static void swap_pokemon_and_oams(void) { struct Struct203CEDC *structPtrs[2]; struct Pokemon *mon1, *mon2; struct Pokemon *monBuffer; - + structPtrs[0] = &gUnknown_0203CEDC[gUnknown_0203CEC8.unk9]; structPtrs[1] = &gUnknown_0203CEDC[gUnknown_0203CEC8.unkA]; mon1 = &gPlayerParty[gUnknown_0203CEC8.unk9]; @@ -3525,7 +4051,7 @@ void swap_pokemon_and_oams(void) oamt_swap_pos(&structPtrs[0]->unkC, &structPtrs[1]->unkC); } -void sub_81B407C(u8 taskId) +static void sub_81B407C(u8 taskId) { sub_81B302C(&gUnknown_0203CEC4->unkC[1]); gUnknown_0203CEC8.unkB = 0; @@ -3536,7 +4062,7 @@ void sub_81B407C(u8 taskId) gTasks[taskId].func = sub_81B1370; } -void brm_cancel_1(u8 taskId) +static void CursorCb_Cancel1(u8 taskId) { PlaySE(SE_SELECT); sub_81B302C(&gUnknown_0203CEC4->unkC[0]); @@ -3548,7 +4074,7 @@ void brm_cancel_1(u8 taskId) gTasks[taskId].func = sub_81B1370; } -void sub_81B4134(u8 taskId) +static void CursorCb_Item(u8 taskId) { PlaySE(SE_SELECT); sub_81B302C(&gUnknown_0203CEC4->unkC[0]); @@ -3557,17 +4083,17 @@ void sub_81B4134(u8 taskId) sub_81B31B0(1); display_pokemon_menu_message(24); gTasks[taskId].data[0] = 0xFF; - gTasks[taskId].func = sub_81B3730; + gTasks[taskId].func = HandleMenuInput; } -void sub_81B4198(u8 taskId) +static void CursorCb_Give(u8 taskId) { PlaySE(SE_SELECT); gUnknown_0203CEC4->exitCallback = sub_81B41C4; sub_81B12C0(taskId); } -void sub_81B41C4(void) +static void sub_81B41C4(void) { if (InBattlePyramid() == FALSE) GoToBagMenu(RETURN_LOCATION_POKEMON_LIST, POCKETS_COUNT, c2_8123744); @@ -3575,7 +4101,7 @@ void sub_81B41C4(void) sub_81C4F98(2, c2_8123744); } -void c2_8123744(void) +static void c2_8123744(void) { if (gSpecialVar_ItemId == ITEM_NONE) { @@ -3601,10 +4127,10 @@ void c2_8123744(void) } } -void sub_81B42D0(u8 taskId) +static void sub_81B42D0(u8 taskId) { u16 item; - + if (!gPaletteFade.active) { item = gSpecialVar_ItemId; @@ -3615,7 +4141,7 @@ void sub_81B42D0(u8 taskId) } } -void sub_81B4350(u8 taskId) +static void sub_81B4350(u8 taskId) { if (!gPaletteFade.active) { @@ -3624,7 +4150,7 @@ void sub_81B4350(u8 taskId) } } -void sub_81B43A8(u8 taskId) +static void sub_81B43A8(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -3633,40 +4159,40 @@ void sub_81B43A8(u8 taskId) } } -void sub_81B43DC(u8 taskId) +static void sub_81B43DC(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - RemoveBagItem(gSpecialVar_ItemId, 1); - if (AddBagItem(gUnknown_0203CEFC, 1) == FALSE) - { - AddBagItem(gSpecialVar_ItemId, 1); - pokemon_item_not_removed(gUnknown_0203CEFC); - sub_81B1B5C(gStringVar4, 0); - gTasks[taskId].func = sub_81B1C1C; - } - else if (ItemIsMail(gSpecialVar_ItemId)) - { - sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], gSpecialVar_ItemId); - gTasks[taskId].func = sub_81B44FC; - } - else - { - sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], gSpecialVar_ItemId); - sub_81B1D68(gSpecialVar_ItemId, gUnknown_0203CEFC, 1); - gTasks[taskId].func = sub_81B469C; - } - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - case 1: + case 0: + RemoveBagItem(gSpecialVar_ItemId, 1); + if (AddBagItem(gUnknown_0203CEFC, 1) == FALSE) + { + AddBagItem(gSpecialVar_ItemId, 1); + pokemon_item_not_removed(gUnknown_0203CEFC); + sub_81B1B5C(gStringVar4, 0); gTasks[taskId].func = sub_81B1C1C; - break; + } + else if (ItemIsMail(gSpecialVar_ItemId)) + { + sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], gSpecialVar_ItemId); + gTasks[taskId].func = sub_81B44FC; + } + else + { + sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], gSpecialVar_ItemId); + sub_81B1D68(gSpecialVar_ItemId, gUnknown_0203CEFC, 1); + gTasks[taskId].func = sub_81B469C; + } + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + case 1: + gTasks[taskId].func = sub_81B1C1C; + break; } } -void sub_81B44FC(u8 taskId) +static void sub_81B44FC(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -3675,18 +4201,18 @@ void sub_81B44FC(u8 taskId) } } -void sub_81B452C(void) +static void sub_81B452C(void) { u8 mail = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_MAIL); - + sub_811A20C(4, gSaveBlock1Ptr->mail[mail].words, sub_81B4578, 3); } -void sub_81B4578(void) +static void sub_81B4578(void) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; u16 item = GetMonData(mon, MON_DATA_HELD_ITEM); - + if (gSpecialVar_Result == FALSE) { TakeMailFromMon(mon); @@ -3701,7 +4227,7 @@ void sub_81B4578(void) } } -void sub_81B4624(u8 taskId) +static void sub_81B4624(u8 taskId) { if (!gPaletteFade.active) { @@ -3713,10 +4239,10 @@ void sub_81B4624(u8 taskId) } } -void sub_81B469C(u8 taskId) +static void sub_81B469C(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; - + if (sub_81B1BD4() != TRUE) { sub_81B5C94(mon, &gUnknown_0203CEDC[gUnknown_0203CEC8.unk9]); @@ -3731,38 +4257,38 @@ void sub_81B469C(u8 taskId) } } -void sub_81B4724(u8 taskId) +static void CursorCb_TakeItem(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; u16 item = GetMonData(mon, MON_DATA_HELD_ITEM); - + PlaySE(SE_SELECT); sub_81B302C(&gUnknown_0203CEC4->unkC[0]); sub_81B302C(&gUnknown_0203CEC4->unkC[1]); switch (sub_81B1E00(mon)) { - case 0: - GetMonNickname(mon, gStringVar1); - StringExpandPlaceholders(gStringVar4, gText_PkmnNotHolding); - sub_81B1B5C(gStringVar4, 1); - break; - case 1: - pokemon_item_not_removed(item); - sub_81B1B5C(gStringVar4, 1); - break; - default: - sub_81B1CD0(mon, item, 1); - break; + case 0: + GetMonNickname(mon, gStringVar1); + StringExpandPlaceholders(gStringVar4, gText_PkmnNotHolding); + sub_81B1B5C(gStringVar4, 1); + break; + case 1: + pokemon_item_not_removed(item); + sub_81B1B5C(gStringVar4, 1); + break; + default: + sub_81B1CD0(mon, item, 1); + break; } schedule_bg_copy_tilemap_to_vram(2); gTasks[taskId].func = sub_81B469C; } -void sub_81B47E0(u8 taskId) +static void CursorCb_Toss(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; u16 item = GetMonData(mon, MON_DATA_HELD_ITEM); - + PlaySE(SE_SELECT); sub_81B302C(&gUnknown_0203CEC4->unkC[0]); sub_81B302C(&gUnknown_0203CEC4->unkC[1]); @@ -3782,7 +4308,7 @@ void sub_81B47E0(u8 taskId) } } -void sub_81B48A8(u8 taskId) +static void sub_81B48A8(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -3791,42 +4317,42 @@ void sub_81B48A8(u8 taskId) } } -void sub_81B48DC(u8 taskId) +static void sub_81B48DC(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; - + switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - CopyItemName(GetMonData(mon, MON_DATA_HELD_ITEM), gStringVar1); - StringExpandPlaceholders(gStringVar4, gText_ItemThrownAway); - sub_81B1B5C(gStringVar4, 0); - gTasks[taskId].func = sub_81B4988; - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - case 1: - gTasks[taskId].func = sub_81B1C1C; - break; + case 0: + CopyItemName(GetMonData(mon, MON_DATA_HELD_ITEM), gStringVar1); + StringExpandPlaceholders(gStringVar4, gText_ItemThrownAway); + sub_81B1B5C(gStringVar4, 0); + gTasks[taskId].func = sub_81B4988; + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + case 1: + gTasks[taskId].func = sub_81B1C1C; + break; } } -void sub_81B4988(u8 taskId) +static void sub_81B4988(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; - u16 itemClear; - + if (sub_81B1BD4() != TRUE) { - itemClear = ITEM_NONE; - SetMonData(mon, MON_DATA_HELD_ITEM, &itemClear); + u16 item = ITEM_NONE; + + SetMonData(mon, MON_DATA_HELD_ITEM, &item); sub_81B5C94(mon, &gUnknown_0203CEDC[gUnknown_0203CEC8.unk9]); DisplayPartyPokemonOtherText(12, &gUnknown_0203CEDC[gUnknown_0203CEC8.unk9], 1); gTasks[taskId].func = sub_81B1C1C; } } -void sub_81B4A08(u8 taskId) +static void CursorCb_Mail(u8 taskId) { PlaySE(SE_SELECT); sub_81B302C(&gUnknown_0203CEC4->unkC[0]); @@ -3835,28 +4361,28 @@ void sub_81B4A08(u8 taskId) sub_81B31B0(2); display_pokemon_menu_message(25); gTasks[taskId].data[0] = 0xFF; - gTasks[taskId].func = sub_81B3730; + gTasks[taskId].func = HandleMenuInput; } -void sub_81B4A6C(u8 taskId) +static void CursorCb_Read(u8 taskId) { PlaySE(SE_SELECT); gUnknown_0203CEC4->exitCallback = sub_81B4A98; sub_81B12C0(taskId); } -void sub_81B4A98(void) +static void sub_81B4A98(void) { ReadMail(&gSaveBlock1Ptr->mail[GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_MAIL)], sub_81B4AE0, 1); } -void sub_81B4AE0(void) +static void sub_81B4AE0(void) { gPaletteFade.bufferTransferDisabled = TRUE; InitPartyMenu(gUnknown_0203CEC8.unk8_0, 0xFF, gUnknown_0203CEC8.unkB, 1, 21, sub_81B36FC, gUnknown_0203CEC8.exitCallback); } -void brm_take_2(u8 taskId) +static void CursorCb_TakeMail(u8 taskId) { PlaySE(SE_SELECT); sub_81B302C(&gUnknown_0203CEC4->unkC[1]); @@ -3865,7 +4391,7 @@ void brm_take_2(u8 taskId) gTasks[taskId].func = sub_81B4B6C; } -void sub_81B4B6C(u8 taskId) +static void sub_81B4B6C(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -3874,32 +4400,32 @@ void sub_81B4B6C(u8 taskId) } } -void sub_81B4BA0(u8 taskId) +static void sub_81B4BA0(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - if (TakeMailFromMon2(&gPlayerParty[gUnknown_0203CEC8.unk9]) != 0xFF) - { - sub_81B1B5C(gText_MailSentToPC, 0); - gTasks[taskId].func = sub_81B469C; - } - else - { - sub_81B1B5C(gText_PCMailboxFull, 0); - gTasks[taskId].func = sub_81B1C1C; - } - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - case 1: - sub_81B1B5C(gText_MailMessageWillBeLost, 1); - gTasks[taskId].func = sub_81B4C60; - break; + case 0: + if (TakeMailFromMon2(&gPlayerParty[gUnknown_0203CEC8.unk9]) != 0xFF) + { + sub_81B1B5C(gText_MailSentToPC, 0); + gTasks[taskId].func = sub_81B469C; + } + else + { + sub_81B1B5C(gText_PCMailboxFull, 0); + gTasks[taskId].func = sub_81B1C1C; + } + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + case 1: + sub_81B1B5C(gText_MailMessageWillBeLost, 1); + gTasks[taskId].func = sub_81B4C60; + break; } } -void sub_81B4C60(u8 taskId) +static void sub_81B4C60(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -3908,39 +4434,39 @@ void sub_81B4C60(u8 taskId) } } -void sub_81B4C94(u8 taskId) +static void sub_81B4C94(u8 taskId) { u16 item; - + switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - item = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_HELD_ITEM); - if (AddBagItem(item, 1) == TRUE) - { - TakeMailFromMon(&gPlayerParty[gUnknown_0203CEC8.unk9]); - sub_81B1B5C(gText_MailTakenFromPkmn, 0); - gTasks[taskId].func = sub_81B469C; - } - else - { - pokemon_item_not_removed(item); - sub_81B1B5C(gStringVar4, 0); - gTasks[taskId].func = sub_81B1C1C; - } - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - case 1: + case 0: + item = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_HELD_ITEM); + if (AddBagItem(item, 1) == TRUE) + { + TakeMailFromMon(&gPlayerParty[gUnknown_0203CEC8.unk9]); + sub_81B1B5C(gText_MailTakenFromPkmn, 0); + gTasks[taskId].func = sub_81B469C; + } + else + { + pokemon_item_not_removed(item); + sub_81B1B5C(gStringVar4, 0); gTasks[taskId].func = sub_81B1C1C; - break; + } + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + case 1: + gTasks[taskId].func = sub_81B1C1C; + break; } } -void sub_81B4D78(u8 taskId) +static void CursorCb_Cancel2(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; - + PlaySE(SE_SELECT); sub_81B302C(&gUnknown_0203CEC4->unkC[0]); sub_81B302C(&gUnknown_0203CEC4->unkC[1]); @@ -3957,10 +4483,10 @@ void sub_81B4D78(u8 taskId) display_pokemon_menu_message(26); } gTasks[taskId].data[0] = 0xFF; - gTasks[taskId].func = sub_81B3730; + gTasks[taskId].func = HandleMenuInput; } -void brm_shift_sendout(u8 taskId) +static void CursorCb_SendMon(u8 taskId) { PlaySE(SE_SELECT); sub_81B302C(&gUnknown_0203CEC4->unkC[0]); @@ -3976,11 +4502,11 @@ void brm_shift_sendout(u8 taskId) } } -void sub_81B4E8C(u8 taskId) +static void CursorCb_Enter(u8 taskId) { u8 unk; u8 i; - + sub_81B302C(&gUnknown_0203CEC4->unkC[0]); sub_81B302C(&gUnknown_0203CEC4->unkC[1]); unk = sub_81B8830(); @@ -4005,18 +4531,18 @@ void sub_81B4E8C(u8 taskId) gTasks[taskId].func = sub_81B1C1C; } -void sub_81B4F88(void) +static void sub_81B4F88(void) { sub_81B0FCC(gUnknown_0203CEC8.unk9, 0); gUnknown_0203CEC8.unk9 = 6; sub_81B0FCC(gUnknown_0203CEC8.unk9, 1); } -void sub_81B4FA8(u8 taskId) +static void CursorCb_NoEntry(u8 taskId) { u8 unk; u8 i, j; - + PlaySE(SE_SELECT); sub_81B302C(&gUnknown_0203CEC4->unkC[0]); sub_81B302C(&gUnknown_0203CEC4->unkC[1]); @@ -4041,30 +4567,30 @@ void sub_81B4FA8(u8 taskId) gTasks[taskId].func = sub_81B1370; } -void sub_81B50AC(u8 taskId) +static void CursorCb_Store(u8 taskId) { PlaySE(SE_SELECT); sub_81B12C0(taskId); } -void sub_81B50C8(u8 taskId) +static void CursorCb_Register(u8 taskId) { u16 species2 = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_SPECIES2); u16 species = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_SPECIES); u8 obedience = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_OBEDIENCE); - - switch (sub_807A8D0(*(u32 *)sub_800F7DC() /* dirty cast, probably needs to be changed */, species2, species, obedience)) + + switch (sub_807A8D0(*(struct UnkLinkRfuStruct_02022B14Substruct *)sub_800F7DC(), species2, species, obedience)) { - case 1: - StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow); - break; - case 2: - StringExpandPlaceholders(gStringVar4, gText_EggCantBeTradedNow); - break; - default: - PlaySE(SE_SELECT); - sub_81B12C0(taskId); - return; + case 1: + StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow); + break; + case 2: + StringExpandPlaceholders(gStringVar4, gText_EggCantBeTradedNow); + break; + default: + PlaySE(SE_SELECT); + sub_81B12C0(taskId); + return; } PlaySE(SE_HAZURE); sub_81B302C(&gUnknown_0203CEC4->unkC[0]); @@ -4074,13 +4600,13 @@ void sub_81B50C8(u8 taskId) gTasks[taskId].func = sub_81B1C1C; } -void brm_trade_1(u8 taskId) +static void CursorCb_Trade1(u8 taskId) { u16 species2 = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_SPECIES2); u16 species = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_SPECIES); u8 obedience = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_OBEDIENCE); - u32 stringId = sub_807A7E0(*(u32 *)sub_800F7DC() /* dirty cast, probably needs to be changed */, *(u32 *)&gUnknown_02022C38 /* dirty cast, probably needs to be changed */, species2, gUnknown_02022C3C, gUnknown_02022C3E, species, obedience); - + u32 stringId = sub_807A7E0(*(struct UnkLinkRfuStruct_02022B14Substruct *)sub_800F7DC(), gUnknown_02022C38, species2, gUnknown_02022C3C, gUnknown_02022C3E, species, obedience); + if (stringId != 0) { StringExpandPlaceholders(gStringVar4, gUnknown_08615E0C[stringId - 1]); @@ -4098,28 +4624,28 @@ void brm_trade_1(u8 taskId) } } -void sub_81B52E4(u8 taskId) +static void CursorCb_Trade2(u8 taskId) { sub_81B302C(&gUnknown_0203CEC4->unkC[0]); sub_81B302C(&gUnknown_0203CEC4->unkC[1]); switch (sub_807A918(gPlayerParty, gUnknown_0203CEC8.unk9)) { - case 1: - StringExpandPlaceholders(gStringVar4, gText_OnlyPkmnForBattle); - break; - case 2: - StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow); - break; - case 3: - StringExpandPlaceholders(gStringVar4, gText_EggCantBeTradedNow); - break; - default: - PlaySE(SE_SELECT); - GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unk9], gStringVar1); - StringExpandPlaceholders(gStringVar4, gJPText_PutVar1IntoSpinner); - sub_81B1B5C(gStringVar4, 1); - gTasks[taskId].func = sub_81B53FC; - return; + case 1: + StringExpandPlaceholders(gStringVar4, gText_OnlyPkmnForBattle); + break; + case 2: + StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow); + break; + case 3: + StringExpandPlaceholders(gStringVar4, gText_EggCantBeTradedNow); + break; + default: + PlaySE(SE_SELECT); + GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unk9], gStringVar1); + StringExpandPlaceholders(gStringVar4, gJPText_PutVar1IntoSpinner); + sub_81B1B5C(gStringVar4, 1); + gTasks[taskId].func = sub_81B53FC; + return; } PlaySE(SE_HAZURE); StringAppend(gStringVar4, gText_PauseUntilPress); @@ -4127,7 +4653,7 @@ void sub_81B52E4(u8 taskId) gTasks[taskId].func = sub_81B1C1C; } -void sub_81B53FC(u8 taskId) +static void sub_81B53FC(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -4136,107 +4662,107 @@ void sub_81B53FC(u8 taskId) } } -void sub_81B5430(u8 taskId) +static void sub_81B5430(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - sub_81B12C0(taskId); - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - case 1: - sub_81B1C1C(taskId); - break; + case 0: + sub_81B12C0(taskId); + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + case 1: + sub_81B1C1C(taskId); + break; } } -void sub_81B5470(u8 taskId) +static void CursorCb_FieldMove(u8 taskId) { - u8 fieldMove = gUnknown_0203CEC4->unkF[GetMenuCursorPos()] - 19; - struct MapHeader const *mapHeader; - u8 fieldMove2; - + u8 fieldMove = gUnknown_0203CEC4->unkF[Menu_GetCursorPos()] - MENU_FIELD_MOVES; + const struct MapHeader *mapHeader; + PlaySE(SE_SELECT); - if (gUnknown_08615D9C[fieldMove].fieldMoveFunc != NULL) + if (sFieldMoveCursorCallbacks[fieldMove].fieldMoveFunc == NULL) + return; + + sub_81B302C(&gUnknown_0203CEC4->unkC[0]); + sub_81B302C(&gUnknown_0203CEC4->unkC[1]); + if (sub_81221AC() == TRUE || InUnionRoom() == TRUE) { - sub_81B302C(&gUnknown_0203CEC4->unkC[0]); - sub_81B302C(&gUnknown_0203CEC4->unkC[1]); - if (sub_81221AC() == TRUE || InUnionRoom() == TRUE) + if (fieldMove == FIELD_MOVE_MILK_DRINK || fieldMove == FIELD_MOVE_SOFT_BOILED) + display_pokemon_menu_message(13); + else + display_pokemon_menu_message(sFieldMoveCursorCallbacks[fieldMove].msgId); + + gTasks[taskId].func = task_brm_cancel_1_on_keypad_a_or_b; + } + else + { + // All field moves before WATERFALL are HMs. + if (fieldMove <= FIELD_MOVE_WATERFALL && FlagGet(FLAG_BADGE01_GET + fieldMove) != TRUE) { - fieldMove2 = fieldMove - 11; - if (fieldMove2 <= 1) - display_pokemon_menu_message(13); - else - display_pokemon_menu_message(gUnknown_08615D9C[fieldMove].msgID); - gTasks[taskId].func = task_brm_cancel_1_on_keypad_a_or_b; + sub_81B1B5C(gText_CantUseUntilNewBadge, 1); + gTasks[taskId].func = sub_81B1C1C; } - else + else if (sFieldMoveCursorCallbacks[fieldMove].fieldMoveFunc() == TRUE) { - if (fieldMove <= 7 && FlagGet(FLAG_BADGE01_GET + fieldMove) != TRUE) - { - sub_81B1B5C(gText_CantUseUntilNewBadge, 1); - gTasks[taskId].func = sub_81B1C1C; - } - else if (gUnknown_08615D9C[fieldMove].fieldMoveFunc() == TRUE) + switch (fieldMove) { - switch (fieldMove - 5) - { - case 6: - case 7: - sub_8161560(taskId); - break; - case 3: - mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->lastHealLocation.mapGroup, gSaveBlock1Ptr->lastHealLocation.mapNum); - sub_81245DC(gStringVar1, mapHeader->regionMapSectionId); - StringExpandPlaceholders(gStringVar4, gText_ReturnToHealingSpot); - sub_81B5674(taskId); - gUnknown_0203CEC4->data[0] = fieldMove; - break; - case 4: - mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->warp4.mapGroup, gSaveBlock1Ptr->warp4.mapNum); - sub_81245DC(gStringVar1, mapHeader->regionMapSectionId); - StringExpandPlaceholders(gStringVar4, gText_EscapeFromHere); - sub_81B5674(taskId); - gUnknown_0203CEC4->data[0] = fieldMove; - break; - case 0: - gUnknown_0203CEC8.exitCallback = MCB2_FlyMap; - sub_81B12C0(taskId); - break; - default: - gUnknown_0203CEC8.exitCallback = CB2_ReturnToField; - sub_81B12C0(taskId); - break; - } + case FIELD_MOVE_MILK_DRINK: + case FIELD_MOVE_SOFT_BOILED: + sub_8161560(taskId); + break; + case FIELD_MOVE_TELEPORT: + mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->lastHealLocation.mapGroup, gSaveBlock1Ptr->lastHealLocation.mapNum); + sub_81245DC(gStringVar1, mapHeader->regionMapSectionId); + StringExpandPlaceholders(gStringVar4, gText_ReturnToHealingSpot); + sub_81B5674(taskId); + gUnknown_0203CEC4->data[0] = fieldMove; + break; + case FIELD_MOVE_DIG: + mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->escapeWarp.mapGroup, gSaveBlock1Ptr->escapeWarp.mapNum); + sub_81245DC(gStringVar1, mapHeader->regionMapSectionId); + StringExpandPlaceholders(gStringVar4, gText_EscapeFromHere); + sub_81B5674(taskId); + gUnknown_0203CEC4->data[0] = fieldMove; + break; + case FIELD_MOVE_FLY: + gUnknown_0203CEC8.exitCallback = MCB2_FlyMap; + sub_81B12C0(taskId); + break; + default: + gUnknown_0203CEC8.exitCallback = CB2_ReturnToField; + sub_81B12C0(taskId); + break; } - else + } + else + { + switch (fieldMove) { - switch (fieldMove) - { - case 4: - sub_81B5864(); - break; - case 1: - sub_81B57DC(); - break; - default: - display_pokemon_menu_message(gUnknown_08615D9C[fieldMove].msgID); - break; - } - gTasks[taskId].func = task_brm_cancel_1_on_keypad_a_or_b; + case FIELD_MOVE_SURF: + sub_81B5864(); + break; + case FIELD_MOVE_FLASH: + sub_81B57DC(); + break; + default: + display_pokemon_menu_message(sFieldMoveCursorCallbacks[fieldMove].msgId); + break; } + gTasks[taskId].func = task_brm_cancel_1_on_keypad_a_or_b; } } } -void sub_81B5674(u8 taskId) +static void sub_81B5674(u8 taskId) { sub_81B1B5C(gStringVar4, 1); gTasks[taskId].func = sub_81B56A4; } -void sub_81B56A4(u8 taskId) +static void sub_81B56A4(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -4245,21 +4771,21 @@ void sub_81B56A4(u8 taskId) } } -void sub_81B56D8(u8 taskId) +static void sub_81B56D8(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - gUnknown_0203CEC8.exitCallback = CB2_ReturnToField; - sub_81B12C0(taskId); - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - case 1: - gFieldCallback2 = NULL; - gPostMenuFieldCallback = NULL; - sub_81B1C1C(taskId); - break; + case 0: + gUnknown_0203CEC8.exitCallback = CB2_ReturnToField; + sub_81B12C0(taskId); + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + case 1: + gFieldCallback2 = NULL; + gPostMenuFieldCallback = NULL; + sub_81B1C1C(taskId); + break; } } @@ -4270,7 +4796,7 @@ bool8 FieldCallback_PrepareFadeInFromMenu(void) return TRUE; } -void task_launch_hm_phase_2(u8 taskId) +static void task_launch_hm_phase_2(u8 taskId) { if (IsWeatherNotFadingIn() == TRUE) { @@ -4280,18 +4806,18 @@ void task_launch_hm_phase_2(u8 taskId) } } -u16 brm_get_selected_species(void) +static u16 brm_get_selected_species(void) { return GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_SPECIES); } -void task_brm_cancel_1_on_keypad_a_or_b(u8 taskId) +static void task_brm_cancel_1_on_keypad_a_or_b(u8 taskId) { if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - brm_cancel_1(taskId); + CursorCb_Cancel1(taskId); } -void sub_81B57DC(void) +static void sub_81B57DC(void) { if (FlagGet(FLAG_SYS_USE_FLASH) == TRUE) display_pokemon_menu_message(12); @@ -4299,13 +4825,13 @@ void sub_81B57DC(void) display_pokemon_menu_message(13); } -void hm_surf_run_dp02scr(void) +static void hm_surf_run_dp02scr(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); FieldEffectStart(FLDEFF_USE_SURF); } -bool8 sub_81B5820(void) +static bool8 SetUpFieldMove_Surf(void) { if (PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) { @@ -4316,19 +4842,20 @@ bool8 sub_81B5820(void) return FALSE; } -void sub_81B5864(void) +static void sub_81B5864(void) { - if (TestPlayerAvatarFlags(8)) + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) display_pokemon_menu_message(9); else display_pokemon_menu_message(8); } -bool8 sub_81B5884(void) +static bool8 SetUpFieldMove_Fly(void) { if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE) return TRUE; - return FALSE; + else + return FALSE; } void sub_81B58A8(void) @@ -4336,16 +4863,16 @@ void sub_81B58A8(void) InitPartyMenu(0, 0, 0, 1, 0, sub_81B1370, CB2_ReturnToFieldWithOpenMenu); } -void hm2_waterfall(void) +static void hm2_waterfall(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); FieldEffectStart(FLDEFF_USE_WATERFALL); } -bool8 hm_prepare_waterfall(void) +static bool8 SetUpFieldMove_Waterfall(void) { s16 x, y; - + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE && IsPlayerSurfingNorth() == TRUE) { @@ -4356,13 +4883,13 @@ bool8 hm_prepare_waterfall(void) return FALSE; } -void sub_81B5958(void) +static void sub_81B5958(void) { gFieldEffectArguments[0] = GetCursorSelectionMonId(); FieldEffectStart(FLDEFF_USE_DIVE); } -bool8 sub_81B5974(void) +static bool8 SetUpFieldMove_Dive(void) { gFieldEffectArguments[1] = TrySetDiveWarp(); if (gFieldEffectArguments[1] != 0) @@ -4374,11 +4901,11 @@ bool8 sub_81B5974(void) return FALSE; } -void party_menu_icon_anim(struct Pokemon *mon, struct Struct203CEDC *ptr, u32 a) +static void party_menu_icon_anim(struct Pokemon *mon, struct Struct203CEDC *ptr, u32 a) { u32 bit = 1; u16 species2; - + if (IsMultiBattle() == TRUE && gMain.inBattle) bit = (gUnknown_08616020[a] ^ bit) ? 1 : 0; species2 = GetMonData(mon, MON_DATA_SPECIES2); @@ -4386,7 +4913,7 @@ void party_menu_icon_anim(struct Pokemon *mon, struct Struct203CEDC *ptr, u32 a) sub_81B5B38(ptr->unk9, mon); } -void party_menu_link_mon_icon_anim(u16 species, u32 pid, struct Struct203CEDC *ptr, u8 priority, u32 bit) +static void party_menu_link_mon_icon_anim(u16 species, u32 pid, struct Struct203CEDC *ptr, u8 priority, u32 bit) { if (species != SPECIES_NONE) { @@ -4395,35 +4922,35 @@ void party_menu_link_mon_icon_anim(u16 species, u32 pid, struct Struct203CEDC *p } } -void sub_81B5A8C(u8 spriteId, u16 hp, u16 maxhp) +static void sub_81B5A8C(u8 spriteId, u16 hp, u16 maxhp) { switch (GetHPBarLevel(hp, maxhp)) { - case HP_BAR_FULL: - sub_80D32C8(&gSprites[spriteId], 0); - break; - case HP_BAR_GREEN: - sub_80D32C8(&gSprites[spriteId], 1); - break; - case HP_BAR_YELLOW: - sub_80D32C8(&gSprites[spriteId], 2); - break; - case HP_BAR_RED: - sub_80D32C8(&gSprites[spriteId], 3); - break; - default: - sub_80D32C8(&gSprites[spriteId], 4); - break; + case HP_BAR_FULL: + sub_80D32C8(&gSprites[spriteId], 0); + break; + case HP_BAR_GREEN: + sub_80D32C8(&gSprites[spriteId], 1); + break; + case HP_BAR_YELLOW: + sub_80D32C8(&gSprites[spriteId], 2); + break; + case HP_BAR_RED: + sub_80D32C8(&gSprites[spriteId], 3); + break; + default: + sub_80D32C8(&gSprites[spriteId], 4); + break; } } -void sub_81B5B38(u8 spriteId, struct Pokemon *mon) +static void sub_81B5B38(u8 spriteId, struct Pokemon *mon) { sub_81B5A8C(spriteId, GetMonData(mon, MON_DATA_HP), GetMonData(mon, MON_DATA_MAX_HP)); } -void AnimateSelectedPartyIcon(u8 spriteId, u8 a) -{ +static void AnimateSelectedPartyIcon(u8 spriteId, u8 a) +{ gSprites[spriteId].data[0] = 0; if (a == 0) { @@ -4447,10 +4974,10 @@ void AnimateSelectedPartyIcon(u8 spriteId, u8 a) } } -void UpdatePartyMonIconFrameAndBounce(struct Sprite *sprite) +static void UpdatePartyMonIconFrameAndBounce(struct Sprite *sprite) { u8 unk = UpdateMonIconFrame(sprite); - + if (unk != 0) { if (unk & 1) @@ -4460,12 +4987,12 @@ void UpdatePartyMonIconFrameAndBounce(struct Sprite *sprite) } } -void UpdatePartyMonIconFrame(struct Sprite *sprite) +static void UpdatePartyMonIconFrame(struct Sprite *sprite) { UpdateMonIconFrame(sprite); } -void party_menu_held_item_object(struct Pokemon *mon, struct Struct203CEDC *ptr) +static void party_menu_held_item_object(struct Pokemon *mon, struct Struct203CEDC *ptr) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) { @@ -4474,7 +5001,7 @@ void party_menu_held_item_object(struct Pokemon *mon, struct Struct203CEDC *ptr) } } -void party_menu_link_mon_held_item_object(u16 species, u16 item, struct Struct203CEDC *ptr) +static void party_menu_link_mon_held_item_object(u16 species, u16 item, struct Struct203CEDC *ptr) { if (species != SPECIES_NONE) { @@ -4484,12 +5011,12 @@ void party_menu_link_mon_held_item_object(u16 species, u16 item, struct Struct20 } } -void sub_81B5C94(struct Pokemon *mon, struct Struct203CEDC *ptr) +static void sub_81B5C94(struct Pokemon *mon, struct Struct203CEDC *ptr) { sub_81B5CB0(GetMonData(mon, MON_DATA_HELD_ITEM), ptr); } -void sub_81B5CB0(u16 item, struct Struct203CEDC *ptr) +static void sub_81B5CB0(u16 item, struct Struct203CEDC *ptr) { if (item == ITEM_NONE) { @@ -4515,33 +5042,33 @@ void sub_81B5D4C(u8 *a, u8 *b, u8 c) { u16 i; u16 item; - + switch (c) { - case 0: - for (i = 0; i < a[0]; i++) - { - item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - if (item != ITEM_NONE) - sub_81B5DF0(b[i], ItemIsMail(item)); - } - break; - case 1: - for (i = 0; i < a[1]; i++) - { - item = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM); - if (item != ITEM_NONE) - sub_81B5DF0(b[i + 6], ItemIsMail(item)); - } - break; + case 0: + for (i = 0; i < a[0]; i++) + { + item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + if (item != ITEM_NONE) + sub_81B5DF0(b[i], ItemIsMail(item)); + } + break; + case 1: + for (i = 0; i < a[1]; i++) + { + item = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM); + if (item != ITEM_NONE) + sub_81B5DF0(b[i + 6], ItemIsMail(item)); + } + break; } } -void sub_81B5DF0(u8 spriteId, u8 isMail) +static void sub_81B5DF0(u8 spriteId, u8 isMail) { u8 subpriority = gSprites[spriteId].subpriority; u8 newSpriteId = CreateSprite(&gSpriteTemplate_8615EC0, 250, 170, subpriority - 1); - + gSprites[newSpriteId].pos2.x = 4; gSprites[newSpriteId].pos2.y = 10; gSprites[newSpriteId].callback = sub_81B5E74; @@ -4550,10 +5077,10 @@ void sub_81B5DF0(u8 spriteId, u8 isMail) gSprites[newSpriteId].callback(&gSprites[newSpriteId]); } -void sub_81B5E74(struct Sprite *sprite) +static void sub_81B5E74(struct Sprite *sprite) { u8 otherSpriteId = sprite->data[7]; - + if (gSprites[otherSpriteId].invisible) { sprite->invisible = TRUE; @@ -4566,13 +5093,13 @@ void sub_81B5E74(struct Sprite *sprite) } } -void party_menu_pokeball_object(struct Pokemon *mon, struct Struct203CEDC *ptr) +static void party_menu_pokeball_object(struct Pokemon *mon, struct Struct203CEDC *ptr) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) ptr->unkB = CreateSprite(&gSpriteTemplate_8615F08, ptr->unk4[6], ptr->unk4[7], 8); } -void party_menu_link_mon_pokeball_object(u16 species, struct Struct203CEDC *ptr) +static void party_menu_link_mon_pokeball_object(u16 species, struct Struct203CEDC *ptr) { if (species != SPECIES_NONE) { @@ -4581,25 +5108,25 @@ void party_menu_link_mon_pokeball_object(u16 species, struct Struct203CEDC *ptr) } } -u8 sub_81B5F34(u8 x, u8 y) +static u8 sub_81B5F34(u8 x, u8 y) { u8 spriteId = CreateSprite(&gSpriteTemplate_8615F08, x, y, 8); - + gSprites[spriteId].oam.priority = 2; return spriteId; } -u8 sub_81B5F74(u8 x, u8 y) +static u8 sub_81B5F74(u8 x, u8 y) { return CreateSprite(&gSpriteTemplate_8615F78, x, y, 8); } -void sub_81B5F98(u8 spriteId, u8 a) +static void sub_81B5F98(u8 spriteId, u8 a) { StartSpriteAnim(&gSprites[spriteId], a); } -void sub_81B5FBC(u8 spriteId, u8 spriteId2, u8 a) +static void sub_81B5FBC(u8 spriteId, u8 spriteId2, u8 a) { if (a == 0) { @@ -4617,14 +5144,14 @@ void sub_81B5FBC(u8 spriteId, u8 spriteId2, u8 a) } } -void LoadPartyMenuPokeballGfx(void) +static void LoadPartyMenuPokeballGfx(void) { - LoadCompressedObjectPic(&gUnknown_08615EF8); - LoadCompressedObjectPic(&gUnknown_08615F70); - LoadCompressedObjectPalette(&gUnknown_08615F00); + LoadCompressedSpriteSheet(&gUnknown_08615EF8); + LoadCompressedSpriteSheet(&gUnknown_08615F70); + LoadCompressedSpritePalette(&gUnknown_08615F00); } -void party_menu_status_condition_object(struct Pokemon *mon, struct Struct203CEDC *ptr) +static void party_menu_status_condition_object(struct Pokemon *mon, struct Struct203CEDC *ptr) { if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) { @@ -4633,7 +5160,7 @@ void party_menu_status_condition_object(struct Pokemon *mon, struct Struct203CED } } -void party_menu_link_mon_status_condition_object(u16 species, u8 status, struct Struct203CEDC *ptr) +static void party_menu_link_mon_status_condition_object(u16 species, u8 status, struct Struct203CEDC *ptr) { if (species != SPECIES_NONE) { @@ -4643,30 +5170,30 @@ void party_menu_link_mon_status_condition_object(u16 species, u8 status, struct } } -void party_menu_get_status_condition_and_update_object(struct Pokemon *mon, struct Struct203CEDC *ptr) +static void party_menu_get_status_condition_and_update_object(struct Pokemon *mon, struct Struct203CEDC *ptr) { party_menu_update_status_condition_object(sub_81B205C(mon), ptr); } -void party_menu_update_status_condition_object(u8 status, struct Struct203CEDC *ptr) +static void party_menu_update_status_condition_object(u8 status, struct Struct203CEDC *ptr) { switch (status) { - case AILMENT_NONE: - case AILMENT_PKRS: - gSprites[ptr->unkC].invisible = TRUE; - break; - default: - StartSpriteAnim(&gSprites[ptr->unkC], status - 1); - gSprites[ptr->unkC].invisible = FALSE; - break; + case AILMENT_NONE: + case AILMENT_PKRS: + gSprites[ptr->unkC].invisible = TRUE; + break; + default: + StartSpriteAnim(&gSprites[ptr->unkC], status - 1); + gSprites[ptr->unkC].invisible = FALSE; + break; } } -void LoadPartyMenuAilmentGfx(void) +static void LoadPartyMenuAilmentGfx(void) { - LoadCompressedObjectPic(&gUnknown_08615FF8); - LoadCompressedObjectPalette(&gUnknown_08616000); + LoadCompressedSpriteSheet(&gUnknown_08615FF8); + LoadCompressedSpritePalette(&gUnknown_08616000); } void sub_81B617C(void) @@ -4675,9 +5202,9 @@ void sub_81B617C(void) u8 doubleBattleStatus; bool8 inBattle; u8 i; - u8 msgIDMaybe; + u8 msgIdMaybe; register TaskFunc task asm("r0"); - + if (gMain.inBattle) { inBattle = TRUE; @@ -4700,17 +5227,17 @@ void sub_81B617C(void) } } task = sub_81B6280; - msgIDMaybe = 0x7F; + msgIdMaybe = 0x7F; } else { - msgIDMaybe = (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_TM_HM) ? 4 : 5; + msgIdMaybe = (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_TM_HM) ? 4 : 5; task = sub_81B1370; } - InitPartyMenu(inBattle, doubleBattleStatus, 3, 1, msgIDMaybe, task, callback); + InitPartyMenu(inBattle, doubleBattleStatus, 3, 1, msgIdMaybe, task, callback); } -void c2_815ABFC(void) +static void c2_815ABFC(void) { if (InBattlePyramid() == FALSE) GoToBagMenu(RETURN_LOCATION_UNCHANGED, POCKETS_COUNT, NULL); @@ -4718,7 +5245,7 @@ void c2_815ABFC(void) sub_81C4F98(4, gPyramidBagCursorData.callback); } -void sub_81B6280(u8 taskId) +static void sub_81B6280(u8 taskId) { if (!gPaletteFade.active) { @@ -4728,10 +5255,10 @@ void sub_81B6280(u8 taskId) } } -bool8 IsHPRecoveryItem(u16 item) +static bool8 IsHPRecoveryItem(u16 item) { const u8 *effect; - + if (item == ITEM_ENIGMA_BERRY) effect = gSaveBlock1Ptr->enigmaBerry.itemEffect; else @@ -4741,87 +5268,87 @@ bool8 IsHPRecoveryItem(u16 item) return FALSE; } -void GetMedicineItemEffectMessage(u16 item) -{ - switch (GetItemEffectType(item) - 3) - { - case 0: - StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfPoison); - break; - case 1: - StringExpandPlaceholders(gStringVar4, gText_PkmnWokeUp2); - break; - case 2: - StringExpandPlaceholders(gStringVar4, gText_PkmnBurnHealed); - break; - case 3: - StringExpandPlaceholders(gStringVar4, gText_PkmnThawedOut); - break; - case 4: - StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfParalysis); - break; - case 5: - StringExpandPlaceholders(gStringVar4, gText_PkmnSnappedOutOfConfusion); - break; - case 6: - StringExpandPlaceholders(gStringVar4, gText_PkmnGotOverInfatuation); - break; - case 8: - StringExpandPlaceholders(gStringVar4, gText_PkmnBecameHealthy); - break; - case 10: - StringCopy(gStringVar2, gText_HP3); - StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); - break; - case 9: - StringCopy(gStringVar2, gText_Attack3); - StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); - break; - case 14: - StringCopy(gStringVar2, gText_Defense3); - StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); - break; - case 13: - StringCopy(gStringVar2, gText_Speed2); - StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); - break; - case 11: - StringCopy(gStringVar2, gText_SpAtk3); - StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); - break; - case 12: - StringCopy(gStringVar2, gText_SpDef3); - StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); - break; - case 16: - case 17: - StringExpandPlaceholders(gStringVar4, gText_MovesPPIncreased); - break; - case 18: - StringExpandPlaceholders(gStringVar4, gText_PPWasRestored); - break; - default: - StringExpandPlaceholders(gStringVar4, gText_WontHaveEffect); - break; - } -} - -bool8 UsingHPEVItemOnShedinja(struct Pokemon *mon, u16 item) +static void GetMedicineItemEffectMessage(u16 item) +{ + switch (GetItemEffectType(item)) + { + case 3: + StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfPoison); + break; + case 4: + StringExpandPlaceholders(gStringVar4, gText_PkmnWokeUp2); + break; + case 5: + StringExpandPlaceholders(gStringVar4, gText_PkmnBurnHealed); + break; + case 6: + StringExpandPlaceholders(gStringVar4, gText_PkmnThawedOut); + break; + case 7: + StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfParalysis); + break; + case 8: + StringExpandPlaceholders(gStringVar4, gText_PkmnSnappedOutOfConfusion); + break; + case 9: + StringExpandPlaceholders(gStringVar4, gText_PkmnGotOverInfatuation); + break; + case 11: + StringExpandPlaceholders(gStringVar4, gText_PkmnBecameHealthy); + break; + case 13: + StringCopy(gStringVar2, gText_HP3); + StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); + break; + case 12: + StringCopy(gStringVar2, gText_Attack3); + StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); + break; + case 17: + StringCopy(gStringVar2, gText_Defense3); + StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); + break; + case 16: + StringCopy(gStringVar2, gText_Speed2); + StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); + break; + case 14: + StringCopy(gStringVar2, gText_SpAtk3); + StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); + break; + case 15: + StringCopy(gStringVar2, gText_SpDef3); + StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased); + break; + case 19: + case 20: + StringExpandPlaceholders(gStringVar4, gText_MovesPPIncreased); + break; + case 21: + StringExpandPlaceholders(gStringVar4, gText_PPWasRestored); + break; + default: + StringExpandPlaceholders(gStringVar4, gText_WontHaveEffect); + break; + } +} + +static bool8 UsingHPEVItemOnShedinja(struct Pokemon *mon, u16 item) { if (GetItemEffectType(item) == 13 && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_SHEDINJA) return FALSE; return TRUE; } -bool8 IsBlueYellowRedFlute(u16 item) +static bool8 IsBlueYellowRedFlute(u16 item) { if (item == ITEM_BLUE_FLUTE || item == ITEM_RED_FLUTE || item == ITEM_YELLOW_FLUTE) return TRUE; return FALSE; } -bool8 ExecuteTableBasedItemEffect__(u8 partyMonIndex, u16 item, u8 monMoveIndex) -{ +static bool8 ExecuteTableBasedItemEffect__(u8 partyMonIndex, u16 item, u8 monMoveIndex) +{ if (gMain.inBattle) return ExecuteTableBasedItemEffect(&gPlayerParty[partyMonIndex], item, sub_81B8F38(partyMonIndex), monMoveIndex); else @@ -4834,7 +5361,7 @@ void ItemUseCB_Medicine(u8 taskId, TaskFunc task) struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; u16 item = gSpecialVar_ItemId; bool8 canHeal; - + if (UsingHPEVItemOnShedinja(mon, item)) { canHeal = IsHPRecoveryItem(item); @@ -4891,7 +5418,7 @@ void ItemUseCB_Medicine(u8 taskId, TaskFunc task) } } -void sub_81B672C(u8 taskId) +static void sub_81B672C(u8 taskId) { GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unk9], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2); @@ -4901,7 +5428,7 @@ void sub_81B672C(u8 taskId) gTasks[taskId].func = sub_81B6794; } -void sub_81B6794(u8 taskId) +static void sub_81B6794(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -4921,7 +5448,7 @@ void sub_81B67C8(u8 taskId, TaskFunc task) bool8 cannotUseEffect = ExecuteTableBasedItemEffect__(gUnknown_0203CEC8.unk9, item, 0); u16 newFriendship = GetMonData(mon, MON_DATA_FRIENDSHIP); u16 newRelevantEV = sub_81B691C(mon, effectType); - + if (cannotUseEffect || (friendship == newFriendship && relevantEV == newRelevantEV)) { gUnknown_0203CEE8 = 0; @@ -4954,61 +5481,61 @@ void sub_81B67C8(u8 taskId, TaskFunc task) } } -u16 sub_81B691C(struct Pokemon *mon, u8 effectType) +static u16 sub_81B691C(struct Pokemon *mon, u8 effectType) { switch (effectType) { - case 13: - if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_SHEDINJA) - return GetMonData(mon, MON_DATA_HP_EV); - break; - case 12: - return GetMonData(mon, MON_DATA_ATK_EV); - case 17: - return GetMonData(mon, MON_DATA_DEF_EV); - case 16: - return GetMonData(mon, MON_DATA_SPEED_EV); - case 14: - return GetMonData(mon, MON_DATA_SPATK_EV); - case 15: - return GetMonData(mon, MON_DATA_SPDEF_EV); + case 13: + if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_SHEDINJA) + return GetMonData(mon, MON_DATA_HP_EV); + break; + case 12: + return GetMonData(mon, MON_DATA_ATK_EV); + case 17: + return GetMonData(mon, MON_DATA_DEF_EV); + case 16: + return GetMonData(mon, MON_DATA_SPEED_EV); + case 14: + return GetMonData(mon, MON_DATA_SPATK_EV); + case 15: + return GetMonData(mon, MON_DATA_SPDEF_EV); } return 0; } -void option_menu_get_string(u8 effectType, u8 *dest) +static void option_menu_get_string(u8 effectType, u8 *dest) { switch (effectType) { - case 13: - StringCopy(dest, gText_HP3); - break; - case 12: - StringCopy(dest, gText_Attack3); - break; - case 17: - StringCopy(dest, gText_Defense3); - break; - case 16: - StringCopy(dest, gText_Speed2); - break; - case 14: - StringCopy(dest, gText_SpAtk3); - break; - case 15: - StringCopy(dest, gText_SpDef3); - break; - } -} - -void sub_81B6A10(u8 slot) + case 13: + StringCopy(dest, gText_HP3); + break; + case 12: + StringCopy(dest, gText_Attack3); + break; + case 17: + StringCopy(dest, gText_Defense3); + break; + case 16: + StringCopy(dest, gText_Speed2); + break; + case 14: + StringCopy(dest, gText_SpAtk3); + break; + case 15: + StringCopy(dest, gText_SpDef3); + break; + } +} + +static void sub_81B6A10(u8 slot) { u8 i; u8 moveCount = 0; u8 fontId = 1; u8 windowId = sub_81B31B0(3); u16 move; - + for (i = 0; i < MAX_MON_MOVES; i++) { move = GetMonData(&gPlayerParty[slot], MON_DATA_MOVE1 + i); @@ -5020,10 +5547,10 @@ void sub_81B6A10(u8 slot) schedule_bg_copy_tilemap_to_vram(2); } -void ether_effect_related_3(u8 taskId) +static void ether_effect_related_3(u8 taskId) { s8 input = Menu_ProcessInput(); - + if (input != MENU_NOTHING_CHOSEN) { if (input == MENU_B_PRESSED) @@ -5039,11 +5566,11 @@ void ether_effect_related_3(u8 taskId) } } -void dp05_ether(u8 taskId, TaskFunc unused) +void dp05_ether(u8 taskId, TaskFunc task) { const u8 *effect; u16 item = gSpecialVar_ItemId; - + if (item == ITEM_ENIGMA_BERRY) effect = gSaveBlock1Ptr->enigmaBerry.itemEffect; else @@ -5062,14 +5589,14 @@ void dp05_ether(u8 taskId, TaskFunc unused) } } -void ether_effect_related_2(u8 taskId) +static void ether_effect_related_2(u8 taskId) { sub_81B302C(&gUnknown_0203CEC4->unkC[0]); - gUnknown_0203CEC8.unkE = GetMenuCursorPos(); + gUnknown_0203CEC8.unkE = Menu_GetCursorPos(); ether_effect_related(taskId); } -void sub_81B6BB4(u8 taskId) +static void sub_81B6BB4(u8 taskId) { gTasks[taskId].func = sub_81B1370; gUnknown_0203CEC4->exitCallback = NULL; @@ -5077,14 +5604,14 @@ void sub_81B6BB4(u8 taskId) display_pokemon_menu_message(5); } -void ether_effect_related(u8 taskId) +static void ether_effect_related(u8 taskId) { u16 move = MOVE_NONE; s16 *moveslot = &gUnknown_0203CEC8.unkE; u16 item = gSpecialVar_ItemId; struct Struct203CEC8 *ptr = &gUnknown_0203CEC8; struct Pokemon *mon; - + if (ExecuteTableBasedItemEffect__(ptr->unk9, item, *moveslot)) { gUnknown_0203CEE8 = 0; @@ -5108,7 +5635,7 @@ void ether_effect_related(u8 taskId) } } -void dp05_pp_up(u8 taskId, TaskFunc unused) +void dp05_pp_up(u8 taskId, TaskFunc task) { PlaySE(SE_SELECT); display_pokemon_menu_message(23); @@ -5119,25 +5646,25 @@ void dp05_pp_up(u8 taskId, TaskFunc unused) u16 ItemIdToBattleMoveId(u16 item) { u16 tmNumber = item - ITEM_TM01_FOCUS_PUNCH; - return gUnknown_08616040[tmNumber]; + return gTMHMMoves[tmNumber]; } -bool8 sub_81B6D14(u16 move) +bool8 IsMoveHm(u16 move) { u8 i; - + for (i = 0; i < NUM_HIDDEN_MACHINES; i++) { - if (gUnknown_08616040[i + NUM_TECHNICAL_MACHINES] == move) + if (gTMHMMoves[i + NUM_TECHNICAL_MACHINES] == move) return TRUE; } return FALSE; } -bool8 pokemon_has_move(struct Pokemon *mon, u16 move) +bool8 MonKnowsMove(struct Pokemon *mon, u16 move) { u8 i; - + for (i = 0; i < MAX_MON_MOVES; i++) { if (GetMonData(mon, MON_DATA_MOVE1 + i) == move) @@ -5146,14 +5673,14 @@ bool8 pokemon_has_move(struct Pokemon *mon, u16 move) return FALSE; } -void sub_81B6D74(const u8 *str) +static void sub_81B6D74(const u8 *str) { StringExpandPlaceholders(gStringVar4, str); sub_81B1B5C(gStringVar4, 1); schedule_bg_copy_tilemap_to_vram(2); } -void sub_81B6D98(u8 taskId, const u8 *str) +static void sub_81B6D98(u8 taskId, const u8 *str) { sub_81B6D74(str); gTasks[taskId].func = sub_81B6794; @@ -5161,12 +5688,12 @@ void sub_81B6D98(u8 taskId, const u8 *str) // move[1] doesn't use constants cause I don't know if it's actually a move ID storage -void sub_81B6DC4(u8 taskId, TaskFunc unused) +void sub_81B6DC4(u8 taskId, TaskFunc task) { struct Pokemon *mon; s16 *move; u16 item; - + PlaySE(SE_SELECT); mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; move = &gUnknown_0203CEC8.unkE; @@ -5175,15 +5702,17 @@ void sub_81B6DC4(u8 taskId, TaskFunc unused) move[0] = ItemIdToBattleMoveId(item); StringCopy(gStringVar2, gMoveNames[move[0]]); move[1] = 0; - switch (CanPartyPokemonLearnTMTutor(mon, item, 0)) + + switch (CanMonLearnTMTutor(mon, item, 0)) { - case CANNOT_LEARN_MOVE: - sub_81B6D98(taskId, gText_PkmnCantLearnMove); - return; - case ALREADY_KNOWS_MOVE: - sub_81B6D98(taskId, gText_PkmnAlreadyKnows); - return; + case CANNOT_LEARN_MOVE: + sub_81B6D98(taskId, gText_PkmnCantLearnMove); + return; + case ALREADY_KNOWS_MOVE: + sub_81B6D98(taskId, gText_PkmnAlreadyKnows); + return; } + if (GiveMoveToMon(mon, move[0]) != 0xFFFF) { gTasks[taskId].func = sub_81B6EB4; @@ -5195,12 +5724,12 @@ void sub_81B6DC4(u8 taskId, TaskFunc unused) } } -void sub_81B6EB4(u8 taskId) +static void sub_81B6EB4(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; s16 *move = &gUnknown_0203CEC8.unkE; u16 item = gSpecialVar_ItemId; - + if (move[1] == 0) { AdjustFriendship(mon, 4); @@ -5215,7 +5744,7 @@ void sub_81B6EB4(u8 taskId) gTasks[taskId].func = sub_81B6F60; } -void sub_81B6F60(u8 taskId) +static void sub_81B6F60(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -5224,14 +5753,14 @@ void sub_81B6F60(u8 taskId) } } -void sub_81B6F98(u8 taskId) +static void sub_81B6F98(u8 taskId) { if (IsFanfareTaskInactive() && ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))) { if (gUnknown_0203CEC8.unk10 == 1) sub_81B77AC(taskId); else - { + { if (gUnknown_0203CEC8.unk10 == 2) gSpecialVar_Result = TRUE; sub_81B12C0(taskId); @@ -5239,7 +5768,7 @@ void sub_81B6F98(u8 taskId) } } -void sub_81B6FF4(u8 taskId) +static void sub_81B6FF4(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -5248,23 +5777,23 @@ void sub_81B6FF4(u8 taskId) } } -void sub_81B7028(u8 taskId) +static void sub_81B7028(u8 taskId) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - sub_81B1B5C(gText_WhichMoveToForget, 1); - gTasks[taskId].func = sub_81B7088; - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - case 1: - sub_81B7230(taskId); - break; + case 0: + sub_81B1B5C(gText_WhichMoveToForget, 1); + gTasks[taskId].func = sub_81B7088; + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + case 1: + sub_81B7230(taskId); + break; } } -void sub_81B7088(u8 taskId) +static void sub_81B7088(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -5273,17 +5802,17 @@ void sub_81B7088(u8 taskId) } } -void sub_81B70B8(void) +static void sub_81B70B8(void) { ShowSelectMovePokemonSummaryScreen(gPlayerParty, gUnknown_0203CEC8.unk9, gPlayerPartyCount - 1, sub_81B70F0, gUnknown_0203CEC8.unkE); } -void sub_81B70F0(void) +static void sub_81B70F0(void) { InitPartyMenu(0, 0, 0, 1, 0x7F, sub_81B711C, gUnknown_0203CEC8.exitCallback); } -void sub_81B711C(u8 taskId) +static void sub_81B711C(u8 taskId) { if (!gPaletteFade.active) { @@ -5294,22 +5823,22 @@ void sub_81B711C(u8 taskId) } } -void sub_81B7154(u8 taskId) +static void sub_81B7154(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; u16 move = GetMonData(mon, MON_DATA_MOVE1 + sub_81C1B94()); - + GetMonNickname(mon, gStringVar1); StringCopy(gStringVar2, gMoveNames[move]); sub_81B6D74(gText_12PoofForgotMove); gTasks[taskId].func = sub_81B71D4; } -void sub_81B71D4(u8 taskId) +static void sub_81B71D4(u8 taskId) { struct Pokemon *mon; u16 move; - + if (sub_81B1BD4() != TRUE) { mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; @@ -5320,7 +5849,7 @@ void sub_81B71D4(u8 taskId) } } -void sub_81B7230(u8 taskId) +static void sub_81B7230(u8 taskId) { StringCopy(gStringVar2, gMoveNames[gUnknown_0203CEC8.unkE]); StringExpandPlaceholders(gStringVar4, gText_StopLearningMove2); @@ -5329,7 +5858,7 @@ void sub_81B7230(u8 taskId) gTasks[taskId].func = sub_81B7294; } -void sub_81B7294(u8 taskId) +static void sub_81B7294(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -5338,40 +5867,40 @@ void sub_81B7294(u8 taskId) } } -void sub_81B72C8(u8 taskId) +static void sub_81B72C8(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; - + switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - GetMonNickname(mon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[gUnknown_0203CEC8.unkE]); - StringExpandPlaceholders(gStringVar4, gText_MoveNotLearned); - sub_81B1B5C(gStringVar4, 1); - if (gUnknown_0203CEC8.unk10 == 1) - { - gTasks[taskId].func = sub_81B73E4; - } - else - { - if (gUnknown_0203CEC8.unk10 == 2) - gSpecialVar_Result = FALSE; - gTasks[taskId].func = sub_81B6794; - } - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - case 1: - GetMonNickname(mon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[gUnknown_0203CEC8.unkE]); - sub_81B6D74(gText_PkmnNeedsToReplaceMove); - gTasks[taskId].func = sub_81B6FF4; - break; + case 0: + GetMonNickname(mon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[gUnknown_0203CEC8.unkE]); + StringExpandPlaceholders(gStringVar4, gText_MoveNotLearned); + sub_81B1B5C(gStringVar4, 1); + if (gUnknown_0203CEC8.unk10 == 1) + { + gTasks[taskId].func = sub_81B73E4; + } + else + { + if (gUnknown_0203CEC8.unk10 == 2) + gSpecialVar_Result = FALSE; + gTasks[taskId].func = sub_81B6794; + } + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + case 1: + GetMonNickname(mon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[gUnknown_0203CEC8.unkE]); + sub_81B6D74(gText_PkmnNeedsToReplaceMove); + gTasks[taskId].func = sub_81B6FF4; + break; } } -void sub_81B73E4(u8 taskId) +static void sub_81B73E4(u8 taskId) { if (sub_81B1BD4() != TRUE) sub_81B77AC(taskId); @@ -5384,7 +5913,7 @@ void dp05_rare_candy(u8 taskId, TaskFunc task) s16 *arrayPtr = ptr->data; u16 *itemPtr = &gSpecialVar_ItemId; bool8 cannotUseEffect; - + if (GetMonData(mon, MON_DATA_LEVEL) != MAX_LEVEL) { sub_81B79A0(mon, arrayPtr); @@ -5418,7 +5947,7 @@ void dp05_rare_candy(u8 taskId, TaskFunc task) } } -void sub_81B754C(u8 slot, struct Pokemon *mon) +static void sub_81B754C(u8 slot, struct Pokemon *mon) { party_menu_get_status_condition_and_update_object(mon, &gUnknown_0203CEDC[slot]); if (gSprites[gUnknown_0203CEDC[slot].unkC].invisible) @@ -5431,7 +5960,7 @@ void sub_81B754C(u8 slot, struct Pokemon *mon) schedule_bg_copy_tilemap_to_vram(0); } -void sub_81B75D4(u8 taskId) +static void sub_81B75D4(u8 taskId) { if (WaitFanfare(FALSE) && sub_81B1BD4() != TRUE && ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))) { @@ -5441,7 +5970,7 @@ void sub_81B75D4(u8 taskId) } } -void sub_81B7634(u8 taskId) +static void sub_81B7634(u8 taskId) { if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) { @@ -5451,29 +5980,29 @@ void sub_81B7634(u8 taskId) } } -void sub_81B767C(u8 taskId) +static void sub_81B767C(u8 taskId) { s16 *arrayPtr = gUnknown_0203CEC4->data; - + arrayPtr[12] = sub_81B3364(); sub_81D3640(arrayPtr[12], arrayPtr, &arrayPtr[6], 1, 2, 3); CopyWindowToVram(arrayPtr[12], 2); schedule_bg_copy_tilemap_to_vram(2); } -void sub_81B76C8(u8 taskIdUnused) +static void sub_81B76C8(u8 taskId) { s16 *arrayPtr = gUnknown_0203CEC4->data; - + sub_81D3784(arrayPtr[12], &arrayPtr[6], 1, 2, 3); CopyWindowToVram(arrayPtr[12], 2); schedule_bg_copy_tilemap_to_vram(2); } -void sub_81B7704(u8 taskId) +static void sub_81B7704(u8 taskId) { u16 result; - + if (WaitFanfare(0) && ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))) { sub_81B3394(); @@ -5481,28 +6010,6 @@ void sub_81B7704(u8 taskId) gUnknown_0203CEC8.unk10 = 1; switch (result) { - case 0: - sub_81B7810(taskId); - break; - case 0xFFFF: - sub_81B787C(taskId); - break; - case 0xFFFE: - gTasks[taskId].func = sub_81B77AC; - break; - default: - sub_81B7910(taskId, result); - break; - } - } -} - -void sub_81B77AC(u8 taskId) -{ - u16 result = MonTryLearningNewMove(&gPlayerParty[gUnknown_0203CEC8.unk9], 0); - - switch (result) - { case 0: sub_81B7810(taskId); break; @@ -5510,18 +6017,40 @@ void sub_81B77AC(u8 taskId) sub_81B787C(taskId); break; case 0xFFFE: - return; + gTasks[taskId].func = sub_81B77AC; + break; default: sub_81B7910(taskId, result); break; + } } } -void sub_81B7810(u8 taskId) +static void sub_81B77AC(u8 taskId) +{ + u16 result = MonTryLearningNewMove(&gPlayerParty[gUnknown_0203CEC8.unk9], 0); + + switch (result) + { + case 0: + sub_81B7810(taskId); + break; + case 0xFFFF: + sub_81B787C(taskId); + break; + case 0xFFFE: + return; + default: + sub_81B7910(taskId, result); + break; + } +} + +static void sub_81B7810(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; u16 targetSpecies = GetEvolutionTargetSpecies(mon, 0, 0); - + if (targetSpecies != SPECIES_NONE) { FreePartyPointers(); @@ -5535,7 +6064,7 @@ void sub_81B7810(u8 taskId) } } -void sub_81B787C(u8 taskId) +static void sub_81B787C(u8 taskId) { GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unk9], gStringVar1); StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); @@ -5546,7 +6075,7 @@ void sub_81B787C(u8 taskId) gTasks[taskId].func = sub_81B6FF4; } -void sub_81B7910(u8 taskId, u16 move) +static void sub_81B7910(u8 taskId, u16 move) { GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unk9], gStringVar1); StringCopy(gStringVar2, gMoveNames[move]); @@ -5557,7 +6086,7 @@ void sub_81B7910(u8 taskId, u16 move) gTasks[taskId].func = sub_81B6F60; } -void sub_81B79A0(struct Pokemon *mon, s16 *data) +static void sub_81B79A0(struct Pokemon *mon, s16 *data) { data[0] = GetMonData(mon, MON_DATA_MAX_HP); data[1] = GetMonData(mon, MON_DATA_ATK); @@ -5567,7 +6096,7 @@ void sub_81B79A0(struct Pokemon *mon, s16 *data) data[3] = GetMonData(mon, MON_DATA_SPEED); } -void sub_81B79E8(u8 taskId, TaskFunc unused) +void sub_81B79E8(u8 taskId, TaskFunc task) { gUnknown_0203CEC4->data[0] = 0; gUnknown_0203CEC4->data[1] = 0; @@ -5575,26 +6104,24 @@ void sub_81B79E8(u8 taskId, TaskFunc unused) sub_81B7A28(taskId); } -#ifdef NONMATCHING -void sub_81B7A28(u8 taskId) +static void sub_81B7A28(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; u16 hp; - - if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE) + + if (GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NONE) { - hp = GetMonData(mon, MON_DATA_HP); - if (ExecuteTableBasedItemEffect__(gUnknown_0203CEC8.unk9, gSpecialVar_ItemId, 0)) - { - gTasks[taskId].func = task_sacred_ash_party_loop; - return; - } + gTasks[taskId].func = task_sacred_ash_party_loop; + return; } - else + + hp = GetMonData(mon, MON_DATA_HP); + if (ExecuteTableBasedItemEffect__(gUnknown_0203CEC8.unk9, gSpecialVar_ItemId, 0)) { gTasks[taskId].func = task_sacred_ash_party_loop; return; } + PlaySE(SE_KAIFUKU); party_menu_get_status_condition_and_update_object(mon, &gUnknown_0203CEDC[gUnknown_0203CEC8.unk9]); if (gSprites[gUnknown_0203CEDC[gUnknown_0203CEC8.unk9].unkC].invisible) @@ -5606,133 +6133,8 @@ void sub_81B7A28(u8 taskId) gUnknown_0203CEC4->data[0] = 1; gUnknown_0203CEC4->data[1] = 1; } -#else -NAKED -void sub_81B7A28(u8 taskId) -{ - asm_unified("push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - mov r8, r4\n\ - ldr r6, =gUnknown_0203CEC8\n\ - movs r1, 0x9\n\ - ldrsb r1, [r6, r1]\n\ - movs r0, 0x64\n\ - muls r1, r0\n\ - ldr r0, =gPlayerParty\n\ - adds r5, r1, r0\n\ - adds r0, r5, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _081B7A6E\n\ - adds r0, r5, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r7, r0, 16\n\ - ldrb r0, [r6, 0x9]\n\ - ldr r1, =gSpecialVar_ItemId\n\ - ldrh r1, [r1]\n\ - movs r2, 0\n\ - bl ExecuteTableBasedItemEffect__\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _081B7A94\n\ -_081B7A6E:\n\ - ldr r0, =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldr r0, =task_sacred_ash_party_loop\n\ - str r0, [r1]\n\ - b _081B7B2A\n\ - .pool\n\ -_081B7A94:\n\ - movs r0, 0x1\n\ - bl PlaySE\n\ - ldr r4, =gUnknown_0203CEDC\n\ - movs r0, 0x9\n\ - ldrsb r0, [r6, r0]\n\ - lsls r0, 4\n\ - ldr r1, [r4]\n\ - adds r1, r0\n\ - adds r0, r5, 0\n\ - bl party_menu_get_status_condition_and_update_object\n\ - ldr r2, =gSprites\n\ - movs r0, 0x9\n\ - ldrsb r0, [r6, r0]\n\ - ldr r1, [r4]\n\ - lsls r0, 4\n\ - adds r3, r0, r1\n\ - ldrb r1, [r3, 0xC]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - adds r0, 0x3E\n\ - ldrb r0, [r0]\n\ - lsls r0, 29\n\ - cmp r0, 0\n\ - bge _081B7AD6\n\ - adds r0, r5, 0\n\ - adds r1, r3, 0\n\ - movs r2, 0x1\n\ - bl DisplayPartyPokemonLevelCheck\n\ -_081B7AD6:\n\ - ldr r4, =gUnknown_0203CEC4\n\ - ldr r0, [r4]\n\ - movs r1, 0x87\n\ - lsls r1, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - movs r1, 0\n\ - bl sub_81B0FCC\n\ - ldrb r0, [r6, 0x9]\n\ - movs r1, 0x1\n\ - bl sub_81B0FCC\n\ - adds r0, r5, 0\n\ - movs r1, 0x39\n\ - bl GetMonData\n\ - adds r3, r0, 0\n\ - subs r3, r7\n\ - lsls r3, 16\n\ - asrs r3, 16\n\ - ldrb r1, [r6, 0x9]\n\ - ldr r0, =sub_81B7C10\n\ - str r0, [sp]\n\ - mov r0, r8\n\ - movs r2, 0x1\n\ - bl sub_81B1F18\n\ - mov r0, r8\n\ - movs r1, 0\n\ - adds r2, r7, 0\n\ - bl sub_81B1FA8\n\ - ldr r0, [r4]\n\ - movs r2, 0x86\n\ - lsls r2, 2\n\ - adds r1, r0, r2\n\ - movs r2, 0x1\n\ - strh r2, [r1]\n\ - ldr r1, =0x0000021a\n\ - adds r0, r1\n\ - strh r2, [r0]\n\ -_081B7B2A:\n\ - add sp, 0x4\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n"); -} -#endif -void task_sacred_ash_party_loop(u8 taskId) +static void task_sacred_ash_party_loop(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -5764,7 +6166,7 @@ void task_sacred_ash_party_loop(u8 taskId) } } -void sub_81B7C10(u8 taskId) +static void sub_81B7C10(u8 taskId) { GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unk9], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2); @@ -5941,34 +6343,34 @@ u8 GetItemEffectType(u16 item) #endif } -void sub_81B7E4C(u8 taskId) +static void sub_81B7E4C(u8 taskId) { struct Pokemon *mon; s16 *move; - + if (!gPaletteFade.active) { mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; move = &gUnknown_0203CEC8.unkE; GetMonNickname(mon, gStringVar1); - gUnknown_0203CEC8.unkE = sub_81B2360(gSpecialVar_0x8005); + gUnknown_0203CEC8.unkE = GetTutorMove(gSpecialVar_0x8005); StringCopy(gStringVar2, gMoveNames[gUnknown_0203CEC8.unkE]); move[1] = 2; - switch (CanPartyPokemonLearnTMTutor(mon, 0, gSpecialVar_0x8005)) + switch (CanMonLearnTMTutor(mon, 0, gSpecialVar_0x8005)) { - case CANNOT_LEARN_MOVE: - sub_81B6D98(taskId, gText_PkmnCantLearnMove); - return; - case ALREADY_KNOWS_MOVE: - sub_81B6D98(taskId, gText_PkmnAlreadyKnows); + case CANNOT_LEARN_MOVE: + sub_81B6D98(taskId, gText_PkmnCantLearnMove); + return; + case ALREADY_KNOWS_MOVE: + sub_81B6D98(taskId, gText_PkmnAlreadyKnows); + return; + default: + if (GiveMoveToMon(mon, gUnknown_0203CEC8.unkE) != 0xFFFF) + { + sub_81B6EB4(taskId); return; - default: - if (GiveMoveToMon(mon, gUnknown_0203CEC8.unkE) != 0xFFFF) - { - sub_81B6EB4(taskId); - return; - } - break; + } + break; } sub_81B6D74(gText_PkmnNeedsToReplaceMove); gTasks[taskId].func = sub_81B6FF4; @@ -5987,7 +6389,7 @@ void sub_81B7F60(void) gUnknown_0203CEC8.unkC = gSpecialVar_ItemId; } -void sub_81B7FAC(u8 taskId) +static void sub_81B7FAC(u8 taskId) { gUnknown_0203CEFC = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_HELD_ITEM); if (gUnknown_0203CEFC == ITEM_NONE) @@ -6005,7 +6407,7 @@ void sub_81B7FAC(u8 taskId) } } -void sub_81B8044(u8 taskId) +static void sub_81B8044(u8 taskId) { if (ItemIsMail(gUnknown_0203CEC8.unkC)) { @@ -6019,10 +6421,10 @@ void sub_81B8044(u8 taskId) } } -void sub_81B8088(u8 taskId) +static void sub_81B8088(u8 taskId) { u16 item; - + if (!gPaletteFade.active) { item = gUnknown_0203CEC8.unkC; @@ -6033,10 +6435,10 @@ void sub_81B8088(u8 taskId) } } -void sub_81B8104(u8 taskId) +static void sub_81B8104(u8 taskId) { s8 slot = gUnknown_0203CEC8.unk9; - + if (sub_81B1BD4() != TRUE) { sub_81B5C94(&gPlayerParty[slot], &gUnknown_0203CEDC[slot]); @@ -6044,20 +6446,20 @@ void sub_81B8104(u8 taskId) } } -void sub_81B814C(void) +static void sub_81B814C(void) { u8 mail; - + sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], gUnknown_0203CEC8.unkC); mail = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_MAIL); sub_811A20C(4, gSaveBlock1Ptr->mail[mail].words, sub_81B81A8, 3); } -void sub_81B81A8(void) +static void sub_81B81A8(void) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; u16 item = GetMonData(mon, MON_DATA_HELD_ITEM); - + if (gSpecialVar_Result == FALSE) { TakeMailFromMon(mon); @@ -6072,7 +6474,7 @@ void sub_81B81A8(void) } } -void sub_81B8230(u8 taskId) +static void sub_81B8230(u8 taskId) { if (!gPaletteFade.active) { @@ -6084,7 +6486,7 @@ void sub_81B8230(u8 taskId) } } -void sub_81B82A0(u8 taskId) +static void sub_81B82A0(u8 taskId) { if (sub_81B1BD4() != TRUE) { @@ -6093,50 +6495,50 @@ void sub_81B82A0(u8 taskId) } } -void sub_81B82D4(u8 taskId) +static void sub_81B82D4(u8 taskId) { u16 item; - + switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - item = gUnknown_0203CEC8.unkC; - sub_81B83F0(item); - if (AddBagItem(gUnknown_0203CEFC, 1) == FALSE) - { - sub_81B841C(item); - pokemon_item_not_removed(gUnknown_0203CEFC); - sub_81B1B5C(gStringVar4, 0); - gTasks[taskId].func = sub_81B8104; - } - else if (ItemIsMail(item)) - { - gUnknown_0203CEC4->exitCallback = sub_81B814C; - sub_81B12C0(taskId); - } - else - { - sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], item); - sub_81B1D68(item, gUnknown_0203CEFC, 1); - gTasks[taskId].func = sub_81B8104; - } - break; - case MENU_B_PRESSED: - PlaySE(SE_SELECT); - case 1: + case 0: + item = gUnknown_0203CEC8.unkC; + sub_81B83F0(item); + if (AddBagItem(gUnknown_0203CEFC, 1) == FALSE) + { + sub_81B841C(item); + pokemon_item_not_removed(gUnknown_0203CEFC); + sub_81B1B5C(gStringVar4, 0); gTasks[taskId].func = sub_81B8104; - break; + } + else if (ItemIsMail(item)) + { + gUnknown_0203CEC4->exitCallback = sub_81B814C; + sub_81B12C0(taskId); + } + else + { + sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], item); + sub_81B1D68(item, gUnknown_0203CEFC, 1); + gTasks[taskId].func = sub_81B8104; + } + break; + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + case 1: + gTasks[taskId].func = sub_81B8104; + break; } } -void sub_81B83B8(u8 taskId) +static void sub_81B83B8(u8 taskId) { sub_81B1B5C(gText_RemoveMailBeforeItem, 1); schedule_bg_copy_tilemap_to_vram(2); gTasks[taskId].func = sub_81B8104; } -void sub_81B83F0(u16 item) +static void sub_81B83F0(u16 item) { if (gUnknown_0203CEC8.unkB == 6) RemovePCItem(item, 1); @@ -6144,7 +6546,7 @@ void sub_81B83F0(u16 item) RemoveBagItem(item, 1); } -bool8 sub_81B841C(u16 item) +static bool8 sub_81B841C(u16 item) { if (gUnknown_0203CEC8.unkB == 5) return AddBagItem(item, 1); @@ -6157,11 +6559,11 @@ void sub_81B8448(void) InitPartyMenu(0, 0, 7, 0, 6, sub_81B1370, Mailbox_ReturnToMailListAfterDeposit); } -void sub_81B8474(u8 taskId) +static void sub_81B8474(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9]; struct MailStruct *mail; - + gUnknown_0203CEE8 = 0; mail = &gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos]; if (GetMonData(mon, MON_DATA_HELD_ITEM) != ITEM_NONE) @@ -6187,10 +6589,10 @@ void sub_81B8518(u8 unused) void sub_81B8558(void) { - memset(gSelectedOrderFromParty, 0, ARRAY_COUNT(gSelectedOrderFromParty)); + memset(gSelectedOrderFromParty, 0, sizeof(gSelectedOrderFromParty)); } -u8 sub_81B856C(s8 slot) +static u8 sub_81B856C(s8 slot) { if (GetBattleEntryEligibility(&gPlayerParty[slot]) == FALSE) return 2; @@ -6199,215 +6601,81 @@ u8 sub_81B856C(s8 slot) return 0; } -bool8 GetBattleEntryEligibility(struct Pokemon *mon) +static bool8 GetBattleEntryEligibility(struct Pokemon *mon) { u16 i = 0; u16 species; - - if (GetMonData(mon, MON_DATA_IS_EGG) || GetMonData(mon, MON_DATA_LEVEL) > sub_81B8888() || - (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) && - gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) && - GetMonData(mon, MON_DATA_HELD_ITEM) != ITEM_NONE)) + + if (GetMonData(mon, MON_DATA_IS_EGG) + || GetMonData(mon, MON_DATA_LEVEL) > sub_81B8888() + || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) + && GetMonData(mon, MON_DATA_HELD_ITEM) != ITEM_NONE)) + { return FALSE; + } + switch (VarGet(VAR_FRONTIER_FACILITY)) // oddly the specific cases are beyond 6, turns out case 9 is apparently related to link battles { - case 9: - if (GetMonData(mon, MON_DATA_HP) != 0) - return TRUE; - return FALSE; - case 8: - return TRUE; - default: - species = GetMonData(mon, MON_DATA_SPECIES); - for (; gFrontierBannedSpecies[i] != 0xFFFF; i++) - { - if (gFrontierBannedSpecies[i] == species) - return FALSE; - } + case 9: + if (GetMonData(mon, MON_DATA_HP) != 0) return TRUE; + return FALSE; + case 8: + return TRUE; + default: + species = GetMonData(mon, MON_DATA_SPECIES); + for (; gFrontierBannedSpecies[i] != 0xFFFF; i++) + { + if (gFrontierBannedSpecies[i] == species) + return FALSE; + } + return TRUE; } } -#ifdef NONMATCHING -u8 sub_81B865C(void) +static u8 sub_81B865C(void) { - u8 unk = sub_81B885C(); u8 unk2; u8 i, j; - u16 species; - u16 item; - u8 facilityNum; - - if (gSelectedOrderFromParty[unk - 1] == 0) + u8 facility; + struct Pokemon *party = gPlayerParty; + u8 unk = sub_81B885C(); + u8 *order = gSelectedOrderFromParty; + + if (order[unk - 1] == 0) { if (unk == 1) return 14; ConvertIntToDecimalStringN(gStringVar1, unk, 0, 1); return 17; } - facilityNum = VarGet(VAR_FRONTIER_FACILITY); - if (facilityNum != 8 && facilityNum != 9) + + facility = VarGet(VAR_FRONTIER_FACILITY); + if (facility == 8 || facility == 9) + return 0xFF; + + unk2 = sub_81B8830(); + for (i = 0; i < unk2 - 1; i++) { - unk2 = sub_81B8830(); - for (i = 0; i < (unk2 - 1); i++) + u16 species = GetMonData(&party[order[i] - 1], MON_DATA_SPECIES); + u16 item = GetMonData(&party[order[i] - 1], MON_DATA_HELD_ITEM); + for (j = i + 1; j < unk2; j++) { - species = GetMonData(&gPlayerParty[gSelectedOrderFromParty[i - 1]], MON_DATA_SPECIES); - item = GetMonData(&gPlayerParty[gSelectedOrderFromParty[i - 1]], MON_DATA_HELD_ITEM); - for (j = i + 1; j < unk2; j++) - { - if (species == GetMonData(&gPlayerParty[gSelectedOrderFromParty[j - 1]], MON_DATA_SPECIES)) - return 18; - if (item != ITEM_NONE && item == GetMonData(&gPlayerParty[gSelectedOrderFromParty[j - 1]], MON_DATA_HELD_ITEM)) - return 19; - } + if (species == GetMonData(&party[order[j] - 1], MON_DATA_SPECIES)) + return 18; + if (item != ITEM_NONE && item == GetMonData(&party[order[j] - 1], MON_DATA_HELD_ITEM)) + return 19; } } + return 0xFF; } -#else -NAKED -u8 sub_81B865C(void) -{ - asm_unified("push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - bl sub_81B885C\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - adds r1, r2, 0\n\ - ldr r3, =gSelectedOrderFromParty\n\ - adds r0, r2, r3\n\ - subs r0, 0x1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _081B869C\n\ - cmp r2, 0x1\n\ - bne _081B8688\n\ - movs r0, 0xE\n\ - b _081B8758\n\ - .pool\n\ -_081B8688:\n\ - ldr r0, =gStringVar1\n\ - movs r2, 0\n\ - movs r3, 0x1\n\ - bl ConvertIntToDecimalStringN\n\ - movs r0, 0x11\n\ - b _081B8758\n\ - .pool\n\ -_081B869C:\n\ - ldr r0, =0x000040cf\n\ - bl VarGet\n\ - lsls r0, 24\n\ - movs r1, 0xF8\n\ - lsls r1, 24\n\ - adds r0, r1\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bhi _081B86C0\n\ - b _081B8756\n\ - .pool\n\ -_081B86B8:\n\ - movs r0, 0x12\n\ - b _081B8758\n\ -_081B86BC:\n\ - movs r0, 0x13\n\ - b _081B8758\n\ -_081B86C0:\n\ - bl sub_81B8830\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - movs r5, 0\n\ - b _081B8750\n\ -_081B86CE:\n\ - ldr r3, =gSelectedOrderFromParty\n\ - adds r4, r3, r5\n\ - ldrb r0, [r4]\n\ - movs r1, 0x64\n\ - muls r0, r1\n\ - subs r0, 0x64\n\ - ldr r3, =gPlayerParty\n\ - adds r0, r3, r0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r10, r0\n\ - ldrb r0, [r4]\n\ - movs r1, 0x64\n\ - muls r0, r1\n\ - subs r0, 0x64\n\ - ldr r3, =gPlayerParty\n\ - adds r0, r3, r0\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r6, r0, 16\n\ - adds r1, r5, 0x1\n\ - lsls r0, r1, 24\n\ - lsrs r4, r0, 24\n\ - mov r9, r1\n\ - cmp r4, r8\n\ - bcs _081B8748\n\ - movs r7, 0x64\n\ -_081B870E:\n\ - ldr r0, =gSelectedOrderFromParty\n\ - adds r5, r0, r4\n\ - ldrb r0, [r5]\n\ - muls r0, r7\n\ - subs r0, 0x64\n\ - ldr r1, =gPlayerParty\n\ - adds r0, r1, r0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r10, r0\n\ - beq _081B86B8\n\ - cmp r6, 0\n\ - beq _081B873E\n\ - ldrb r0, [r5]\n\ - muls r0, r7\n\ - subs r0, 0x64\n\ - ldr r3, =gPlayerParty\n\ - adds r0, r3, r0\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - cmp r6, r0\n\ - beq _081B86BC\n\ -_081B873E:\n\ - adds r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - cmp r4, r8\n\ - bcc _081B870E\n\ -_081B8748:\n\ - mov r1, r9\n\ - lsls r0, r1, 24\n\ - lsrs r5, r0, 24\n\ - mov r0, r8\n\ -_081B8750:\n\ - subs r0, 0x1\n\ - cmp r5, r0\n\ - blt _081B86CE\n\ -_081B8756:\n\ - movs r0, 0xFF\n\ -_081B8758:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .pool\n"); -} -#endif -bool8 sub_81B8770(u8 slot) +static bool8 sub_81B8770(u8 slot) { u8 i; - + for (i = 0; i < 4; i++) { if (gSelectedOrderFromParty[i] == slot) @@ -6416,14 +6684,14 @@ bool8 sub_81B8770(u8 slot) return FALSE; } -void sub_81B879C(u8 taskId) +static void sub_81B879C(u8 taskId) { - u8 msgID = sub_81B865C(); - - if (msgID != 0xFF) + u8 msgId = sub_81B865C(); + + if (msgId != 0xFF) { PlaySE(SE_HAZURE); - display_pokemon_menu_message(msgID); + display_pokemon_menu_message(msgId); gTasks[taskId].func = sub_81B87E8; } else @@ -6433,7 +6701,7 @@ void sub_81B879C(u8 taskId) } } -void sub_81B87E8(u8 taskId) +static void sub_81B87E8(u8 taskId) { if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) { @@ -6443,56 +6711,57 @@ void sub_81B87E8(u8 taskId) } } -u8 sub_81B8830(void) +static u8 sub_81B8830(void) { switch (VarGet(VAR_FRONTIER_FACILITY)) { - case 9: - return 3; - case 8: - return 2; - default: - return gSpecialVar_0x8005; + case 9: + return 3; + case 8: + return 2; + default: + return gSpecialVar_0x8005; } } -u8 sub_81B885C(void) +static u8 sub_81B885C(void) { switch (VarGet(VAR_FRONTIER_FACILITY)) { - case 9: - return 1; - case 8: - return 2; - default: - return gSpecialVar_0x8005; + case 9: + return 1; + case 8: + return 2; + default: + return gSpecialVar_0x8005; } } -u8 sub_81B8888(void) +static u8 sub_81B8888(void) { switch (VarGet(VAR_FRONTIER_FACILITY)) { - case 9: - return 100; - case 8: - return 30; - default: - if (gSpecialVar_0x8004 == 0) - return 50; - return 100; + case 9: + return 100; + case 8: + return 30; + default: + if (gSpecialVar_0x8004 == 0) + return 50; + return 100; } } -const u8* sub_81B88BC(void) +static const u8* sub_81B88BC(void) { u8 facilityNum = VarGet(VAR_FRONTIER_FACILITY); - + if (!(facilityNum != 8 && facilityNum != 9)) return gText_CancelBattle; - if (facilityNum == FRONTIER_FACILITY_DOME && gSpecialVar_0x8005 == 2) + else if (facilityNum == FRONTIER_FACILITY_DOME && gSpecialVar_0x8005 == 2) return gText_ReturnToWaitingRoom; - return gText_CancelChallenge; + else + return gText_CancelChallenge; } void sub_81B8904(u8 initArg, MainCallback callback) @@ -6510,7 +6779,7 @@ void sub_81B8958(void) InitPartyMenu(11, 0, 13, 0, 1, sub_81B1370, CB2_ReturnToFieldContinueScriptPlayMapMusic); } -u8 sub_81B8984(void) +static u8 sub_81B8984(void) { if (IsDoubleBattle() == FALSE) return 0; @@ -6533,7 +6802,7 @@ void sub_81B89F0(void) pokemon_change_order(); } -u8 sub_81B8A2C(struct Pokemon *mon) +static u8 sub_81B8A2C(struct Pokemon *mon) { if (GetMonData(&gPlayerParty[1], MON_DATA_SPECIES) != SPECIES_NONE && GetMonData(mon, MON_DATA_IS_EGG) == FALSE) { @@ -6545,13 +6814,12 @@ u8 sub_81B8A2C(struct Pokemon *mon) return 7; } -bool8 sub_81B8A7C(void) +static bool8 sub_81B8A7C(void) { u8 slot = GetCursorSelectionMonId(); u8 newSlot; u8 i; - u8 neededToMatch; - + if (IsMultiBattle() == TRUE && (slot == 1 || slot == 4 || slot == 5)) { StringCopy(gStringVar1, GetTrainerPartnerName()); @@ -6591,8 +6859,8 @@ bool8 sub_81B8A7C(void) } if (gUnknown_0203CEC8.unkB == 2) { - neededToMatch = gBattlerInMenuId; - GetMonNickname(&gPlayerParty[pokemon_order_func(gBattlerPartyIndexes[neededToMatch])], gStringVar1); + u8 currBattler = gBattlerInMenuId; + GetMonNickname(&gPlayerParty[pokemon_order_func(gBattlerPartyIndexes[currBattler])], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_PkmnCantSwitchOut); return FALSE; } @@ -6609,11 +6877,11 @@ void sub_81B8C68(void) sub_81B8C88(gUnknown_0203CF00, sub_806D7EC()); } -void sub_81B8C88(u8 *ptr, bool8 multiplayerFlag) +static void sub_81B8C88(u8 *ptr, bool8 multiplayerFlag) { u8 partyIndexes[6]; int i, j; - + if (IsMultiBattle() == TRUE) { if (multiplayerFlag) @@ -6661,19 +6929,19 @@ void sub_81B8C88(u8 *ptr, bool8 multiplayerFlag) ptr[i] = (partyIndexes[0 + (i * 2)] << 4) | partyIndexes[1 + (i * 2)]; } -void sub_81B8D64(u8 battlerPosition, u8 multiplayerFlag) +void sub_81B8D64(u8 battlerId, u8 multiplayerFlag) { - sub_81B8D88(gBattleStruct->field_60[battlerPosition], multiplayerFlag, battlerPosition); + sub_81B8D88(gBattleStruct->field_60[battlerId], multiplayerFlag, battlerId); } -void sub_81B8D88(u8 *ptr, bool8 multiplayerFlag, u8 battlerPosition) +static void sub_81B8D88(u8 *ptr, bool8 multiplayerFlag, u8 battlerId) { u8 partyIndexes[6]; int i, j; u8 leftBattler; u8 rightBattler; - - if (GetBattlerSide(battlerPosition) == B_SIDE_PLAYER) + + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { leftBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); rightBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); @@ -6683,6 +6951,7 @@ void sub_81B8D88(u8 *ptr, bool8 multiplayerFlag, u8 battlerPosition) leftBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); rightBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } + if (IsMultiBattle() == TRUE) { if (multiplayerFlag) @@ -6726,21 +6995,22 @@ void sub_81B8D88(u8 *ptr, bool8 multiplayerFlag, u8 battlerPosition) } } } + for (i = 0; i < 3; i++) ptr[i] = (partyIndexes[0 + (i * 2)] << 4) | partyIndexes[1 + (i * 2)]; } -void sub_81B8E80(u8 battlerPosition, u8 unk, u8 arrayIndex) +void sub_81B8E80(u8 battlerId, u8 unk, u8 arrayIndex) { u8 possiblePartyIndexes[6]; u8 unk2 = 0; int i, j; u8 *battleStructRelated; u8 possiblePartyIndexBuffer; - + if (IsMultiBattle()) { - battleStructRelated = gBattleStruct->field_60[battlerPosition]; + battleStructRelated = gBattleStruct->field_60[battlerId]; for (i = j = 0; i < 3; j++, i++) { possiblePartyIndexes[j] = battleStructRelated[i] >> 4; @@ -6767,11 +7037,11 @@ void sub_81B8E80(u8 battlerPosition, u8 unk, u8 arrayIndex) } } -u8 sub_81B8F38(u8 slot) +static u8 sub_81B8F38(u8 slot) { u8 modResult = slot & 1; u8 retVal; - + slot /= 2; if (modResult != 0) retVal = gUnknown_0203CF00[slot] & 0xF; @@ -6780,10 +7050,10 @@ u8 sub_81B8F38(u8 slot) return retVal; } -void sub_81B8F6C(u8 slot, u8 setVal) +static void sub_81B8F6C(u8 slot, u8 setVal) { bool32 modResult = slot & 1; - + slot /= 2; if (modResult != 0) gUnknown_0203CF00[slot] = (gUnknown_0203CF00[slot] & 0xF0) | setVal; @@ -6801,7 +7071,7 @@ void sub_81B8FB0(u8 slot, u8 slot2) u8 pokemon_order_func(u8 slot) { u8 i, j; - + for (j = i = 0; i < 3; j++, i++) { if ((gUnknown_0203CF00[i] >> 4) != slot) @@ -6818,34 +7088,34 @@ u8 pokemon_order_func(u8 slot) return 0; } -void pokemon_change_order(void) +static void pokemon_change_order(void) { struct Pokemon *partyBuffer = Alloc(sizeof(gPlayerParty)); u8 i; - + memcpy(partyBuffer, gPlayerParty, sizeof(gPlayerParty)); for (i = 0; i < PARTY_SIZE; i++) memcpy(&gPlayerParty[pokemon_order_func(i)], &partyBuffer[i], sizeof(struct Pokemon)); Free(partyBuffer); } -void sub_81B9080(void) +static void sub_81B9080(void) { struct Pokemon *partyBuffer = Alloc(sizeof(gPlayerParty)); u8 i; - + memcpy(partyBuffer, gPlayerParty, sizeof(gPlayerParty)); for (i = 0; i < PARTY_SIZE; i++) memcpy(&gPlayerParty[sub_81B8F38(i)], &partyBuffer[i], sizeof(struct Pokemon)); Free(partyBuffer); } -void sub_81B90D0(void) +static void sub_81B90D0(void) { u8 i; struct Pokemon *mon; u8 leadVal; - + for (i = 1; i < PARTY_SIZE; i++) { mon = &gPlayerParty[sub_81B8F38(i)]; @@ -6859,7 +7129,7 @@ void sub_81B90D0(void) } } -void sub_81B9140(void) +static void sub_81B9140(void) { SetMainCallback2(SetCB2ToReshowScreenAfterMenu); } @@ -6869,7 +7139,7 @@ void sub_81B9150(void) InitPartyMenu(5, 3, 0, 0, 0x7F, sub_81B917C, gMain.savedCallback); } -void sub_81B917C(u8 taskId) +static void sub_81B917C(u8 taskId) { gTasks[taskId].data[0] = 256; sub_81B9294(taskId); @@ -6877,11 +7147,11 @@ void sub_81B917C(u8 taskId) gTasks[taskId].func = sub_81B91B4; } -void sub_81B91B4(u8 taskId) +static void sub_81B91B4(u8 taskId) { s16 *data = gTasks[taskId].data; u8 i; - + if (!gPaletteFade.active) { data[0] -= 8; @@ -6899,25 +7169,25 @@ void sub_81B91B4(u8 taskId) } } -void sub_81B9240(u8 taskId) +static void sub_81B9240(u8 taskId) { s16 *data = gTasks[taskId].data; - + if (++data[0] == 0x100) sub_81B12C0(taskId); } -void sub_81B9270(u8 spriteId, s16 x) +static void sub_81B9270(u8 spriteId, s16 x) { if (x >= 0) gSprites[spriteId].pos2.x = x; } -void sub_81B9294(u8 taskId) +static void sub_81B9294(u8 taskId) { s16 *data = gTasks[taskId].data; u8 i; - + for (i = 3; i < PARTY_SIZE; i++) { if (gUnknown_02022FF8[i - 3].species != SPECIES_NONE) @@ -6936,13 +7206,13 @@ void sub_81B9328(void) InitPartyMenu(6, 0, 0, 0, 15, sub_81B1370, sub_81B9390); } -void sub_81B9354(u8 arg1) +static void sub_81B9354(u8 arg1) { gFieldCallback2 = hm_add_c3_without_phase_2; InitPartyMenu(arg1, 0, 11, 0, 0, sub_81B1370, CB2_ReturnToField); } -void sub_81B9390(void) +static void sub_81B9390(void) { gSpecialVar_0x8004 = GetCursorSelectionMonId(); if (gSpecialVar_0x8004 >= PARTY_SIZE) @@ -6958,7 +7228,7 @@ bool8 hm_add_c3_without_phase_2(void) // might not be bool return TRUE; } -void task_hm_without_phase_2(u8 taskId) +static void task_hm_without_phase_2(u8 taskId) { if (IsWeatherNotFadingIn()) { @@ -6975,17 +7245,17 @@ void sub_81B9404(void) CreateTask(sub_81B9424, 10); } -void sub_81B9424(u8 taskId) +static void sub_81B9424(u8 taskId) { if (!gPaletteFade.active) { - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); InitPartyMenu(2, 0, 11, 0, 0, sub_81B1370, sub_81B9470); DestroyTask(taskId); } } -void sub_81B9470(void) +static void sub_81B9470(void) { gUnknown_02039F24 = GetCursorSelectionMonId(); if (gUnknown_02039F24 >= PARTY_SIZE) @@ -7002,11 +7272,11 @@ void sub_81B94B0(void) CreateTask(sub_81B94D0, 10); } -void sub_81B94D0(u8 taskId) +static void sub_81B94D0(u8 taskId) { if (!gPaletteFade.active) { - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); InitPartyMenu(3, 0, 11, 0, 0, sub_81B1370, sub_81B9390); DestroyTask(taskId); } @@ -7019,17 +7289,17 @@ void sub_81B951C(void) CreateTask(sub_81B953C, 10); } -void sub_81B953C(u8 taskId) +static void sub_81B953C(u8 taskId) { if (!gPaletteFade.active) { - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); InitPartyMenu(7, 0, 11, 0, 0, sub_81B1370, sub_81B9588); DestroyTask(taskId); } } -void sub_81B9588(void) +static void sub_81B9588(void) { gSpecialVar_0x8004 = GetCursorSelectionMonId(); if (gSpecialVar_0x8004 >= PARTY_SIZE) @@ -7043,7 +7313,7 @@ void sub_81B9588(void) void sub_81B95E0(void) { u8 i; - + gSpecialVar_Result = FALSE; for (i = 0; i < 3; i++) { @@ -7062,11 +7332,11 @@ void sub_81B9620(void) CreateTask(sub_81B9640, 10); } -void sub_81B9640(u8 taskId) +static void sub_81B9640(u8 taskId) { if (!gPaletteFade.active) { - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); InitPartyMenu(12, 0, 0, 0, 0, sub_81B1370, sub_81B9390); DestroyTask(taskId); } @@ -7081,7 +7351,7 @@ void sub_81B968C(void) void sub_81B96D0(void) { u8 i; - + gSpecialVar_Result = 0; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -7094,7 +7364,7 @@ void sub_81B9718(void) { struct Pokemon *mon = &gPlayerParty[gSpecialVar_0x8004]; u16 move = GetMonData(mon, MON_DATA_MOVE1 + gSpecialVar_0x8005); - + GetMonNickname(mon, gStringVar1); StringCopy(gStringVar2, gMoveNames[move]); } @@ -7102,14 +7372,14 @@ void sub_81B9718(void) void sub_81B9770(void) { u16 i; - + SetMonMoveSlot(&gPlayerParty[gSpecialVar_0x8004], MOVE_NONE, gSpecialVar_0x8005); RemoveMonPPBonus(&gPlayerParty[gSpecialVar_0x8004], gSpecialVar_0x8005); for (i = gSpecialVar_0x8005; i < MAX_MON_MOVES - 1; i++) sub_81B97DC(&gPlayerParty[gSpecialVar_0x8004], i, i + 1); } -void sub_81B97DC(struct Pokemon *mon, u8 slotTo, u8 slotFrom) +static void sub_81B97DC(struct Pokemon *mon, u8 slotTo, u8 slotFrom) { u16 move1 = GetMonData(mon, MON_DATA_MOVE1 + slotTo); u16 move0 = GetMonData(mon, MON_DATA_MOVE1 + slotFrom); @@ -7142,7 +7412,7 @@ void sub_81B9918(void) { u16 move; u32 i, j; - + gSpecialVar_Result = FALSE; move = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_MOVE1 + gSpecialVar_0x8005); if (move == MOVE_SURF) @@ -7158,7 +7428,7 @@ void sub_81B9918(void) } } } - if (sub_80D23A8(move) != TRUE) + if (AnyStorageMonWithMove(move) != TRUE) gSpecialVar_Result = TRUE; } } diff --git a/src/player_pc.c b/src/player_pc.c index c41dfa380..474cecaf5 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -461,9 +461,9 @@ static void ItemStorageMenuProcessInput(u8 taskId) s8 r2; s8 inputOptionId; - r5 = GetMenuCursorPos(); + r5 = Menu_GetCursorPos(); inputOptionId = Menu_ProcessInput(); - r2 = GetMenuCursorPos(); + r2 = Menu_GetCursorPos(); switch(inputOptionId) { case -2: @@ -491,7 +491,7 @@ static void Task_ItemStorage_Deposit(u8 taskId) { if (!gPaletteFade.active) { - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); sub_81AAC14(); DestroyTask(taskId); } @@ -723,7 +723,7 @@ static void Mailbox_FadeAndReadMail(u8 taskId) if (!gPaletteFade.active) { sub_81D1EC0(); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); ReadMail(&(gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos]), Mailbox_ReturnToFieldFromReadMail, TRUE); DestroyTask(taskId); } @@ -823,7 +823,7 @@ static void Mailbox_DoGiveMailPokeMenu(u8 taskId) if (!gPaletteFade.active) { sub_81D1EC0(); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); sub_81B8448(); DestroyTask(taskId); } diff --git a/src/pokeball.c b/src/pokeball.c index aa29b020f..1938d888d 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -999,8 +999,8 @@ void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 battlerId, u8 x, u8 y, { u8 spriteId; - LoadCompressedObjectPicUsingHeap(&gBallSpriteSheets[0]); - LoadCompressedObjectPaletteUsingHeap(&gBallSpritePalettes[0]); + LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[0]); + LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[0]); spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, subpriortiy); gSprites[spriteId].data[0] = monSpriteId; @@ -1101,8 +1101,8 @@ u8 sub_807671C(u8 a, u8 b, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 g, u32 { u8 spriteId; - LoadCompressedObjectPicUsingHeap(&gBallSpriteSheets[0]); - LoadCompressedObjectPaletteUsingHeap(&gBallSpritePalettes[0]); + LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[0]); + LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[0]); spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, subPriority); gSprites[spriteId].data[0] = a; gSprites[spriteId].data[1] = g; @@ -1170,7 +1170,7 @@ static void sub_80768F0(struct Sprite *sprite) sprite->callback = SpriteCallbackDummy; } -static void DestroySpriteAndFreeResources_(struct Sprite *sprite) +static void Unref_DestroySpriteAndFreeResources(struct Sprite *sprite) { DestroySpriteAndFreeResources(sprite); } @@ -1245,8 +1245,8 @@ void LoadBallGfx(u8 ballId) if (GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag) == 0xFFFF) { - LoadCompressedObjectPicUsingHeap(&gBallSpriteSheets[ballId]); - LoadCompressedObjectPaletteUsingHeap(&gBallSpritePalettes[ballId]); + LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[ballId]); + LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[ballId]); } switch (ballId) { diff --git a/src/pokeblock.c b/src/pokeblock.c index 1418588b8..7c07f9655 100644 --- a/src/pokeblock.c +++ b/src/pokeblock.c @@ -1,4 +1,5 @@ #include "global.h" +#include "alloc.h" #include "battle.h" #include "battle_controllers.h" #include "battle_message.h" @@ -6,14 +7,15 @@ #include "bg.h" #include "decompress.h" #include "event_data.h" +#include "field_screen_effect.h" #include "gpu_regs.h" #include "graphics.h" #include "international_string_util.h" #include "item.h" +#include "item_menu.h" #include "lilycove_lady.h" #include "list_menu.h" #include "main.h" -#include "alloc.h" #include "menu.h" #include "menu_helpers.h" #include "overworld.h" @@ -70,14 +72,9 @@ enum PKBL_GIVE_TO_LADY }; -extern u16 gSpecialVar_ItemId; extern const u16 gUnknown_0860F074[]; -extern void CB2_ReturnToField(void); -extern bool8 sub_81221EC(void); -extern void sub_80AF168(void); - // this file's functions static void CB2_InitPokeblockMenu(void); static bool8 InitPokeblockMenu(void); @@ -640,11 +637,11 @@ static bool8 LoadPokeblockMenuGfx(void) sPokeblockMenu->gfxState++; break; case 3: - LoadCompressedObjectPic(&gPokeblockCase_SpriteSheet); + LoadCompressedSpriteSheet(&gPokeblockCase_SpriteSheet); sPokeblockMenu->gfxState++; break; case 4: - LoadCompressedObjectPalette(&gPokeblockCase_SpritePal); + LoadCompressedSpritePalette(&gPokeblockCase_SpritePal); sPokeblockMenu->gfxState++; break; case 5: diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c index 2271d7adf..b1f182b66 100644 --- a/src/pokeblock_feed.c +++ b/src/pokeblock_feed.c @@ -656,25 +656,25 @@ static bool8 LoadMonAndSceneGfx(struct Pokemon *mon) trainerId = GetMonData(mon, MON_DATA_OT_ID); palette = GetMonSpritePalStructFromOtIdPersonality(species, trainerId, personality); - LoadCompressedObjectPalette(palette); + LoadCompressedSpritePalette(palette); SetMultiuseSpriteTemplateToPokemon(palette->tag, 1); sPokeblockFeed->loadGfxState++; break; case 2: - LoadCompressedObjectPic(&gPokeblockCase_SpriteSheet); + LoadCompressedSpriteSheet(&gPokeblockCase_SpriteSheet); sPokeblockFeed->loadGfxState++; break; case 3: - LoadCompressedObjectPalette(&gPokeblockCase_SpritePal); + LoadCompressedSpritePalette(&gPokeblockCase_SpritePal); sPokeblockFeed->loadGfxState++; break; case 4: - LoadCompressedObjectPic(&sPokeblock_SpriteSheet); + LoadCompressedSpriteSheet(&sPokeblock_SpriteSheet); sPokeblockFeed->loadGfxState++; break; case 5: SetPokeblockSpritePal(gSpecialVar_ItemId); - LoadCompressedObjectPalette(&sPokeblockSpritePal); + LoadCompressedSpritePalette(&sPokeblockSpritePal); sPokeblockFeed->loadGfxState++; break; case 6: diff --git a/src/pokedex.c b/src/pokedex.c index ef8905bb6..755a46821 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -1803,7 +1803,7 @@ bool8 sub_80BC514(u8 a) ResetSpriteData(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; - LoadCompressedObjectPic(&sInterfaceSpriteSheet[0]); + LoadCompressedSpriteSheet(&sInterfaceSpriteSheet[0]); LoadSpritePalettes(sInterfaceSpritePalette); CreateInterfaceSprites(a); gMain.state++; @@ -4815,7 +4815,7 @@ void sub_80C12E0(u8 taskId) } break; case 1: - LoadCompressedObjectPic(sInterfaceSpriteSheet); + LoadCompressedSpriteSheet(sInterfaceSpriteSheet); LoadSpritePalettes(sInterfaceSpritePalette); sub_80C2594(taskId); for (i = 0; i < 16; i++) diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c index 30a127c71..a268b5382 100755 --- a/src/pokedex_area_screen.c +++ b/src/pokedex_area_screen.c @@ -533,7 +533,7 @@ static void Task_PokedexAreaScreen_0(u8 taskId) HideBg(0); break; case 1: - SetBgAttribute(3, BG_CTRL_ATTR_VISIBLE, 3); + SetBgAttribute(3, BG_ATTR_CHARBASEINDEX, 3); sub_81C4D70(&sUnknown_085B4018); StringFill(sPokedexAreaScreen->charBuffer, CHAR_SPACE, 16); break; @@ -628,8 +628,8 @@ static void Task_PokedexAreaScreen_1(u8 taskId) static void sub_813D6B4(void) { - SetBgAttribute(3, BG_CTRL_ATTR_VISIBLE, 0); - SetBgAttribute(3, BG_CTRL_ATTR_SCREENSIZE, 0); + SetBgAttribute(3, BG_ATTR_CHARBASEINDEX, 0); + SetBgAttribute(3, BG_ATTR_PALETTEMODE, 0); } static void CreateAreaMarkerSprites(void) diff --git a/src/pokemon.c b/src/pokemon.c index 640d70776..580216b2c 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1,4 +1,5 @@ #include "global.h" +#include "alloc.h" #include "apprentice.h" #include "battle.h" #include "battle_controllers.h" @@ -12,12 +13,14 @@ #include "item.h" #include "link.h" #include "main.h" -#include "alloc.h" +#include "overworld.h" #include "m4a.h" +#include "party_menu.h" #include "pokedex.h" #include "pokeblock.h" #include "pokemon.h" #include "pokemon_animation.h" +#include "pokemon_summary_screen.h" #include "pokemon_storage_system.h" #include "pokenav.h" #include "random.h" @@ -45,8 +48,6 @@ struct SpeciesItem u16 item; }; -extern const struct OamData gUnknown_0831ACB0; -extern const struct OamData gUnknown_0831ACA8; extern const struct SpriteFrameImage gUnknown_082FF3A8[]; extern const struct SpriteFrameImage gUnknown_082FF3C8[]; extern const struct SpriteFrameImage gUnknown_082FF3E8[]; @@ -70,15 +71,10 @@ extern const struct CompressedSpritePalette gMonPaletteTable[]; extern const struct CompressedSpritePalette gMonShinyPaletteTable[]; extern const u8 gTrainerClassNames[][13]; -extern u8 pokemon_order_func(u8); extern u16 get_unknown_box_id(void); -extern u8 StorageGetCurrentBox(void); extern void set_unknown_box_id(u8); -extern void sub_803FA70(u8 battlerId); -extern u8 sav1_map_get_name(void); extern bool8 sub_806F104(void); extern u8 sub_81D63C8(u16 trainerOpponentId); -extern void SummaryScreen_SetUnknownTaskId(u8); // this file's functions static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon); @@ -935,7 +931,7 @@ const u16 gSpeciesToNationalPokedexNum[] = // Assigns all species to the Nationa SPECIES_TO_NATIONAL(CHIMECHO), }; -const u16 gHoennToNationalOrder[] = // Assigns Hoenn Dex Pokmon (Using National Dex Index) +const u16 gHoennToNationalOrder[] = // Assigns Hoenn Dex Pokémon (Using National Dex Index) { HOENN_TO_NATIONAL(TREECKO), HOENN_TO_NATIONAL(GROVYLE), @@ -1139,7 +1135,7 @@ const u16 gHoennToNationalOrder[] = // Assigns Hoenn Dex Pokmon (Using National HOENN_TO_NATIONAL(RAYQUAZA), HOENN_TO_NATIONAL(JIRACHI), HOENN_TO_NATIONAL(DEOXYS), - HOENN_TO_NATIONAL(BULBASAUR), // Pokmon from here onwards are UNSEEN in the HoennDex. + HOENN_TO_NATIONAL(BULBASAUR), // Pokémon from here onwards are UNSEEN in the HoennDex. HOENN_TO_NATIONAL(IVYSAUR), HOENN_TO_NATIONAL(VENUSAUR), HOENN_TO_NATIONAL(CHARMANDER), @@ -2298,7 +2294,7 @@ const struct SpriteTemplate gUnknown_08329D98[MAX_BATTLERS_COUNT] = { // B_POSITION_PLAYER_LEFT .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gUnknown_0831ACB0, + .oam = &gOamData_831ACB0, .anims = NULL, .images = gUnknown_082FF3A8, .affineAnims = gUnknown_082FF618, @@ -2307,16 +2303,16 @@ const struct SpriteTemplate gUnknown_08329D98[MAX_BATTLERS_COUNT] = { // B_POSITION_OPPONENT_LEFT .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gUnknown_0831ACA8, + .oam = &gOamData_831ACA8, .anims = NULL, .images = gUnknown_082FF3C8, .affineAnims = gUnknown_082FF694, - .callback = oac_poke_opponent, + .callback = SpriteCb_WildMon, }, { // B_POSITION_PLAYER_RIGHT .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gUnknown_0831ACB0, + .oam = &gOamData_831ACB0, .anims = NULL, .images = gUnknown_082FF3E8, .affineAnims = gUnknown_082FF618, @@ -2325,11 +2321,11 @@ const struct SpriteTemplate gUnknown_08329D98[MAX_BATTLERS_COUNT] = { // B_POSITION_OPPONENT_RIGHT .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gUnknown_0831ACA8, + .oam = &gOamData_831ACA8, .anims = NULL, .images = gUnknown_082FF408, .affineAnims = gUnknown_082FF694, - .callback = oac_poke_opponent + .callback = SpriteCb_WildMon }, }; @@ -2338,7 +2334,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gUnknown_0831ACB0, + .oam = &gOamData_831ACB0, .anims = NULL, .images = gUnknown_082FF428, .affineAnims = gUnknown_082FF618, @@ -2347,7 +2343,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gUnknown_0831ACB0, + .oam = &gOamData_831ACB0, .anims = NULL, .images = gUnknown_082FF448, .affineAnims = gUnknown_082FF618, @@ -2356,7 +2352,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gUnknown_0831ACB0, + .oam = &gOamData_831ACB0, .anims = NULL, .images = gUnknown_082FF468, .affineAnims = gUnknown_082FF618, @@ -2365,7 +2361,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gUnknown_0831ACB0, + .oam = &gOamData_831ACB0, .anims = NULL, .images = gUnknown_082FF490, .affineAnims = gUnknown_082FF618, @@ -2374,7 +2370,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gUnknown_0831ACB0, + .oam = &gOamData_831ACB0, .anims = NULL, .images = gUnknown_082FF4B8, .affineAnims = gUnknown_082FF618, @@ -2383,7 +2379,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gUnknown_0831ACB0, + .oam = &gOamData_831ACB0, .anims = NULL, .images = gUnknown_082FF4D8, .affineAnims = gUnknown_082FF618, @@ -2392,7 +2388,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gUnknown_0831ACB0, + .oam = &gOamData_831ACB0, .anims = NULL, .images = gUnknown_082FF4F8, .affineAnims = gUnknown_082FF618, @@ -2401,7 +2397,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gUnknown_0831ACB0, + .oam = &gOamData_831ACB0, .anims = NULL, .images = gUnknown_082FF518, .affineAnims = gUnknown_082FF618, @@ -2592,7 +2588,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, SetBoxMonData(boxMon, MON_DATA_SPECIES, &species); SetBoxMonData(boxMon, MON_DATA_EXP, &gExperienceTables[gBaseStats[species].growthRate][level]); SetBoxMonData(boxMon, MON_DATA_FRIENDSHIP, &gBaseStats[species].friendship); - value = sav1_map_get_name(); + value = GetCurrentRegionMapSectionId(); SetBoxMonData(boxMon, MON_DATA_MET_LOCATION, &value); SetBoxMonData(boxMon, MON_DATA_MET_LEVEL, &level); SetBoxMonData(boxMon, MON_DATA_MET_GAME, &gGameVersion); @@ -2758,7 +2754,7 @@ void sub_806819C(struct Pokemon *mon, struct BattleTowerPokemon *src) CreateMon(mon, src->species, src->level, 0, 1, src->personality, 1, src->otId); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) SetMonMoveSlot(mon, src->moves[i], i); SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses); @@ -2820,7 +2816,7 @@ void sub_8068338(struct Pokemon *mon, struct BattleTowerPokemon *src, bool8 lvl5 CreateMon(mon, src->species, level, 0, 1, src->personality, 1, src->otId); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) SetMonMoveSlot(mon, src->moves[i], i); SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses); @@ -2884,7 +2880,7 @@ void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 m otId); SetMonData(mon, MON_DATA_HELD_ITEM, &src->party[monId].item); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) SetMonMoveSlot(mon, src->party[monId].moves[i], i); evAmount = MAX_TOTAL_EVS / NUM_STATS; @@ -2944,7 +2940,7 @@ void sub_80686FC(struct Pokemon *mon, struct BattleTowerPokemon *dest) dest->heldItem = heldItem; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) dest->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); dest->level = GetMonData(mon, MON_DATA_LEVEL, NULL); @@ -3270,7 +3266,7 @@ u16 GiveMoveToMon(struct Pokemon *mon, u16 move) u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { u16 existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, NULL); if (!existingMove) @@ -3289,7 +3285,7 @@ u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move) { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (!mon->moves[i]) { @@ -3392,7 +3388,7 @@ void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move) moves[3] = move; pp[3] = gBattleMoves[move].pp; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetMonData(mon, MON_DATA_MOVE1 + i, &moves[i]); SetMonData(mon, MON_DATA_PP1 + i, &pp[i]); @@ -3419,7 +3415,7 @@ void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) moves[3] = move; pp[3] = gBattleMoves[move].pp; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &moves[i]); SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp[i]); @@ -4091,13 +4087,13 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) case MON_DATA_LANGUAGE: retVal = boxMon->language; break; - case MON_DATA_SANITY_BIT1: + case MON_DATA_SANITY_IS_BAD_EGG: retVal = boxMon->isBadEgg; break; - case MON_DATA_SANITY_BIT2: + case MON_DATA_SANITY_HAS_SPECIES: retVal = boxMon->hasSpecies; break; - case MON_DATA_SANITY_BIT3: + case MON_DATA_SANITY_IS_EGG: retVal = boxMon->isEgg; break; case MON_DATA_OT_NAME: @@ -4298,7 +4294,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) u16 *moves = (u16 *)data; s32 i = 0; - while (moves[i] != 355) + while (moves[i] != MOVES_COUNT) { u16 move = moves[i]; if (substruct1->moves[0] == move @@ -4460,13 +4456,13 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) case MON_DATA_LANGUAGE: SET8(boxMon->language); break; - case MON_DATA_SANITY_BIT1: + case MON_DATA_SANITY_IS_BAD_EGG: SET8(boxMon->isBadEgg); break; - case MON_DATA_SANITY_BIT2: + case MON_DATA_SANITY_HAS_SPECIES: SET8(boxMon->hasSpecies); break; - case MON_DATA_SANITY_BIT3: + case MON_DATA_SANITY_IS_EGG: SET8(boxMon->isEgg); break; case MON_DATA_OT_NAME: @@ -4722,7 +4718,7 @@ u8 SendMonToPC(struct Pokemon* mon) do { - for (boxPos = 0; boxPos < 30; boxPos++) + for (boxPos = 0; boxPos < IN_BOX_COUNT; boxPos++) { struct BoxPokemon* checkingMon = GetBoxedMonPtr(boxNo, boxPos); if (GetBoxMonData(checkingMon, MON_DATA_SPECIES, NULL) == SPECIES_NONE) @@ -4739,7 +4735,7 @@ u8 SendMonToPC(struct Pokemon* mon) } boxNo++; - if (boxNo == 14) + if (boxNo == TOTAL_BOXES_COUNT) boxNo = 0; } while (boxNo != StorageGetCurrentBox()); @@ -4853,7 +4849,7 @@ void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord) for (j = 0; j < 6; j++) SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gBattleResources->secretBase->party.EVs[i]); - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->party.moves[i * 4 + j]); SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->party.moves[i * 4 + j]].pp); @@ -4889,9 +4885,9 @@ bool8 IsPokemonStorageFull(void) { s32 i, j; - for (i = 0; i < 14; i++) - for (j = 0; j < 30; j++) - if (GetBoxMonDataFromAnyBox(i, j, MON_DATA_SPECIES) == SPECIES_NONE) + for (i = 0; i < TOTAL_BOXES_COUNT; i++) + for (j = 0; j < IN_BOX_COUNT; j++) + if (GetBoxMonDataAt(i, j, MON_DATA_SPECIES) == SPECIES_NONE) return FALSE; return TRUE; @@ -4942,7 +4938,7 @@ void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex) gBattleMons[battlerId].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); gBattleMons[battlerId].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL); - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { gBattleMons[battlerId].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL); gBattleMons[battlerId].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL); @@ -5461,7 +5457,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov { if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == 11) friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) + if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) friendship++; } if (friendship < 0) @@ -5487,7 +5483,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov { if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == 11) friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) + if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) friendship++; } if (friendship < 0) @@ -5512,7 +5508,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov { if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == 11) friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name()) + if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) friendship++; } if (friendship < 0) @@ -6160,7 +6156,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) { if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL) friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == sav1_map_get_name()) + if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == GetCurrentRegionMapSectionId()) friendship++; } if (friendship < 0) @@ -6484,7 +6480,7 @@ u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); int i, j, k; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); for (i = 0; i < 20; i++) @@ -6498,10 +6494,10 @@ u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) if (moveLevel <= (level << 9)) { - for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) + for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) ; - if (j == 4) + if (j == MAX_MON_MOVES) { for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) ; @@ -6538,7 +6534,7 @@ u8 GetNumberOfRelearnableMoves(struct Pokemon *mon) if (species == SPECIES_EGG) return 0; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); for (i = 0; i < 20; i++) @@ -6552,10 +6548,10 @@ u8 GetNumberOfRelearnableMoves(struct Pokemon *mon) if (moveLevel <= (level << 9)) { - for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) + for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++) ; - if (j == 4) + if (j == MAX_MON_MOVES) { for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++) ; @@ -6705,7 +6701,7 @@ const u32 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 { u32 shinyValue; - if (species > SPECIES_EGG) + if (species > NUM_SPECIES) return gMonPaletteTable[0].data; shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); @@ -6799,7 +6795,7 @@ void BoxMonRestorePP(struct BoxPokemon *boxMon) { int i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0)) { @@ -6847,7 +6843,7 @@ void SetWildMonHeldItem(void) u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0); u16 var1 = 45; u16 var2 = 95; - if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3, 0) + if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG, 0) && GetMonAbility(&gPlayerParty[0]) == ABILITY_COMPOUND_EYES) { var1 = 20; diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c index 8c468d9f4..52fa6db51 100644 --- a/src/pokemon_animation.c +++ b/src/pokemon_animation.c @@ -1,4 +1,5 @@ #include "global.h" +#include "battle.h" #include "pokemon.h" #include "pokemon_animation.h" #include "sprite.h" @@ -18,8 +19,6 @@ struct UnkAnimStruct s16 field_8; }; -extern u16 gBattlerPartyIndexes[]; - // this file's functions static void pokemonanimfunc_00(struct Sprite *sprite); static void pokemonanimfunc_01(struct Sprite *sprite); diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index c24c8a898..bcbb60e21 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -1045,7 +1045,7 @@ u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], }; - if (species > SPECIES_EGG) + if (species > NUM_SPECIES) iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG; spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); @@ -1076,7 +1076,7 @@ u8 sub_80D2D78(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 return spriteId; } -u16 mon_icon_convert_unown_species_id(u16 species, u32 personality) +u16 GetIconSpecies(u16 species, u32 personality) { u16 result; @@ -1091,7 +1091,7 @@ u16 mon_icon_convert_unown_species_id(u16 species, u32 personality) } else { - if (species > SPECIES_EGG) + if (species > NUM_SPECIES) result = 260; else result = species; @@ -1104,7 +1104,8 @@ u16 GetUnownLetterByPersonality(u32 personality) { if (!personality) return 0; - return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C; + else + return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C; } u16 sub_80D2E84(u16 species) @@ -1121,19 +1122,17 @@ u16 sub_80D2E84(u16 species) } else { - if(species > (SPECIES_UNOWN_B - 1)) - species = 260; - return mon_icon_convert_unown_species_id(species, 0); + if (species > (SPECIES_UNOWN_B - 1)) + species = SPECIES_OLD_UNOWN_J; // That's an oddly specific species. + return GetIconSpecies(species, 0); } } const u8 *GetMonIconPtr(u16 species, u32 personality, bool32 extra) { - return GetMonIconTiles(mon_icon_convert_unown_species_id(species, personality), extra); + return GetMonIconTiles(GetIconSpecies(species, personality), extra); } - - void sub_80D2EF8(struct Sprite *sprite) { sub_80D328C(sprite); @@ -1150,7 +1149,7 @@ void LoadMonIconPalettes(void) void SafeLoadMonIconPalette(u16 species) { u8 palIndex; - if (species > SPECIES_EGG) + if (species > NUM_SPECIES) species = 260; palIndex = gMonIconPaletteIndices[species]; if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) @@ -1175,7 +1174,7 @@ void FreeMonIconPalettes(void) void SafeFreeMonIconPalette(u16 species) { u8 palIndex; - if (species > SPECIES_EGG) + if (species > NUM_SPECIES) species = 260; palIndex = gMonIconPaletteIndices[species]; FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); @@ -1208,7 +1207,7 @@ void sub_80D304C(u16 offset) s32 i; const struct SpritePalette* monIconPalettePtr; - if(offset <= 0xA0) + if (offset <= 0xA0) { monIconPalettePtr = gMonIconPaletteTable; for(i = 5; i >= 0; i--) @@ -1220,9 +1219,9 @@ void sub_80D304C(u16 offset) } } -u8 sub_80D3080(u16 species) +u8 GetValidMonIconPalIndex(u16 species) { - if (species > SPECIES_EGG) + if (species > NUM_SPECIES) species = 260; return gMonIconPaletteIndices[species]; } @@ -1234,7 +1233,7 @@ u8 sub_80D30A0(u16 species) const u16* GetValidMonIconPalettePtr(u16 species) { - if (species > SPECIES_EGG) + if (species > NUM_SPECIES) species = 260; return gMonIconPaletteTable[gMonIconPaletteIndices[species]].data; } diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c index 2d9a2f08f..b0e14d2b1 100644 --- a/src/pokemon_size_record.c +++ b/src/pokemon_size_record.c @@ -210,7 +210,7 @@ void GiveGiftRibbonToParty(u8 index, u8 ribbonId) { struct Pokemon *mon = &gPlayerParty[i]; - if (GetMonData(mon, MON_DATA_SPECIES) != 0 && GetMonData(mon, MON_DATA_SANITY_BIT3) == 0) + if (GetMonData(mon, MON_DATA_SPECIES) != 0 && GetMonData(mon, MON_DATA_SANITY_IS_EGG) == 0) { SetMonData(mon, array[index], &data); gotRibbon = TRUE; diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index ad56b1678..36ed78a54 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -1,55 +1,725 @@ #include "global.h" +#include "alloc.h" #include "bg.h" +#include "data2.h" +#include "decompress.h" +#include "dma3.h" +#include "dynamic_placeholder_text_util.h" #include "event_data.h" #include "field_screen_effect.h" #include "field_weather.h" +#include "fldeff_misc.h" #include "gpu_regs.h" +#include "graphics.h" #include "international_string_util.h" +#include "item.h" +#include "item_icon.h" +#include "item_menu.h" +#include "mail.h" #include "main.h" #include "menu.h" +#include "mon_markings.h" +#include "naming_screen.h" #include "overworld.h" #include "palette.h" +#include "pc_screen_effect.h" #include "pokemon.h" +#include "pokemon_icon.h" +#include "pokemon_summary_screen.h" #include "pokemon_storage_system.h" #include "script.h" #include "sound.h" #include "string_util.h" #include "strings.h" #include "text.h" +#include "text_window.h" +#include "trig.h" #include "walda_phrase.h" #include "window.h" +#include "constants/maps.h" +#include "constants/moves.h" +#include "constants/rgb.h" #include "constants/songs.h" #include "constants/species.h" -IWRAM_DATA u8 gUnknown_03000F78[0x188]; +struct WallpaperTable +{ + const u32 *tiles; + const u32 *tileMap; + const u16 *palettes; +}; + +struct PokemonStorageSystemFunc +{ + u8 (*func)(void); + s8 unk4; +}; + +struct StorageAction +{ + const u8 *text; + u8 format; +}; + +struct StorageMenu +{ + const u8 *text; + int textId; +}; + +struct PSS_MenuStringPtrs +{ + const u8 *text; + const u8 *desc; +}; + +struct UnkStruct_2000028 +{ + const u8 *unk_00; + u8 *unk_04; + u16 unk_08; + u16 unk_0a; + u16 newField; + void (*unk_0c)(struct UnkStruct_2000028 *data); +}; + +struct UnkStruct_2000020 +{ + struct UnkStruct_2000028 *unk_00; + u8 unk_04; + u8 unk_05; +}; + +struct UnkPSSStruct_2002370 +{ + struct Sprite *unk_0000; + struct Sprite *unk_0004[4]; + u32 unk_0014[3]; + struct Sprite *unk_0020[2]; + u8 filler_0028[0x214]; + u32 unk_023c; + u16 unk_0240; + u16 unk_0242; + u8 curBox; + u8 unk_0245; + u8 unk_0246; +}; -extern const u8 gText_PartyFull[]; -extern const u8 gText_Box[]; -extern const u8 gText_JustOnePkmn[]; +struct UnkStorageStruct +{ + struct Sprite *sprite; + u8 *tiles; + u16 palIndex; + u8 unk8; + u8 unk9; + u8 unk10; +}; + +struct PokemonStorageSystemData +{ + u8 state; + u8 boxOption; + u8 screenChangeType; + bool8 isReshowingPSS; + u8 taskId; + struct UnkStruct_2000020 unk_0020; + struct UnkStruct_2000028 unk_0028[8]; + u16 field_B0[528 / 2]; + u16 field_2C0; + u16 field_2C2; + u8 field_2C4; + u8 field_2C5; + u8 showPartyMenuState; + u8 unk_02C7; + u8 unk_02C8; + bool8 unk_02C9; + s16 newCurrBoxId; + u16 bg2_X; + s16 field_2CE; + u16 field_2D0; + u8 field_2D2; + u8 field_2D3; + u8 field_2D4; + u16 field_2D6; + s16 field_2D8; + u16 field_2DA; + u16 field_2DC; + u16 field_2DE; + u16 field_2E0; + u8 filler[22]; + u8 field_2F8[1024]; + u8 field_6F8; + u8 field_6F9; + u8 field_6FA; + s8 field_6FB; + u16 field_6FC[16]; + u16 field_71C; + u16 field_71E; + struct Sprite *field_720[2]; + struct Sprite *field_728[2]; + struct Sprite *field_730[2]; + u32 field_738; + u8 field_73C[80]; + u16 field_78C; + s16 wallpaperSetId; + s16 wallpaperId; + u16 field_792[360]; + u8 wallpaperChangeState; + u8 field_A63; + u8 field_A64; + s8 field_A65; + u8 *wallpaperTiles; + struct Sprite *movingMonSprite; + struct Sprite *partySprites[PARTY_SIZE]; + struct Sprite *boxMonsSprites[IN_BOX_COUNT]; + struct Sprite **field_B00; + struct Sprite **field_B04; + u16 field_B08[40]; + u16 field_B58[40]; + u16 boxSpecies[IN_BOX_COUNT]; + u32 boxPersonalities[IN_BOX_COUNT]; + u8 field_C5C; + u8 field_C5D; + u8 field_C5E; + u16 field_C60; + s16 field_C62; + s16 field_C64; + u16 field_C66; + u8 field_C68; + s8 field_C69; + u8 field_C6A; + u8 field_C6B; + struct WindowTemplate menuWindow; + struct StorageMenu menuItems[7]; + u8 menuItemsCount; + u8 menuWidth; + u8 field_CAE; + u16 field_CB0; + struct Sprite *field_CB4; + struct Sprite *field_CB8; + s32 field_CBC; + s32 field_CC0; + u32 field_CC4; + u32 field_CC8; + s16 field_CCC; + s16 field_CCE; + u16 field_CD0; + s8 field_CD2; + s8 field_CD3; + u8 field_CD4; + u8 field_CD5; + u8 field_CD6; + u8 field_CD7; + u8 field_CD8[2]; + const u32 *cursorMonPalette; + u32 cursorMonPersonality; + u16 cursorMonSpecies; + u16 cursorMonItem; + u16 field_CE8; + bool8 setMosaic; + u8 cursorMonMarkings; + u8 cursorMonLevel; + bool8 cursorMonIsEgg; + u8 cursorMonNick[POKEMON_NAME_LENGTH + 1]; + u8 cursorMonNickText[36]; + u8 cursorMonSpeciesName[36]; + u8 cursorMonGenderLvlText[36]; + u8 cursorMonItemName[36]; + bool8 (*monPlaceChangeFunc)(void); + u8 monPlaceChangeState; + u8 field_D91; + struct Sprite *field_D94; + struct Sprite *field_D98[2]; + u16 *field_DA0; + struct PokemonMarkMenu field_DA4; + struct UnkPSSStruct_2002370 field_1E5C; + struct Pokemon movingMon; + struct Pokemon field_2108; + s8 field_216C; + u8 field_216D; + s8 field_216E; + s8 field_216F; + s8 field_2170; + s8 field_2171; + u16 field_2172; + u16 field_2174; + u16 field_2176[8]; + u8 field_2186; + u8 field_2187; + u8 field_2188; + union + { + struct Pokemon *mon; + struct BoxPokemon *box; + } field_218C; + u8 field_2190[40]; + u8 field_21B8[40]; + u8 field_21E0[POKEMON_NAME_LENGTH + 1]; + u8 itemName[20]; + u8 inBoxMovingMode; + u16 field_2200; + struct UnkStorageStruct field_2204[3]; + u16 movingItem; + u16 field_2236; + u8 field_2238; + u16 field_223A; + u16 *field_223C; + struct Sprite *cursorMonSprite; + u16 field_2244[0x40]; + u8 field_22C4[0x800]; + u8 field_2AC4[0x1800]; + u8 field_42C4[0x800]; + u8 field_4AC4[0x1000]; + u8 field_5AC4[0x800]; +}; -extern u8 gUnknown_02039D00; +struct UnkSubStruct_2039D84 +{ + s16 field_0; + s16 field_2; + u16 field_4; + u16 field_6; + s16 field_8; + s16 field_A; +}; + +struct UnkStruct_2039D84 +{ + struct UnkSubStruct_2039D84 field_0[2]; + const void *field_18; + const void *field_1C; + u16 field_20; + u16 field_22; + u16 field_24; + u16 field_26; + u16 field_28; + u8 field_2A; + u8 field_2B; + u8 field_2C; + u8 field_2D; +}; + +enum +{ + BOX_OPTION_WITHDRAW, + BOX_OPTION_DEPOSIT, + BOX_OPTION_MOVE_MONS, + BOX_OPTION_MOVE_ITEMS, + BOX_OPTION_EXIT, +}; + +enum +{ + PC_TEXT_EXIT_BOX, + PC_TEXT_WHAT_YOU_DO, + PC_TEXT_PICK_A_THEME, + PC_TEXT_PICK_A_WALLPAPER, + PC_TEXT_IS_SELECTED, + PC_TEXT_JUMP_TO_WHICH_BOX, + PC_TEXT_DEPOSIT_IN_WHICH_BOX, + PC_TEXT_WAS_DEPOSITED, + PC_TEXT_BOX_IS_FULL, + PC_TEXT_RELEASE_POKE, + PC_TEXT_WAS_RELEASED, + PC_TEXT_BYE_BYE, + PC_TEXT_MARK_POKE, + PC_TEXT_LAST_POKE, + PC_TEXT_PARTY_FULL, + PC_TEXT_HOLDING_POKE, + PC_TEXT_WHICH_ONE_WILL_TAKE, + PC_TEXT_CANT_RELEASE_EGG, + PC_TEXT_CONTINUE_BOX, + PC_TEXT_CAME_BACK, + PC_TEXT_WORRIED, + PC_TEXT_SURPRISE, + PC_TEXT_PLEASE_REMOVE_MAIL, + PC_TEXT_IS_SELECTED2, + PC_TEXT_GIVE_TO_MON, + PC_TEXT_PLACED_IN_BAG, + PC_TEXT_BAG_FULL, + PC_TEXT_PUT_IN_BAG, + PC_TEXT_ITEM_IS_HELD, + PC_TEXT_CHANGED_TO_ITEM, + PC_TEXT_CANT_STORE_MAIL, +}; + +enum +{ + PC_TEXT_FMT_NORMAL, + PC_TEXT_FMT_MON_NAME_1, + PC_TEXT_FMT_MON_NAME_2, + PC_TEXT_FMT_MON_NAME_3, + PC_TEXT_FMT_MON_NAME_4, + PC_TEXT_FMT_MON_NAME_5, + PC_TEXT_FMT_MON_NAME_6, + PC_TEXT_FMT_ITEM_NAME, +}; + +enum +{ + SCREEN_CHANGE_EXIT_BOX, + SCREEN_CHANGE_SUMMARY_SCREEN, + SCREEN_CHANGE_NAME_BOX, + SCREEN_CHANGE_ITEM_FROM_BAG, +}; + +enum +{ + MODE_PARTY, + MODE_BOX, + MODE_2, +}; + +enum +{ + WALLPAPER_FOREST, + WALLPAPER_CITY, + WALLPAPER_DESERT, + WALLPAPER_SAVANNA, + WALLPAPER_CRAG, + WALLPAPER_VOLCANO, + WALLPAPER_SNOW, + WALLPAPER_CAVE, + WALLPAPER_BEACH, + WALLPAPER_SEAFLOOR, + WALLPAPER_RIVER, + WALLPAPER_SKY, + WALLPAPER_POLKADOT, + WALLPAPER_POKECENTER, + WALLPAPER_MACHINE, + WALLPAPER_PLAIN, + WALLPAPER_FRIENDS, // The one received as a gift from Walda's parents. + WALLPAPER_COUNT +}; + +enum +{ + FRIENDS_ZIGZAGOON, + FRIENDS_SCREEN, + FRIENDS_HORIZONTAL, + FRIENDS_DIAGONAL, + FRIENDS_BLOCK, + FRIENDS_RIBBON, + FRIENDS_POKECENTER2, + FRIENDS_FRAME, + FRIENDS_BLANK, + FRIENDS_CIRCLES, + FRIENDS_AZUMARILL, + FRIENDS_PIKACHU, + FRIENDS_LEGENDARY, + FRIENDS_DUSCLOPS, + FRIENDS_LUDICOLO, + FRIENDS_WHISCASH, + FRIENDS_WALLPAPERS_COUNT +}; + +enum +{ + CURSOR_AREA_IN_BOX, + CURSOR_AREA_IN_PARTY, + CURSOR_AREA_BOX, + CURSOR_AREA_BUTTONS, // Party Pokemon and Close Box +}; + +#define TAG_PAL_WAVEFORM 0xDACA +#define TAG_PAL_DAC8 0xDAC8 +#define TAG_PAL_DAC6 0xDAC6 +#define TAG_PAL_DACE 0xDACE +#define TAG_PAL_DAC7 0xDAC7 +#define TAG_PAL_DAC9 0xDAC9 +#define TAG_PAL_DAC0 0xDAC0 +#define TAG_PAL_DACB 0xDACB + +#define TAG_TILE_WAVEFORM 0x5 +#define TAG_TILE_10 0x10 +#define TAG_TILE_2 0x2 +#define TAG_TILE_D 0xD +#define TAG_TILE_A 0xA +#define TAG_TILE_3 0x3 +#define TAG_TILE_4 0x4 +#define TAG_TILE_12 0x12 +#define TAG_TILE_7 0x7 +#define TAG_TILE_0 0x0 +#define TAG_TILE_1 0x1 + +// IWRAM bss +IWRAM_DATA static u32 gUnknown_03000F78[98]; + +// EWRAM DATA +EWRAM_DATA static u8 sPreviousBoxOption = 0; +EWRAM_DATA static struct UnkPSSStruct_2002370 *gUnknown_02039D04 = NULL; +EWRAM_DATA static struct PokemonStorageSystemData *sPSSData = NULL; +EWRAM_DATA static bool8 sInPartyMenu = 0; +EWRAM_DATA static u8 sCurrentBoxOption = 0; +EWRAM_DATA static u8 gUnknown_02039D0E = 0; +EWRAM_DATA static u8 sWhichToReshow = 0; +EWRAM_DATA static u8 gUnknown_02039D10 = 0; +EWRAM_DATA static u16 gUnknown_02039D12 = 0; +EWRAM_DATA static struct Pokemon gUnknown_02039D14 = {0}; +EWRAM_DATA static s8 sBoxCursorArea = 0; +EWRAM_DATA static s8 sBoxCursorPosition = 0; +EWRAM_DATA static bool8 sIsMonBeingMoved = 0; +EWRAM_DATA static u8 sMovingMonOrigBoxId = 0; +EWRAM_DATA static u8 sMovingMonOrigBoxPos = 0; +EWRAM_DATA static bool8 sCanOnlyMove = 0; + +extern void sub_80C6D80(u8 *arg0, void *arg1, u8 arg2, u8 arg3, s32 arg4); + +extern const struct CompressedSpriteSheet gMonFrontPicTable[]; // This file's functions. -void StorageSystemCreatePrimaryMenu(u8 whichMenu, s16 *windowIdPtr); -void sub_80C7D74(u8); -u8 sub_80CAEA0(void); -void SetBoxWallpaper(u8 boxId, u8 wallpaperId); -void SetCurrentBox(u8 boxId); -void ClearMonInBox(u8 boxId, u8 boxPos); -void ResetWaldaWallpaper(void); -void sub_80C7958(u8 curBox); -void sub_80C7B14(void); -void sub_80C7BB4(void); -void sub_80CA028(void); -void sub_80C7B80(void); -void sub_80D2AA4(void); -void sub_80C7BE4(void); -void sub_80CAA14(void); -void sub_80C7CF4(struct Sprite *sprite); -struct Sprite *sub_80CD2E8(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority); - -// const rom data -const struct PSS_MenuStringPtrs gUnknown_085716C0[] = +static void CreatePCMenu(u8 whichMenu, s16 *windowIdPtr); +static void Cb2_EnterPSS(u8 boxOption); +static u8 GetCurrentBoxOption(void); +static u8 HandleInput(void); +static u8 sub_80CDC2C(void); +static u8 sub_80CB9BC(void); +static void LoadWallpaperGfx(u8 boxId, s8 direction); +static void sub_80CCCFC(u8 boxId, s8 direction); +static void sub_80CD0B8(s8 direction); +static void SetCurrentBox(u8 boxId); +static void sub_80CC32C(u8 boxId); +static void sub_80C7958(u8 curBox); +static void sub_80CCAE0(void *arg0); +static void sub_80C7B14(void); +static void sub_80C7BB4(void); +static void ScrollBackground(void); +static void sub_80C7B80(void); +static void sub_80C7BE4(void); +static void sub_80CAA14(void); +static void sub_80CFDC4(void); +static void sub_80CE790(void); +static void sub_80CE8E4(void); +static void GiveChosenBagItem(void); +static void SetUpHidePartyMenu(void); +static void DestroyAllPartyMonIcons(void); +static void sub_80D11CC(void); +static void LoadPSSMenuGfx(void); +static void LoadWaveformSpritePalette(void); +static void sub_80CDC18(void); +static void sub_80CD36C(void); +static void sub_80CD3EC(void); +static void sub_80CAC1C(void); +static void sub_80CEBDC(void); +static void SetScrollingBackground(void); +static void sub_80CABE0(void); +static void sub_80CAEAC(void); +static void sub_80D0C60(void); +static void sub_80CFEA8(void); +static void sub_80CDC0C(void); +static void sub_80CAF04(void); +static void sub_80CA0D8(void); +static void AddMenu(void); +static void sub_80CE250(void); +static void InitCanRelaseMonVars(void); +static void sub_80D01B8(void); +static void ReleaseMon(void); +static void RefreshCursorMonData(void); +static void LoadCursorMonSprite(void); +static void sub_80CA154(void); +static void sub_80CA1C4(void); +static void sub_80CC064(void); +static void sub_80CE324(void); +static void ClearBottomWindow(void); +static void sub_80CA704(void); +static void sub_80D013C(void); +static void sub_80CE00C(void); +static void sub_80D1194(void); +static void PrintCursorMonInfo(void); +static void sub_80CA65C(void); +static void AddWallpaperSetsMenu(void); +static void sub_80CD02C(void); +static void InitMenu(void); +static void sub_80CD158(void); +static void sub_80CFC14(void); +static void sub_80CEB40(void); +static void sub_80CCEE0(void); +static void sub_80D1818(void); +static void sub_80D19B4(u32 arg0); +static void sub_80CAA74(void); +static void PrintItemDescription(void); +static void sub_80CE760(void); +static void sub_80CDBA0(void); +static void sub_80CE7E8(void); +static void sub_80CFECC(void); +static void sub_80CA9EC(void); +static void FreePSSData(void); +static void AddBoxMenu(void); +static void sub_80CCF9C(void); +static void MoveMon(void); +static void PlaceMon(void); +static void sub_80CAB20(void); +static void sub_80CE22C(void); +static void sub_80CDA68(void); +static void sub_80CB950(void); +static void sub_80CA9C0(void); +static void SetUpDoShowPartyMenu(void); +static void BoxSetMosaic(void); +static void sub_80C7CF4(struct Sprite *sprite); +static void sub_80CC100(struct Sprite *sprite); +static void sub_80CB278(struct Sprite *sprite); +static void sub_80CD210(struct Sprite *sprite); +static bool32 WaitForWallpaperGfxLoad(void); +static bool8 InitPSSWindows(void); +static bool8 sub_80CC0A0(void); +static bool8 sub_80CE2A8(void); +static bool8 sub_80D0164(void); +static bool8 sub_80CC35C(void); +static bool8 sub_80D01E4(void); +static bool8 sub_80CDED4(void); +static bool8 sub_80CDF08(void); +static bool8 sub_80D184C(void); +static bool8 sub_80D18E4(void); +static bool8 DoShowPartyMenu(void); +static bool8 sub_80D1218(void); +static bool8 ScrollToBox(void); +static bool8 sub_80CD554(void); +static bool8 HidePartyMenu(void); +static bool8 IsActiveItemMoving(void); +static bool8 sub_80D0580(u8 arg0); +static bool8 sub_80D0BC0(void); +static bool8 sub_80CA2B8(void); +static bool8 DoWallpaperGfxChange(void); +static bool8 DoMonPlaceChange(void); +static bool8 sub_80D00A8(void); +static bool8 CanMovePartyMon(void); +static bool8 CanShiftMon(void); +static bool8 IsCursorOnCloseBox(void); +static bool8 IsCursorOnBox(void); +static bool8 IsCursorInBox(void); +static bool8 IsMonBeingMoved(void); +static bool8 TryStorePartyMonInBox(u8 boxId); +static void Cb_InitPSS(u8 taskId); +static void Cb_PlaceMon(u8 taskId); +static void Cb_ChangeScreen(u8 taskId); +static void Cb_ShowPSS(u8 taskId); +static void Cb_OnBPressed(u8 taskId); +static void Cb_HandleBoxOptions(u8 taskId); +static void Cb_OnSelectedMon(u8 taskId); +static void Cb_OnCloseBoxPressed(u8 taskId); +static void Cb_HidePartyPokemon(u8 taskId); +static void Cb_DepositMenu(u8 taskId); +static void Cb_MoveMon(u8 taskId); +static void Cb_GiveMovingItemToMon(u8 taskId); +static void Cb_SwitchSelectedItem(u8 taskId); +static void Cb_TakeItemForMoving(u8 taskId); +static void Cb_WithdrawMon(u8 taskId); +static void Cb_ShiftMon(u8 taskId); +static void Cb_ShowPartyPokemon(u8 taskId); +static void Cb_ShowItemInfo(u8 taskId); +static void Cb_GiveItemFromBag(u8 taskId); +static void Cb_ItemToBag(u8 taskId); +static void Cb_TakeItemForMoving(u8 taskId); +static void Cb_ShowMarkMenu(u8 taskId); +static void Cb_ShowMonSummary(u8 taskId); +static void Cb_ReleaseMon(u8 taskId); +static void Cb_ReshowPSS(u8 taskId); +static void Cb_MainPSS(u8 taskId); +static void Cb_JumpBox(u8 taskId); +static void Cb_HandleWallpapers(u8 taskId); +static void Cb_NameBox(u8 taskId); +static void Cb_PrintCantStoreMail(u8 taskId); +static void Cb_HandleMovingMonFromParty(u8 taskId); +static void SetUpScrollToBox(u8 boxId); +static void sub_80CFE54(u8 animNum); +static void SetMovingMonPriority(u8 priority); +static void InitMonPlaceChange(u8 arg0); +static void SetMonMarkings(u8 markings); +static void ShowYesNoWindow(s8 cursorPos); +static void sub_80CDBF8(u8 cursorBoxPosition); +static void sub_80D01D0(u8 arg0); +static void sub_80CD1A8(bool8 arg0); +static void sub_80CA984(bool8 arg0); +static void CreatePartyMonsSprites(bool8 arg0); +static void PrintStorageActionText(u8 id); +static s16 sub_80D00AC(void); +static s8 RunCanReleaseMon(void); +static u8 GetBoxCursorPosition(void); +static void Item_FromMonToMoving(u8 cursorArea, u8 cursorPos); +static void Item_GiveMovingToMon(u8 cursorArea, u8 cursorPos); +static void Item_TakeMons(u8 cursorArea, u8 cursorPos); +static void Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos); +static struct Sprite *sub_80CD2E8(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority); +static void SetWallpaperForCurrentBox(u8 wallpaperId); +static void AddWallpapersMenu(u8 wallpaperSet); +static u16 GetMovingItem(void); +static void LoadCursorMonGfx(u16 species, u32 pid); +static void sub_80CA2D0(struct Sprite *sprite); +static void sub_80CCF64(struct Sprite *sprite); +static void sub_80CBA3C(struct Sprite *sprite); +static void sub_80CCF30(struct Sprite *sprite); +static void sub_80CBAF0(s16 yDelta); +static void sub_80CAAA8(u8 arg0, bool8 isPartyMon); +static const u8 *GetMovingItemName(void); +static void SetMenuText(u8 textId); +static void sub_80D0D8C(u8 cursorArea, u8 cursorPos); +static void sub_80D0E50(u8 cursorArea, u8 cursorPos); +static void sub_80D0F38(u16 item); +static struct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 oamPriority, u8 subpriority); +static void DestroyBoxMonIcon(struct Sprite *sprite); +static void SetBoxSpeciesAndPersonalities(u8 boxId); +static void sub_80CB9D0(struct Sprite *sprite, u16 partyId); +static void sub_80CC370(u8 taskId); +static void sub_80CCB50(u8 boxId); +static s8 sub_80CC644(u8 boxId); +static void sub_80CCA3C(const void *tilemap, s8 direction, u8 arg2); +static s16 sub_80CD00C(const u8 *string); +static bool8 MonPlaceChange_Shift(void); +static bool8 MonPlaceChange_Move(void); +static bool8 MonPlaceChange_Place(void); +static bool8 sub_80CDEC4(void); +static bool8 sub_80CDEB4(void); +static void sub_80CD444(u8 cursorArea, u8 cursorPosition, u16 *x, u16 *y); +static void SetShiftedMonData(u8 boxId, u8 position); +static void SetMovedMonData(u8 boxId, u8 position); +static void SetPlacedMonData(u8 boxId, u8 position); +static void PurgeMonOrBoxMon(u8 boxId, u8 position); +static void SetCursorMonData(void *pokemon, u8 mode); +static bool32 AtLeastThreeUsableMons(void); +static u8 InBoxInput_Normal(void); +static u8 InBoxInput_MovingMultiple(void); +static u8 InBoxInput_GrabbingMultiple(void); +static s8 sub_80CFF98(u8 arg0); +static u8 sub_80CFA5C(void); +static u8 sub_80D0BA4(void); +static bool8 sub_80CFA84(void); +static bool8 sub_80CFB44(void); +static bool8 sub_80D024C(void); +static bool8 sub_80D0344(void); +static bool8 sub_80D03B0(void); +static bool8 sub_80D0420(void); +static bool8 sub_80D04A0(void); +static bool8 sub_80D04C8(void); +static void sub_80D07B0(u8 arg0, u8 arg1); +static void sub_80D0834(u8 arg0, u8 arg1); +static void sub_80D0B5C(void); +static void sub_80D062C(void); +static void sub_80D0884(u16 arg0, u16 arg1, u16 arg2); +static void sub_80D08CC(void); +static void sub_80D09A4(void); +static void sub_80D0A1C(void); +static void sub_80D0AAC(void); +static u8 sub_80D0894(void); +static void sub_80D0778(u8 arg0, u8 arg1, u8 arg2); +static void sub_80D0708(u8 arg0, u8 arg1, u8 arg2); +static void sub_80D06D0(u8 arg0, u8 arg1, u8 arg2); +static void sub_80D0740(u8 arg0, u8 arg1, u8 arg2); +static void sub_80D27AC(u8 id, u16 arg1, u16 arg2, u16 arg3, u16 arg4); +static void sub_80D27F4(u8 id, u8 arg1, s8 arg2); +static void sub_80D2644(u8 id, u8 bg, const void *arg2, u16 arg3, u16 arg4); +static void sub_80D2770(u8 id, u16 arg1, u16 arg2); +static void sub_80D259C(u8 count); +static void sub_80D25F0(void); +static void sub_80D2918(u8 id); +static void sub_80D2960(u8 id); +static void sub_80D29F8(u8 id); +static void sub_80D2A90(struct UnkStruct_2000020 *arg0, struct UnkStruct_2000028 *arg1, u32 arg2); +static void sub_80D2AA4(void); +static void sub_80D2B88(struct UnkStruct_2000028 *unkStruct); +static void sub_80D2C1C(struct UnkStruct_2000028 *unkStruct); + +// static const rom data +static const struct PSS_MenuStringPtrs gUnknown_085716C0[] = { {gText_WithdrawPokemon, gText_WithdrawMonDescription}, {gText_DepositPokemon, gText_DepositMonDescription}, @@ -58,7 +728,16 @@ const struct PSS_MenuStringPtrs gUnknown_085716C0[] = {gText_SeeYa, gText_SeeYaDescription} }; -const struct WindowTemplate gUnknown_085716E8 = {0, 1, 1, 0x11, 0xA, 0xF, 1}; +static const struct WindowTemplate gUnknown_085716E8 = +{ + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 17, + .height = 10, + .paletteNum = 15, + .baseBlock = 0x1, +}; static const union AnimCmd sSpriteAnim_85716F0[] = { @@ -84,7 +763,7 @@ static const union AnimCmd sSpriteAnim_8571708[] = ANIMCMD_END }; -const union AnimCmd *const sSpriteAnimTable_8571710[] = +static const union AnimCmd *const sSpriteAnimTable_8571710[] = { sSpriteAnim_85716F0, sSpriteAnim_85716F8, @@ -103,12 +782,765 @@ static const union AffineAnimCmd *const sSpriteAffineAnimTable_8571730[] = sSpriteAffineAnim_8571720 }; -const u8 gUnknown_08571734[] = {4, 0xF, 0xE}; -const u8 gUnknown_08571737[] = _("/30"); +static const u8 gUnknown_08571734[] = {4, 0xF, 0xE}; +static const u8 gUnknown_08571737[] = _("/30"); + +static const u16 gBoxSelectionPopupPalette[] = INCBIN_U16("graphics/unknown/unknown_57173C.gbapal"); +static const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp"); +static const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); +static const u32 gPokemonStorageScrollingBGTileset[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.lz"); +static const u32 gPokemonStorageScrollingBGTilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.lz"); +static const u32 gUnknown_08572280[] = INCBIN_U32("graphics/unknown/unknown_572280.gbapal"); +static const u32 gUnknown_085722A0[] = INCBIN_U32("graphics/unknown/unknown_5722A0.bin.lz"); + +static const u16 gUnknown_0857239C[] = +{ + 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, + 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, 0x2108, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, 0x2118, +}; + +static const u16 gUnknown_085723DC[] = INCBIN_U16("graphics/unknown/unknown_5723DC.gbapal"); // Left-most part and Close Box. +static const u16 gUnknown_085723FC[] = INCBIN_U16("graphics/unknown/unknown_5723FC.gbapal"); +static const u16 gUnknown_0857241C[] = INCBIN_U16("graphics/unknown/unknown_57241C.gbapal"); +static const u16 gUnknown_0857243C[] = INCBIN_U16("graphics/unknown/unknown_57243C.gbapal"); + +static const u16 gUnknown_0857245C[] = +{ + 0x014c, 0x014d, 0x014e, 0x014f, 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x015c, 0x015d, 0x015e, 0x015f, 0x0180, 0x0181, 0x0182, + 0x0183, 0x0184, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017a, 0x017b, 0x017c, 0x017d, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, + 0x018a, 0x018b, 0x018c, 0x018d +}; +static const u16 gUnknown_085724A4[] = +{ + 0x1140, 0x1141, 0x1141, 0x1142, 0x1150, 0x1151, 0x1151, 0x1152, 0x1160, 0x1161, 0x1161, 0x1162, +}; +static const u16 gUnknown_085724BC[] = +{ + 0x1143, 0x1144, 0x1144, 0x1145, 0x1153, 0x1154, 0x1154, 0x1155, 0x1163, 0x1164, 0x1164, 0x1165, +}; + +static const u16 gWaveformPalette[] = INCBIN_U16("graphics/pokemon_storage/waveform.gbapal"); +static const u32 gWaveformTiles[] = INCBIN_U32("graphics/pokemon_storage/waveform.4bpp"); +static const u32 gUnknown_085726B4[] = INCBIN_U32("graphics/unused/unknown_5726B4.gbapal"); +static const u32 gUnknown_085726F4[] = INCBIN_U32("graphics/unknown/unknown_5726F4.gbapal"); + +static const struct WindowTemplate gUnknown_08572714[] = +{ + { // 0 + .bg = 1, + .tilemapLeft = 0, + .tilemapTop = 11, + .width = 9, + .height = 7, + .paletteNum = 3, + .baseBlock = 0xC0, + }, + { // 1 + .bg = 0, + .tilemapLeft = 11, + .tilemapTop = 17, + .width = 18, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x14, + }, + { // 2 + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 13, + .width = 21, + .height = 7, + .paletteNum = 15, + .baseBlock = 0x14, + }, + DUMMY_WIN_TEMPLATE +}; + +static const struct BgTemplate gUnknown_08572734[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 29, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0x100 + }, + { + .bg = 2, + .charBaseIndex = 2, + .mapBaseIndex = 27, + .screenSize = 1, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 3, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + }, +}; + +static const struct SpritePalette gWaveformSpritePalette = +{ + gWaveformPalette, TAG_PAL_WAVEFORM +}; + +static const struct SpriteSheet gWaveformSpriteSheet = +{ + gWaveformTiles, sizeof(gWaveformTiles), TAG_TILE_WAVEFORM +}; + +static const struct OamData sOamData_857286C; +static const struct SpriteTemplate sSpriteTemplate_CursorMon = +{ + .tileTag = TAG_TILE_2, + .paletteTag = TAG_PAL_DAC6, + .oam = &sOamData_857286C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct StorageAction gPCStorageActionTexts[] = +{ + [PC_TEXT_EXIT_BOX] = {gText_ExitFromBox, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_WHAT_YOU_DO] = {gText_WhatDoYouWantToDo, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_PICK_A_THEME] = {gText_PleasePickATheme, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_PICK_A_WALLPAPER] = {gText_PickTheWallpaper, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_IS_SELECTED] = {gText_PkmnIsSelected, PC_TEXT_FMT_MON_NAME_1}, + [PC_TEXT_JUMP_TO_WHICH_BOX] = {gText_JumpToWhichBox, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_DEPOSIT_IN_WHICH_BOX] = {gText_DepositInWhichBox, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_WAS_DEPOSITED] = {gText_PkmnWasDeposited, PC_TEXT_FMT_MON_NAME_1}, + [PC_TEXT_BOX_IS_FULL] = {gText_BoxIsFull2, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_RELEASE_POKE] = {gText_ReleaseThisPokemon, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_WAS_RELEASED] = {gText_PkmnWasReleased, PC_TEXT_FMT_MON_NAME_4}, + [PC_TEXT_BYE_BYE] = {gText_ByeByePkmn, PC_TEXT_FMT_MON_NAME_6}, + [PC_TEXT_MARK_POKE] = {gText_MarkYourPkmn, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_LAST_POKE] = {gText_ThatsYourLastPkmn, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_PARTY_FULL] = {gText_YourPartysFull, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_HOLDING_POKE] = {gText_YoureHoldingAPkmn, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_WHICH_ONE_WILL_TAKE] = {gText_WhichOneWillYouTake, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_CANT_RELEASE_EGG] = {gText_YouCantReleaseAnEgg, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_CONTINUE_BOX] = {gText_ContinueBoxOperations, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_CAME_BACK] = {gText_PkmnCameBack, PC_TEXT_FMT_MON_NAME_1}, + [PC_TEXT_WORRIED] = {gText_WasItWorriedAboutYou, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_SURPRISE] = {gText_FourEllipsesExclamation, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_PLEASE_REMOVE_MAIL] = {gText_PleaseRemoveTheMail, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_IS_SELECTED2] = {gText_PkmnIsSelected, PC_TEXT_FMT_ITEM_NAME}, + [PC_TEXT_GIVE_TO_MON] = {gText_GiveToAPkmn, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_PLACED_IN_BAG] = {gText_PlacedItemInBag, PC_TEXT_FMT_ITEM_NAME}, + [PC_TEXT_BAG_FULL] = {gText_BagIsFull2, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_PUT_IN_BAG] = {gText_PutItemInBag, PC_TEXT_FMT_NORMAL}, + [PC_TEXT_ITEM_IS_HELD] = {gText_ItemIsNowHeld, PC_TEXT_FMT_ITEM_NAME}, + [PC_TEXT_CHANGED_TO_ITEM] = {gText_ChangedToNewItem, PC_TEXT_FMT_ITEM_NAME}, + [PC_TEXT_CANT_STORE_MAIL] = {gText_MailCantBeStored, PC_TEXT_FMT_NORMAL}, +}; + +static const struct WindowTemplate sYesNoWindowTemplate = +{ + .bg = 0, + .tilemapLeft = 24, + .tilemapTop = 11, + .width = 5, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x5C, +}; + +static const struct OamData sOamData_857286C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData sOamData_8572874 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AnimCmd sSpriteAnim_857287C[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_8572884[] = +{ + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(6, 8), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd sSpriteAnim_8572894[] = +{ + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_857289C[] = +{ + ANIMCMD_FRAME(10, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(12, 8), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const sSpriteAnimTable_85728AC[] = +{ + sSpriteAnim_857287C, + sSpriteAnim_8572884, + sSpriteAnim_8572894, + sSpriteAnim_857289C +}; + +static const struct SpriteTemplate sSpriteTemplate_Waveform = +{ + .tileTag = TAG_TILE_WAVEFORM, + .paletteTag = TAG_PAL_WAVEFORM, + .oam = &sOamData_8572874, + .anims = sSpriteAnimTable_85728AC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct OamData sOamData_85728EC; +static const struct SpriteTemplate gUnknown_085728D4 = +{ + .tileTag = TAG_TILE_12, + .paletteTag = TAG_PAL_DAC0, + .oam = &sOamData_85728EC, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct OamData sOamData_85728EC = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AffineAnimCmd gSpriteAffineAnim_85728F4[] = +{ + AFFINEANIMCMD_FRAME(-2, -2, 0, 120), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd gSpriteAffineAnim_8572904[] = +{ + AFFINEANIMCMD_FRAME(16, 16, 0, 0), + AFFINEANIMCMD_FRAME(16, 16, 0, 15), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_857291C[] = +{ + gSpriteAffineAnim_85728F4, + gSpriteAffineAnim_8572904 +}; + +static const u16 gWallpaperPalettes_Forest[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/forest_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/forest_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Forest[] = INCBIN_U32("graphics/pokemon_storage/forest.4bpp.lz"); +static const u32 gWallpaperTilemap_Forest[] = INCBIN_U32("graphics/pokemon_storage/forest.bin.lz"); + +static const u16 gWallpaperPalettes_City[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/city_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/city_bg.gbapal"), +}; +static const u32 gWallpaperTiles_City[] = INCBIN_U32("graphics/pokemon_storage/city.4bpp.lz"); +static const u32 gWallpaperTilemap_City[] = INCBIN_U32("graphics/pokemon_storage/city.bin.lz"); + +static const u16 gWallpaperPalettes_Desert[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/desert_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/desert_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Desert[] = INCBIN_U32("graphics/pokemon_storage/desert.4bpp.lz"); +static const u32 gWallpaperTilemap_Desert[] = INCBIN_U32("graphics/pokemon_storage/desert.bin.lz"); + +static const u16 gWallpaperPalettes_Savanna[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/savanna_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/savanna_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Savanna[] = INCBIN_U32("graphics/pokemon_storage/savanna.4bpp.lz"); +static const u32 gWallpaperTilemap_Savanna[] = INCBIN_U32("graphics/pokemon_storage/savanna.bin.lz"); + +static const u16 gWallpaperPalettes_Crag[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/crag_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/crag_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Crag[] = INCBIN_U32("graphics/pokemon_storage/crag.4bpp.lz"); +static const u32 gWallpaperTilemap_Crag[] = INCBIN_U32("graphics/pokemon_storage/crag.bin.lz"); + +static const u16 gWallpaperPalettes_Volcano[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/volcano_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/volcano_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Volcano[] = INCBIN_U32("graphics/pokemon_storage/volcano.4bpp.lz"); +static const u32 gWallpaperTilemap_Volcano[] = INCBIN_U32("graphics/pokemon_storage/volcano.bin.lz"); + +static const u16 gWallpaperPalettes_Snow[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/snow_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/snow_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Snow[] = INCBIN_U32("graphics/pokemon_storage/snow.4bpp.lz"); +static const u32 gWallpaperTilemap_Snow[] = INCBIN_U32("graphics/pokemon_storage/snow.bin.lz"); + +static const u16 gWallpaperPalettes_Cave[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/cave_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/cave_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Cave[] = INCBIN_U32("graphics/pokemon_storage/cave.4bpp.lz"); +static const u32 gWallpaperTilemap_Cave[] = INCBIN_U32("graphics/pokemon_storage/cave.bin.lz"); + +static const u16 gWallpaperPalettes_Beach[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/beach_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/beach_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Beach[] = INCBIN_U32("graphics/pokemon_storage/beach.4bpp.lz"); +static const u32 gWallpaperTilemap_Beach[] = INCBIN_U32("graphics/pokemon_storage/beach.bin.lz"); + +static const u16 gWallpaperPalettes_Seafloor[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/seafloor_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/seafloor_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/seafloor.4bpp.lz"); +static const u32 gWallpaperTilemap_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/seafloor.bin.lz"); + +static const u16 gWallpaperPalettes_River[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/river_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/river_bg.gbapal"), +}; +static const u32 gWallpaperTiles_River[] = INCBIN_U32("graphics/pokemon_storage/river.4bpp.lz"); +static const u32 gWallpaperTilemap_River[] = INCBIN_U32("graphics/pokemon_storage/river.bin.lz"); +static const u16 gWallpaperPalettes_Sky[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/sky_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/sky_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Sky[] = INCBIN_U32("graphics/pokemon_storage/sky.4bpp.lz"); +static const u32 gWallpaperTilemap_Sky[] = INCBIN_U32("graphics/pokemon_storage/sky.bin.lz"); + +static const u16 gWallpaperPalettes_PolkaDot[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/polkadot_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/polkadot_bg.gbapal"), +}; +static const u32 gWallpaperTiles_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/polkadot.4bpp.lz"); +static const u32 gWallpaperTilemap_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/polkadot.bin.lz"); + +static const u16 gWallpaperPalettes_Pokecenter[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/pokecenter_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/pokecenter_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/pokecenter.4bpp.lz"); +static const u32 gWallpaperTilemap_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/pokecenter.bin.lz"); + +static const u16 gWallpaperPalettes_Machine[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/machine_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/machine_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Machine[] = INCBIN_U32("graphics/pokemon_storage/machine.4bpp.lz"); +static const u32 gWallpaperTilemap_Machine[] = INCBIN_U32("graphics/pokemon_storage/machine.bin.lz"); + +static const u16 gWallpaperPalettes_Plain[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/plain_frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/plain_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Plain[] = INCBIN_U32("graphics/pokemon_storage/plain.4bpp.lz"); +static const u32 gWallpaperTilemap_Plain[] = INCBIN_U32("graphics/pokemon_storage/plain.bin.lz"); + +// 1218 tilemap +static const u32 gUnknown_085773C4[] = INCBIN_U32("graphics/unused/tilemap_5773C4.bin"); + +static const u16 gUnknown_08577574[][2] = +{ + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF}, + {0x1CE7, 0x7FFF} +}; + +#define WALLPAPER_ENTRY(name) {gWallpaperTiles_##name, gWallpaperTilemap_##name, gWallpaperPalettes_##name[0]} + +static const struct WallpaperTable gWallpaperTable[] = +{ + [WALLPAPER_FOREST] = WALLPAPER_ENTRY(Forest), + [WALLPAPER_CITY] = WALLPAPER_ENTRY(City), + [WALLPAPER_DESERT] = WALLPAPER_ENTRY(Desert), + [WALLPAPER_SAVANNA] = WALLPAPER_ENTRY(Savanna), + [WALLPAPER_CRAG] = WALLPAPER_ENTRY(Crag), + [WALLPAPER_VOLCANO] = WALLPAPER_ENTRY(Volcano), + [WALLPAPER_SNOW] = WALLPAPER_ENTRY(Snow), + [WALLPAPER_CAVE] = WALLPAPER_ENTRY(Cave), + [WALLPAPER_BEACH] = WALLPAPER_ENTRY(Beach), + [WALLPAPER_SEAFLOOR] = WALLPAPER_ENTRY(Seafloor), + [WALLPAPER_RIVER] = WALLPAPER_ENTRY(River), + [WALLPAPER_SKY] = WALLPAPER_ENTRY(Sky), + [WALLPAPER_POLKADOT] = WALLPAPER_ENTRY(PolkaDot), + [WALLPAPER_POKECENTER] = WALLPAPER_ENTRY(Pokecenter), + [WALLPAPER_MACHINE] = WALLPAPER_ENTRY(Machine), + [WALLPAPER_PLAIN] = WALLPAPER_ENTRY(Plain), +}; + +static const u8 gPCGfx_Arrow[] = INCBIN_U8("graphics/pokemon_storage/arrow.4bpp"); + +static const u16 gWallpaperPalettes_Zigzagoon[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/friends_frame1.gbapal"), + INCBIN_U16("graphics/pokemon_storage/zigzagoon_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/zigzagoon.4bpp.lz"); +static const u32 gWallpaperTilemap_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/zigzagoon.bin.lz"); + +static const u16 gWallpaperPalettes_Screen[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/friends_frame1.gbapal"), + INCBIN_U16("graphics/pokemon_storage/screen_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Screen[] = INCBIN_U32("graphics/pokemon_storage/screen.4bpp.lz"); +static const u32 gWallpaperTilemap_Screen[] = INCBIN_U32("graphics/pokemon_storage/screen.bin.lz"); + +static const u16 gWallpaperPalettes_Diagonal[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/friends_frame1.gbapal"), + INCBIN_U16("graphics/pokemon_storage/diagonal_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/diagonal.4bpp.lz"); +static const u32 gWallpaperTilemap_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/diagonal.bin.lz"); + +static const u16 gWallpaperPalettes_Block[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/block_bg.gbapal"), + INCBIN_U16("graphics/pokemon_storage/block_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Block[] = INCBIN_U32("graphics/pokemon_storage/block.4bpp.lz"); +static const u32 gWallpaperTilemap_Block[] = INCBIN_U32("graphics/pokemon_storage/block.bin.lz"); + +static const u16 gWallpaperPalettes_Pokecenter2[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/pokecenter2_bg.gbapal"), + INCBIN_U16("graphics/pokemon_storage/pokecenter2_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/pokecenter2.4bpp.lz"); +static const u32 gWallpaperTilemap_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/pokecenter2.bin.lz"); + +static const u16 gWallpaperPalettes_Frame[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/frame_bg.gbapal"), + INCBIN_U16("graphics/pokemon_storage/frame_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Frame[] = INCBIN_U32("graphics/pokemon_storage/frame.4bpp.lz"); +static const u32 gWallpaperTilemap_Frame[] = INCBIN_U32("graphics/pokemon_storage/frame.bin.lz"); + +static const u16 gWallpaperPalettes_Blank[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/friends_frame1.gbapal"), + INCBIN_U16("graphics/pokemon_storage/zigzagoon_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Blank[] = INCBIN_U32("graphics/pokemon_storage/blank.4bpp.lz"); +static const u32 gWallpaperTilemap_Blank[] = INCBIN_U32("graphics/pokemon_storage/blank.bin.lz"); + +static const u16 gWallpaperPalettes_Circles[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/circles_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Circles[] = INCBIN_U32("graphics/pokemon_storage/circles.4bpp.lz"); +static const u32 gWallpaperTilemap_Circles[] = INCBIN_U32("graphics/pokemon_storage/circles.bin.lz"); + +static const u16 gWallpaperPalettes_Azumarill[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/azumarill_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/azumarill.4bpp.lz"); +static const u32 gWallpaperTilemap_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/azumarill.bin.lz"); + +static const u16 gWallpaperPalettes_Pikachu[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/pikachu_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/pikachu.4bpp.lz"); +static const u32 gWallpaperTilemap_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/pikachu.bin.lz"); + +static const u16 gWallpaperPalettes_Legendary[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/legendary_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Legendary[] = INCBIN_U32("graphics/pokemon_storage/legendary.4bpp.lz"); +static const u32 gWallpaperTilemap_Legendary[] = INCBIN_U32("graphics/pokemon_storage/legendary.bin.lz"); + +static const u16 gWallpaperPalettes_Dusclops[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/dusclops_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/dusclops.4bpp.lz"); +static const u32 gWallpaperTilemap_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/dusclops.bin.lz"); + +static const u16 gWallpaperPalettes_Ludicolo[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/ludicolo_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/ludicolo.4bpp.lz"); +static const u32 gWallpaperTilemap_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/ludicolo.bin.lz"); + +static const u16 gWallpaperPalettes_Whiscash[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/whiscash_bg.gbapal"), +}; +static const u32 gWallpaperTiles_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/whiscash.4bpp.lz"); +static const u32 gWallpaperTilemap_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/whiscash.bin.lz"); + +static const u32 gWallpaperIcon_Aqua[] = INCBIN_U32("graphics/pokemon_storage/aqua_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Heart[] = INCBIN_U32("graphics/pokemon_storage/heart_icon.4bpp.lz"); +static const u32 gWallpaperIcon_FiveStar[] = INCBIN_U32("graphics/pokemon_storage/five_star_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Brick[] = INCBIN_U32("graphics/pokemon_storage/brick_icon.4bpp.lz"); +static const u32 gWallpaperIcon_FourStar[] = INCBIN_U32("graphics/pokemon_storage/four_star_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Asterisk[] = INCBIN_U32("graphics/pokemon_storage/asterisk_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Dot[] = INCBIN_U32("graphics/pokemon_storage/dot_icon.4bpp.lz"); +static const u32 gWallpaperIcon_LineCircle[] = INCBIN_U32("graphics/pokemon_storage/line_circle_icon.4bpp.lz"); +static const u32 gWallpaperIcon_PokeBall[] = INCBIN_U32("graphics/pokemon_storage/pokeball_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Maze[] = INCBIN_U32("graphics/pokemon_storage/maze_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Footprint[] = INCBIN_U32("graphics/pokemon_storage/footprint_icon.4bpp.lz"); +static const u32 gWallpaperIcon_BigAsterisk[] = INCBIN_U32("graphics/pokemon_storage/big_asterisk_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Circle[] = INCBIN_U32("graphics/pokemon_storage/circle_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Koffing[] = INCBIN_U32("graphics/pokemon_storage/koffing_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/ribbon_icon.4bpp.lz"); +static const u32 gWallpaperIcon_FourCircles[] = INCBIN_U32("graphics/pokemon_storage/four_circles_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Lotad[] = INCBIN_U32("graphics/pokemon_storage/lotad_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Crystal[] = INCBIN_U32("graphics/pokemon_storage/crystal_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Pichu[] = INCBIN_U32("graphics/pokemon_storage/pichu_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Diglett[] = INCBIN_U32("graphics/pokemon_storage/diglett_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Luvdisc[] = INCBIN_U32("graphics/pokemon_storage/luvdisc_icon.4bpp.lz"); +static const u32 gWallpaperIcon_StarInCircle[] = INCBIN_U32("graphics/pokemon_storage/star_in_circle_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Spinda[] = INCBIN_U32("graphics/pokemon_storage/spinda_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Latis[] = INCBIN_U32("graphics/pokemon_storage/latis_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Minun[] = INCBIN_U32("graphics/pokemon_storage/minun_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Togepi[] = INCBIN_U32("graphics/pokemon_storage/togepi_icon.4bpp.lz"); +static const u32 gWallpaperIcon_Magma[] = INCBIN_U32("graphics/pokemon_storage/magma_icon.4bpp.lz"); + +static const struct WallpaperTable gFriendsWallpaperTable[] = +{ + WALLPAPER_ENTRY(Zigzagoon), + WALLPAPER_ENTRY(Screen), + WALLPAPER_ENTRY(Horizontal), + WALLPAPER_ENTRY(Diagonal), + WALLPAPER_ENTRY(Block), + WALLPAPER_ENTRY(Ribbon), + WALLPAPER_ENTRY(Pokecenter2), + WALLPAPER_ENTRY(Frame), + WALLPAPER_ENTRY(Blank), + WALLPAPER_ENTRY(Circles), + WALLPAPER_ENTRY(Azumarill), + WALLPAPER_ENTRY(Pikachu), + WALLPAPER_ENTRY(Legendary), + WALLPAPER_ENTRY(Dusclops), + WALLPAPER_ENTRY(Ludicolo), + WALLPAPER_ENTRY(Whiscash), +}; + +static const u32 *const gFriendsIcons[] = +{ + gWallpaperIcon_Aqua, + gWallpaperIcon_Heart, + gWallpaperIcon_FiveStar, + gWallpaperIcon_Brick, + gWallpaperIcon_FourStar, + gWallpaperIcon_Asterisk, + gWallpaperIcon_Dot, + gWallpaperIcon_Cross, + gWallpaperIcon_LineCircle, + gWallpaperIcon_PokeBall, + gWallpaperIcon_Maze, + gWallpaperIcon_Footprint, + gWallpaperIcon_BigAsterisk, + gWallpaperIcon_Circle, + gWallpaperIcon_Koffing, + gWallpaperIcon_Ribbon, + gWallpaperIcon_Bolt, + gWallpaperIcon_FourCircles, + gWallpaperIcon_Lotad, + gWallpaperIcon_Crystal, + gWallpaperIcon_Pichu, + gWallpaperIcon_Diglett, + gWallpaperIcon_Luvdisc, + gWallpaperIcon_StarInCircle, + gWallpaperIcon_Spinda, + gWallpaperIcon_Latis, + gWallpaperIcon_Plusle, + gWallpaperIcon_Minun, + gWallpaperIcon_Togepi, + gWallpaperIcon_Magma, +}; + +// Unknown Unused data. +static const u16 gUnknown_0857B07C = 0x23BA; -const u16 gBoxSelectionPopupPalette[] = INCBIN_U16("graphics/unknown/unknown_57173C.gbapal"); -const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp"); -const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); +static const struct SpriteSheet gUnknown_0857B080 = {gPCGfx_Arrow, 0x80, 6}; + +static const struct OamData gOamData_83BB298 = +{ + .shape = ST_OAM_H_RECTANGLE, + .size = 2, + .priority = 2 +}; + +static const union AnimCmd gSpriteAnim_83BB2A0[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83BB2A8[] = +{ + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_83BB2B0[] = +{ + gSpriteAnim_83BB2A0, + gSpriteAnim_83BB2A8 +}; + +static const struct SpriteTemplate gSpriteTemplate_857B0A8 = +{ + TAG_TILE_3, + TAG_PAL_DAC9, + &gOamData_83BB298, + gSpriteAnimTable_83BB2B0, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +static const struct OamData gOamData_83BB2D0 = +{ + .shape = ST_OAM_V_RECTANGLE, + .priority = 2 +}; + +static const union AnimCmd gSpriteAnim_83BB2D8[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83BB2E0[] = +{ + ANIMCMD_FRAME(2, 5), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_83BB2E8[] = +{ + gSpriteAnim_83BB2D8, + gSpriteAnim_83BB2E0 +}; + +static const struct SpriteTemplate gUnknown_0857B0E0 = +{ + 6, + TAG_PAL_WAVEFORM, + &gOamData_83BB2D0, + gSpriteAnimTable_83BB2E8, + NULL, + gDummySpriteAffineAnimTable, + sub_80CD210 +}; + +static const u16 gHandCursorPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor.gbapal"); +static const u8 gHandCursorTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor.4bpp"); +static const u8 gHandCursorShadowTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor_shadow.4bpp"); // code u8 CountMonsInBox(u8 boxId) @@ -117,7 +1549,7 @@ u8 CountMonsInBox(u8 boxId) for (i = 0, count = 0; i < IN_BOX_COUNT; i++) { - if (GetBoxMonDataFromAnyBox(boxId, i, MON_DATA_SPECIES) != SPECIES_NONE) + if (GetBoxMonDataAt(boxId, i, MON_DATA_SPECIES) != SPECIES_NONE) count++; } @@ -130,7 +1562,7 @@ s16 GetFirstFreeBoxSpot(u8 boxId) for (i = 0; i < IN_BOX_COUNT; i++) { - if (GetBoxMonDataFromAnyBox(boxId, i, MON_DATA_SPECIES) == SPECIES_NONE) + if (GetBoxMonDataAt(boxId, i, MON_DATA_SPECIES) == SPECIES_NONE) return i; } @@ -191,7 +1623,7 @@ u8 CountPartyMons(void) return count; } -static u8 *StringCopyAndFillWithSpaces(u8 *dst, const u8 *src, u16 n) +u8 *StringCopyAndFillWithSpaces(u8 *dst, const u8 *src, u16 n) { u8 *str; @@ -217,28 +1649,7 @@ static void sub_80C7128(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, } } -#define MAX_DMA_BLOCK_SIZE 0x1000 -#define Dma3FillLarge_(value, dest, size, bit) \ -{ \ - void *_dest = dest; \ - u32 _size = size; \ - while (1) \ - { \ - if (_size <= MAX_DMA_BLOCK_SIZE) \ - { \ - DmaFill##bit(3, value, _dest, _size); \ - break; \ - } \ - DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \ - _dest += MAX_DMA_BLOCK_SIZE; \ - _size -= MAX_DMA_BLOCK_SIZE; \ - } \ -} - -#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16) -#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32) - -void sub_80C71A4(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) +static void sub_80C71A4(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) { u16 i; @@ -248,13 +1659,14 @@ void sub_80C71A4(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) Dma3FillLarge16_(0, dest, width); } -void Task_PokemonStorageSystem(u8 taskId) +static void Task_PokemonStorageSystemPC(u8 taskId) { - struct Task *task = gTasks + taskId; + struct Task *task = &gTasks[taskId]; + switch (task->data[0]) { case 0: - StorageSystemCreatePrimaryMenu(task->data[1], &task->data[15]); + CreatePCMenu(task->data[1], &task->data[15]); sub_81973A4(); NewMenuHelpers_DrawDialogueFrame(0, 0); FillWindowPixelBuffer(0, 0x11); @@ -327,8 +1739,8 @@ void Task_PokemonStorageSystem(u8 taskId) { if (--task->data[1] < 0) task->data[1] = 4; - MoveMenuCursor(-1); - task->data[1] = GetMenuCursorPos(); + Menu_MoveCursor(-1); + task->data[1] = Menu_GetCursorPos(); FillWindowPixelBuffer(0, 0x11); AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3); task->data[0] = 2; @@ -337,8 +1749,8 @@ void Task_PokemonStorageSystem(u8 taskId) { if (++task->data[1] > 3) task->data[1] = 0; - MoveMenuCursor(1); - task->data[1] = GetMenuCursorPos(); + Menu_MoveCursor(1); + task->data[1] = Menu_GetCursorPos(); FillWindowPixelBuffer(0, 0x11); AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3); task->data[0] = 2; @@ -347,8 +1759,8 @@ void Task_PokemonStorageSystem(u8 taskId) case 4: if (!gPaletteFade.active) { - overworld_free_bg_tilemaps(); - sub_80C7D74(task->data[2]); + CleanupOverworldWindowsAndTilemaps(); + Cb2_EnterPSS(task->data[2]); RemoveWindow(task->data[15]); DestroyTask(taskId); } @@ -356,29 +1768,29 @@ void Task_PokemonStorageSystem(u8 taskId) } } -void ShowPokemonStorageSystem(void) +void ShowPokemonStorageSystemPC(void) { - u8 taskId = CreateTask(Task_PokemonStorageSystem, 80); + u8 taskId = CreateTask(Task_PokemonStorageSystemPC, 80); gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = 0; ScriptContext2_Enable(); } -void mapldr_0808C6D8(void) +static void FieldCb_ReturnToPcMenu(void) { u8 taskId; MainCallback vblankCb = gMain.vblankCallback; SetVBlankCallback(NULL); - taskId = CreateTask(Task_PokemonStorageSystem, 80); + taskId = CreateTask(Task_PokemonStorageSystemPC, 80); gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = gUnknown_02039D00; - Task_PokemonStorageSystem(taskId); + gTasks[taskId].data[1] = sPreviousBoxOption; + Task_PokemonStorageSystemPC(taskId); SetVBlankCallback(vblankCb); pal_fill_black(); } -void StorageSystemCreatePrimaryMenu(u8 whichMenu, s16 *windowIdPtr) +static void CreatePCMenu(u8 whichMenu, s16 *windowIdPtr) { s16 windowId; struct WindowTemplate winTemplate = gUnknown_085716E8; @@ -391,14 +1803,14 @@ void StorageSystemCreatePrimaryMenu(u8 whichMenu, s16 *windowIdPtr) *windowIdPtr = windowId; } -void sub_80C7678(void) +static void Cb2_ExitPSS(void) { - gUnknown_02039D00 = sub_80CAEA0(); - gFieldCallback = mapldr_0808C6D8; + sPreviousBoxOption = GetCurrentBoxOption(); + gFieldCallback = FieldCb_ReturnToPcMenu; SetMainCallback2(CB2_ReturnToField); } -s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode) +static s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode) { s16 i; s16 direction; @@ -431,14 +1843,13 @@ s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx void ResetPokemonStorageSystem(void) { - u16 boxId; - u16 boxMon; + u16 boxId, boxPosition; SetCurrentBox(0); for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++) { - for (boxMon = 0; boxMon < IN_BOX_COUNT; boxMon++) - ClearMonInBox(boxId, boxMon); + for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++) + ZeroBoxMonAt(boxId, boxPosition); } for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++) { @@ -452,7 +1863,7 @@ void ResetPokemonStorageSystem(void) ResetWaldaWallpaper(); } -void sub_80C77E8(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3, bool32 loadPal) +static void sub_80C77E8(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3, bool32 loadPal) { struct SpritePalette palette = { @@ -476,7 +1887,7 @@ void sub_80C77E8(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3 a0->unk_023c = loadPal; } -void sub_80C7890(void) +static void sub_80C7890(void) { if (gUnknown_02039D04->unk_023c) FreeSpritePaletteByTag(gUnknown_02039D04->unk_0242); @@ -484,17 +1895,17 @@ void sub_80C7890(void) FreeSpriteTilesByTag(gUnknown_02039D04->unk_0240 + 1); } -void sub_80C78D4(u8 curBox) +static void sub_80C78D4(u8 curBox) { sub_80C7958(curBox); } -void sub_80C78E4(void) +static void sub_80C78E4(void) { sub_80C7B14(); } -u8 sub_80C78F0(void) +static u8 HandleBoxChooseSelectionInput(void) { if (gMain.newKeys & B_BUTTON) { @@ -519,7 +1930,7 @@ u8 sub_80C78F0(void) return 200; } -void sub_80C7958(u8 curBox) +static void sub_80C7958(u8 curBox) { u16 i; u8 spriteId; @@ -535,7 +1946,7 @@ void sub_80C7958(u8 curBox) template.tileTag = gUnknown_02039D04->unk_0240; template.paletteTag = gUnknown_02039D04->unk_0242; - spriteId = CreateSprite(&template, 0xA0, 0x60, 0); + spriteId = CreateSprite(&template, 160, 96, 0); gUnknown_02039D04->unk_0000 = gSprites + spriteId; oamData.shape = ST_OAM_V_RECTANGLE; @@ -545,17 +1956,17 @@ void sub_80C7958(u8 curBox) for (i = 0; i < 4; i++) { u16 r5; - spriteId = CreateSprite(&template, 0x7c, 0x50, gUnknown_02039D04->unk_0246); + spriteId = CreateSprite(&template, 124, 80, gUnknown_02039D04->unk_0246); gUnknown_02039D04->unk_0004[i] = gSprites + spriteId; r5 = 0; if (i & 2) { - gUnknown_02039D04->unk_0004[i]->pos1.x = 0xc4; + gUnknown_02039D04->unk_0004[i]->pos1.x = 196; r5 = 2; } if (i & 1) { - gUnknown_02039D04->unk_0004[i]->pos1.y = 0x70; + gUnknown_02039D04->unk_0004[i]->pos1.y = 112; gUnknown_02039D04->unk_0004[i]->oam.size = 0; r5++; } @@ -573,7 +1984,7 @@ void sub_80C7958(u8 curBox) sub_80C7BE4(); } -void sub_80C7B14(void) +static void sub_80C7B14(void) { u16 i; if (gUnknown_02039D04->unk_0000) @@ -596,20 +2007,20 @@ void sub_80C7B14(void) } } -void sub_80C7B80(void) +static void sub_80C7B80(void) { if (++gUnknown_02039D04->curBox >= TOTAL_BOXES_COUNT) gUnknown_02039D04->curBox = 0; sub_80C7BE4(); } -void sub_80C7BB4(void) +static void sub_80C7BB4(void) { gUnknown_02039D04->curBox = (gUnknown_02039D04->curBox == 0 ? TOTAL_BOXES_COUNT - 1 : gUnknown_02039D04->curBox - 1); sub_80C7BE4(); } -void sub_80C7BE4(void) +static void sub_80C7BE4(void) { u8 text[16]; struct WindowTemplate winTemplate; @@ -626,13 +2037,13 @@ void sub_80C7BE4(void) windowId = AddWindow(&winTemplate); FillWindowPixelBuffer(windowId, 0x44); - center = GetStringCenterAlignXOffset(1, boxName, 0x40); + center = GetStringCenterAlignXOffset(1, boxName, 64); AddTextPrinterParameterized3(windowId, 1, center, 1, gUnknown_08571734, TEXT_SPEED_FF, boxName); ConvertIntToDecimalStringN(text, nPokemonInBox, 1, 2); StringAppend(text, gUnknown_08571737); - center = GetStringCenterAlignXOffset(1, text, 0x40); - AddTextPrinterParameterized3(windowId, 1, center, 0x11, gUnknown_08571734, TEXT_SPEED_FF, text); + center = GetStringCenterAlignXOffset(1, text, 64); + AddTextPrinterParameterized3(windowId, 1, center, 17, gUnknown_08571734, TEXT_SPEED_FF, text); winTileData = GetWindowAttribute(windowId, WINDOW_TILE_DATA); CpuCopy32((void *)winTileData, (void *)OBJ_VRAM0 + 0x100 + (GetSpriteTileStartByTag(gUnknown_02039D04->unk_0240) * 32), 0x400); @@ -640,7 +2051,7 @@ void sub_80C7BE4(void) RemoveWindow(windowId); } -void sub_80C7CF4(struct Sprite *sprite) +static void sub_80C7CF4(struct Sprite *sprite) { if (++sprite->data[1] > 3) { @@ -654,21 +2065,8587 @@ void sub_80C7CF4(struct Sprite *sprite) } } -void sub_80C7D28(void) +static void VblankCb_PSS(void) { LoadOam(); ProcessSpriteCopyRequests(); sub_80D2AA4(); TransferPlttBuffer(); - SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_02039D08->bg2_X); + SetGpuReg(REG_OFFSET_BG2HOFS, sPSSData->bg2_X); } -void c2_Box(void) +static void Cb2_PSS(void) { RunTasks(); do_scheduled_bg_tilemap_copies_to_vram(); - sub_80CA028(); + ScrollBackground(); sub_80CAA14(); AnimateSprites(); BuildOamBuffer(); } + +static void Cb2_EnterPSS(u8 boxOption) +{ + ResetTasks(); + sCurrentBoxOption = boxOption; + sPSSData = Alloc(sizeof(*sPSSData)); + if (sPSSData == NULL) + { + SetMainCallback2(Cb2_ExitPSS); + } + else + { + sPSSData->boxOption = boxOption; + sPSSData->isReshowingPSS = FALSE; + gUnknown_02039D12 = 0; + sPSSData->state = 0; + sPSSData->taskId = CreateTask(Cb_InitPSS, 3); + gUnknown_02039D10 = StorageGetCurrentBox(); + SetMainCallback2(Cb2_PSS); + } +} + +static void Cb2_ReturnToPSS(void) +{ + ResetTasks(); + sPSSData = Alloc(sizeof(*sPSSData)); + if (sPSSData == NULL) + { + SetMainCallback2(Cb2_ExitPSS); + } + else + { + sPSSData->boxOption = sCurrentBoxOption; + sPSSData->isReshowingPSS = TRUE; + sPSSData->state = 0; + sPSSData->taskId = CreateTask(Cb_InitPSS, 3); + SetMainCallback2(Cb2_PSS); + } +} + +static void ResetAllBgCoords(void) +{ + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); +} + +static void sub_80C7E98(void) +{ + ResetPaletteFade(); + ResetSpriteData(); + FreeSpriteTileRanges(); + FreeAllSpritePalettes(); + ClearDma3Requests(); + gReservedSpriteTileCount = 0x280; + sub_80D2A90(&sPSSData->unk_0020, sPSSData->unk_0028, 8); + gKeyRepeatStartDelay = 20; + clear_scheduled_bg_copies_to_vram(); + sub_80D259C(3); + sub_80D2644(0, 1, gUnknown_0857239C, 8, 4); + sub_80D2770(0, 1, 0); + sPSSData->unk_02C7 = 0; +} + +static void sub_80C7F1C(void) +{ + sub_80CDC0C(); + sInPartyMenu = (sPSSData->boxOption == BOX_OPTION_DEPOSIT); + gUnknown_02039D0E = 0; +} + +static void sub_80C7F4C(void) +{ + if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + { + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(7, 11)); + } + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP); +} + +static void SetPSSCallback(TaskFunc newFunc) +{ + gTasks[sPSSData->taskId].func = newFunc; + sPSSData->state = 0; +} + +static void Cb_InitPSS(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + SetVBlankCallback(NULL); + SetGpuReg(REG_OFFSET_DISPCNT, 0); + sub_80C7E98(); + if (sPSSData->isReshowingPSS) + { + switch (sWhichToReshow) + { + case 1: + sub_80CE790(); + break; + case 0: + sub_80CE8E4(); + break; + case 2: + GiveChosenBagItem(); + break; + } + } + LoadPSSMenuGfx(); + LoadWaveformSpritePalette(); + break; + case 1: + if (!InitPSSWindows()) + { + SetPSSCallback(Cb_ChangeScreen); + return; + } + break; + case 2: + PutWindowTilemap(0); + ClearWindowTilemap(1); + CpuFill32(0, (void *)VRAM, 0x200); + LoadUserWindowBorderGfx(1, 0xB, 0xE0); + break; + case 3: + ResetAllBgCoords(); + if (!sPSSData->isReshowingPSS) + sub_80C7F1C(); + break; + case 4: + sub_80CAF04(); + if (!sPSSData->isReshowingPSS) + sub_80CD36C(); + else + sub_80CD3EC(); + break; + case 5: + if (!sub_80D0164()) + { + SetPSSCallback(Cb_ChangeScreen); + return; + } + else + { + SetScrollingBackground(); + sub_80CAC1C(); + } + break; + case 6: + sub_80CA0D8(); + break; + case 7: + sub_80CA704(); + break; + case 8: + sub_80CC32C(StorageGetCurrentBox()); + break; + case 9: + if (sub_80CC35C()) + return; + + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + { + sPSSData->field_DA4.baseTileTag = TAG_TILE_D; + sPSSData->field_DA4.basePaletteTag = TAG_PAL_DACE; + sub_811F90C(&sPSSData->field_DA4); + sub_811FA90(); + } + else + { + sub_80D0C60(); + sub_80CAEAC(); + } + break; + case 10: + sub_80C7F4C(); + if (!sPSSData->isReshowingPSS) + { + BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); + SetPSSCallback(Cb_ShowPSS); + } + else + { + BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); + SetPSSCallback(Cb_ReshowPSS); + } + SetVBlankCallback(VblankCb_PSS); + return; + default: + return; + } + + sPSSData->state++; +} + +static void Cb_ShowPSS(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + PlaySE(SE_PC_LOGIN); + sub_80F9BCC(0x14, 0, 1); + sPSSData->state++; + break; + case 1: + if (!sub_80F9C1C()) + SetPSSCallback(Cb_MainPSS); + break; + } +} + +static void Cb_ReshowPSS(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0x10, 0, RGB_BLACK); + sPSSData->state++; + break; + case 1: + if (!UpdatePaletteFade()) + { + if (sWhichToReshow == 2 && gSpecialVar_ItemId != 0) + { + PrintStorageActionText(PC_TEXT_ITEM_IS_HELD); + sPSSData->state++; + } + else + { + SetPSSCallback(Cb_MainPSS); + } + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy() && gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + ClearBottomWindow(); + sPSSData->state++; + } + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + SetPSSCallback(Cb_MainPSS); + break; + } +} + +static void Cb_MainPSS(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + switch (HandleInput()) + { + case 1: + PlaySE(SE_SELECT); + sPSSData->state = 1; + break; + case 5: + if (sPSSData->boxOption != BOX_OPTION_MOVE_MONS && sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + { + PrintStorageActionText(PC_TEXT_WHICH_ONE_WILL_TAKE); + sPSSData->state = 3; + } + else + { + sub_80CDC0C(); + SetPSSCallback(Cb_ShowPartyPokemon); + } + break; + case 6: + if (sPSSData->boxOption == BOX_OPTION_MOVE_MONS) + { + if (IsMonBeingMoved() && ItemIsMail(sPSSData->cursorMonItem)) + sPSSData->state = 5; + else + SetPSSCallback(Cb_HidePartyPokemon); + } + else if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + { + SetPSSCallback(Cb_HidePartyPokemon); + } + break; + case 4: + SetPSSCallback(Cb_OnCloseBoxPressed); + break; + case 19: + SetPSSCallback(Cb_OnBPressed); + break; + case 7: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_HandleBoxOptions); + break; + case 8: + SetPSSCallback(Cb_OnSelectedMon); + break; + case 9: + PlaySE(SE_SELECT); + sPSSData->newCurrBoxId = StorageGetCurrentBox() + 1; + if (sPSSData->newCurrBoxId >= TOTAL_BOXES_COUNT) + sPSSData->newCurrBoxId = 0; + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + { + SetUpScrollToBox(sPSSData->newCurrBoxId); + sPSSData->state = 2; + } + else + { + sub_80CFEA8(); + sPSSData->state = 10; + } + break; + case 10: + PlaySE(SE_SELECT); + sPSSData->newCurrBoxId = StorageGetCurrentBox() - 1; + if (sPSSData->newCurrBoxId < 0) + sPSSData->newCurrBoxId = TOTAL_BOXES_COUNT - 1; + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + { + SetUpScrollToBox(sPSSData->newCurrBoxId); + sPSSData->state = 2; + } + else + { + sub_80CFEA8(); + sPSSData->state = 10; + } + break; + case 11: + if (!CanMovePartyMon()) + { + if (ItemIsMail(sPSSData->cursorMonItem)) + { + sPSSData->state = 5; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(Cb_DepositMenu); + } + } + else + { + sPSSData->state = 4; + } + break; + case 13: + if (CanMovePartyMon()) + { + sPSSData->state = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(Cb_MoveMon); + } + break; + case 14: + if (!CanShiftMon()) + { + sPSSData->state = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(Cb_ShiftMon); + } + break; + case 12: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_WithdrawMon); + break; + case 15: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_PlaceMon); + break; + case 16: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_TakeItemForMoving); + break; + case 17: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_GiveMovingItemToMon); + break; + case 18: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_SwitchSelectedItem); + break; + case 20: + PlaySE(SE_SELECT); + sub_80D01D0(0); + sPSSData->state = 7; + break; + case 22: + sub_80D01D0(1); + sPSSData->state = 8; + break; + case 21: + PlaySE(SE_SELECT); + sub_80D01D0(2); + sPSSData->state = 9; + break; + case 23: + sub_80D01D0(3); + sPSSData->state = 7; + break; + case 25: + PlaySE(SE_SELECT); + sub_80D01D0(4); + sPSSData->state = 9; + break; + case 26: + PlaySE(SE_SELECT); + sub_80D01D0(5); + sPSSData->state = 7; + break; + case 24: + PlaySE(SE_HAZURE); + break; + } + break; + case 1: + if (!sub_80CD554()) + { + if (IsCursorOnCloseBox()) + sub_80CA9C0(); + else + sub_80CA9EC(); + + if (sPSSData->setMosaic) + BoxSetMosaic(); + sPSSData->state = 0; + } + break; + case 2: + if (!ScrollToBox()) + { + SetCurrentBox(sPSSData->newCurrBoxId); + if (!sInPartyMenu && !IsMonBeingMoved()) + { + sub_80CE00C(); + BoxSetMosaic(); + } + + if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + { + sub_80CFECC(); + sPSSData->state = 11; + } + else + { + sPSSData->state = 0; + } + } + break; + case 3: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + sPSSData->state = 0; + } + break; + case 4: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_LAST_POKE); + sPSSData->state = 6; + break; + case 5: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); + sPSSData->state = 6; + break; + case 6: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + } + break; + case 7: + if (!sub_80D01E4()) + sPSSData->state = 0; + break; + case 8: + if (!sub_80D01E4()) + SetPSSCallback(Cb_MoveMon); + break; + case 9: + if (!sub_80D01E4()) + { + if (sPSSData->setMosaic) + BoxSetMosaic(); + sPSSData->state = 0; + } + break; + case 10: + if (!sub_80D1218()) + { + SetUpScrollToBox(sPSSData->newCurrBoxId); + sPSSData->state = 2; + } + break; + case 11: + if (!sub_80D1218()) + sPSSData->state = 0; + break; + } +} + +static void Cb_ShowPartyPokemon(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + SetUpDoShowPartyMenu(); + sPSSData->state++; + break; + case 1: + if (!DoShowPartyMenu()) + SetPSSCallback(Cb_MainPSS); + break; + } +} + +static void Cb_HidePartyPokemon(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + PlaySE(SE_SELECT); + SetUpHidePartyMenu(); + sPSSData->state++; + break; + case 1: + if (!HidePartyMenu()) + { + sub_80CDBF8(sub_80CDC2C()); + sPSSData->state++; + } + break; + case 2: + if (!sub_80CD554()) + { + if (sPSSData->setMosaic) + BoxSetMosaic(); + SetPSSCallback(Cb_MainPSS); + } + break; + } +} + +static void Cb_OnSelectedMon(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + if (!sub_80CA2B8()) + { + PlaySE(SE_SELECT); + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + PrintStorageActionText(PC_TEXT_IS_SELECTED); + else if (IsActiveItemMoving() || sPSSData->cursorMonItem != 0) + PrintStorageActionText(PC_TEXT_IS_SELECTED2); + else + PrintStorageActionText(PC_TEXT_GIVE_TO_MON); + + AddMenu(); + sPSSData->state = 1; + } + break; + case 1: // debug? + if (!sub_80D00A8()) + sPSSData->state = 2; + break; + case 2: + switch (sub_80D00AC()) + { + case -1: + case 0: + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + break; + case 3: + if (CanMovePartyMon()) + { + sPSSData->state = 3; + } + else + { + PlaySE(SE_SELECT); + ClearBottomWindow(); + SetPSSCallback(Cb_MoveMon); + } + break; + case 5: + PlaySE(SE_SELECT); + ClearBottomWindow(); + SetPSSCallback(Cb_PlaceMon); + break; + case 4: + if (!CanShiftMon()) + { + sPSSData->state = 3; + } + else + { + PlaySE(SE_SELECT); + ClearBottomWindow(); + SetPSSCallback(Cb_ShiftMon); + } + break; + case 2: + PlaySE(SE_SELECT); + ClearBottomWindow(); + SetPSSCallback(Cb_WithdrawMon); + break; + case 1: + if (CanMovePartyMon()) + { + sPSSData->state = 3; + } + else if (ItemIsMail(sPSSData->cursorMonItem)) + { + sPSSData->state = 4; + } + else + { + PlaySE(SE_SELECT); + ClearBottomWindow(); + SetPSSCallback(Cb_DepositMenu); + } + break; + case 7: + if (CanMovePartyMon()) + { + sPSSData->state = 3; + } + else if (sPSSData->cursorMonIsEgg) + { + sPSSData->state = 5; // Cannot release an Egg. + } + else if (ItemIsMail(sPSSData->cursorMonItem)) + { + sPSSData->state = 4; + } + else + { + PlaySE(SE_SELECT); + SetPSSCallback(Cb_ReleaseMon); + } + break; + case 6: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_ShowMonSummary); + break; + case 8: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_ShowMarkMenu); + break; + case 12: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_TakeItemForMoving); + break; + case 13: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_GiveMovingItemToMon); + break; + case 16: + SetPSSCallback(Cb_ItemToBag); + break; + case 15: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_SwitchSelectedItem); + break; + case 14: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_GiveItemFromBag); + break; + case 17: + SetPSSCallback(Cb_ShowItemInfo); + break; + } + break; + case 3: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_LAST_POKE); + sPSSData->state = 6; + break; + case 5: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_CANT_RELEASE_EGG); + sPSSData->state = 6; + break; + case 4: + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); + sPSSData->state = 6; + break; + case 6: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + } + break; + } +} + +static void Cb_MoveMon(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + InitMonPlaceChange(0); + sPSSData->state++; + break; + case 1: + if (!DoMonPlaceChange()) + { + if (sInPartyMenu) + SetPSSCallback(Cb_HandleMovingMonFromParty); + else + SetPSSCallback(Cb_MainPSS); + } + break; + } +} + +static void Cb_PlaceMon(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + InitMonPlaceChange(1); + sPSSData->state++; + break; + case 1: + if (!DoMonPlaceChange()) + { + if (sInPartyMenu) + SetPSSCallback(Cb_HandleMovingMonFromParty); + else + SetPSSCallback(Cb_MainPSS); + } + break; + } +} + +static void Cb_ShiftMon(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + InitMonPlaceChange(2); + sPSSData->state++; + break; + case 1: + if (!DoMonPlaceChange()) + { + BoxSetMosaic(); + SetPSSCallback(Cb_MainPSS); + } + break; + } +} + +static void Cb_WithdrawMon(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + if (CalculatePlayerPartyCount() == PARTY_SIZE) + { + PrintStorageActionText(PC_TEXT_PARTY_FULL); + sPSSData->state = 1; + } + else + { + sub_80CDC18(); + InitMonPlaceChange(0); + sPSSData->state = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + } + break; + case 2: + if (!DoMonPlaceChange()) + { + SetMovingMonPriority(1); + SetUpDoShowPartyMenu(); + sPSSData->state++; + } + break; + case 3: + if (!DoShowPartyMenu()) + { + InitMonPlaceChange(1); + sPSSData->state++; + } + break; + case 4: + if (!DoMonPlaceChange()) + { + sub_80CAB20(); + sPSSData->state++; + } + break; + case 5: + SetPSSCallback(Cb_HidePartyPokemon); + break; + } +} + +static void Cb_DepositMenu(u8 taskId) +{ + u8 boxId; + + switch (sPSSData->state) + { + case 0: + PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); + sub_80C77E8(&sPSSData->field_1E5C, TAG_TILE_A, TAG_PAL_DAC7, 3, FALSE); + sub_80C78D4(gUnknown_02039D0E); + sPSSData->state++; + break; + case 1: + boxId = HandleBoxChooseSelectionInput(); + if (boxId == 200) + { + // no box chosen yet + } + else if (boxId == 201) + { + ClearBottomWindow(); + sub_80C78E4(); + sub_80C7890(); + SetPSSCallback(Cb_MainPSS); + } + else + { + if (TryStorePartyMonInBox(boxId)) + { + gUnknown_02039D0E = boxId; + ClearBottomWindow(); + sub_80C78E4(); + sub_80C7890(); + sPSSData->state = 2; + } + else + { + PrintStorageActionText(PC_TEXT_BOX_IS_FULL); + sPSSData->state = 4; + } + } + break; + case 2: + CompactPartySlots(); + sub_80CB950(); + sPSSData->state++; + break; + case 3: + if (!sub_80CB9BC()) + { + sub_80CE22C(); + BoxSetMosaic(); + sub_80CAB20(); + SetPSSCallback(Cb_MainPSS); + } + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); + sPSSData->state = 1; + } + break; + } +} + +static void Cb_ReleaseMon(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + PrintStorageActionText(PC_TEXT_RELEASE_POKE); + ShowYesNoWindow(1); + sPSSData->state++; + // fallthrough + case 1: + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case MENU_B_PRESSED: + case 1: + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + break; + case 0: + ClearBottomWindow(); + InitCanRelaseMonVars(); + sub_80CE250(); + sPSSData->state++; + break; + } + break; + case 2: + RunCanReleaseMon(); + if (!sub_80CE2A8()) + { + while (1) + { + s8 r0 = RunCanReleaseMon(); + if (r0 == 1) + { + sPSSData->state++; + break; + } + else if (r0 == 0) + { + sPSSData->state = 8; // Can't release the mon. + break; + } + } + } + break; + case 3: + ReleaseMon(); + RefreshCursorMonData(); + PrintStorageActionText(PC_TEXT_WAS_RELEASED); + sPSSData->state++; + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + PrintStorageActionText(PC_TEXT_BYE_BYE); + sPSSData->state++; + } + break; + case 5: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + if (sInPartyMenu) + { + CompactPartySlots(); + sub_80CB950(); + sPSSData->state++; + } + else + { + sPSSData->state = 7; + } + } + break; + case 6: + if (!sub_80CB9BC()) + { + sub_80CE00C(); + BoxSetMosaic(); + sub_80CAB20(); + sPSSData->state++; + } + break; + case 7: + SetPSSCallback(Cb_MainPSS); + break; + case 8: + PrintStorageActionText(PC_TEXT_WAS_RELEASED); + sPSSData->state++; + break; + case 9: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + PrintStorageActionText(PC_TEXT_SURPRISE); + sPSSData->state++; + } + break; + case 10: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + sub_80CC064(); + sPSSData->state++; + } + break; + case 11: + if (!sub_80CC0A0()) + { + sub_80CE324(); + PrintStorageActionText(PC_TEXT_CAME_BACK); + sPSSData->state++; + } + break; + case 12: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + PrintStorageActionText(PC_TEXT_WORRIED); + sPSSData->state++; + } + break; + case 13: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + } + break; + } +} + +static void Cb_ShowMarkMenu(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + PrintStorageActionText(PC_TEXT_MARK_POKE); + sPSSData->field_DA4.markings = sPSSData->cursorMonMarkings; + sub_811FAA4(sPSSData->cursorMonMarkings, 0xb0, 0x10); + sPSSData->state++; + break; + case 1: + if (!sub_811FBA4()) + { + sub_811FAF8(); + ClearBottomWindow(); + SetMonMarkings(sPSSData->field_DA4.markings); + RefreshCursorMonData(); + SetPSSCallback(Cb_MainPSS); + } + break; + } +} + +static void Cb_TakeItemForMoving(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + if (!ItemIsMail(sPSSData->cursorMonItem)) + { + ClearBottomWindow(); + sPSSData->state++; + } + else + { + SetPSSCallback(Cb_PrintCantStoreMail); + } + break; + case 1: + sub_80CFE54(2); + Item_FromMonToMoving((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); + sPSSData->state++; + break; + case 2: + if (!sub_80D1218()) + { + sub_80CFE54(3); + ClearBottomWindow(); + sub_80CE00C(); + PrintCursorMonInfo(); + sPSSData->state++; + } + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + SetPSSCallback(Cb_MainPSS); + break; + } +} + +static void Cb_GiveMovingItemToMon(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + ClearBottomWindow(); + sPSSData->state++; + break; + case 1: + sub_80CFE54(2); + Item_GiveMovingToMon((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); + sPSSData->state++; + break; + case 2: + if (!sub_80D1218()) + { + sub_80CFE54(0); + sub_80CE00C(); + PrintCursorMonInfo(); + PrintStorageActionText(PC_TEXT_ITEM_IS_HELD); + sPSSData->state++; + } + break; + case 3: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + sPSSData->state++; + } + break; + case 4: + if (!IsDma3ManagerBusyWithBgCopy()) + SetPSSCallback(Cb_MainPSS); + break; + } +} + +static void Cb_ItemToBag(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + if (!AddBagItem(sPSSData->cursorMonItem, 1)) + { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_BAG_FULL); + sPSSData->state = 3; + } + else + { + PlaySE(SE_SELECT); + Item_TakeMons((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); + sPSSData->state = 1; + } + break; + case 1: + if (!sub_80D1218()) + { + PrintStorageActionText(PC_TEXT_PLACED_IN_BAG); + sPSSData->state = 2; + } + break; + case 2: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + sub_80CE00C(); + PrintCursorMonInfo(); + sPSSData->state = 4; + } + break; + case 4: + if (!IsDma3ManagerBusyWithBgCopy()) + SetPSSCallback(Cb_MainPSS); + break; + case 3: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + } + break; + } +} + +static void Cb_SwitchSelectedItem(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + if (!ItemIsMail(sPSSData->cursorMonItem)) + { + ClearBottomWindow(); + sPSSData->state++; + } + else + { + SetPSSCallback(Cb_PrintCantStoreMail); + } + break; + case 1: + sub_80CFE54(2); + Item_SwitchMonsWithMoving((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); + sPSSData->state++; + break; + case 2: + if (!sub_80D1218()) + { + sub_80CFE54(3); + sub_80CE00C(); + PrintCursorMonInfo(); + PrintStorageActionText(PC_TEXT_CHANGED_TO_ITEM); + sPSSData->state++; + } + break; + case 3: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + sPSSData->state++; + } + break; + case 4: + if (!IsDma3ManagerBusyWithBgCopy()) + SetPSSCallback(Cb_MainPSS); + break; + } +} + +static void Cb_ShowItemInfo(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + ClearBottomWindow(); + sPSSData->state++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + PlaySE(SE_WIN_OPEN); + PrintItemDescription(); + sub_80D1818(); + sPSSData->state++; + } + break; + case 2: + if (!sub_80D184C()) + sPSSData->state++; + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + sPSSData->state++; + break; + case 4: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + PlaySE(SE_WIN_OPEN); + sPSSData->state++; + } + break; + case 5: + if (!sub_80D18E4()) + sPSSData->state++; + break; + case 6: + if (!IsDma3ManagerBusyWithBgCopy()) + SetPSSCallback(Cb_MainPSS); + break; + } +} + +static void Cb_CloseBoxWhileHoldingItem(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_PUT_IN_BAG); + ShowYesNoWindow(0); + sPSSData->state = 1; + break; + case 1: + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case MENU_B_PRESSED: + case 1: + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + break; + case 0: + if (AddBagItem(sPSSData->movingItem, 1) == TRUE) + { + ClearBottomWindow(); + sPSSData->state = 3; + } + else + { + PrintStorageActionText(PC_TEXT_BAG_FULL); + sPSSData->state = 2; + } + break; + } + break; + case 2: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + sPSSData->state = 5; + } + break; + case 3: + sub_80D1194(); + sPSSData->state = 4; + break; + case 4: + if (!sub_80D1218()) + { + sub_80CFE54(0); + SetPSSCallback(Cb_MainPSS); + } + break; + case 5: + if (!IsDma3ManagerBusyWithBgCopy()) + SetPSSCallback(Cb_MainPSS); + break; + } +} + +static void Cb_HandleMovingMonFromParty(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + CompactPartySlots(); + sub_80CB950(); + sPSSData->state++; + break; + case 1: + if (!sub_80CB9BC()) + { + sub_80CAB20(); + SetPSSCallback(Cb_MainPSS); + } + break; + } +} + +static void Cb_PrintCantStoreMail(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + PrintStorageActionText(PC_TEXT_CANT_STORE_MAIL); + sPSSData->state++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + sPSSData->state++; + break; + case 2: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + sPSSData->state++; + } + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + SetPSSCallback(Cb_MainPSS); + break; + } +} + +static void Cb_HandleBoxOptions(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + PrintStorageActionText(PC_TEXT_WHAT_YOU_DO); + AddMenu(); + sPSSData->state++; + break; + case 1: + if (sub_80D00A8()) + return; + sPSSData->state++; + case 2: + switch (sub_80D00AC()) + { + case -1: + case 0: + sub_80CD1A8(TRUE); + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + break; + case 11: + PlaySE(SE_SELECT); + SetPSSCallback(Cb_NameBox); + break; + case 10: + PlaySE(SE_SELECT); + ClearBottomWindow(); + SetPSSCallback(Cb_HandleWallpapers); + break; + case 9: + PlaySE(SE_SELECT); + ClearBottomWindow(); + SetPSSCallback(Cb_JumpBox); + break; + } + break; + } +} + +static void Cb_HandleWallpapers(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + AddWallpaperSetsMenu(); + PrintStorageActionText(PC_TEXT_PICK_A_THEME); + sPSSData->state++; + break; + case 1: + if (!sub_80D00A8()) + sPSSData->state++; + break; + case 2: + sPSSData->wallpaperSetId = sub_80D00AC(); + switch (sPSSData->wallpaperSetId) + { + case -1: + sub_80CD1A8(TRUE); + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + break; + case 18 ... 21: + PlaySE(SE_SELECT); + sub_80D013C(); + sPSSData->wallpaperSetId -= 18; + sPSSData->state++; + break; + // New wallpaper from Walda. + case 22: + PlaySE(SE_SELECT); + sPSSData->wallpaperId = 16; + sub_80D013C(); + ClearBottomWindow(); + sPSSData->state = 6; + break; + } + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + { + AddWallpapersMenu(sPSSData->wallpaperSetId); + PrintStorageActionText(PC_TEXT_PICK_A_WALLPAPER); + sPSSData->state++; + } + break; + case 4: + sPSSData->wallpaperId = sub_80D00AC(); + switch (sPSSData->wallpaperId) + { + case -2: + break; + case -1: + ClearBottomWindow(); + sPSSData->state = 0; + break; + default: + PlaySE(SE_SELECT); + ClearBottomWindow(); + sPSSData->wallpaperId -= 23; + SetWallpaperForCurrentBox(sPSSData->wallpaperId); + sPSSData->state++; + break; + } + break; + case 5: + if (!DoWallpaperGfxChange()) + { + sub_80CD1A8(TRUE); + SetPSSCallback(Cb_MainPSS); + } + break; + case 6: + if (!IsDma3ManagerBusyWithBgCopy()) + { + SetWallpaperForCurrentBox(sPSSData->wallpaperId); + sPSSData->state = 5; + } + break; + } +} + +static void Cb_JumpBox(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + PrintStorageActionText(PC_TEXT_JUMP_TO_WHICH_BOX); + sub_80C77E8(&sPSSData->field_1E5C, TAG_TILE_A, TAG_PAL_DAC7, 3, FALSE); + sub_80C78D4(StorageGetCurrentBox()); + sPSSData->state++; + break; + case 1: + sPSSData->newCurrBoxId = HandleBoxChooseSelectionInput(); + switch (sPSSData->newCurrBoxId) + { + case 200: + break; + default: + ClearBottomWindow(); + sub_80C78E4(); + sub_80C7890(); + if (sPSSData->newCurrBoxId == 201 || sPSSData->newCurrBoxId == StorageGetCurrentBox()) + { + sub_80CD1A8(TRUE); + SetPSSCallback(Cb_MainPSS); + } + else + { + sPSSData->state++; + } + break; + } + break; + case 2: + SetUpScrollToBox(sPSSData->newCurrBoxId); + sPSSData->state++; + break; + case 3: + if (!ScrollToBox()) + { + SetCurrentBox(sPSSData->newCurrBoxId); + SetPSSCallback(Cb_MainPSS); + } + break; + } +} + +static void Cb_NameBox(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + sub_80CE760(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sPSSData->state++; + break; + case 1: + if (!UpdatePaletteFade()) + { + sWhichToReshow = 1; + sPSSData->screenChangeType = SCREEN_CHANGE_NAME_BOX; + SetPSSCallback(Cb_ChangeScreen); + } + break; + } +} + +static void Cb_ShowMonSummary(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + sub_80CE7E8(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sPSSData->state++; + break; + case 1: + if (!UpdatePaletteFade()) + { + sWhichToReshow = 0; + sPSSData->screenChangeType = SCREEN_CHANGE_SUMMARY_SCREEN; + SetPSSCallback(Cb_ChangeScreen); + } + break; + } +} + +static void Cb_GiveItemFromBag(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sPSSData->state++; + break; + case 1: + if (!UpdatePaletteFade()) + { + sWhichToReshow = 2; + sPSSData->screenChangeType = SCREEN_CHANGE_ITEM_FROM_BAG; + SetPSSCallback(Cb_ChangeScreen); + } + break; + } +} + +static void Cb_OnCloseBoxPressed(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + if (IsMonBeingMoved()) + { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_HOLDING_POKE); + sPSSData->state = 1; + } + else if (IsActiveItemMoving()) + { + SetPSSCallback(Cb_CloseBoxWhileHoldingItem); + } + else + { + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_EXIT_BOX); + ShowYesNoWindow(0); + sPSSData->state = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + } + break; + case 2: + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case MENU_B_PRESSED: + case 1: + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + break; + case 0: + PlaySE(SE_PC_OFF); + ClearBottomWindow(); + sPSSData->state++; + break; + } + break; + case 3: + sub_80F9BF4(0x14, 0, 1); + sPSSData->state++; + break; + case 4: + if (!sub_80F9C30()) + { + sub_80CABE0(); + gPlayerPartyCount = CalculatePlayerPartyCount(); + sPSSData->screenChangeType = SCREEN_CHANGE_EXIT_BOX; + SetPSSCallback(Cb_ChangeScreen); + } + break; + } +} + +static void Cb_OnBPressed(u8 taskId) +{ + switch (sPSSData->state) + { + case 0: + if (IsMonBeingMoved()) + { + PlaySE(SE_HAZURE); + PrintStorageActionText(PC_TEXT_HOLDING_POKE); + sPSSData->state = 1; + } + else if (IsActiveItemMoving()) + { + SetPSSCallback(Cb_CloseBoxWhileHoldingItem); + } + else + { + PlaySE(SE_SELECT); + PrintStorageActionText(PC_TEXT_CONTINUE_BOX); + ShowYesNoWindow(0); + sPSSData->state = 2; + } + break; + case 1: + if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY)) + { + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + } + break; + case 2: + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case 0: + ClearBottomWindow(); + SetPSSCallback(Cb_MainPSS); + break; + case 1: + case MENU_B_PRESSED: + PlaySE(SE_PC_OFF); + ClearBottomWindow(); + sPSSData->state++; + break; + } + break; + case 3: + sub_80F9BF4(0x14, 0, 0); + sPSSData->state++; + break; + case 4: + if (!sub_80F9C30()) + { + sub_80CABE0(); + gPlayerPartyCount = CalculatePlayerPartyCount(); + sPSSData->screenChangeType = SCREEN_CHANGE_EXIT_BOX; + SetPSSCallback(Cb_ChangeScreen); + } + break; + } +} + +static void Cb_ChangeScreen(u8 taskId) +{ + struct BoxPokemon *boxMons; + u8 mode, monIndex, maxMonIndex; + u8 screenChangeType = sPSSData->screenChangeType; + + if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS && IsActiveItemMoving() == TRUE) + gUnknown_02039D12 = GetMovingItem(); + else + gUnknown_02039D12 = 0; + + switch (screenChangeType) + { + case SCREEN_CHANGE_EXIT_BOX: + default: + FreePSSData(); + SetMainCallback2(Cb2_ExitPSS); + break; + case SCREEN_CHANGE_SUMMARY_SCREEN: + boxMons = sPSSData->field_218C.box; + monIndex = sPSSData->field_2187; + maxMonIndex = sPSSData->field_2186; + mode = sPSSData->field_2188; + FreePSSData(); + if (mode == PSS_MODE_NORMAL && boxMons == &gUnknown_02039D14.box) + ShowPokemonSummaryScreenSet40EF(mode, boxMons, monIndex, maxMonIndex, Cb2_ReturnToPSS); + else + ShowPokemonSummaryScreen(mode, boxMons, monIndex, maxMonIndex, Cb2_ReturnToPSS); + break; + case SCREEN_CHANGE_NAME_BOX: + FreePSSData(); + DoNamingScreen(NAMING_SCREEN_BOX, GetBoxNamePtr(StorageGetCurrentBox()), 0, 0, 0, Cb2_ReturnToPSS); + break; + case SCREEN_CHANGE_ITEM_FROM_BAG: + FreePSSData(); + GoToBagMenu(11, 0, Cb2_ReturnToPSS); + break; + } + + DestroyTask(taskId); +} + +static void GiveChosenBagItem(void) +{ + u16 item = gSpecialVar_ItemId; + + if (item != 0) + { + u8 id = GetBoxCursorPosition(); + + if (sInPartyMenu) + SetMonData(&gPlayerParty[id], MON_DATA_HELD_ITEM, &item); + else + SetCurrentBoxMonData(id, MON_DATA_HELD_ITEM, &item); + + RemoveBagItem(item, 1); + } +} + +static void FreePSSData(void) +{ + sub_80D25F0(); + sub_80D01B8(); + FREE_AND_SET_NULL(sPSSData); + FreeAllWindowBuffers(); +} + +static void SetScrollingBackground(void) +{ + SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31)); + DecompressAndLoadBgGfxUsingHeap(3, gPokemonStorageScrollingBGTileset, 0, 0, 0); + LZ77UnCompVram(gPokemonStorageScrollingBGTilemap, (void *)VRAM + 0xF800); +} + +static void ScrollBackground(void) +{ + ChangeBgX(3, 128, 1); + ChangeBgY(3, 128, 2); +} + +static void LoadPSSMenuGfx(void) +{ + InitBgsFromTemplates(0, gUnknown_08572734, ARRAY_COUNT(gUnknown_08572734)); + DecompressAndLoadBgGfxUsingHeap(1, gPSSMenu_Gfx, 0, 0, 0); + LZ77UnCompWram(gUnknown_085722A0, sPSSData->field_5AC4); + SetBgTilemapBuffer(1, sPSSData->field_5AC4); + ShowBg(1); + schedule_bg_copy_tilemap_to_vram(1); +} + +static bool8 InitPSSWindows(void) +{ + if (!InitWindows(gUnknown_08572714)) + { + return FALSE; + } + else + { + DeactivateAllTextPrinters(); + return TRUE; + } +} + +static void LoadWaveformSpritePalette(void) +{ + LoadSpritePalette(&gWaveformSpritePalette); +} + +static void sub_80CA0D8(void) +{ + LoadPalette(gUnknown_085723DC, 0, 0x20); + LoadPalette(gUnknown_085723FC, 0x20, 0x20); + LoadPalette(gUnknown_085726F4, 0xF0, 0x20); + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + LoadPalette(gUnknown_0857241C, 0x30, 0x20); + else + LoadPalette(gUnknown_0857243C, 0x30, 0x20); + + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_16COLOR | BGCNT_SCREENBASE(30)); + LoadCursorMonSprite(); + sub_80CA154(); + sub_80CA1C4(); + RefreshCursorMonData(); +} + +static void sub_80CA154(void) +{ + sPSSData->field_D94 = sub_811FFB4(TAG_TILE_10, TAG_PAL_DAC8, NULL); + sPSSData->field_D94->oam.priority = 1; + sPSSData->field_D94->subpriority = 1; + sPSSData->field_D94->pos1.x = 40; + sPSSData->field_D94->pos1.y = 150; + sPSSData->field_DA0 = (void*) OBJ_VRAM0 + 32 * GetSpriteTileStartByTag(TAG_TILE_10); +} + +static void sub_80CA1C4(void) +{ + u16 i; + struct SpriteSheet sheet = gWaveformSpriteSheet; + + LoadSpriteSheet(&sheet); + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&sSpriteTemplate_Waveform, i * 63 + 8, 9, 2); + sPSSData->field_D98[i] = &gSprites[spriteId]; + } +} + +static void RefreshCursorMonData(void) +{ + LoadCursorMonGfx(sPSSData->cursorMonSpecies, sPSSData->cursorMonPersonality); + PrintCursorMonInfo(); + sub_80CA65C(); + schedule_bg_copy_tilemap_to_vram(0); +} + +static void BoxSetMosaic(void) +{ + RefreshCursorMonData(); + if (sPSSData->cursorMonSprite) + { + sPSSData->cursorMonSprite->oam.mosaic = TRUE; + sPSSData->cursorMonSprite->data[0] = 10; + sPSSData->cursorMonSprite->data[1] = 1; + sPSSData->cursorMonSprite->callback = sub_80CA2D0; + SetGpuReg(REG_OFFSET_MOSAIC, (sPSSData->cursorMonSprite->data[0] << 12) | (sPSSData->cursorMonSprite->data[0] << 8)); + } +} + +static u8 sub_80CA2B8(void) +{ + return sPSSData->cursorMonSprite->oam.mosaic; +} + +static void sub_80CA2D0(struct Sprite *sprite) +{ + sprite->data[0] -= sprite->data[1]; + if (sprite->data[0] < 0) + sprite->data[0] = 0; + SetGpuReg(REG_OFFSET_MOSAIC, (sprite->data[0] << 12) | (sprite->data[0] << 8)); + if (sprite->data[0] == 0) + { + sprite->oam.mosaic = FALSE; + sprite->callback = SpriteCallbackDummy; + } +} + +static void LoadCursorMonSprite(void) +{ + u16 i; + u16 tileStart; + u8 palSlot; + u8 spriteId; + struct SpriteSheet sheet = {sPSSData->field_22C4, 0x800, TAG_TILE_2}; + struct SpritePalette palette = {sPSSData->field_2244, TAG_PAL_DAC6}; + struct SpriteTemplate template = sSpriteTemplate_CursorMon; + + for (i = 0; i < 0x800; i++) + sPSSData->field_22C4[i] = 0; + for (i = 0; i < 0x10; i++) + sPSSData->field_2244[i] = 0; + + sPSSData->cursorMonSprite = NULL; + + do + { + tileStart = LoadSpriteSheet(&sheet); + if (tileStart == 0) + break; + + palSlot = LoadSpritePalette(&palette); + if (palSlot == 0xFF) + break; + + spriteId = CreateSprite(&template, 40, 48, 0); + if (spriteId == MAX_SPRITES) + break; + + sPSSData->cursorMonSprite = &gSprites[spriteId]; + sPSSData->field_223A = palSlot * 16 + 0x100; + sPSSData->field_223C = (void*) OBJ_VRAM0 + tileStart * 32; + } while (0); + + if (sPSSData->cursorMonSprite == NULL) + { + FreeSpriteTilesByTag(TAG_TILE_2); + FreeSpritePaletteByTag(TAG_PAL_DAC6); + } +} + +static void LoadCursorMonGfx(u16 species, u32 pid) +{ + if (sPSSData->cursorMonSprite == NULL) + return; + + if (species != SPECIES_NONE) + { + LoadSpecialPokePic(&gMonFrontPicTable[species], sPSSData->field_22C4, species, pid, TRUE); + LZ77UnCompWram(sPSSData->cursorMonPalette, sPSSData->field_2244); + CpuCopy32(sPSSData->field_22C4, sPSSData->field_223C, 0x800); + LoadPalette(sPSSData->field_2244, sPSSData->field_223A, 0x20); + sPSSData->cursorMonSprite->invisible = FALSE; + } + else + { + sPSSData->cursorMonSprite->invisible = TRUE; + } +} + +static void PrintCursorMonInfo(void) +{ + FillWindowPixelBuffer(0, 0x11); + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + { + AddTextPrinterParameterized(0, 1, sPSSData->cursorMonNickText, 6, 0, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 2, sPSSData->cursorMonSpeciesName, 6, 15, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 2, sPSSData->cursorMonGenderLvlText, 10, 29, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 0, sPSSData->cursorMonItemName, 6, 43, TEXT_SPEED_FF, NULL); + } + else + { + AddTextPrinterParameterized(0, 0, sPSSData->cursorMonItemName, 6, 0, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 1, sPSSData->cursorMonNickText, 6, 13, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 2, sPSSData->cursorMonSpeciesName, 6, 28, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 2, sPSSData->cursorMonGenderLvlText, 10, 42, TEXT_SPEED_FF, NULL); + } + + CopyWindowToVram(0, 2); + if (sPSSData->cursorMonSpecies != SPECIES_NONE) + { + sub_8120084(sPSSData->cursorMonMarkings, sPSSData->field_DA0); + sPSSData->field_D94->invisible = FALSE; + } + else + { + sPSSData->field_D94->invisible = TRUE; + } +} + +static void sub_80CA65C(void) +{ + u16 i; + + if (sPSSData->cursorMonSpecies != SPECIES_NONE) + { + sub_80D27AC(0, 0, 0, 8, 2); + for (i = 0; i < 2; i++) + StartSpriteAnimIfDifferent(sPSSData->field_D98[i], i * 2 + 1); + } + else + { + sub_80D27AC(0, 0, 2, 8, 2); + for (i = 0; i < 2; i++) + StartSpriteAnim(sPSSData->field_D98[i], i * 2); + } + + sub_80D2918(0); + schedule_bg_copy_tilemap_to_vram(1); +} + +static void sub_80CA704(void) +{ + LZ77UnCompWram(gUnknown_08DD36C8, sPSSData->field_B0); + LoadPalette(gPSSMenu_Pal, 0x10, 0x20); + sub_80D2644(1, 1, sPSSData->field_B0, 12, 22); + sub_80D2644(2, 1, gUnknown_0857245C, 9, 4); + sub_80D2770(1, 10, 0); + sub_80D2770(2, 21, 0); + sub_80CAA74(); + if (sInPartyMenu) + { + sub_80CA984(TRUE); + CreatePartyMonsSprites(TRUE); + sub_80D2918(2); + sub_80D2918(1); + } + else + { + sub_80D27AC(1, 0, 20, 12, 2); + sub_80CA984(TRUE); + sub_80D2918(1); + sub_80D2918(2); + } + + schedule_bg_copy_tilemap_to_vram(1); + sPSSData->unk_02C7 = 0; +} + +static void SetUpShowPartyMenu(void) +{ + sPSSData->field_2C0 = 20; + sPSSData->field_2C2 = 2; + sPSSData->field_2C5 = 0; + CreatePartyMonsSprites(FALSE); +} + +static bool8 ShowPartyMenu(void) +{ + if (sPSSData->field_2C5 == 20) + return FALSE; + + sPSSData->field_2C0--; + sPSSData->field_2C2++; + sub_80D27F4(1, 3, 1); + sub_80D2918(1); + schedule_bg_copy_tilemap_to_vram(1); + sub_80CBAF0(8); + if (++sPSSData->field_2C5 == 20) + { + sInPartyMenu = TRUE; + return FALSE; + } + else + { + return TRUE; + } +} + +static void SetUpHidePartyMenu(void) +{ + sPSSData->field_2C0 = 0; + sPSSData->field_2C2 = 22; + sPSSData->field_2C5 = 0; + if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + sub_80D11CC(); +} + +static bool8 HidePartyMenu(void) +{ + if (sPSSData->field_2C5 != 20) + { + sPSSData->field_2C0++; + sPSSData->field_2C2--; + sub_80D27F4(1, 3, -1); + sub_80D2918(1); + FillBgTilemapBufferRect_Palette0(1, 0x100, 10, sPSSData->field_2C2, 12, 1); + sub_80CBAF0(-8); + if (++sPSSData->field_2C5 != 20) + { + schedule_bg_copy_tilemap_to_vram(1); + return TRUE; + } + else + { + sInPartyMenu = FALSE; + DestroyAllPartyMonIcons(); + CompactPartySlots(); + sub_80D27AC(2, 0, 0, 9, 2); + sub_80D2918(2); + schedule_bg_copy_tilemap_to_vram(1); + return FALSE; + } + } + + return FALSE; +} + +static void sub_80CA984(bool8 arg0) +{ + if (arg0) + sub_80D27AC(2, 0, 0, 9, 2); + else + sub_80D27AC(2, 0, 2, 9, 2); + + sub_80D2918(2); + schedule_bg_copy_tilemap_to_vram(1); +} + +static void sub_80CA9C0(void) +{ + sPSSData->unk_02C7 = 1; + sPSSData->unk_02C8 = 30; + sPSSData->unk_02C9 = TRUE; +} + +static void sub_80CA9EC(void) +{ + if (sPSSData->unk_02C7) + { + sPSSData->unk_02C7 = 0; + sub_80CA984(TRUE); + } +} + +static void sub_80CAA14(void) +{ + if (sPSSData->unk_02C7 && ++sPSSData->unk_02C8 > 30) + { + sPSSData->unk_02C8 = 0; + sPSSData->unk_02C9 = (sPSSData->unk_02C9 == FALSE); + sub_80CA984(sPSSData->unk_02C9); + } +} + +static void sub_80CAA74(void) +{ + u8 i; + + for (i = 1; i < PARTY_SIZE; i++) + { + s32 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES); + sub_80CAAA8(i, (species != SPECIES_NONE)); + } +} + +static void sub_80CAAA8(u8 arg0, bool8 isPartyMon) +{ + u16 i, j, index; + const u16 *data; + + if (isPartyMon) + data = gUnknown_085724A4; + else + data = gUnknown_085724BC; + + index = 3 * (3 * (arg0 - 1) + 1); + index *= 4; + index += 7; + for (i = 0; i < 3; i++) + { + for (j = 0; j < 4; j++) + { + sPSSData->field_B0[index + j] = data[j]; + } + data += 4; + index += 12; + } +} + +static void sub_80CAB20(void) +{ + sub_80CAA74(); + sub_80D27AC(1, 0, 0, 12, 22); + sub_80D2918(1); + schedule_bg_copy_tilemap_to_vram(1); +} + +static void SetUpDoShowPartyMenu(void) +{ + sPSSData->showPartyMenuState = 0; + PlaySE(SE_WIN_OPEN); + SetUpShowPartyMenu(); +} + +static bool8 DoShowPartyMenu(void) +{ + switch (sPSSData->showPartyMenuState) + { + case 0: + if (!ShowPartyMenu()) + { + sub_80CDBA0(); + sPSSData->showPartyMenuState++; + } + break; + case 1: + if (!sub_80CD554()) + { + if (sPSSData->setMosaic) + BoxSetMosaic(); + sPSSData->showPartyMenuState++; + } + break; + case 2: + return FALSE; + } + return TRUE; +} + +static void sub_80CABE0(void) +{ + if (gUnknown_02039D10 != StorageGetCurrentBox()) + { + FlagClear(FLAG_SYS_STORAGE_UNKNOWN_FLAG); + VarSet(VAR_STORAGE_UNKNOWN, StorageGetCurrentBox()); + } +} + +static void sub_80CAC1C(void) +{ + SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(29)); + LoadUserWindowBorderGfx(1, 2, 208); + FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17); + CopyBgTilemapBufferToVram(0); +} + +static void PrintStorageActionText(u8 id) +{ + u8 *txtPtr; + + DynamicPlaceholderTextUtil_Reset(); + switch (gPCStorageActionTexts[id].format) + { + case PC_TEXT_FMT_NORMAL: + break; + case PC_TEXT_FMT_MON_NAME_1: + case PC_TEXT_FMT_MON_NAME_2: + case PC_TEXT_FMT_MON_NAME_3: + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPSSData->cursorMonNick); + break; + case PC_TEXT_FMT_MON_NAME_4: + case PC_TEXT_FMT_MON_NAME_5: + case PC_TEXT_FMT_MON_NAME_6: + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPSSData->field_21E0); + break; + case PC_TEXT_FMT_ITEM_NAME: + if (IsActiveItemMoving()) + txtPtr = StringCopy(sPSSData->itemName, GetMovingItemName()); + else + txtPtr = StringCopy(sPSSData->itemName, sPSSData->cursorMonItemName); + + while (*(txtPtr - 1) == CHAR_SPACE) + txtPtr--; + + *txtPtr = EOS; + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPSSData->itemName); + break; + } + + DynamicPlaceholderTextUtil_ExpandPlaceholders(sPSSData->field_2190, gPCStorageActionTexts[id].text); + FillWindowPixelBuffer(1, 0x11); + AddTextPrinterParameterized(1, 1, sPSSData->field_2190, 0, 1, TEXT_SPEED_FF, NULL); + sub_8098858(1, 2, 14); + PutWindowTilemap(1); + CopyWindowToVram(1, 2); + schedule_bg_copy_tilemap_to_vram(0); +} + +static void ShowYesNoWindow(s8 cursorPos) +{ + CreateYesNoMenu(&sYesNoWindowTemplate, 11, 14, 0); + Menu_MoveCursorNoWrapAround(cursorPos); +} + +static void ClearBottomWindow(void) +{ + sub_8198070(1, FALSE); + schedule_bg_copy_tilemap_to_vram(0); +} + +static void AddWallpaperSetsMenu(void) +{ + InitMenu(); + SetMenuText(18); + SetMenuText(19); + SetMenuText(20); + SetMenuText(21); + if (IsWaldaWallpaperUnlocked()) + SetMenuText(22); + AddMenu(); +} + +static void AddWallpapersMenu(u8 wallpaperSet) +{ + InitMenu(); + switch (wallpaperSet) + { + case 0: + SetMenuText(23); + SetMenuText(24); + SetMenuText(25); + SetMenuText(26); + break; + case 1: + SetMenuText(27); + SetMenuText(28); + SetMenuText(29); + SetMenuText(30); + break; + case 2: + SetMenuText(31); + SetMenuText(32); + SetMenuText(33); + SetMenuText(34); + break; + case 3: + SetMenuText(35); + SetMenuText(36); + SetMenuText(37); + SetMenuText(38); + break; + } + AddMenu(); +} + +static u8 GetCurrentBoxOption(void) +{ + return sCurrentBoxOption; +} + +static void sub_80CAEAC(void) +{ + if (!IsCursorOnBox()) + { + if (sInPartyMenu) + sub_80D0D8C(CURSOR_AREA_IN_PARTY, GetBoxCursorPosition()); + else + sub_80D0D8C(CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); + } + + if (gUnknown_02039D12 != 0) + { + sub_80D0F38(gUnknown_02039D12); + sub_80CFE54(3); + } +} + +static void sub_80CAF04(void) +{ + u16 i; + + LoadMonIconPalettes(); + for (i = 0; i < 40; i++) + sPSSData->field_B08[i] = 0; + for (i = 0; i < 40; i++) + sPSSData->field_B58[i] = 0; + for (i = 0; i < PARTY_SIZE; i++) + sPSSData->partySprites[i] = NULL; + for (i = 0; i < IN_BOX_COUNT; i++) + sPSSData->boxMonsSprites[i] = NULL; + + sPSSData->movingMonSprite = NULL; + sPSSData->field_78C = 0; +} + +static u8 sub_80CAFAC(void) +{ + return (IsCursorInBox() ? 2 : 1); +} + +static void CreateMovingMonIcon(void) +{ + u32 personality = GetMonData(&sPSSData->movingMon, MON_DATA_PERSONALITY); + u16 species = GetMonData(&sPSSData->movingMon, MON_DATA_SPECIES2); + u8 priority = sub_80CAFAC(); + + sPSSData->movingMonSprite = CreateMonIconSprite(species, personality, 0, 0, priority, 7); + sPSSData->movingMonSprite->callback = sub_80CC100; +} + +static void sub_80CB028(u8 boxId) +{ + u8 boxPosition; + u16 i, j, count; + u16 species; + u32 personality; + + count = 0; + boxPosition = 0; + for (i = 0; i < IN_BOX_COLUMNS; i++) + { + for (j = 0; j < IN_BOX_ROWS; j++) + { + species = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + { + personality = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY); + sPSSData->boxMonsSprites[count] = CreateMonIconSprite(species, personality, 8 * (3 * j) + 100, 8 * (3 * i) + 44, 2, 19 - j); + } + else + { + sPSSData->boxMonsSprites[count] = NULL; + } + boxPosition++; + count++; + } + } + + if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + { + for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++) + { + if (GetBoxMonDataAt(boxId, boxPosition, MON_DATA_HELD_ITEM) == 0) + sPSSData->boxMonsSprites[boxPosition]->oam.objMode = 1; + } + } +} + +static void sub_80CB140(u8 boxPosition) +{ + u16 species = GetCurrentBoxMonData(boxPosition, MON_DATA_SPECIES2); + + if (species != SPECIES_NONE) + { + s16 x = 8 * (3 * (boxPosition % IN_BOX_ROWS)) + 100; + s16 y = 8 * (3 * (boxPosition / IN_BOX_ROWS)) + 44; + u32 personality = GetCurrentBoxMonData(boxPosition, MON_DATA_PERSONALITY); + + sPSSData->boxMonsSprites[boxPosition] = CreateMonIconSprite(species, personality, x, y, 2, 19 - (boxPosition % IN_BOX_ROWS)); + if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + sPSSData->boxMonsSprites[boxPosition]->oam.objMode = 1; + } +} + +static void sub_80CB1F0(s16 arg0) +{ + u16 i; + + for (i = 0; i < IN_BOX_COUNT; i++) + { + if (sPSSData->boxMonsSprites[i] != NULL) + { + sPSSData->boxMonsSprites[i]->data[2] = arg0; + sPSSData->boxMonsSprites[i]->data[4] = 1; + sPSSData->boxMonsSprites[i]->callback = sub_80CB278; + } + } +} + +static void sub_80CB234(struct Sprite *sprite) +{ + if (sprite->data[1] != 0) + { + sprite->data[1]--; + sprite->pos1.x += sprite->data[2]; + } + else + { + sPSSData->field_C66--; + sprite->pos1.x = sprite->data[3]; + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_80CB278(struct Sprite *sprite) +{ + if (sprite->data[4] != 0) + { + sprite->data[4]--; + } + else + { + sprite->pos1.x += sprite->data[2]; + sprite->data[5] = sprite->pos1.x + sprite->pos2.x; + if (sprite->data[5] <= 68 || sprite->data[5] >= 252) + sprite->callback = SpriteCallbackDummy; + } +} + +static void DestroyAllIconsInRow(u8 row) +{ + u16 column; + u8 boxPosition = row; + + for (column = 0; column < IN_BOX_COLUMNS; column++) + { + if (sPSSData->boxMonsSprites[boxPosition] != NULL) + { + DestroyBoxMonIcon(sPSSData->boxMonsSprites[boxPosition]); + sPSSData->boxMonsSprites[boxPosition] = NULL; + } + boxPosition += IN_BOX_ROWS; + } +} + +static u8 sub_80CB2F8(u8 row, u16 times, s16 xDelta) +{ + s32 i; + u16 y = 44; + s16 xDest = 8 * (3 * row) + 100; + u16 x = xDest - ((times + 1) * xDelta); + u8 subpriority = 19 - row; + u8 count = 0; + u8 boxPosition = row; + + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + { + for (i = 0; i < IN_BOX_COLUMNS; i++) + { + if (sPSSData->boxSpecies[boxPosition] != SPECIES_NONE) + { + sPSSData->boxMonsSprites[boxPosition] = CreateMonIconSprite(sPSSData->boxSpecies[boxPosition], + sPSSData->boxPersonalities[boxPosition], + x, y, 2, subpriority); + if (sPSSData->boxMonsSprites[boxPosition] != NULL) + { + sPSSData->boxMonsSprites[boxPosition]->data[1] = times; + sPSSData->boxMonsSprites[boxPosition]->data[2] = xDelta; + sPSSData->boxMonsSprites[boxPosition]->data[3] = xDest; + sPSSData->boxMonsSprites[boxPosition]->callback = sub_80CB234; + count++; + } + } + boxPosition += IN_BOX_ROWS; + y += 24; + } + } + else + { + for (i = 0; i < IN_BOX_COLUMNS; i++) + { + if (sPSSData->boxSpecies[boxPosition] != SPECIES_NONE) + { + sPSSData->boxMonsSprites[boxPosition] = CreateMonIconSprite(sPSSData->boxSpecies[boxPosition], + sPSSData->boxPersonalities[boxPosition], + x, y, 2, subpriority); + if (sPSSData->boxMonsSprites[boxPosition] != NULL) + { + sPSSData->boxMonsSprites[boxPosition]->data[1] = times; + sPSSData->boxMonsSprites[boxPosition]->data[2] = xDelta; + sPSSData->boxMonsSprites[boxPosition]->data[3] = xDest; + sPSSData->boxMonsSprites[boxPosition]->callback = sub_80CB234; + if (GetBoxMonDataAt(sPSSData->field_C5C, boxPosition, MON_DATA_HELD_ITEM) == 0) + sPSSData->boxMonsSprites[boxPosition]->oam.objMode = 1; + count++; + } + } + boxPosition += IN_BOX_ROWS; + y += 24; + } + } + + return count; +} + +static void sub_80CB4CC(u8 boxId, s8 direction) +{ + sPSSData->field_C6A = 0; + sPSSData->field_C6B = boxId; + sPSSData->field_C69 = direction; + sPSSData->field_C60 = 32; + sPSSData->field_C64 = -(6 * direction); + sPSSData->field_C66 = 0; + SetBoxSpeciesAndPersonalities(boxId); + if (direction > 0) + sPSSData->field_C68 = 0; + else + sPSSData->field_C68 = IN_BOX_ROWS - 1; + + sPSSData->field_C62 = (24 * sPSSData->field_C68) + 100; + sub_80CB1F0(sPSSData->field_C64); +} + +static bool8 sub_80CB584(void) +{ + if (sPSSData->field_C60 != 0) + sPSSData->field_C60--; + + switch (sPSSData->field_C6A) + { + case 0: + sPSSData->field_C62 += sPSSData->field_C64; + if (sPSSData->field_C62 <= 64 || sPSSData->field_C62 >= 252) + { + DestroyAllIconsInRow(sPSSData->field_C68); + sPSSData->field_C62 += sPSSData->field_C69 * 24; + sPSSData->field_C6A++; + } + break; + case 1: + sPSSData->field_C62 += sPSSData->field_C64; + sPSSData->field_C66 += sub_80CB2F8(sPSSData->field_C68, sPSSData->field_C60, sPSSData->field_C64); + if ((sPSSData->field_C69 > 0 && sPSSData->field_C68 == IN_BOX_ROWS - 1) + || (sPSSData->field_C69 < 0 && sPSSData->field_C68 == 0)) + { + sPSSData->field_C6A++; + } + else + { + sPSSData->field_C68 += sPSSData->field_C69; + sPSSData->field_C6A = 0; + } + break; + case 2: + if (sPSSData->field_C66 == 0) + { + sPSSData->field_C60++; + return FALSE; + } + break; + default: + return FALSE; + } + + return TRUE; +} + +static void SetBoxSpeciesAndPersonalities(u8 boxId) +{ + s32 i, j, boxPosition; + + boxPosition = 0; + for (i = 0; i < IN_BOX_COLUMNS; i++) + { + for (j = 0; j < IN_BOX_ROWS; j++) + { + sPSSData->boxSpecies[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES2); + if (sPSSData->boxSpecies[boxPosition] != SPECIES_NONE) + sPSSData->boxPersonalities[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY); + boxPosition++; + } + } + + sPSSData->field_C5C = boxId; +} + +static void DestroyBoxMonIconAtPosition(u8 boxPosition) +{ + if (sPSSData->boxMonsSprites[boxPosition] != NULL) + { + DestroyBoxMonIcon(sPSSData->boxMonsSprites[boxPosition]); + sPSSData->boxMonsSprites[boxPosition] = NULL; + } +} + +static void SetBoxMonIconObjMode(u8 boxPosition, u8 objMode) +{ + if (sPSSData->boxMonsSprites[boxPosition] != NULL) + { + sPSSData->boxMonsSprites[boxPosition]->oam.objMode = objMode; + } +} + +static void CreatePartyMonsSprites(bool8 arg0) +{ + u16 i, count; + u16 species = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES2); + u32 personality = GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY); + + sPSSData->partySprites[0] = CreateMonIconSprite(species, personality, 104, 64, 1, 12); + count = 1; + for (i = 1; i < PARTY_SIZE; i++) + { + species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); + if (species != SPECIES_NONE) + { + personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); + sPSSData->partySprites[i] = CreateMonIconSprite(species, personality, 152, 8 * (3 * (i - 1)) + 16, 1, 12); + count++; + } + else + { + sPSSData->partySprites[i] = NULL; + } + } + + if (!arg0) + { + for (i = 0; i < count; i++) + { + sPSSData->partySprites[i]->pos1.y -= 160; + sPSSData->partySprites[i]->invisible = TRUE; + } + } + + if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + { + for (i = 0; i < PARTY_SIZE; i++) + { + if (sPSSData->partySprites[i] != NULL && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == 0) + sPSSData->partySprites[i]->oam.objMode = 1; + } + } +} + +static void sub_80CB950(void) +{ + u16 i, count; + + sPSSData->field_C5E = 0; + for (i = 0, count = 0; i < PARTY_SIZE; i++) + { + if (sPSSData->partySprites[i] != NULL) + { + if (i != count) + { + sub_80CB9D0(sPSSData->partySprites[i], count); + sPSSData->partySprites[i] = NULL; + sPSSData->field_C5E++; + } + count++; + } + } +} + +static u8 sub_80CB9BC(void) +{ + return sPSSData->field_C5E; +} + +static void sub_80CB9D0(struct Sprite *sprite, u16 partyId) +{ + s16 x, y; + + sprite->data[1] = partyId; + if (partyId == 0) + x = 104, y = 64; + else + x = 152, y = 8 * (3 * (partyId - 1)) + 16; + + sprite->data[2] = (u16)(sprite->pos1.x) * 8; + sprite->data[3] = (u16)(sprite->pos1.y) * 8; + sprite->data[4] = ((x * 8) - sprite->data[2]) / 8; + sprite->data[5] = ((y * 8) - sprite->data[3]) / 8; + sprite->data[6] = 8; + sprite->callback = sub_80CBA3C; +} + +static void sub_80CBA3C(struct Sprite *sprite) +{ + if (sprite->data[6] != 0) + { + s16 x = sprite->data[2] += sprite->data[4]; + s16 y = sprite->data[3] += sprite->data[5]; + sprite->pos1.x = x / 8u; + sprite->pos1.y = y / 8u; + sprite->data[6]--; + } + else + { + if (sprite->data[1] == 0) + { + sprite->pos1.x = 104; + sprite->pos1.y = 64; + } + else + { + sprite->pos1.x = 152; + sprite->pos1.y = 8 * (3 * (sprite->data[1] - 1)) + 16; + } + sprite->callback = SpriteCallbackDummy; + sPSSData->partySprites[sprite->data[1]] = sprite; + sPSSData->field_C5E--; + } +} + +static void DestroyMovingMonIcon(void) +{ + if (sPSSData->movingMonSprite != NULL) + { + DestroyBoxMonIcon(sPSSData->movingMonSprite); + sPSSData->movingMonSprite = NULL; + } +} + +static void sub_80CBAF0(s16 yDelta) +{ + u16 i, posY; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (sPSSData->partySprites[i] != NULL) + { + sPSSData->partySprites[i]->pos1.y += yDelta; + posY = sPSSData->partySprites[i]->pos1.y + sPSSData->partySprites[i]->pos2.y + sPSSData->partySprites[i]->centerToCornerVecY; + posY += 16; + if (posY > 192) + sPSSData->partySprites[i]->invisible = TRUE; + else + sPSSData->partySprites[i]->invisible = FALSE; + } + } +} + +static void DestroyPartyMonIcon(u8 partyId) +{ + if (sPSSData->partySprites[partyId] != NULL) + { + DestroyBoxMonIcon(sPSSData->partySprites[partyId]); + sPSSData->partySprites[partyId] = NULL; + } +} + +static void DestroyAllPartyMonIcons(void) +{ + u16 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (sPSSData->partySprites[i] != NULL) + { + DestroyBoxMonIcon(sPSSData->partySprites[i]); + sPSSData->partySprites[i] = NULL; + } + } +} + +static void SetPartyMonIconObjMode(u8 partyId, u8 objMode) +{ + if (sPSSData->partySprites[partyId] != NULL) + { + sPSSData->partySprites[partyId]->oam.objMode = objMode; + } +} + +static void sub_80CBC14(u8 mode, u8 id) +{ + if (mode == MODE_PARTY) + { + sPSSData->movingMonSprite = sPSSData->partySprites[id]; + sPSSData->partySprites[id] = NULL; + } + else if (mode == MODE_BOX) + { + sPSSData->movingMonSprite = sPSSData->boxMonsSprites[id]; + sPSSData->boxMonsSprites[id] = NULL; + } + else + { + return; + } + + sPSSData->movingMonSprite->callback = sub_80CC100; + sPSSData->movingMonSprite->oam.priority = sub_80CAFAC(); + sPSSData->movingMonSprite->subpriority = 7; +} + +static void sub_80CBCAC(u8 boxId, u8 position) +{ + if (boxId == TOTAL_BOXES_COUNT) // party mon + { + sPSSData->partySprites[position] = sPSSData->movingMonSprite; + sPSSData->partySprites[position]->oam.priority = 1; + sPSSData->partySprites[position]->subpriority = 12; + } + else + { + sPSSData->boxMonsSprites[position] = sPSSData->movingMonSprite; + sPSSData->boxMonsSprites[position]->oam.priority = 2; + sPSSData->boxMonsSprites[position]->subpriority = 19 - (position % IN_BOX_ROWS); + } + sPSSData->movingMonSprite->callback = SpriteCallbackDummy; + sPSSData->movingMonSprite = NULL; +} + +static void sub_80CBD5C(u8 boxId, u8 position) +{ + if (boxId == TOTAL_BOXES_COUNT) // party mon + sPSSData->field_B00 = &sPSSData->partySprites[position]; + else + sPSSData->field_B00 = &sPSSData->boxMonsSprites[position]; + + sPSSData->movingMonSprite->callback = SpriteCallbackDummy; + sPSSData->field_C5D = 0; +} + +static bool8 sub_80CBDC4(void) +{ + if (sPSSData->field_C5D == 16) + return FALSE; + + sPSSData->field_C5D++; + if (sPSSData->field_C5D & 1) + { + (*sPSSData->field_B00)->pos1.y--; + sPSSData->movingMonSprite->pos1.y++; + } + + (*sPSSData->field_B00)->pos2.x = gSineTable[sPSSData->field_C5D * 8] / 16; + sPSSData->movingMonSprite->pos2.x = -(gSineTable[sPSSData->field_C5D * 8] / 16); + if (sPSSData->field_C5D == 8) + { + sPSSData->movingMonSprite->oam.priority = (*sPSSData->field_B00)->oam.priority; + sPSSData->movingMonSprite->subpriority = (*sPSSData->field_B00)->subpriority; + (*sPSSData->field_B00)->oam.priority = sub_80CAFAC(); + (*sPSSData->field_B00)->subpriority = 7; + } + + if (sPSSData->field_C5D == 16) + { + struct Sprite *sprite = sPSSData->movingMonSprite; + sPSSData->movingMonSprite = (*sPSSData->field_B00); + *sPSSData->field_B00 = sprite; + + sPSSData->movingMonSprite->callback = sub_80CC100; + (*sPSSData->field_B00)->callback = SpriteCallbackDummy; + } + + return TRUE; +} + +static void sub_80CBF14(u8 mode, u8 position) +{ + switch (mode) + { + case MODE_PARTY: + sPSSData->field_B04 = &sPSSData->partySprites[position]; + break; + case MODE_BOX: + sPSSData->field_B04 = &sPSSData->boxMonsSprites[position]; + break; + case MODE_2: + sPSSData->field_B04 = &sPSSData->movingMonSprite; + break; + default: + return; + } + + if (*sPSSData->field_B04 != NULL) + { + InitSpriteAffineAnim(*sPSSData->field_B04); + (*sPSSData->field_B04)->oam.affineMode = 1; + (*sPSSData->field_B04)->affineAnims = gSpriteAffineAnimTable_857291C; + StartSpriteAffineAnim(*sPSSData->field_B04, 0); + } +} + +static bool8 sub_80CBFD8(void) +{ + if (*sPSSData->field_B04 == NULL || (*sPSSData->field_B04)->invisible) + return FALSE; + + if ((*sPSSData->field_B04)->affineAnimEnded) + (*sPSSData->field_B04)->invisible = TRUE; + + return TRUE; +} + +static void sub_80CC020(void) +{ + if (*sPSSData->field_B04 != NULL) + { + FreeOamMatrix((*sPSSData->field_B04)->oam.matrixNum); + DestroyBoxMonIcon(*sPSSData->field_B04); + *sPSSData->field_B04 = NULL; + } +} + +static void sub_80CC064(void) +{ + if (*sPSSData->field_B04 != NULL) + { + (*sPSSData->field_B04)->invisible = FALSE; + StartSpriteAffineAnim(*sPSSData->field_B04, 1); + } +} + +static bool8 sub_80CC0A0(void) +{ + if (sPSSData->field_B04 == NULL) + return FALSE; + + if ((*sPSSData->field_B04)->affineAnimEnded) + sPSSData->field_B04 = NULL; + + return TRUE; +} + +static void SetMovingMonPriority(u8 priority) +{ + sPSSData->movingMonSprite->oam.priority = priority; +} + +static void sub_80CC100(struct Sprite *sprite) +{ + sprite->pos1.x = sPSSData->field_CB4->pos1.x; + sprite->pos1.y = sPSSData->field_CB4->pos1.y + sPSSData->field_CB4->pos2.y + 4; +} + +static u16 sub_80CC124(u16 species) +{ + u16 i, var; + + for (i = 0; i < 40; i++) + { + if (sPSSData->field_B58[i] == species) + break; + } + + if (i == 40) + { + for (i = 0; i < 40; i++) + { + if (sPSSData->field_B58[i] == 0) + break; + } + if (i == 40) + return 0xFFFF; + } + + sPSSData->field_B58[i] = species; + sPSSData->field_B08[i]++; + var = 16 * i; + CpuCopy32(GetMonIconTiles(species, TRUE), (void*)(OBJ_VRAM0) + var * 32, 0x200); + + return var; +} + +static void sub_80CC1E0(u16 species) +{ + u16 i; + + for (i = 0; i < 40; i++) + { + if (sPSSData->field_B58[i] == species) + { + if (--sPSSData->field_B08[i] == 0) + sPSSData->field_B58[i] = 0; + break; + } + } +} + +static struct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 oamPriority, u8 subpriority) +{ + u16 tileNum; + u8 spriteId; + struct SpriteTemplate tempalte = gUnknown_085728D4; + + species = GetIconSpecies(species, personality); + tempalte.paletteTag = 0xDAC0 + gMonIconPaletteIndices[species]; + tileNum = sub_80CC124(species); + if (tileNum == 0xFFFF) + return NULL; + + spriteId = CreateSprite(&tempalte, x, y, subpriority); + if (spriteId == MAX_SPRITES) + { + sub_80CC1E0(species); + return NULL; + } + + gSprites[spriteId].oam.tileNum = tileNum; + gSprites[spriteId].oam.priority = oamPriority; + gSprites[spriteId].data[0] = species; + return &gSprites[spriteId]; +} + +static void DestroyBoxMonIcon(struct Sprite *sprite) +{ + sub_80CC1E0(sprite->data[0]); + DestroySprite(sprite); +} + +static void sub_80CC32C(u8 boxId) +{ + u8 taskId = CreateTask(sub_80CC370, 2); + + gTasks[taskId].data[2] = boxId; +} + +static bool8 sub_80CC35C(void) +{ + return FuncIsActiveTask(sub_80CC370); +} + +static void sub_80CC370(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + sPSSData->field_2D2 = 0; + sPSSData->bg2_X = 0; + task->data[1] = RequestDma3Fill(0, sPSSData->field_4AC4, 0x1000, 1); + break; + case 1: + if (CheckForSpaceForDma3Request(task->data[1]) == -1) + return; + + SetBgTilemapBuffer(2, sPSSData->field_4AC4); + ShowBg(2); + break; + case 2: + LoadWallpaperGfx(task->data[2], 0); + break; + case 3: + if (!WaitForWallpaperGfxLoad()) + return; + + sub_80CCB50(task->data[2]); + sub_80CD02C(); + sub_80CB028(task->data[2]); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(27) | BGCNT_TXT512x256); + break; + case 4: + DestroyTask(taskId); + break; + default: + task->data[0] = 0; + return; + } + + task->data[0]++; +} + +static void SetUpScrollToBox(u8 boxId) +{ + s8 direction = sub_80CC644(boxId); + + sPSSData->field_2CE = (direction > 0) ? 6 : -6; + sPSSData->field_2D3 = (direction > 0) ? 1 : 2; + sPSSData->field_2D0 = 32; + sPSSData->field_2D4 = boxId; + sPSSData->field_2D6 = (direction <= 0) ? 5 : 0; + sPSSData->field_2D8 = direction; + sPSSData->field_2DA = (direction > 0) ? 264 : 56; + sPSSData->field_2DC = (direction <= 0) ? 5 : 0; + sPSSData->field_2DE = 0; + sPSSData->field_2E0 = 2; + sPSSData->field_A64 = boxId; + sPSSData->field_A65 = direction; + sPSSData->field_A63 = 0; +} + +static bool8 ScrollToBox(void) +{ + bool8 var; + + switch (sPSSData->field_A63) + { + case 0: + LoadWallpaperGfx(sPSSData->field_A64, sPSSData->field_A65); + sPSSData->field_A63++; + case 1: + if (!WaitForWallpaperGfxLoad()) + return TRUE; + + sub_80CB4CC(sPSSData->field_A64, sPSSData->field_A65); + sub_80CCCFC(sPSSData->field_A64, sPSSData->field_A65); + sub_80CD0B8(sPSSData->field_A65); + break; + case 2: + var = sub_80CB584(); + if (sPSSData->field_2D0 != 0) + { + sPSSData->bg2_X += sPSSData->field_2CE; + if (--sPSSData->field_2D0 != 0) + return TRUE; + sub_80CCEE0(); + sub_80CD158(); + } + return var; + } + + sPSSData->field_A63++; + return TRUE; +} + +static s8 sub_80CC644(u8 boxId) +{ + u8 i; + u8 currentBox = StorageGetCurrentBox(); + + for (i = 0; currentBox != boxId; i++) + { + currentBox++; + if (currentBox >= TOTAL_BOXES_COUNT) + currentBox = 0; + } + + return (i < TOTAL_BOXES_COUNT / 2) ? 1 : -1; +} + +static void SetWallpaperForCurrentBox(u8 wallpaperId) +{ + u8 boxId = StorageGetCurrentBox(); + SetBoxWallpaper(boxId, wallpaperId); + sPSSData->wallpaperChangeState = 0; +} + +static bool8 DoWallpaperGfxChange(void) +{ + switch (sPSSData->wallpaperChangeState) + { + case 0: + BeginNormalPaletteFade(sPSSData->field_738, 1, 0, 16, RGB_WHITEALPHA); + sPSSData->wallpaperChangeState++; + break; + case 1: + if (!UpdatePaletteFade()) + { + u8 curBox = StorageGetCurrentBox(); + LoadWallpaperGfx(curBox, 0); + sPSSData->wallpaperChangeState++; + } + break; + case 2: + if (WaitForWallpaperGfxLoad() == TRUE) + { + sub_80CCF9C(); + BeginNormalPaletteFade(sPSSData->field_738, 1, 16, 0, RGB_WHITEALPHA); + sPSSData->wallpaperChangeState++; + } + break; + case 3: + if (!UpdatePaletteFade()) + sPSSData->wallpaperChangeState++; + break; + case 4: + return FALSE; + } + + return TRUE; +} + +static void LoadWallpaperGfx(u8 boxId, s8 direction) +{ + u8 wallpaperId; + const struct WallpaperTable *wallpaperGfx; + void *iconGfx; + u32 size1, size2; + + sPSSData->field_6F9 = 0; + sPSSData->field_6FA = boxId; + sPSSData->field_6FB = direction; + if (sPSSData->field_6FB != 0) + { + sPSSData->field_2D2 = (sPSSData->field_2D2 == 0); + sub_80CCAE0(sPSSData->field_4AC4); + } + + wallpaperId = GetBoxWallpaper(sPSSData->field_6FA); + if (wallpaperId != WALLPAPER_FRIENDS) + { + wallpaperGfx = &gWallpaperTable[wallpaperId]; + LZ77UnCompWram(wallpaperGfx->tileMap, sPSSData->field_792); + sub_80CCA3C(sPSSData->field_792, sPSSData->field_6FB, sPSSData->field_2D2); + + if (sPSSData->field_6FB != 0) + LoadPalette(wallpaperGfx->palettes, (sPSSData->field_2D2 * 32) + 0x40, 0x40); + else + CpuCopy16(wallpaperGfx->palettes, &gPlttBufferUnfaded[(sPSSData->field_2D2 * 32) + 0x40], 0x40); + + sPSSData->wallpaperTiles = malloc_and_decompress(wallpaperGfx->tiles, &size1); + LoadBgTiles(2, sPSSData->wallpaperTiles, size1, sPSSData->field_2D2 << 8); + } + else + { + wallpaperGfx = &gFriendsWallpaperTable[GetWaldaWallpaperPatternId()]; + LZ77UnCompWram(wallpaperGfx->tileMap, sPSSData->field_792); + sub_80CCA3C(sPSSData->field_792, sPSSData->field_6FB, sPSSData->field_2D2); + + CpuCopy16(wallpaperGfx->palettes, sPSSData->field_792, 0x40); + CpuCopy16(GetWaldaWallpaperColorsPtr(), &sPSSData->field_792[1], 4); + CpuCopy16(GetWaldaWallpaperColorsPtr(), &sPSSData->field_792[17], 4); + + if (sPSSData->field_6FB != 0) + LoadPalette(sPSSData->field_792, (sPSSData->field_2D2 * 32) + 0x40, 0x40); + else + CpuCopy16(sPSSData->field_792, &gPlttBufferUnfaded[(sPSSData->field_2D2 * 32) + 0x40], 0x40); + + sPSSData->wallpaperTiles = malloc_and_decompress(wallpaperGfx->tiles, &size1); + iconGfx = malloc_and_decompress(gFriendsIcons[GetWaldaWallpaperIconId()], &size2); + CpuCopy32(iconGfx, sPSSData->wallpaperTiles + 0x800, size2); + Free(iconGfx); + LoadBgTiles(2, sPSSData->wallpaperTiles, size1, sPSSData->field_2D2 << 8); + } + + CopyBgTilemapBufferToVram(2); +} + +static bool32 WaitForWallpaperGfxLoad(void) +{ + if (IsDma3ManagerBusyWithBgCopy()) + return FALSE; + + if (sPSSData->wallpaperTiles != NULL) + { + Free(sPSSData->wallpaperTiles); + sPSSData->wallpaperTiles = NULL; + } + return TRUE; +} + +static void sub_80CCA3C(const void *tilemap, s8 direction, u8 arg2) +{ + s16 var = (arg2 * 2) + 3; + s16 x = ((sPSSData->bg2_X / 8 + 10) + (direction * 24)) & 0x3F; + + CopyRectToBgTilemapBufferRect(2, tilemap, 0, 0, 0x14, 0x12, x, 2, 0x14, 0x12, 0x11, arg2 << 8, var); + + if (direction == 0) + return; + else if (direction > 0) + x *= 1, x += 0x14; // x * 1 is needed to match, but can be safely removed as it makes no functional difference + else + x -= 4; + + FillBgTilemapBufferRect(2, 0, x, 2, 4, 0x12, 0x11); +} + +static void sub_80CCAE0(void *arg0) +{ + u16 i; + u16 *dest = arg0; + s16 r3 = ((sPSSData->bg2_X / 8) + 30) & 0x3F; + + if (r3 <= 31) + dest += r3 + 0x260; + else + dest += r3 + 0x640; + + for (i = 0; i < 0x2C; i++) + { + *dest++ = 0; + r3 = (r3 + 1) & 0x3F; + if (r3 == 0) + dest -= 0x420; + if (r3 == 0x20) + dest += 0x3e0; + } +} + +static void sub_80CCB50(u8 boxId) +{ + u8 tagIndex; + s16 r6; + u16 i; + + struct SpriteSheet spriteSheet = {sPSSData->field_2F8, 0x200, TAG_TILE_3}; + struct SpritePalette palettes[] = { + {sPSSData->field_6FC, TAG_PAL_DAC9}, + {} + }; + + u16 wallpaperId = GetBoxWallpaper(boxId); + + sPSSData->field_6FC[14] = gUnknown_08577574[wallpaperId][0]; + sPSSData->field_6FC[15] = gUnknown_08577574[wallpaperId][1]; + LoadSpritePalettes(palettes); + sPSSData->field_738 = 0x3f0; + + tagIndex = IndexOfSpritePaletteTag(TAG_PAL_DAC9); + sPSSData->field_71C = 0x10e + 16 * tagIndex; + sPSSData->field_738 |= 0x10000 << tagIndex; + + tagIndex = IndexOfSpritePaletteTag(TAG_PAL_DAC9); + sPSSData->field_71E = 0x10e + 16 * tagIndex; + sPSSData->field_738 |= 0x10000 << tagIndex; + + StringCopyPadded(sPSSData->field_21B8, GetBoxNamePtr(boxId), 0, 8); + sub_80C6D80(sPSSData->field_21B8, sPSSData->field_2F8, 0, 0, 2); + LoadSpriteSheet(&spriteSheet); + r6 = sub_80CD00C(GetBoxNamePtr(boxId)); + + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_857B0A8, r6 + i * 32, 28, 24); + sPSSData->field_720[i] = &gSprites[spriteId]; + StartSpriteAnim(sPSSData->field_720[i], i); + } + sPSSData->field_6F8 = 0; +} + +static void sub_80CCCFC(u8 boxId, s8 direction) +{ + u16 r8; + s16 x, x2; + u16 i; + struct SpriteSheet spriteSheet = {sPSSData->field_2F8, 0x200, TAG_TILE_3}; + struct SpriteTemplate template = gSpriteTemplate_857B0A8; + + sPSSData->field_6F8 = (sPSSData->field_6F8 == 0); + if (sPSSData->field_6F8 == 0) + { + spriteSheet.tag = TAG_TILE_3; + r8 = sPSSData->field_71C; + } + else + { + spriteSheet.tag = TAG_TILE_4; + r8 = sPSSData->field_71C; + template.tileTag = TAG_TILE_4; + template.paletteTag = TAG_PAL_DAC9; + } + + StringCopyPadded(sPSSData->field_21B8, GetBoxNamePtr(boxId), 0, 8); + sub_80C6D80(sPSSData->field_21B8, sPSSData->field_2F8, 0, 0, 2); + LoadSpriteSheet(&spriteSheet); + LoadPalette(gUnknown_08577574[GetBoxWallpaper(boxId)], r8, 4); + x = sub_80CD00C(GetBoxNamePtr(boxId)); + x2 = x; + x2 += direction * 192; + + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&template, i * 32 + x2, 28, 24); + + sPSSData->field_728[i] = &gSprites[spriteId]; + sPSSData->field_728[i]->data[0] = (-direction) * 6; + sPSSData->field_728[i]->data[1] = i * 32 + x; + sPSSData->field_728[i]->data[2] = 0; + sPSSData->field_728[i]->callback = sub_80CCF30; + StartSpriteAnim(sPSSData->field_728[i], i); + + sPSSData->field_720[i]->data[0] = (-direction) * 6; + sPSSData->field_720[i]->data[1] = 1; + sPSSData->field_720[i]->callback = sub_80CCF64; + } +} + +static void sub_80CCEE0(void) +{ + if (sPSSData->field_6F8 == 0) + FreeSpriteTilesByTag(TAG_TILE_4); + else + FreeSpriteTilesByTag(TAG_TILE_3); + + sPSSData->field_720[0] = sPSSData->field_728[0]; + sPSSData->field_720[1] = sPSSData->field_728[1]; +} + +static void sub_80CCF30(struct Sprite *sprite) +{ + if (sprite->data[2] != 0) + sprite->data[2]--; + else if ((sprite->pos1.x += sprite->data[0]) == sprite->data[1]) + sprite->callback = SpriteCallbackDummy; +} + +static void sub_80CCF64(struct Sprite *sprite) +{ + if (sprite->data[1] != 0) + { + sprite->data[1]--; + } + else + { + sprite->pos1.x += sprite->data[0]; + sprite->data[2] = sprite->pos1.x + sprite->pos2.x; + if (sprite->data[2] < 0x40 || sprite->data[2] > 0x100) + DestroySprite(sprite); + } +} + +static void sub_80CCF9C(void) +{ + u8 boxId = StorageGetCurrentBox(); + u8 wallpaperId = GetBoxWallpaper(boxId); + if (sPSSData->field_6F8 == 0) + CpuCopy16(gUnknown_08577574[wallpaperId], gPlttBufferUnfaded + sPSSData->field_71C, 4); + else + CpuCopy16(gUnknown_08577574[wallpaperId], gPlttBufferUnfaded + sPSSData->field_71E, 4); +} + +static s16 sub_80CD00C(const u8 *string) +{ + return 0xB0 - GetStringWidth(1, string, 0) / 2; +} + +static void sub_80CD02C(void) +{ + u16 i; + + LoadSpriteSheet(&gUnknown_0857B080); + for (i = 0; i < 2; i++) + { + u8 spriteId = CreateSprite(&gUnknown_0857B0E0, 0x5c + i * 0x88, 28, 22); + if (spriteId != MAX_SPRITES) + { + struct Sprite *sprite = &gSprites[spriteId]; + StartSpriteAnim(sprite, i); + sprite->data[3] = (i == 0) ? -1 : 1; + sPSSData->field_730[i] = sprite; + } + } + if (IsCursorOnBox()) + sub_80CD1A8(TRUE); +} + +static void sub_80CD0B8(s8 direction) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + sPSSData->field_730[i]->pos2.x = 0; + sPSSData->field_730[i]->data[0] = 2; + } + if (direction < 0) + { + sPSSData->field_730[0]->data[1] = 29; + sPSSData->field_730[1]->data[1] = 5; + sPSSData->field_730[0]->data[2] = 0x48; + sPSSData->field_730[1]->data[2] = 0x48; + } + else + { + sPSSData->field_730[0]->data[1] = 5; + sPSSData->field_730[1]->data[1] = 29; + sPSSData->field_730[0]->data[2] = 0xF8; + sPSSData->field_730[1]->data[2] = 0xF8; + } + sPSSData->field_730[0]->data[7] = 0; + sPSSData->field_730[1]->data[7] = 1; +} + +static void sub_80CD158(void) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + sPSSData->field_730[i]->pos1.x = 0x88 * i + 0x5c; + sPSSData->field_730[i]->pos2.x = 0; + sPSSData->field_730[i]->invisible = FALSE; + } + sub_80CD1A8(TRUE); +} + +static void sub_80CD1A8(bool8 a0) +{ + u16 i; + + if (a0) + { + for (i = 0; i < 2; i++) + { + sPSSData->field_730[i]->data[0] = 1; + sPSSData->field_730[i]->data[1] = 0; + sPSSData->field_730[i]->data[2] = 0; + sPSSData->field_730[i]->data[4] = 0; + } + } + else + { + for (i = 0; i < 2; i++) + { + sPSSData->field_730[i]->data[0] = 0; + } + } +} + +static void sub_80CD210(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos2.x = 0; + break; + case 1: + if (++sprite->data[1] > 3) + { + sprite->data[1] = 0; + sprite->pos2.x += sprite->data[3]; + if (++sprite->data[2] > 5) + { + sprite->data[2] = 0; + sprite->pos2.x = 0; + } + } + break; + case 2: + sprite->data[0] = 3; + break; + case 3: + sprite->pos1.x -= sPSSData->field_2CE; + if (sprite->pos1.x < 73 || sprite->pos1.x > 247) + sprite->invisible = TRUE; + if (--sprite->data[1] == 0) + { + sprite->pos1.x = sprite->data[2]; + sprite->invisible = FALSE; + sprite->data[0] = 4; + } + break; + case 4: + sprite->pos1.x -= sPSSData->field_2CE; + break; + } +} + +static struct Sprite *sub_80CD2E8(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority) +{ + u8 spriteId = CreateSprite(&gUnknown_0857B0E0, x, y, subpriority); + if (spriteId == MAX_SPRITES) + return NULL; + + animId %= 2; + StartSpriteAnim(&gSprites[spriteId], animId); + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].callback = SpriteCallbackDummy; + return &gSprites[spriteId]; +} + +static void sub_80CD36C(void) +{ + if (sPSSData->boxOption != BOX_OPTION_DEPOSIT) + sBoxCursorArea = CURSOR_AREA_IN_BOX; + else + sBoxCursorArea = CURSOR_AREA_IN_PARTY; + + sBoxCursorPosition = 0; + sIsMonBeingMoved = FALSE; + sMovingMonOrigBoxId = 0; + sMovingMonOrigBoxPos = 0; + sCanOnlyMove = FALSE; + sub_80CDC0C(); + sub_80CFC14(); + sPSSData->field_CD6 = 1; + sPSSData->inBoxMovingMode = 0; + sub_80CEB40(); +} + +static void sub_80CD3EC(void) +{ + sub_80CFC14(); + sub_80CEBDC(); + sPSSData->field_CD6 = 1; + sPSSData->inBoxMovingMode = 0; + if (sIsMonBeingMoved) + { + sPSSData->movingMon = gUnknown_02039D14; + CreateMovingMonIcon(); + } +} + +static void sub_80CD444(u8 cursorArea, u8 cursorPosition, u16 *x, u16 *y) +{ + switch (cursorArea) + { + case CURSOR_AREA_IN_BOX: + *x = (cursorPosition % IN_BOX_ROWS) * 24 + 100; + *y = (cursorPosition / IN_BOX_ROWS) * 24 + 32; + break; + case CURSOR_AREA_IN_PARTY: + if (cursorPosition == 0) + { + *x = 0x68; + *y = 0x34; + } + else if (cursorPosition == PARTY_SIZE) + { + *x = 0x98; + *y = 0x84; + } + else + { + *x = 0x98; + *y = (cursorPosition - 1) * 24 + 4; + } + break; + case CURSOR_AREA_BOX: + *x = 0xa2; + *y = 0x0c; + break; + case CURSOR_AREA_BUTTONS: + *y = sIsMonBeingMoved ? 8 : 14; + *x = cursorPosition * 0x58 + 0x78; + break; + case 4: + *x = 0xa0; + *y = 0x60; + break; + } +} + +static u16 sub_80CD504(void) +{ + switch (sBoxCursorArea) + { + case CURSOR_AREA_IN_PARTY: + return GetMonData(&gPlayerParty[sBoxCursorPosition], MON_DATA_SPECIES); + case CURSOR_AREA_IN_BOX: + return GetCurrentBoxMonData(sBoxCursorPosition, MON_DATA_SPECIES); + default: + return SPECIES_NONE; + } +} + +static bool8 sub_80CD554(void) +{ + s16 tmp; + + if (sPSSData->field_CD0 == 0) + { + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + return FALSE; + else + return sub_80D1218(); + } + else if (--sPSSData->field_CD0 != 0) + { + sPSSData->field_CBC += sPSSData->field_CC4; + sPSSData->field_CC0 += sPSSData->field_CC8; + sPSSData->field_CB4->pos1.x = sPSSData->field_CBC >> 8; + sPSSData->field_CB4->pos1.y = sPSSData->field_CC0 >> 8; + if (sPSSData->field_CB4->pos1.x > 0x100) + { + tmp = sPSSData->field_CB4->pos1.x - 0x100; + sPSSData->field_CB4->pos1.x = tmp + 0x40; + } + if (sPSSData->field_CB4->pos1.x < 0x40) + { + tmp = 0x40 - sPSSData->field_CB4->pos1.x; + sPSSData->field_CB4->pos1.x = 0x100 - tmp; + } + if (sPSSData->field_CB4->pos1.y > 0xb0) + { + tmp = sPSSData->field_CB4->pos1.y - 0xb0; + sPSSData->field_CB4->pos1.y = tmp - 0x10; + } + if (sPSSData->field_CB4->pos1.y < -0x10) + { + tmp = -0x10 - sPSSData->field_CB4->pos1.y; + sPSSData->field_CB4->pos1.y = 0xb0 - tmp; + } + if (sPSSData->field_CD7 && --sPSSData->field_CD7 == 0) + sPSSData->field_CB4->vFlip = (sPSSData->field_CB4->vFlip == FALSE); + } + else + { + sPSSData->field_CB4->pos1.x = sPSSData->field_CCC; + sPSSData->field_CB4->pos1.y = sPSSData->field_CCE; + sub_80CDA68(); + } + + return TRUE; +} + +static void sub_80CD6AC(u8 newCurosrArea, u8 newCursorPosition) +{ + u16 x, y; + + sub_80CD444(newCurosrArea, newCursorPosition, &x, &y); + sPSSData->field_CD4 = newCurosrArea; + sPSSData->field_CD5 = newCursorPosition; + sPSSData->field_CCC = x; + sPSSData->field_CCE = y; +} + +static void sub_80CD70C(void) +{ + int r7, r0; + + if (sPSSData->field_CD2 != 0 || sPSSData->field_CD3 != 0) + sPSSData->field_CD0 = 12; + else + sPSSData->field_CD0 = 6; + + if (sPSSData->field_CD7) + sPSSData->field_CD7 = sPSSData->field_CD0 >> 1; + + switch (sPSSData->field_CD2) + { + default: + r7 = sPSSData->field_CCE - sPSSData->field_CB4->pos1.y; + break; + case -1: + r7 = sPSSData->field_CCE - 0xc0 - sPSSData->field_CB4->pos1.y; + break; + case 1: + r7 = sPSSData->field_CCE + 0xc0 - sPSSData->field_CB4->pos1.y; + break; + } + + switch (sPSSData->field_CD3) + { + default: + r0 = sPSSData->field_CCC - sPSSData->field_CB4->pos1.x; + break; + case -1: + r0 = sPSSData->field_CCC - 0xc0 - sPSSData->field_CB4->pos1.x; + break; + case 1: + r0 = sPSSData->field_CCC + 0xc0 - sPSSData->field_CB4->pos1.x; + break; + } + + r7 <<= 8; + r0 <<= 8; + sPSSData->field_CC4 = r0 / sPSSData->field_CD0; + sPSSData->field_CC8 = r7 / sPSSData->field_CD0; + sPSSData->field_CBC = sPSSData->field_CB4->pos1.x << 8; + sPSSData->field_CC0 = sPSSData->field_CB4->pos1.y << 8; +} + +static void sub_80CD894(u8 newCurosrArea, u8 newCursorPosition) +{ + sub_80CD6AC(newCurosrArea, newCursorPosition); + sub_80CD70C(); + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + { + if (sPSSData->inBoxMovingMode == 0 && !sIsMonBeingMoved) + StartSpriteAnim(sPSSData->field_CB4, 1); + } + else + { + if (!IsActiveItemMoving()) + StartSpriteAnim(sPSSData->field_CB4, 1); + } + + if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + { + if (sBoxCursorArea == CURSOR_AREA_IN_BOX) + sub_80D0E50(CURSOR_AREA_IN_BOX, sBoxCursorPosition); + else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) + sub_80D0E50(CURSOR_AREA_IN_PARTY, sBoxCursorPosition); + + if (newCurosrArea == CURSOR_AREA_IN_BOX) + sub_80D0D8C(newCurosrArea, newCursorPosition); + else if (newCurosrArea == CURSOR_AREA_IN_PARTY) + sub_80D0D8C(newCurosrArea, newCursorPosition); + } + + if (newCurosrArea == CURSOR_AREA_IN_PARTY && sBoxCursorArea != CURSOR_AREA_IN_PARTY) + { + sPSSData->field_CD6 = newCurosrArea; + sPSSData->field_CB8->invisible = TRUE; + } + + switch (newCurosrArea) + { + case CURSOR_AREA_IN_PARTY: + case CURSOR_AREA_BOX: + case CURSOR_AREA_BUTTONS: + sPSSData->field_CB4->oam.priority = 1; + sPSSData->field_CB8->invisible = TRUE; + sPSSData->field_CB8->oam.priority = 1; + break; + case CURSOR_AREA_IN_BOX: + if (sPSSData->inBoxMovingMode != 0) + { + sPSSData->field_CB4->oam.priority = 0; + sPSSData->field_CB8->invisible = TRUE; + } + else + { + sPSSData->field_CB4->oam.priority = 2; + if (sBoxCursorArea == CURSOR_AREA_IN_BOX && sIsMonBeingMoved) + SetMovingMonPriority(2); + } + break; + } +} + +static void sub_80CDA68(void) +{ + sBoxCursorArea = sPSSData->field_CD4; + sBoxCursorPosition = sPSSData->field_CD5; + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + { + if (sPSSData->inBoxMovingMode == 0 && !sIsMonBeingMoved) + StartSpriteAnim(sPSSData->field_CB4, 0); + } + else + { + if (!IsActiveItemMoving()) + StartSpriteAnim(sPSSData->field_CB4, 0); + } + + sub_80CEB40(); + switch (sBoxCursorArea) + { + case CURSOR_AREA_BUTTONS: + SetMovingMonPriority(1); + break; + case CURSOR_AREA_BOX: + sub_80CD1A8(TRUE); + break; + case CURSOR_AREA_IN_PARTY: + sPSSData->field_CB8->subpriority = 13; + SetMovingMonPriority(1); + break; + case CURSOR_AREA_IN_BOX: + if (sPSSData->inBoxMovingMode == 0) + { + sPSSData->field_CB4->oam.priority = 1; + sPSSData->field_CB8->oam.priority = 2; + sPSSData->field_CB8->subpriority = 21; + sPSSData->field_CB8->invisible = FALSE; + SetMovingMonPriority(2); + } + break; + } +} + +static void sub_80CDBA0(void) +{ + u8 partyCount; + + if (!sIsMonBeingMoved) + { + partyCount = 0; + } + else + { + partyCount = CalculatePlayerPartyCount(); + if (partyCount >= PARTY_SIZE) + partyCount = PARTY_SIZE - 1; + } + if (sPSSData->field_CB4->vFlip) + sPSSData->field_CD7 = 1; + sub_80CD894(CURSOR_AREA_IN_PARTY, partyCount); +} + +static void sub_80CDBF8(u8 cursorBoxPosition) +{ + sub_80CD894(CURSOR_AREA_IN_BOX, cursorBoxPosition); +} + +EWRAM_DATA static u8 gUnknown_02039D7E = 0; + +static void sub_80CDC0C(void) +{ + gUnknown_02039D7E = 0; +} + +static void sub_80CDC18(void) +{ + gUnknown_02039D7E = sBoxCursorPosition; +} + +static u8 sub_80CDC2C(void) +{ + return gUnknown_02039D7E; +} + +static void InitMonPlaceChange(u8 a0) +{ + static bool8 (*const placeChangeFuncs[])(void) = + { + MonPlaceChange_Move, + MonPlaceChange_Place, + MonPlaceChange_Shift, + }; + + sPSSData->monPlaceChangeFunc = placeChangeFuncs[a0]; + sPSSData->monPlaceChangeState = 0; +} + +static void sub_80CDC64(bool8 arg0) +{ + if (!arg0) + sPSSData->monPlaceChangeFunc = sub_80CDEB4; + else + sPSSData->monPlaceChangeFunc = sub_80CDEC4; + + sPSSData->monPlaceChangeState = 0; +} + +static bool8 DoMonPlaceChange(void) +{ + return sPSSData->monPlaceChangeFunc(); +} + +static bool8 MonPlaceChange_Move(void) +{ + switch (sPSSData->monPlaceChangeState) + { + case 0: + if (sIsMonBeingMoved) + return FALSE; + StartSpriteAnim(sPSSData->field_CB4, 2); + sPSSData->monPlaceChangeState++; + break; + case 1: + if (!sub_80CDED4()) + { + StartSpriteAnim(sPSSData->field_CB4, 3); + MoveMon(); + sPSSData->monPlaceChangeState++; + } + break; + case 2: + if (!sub_80CDF08()) + sPSSData->monPlaceChangeState++; + break; + case 3: + return FALSE; + } + + return TRUE; +} + +static bool8 MonPlaceChange_Place(void) +{ + switch (sPSSData->monPlaceChangeState) + { + case 0: + if (!sub_80CDED4()) + { + StartSpriteAnim(sPSSData->field_CB4, 2); + PlaceMon(); + sPSSData->monPlaceChangeState++; + } + break; + case 1: + if (!sub_80CDF08()) + { + StartSpriteAnim(sPSSData->field_CB4, 0); + sPSSData->monPlaceChangeState++; + } + break; + case 2: + return FALSE; + } + + return TRUE; +} + +static bool8 MonPlaceChange_Shift(void) +{ + switch (sPSSData->monPlaceChangeState) + { + case 0: + switch (sBoxCursorArea) + { + case CURSOR_AREA_IN_PARTY: + sPSSData->field_D91 = TOTAL_BOXES_COUNT; + break; + case CURSOR_AREA_IN_BOX: + sPSSData->field_D91 = StorageGetCurrentBox(); + break; + default: + return FALSE; + } + StartSpriteAnim(sPSSData->field_CB4, 2); + sub_80CBD5C(sPSSData->field_D91, sBoxCursorPosition); + sPSSData->monPlaceChangeState++; + break; + case 1: + if (!sub_80CBDC4()) + { + StartSpriteAnim(sPSSData->field_CB4, 3); + SetShiftedMonData(sPSSData->field_D91, sBoxCursorPosition); + sPSSData->monPlaceChangeState++; + } + break; + case 2: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_80CDEB4(void) +{ + return sub_80CDED4(); +} + +static bool8 sub_80CDEC4(void) +{ + return sub_80CDF08(); +} + +static bool8 sub_80CDED4(void) +{ + switch (sPSSData->field_CB4->pos2.y) + { + default: + sPSSData->field_CB4->pos2.y++; + break; + case 0: + sPSSData->field_CB4->pos2.y++; + break; + case 8: + return FALSE; + } + + return TRUE; +} + +static bool8 sub_80CDF08(void) +{ + switch (sPSSData->field_CB4->pos2.y) + { + case 0: + return FALSE; + default: + sPSSData->field_CB4->pos2.y--; + break; + } + + return TRUE; +} + +static void MoveMon(void) +{ + switch (sBoxCursorArea) + { + case CURSOR_AREA_IN_PARTY: + SetMovedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition); + sub_80CBC14(MODE_PARTY, sBoxCursorPosition); + break; + case CURSOR_AREA_IN_BOX: + if (sPSSData->inBoxMovingMode == 0) + { + SetMovedMonData(StorageGetCurrentBox(), sBoxCursorPosition); + sub_80CBC14(MODE_BOX, sBoxCursorPosition); + } + break; + default: + return; + } + + sIsMonBeingMoved = TRUE; +} + +static void PlaceMon(void) +{ + u8 boxId; + + switch (sBoxCursorArea) + { + case CURSOR_AREA_IN_PARTY: + SetPlacedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition); + sub_80CBCAC(TOTAL_BOXES_COUNT, sBoxCursorPosition); + break; + case CURSOR_AREA_IN_BOX: + boxId = StorageGetCurrentBox(); + SetPlacedMonData(boxId, sBoxCursorPosition); + sub_80CBCAC(boxId, sBoxCursorPosition); + break; + default: + return; + } + + sIsMonBeingMoved = FALSE; +} + +static void sub_80CE00C(void) +{ + sub_80CEB40(); +} + +static void SetMovedMonData(u8 boxId, u8 position) +{ + if (boxId == TOTAL_BOXES_COUNT) + sPSSData->movingMon = gPlayerParty[sBoxCursorPosition]; + else + BoxMonAtToMon(boxId, position, &sPSSData->movingMon); + + PurgeMonOrBoxMon(boxId, position); + sMovingMonOrigBoxId = boxId; + sMovingMonOrigBoxPos = position; +} + +static void SetPlacedMonData(u8 boxId, u8 position) +{ + if (boxId == TOTAL_BOXES_COUNT) + { + gPlayerParty[position] = sPSSData->movingMon; + } + else + { + BoxMonRestorePP(&sPSSData->movingMon.box); + SetBoxMonAt(boxId, position, &sPSSData->movingMon.box); + } +} + +static void PurgeMonOrBoxMon(u8 boxId, u8 position) +{ + if (boxId == TOTAL_BOXES_COUNT) + ZeroMonData(&gPlayerParty[position]); + else + ZeroBoxMonAt(boxId, position); +} + +static void SetShiftedMonData(u8 boxId, u8 position) +{ + if (boxId == TOTAL_BOXES_COUNT) + sPSSData->field_2108 = gPlayerParty[position]; + else + BoxMonAtToMon(boxId, position, &sPSSData->field_2108); + + SetPlacedMonData(boxId, position); + sPSSData->movingMon = sPSSData->field_2108; + SetCursorMonData(&sPSSData->movingMon, MODE_PARTY); + sMovingMonOrigBoxId = boxId; + sMovingMonOrigBoxPos = position; +} + +static bool8 TryStorePartyMonInBox(u8 boxId) +{ + s16 boxPosition = GetFirstFreeBoxSpot(boxId); + if (boxPosition == -1) + return FALSE; + + if (sIsMonBeingMoved) + { + SetPlacedMonData(boxId, boxPosition); + DestroyMovingMonIcon(); + sIsMonBeingMoved = FALSE; + } + else + { + SetMovedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition); + SetPlacedMonData(boxId, boxPosition); + DestroyPartyMonIcon(sBoxCursorPosition); + } + + if (boxId == StorageGetCurrentBox()) + sub_80CB140(boxPosition); + + StartSpriteAnim(sPSSData->field_CB4, 1); + return TRUE; +} + +static void sub_80CE22C(void) +{ + StartSpriteAnim(sPSSData->field_CB4, 0); + sub_80CEB40(); +} + +static void sub_80CE250(void) +{ + u8 mode; + + if (sIsMonBeingMoved) + mode = MODE_2; + else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) + mode = MODE_PARTY; + else + mode = MODE_BOX; + + sub_80CBF14(mode, sBoxCursorPosition); + StringCopy(sPSSData->field_21E0, sPSSData->cursorMonNick); +} + +static bool8 sub_80CE2A8(void) +{ + if (!sub_80CBFD8()) + { + StartSpriteAnim(sPSSData->field_CB4, 0); + return FALSE; + } + else + { + return TRUE; + } +} + +static void ReleaseMon(void) +{ + u8 boxId; + + sub_80CC020(); + if (sIsMonBeingMoved) + { + sIsMonBeingMoved = FALSE; + } + else + { + if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) + boxId = TOTAL_BOXES_COUNT; + else + boxId = StorageGetCurrentBox(); + + PurgeMonOrBoxMon(boxId, sBoxCursorPosition); + } + sub_80CEB40(); +} + +static void sub_80CE324(void) +{ + if (sIsMonBeingMoved) + StartSpriteAnim(sPSSData->field_CB4, 3); +} + +struct +{ + s8 mapGroup; + s8 mapNum; + u16 move; +} static const gUnknown_0857B9A4[] = +{ + {MAP_GROUPS_COUNT, 0, MOVE_SURF}, + {MAP_GROUPS_COUNT, 0, MOVE_DIVE}, + {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MOVE_STRENGTH}, + {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MOVE_ROCK_SMASH}, + {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MOVE_STRENGTH}, + {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MOVE_ROCK_SMASH}, +}; + +static void sub_80CE350(u16 *moves) +{ + s32 i; + + for (i = 0; i < ARRAY_COUNT(gUnknown_0857B9A4); i++) + { + if (gUnknown_0857B9A4[i].mapGroup == MAP_GROUPS_COUNT + || (gUnknown_0857B9A4[i].mapGroup == gSaveBlock1Ptr->location.mapGroup && gUnknown_0857B9A4[i].mapNum == gSaveBlock1Ptr->location.mapNum)) + { + *moves = gUnknown_0857B9A4[i].move; + moves++; + } + } + + *moves = MOVES_COUNT; +} + +static void InitCanRelaseMonVars(void) +{ + if (!AtLeastThreeUsableMons()) + { + sPSSData->field_216D = 1; + sPSSData->field_216C = 0; + return; + } + + if (sIsMonBeingMoved) + { + sPSSData->field_2108 = sPSSData->movingMon; + sPSSData->field_2170 = -1; + sPSSData->field_2171 = -1; + } + else + { + if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) + { + sPSSData->field_2108 = gPlayerParty[sBoxCursorPosition]; + sPSSData->field_2170 = TOTAL_BOXES_COUNT; + } + else + { + BoxMonAtToMon(StorageGetCurrentBox(), sBoxCursorPosition, &sPSSData->field_2108); + sPSSData->field_2170 = StorageGetCurrentBox(); + } + sPSSData->field_2171 = sBoxCursorPosition; + } + + sub_80CE350(sPSSData->field_2176); + sPSSData->field_2174 = GetMonData(&sPSSData->field_2108, MON_DATA_KNOWN_MOVES, sPSSData->field_2176); + if (sPSSData->field_2174 != 0) + { + sPSSData->field_216D = 0; + } + else + { + sPSSData->field_216D = 1; + sPSSData->field_216C = 1; + } + + sPSSData->field_2172 = 0; +} + +static bool32 AtLeastThreeUsableMons(void) +{ + s32 i, j, count; + + count = (sIsMonBeingMoved != FALSE); + for (j = 0; j < PARTY_SIZE; j++) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_SANITY_HAS_SPECIES)) + count++; + } + + if (count >= 3) + return TRUE; + + for (i = 0; i < TOTAL_BOXES_COUNT; i++) + { + for (j = 0; j < IN_BOX_COUNT; j++) + { + if (CheckBoxMonSanityAt(i, j)) + { + if (++count >= 3) + return TRUE; + } + } + } + + return FALSE; +} + +static s8 RunCanReleaseMon(void) +{ + u16 i; + u16 knownMoves; + + if (sPSSData->field_216D) + return sPSSData->field_216C; + + switch (sPSSData->field_2172) + { + case 0: + for (i = 0; i < PARTY_SIZE; i++) + { + if (sPSSData->field_2170 != TOTAL_BOXES_COUNT || sPSSData->field_2171 != i) + { + knownMoves = GetMonData(gPlayerParty + i, MON_DATA_KNOWN_MOVES, sPSSData->field_2176); + sPSSData->field_2174 &= ~(knownMoves); + } + } + if (sPSSData->field_2174 == 0) + { + sPSSData->field_216D = 1; + sPSSData->field_216C = 1; + } + else + { + sPSSData->field_216E = 0; + sPSSData->field_216F = 0; + sPSSData->field_2172++; + } + break; + case 1: + for (i = 0; i < IN_BOX_COUNT; i++) + { + knownMoves = GetAndCopyBoxMonDataAt(sPSSData->field_216E, sPSSData->field_216F, MON_DATA_KNOWN_MOVES, sPSSData->field_2176); + if (knownMoves != 0 + && !(sPSSData->field_2170 == sPSSData->field_216E && sPSSData->field_2171 == sPSSData->field_216F)) + { + sPSSData->field_2174 &= ~(knownMoves); + if (sPSSData->field_2174 == 0) + { + sPSSData->field_216D = 1; + sPSSData->field_216C = 1; + break; + } + } + if (++sPSSData->field_216F >= IN_BOX_COUNT) + { + sPSSData->field_216F = 0; + if (++sPSSData->field_216E >= TOTAL_BOXES_COUNT) + { + sPSSData->field_216D = 1; + sPSSData->field_216C = 0; + } + } + } + break; + } + + return -1; +} + +static void sub_80CE760(void) +{ + if (sIsMonBeingMoved) + gUnknown_02039D14 = sPSSData->movingMon; +} + +static void sub_80CE790(void) +{ + if (sIsMonBeingMoved) + { + if (sMovingMonOrigBoxId == TOTAL_BOXES_COUNT) + sPSSData->movingMon = gUnknown_02039D14; + else + sPSSData->movingMon.box = gUnknown_02039D14.box; + } +} + +static void sub_80CE7E8(void) +{ + if (sIsMonBeingMoved) + { + sub_80CE760(); + sPSSData->field_218C.mon = &gUnknown_02039D14; + sPSSData->field_2187 = 0; + sPSSData->field_2186 = 0; + sPSSData->field_2188 = 0; + } + else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) + { + sPSSData->field_218C.mon = gPlayerParty; + sPSSData->field_2187 = sBoxCursorPosition; + sPSSData->field_2186 = CountPartyMons() - 1; + sPSSData->field_2188 = 0; + } + else + { + sPSSData->field_218C.box = GetBoxedMonPtr(StorageGetCurrentBox(), 0); + sPSSData->field_2187 = sBoxCursorPosition; + sPSSData->field_2186 = IN_BOX_COUNT - 1; + sPSSData->field_2188 = 2; + } +} + +static void sub_80CE8E4(void) +{ + if (sIsMonBeingMoved) + sub_80CE790(); + else + sBoxCursorPosition = gUnknown_0203CF20; +} + +s16 CompactPartySlots(void) +{ + s16 retVal = -1; + u16 i, last; + + for (i = 0, last = 0; i < PARTY_SIZE; i++) + { + u16 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES); + if (species != SPECIES_NONE) + { + if (i != last) + gPlayerParty[last] = gPlayerParty[i]; + last++; + } + else if (retVal == -1) + { + retVal = i; + } + } + for (; last < PARTY_SIZE; last++) + ZeroMonData(gPlayerParty + last); + + return retVal; +} + +static void SetMonMarkings(u8 markings) +{ + sPSSData->cursorMonMarkings = markings; + if (sIsMonBeingMoved) + { + SetMonData(&sPSSData->movingMon, MON_DATA_MARKINGS, &markings); + } + else + { + if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) + SetMonData(gPlayerParty + sBoxCursorPosition, MON_DATA_MARKINGS, &markings); + if (sBoxCursorArea == CURSOR_AREA_IN_BOX) + SetCurrentBoxMonData(sBoxCursorPosition, MON_DATA_MARKINGS, &markings); + } +} + +static bool8 CanMovePartyMon(void) +{ + if (sBoxCursorArea == CURSOR_AREA_IN_PARTY && !sIsMonBeingMoved && CountPartyAliveNonEggMonsExcept(sBoxCursorPosition) == 0) + return TRUE; + else + return FALSE; +} + +static bool8 CanShiftMon(void) +{ + if (sIsMonBeingMoved) + { + if (sBoxCursorArea == CURSOR_AREA_IN_PARTY && CountPartyAliveNonEggMonsExcept(sBoxCursorPosition) == 0) + { + if (sPSSData->cursorMonIsEgg || GetMonData(&sPSSData->movingMon, MON_DATA_HP) == 0) + return FALSE; + } + return TRUE; + } + return FALSE; +} + +static bool8 IsMonBeingMoved(void) +{ + return sIsMonBeingMoved; +} + +static bool8 IsCursorOnBox(void) +{ + return (sBoxCursorArea == CURSOR_AREA_BOX); +} + +static bool8 IsCursorOnCloseBox(void) +{ + return (sBoxCursorArea == CURSOR_AREA_BUTTONS && sBoxCursorPosition == 1); +} + +static bool8 IsCursorInBox(void) +{ + return (sBoxCursorArea == CURSOR_AREA_IN_BOX); +} + +static void sub_80CEB40(void) +{ + sPSSData->setMosaic = (sIsMonBeingMoved == FALSE); + if (!sIsMonBeingMoved) + { + switch (sBoxCursorArea) + { + case CURSOR_AREA_IN_PARTY: + if (sBoxCursorPosition < PARTY_SIZE) + { + SetCursorMonData(&gPlayerParty[sBoxCursorPosition], MODE_PARTY); + break; + } + // fallthrough + case CURSOR_AREA_BUTTONS: + case CURSOR_AREA_BOX: + SetCursorMonData(NULL, MODE_2); + break; + case CURSOR_AREA_IN_BOX: + SetCursorMonData(GetBoxedMonPtr(StorageGetCurrentBox(), sBoxCursorPosition), MODE_BOX); + break; + } + } +} + +static void sub_80CEBDC(void) +{ + if (sIsMonBeingMoved) + SetCursorMonData(&gUnknown_02039D14, MODE_PARTY); + else + sub_80CEB40(); +} + +static void SetCursorMonData(void *pokemon, u8 mode) +{ + u8 *txtPtr; + u16 gender; + bool8 sanityIsBagEgg; + + sPSSData->cursorMonItem = 0; + gender = MON_MALE; + sanityIsBagEgg = FALSE; + if (mode == MODE_PARTY) + { + struct Pokemon *mon = (struct Pokemon *)pokemon; + + sPSSData->cursorMonSpecies = GetMonData(mon, MON_DATA_SPECIES2); + if (sPSSData->cursorMonSpecies != SPECIES_NONE) + { + sanityIsBagEgg = GetMonData(mon, MON_DATA_SANITY_IS_BAD_EGG); + if (sanityIsBagEgg) + sPSSData->cursorMonIsEgg = TRUE; + else + sPSSData->cursorMonIsEgg = GetMonData(mon, MON_DATA_IS_EGG); + + GetMonData(mon, MON_DATA_NICKNAME, sPSSData->cursorMonNick); + StringGetEnd10(sPSSData->cursorMonNick); + sPSSData->cursorMonLevel = GetMonData(mon, MON_DATA_LEVEL); + sPSSData->cursorMonMarkings = GetMonData(mon, MON_DATA_MARKINGS); + sPSSData->cursorMonPersonality = GetMonData(mon, MON_DATA_PERSONALITY); + sPSSData->cursorMonPalette = GetMonFrontSpritePal(mon); + gender = GetMonGender(mon); + sPSSData->cursorMonItem = GetMonData(mon, MON_DATA_HELD_ITEM); + } + } + else if (mode == MODE_BOX) + { + struct BoxPokemon *boxMon = (struct BoxPokemon *)pokemon; + + sPSSData->cursorMonSpecies = GetBoxMonData(pokemon, MON_DATA_SPECIES2); + if (sPSSData->cursorMonSpecies != SPECIES_NONE) + { + u32 otId = GetBoxMonData(boxMon, MON_DATA_OT_ID); + sanityIsBagEgg = GetBoxMonData(boxMon, MON_DATA_SANITY_IS_BAD_EGG); + if (sanityIsBagEgg) + sPSSData->cursorMonIsEgg = TRUE; + else + sPSSData->cursorMonIsEgg = GetBoxMonData(boxMon, MON_DATA_IS_EGG); + + + GetBoxMonData(boxMon, MON_DATA_NICKNAME, sPSSData->cursorMonNick); + StringGetEnd10(sPSSData->cursorMonNick); + sPSSData->cursorMonLevel = GetLevelFromBoxMonExp(boxMon); + sPSSData->cursorMonMarkings = GetBoxMonData(boxMon, MON_DATA_MARKINGS); + sPSSData->cursorMonPersonality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY); + sPSSData->cursorMonPalette = GetFrontSpritePalFromSpeciesAndPersonality(sPSSData->cursorMonSpecies, otId, sPSSData->cursorMonPersonality); + gender = GetGenderFromSpeciesAndPersonality(sPSSData->cursorMonSpecies, sPSSData->cursorMonPersonality); + sPSSData->cursorMonItem = GetBoxMonData(boxMon, MON_DATA_HELD_ITEM); + } + } + else + { + sPSSData->cursorMonSpecies = SPECIES_NONE; + sPSSData->cursorMonItem = 0; + } + + if (sPSSData->cursorMonSpecies == SPECIES_NONE) + { + StringFill(sPSSData->cursorMonNick, CHAR_SPACE, 5); + StringFill(sPSSData->cursorMonNickText, CHAR_SPACE, 8); + StringFill(sPSSData->cursorMonSpeciesName, CHAR_SPACE, 8); + StringFill(sPSSData->cursorMonGenderLvlText, CHAR_SPACE, 8); + StringFill(sPSSData->cursorMonItemName, CHAR_SPACE, 8); + } + else if (sPSSData->cursorMonIsEgg) + { + if (sanityIsBagEgg) + StringCopyPadded(sPSSData->cursorMonNickText, sPSSData->cursorMonNick, CHAR_SPACE, 5); + else + StringCopyPadded(sPSSData->cursorMonNickText, gText_EggNickname, CHAR_SPACE, 8); + + StringFill(sPSSData->cursorMonSpeciesName, CHAR_SPACE, 8); + StringFill(sPSSData->cursorMonGenderLvlText, CHAR_SPACE, 8); + StringFill(sPSSData->cursorMonItemName, CHAR_SPACE, 8); + } + else + { + if (sPSSData->cursorMonSpecies == SPECIES_NIDORAN_F || sPSSData->cursorMonSpecies == SPECIES_NIDORAN_M) + gender = MON_GENDERLESS; + + StringCopyPadded(sPSSData->cursorMonNickText, sPSSData->cursorMonNick, CHAR_SPACE, 5); + + txtPtr = sPSSData->cursorMonSpeciesName; + *(txtPtr)++ = CHAR_SLASH; + StringCopyPadded(txtPtr, gSpeciesNames[sPSSData->cursorMonSpecies], CHAR_SPACE, 5); + + txtPtr = sPSSData->cursorMonGenderLvlText; + *(txtPtr)++ = EXT_CTRL_CODE_BEGIN; + *(txtPtr)++ = 4; + switch (gender) + { + case MON_MALE: + *(txtPtr)++ = 4; + *(txtPtr)++ = 1; + *(txtPtr)++ = 5; + *(txtPtr)++ = CHAR_MALE; + break; + case MON_FEMALE: + *(txtPtr)++ = 6; + *(txtPtr)++ = 1; + *(txtPtr)++ = 7; + *(txtPtr)++ = CHAR_FEMALE; + break; + default: + *(txtPtr)++ = 2; + *(txtPtr)++ = 1; + *(txtPtr)++ = 3; + *(txtPtr)++ = 0x77; + break; + } + + *(txtPtr++) = EXT_CTRL_CODE_BEGIN; + *(txtPtr++) = 4; + *(txtPtr++) = 2; + *(txtPtr++) = 1; + *(txtPtr++) = 3; + *(txtPtr++) = 0; + *(txtPtr++) = CHAR_SPECIAL_F9; + *(txtPtr++) = 5; + + txtPtr = ConvertIntToDecimalStringN(txtPtr, sPSSData->cursorMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3); + txtPtr[0] = CHAR_SPACE; + txtPtr[1] = EOS; + + if (sPSSData->cursorMonItem != 0) + StringCopyPadded(sPSSData->cursorMonItemName, ItemId_GetName(sPSSData->cursorMonItem), CHAR_SPACE, 8); + else + StringFill(sPSSData->cursorMonItemName, CHAR_SPACE, 8); + } +} + +static u8 HandleInput_InBox(void) +{ + switch (sPSSData->inBoxMovingMode) + { + case 0: + default: + return InBoxInput_Normal(); + case 1: + return InBoxInput_GrabbingMultiple(); + case 2: + return InBoxInput_MovingMultiple(); + } +} + +// This group of four functions handling input simply CANNOT be matched. +// GF must have written them in a really weird way, a way not a sane person could dream to reproduce. +#ifdef NONMATCHING +static u8 InBoxInput_Normal(void) +{ + u8 retVal; + s8 cursorArea = sBoxCursorArea; + s8 cursorPosition = sBoxCursorPosition; + + sPSSData->field_CD2 = 0; + sPSSData->field_CD3 = 0; + sPSSData->field_CD7 = 0; + retVal = 0; + if (!(gMain.newAndRepeatedKeys & DPAD_UP)) + { + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + retVal = TRUE; + cursorPosition += IN_BOX_ROWS; + if (cursorPosition >= IN_BOX_COUNT) + { + cursorArea = CURSOR_AREA_BUTTONS; + cursorPosition -= IN_BOX_COUNT; + cursorPosition /= 3; + sPSSData->field_CD2 = 1; + sPSSData->field_CD7 = 1; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + retVal = TRUE; + if (sBoxCursorPosition % IN_BOX_ROWS != 0) + { + cursorPosition--; + } + else + { + sPSSData->field_CD3 = -1; + cursorPosition += (IN_BOX_ROWS - 1); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + retVal = TRUE; + if ((sBoxCursorPosition + 1) % IN_BOX_ROWS != 0) + { + cursorPosition++; + } + else + { + sPSSData->field_CD3 = 1; + cursorPosition -= (IN_BOX_ROWS - 1); + } + } + else if (gMain.newKeys & START_BUTTON) + { + retVal = TRUE; + cursorArea = CURSOR_AREA_BOX; + cursorPosition = 0; + } + else + { + if ((gMain.newKeys & A_BUTTON) && sub_80CFA5C()) + { + if (!sCanOnlyMove) + return 8; + + if (sPSSData->boxOption == BOX_OPTION_MOVE_MONS || sIsMonBeingMoved == TRUE) + { + switch (sub_80CFF98(0)) + { + case 1: + return 11; + case 2: + return 12; + case 3: + return 13; + case 4: + return 14; + case 5: + return 15; + case 12: + return 16; + case 13: + return 17; + case 15: + return 18; + } + } + else + { + sPSSData->inBoxMovingMode = 1; + return 20; + } + } + + if (gMain.newKeys & B_BUTTON) + return 19; + + if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.heldKeys & L_BUTTON) + return 10; + if (gMain.heldKeys & R_BUTTON) + return 9; + } + + if (gMain.newKeys & SELECT_BUTTON) + { + sub_80CFDC4(); + return 0; + } + retVal = FALSE; + } + } + else + { + retVal = TRUE; + if (sBoxCursorPosition >= IN_BOX_ROWS) + { + cursorPosition -= IN_BOX_ROWS; + } + else + { + cursorArea = CURSOR_AREA_BOX; + cursorPosition = 0; + } + } + + if (retVal) + sub_80CD894(cursorArea, cursorPosition); + + return retVal; +} +#else +NAKED +static u8 InBoxInput_Normal(void) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + ldr r0, =sBoxCursorArea\n\ + ldrb r0, [r0]\n\ + mov r8, r0\n\ + ldr r2, =sBoxCursorPosition\n\ + ldrb r4, [r2]\n\ + ldr r5, =sPSSData\n\ + ldr r0, [r5]\n\ + ldr r1, =0x00000cd2\n\ + mov r10, r1\n\ + add r0, r10\n\ + movs r1, 0\n\ + strb r1, [r0]\n\ + ldr r0, [r5]\n\ + ldr r7, =0x00000cd3\n\ + adds r0, r7\n\ + strb r1, [r0]\n\ + ldr r0, [r5]\n\ + ldr r3, =0x00000cd7\n\ + mov r9, r3\n\ + add r0, r9\n\ + strb r1, [r0]\n\ + ldr r6, =gMain\n\ + ldrh r1, [r6, 0x30]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + adds r3, r2, 0\n\ + cmp r0, 0\n\ + beq _080CF14C\n\ + b _080CF33C\n\ +_080CF14C:\n\ + movs r0, 0x80\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF1A8\n\ + movs r6, 0x1\n\ + lsls r0, r4, 24\n\ + movs r1, 0xC0\n\ + lsls r1, 19\n\ + adds r0, r1\n\ + lsrs r4, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x1D\n\ + bgt _080CF168\n\ + b _080CF358\n\ +_080CF168:\n\ + movs r2, 0x3\n\ + mov r8, r2\n\ + subs r0, 0x1E\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + movs r1, 0x3\n\ + bl __divsi3\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + ldr r0, [r5]\n\ + add r0, r10\n\ + strb r6, [r0]\n\ + ldr r0, [r5]\n\ + add r0, r9\n\ + strb r6, [r0]\n\ + b _080CF358\n\ + .pool\n\ +_080CF1A8:\n\ + movs r0, 0x20\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF1DE\n\ + movs r6, 0x1\n\ + movs r0, 0\n\ + ldrsb r0, [r3, r0]\n\ + movs r1, 0x6\n\ + bl __modsi3\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080CF1CA\n\ + lsls r0, r4, 24\n\ + movs r3, 0xFF\n\ + lsls r3, 24\n\ + b _080CF34C\n\ +_080CF1CA:\n\ + ldr r0, [r5]\n\ + adds r0, r7\n\ + movs r1, 0xFF\n\ + strb r1, [r0]\n\ + lsls r0, r4, 24\n\ + movs r1, 0xA0\n\ + lsls r1, 19\n\ + adds r0, r1\n\ + lsrs r4, r0, 24\n\ + b _080CF358\n\ +_080CF1DE:\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF212\n\ + movs r6, 0x1\n\ + movs r0, 0\n\ + ldrsb r0, [r3, r0]\n\ + adds r0, 0x1\n\ + movs r1, 0x6\n\ + bl __modsi3\n\ + cmp r0, 0\n\ + beq _080CF204\n\ + lsls r0, r4, 24\n\ + movs r2, 0x80\n\ + lsls r2, 17\n\ + adds r0, r2\n\ + lsrs r4, r0, 24\n\ + b _080CF358\n\ +_080CF204:\n\ + ldr r0, [r5]\n\ + adds r0, r7\n\ + strb r6, [r0]\n\ + lsls r0, r4, 24\n\ + movs r3, 0xFB\n\ + lsls r3, 24\n\ + b _080CF34C\n\ +_080CF212:\n\ + ldrh r1, [r6, 0x2E]\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF220\n\ + movs r6, 0x1\n\ + b _080CF352\n\ +_080CF220:\n\ + movs r4, 0x1\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF2E4\n\ + bl sub_80CFA5C\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080CF2E4\n\ + ldr r0, =sCanOnlyMove\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _080CF244\n\ + movs r0, 0x8\n\ + b _080CF366\n\ + .pool\n\ +_080CF244:\n\ + ldr r1, [r5]\n\ + ldrb r0, [r1, 0x1]\n\ + cmp r0, 0x2\n\ + bne _080CF254\n\ + ldr r0, =sIsMonBeingMoved\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + bne _080CF2D4\n\ +_080CF254:\n\ + movs r0, 0\n\ + bl sub_80CFF98\n\ + subs r0, 0x1\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0xE\n\ + bhi _080CF2E4\n\ + lsls r0, 2\n\ + ldr r1, =_080CF278\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .pool\n\ + .align 2, 0\n\ +_080CF278:\n\ + .4byte _080CF2B4\n\ + .4byte _080CF2B8\n\ + .4byte _080CF2BC\n\ + .4byte _080CF2C0\n\ + .4byte _080CF2C4\n\ + .4byte _080CF2E4\n\ + .4byte _080CF2E4\n\ + .4byte _080CF2E4\n\ + .4byte _080CF2E4\n\ + .4byte _080CF2E4\n\ + .4byte _080CF2E4\n\ + .4byte _080CF2C8\n\ + .4byte _080CF2CC\n\ + .4byte _080CF2E4\n\ + .4byte _080CF2D0\n\ +_080CF2B4:\n\ + movs r0, 0xB\n\ + b _080CF366\n\ +_080CF2B8:\n\ + movs r0, 0xC\n\ + b _080CF366\n\ +_080CF2BC:\n\ + movs r0, 0xD\n\ + b _080CF366\n\ +_080CF2C0:\n\ + movs r0, 0xE\n\ + b _080CF366\n\ +_080CF2C4:\n\ + movs r0, 0xF\n\ + b _080CF366\n\ +_080CF2C8:\n\ + movs r0, 0x10\n\ + b _080CF366\n\ +_080CF2CC:\n\ + movs r0, 0x11\n\ + b _080CF366\n\ +_080CF2D0:\n\ + movs r0, 0x12\n\ + b _080CF366\n\ +_080CF2D4:\n\ + ldr r2, =0x000021ff\n\ + adds r0, r1, r2\n\ + strb r4, [r0]\n\ + movs r0, 0x14\n\ + b _080CF366\n\ + .pool\n\ +_080CF2E4:\n\ + ldr r2, =gMain\n\ + ldrh r1, [r2, 0x2E]\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF2F8\n\ + movs r0, 0x13\n\ + b _080CF366\n\ + .pool\n\ +_080CF2F8:\n\ + ldr r0, =gSaveBlock2Ptr\n\ + ldr r0, [r0]\n\ + ldrb r0, [r0, 0x13]\n\ + cmp r0, 0x1\n\ + bne _080CF326\n\ + ldrh r1, [r2, 0x2C]\n\ + movs r0, 0x80\n\ + lsls r0, 2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF318\n\ + movs r0, 0xA\n\ + b _080CF366\n\ + .pool\n\ +_080CF318:\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF326\n\ + movs r0, 0x9\n\ + b _080CF366\n\ +_080CF326:\n\ + ldrh r1, [r2, 0x2E]\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF338\n\ + bl sub_80CFDC4\n\ + movs r0, 0\n\ + b _080CF366\n\ +_080CF338:\n\ + movs r6, 0\n\ + b _080CF364\n\ +_080CF33C:\n\ + movs r6, 0x1\n\ + movs r0, 0\n\ + ldrsb r0, [r2, r0]\n\ + cmp r0, 0x5\n\ + ble _080CF352\n\ + lsls r0, r4, 24\n\ + movs r3, 0xFA\n\ + lsls r3, 24\n\ +_080CF34C:\n\ + adds r0, r3\n\ + lsrs r4, r0, 24\n\ + b _080CF358\n\ +_080CF352:\n\ + movs r0, 0x2\n\ + mov r8, r0\n\ + movs r4, 0\n\ +_080CF358:\n\ + cmp r6, 0\n\ + beq _080CF364\n\ + mov r0, r8\n\ + adds r1, r4, 0\n\ + bl sub_80CD894\n\ +_080CF364:\n\ + adds r0, r6, 0\n\ +_080CF366:\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + "); +} +#endif + +static u8 InBoxInput_GrabbingMultiple(void) +{ + if (gMain.heldKeys & A_BUTTON) + { + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (sBoxCursorPosition / IN_BOX_ROWS != 0) + { + sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - IN_BOX_ROWS); + return 21; + } + else + { + return 24; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (sBoxCursorPosition + IN_BOX_ROWS < IN_BOX_COUNT) + { + sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + IN_BOX_ROWS); + return 21; + } + else + { + return 24; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + if (sBoxCursorPosition % IN_BOX_ROWS != 0) + { + sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - 1); + return 21; + } + else + { + return 24; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if ((sBoxCursorPosition + 1) % IN_BOX_ROWS != 0) + { + sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + 1); + return 21; + } + else + { + return 24; + } + } + else + { + return 0; + } + } + else + { + if (sub_80D0BA4() == sBoxCursorPosition) + { + sPSSData->inBoxMovingMode = 0; + sPSSData->field_CB8->invisible = FALSE; + return 22; + } + else + { + sIsMonBeingMoved = (sPSSData->cursorMonSpecies != SPECIES_NONE); + sPSSData->inBoxMovingMode = 2; + sMovingMonOrigBoxId = StorageGetCurrentBox(); + return 23; + } + } +} + +static u8 InBoxInput_MovingMultiple(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (sub_80D0580(0)) + { + sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - IN_BOX_ROWS); + return 25; + } + else + { + return 24; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (sub_80D0580(1)) + { + sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + IN_BOX_ROWS); + return 25; + } + else + { + return 24; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + if (sub_80D0580(2)) + { + sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - 1); + return 25; + } + else + { + return 10; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (sub_80D0580(3)) + { + sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + 1); + return 25; + } + else + { + return 9; + } + } + else if (gMain.newKeys & A_BUTTON) + { + if (sub_80D0BC0()) + { + sIsMonBeingMoved = FALSE; + sPSSData->inBoxMovingMode = 0; + return 26; + } + else + { + return 24; + } + } + else if (gMain.newKeys & B_BUTTON) + { + return 24; + } + else + { + if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.heldKeys & L_BUTTON) + return 10; + if (gMain.heldKeys & R_BUTTON) + return 9; + } + + return 0; + } +} + +#ifdef NONMATCHING +static u8 HandleInput_InParty(void) +{ + u8 retVal; + bool8 gotoBox; + s8 cursorArea = sBoxCursorArea; + s8 cursorPosition = sBoxCursorPosition; + + sPSSData->field_CD3 = 0; + sPSSData->field_CD2 = 0; + sPSSData->field_CD7 = 0; + gotoBox = FALSE; + retVal = 0; + + if (!(gMain.newAndRepeatedKeys & DPAD_UP)) + { + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (++cursorPosition > PARTY_SIZE) + cursorPosition = 0; + if (cursorPosition != sBoxCursorPosition) + retVal = 1; + } + else if ((gMain.newAndRepeatedKeys & DPAD_LEFT) && sBoxCursorPosition != 0) + { + retVal = 1; + sPSSData->field_CD6 = sBoxCursorPosition; + cursorPosition = 0; + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (sBoxCursorPosition == 0) + { + retVal = 1; + cursorPosition = sPSSData->field_CD6; + } + else + { + retVal = 6; + cursorArea = CURSOR_AREA_IN_BOX; + cursorPosition = 0; + } + } + else + { + if (gMain.newKeys & A_BUTTON) + { + if (sBoxCursorPosition == PARTY_SIZE) + { + if (sPSSData->boxOption == BOX_OPTION_DEPOSIT) + return 4; + + gotoBox = TRUE; + } + else if (sub_80CFA5C()) + { + if (!sCanOnlyMove) + return 8; + + switch (sub_80CFF98(0)) + { + case 1: + return 11; + case 2: + return 12; + case 3: + return 13; + case 4: + return 14; + case 5: + return 15; + case 12: + return 16; + case 13: + return 17; + case 15: + return 18; + } + } + } + + if (gMain.newKeys & B_BUTTON) + { + if (sPSSData->boxOption == BOX_OPTION_DEPOSIT) + return 19; + + gotoBox = TRUE; + } + + if (gotoBox) + { + retVal = 6; + cursorArea = CURSOR_AREA_IN_BOX; + cursorPosition = 0; + } + else if (gMain.newKeys & SELECT_BUTTON) + { + sub_80CFDC4(); + return 0; + } + } + } + else + { + if (--cursorPosition < 0) + cursorPosition = PARTY_SIZE; + if (cursorPosition != sBoxCursorPosition) + retVal = 1; + } + if (retVal != 0) + { + if (retVal != 6) + sub_80CD894(cursorArea, cursorPosition); + } + + return retVal; +} +#else +NAKED +static u8 HandleInput_InParty(void) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + ldr r0, =sBoxCursorArea\n\ + ldrb r0, [r0]\n\ + mov r9, r0\n\ + ldr r6, =sBoxCursorPosition\n\ + ldrb r4, [r6]\n\ + ldr r2, =sPSSData\n\ + ldr r0, [r2]\n\ + ldr r1, =0x00000cd3\n\ + adds r0, r1\n\ + movs r1, 0\n\ + strb r1, [r0]\n\ + ldr r0, [r2]\n\ + ldr r3, =0x00000cd2\n\ + adds r0, r3\n\ + strb r1, [r0]\n\ + ldr r0, [r2]\n\ + adds r3, 0x5\n\ + adds r0, r3\n\ + strb r1, [r0]\n\ + mov r8, r1\n\ + movs r7, 0\n\ + ldr r1, =gMain\n\ + ldrh r3, [r1, 0x30]\n\ + movs r0, 0x40\n\ + ands r0, r3\n\ + adds r5, r6, 0\n\ + mov r12, r1\n\ + cmp r0, 0\n\ + beq _080CF608\n\ + b _080CF7A8\n\ +_080CF608:\n\ + movs r0, 0x80\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _080CF64C\n\ + lsls r0, r4, 24\n\ + movs r1, 0x80\n\ + lsls r1, 17\n\ + adds r0, r1\n\ + lsrs r4, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x6\n\ + ble _080CF622\n\ + movs r4, 0\n\ +_080CF622:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + movs r1, 0\n\ + ldrsb r1, [r5, r1]\n\ + cmp r0, r1\n\ + bne _080CF630\n\ + b _080CF7C6\n\ +_080CF630:\n\ + movs r7, 0x1\n\ + b _080CF7CA\n\ + .pool\n\ +_080CF64C:\n\ + movs r0, 0x20\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _080CF670\n\ + ldrb r1, [r5]\n\ + movs r0, 0\n\ + ldrsb r0, [r5, r0]\n\ + cmp r0, 0\n\ + beq _080CF670\n\ + movs r7, 0x1\n\ + ldr r0, [r2]\n\ + ldr r2, =0x00000cd6\n\ + adds r0, r2\n\ + strb r1, [r0]\n\ + movs r4, 0\n\ + b _080CF7C6\n\ + .pool\n\ +_080CF670:\n\ + mov r3, r12\n\ + ldrh r1, [r3, 0x30]\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF69E\n\ + movs r0, 0\n\ + ldrsb r0, [r5, r0]\n\ + cmp r0, 0\n\ + bne _080CF694\n\ + movs r7, 0x1\n\ + ldr r0, [r2]\n\ + ldr r1, =0x00000cd6\n\ + adds r0, r1\n\ + ldrb r4, [r0]\n\ + b _080CF7C6\n\ + .pool\n\ +_080CF694:\n\ + movs r7, 0x6\n\ + movs r2, 0\n\ + mov r9, r2\n\ + movs r4, 0\n\ + b _080CF7C6\n\ +_080CF69E:\n\ + mov r3, r12\n\ + ldrh r1, [r3, 0x2E]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF75C\n\ + movs r0, 0\n\ + ldrsb r0, [r5, r0]\n\ + cmp r0, 0x6\n\ + bne _080CF6C4\n\ + ldr r0, [r2]\n\ + ldrb r0, [r0, 0x1]\n\ + cmp r0, 0x1\n\ + bne _080CF6BE\n\ + movs r0, 0x4\n\ + b _080CF7D8\n\ +_080CF6BE:\n\ + movs r0, 0x1\n\ + mov r8, r0\n\ + b _080CF75C\n\ +_080CF6C4:\n\ + bl sub_80CFA5C\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080CF75C\n\ + ldr r0, =sCanOnlyMove\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _080CF6E0\n\ + movs r0, 0x8\n\ + b _080CF7D8\n\ + .pool\n\ +_080CF6E0:\n\ + movs r0, 0\n\ + bl sub_80CFF98\n\ + subs r0, 0x1\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0xE\n\ + bhi _080CF75C\n\ + lsls r0, 2\n\ + ldr r1, =_080CF700\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .pool\n\ + .align 2, 0\n\ +_080CF700:\n\ + .4byte _080CF73C\n\ + .4byte _080CF740\n\ + .4byte _080CF744\n\ + .4byte _080CF748\n\ + .4byte _080CF74C\n\ + .4byte _080CF75C\n\ + .4byte _080CF75C\n\ + .4byte _080CF75C\n\ + .4byte _080CF75C\n\ + .4byte _080CF75C\n\ + .4byte _080CF75C\n\ + .4byte _080CF750\n\ + .4byte _080CF754\n\ + .4byte _080CF75C\n\ + .4byte _080CF758\n\ +_080CF73C:\n\ + movs r0, 0xB\n\ + b _080CF7D8\n\ +_080CF740:\n\ + movs r0, 0xC\n\ + b _080CF7D8\n\ +_080CF744:\n\ + movs r0, 0xD\n\ + b _080CF7D8\n\ +_080CF748:\n\ + movs r0, 0xE\n\ + b _080CF7D8\n\ +_080CF74C:\n\ + movs r0, 0xF\n\ + b _080CF7D8\n\ +_080CF750:\n\ + movs r0, 0x10\n\ + b _080CF7D8\n\ +_080CF754:\n\ + movs r0, 0x11\n\ + b _080CF7D8\n\ +_080CF758:\n\ + movs r0, 0x12\n\ + b _080CF7D8\n\ +_080CF75C:\n\ + ldr r2, =gMain\n\ + ldrh r1, [r2, 0x2E]\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + mov r12, r2\n\ + cmp r0, 0\n\ + beq _080CF784\n\ + ldr r0, =sPSSData\n\ + ldr r0, [r0]\n\ + ldrb r0, [r0, 0x1]\n\ + cmp r0, 0x1\n\ + bne _080CF780\n\ + movs r0, 0x13\n\ + b _080CF7D8\n\ + .pool\n\ +_080CF780:\n\ + movs r1, 0x1\n\ + mov r8, r1\n\ +_080CF784:\n\ + mov r2, r8\n\ + cmp r2, 0\n\ + beq _080CF794\n\ + movs r7, 0x6\n\ + movs r3, 0\n\ + mov r9, r3\n\ + movs r4, 0\n\ + b _080CF7C6\n\ +_080CF794:\n\ + mov r0, r12\n\ + ldrh r1, [r0, 0x2E]\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF7C6\n\ + bl sub_80CFDC4\n\ + movs r0, 0\n\ + b _080CF7D8\n\ +_080CF7A8:\n\ + lsls r0, r4, 24\n\ + movs r1, 0xFF\n\ + lsls r1, 24\n\ + adds r0, r1\n\ + lsrs r4, r0, 24\n\ + cmp r0, 0\n\ + bge _080CF7B8\n\ + movs r4, 0x6\n\ +_080CF7B8:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + movs r1, 0\n\ + ldrsb r1, [r6, r1]\n\ + cmp r0, r1\n\ + beq _080CF7C6\n\ + movs r7, 0x1\n\ +_080CF7C6:\n\ + cmp r7, 0\n\ + beq _080CF7D6\n\ +_080CF7CA:\n\ + cmp r7, 0x6\n\ + beq _080CF7D6\n\ + mov r0, r9\n\ + adds r1, r4, 0\n\ + bl sub_80CD894\n\ +_080CF7D6:\n\ + adds r0, r7, 0\n\ +_080CF7D8:\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1"); +} +#endif + +#ifdef NONMATCHING +static u8 HandleInput_OnBox(void) +{ + u8 retVal; + s8 cursorArea = sBoxCursorArea; + s8 cursorPosition = sBoxCursorPosition; + + sPSSData->field_CD3 = 0; + sPSSData->field_CD2 = 0; + sPSSData->field_CD7 = 0; + retVal = 0; + + if (!(gMain.newAndRepeatedKeys & DPAD_UP)) + { + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + retVal = 1; + cursorArea = CURSOR_AREA_IN_BOX; + cursorPosition = 2; + } + else + { + if (gMain.heldKeys & DPAD_LEFT) + return 10; + if (gMain.heldKeys & DPAD_RIGHT) + return 9; + + if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.heldKeys & L_BUTTON) + return 10; + if (gMain.heldKeys & R_BUTTON) + return 9; + } + + if (gMain.newKeys & A_BUTTON) + { + sub_80CD1A8(FALSE); + AddBoxMenu(); + return 7; + } + + if (gMain.newKeys & B_BUTTON) + return 19; + + if (gMain.newKeys & SELECT_BUTTON) + { + sub_80CFDC4(); + return 0; + } + + retVal = 0; + } + } + else + { + retVal = 1; + cursorArea = CURSOR_AREA_BUTTONS; + cursorPosition = 0; + sPSSData->field_CD7 = 1; + } + + if (retVal) + { + if (cursorArea != CURSOR_AREA_BOX) + sub_80CD1A8(FALSE); + sub_80CD894(cursorArea, cursorPosition); + } + + return retVal; +} +#else +NAKED +static u8 HandleInput_OnBox(void) +{ + asm_unified("\n\ + push {r4-r6,lr}\n\ + ldr r3, =sPSSData\n\ + ldr r0, [r3]\n\ + ldr r1, =0x00000cd3\n\ + adds r0, r1\n\ + movs r1, 0\n\ + strb r1, [r0]\n\ + ldr r0, [r3]\n\ + ldr r2, =0x00000cd2\n\ + adds r0, r2\n\ + strb r1, [r0]\n\ + ldr r0, [r3]\n\ + ldr r5, =0x00000cd7\n\ + adds r0, r5\n\ + strb r1, [r0]\n\ + ldr r1, =gMain\n\ + ldrh r2, [r1, 0x30]\n\ + movs r0, 0x40\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _080CF8AA\n\ + movs r0, 0x80\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _080CF834\n\ + movs r4, 0x1\n\ + movs r1, 0\n\ + movs r6, 0x2\n\ + b _080CF8B6\n\ + .pool\n\ +_080CF834:\n\ + ldrh r2, [r1, 0x2C]\n\ + movs r0, 0x20\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _080CF85A\n\ + movs r0, 0x10\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _080CF86E\n\ + ldr r0, =gSaveBlock2Ptr\n\ + ldr r0, [r0]\n\ + ldrb r0, [r0, 0x13]\n\ + cmp r0, 0x1\n\ + bne _080CF872\n\ + movs r0, 0x80\n\ + lsls r0, 2\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _080CF864\n\ +_080CF85A:\n\ + movs r0, 0xA\n\ + b _080CF8D2\n\ + .pool\n\ +_080CF864:\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _080CF872\n\ +_080CF86E:\n\ + movs r0, 0x9\n\ + b _080CF8D2\n\ +_080CF872:\n\ + ldrh r1, [r1, 0x2E]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF88A\n\ + movs r0, 0\n\ + bl sub_80CD1A8\n\ + bl AddBoxMenu\n\ + movs r0, 0x7\n\ + b _080CF8D2\n\ +_080CF88A:\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF896\n\ + movs r0, 0x13\n\ + b _080CF8D2\n\ +_080CF896:\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF8A6\n\ + bl sub_80CFDC4\n\ + movs r0, 0\n\ + b _080CF8D2\n\ +_080CF8A6:\n\ + movs r4, 0\n\ + b _080CF8D0\n\ +_080CF8AA:\n\ + movs r4, 0x1\n\ + movs r1, 0x3\n\ + movs r6, 0\n\ + ldr r0, [r3]\n\ + adds r0, r5\n\ + strb r4, [r0]\n\ +_080CF8B6:\n\ + cmp r4, 0\n\ + beq _080CF8D0\n\ + lsls r5, r1, 24\n\ + cmp r1, 0x2\n\ + beq _080CF8C6\n\ + movs r0, 0\n\ + bl sub_80CD1A8\n\ +_080CF8C6:\n\ + lsrs r0, r5, 24\n\ + lsls r1, r6, 24\n\ + lsrs r1, 24\n\ + bl sub_80CD894\n\ +_080CF8D0:\n\ + adds r0, r4, 0\n\ +_080CF8D2:\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + "); +} +#endif + +#ifdef NONMATCHING +static u8 HandleInput_OnButtons(void) +{ + u8 retVal; + s8 cursorArea = sBoxCursorArea; + s8 cursorPosition = sBoxCursorPosition; + + sPSSData->field_CD3 = 0; + sPSSData->field_CD2 = 0; + sPSSData->field_CD7 = 0; + + if (!(gMain.newAndRepeatedKeys & DPAD_UP)) + { + if (gMain.newAndRepeatedKeys & (DPAD_DOWN | START_BUTTON)) + { + retVal = 1; + cursorArea = CURSOR_AREA_BOX; + cursorPosition = 0; + sPSSData->field_CD7 = 1; + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + retVal = 1; + if (--cursorPosition < 0) + { + cursorPosition = 1; + } + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + retVal = 1; + if (++cursorPosition > 1) + { + cursorPosition = 0; + } + } + else if (gMain.newKeys & A_BUTTON) + { + return (cursorPosition == 0) ? 5 : 4; + } + else if (gMain.newKeys & B_BUTTON) + { + return 19; + } + else if (gMain.newKeys & SELECT_BUTTON) + { + sub_80CFDC4(); + return 0; + } + else + { + retVal = 0; + } + } + else + { + retVal = 1; + cursorArea = CURSOR_AREA_IN_BOX; + sPSSData->field_CD2 = -1; + cursorPosition = (sBoxCursorPosition == 0) ? IN_BOX_COUNT - 1 - 5 : IN_BOX_COUNT - 1; + sPSSData->field_CD7 = 1; + } + + if (retVal != 0) + { + sub_80CD894(cursorArea, cursorPosition); + } + + return retVal; +} +#else +NAKED +static u8 HandleInput_OnButtons(void) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + ldr r0, =sBoxCursorArea\n\ + ldrb r0, [r0]\n\ + mov r8, r0\n\ + ldr r0, =sBoxCursorPosition\n\ + mov r12, r0\n\ + ldrb r2, [r0]\n\ + ldr r3, =sPSSData\n\ + ldr r0, [r3]\n\ + ldr r1, =0x00000cd3\n\ + adds r0, r1\n\ + movs r1, 0\n\ + strb r1, [r0]\n\ + ldr r0, [r3]\n\ + ldr r6, =0x00000cd2\n\ + adds r0, r6\n\ + strb r1, [r0]\n\ + ldr r0, [r3]\n\ + ldr r5, =0x00000cd7\n\ + adds r0, r5\n\ + strb r1, [r0]\n\ + ldr r7, =gMain\n\ + ldrh r1, [r7, 0x30]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + adds r4, r3, 0\n\ + cmp r0, 0\n\ + bne _080CF9B2\n\ + movs r0, 0x88\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF944\n\ + movs r7, 0x1\n\ + movs r0, 0x2\n\ + mov r8, r0\n\ + movs r2, 0\n\ + ldr r0, [r4]\n\ + b _080CF9D0\n\ + .pool\n\ +_080CF944:\n\ + movs r0, 0x20\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF960\n\ + movs r7, 0x1\n\ + lsls r0, r2, 24\n\ + movs r1, 0xFF\n\ + lsls r1, 24\n\ + adds r0, r1\n\ + lsrs r2, r0, 24\n\ + cmp r0, 0\n\ + bge _080CF9D4\n\ + movs r2, 0x1\n\ + b _080CF9D4\n\ +_080CF960:\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF97E\n\ + movs r7, 0x1\n\ + lsls r0, r2, 24\n\ + movs r1, 0x80\n\ + lsls r1, 17\n\ + adds r0, r1\n\ + lsrs r2, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x1\n\ + ble _080CF9D4\n\ + movs r2, 0\n\ + b _080CF9D4\n\ +_080CF97E:\n\ + ldrh r1, [r7, 0x2E]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF992\n\ + movs r0, 0x4\n\ + cmp r2, 0\n\ + bne _080CF9E2\n\ + movs r0, 0x5\n\ + b _080CF9E2\n\ +_080CF992:\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF99E\n\ + movs r0, 0x13\n\ + b _080CF9E2\n\ +_080CF99E:\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080CF9AE\n\ + bl sub_80CFDC4\n\ + movs r0, 0\n\ + b _080CF9E2\n\ +_080CF9AE:\n\ + movs r7, 0\n\ + b _080CF9E0\n\ +_080CF9B2:\n\ + movs r7, 0x1\n\ + movs r0, 0\n\ + mov r8, r0\n\ + ldr r0, [r3]\n\ + adds r0, r6\n\ + movs r1, 0xFF\n\ + strb r1, [r0]\n\ + mov r1, r12\n\ + movs r0, 0\n\ + ldrsb r0, [r1, r0]\n\ + movs r2, 0x1D\n\ + cmp r0, 0\n\ + bne _080CF9CE\n\ + movs r2, 0x18\n\ +_080CF9CE:\n\ + ldr r0, [r3]\n\ +_080CF9D0:\n\ + adds r0, r5\n\ + strb r7, [r0]\n\ +_080CF9D4:\n\ + cmp r7, 0\n\ + beq _080CF9E0\n\ + mov r0, r8\n\ + adds r1, r2, 0\n\ + bl sub_80CD894\n\ +_080CF9E0:\n\ + adds r0, r7, 0\n\ +_080CF9E2:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1"); +} +#endif + +static u8 HandleInput(void) +{ + struct + { + u8 (*func)(void); + s8 area; + } + static const inputFuncs[] = + { + {HandleInput_InBox, CURSOR_AREA_IN_BOX}, + {HandleInput_InParty, CURSOR_AREA_IN_PARTY}, + {HandleInput_OnBox, CURSOR_AREA_BOX}, + {HandleInput_OnButtons, CURSOR_AREA_BUTTONS}, + {NULL, 0}, + }; + + u16 i = 0; + while (inputFuncs[i].func != NULL) + { + if (inputFuncs[i].area == sBoxCursorArea) + return inputFuncs[i].func(); + i++; + } + + return 0; +} + +static void AddBoxMenu(void) +{ + InitMenu(); + SetMenuText(9); + SetMenuText(10); + SetMenuText(11); + SetMenuText(0); +} + +static u8 sub_80CFA5C(void) +{ + InitMenu(); + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + return sub_80CFA84(); + else + return sub_80CFB44(); +} + +static bool8 sub_80CFA84(void) +{ + u16 var0 = sub_80CD504(); + + switch (sPSSData->boxOption) + { + case BOX_OPTION_DEPOSIT: + if (var0) + SetMenuText(1); + else + return FALSE; + break; + case BOX_OPTION_WITHDRAW: + if (var0) + SetMenuText(2); + else + return FALSE; + break; + case BOX_OPTION_MOVE_MONS: + if (sIsMonBeingMoved) + { + if (var0) + SetMenuText(4); + else + SetMenuText(5); + } + else + { + if (var0) + SetMenuText(3); + else + return FALSE; + } + break; + case BOX_OPTION_MOVE_ITEMS: + default: + return FALSE; + } + + SetMenuText(6); + if (sPSSData->boxOption == BOX_OPTION_MOVE_MONS) + { + if (!sBoxCursorArea) + SetMenuText(2); + else + SetMenuText(1); + } + + SetMenuText(8); + SetMenuText(7); + SetMenuText(0); + return TRUE; +} + +static bool8 sub_80CFB44(void) +{ + if (sPSSData->cursorMonSpecies == SPECIES_EGG) + return FALSE; + + if (!IsActiveItemMoving()) + { + if (sPSSData->cursorMonItem == 0) + { + if (sPSSData->cursorMonSpecies == SPECIES_NONE) + return FALSE; + + SetMenuText(14); + } + else + { + if (!ItemIsMail(sPSSData->cursorMonItem)) + { + SetMenuText(12); + SetMenuText(16); + } + SetMenuText(17); + } + } + else + { + if (sPSSData->cursorMonItem == 0) + { + if (sPSSData->cursorMonSpecies == SPECIES_NONE) + return FALSE; + + SetMenuText(13); + } + else + { + if (ItemIsMail(sPSSData->cursorMonItem) == TRUE) + return FALSE; + + SetMenuText(15); + } + } + + SetMenuText(0); + return TRUE; +} + +static void sub_80CFBF4(struct Sprite *sprite) +{ + sprite->pos1.x = sPSSData->field_CB4->pos1.x; + sprite->pos1.y = sPSSData->field_CB4->pos1.y + 20; +} + +static void sub_80CFC14(void) +{ + u16 x, y; + u8 spriteId; + u8 priority, subpriority; + struct SpriteSheet spriteSheets[] = + { + {gHandCursorTiles, 0x800, 0}, + {gHandCursorShadowTiles, 0x80, 1}, + {} + }; + + struct SpritePalette spritePalettes[] = + { + {gHandCursorPalette, TAG_PAL_DAC7}, + {} + }; + + static const struct OamData sOamData_857BA0C = + { + .size = 2, + .priority = 1, + }; + static const struct OamData sOamData_857BA14 = + { + .size = 1, + .priority = 1, + }; + + static const union AnimCmd sSpriteAnim_857BA1C[] = + { + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(16, 30), + ANIMCMD_JUMP(0) + }; + static const union AnimCmd sSpriteAnim_857BA28[] = + { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END + }; + static const union AnimCmd sSpriteAnim_857BA30[] = + { + ANIMCMD_FRAME(32, 5), + ANIMCMD_END + }; + static const union AnimCmd sSpriteAnim_857BA38[] = + { + ANIMCMD_FRAME(48, 5), + ANIMCMD_END + }; + + static const union AnimCmd *const sSpriteAnimTable_857BA40[] = + { + sSpriteAnim_857BA1C, + sSpriteAnim_857BA28, + sSpriteAnim_857BA30, + sSpriteAnim_857BA38 + }; + + static const struct SpriteTemplate gSpriteTemplate_857BA50 = + { + .tileTag = TAG_TILE_0, + .paletteTag = TAG_PAL_WAVEFORM, + .oam = &sOamData_857BA0C, + .anims = sSpriteAnimTable_857BA40, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, + }; + + static const struct SpriteTemplate gSpriteTemplate_857BA68 = + { + .tileTag = TAG_TILE_1, + .paletteTag = TAG_PAL_WAVEFORM, + .oam = &sOamData_857BA14, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CFBF4, + }; + + LoadSpriteSheets(spriteSheets); + LoadSpritePalettes(spritePalettes); + sPSSData->field_CD8[0] = IndexOfSpritePaletteTag(TAG_PAL_WAVEFORM); + sPSSData->field_CD8[1] = IndexOfSpritePaletteTag(TAG_PAL_DAC7); + + sub_80CD444(sBoxCursorArea, sBoxCursorPosition, &x, &y); + spriteId = CreateSprite(&gSpriteTemplate_857BA50, x, y, 6); + if (spriteId != MAX_SPRITES) + { + sPSSData->field_CB4 = &gSprites[spriteId]; + sPSSData->field_CB4->oam.paletteNum = sPSSData->field_CD8[sCanOnlyMove]; + sPSSData->field_CB4->oam.priority = 1; + if (sIsMonBeingMoved) + StartSpriteAnim(sPSSData->field_CB4, 3); + } + else + { + sPSSData->field_CB4 = NULL; + } + + if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) + { + subpriority = 13; + priority = 1; + } + else + { + subpriority = 21; + priority = 2; + } + + spriteId = CreateSprite(&gSpriteTemplate_857BA68, 0, 0, subpriority); + if (spriteId != MAX_SPRITES) + { + sPSSData->field_CB8 = &gSprites[spriteId]; + sPSSData->field_CB8->oam.priority = priority; + if (sBoxCursorArea) + sPSSData->field_CB8->invisible = 1; + } + else + { + sPSSData->field_CB8 = NULL; + } +} + +static void sub_80CFDC4(void) +{ + sCanOnlyMove = !sCanOnlyMove; + sPSSData->field_CB4->oam.paletteNum = sPSSData->field_CD8[sCanOnlyMove]; +} + +static u8 GetBoxCursorPosition(void) +{ + return sBoxCursorPosition; +} + +static void sub_80CFE14(u8 *arg0, u8 *arg1) +{ + if (sBoxCursorArea == CURSOR_AREA_IN_BOX) + { + *arg0 = sBoxCursorPosition % IN_BOX_ROWS; + *arg1 = sBoxCursorPosition / IN_BOX_ROWS; + } + else + { + *arg0 = 0; + *arg1 = 0; + } +} + +static void sub_80CFE54(u8 animNum) +{ + StartSpriteAnim(sPSSData->field_CB4, animNum); +} + +static u8 sub_80CFE78(void) +{ + return sMovingMonOrigBoxId; +} + +static void sub_80CFE84(void) +{ + sPSSData->field_CB4->oam.priority = 1; +} + +static void sub_80CFEA8(void) +{ + if (sBoxCursorArea == CURSOR_AREA_IN_BOX) + sub_80D0E50(CURSOR_AREA_IN_BOX, sBoxCursorPosition); +} + +static void sub_80CFECC(void) +{ + if (sBoxCursorArea == CURSOR_AREA_IN_BOX) + sub_80D0D8C(CURSOR_AREA_IN_BOX, sBoxCursorPosition); +} + +static void InitMenu(void) +{ + sPSSData->menuItemsCount = 0; + sPSSData->menuWidth = 0; + sPSSData->menuWindow.bg = 0; + sPSSData->menuWindow.paletteNum = 15; + sPSSData->menuWindow.baseBlock = 92; +} + +static const u8 *const gUnknown_0857BA80[] = +{ + gPCText_Cancel, + gPCText_Store, + gPCText_Withdraw, + gPCText_Move, + gPCText_Shift, + gPCText_Place, + gPCText_Summary, + gPCText_Release, + gPCText_Mark, + gPCText_Jump, + gPCText_Wallpaper, + gPCText_Name, + gPCText_Take, + gPCText_Give, + gPCText_Give, + gPCText_Switch, + gPCText_Bag, + gPCText_Info, + gPCText_Scenery1, + gPCText_Scenery2, + gPCText_Scenery3, + gPCText_Etcetera, + gPCText_Friends, + gPCText_Forest, + gPCText_City, + gPCText_Desert, + gPCText_Savanna, + gPCText_Crag, + gPCText_Volcano, + gPCText_Snow, + gPCText_Cave, + gPCText_Beach, + gPCText_Seafloor, + gPCText_River, + gPCText_Sky, + gPCText_PolkaDot, + gPCText_Pokecenter, + gPCText_Machine, + gPCText_Simple, +}; + +static void SetMenuText(u8 textId) +{ + if (sPSSData->menuItemsCount < 7) + { + u8 len; + struct StorageMenu *menu = &sPSSData->menuItems[sPSSData->menuItemsCount]; + + menu->text = gUnknown_0857BA80[textId]; + menu->textId = textId; + len = StringLength(menu->text); + if (len > sPSSData->menuWidth) + sPSSData->menuWidth = len; + + sPSSData->menuItemsCount++; + } +} + +static s8 sub_80CFF98(u8 arg0) +{ + if (arg0 >= sPSSData->menuItemsCount) + return -1; + else + return sPSSData->menuItems[arg0].textId; +} + +static void AddMenu(void) +{ + sPSSData->menuWindow.width = sPSSData->menuWidth + 2; + sPSSData->menuWindow.height = 2 * sPSSData->menuItemsCount; + sPSSData->menuWindow.tilemapLeft = 29 - sPSSData->menuWindow.width; + sPSSData->menuWindow.tilemapTop = 15 - sPSSData->menuWindow.height; + sPSSData->field_CB0 = AddWindow(&sPSSData->menuWindow); + ClearWindowTilemap(sPSSData->field_CB0); + SetWindowBorderStyle(sPSSData->field_CB0, FALSE, 11, 14); + PrintMenuTable(sPSSData->field_CB0, sPSSData->menuItemsCount, (void*)sPSSData->menuItems); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(sPSSData->field_CB0, sPSSData->menuItemsCount, 0); + schedule_bg_copy_tilemap_to_vram(0); + sPSSData->field_CAE = 0; +} + +static bool8 sub_80D00A8(void) +{ + return FALSE; +} + +static s16 sub_80D00AC(void) +{ + s32 textId = -2; + + if (!(gMain.newKeys & A_BUTTON)) + { + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + textId = -1; + } + + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(1); + } + } + else + { + textId = Menu_GetCursorPos(); + } + + if (textId != -2) + sub_80D013C(); + + if (textId >= 0) + textId = sPSSData->menuItems[textId].textId; + + #ifndef NONMATCHING + asm("":::"r4"); + #endif // NONMATCHING + return textId; +} + +static void sub_80D013C(void) +{ + sub_8198070(sPSSData->field_CB0, TRUE); + RemoveWindow(sPSSData->field_CB0); +} + +// The functions below handle moving and grabbing multiple mons at once. +// The icons are converted to background 0 which coordinates are changed while moving mons. +// There is also a bit of math involved in determining how many column/rows of mons to grab/move. + +static const struct WindowTemplate gUnknown_0857BB1C = +{ + .bg = 0, + .tilemapLeft = 10, + .tilemapTop = 3, + .width = 20, + .height = 18, + .paletteNum = 9, + .baseBlock = 0xA, +}; + +EWRAM_DATA static struct +{ + u8 field_0; + u8 state; + u8 fromRow; + u8 fromColumn; + u8 toRow; + u8 toColumn; + u8 field_6; + u8 field_7; + u8 minRow; + u8 minColumn; + u8 rowsTotal; + u8 columsTotal; + u16 bgX; + u16 bgY; + u16 field_10; + struct BoxPokemon boxMons[IN_BOX_COUNT]; +} +*sMoveMonsPtr = NULL; + +static bool8 sub_80D0164(void) +{ + sMoveMonsPtr = Alloc(sizeof(*sMoveMonsPtr)); + if (sMoveMonsPtr != NULL) + { + sPSSData->field_2200 = AddWindow8Bit(&gUnknown_0857BB1C); + if (sPSSData->field_2200 != 0xFF) + { + FillWindowPixelBuffer(sPSSData->field_2200, 0); + return TRUE; + } + } + + return FALSE; +} + +static void sub_80D01B8(void) +{ + if (sMoveMonsPtr != NULL) + Free(sMoveMonsPtr); +} + +static void sub_80D01D0(u8 arg0) +{ + sMoveMonsPtr->field_0 = arg0; + sMoveMonsPtr->state = 0; +} + +static bool8 sub_80D01E4(void) +{ + switch (sMoveMonsPtr->field_0) + { + case 0: + return sub_80D024C(); + case 1: + return sub_80D0344(); + case 2: + return sub_80D03B0(); + case 3: + return sub_80D0420(); + case 4: + return sub_80D04A0(); + case 5: + return sub_80D04C8(); + } + + return FALSE; +} + +static bool8 sub_80D024C(void) +{ + switch (sMoveMonsPtr->state) + { + case 0: + HideBg(0); + sub_80D304C(0x80); + sMoveMonsPtr->state++; + break; + case 1: + sub_80CFE14(&sMoveMonsPtr->fromRow, &sMoveMonsPtr->fromColumn); + sMoveMonsPtr->toRow = sMoveMonsPtr->fromRow; + sMoveMonsPtr->toColumn = sMoveMonsPtr->fromColumn; + ChangeBgX(0, -1024, 0); + ChangeBgY(0, -1024, 0); + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20); + FillWindowPixelBuffer8Bit(sPSSData->field_2200, 0); + sub_80D07B0(sMoveMonsPtr->fromRow, sMoveMonsPtr->fromColumn); + SetBgAttribute(0, BG_ATTR_PALETTEMODE, 1); + PutWindowTilemap(sPSSData->field_2200); + CopyWindowToVram8Bit(sPSSData->field_2200, 3); + BlendPalettes(0x3F00, 8, RGB_WHITE); + sub_80CFE54(2); + SetGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR); + sMoveMonsPtr->state++; + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + ShowBg(0); + return FALSE; + } + break; + } + + return TRUE; +} + +static bool8 sub_80D0344(void) +{ + switch (sMoveMonsPtr->state) + { + case 0: + HideBg(0); + sMoveMonsPtr->state++; + break; + case 1: + sub_80D0B5C(); + sub_80CFE54(0); + sMoveMonsPtr->state++; + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_80CFE84(); + LoadPalette(stdpal_get(3), 0xD0, 0x20); + ShowBg(0); + return FALSE; + } + break; + } + + return TRUE; +} + +static bool8 sub_80D03B0(void) +{ + switch (sMoveMonsPtr->state) + { + case 0: + if (!sub_80CD554()) + { + sub_80CFE14(&sMoveMonsPtr->field_6, &sMoveMonsPtr->field_7); + sub_80D062C(); + sMoveMonsPtr->toRow = sMoveMonsPtr->field_6; + sMoveMonsPtr->toColumn = sMoveMonsPtr->field_7; + CopyWindowToVram8Bit(sPSSData->field_2200, 2); + sMoveMonsPtr->state++; + } + break; + case 1: + return IsDma3ManagerBusyWithBgCopy(); + } + + return TRUE; +} + +static bool8 sub_80D0420(void) +{ + u8 var1, var2; + + switch (sMoveMonsPtr->state) + { + case 0: + sub_80D08CC(); + sub_80D09A4(); + sub_80CDC64(FALSE); + sMoveMonsPtr->state++; + break; + case 1: + if (!DoMonPlaceChange()) + { + sub_80CFE54(3); + sub_80D0884(0, 256, 8); + sub_80CDC64(TRUE); + sMoveMonsPtr->state++; + } + break; + case 2: + var1 = sub_80D0894(); + var2 = DoMonPlaceChange(); + if (!var1 && !var2) + return FALSE; + break; + } + + return TRUE; +} + +static bool8 sub_80D04A0(void) +{ + u8 var1 = sub_80CD554(); + u8 var2 = sub_80D0894(); + + if (!var1 && !var2) + return FALSE; + else + return TRUE; +} + +static bool8 sub_80D04C8(void) +{ + switch (sMoveMonsPtr->state) + { + case 0: + sub_80D0AAC(); + sub_80D0884(0, -256, 8); + sub_80CDC64(FALSE); + sMoveMonsPtr->state++; + break; + case 1: + if (!DoMonPlaceChange() && !sub_80D0894()) + { + sub_80D0A1C(); + sub_80CFE54(2); + sub_80CDC64(TRUE); + HideBg(0); + sMoveMonsPtr->state++; + } + break; + case 2: + if (!DoMonPlaceChange()) + { + sub_80CFE54(0); + sub_80D0B5C(); + sMoveMonsPtr->state++; + } + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + { + LoadPalette(stdpal_get(3), 0xD0, 0x20); + sub_80CFE84(); + ShowBg(0); + return FALSE; + } + break; + } + + return TRUE; +} + +static bool8 sub_80D0580(u8 arg0) +{ + switch (arg0) + { + case 0: + if (sMoveMonsPtr->minColumn == 0) + return FALSE; + sMoveMonsPtr->minColumn--; + sub_80D0884(0, 1024, 6); + break; + case 1: + if (sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal >= 5) + return FALSE; + sMoveMonsPtr->minColumn++; + sub_80D0884(0, -1024, 6); + break; + case 2: + if (sMoveMonsPtr->minRow == 0) + return FALSE; + sMoveMonsPtr->minRow--; + sub_80D0884(1024, 0, 6); + break; + case 3: + if (sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal > 5) + return FALSE; + sMoveMonsPtr->minRow++; + sub_80D0884(-1024, 0, 6); + break; + } + + return TRUE; +} + +static void sub_80D062C(void) +{ + s16 var = (abs(sMoveMonsPtr->fromRow - sMoveMonsPtr->field_6)) - (abs(sMoveMonsPtr->fromRow - sMoveMonsPtr->toRow)); + s16 var2 = (abs(sMoveMonsPtr->fromColumn - sMoveMonsPtr->field_7)) - (abs(sMoveMonsPtr->fromColumn - sMoveMonsPtr->toColumn)); + + if (var > 0) + sub_80D06D0(sMoveMonsPtr->field_6, sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn); + + if (var < 0) + { + sub_80D0740(sMoveMonsPtr->toRow, sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn); + sub_80D06D0(sMoveMonsPtr->field_6, sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn); + } + + if (var2 > 0) + sub_80D0708(sMoveMonsPtr->field_7, sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow); + + if (var2 < 0) + { + sub_80D0778(sMoveMonsPtr->toColumn, sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow); + sub_80D0708(sMoveMonsPtr->field_7, sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow); + } +} + +static void sub_80D06D0(u8 arg0, u8 arg1, u8 arg2) +{ + u8 var1 = arg1; + + if (arg1 > arg2) + { + arg1 = arg2; + arg2 = var1; + } + + while (arg1 <= arg2) + sub_80D07B0(arg0, arg1++); +} + +static void sub_80D0708(u8 arg0, u8 arg1, u8 arg2) +{ + u8 var1 = arg1; + + if (arg1 > arg2) + { + arg1 = arg2; + arg2 = var1; + } + + while (arg1 <= arg2) + sub_80D07B0(arg1++, arg0); +} + +static void sub_80D0740(u8 arg0, u8 arg1, u8 arg2) +{ + u8 var1 = arg1; + + if (arg1 > arg2) + { + arg1 = arg2; + arg2 = var1; + } + + while (arg1 <= arg2) + sub_80D0834(arg0, arg1++); +} + +static void sub_80D0778(u8 arg0, u8 arg1, u8 arg2) +{ + u8 var1 = arg1; + + if (arg1 > arg2) + { + arg1 = arg2; + arg2 = var1; + } + + while (arg1 <= arg2) + sub_80D0834(arg1++, arg0); +} + +static void sub_80D07B0(u8 arg0, u8 arg1) +{ + u8 position = arg0 + (6 * arg1); + u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2); + u32 personality = GetCurrentBoxMonData(position, MON_DATA_PERSONALITY); + + if (species != SPECIES_NONE) + { + const u8 *iconGfx = GetMonIconPtr(species, personality, 1); + u8 index = GetValidMonIconPalIndex(species) + 8; + + BlitBitmapRectToWindow4BitTo8Bit(sPSSData->field_2200, + iconGfx, + 0, + 0, + 32, + 32, + 24 * arg0, + 24 * arg1, + 32, + 32, + index); + } +} + +static void sub_80D0834(u8 arg0, u8 arg1) +{ + u8 position = arg0 + (6 * arg1); + u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2); + + if (species != SPECIES_NONE) + { + FillWindowPixelRect8Bit(sPSSData->field_2200, + 0, + 24 * arg0, + 24 * arg1, + 32, + 32); + } +} + +static void sub_80D0884(u16 arg0, u16 arg1, u16 arg2) +{ + sMoveMonsPtr->bgX = arg0; + sMoveMonsPtr->bgY = arg1; + sMoveMonsPtr->field_10 = arg2; +} + +static u8 sub_80D0894(void) +{ + if (sMoveMonsPtr->field_10 != 0) + { + ChangeBgX(0, sMoveMonsPtr->bgX, 1); + ChangeBgY(0, sMoveMonsPtr->bgY, 1); + sMoveMonsPtr->field_10--; + } + + return sMoveMonsPtr->field_10; +} + +static void sub_80D08CC(void) +{ + s32 i, j, r8, r9; + s32 rowCount, columnCount; + u8 boxId; + u8 monArrayId; + + sMoveMonsPtr->minRow = min(sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow); + sMoveMonsPtr->minColumn = min(sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn); + sMoveMonsPtr->rowsTotal = abs(sMoveMonsPtr->fromRow - sMoveMonsPtr->toRow) + 1; + sMoveMonsPtr->columsTotal = abs(sMoveMonsPtr->fromColumn - sMoveMonsPtr->toColumn) + 1; + boxId = StorageGetCurrentBox(); + monArrayId = 0; + rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal; + columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal; + for (i = sMoveMonsPtr->minColumn; i < columnCount; i++) + { + u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow; + for (j = sMoveMonsPtr->minRow; j < rowCount; j++) + { + struct BoxPokemon *boxMon = GetBoxedMonPtr(boxId, boxPosition); + + sMoveMonsPtr->boxMons[monArrayId] = *boxMon; + monArrayId++; + boxPosition++; + } + } +} + +static void sub_80D09A4(void) +{ + s32 i, j; + s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal; + s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal; + u8 boxId = StorageGetCurrentBox(); + + for (i = sMoveMonsPtr->minColumn; i < columnCount; i++) + { + u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow; + for (j = sMoveMonsPtr->minRow; j < rowCount; j++) + { + DestroyBoxMonIconAtPosition(boxPosition); + ZeroBoxMonAt(boxId, boxPosition); + boxPosition++; + } + } +} + +static void sub_80D0A1C(void) +{ + s32 i, j; + s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal; + s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal; + u8 monArrayId = 0; + + for (i = sMoveMonsPtr->minColumn; i < columnCount; i++) + { + u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow; + for (j = sMoveMonsPtr->minRow; j < rowCount; j++) + { + if (GetBoxMonData(&sMoveMonsPtr->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)) + sub_80CB140(boxPosition); + monArrayId++; + boxPosition++; + } + } +} + +static void sub_80D0AAC(void) +{ + s32 i, j; + s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal; + s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal; + u8 boxId = StorageGetCurrentBox(); + u8 monArrayId = 0; + + for (i = sMoveMonsPtr->minColumn; i < columnCount; i++) + { + u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow; + for (j = sMoveMonsPtr->minRow; j < rowCount; j++) + { + if (GetBoxMonData(&sMoveMonsPtr->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)) + SetBoxMonAt(boxId, boxPosition, &sMoveMonsPtr->boxMons[monArrayId]); + boxPosition++; + monArrayId++; + } + } +} + +static void sub_80D0B5C(void) +{ + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + SetBgAttribute(0, BG_ATTR_PALETTEMODE, 0); + ClearGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR); + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); + CopyBgTilemapBufferToVram(0); +} + +static u8 sub_80D0BA4(void) +{ + return (IN_BOX_ROWS * sMoveMonsPtr->fromColumn) + sMoveMonsPtr->fromRow; +} + +static bool8 sub_80D0BC0(void) +{ + s32 i, j; + s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal; + s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal; + u8 monArrayId = 0; + + for (i = sMoveMonsPtr->minColumn; i < columnCount; i++) + { + u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow; + for (j = sMoveMonsPtr->minRow; j < rowCount; j++) + { + if (GetBoxMonData(&sMoveMonsPtr->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES) + && GetCurrentBoxMonData(boxPosition, MON_DATA_SANITY_HAS_SPECIES)) + return FALSE; + + monArrayId++; + boxPosition++; + } + } + + return TRUE; +} + +static const u32 gUnknown_0857BB24[] = INCBIN_U32("graphics/pokemon_storage/unknown_frame.4bpp"); + +static const struct OamData sOamData_857BBA4 = +{ + .y = 0, + .affineMode = 1, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AffineAnimCmd sSpriteAffineAnim_857BBAC[] = +{ + AFFINEANIMCMD_FRAME(128, 128, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_857BBBC[] = +{ + AFFINEANIMCMD_FRAME(88, 88, 0, 0), + AFFINEANIMCMD_FRAME(5, 5, 0, 8), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_857BBD4[] = +{ + AFFINEANIMCMD_FRAME(128, 128, 0, 0), + AFFINEANIMCMD_FRAME(-5, -5, 0, 8), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_857BBEC[] = +{ + AFFINEANIMCMD_FRAME(128, 128, 0, 0), + AFFINEANIMCMD_FRAME(10, 10, 0, 12), + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_857BC0C[] = +{ + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_FRAME(-10, -10, 0, 12), + AFFINEANIMCMD_FRAME(128, 128, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_857BC2C[] = +{ + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_FRAME(-5, -5, 0, 16), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_857BC44[] = +{ + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable_857BC44[] = +{ + sSpriteAffineAnim_857BBAC, + sSpriteAffineAnim_857BBBC, + sSpriteAffineAnim_857BBD4, + sSpriteAffineAnim_857BBEC, + sSpriteAffineAnim_857BC0C, + sSpriteAffineAnim_857BC2C, + sSpriteAffineAnim_857BC44 +}; + +static const struct SpriteTemplate gSpriteTemplate_857BC70 = +{ + .tileTag = TAG_TILE_7, + .paletteTag = TAG_PAL_DACB, + .oam = &sOamData_857BBA4, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_857BC44, + .callback = SpriteCallbackDummy, +}; + +static void sub_80D0C60(void) +{ + s32 i; + u8 spriteId; + struct CompressedSpriteSheet spriteSheet; + struct SpriteTemplate spriteTemplate; + + if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + { + spriteSheet.data = gUnknown_03000F78; + spriteSheet.size = 0x200; + spriteTemplate = gSpriteTemplate_857BC70; + + for (i = 0; i < 3; i++) + { + spriteSheet.tag = TAG_TILE_7 + i; + LoadCompressedSpriteSheet(&spriteSheet); + sPSSData->field_2204[i].tiles = GetSpriteTileStartByTag(spriteSheet.tag) * 32 + (void*)(OBJ_VRAM0); + sPSSData->field_2204[i].palIndex = AllocSpritePalette(TAG_PAL_DACB + i); + sPSSData->field_2204[i].palIndex *= 16; + sPSSData->field_2204[i].palIndex += 0x100; + spriteTemplate.tileTag = TAG_TILE_7 + i; + spriteTemplate.paletteTag = TAG_PAL_DACB + i; + spriteId = CreateSprite(&spriteTemplate, 0, 0, 11); + sPSSData->field_2204[i].sprite = &gSprites[spriteId]; + sPSSData->field_2204[i].sprite->invisible = TRUE; + sPSSData->field_2204[i].unk10 = 0; + } + } + sPSSData->movingItem = 0; +} + +// The functions below handle new features of MOVE_ITEMS box option. +static bool32 sub_80D1324(u8 cursorArea, u8 cursorPos); +static const u32 *GetItemIconPic(u16 itemId); +static const u32 *GetItemIconPalette(u16 itemId); +static u8 sub_80D12E8(void); +static void sub_80D140C(u8 id, u8 cursorArea, u8 cursorPos); +static void sub_80D1524(u8 id, const u32 *itemTiles, const u32 *itemPal); +static void sub_80D15D4(u8 id, u8 animNum); +static void sub_80D1740(u8 id, bool8 arg1); +static u8 sub_80D1370(u8 cursorArea, u8 cursorPos); +static void sub_80D1604(u8 id, u8 arg1, u8 arg2, u8 arg3); +static void sub_80D1AD8(struct Sprite *sprite); +static void sub_80D1A48(struct Sprite *sprite); +static void sub_80D1A74(struct Sprite *sprite); +static void sub_80D1B14(struct Sprite *sprite); +static void sub_80D1B94(struct Sprite *sprite); +static void sub_80D1CCC(struct Sprite *sprite); +static void sub_80D1C30(struct Sprite *sprite); + +static void sub_80D0D8C(u8 cursorArea, u8 cursorPos) +{ + u16 heldItem; + + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + return; + if (sub_80D1324(cursorArea, cursorPos)) + return; + + switch (cursorArea) + { + case CURSOR_AREA_IN_BOX: + if (!GetCurrentBoxMonData(cursorPos, MON_DATA_SANITY_HAS_SPECIES)) + return; + heldItem = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM); + break; + case CURSOR_AREA_IN_PARTY: + if (cursorPos >= PARTY_SIZE || !GetMonData(&gPlayerParty[cursorPos], MON_DATA_SANITY_HAS_SPECIES)) + return; + heldItem = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM); + break; + default: + return; + } + + if (heldItem != 0) + { + const u32 *tiles = GetItemIconPic(heldItem); + const u32 *pal = GetItemIconPalette(heldItem); + u8 id = sub_80D12E8(); + + sub_80D140C(id, cursorArea, cursorPos); + sub_80D1524(id, tiles, pal); + sub_80D15D4(id, 1); + sub_80D1740(id, TRUE); + } +} + +static void sub_80D0E50(u8 cursorArea, u8 cursorPos) +{ + u8 id; + + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + return; + + id = sub_80D1370(cursorArea, cursorPos); + sub_80D15D4(id, 2); + sub_80D1604(id, 0, cursorArea, cursorPos); +} + +static void Item_FromMonToMoving(u8 cursorArea, u8 cursorPos) +{ + u8 id; + u16 item; + + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + return; + + id = sub_80D1370(cursorArea, cursorPos); + item = 0; + sub_80D15D4(id, 3); + sub_80D1604(id, 1, cursorArea, cursorPos); + sub_80D140C(id, 2, 0); + if (cursorArea == CURSOR_AREA_IN_BOX) + { + SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &item); + SetBoxMonIconObjMode(cursorPos, 1); + } + else + { + SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &item); + SetPartyMonIconObjMode(cursorPos, 1); + } + + sPSSData->movingItem = sPSSData->cursorMonItem; +} + +static void sub_80D0F38(u16 item) +{ + const u32 *tiles = GetItemIconPic(item); + const u32 *pal = GetItemIconPalette(item); + u8 id = sub_80D12E8(); + + sub_80D1524(id, tiles, pal); + sub_80D15D4(id, 6); + sub_80D1604(id, 1, 0, 0); + sub_80D140C(id, 2, 0); + sub_80D1740(id, TRUE); + sPSSData->movingItem = item; +} + +static void Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos) +{ + u8 id; + u16 item; + + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + return; + + id = sub_80D1370(cursorArea, cursorPos); + sub_80D15D4(id, 3); + sub_80D1604(id, 3, 2, 0); + if (cursorArea == CURSOR_AREA_IN_BOX) + { + item = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM); + SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &sPSSData->movingItem); + sPSSData->movingItem = item; + } + else + { + item = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM); + SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &sPSSData->movingItem); + sPSSData->movingItem = item; + } + + id = sub_80D1370(2, 0); + sub_80D15D4(id, 4); + sub_80D1604(id, 4, cursorArea, cursorPos); +} + +static void Item_GiveMovingToMon(u8 cursorArea, u8 cursorPos) +{ + u8 id; + + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + return; + + id = sub_80D1370(2, 0); + sub_80D15D4(id, 4); + sub_80D1604(id, 2, cursorArea, cursorPos); + if (cursorArea == CURSOR_AREA_IN_BOX) + { + SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &sPSSData->movingItem); + SetBoxMonIconObjMode(cursorPos, 0); + } + else + { + SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &sPSSData->movingItem); + SetPartyMonIconObjMode(cursorPos, 0); + } +} + +static void Item_TakeMons(u8 cursorArea, u8 cursorPos) +{ + u8 id; + u16 item; + + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + return; + + item = 0; + id = sub_80D1370(cursorArea, cursorPos); + sub_80D15D4(id, 2); + sub_80D1604(id, 0, cursorArea, cursorPos); + if (cursorArea == CURSOR_AREA_IN_BOX) + { + SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &item); + SetBoxMonIconObjMode(cursorPos, 1); + } + else + { + SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &item); + SetPartyMonIconObjMode(cursorPos, 1); + } +} + +static void sub_80D1194(void) +{ + if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + { + u8 id = sub_80D1370(2, 0); + sub_80D15D4(id, 5); + sub_80D1604(id, 0, 2, 0); + } +} + +static void sub_80D11CC(void) +{ + s32 i; + + if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + return; + + for (i = 0; i < 3; i++) + { + if (sPSSData->field_2204[i].unk10 && sPSSData->field_2204[i].unk8 == 1) + sub_80D1604(i, 7, 2, 0); + } +} + +static bool8 sub_80D1218(void) +{ + s32 i; + + for (i = 0; i < 3; i++) + { + if (sPSSData->field_2204[i].unk10) + { + if (!sPSSData->field_2204[i].sprite->affineAnimEnded && sPSSData->field_2204[i].sprite->affineAnimBeginning) + return TRUE; + if (sPSSData->field_2204[i].sprite->callback != SpriteCallbackDummy && sPSSData->field_2204[i].sprite->callback != sub_80D1AD8) + return TRUE; + } + } + + return FALSE; +} + +static bool8 IsActiveItemMoving(void) +{ + s32 i; + + if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + { + for (i = 0; i < 3; i++) + { + if (sPSSData->field_2204[i].unk10 && sPSSData->field_2204[i].unk8 == 2) + return TRUE; + } + } + + return FALSE; +} + +static const u8 *GetMovingItemName(void) +{ + return ItemId_GetName(sPSSData->movingItem); +} + +static u16 GetMovingItem(void) +{ + return sPSSData->movingItem; +} + +static u8 sub_80D12E8(void) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (sPSSData->field_2204[i].unk10 == 0) + { + sPSSData->field_2204[i].unk10 = 1; + return i; + } + } + + return 3; +} + +static bool32 sub_80D1324(u8 cursorArea, u8 cursorPos) +{ + s32 i; + + for (i = 0; i < 3; i++) + { + if (sPSSData->field_2204[i].unk10 + && sPSSData->field_2204[i].unk8 == cursorArea + && sPSSData->field_2204[i].unk9 == cursorPos) + return TRUE; + } + + return FALSE; +} + +static u8 sub_80D1370(u8 cursorArea, u8 cursorPos) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (sPSSData->field_2204[i].unk10 + && sPSSData->field_2204[i].unk8 == cursorArea + && sPSSData->field_2204[i].unk9 == cursorPos) + return i; + } + + return 3; +} + +static u8 sub_80D13C4(struct Sprite *sprite) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (sPSSData->field_2204[i].unk10 + && sPSSData->field_2204[i].sprite == sprite) + return i; + } + + return 3; +} + +static void sub_80D140C(u8 id, u8 cursorArea, u8 cursorPos) +{ + u8 row, column; + + if (id >= 3) + return; + + switch (cursorArea) + { + case CURSOR_AREA_IN_BOX: + row = cursorPos % IN_BOX_ROWS; + column = cursorPos / IN_BOX_ROWS; + sPSSData->field_2204[id].sprite->pos1.x = (24 * row) + 112; + sPSSData->field_2204[id].sprite->pos1.y = (24 * column) + 56; + sPSSData->field_2204[id].sprite->oam.priority = 2; + break; + case CURSOR_AREA_IN_PARTY: + if (cursorPos == 0) + { + sPSSData->field_2204[id].sprite->pos1.x = 116; + sPSSData->field_2204[id].sprite->pos1.y = 76; + } + else + { + sPSSData->field_2204[id].sprite->pos1.x = 164; + sPSSData->field_2204[id].sprite->pos1.y = 24 * (cursorPos - 1) + 28; + } + sPSSData->field_2204[id].sprite->oam.priority = 1; + break; + } + + sPSSData->field_2204[id].unk8 = cursorArea; + sPSSData->field_2204[id].unk9 = cursorPos; +} + +static void sub_80D1524(u8 id, const u32 *itemTiles, const u32 *itemPal) +{ + s32 i; + + if (id >= 3) + return; + + CpuFastFill(0, sPSSData->field_42C4, 0x200); + LZ77UnCompWram(itemTiles, sPSSData->field_22C4); + for (i = 0; i < 3; i++) + CpuFastCopy(sPSSData->field_22C4 + (i * 0x60), sPSSData->field_42C4 + (i * 0x80), 0x60); + + CpuFastCopy(sPSSData->field_42C4, sPSSData->field_2204[id].tiles, 0x200); + LZ77UnCompWram(itemPal, sPSSData->field_42C4); + LoadPalette(sPSSData->field_42C4, sPSSData->field_2204[id].palIndex, 0x20); +} + +static void sub_80D15D4(u8 id, u8 animNum) +{ + if (id >= 3) + return; + + StartSpriteAffineAnim(sPSSData->field_2204[id].sprite, animNum); +} + +static void sub_80D1604(u8 id, u8 arg1, u8 arg2, u8 arg3) +{ + if (id >= 3) + return; + + switch (arg1) + { + case 0: + sPSSData->field_2204[id].sprite->data[0] = id; + sPSSData->field_2204[id].sprite->callback = sub_80D1A48; + break; + case 1: + sPSSData->field_2204[id].sprite->data[0] = 0; + sPSSData->field_2204[id].sprite->callback = sub_80D1A74; + break; + case 2: + sPSSData->field_2204[id].sprite->data[0] = 0; + sPSSData->field_2204[id].sprite->data[6] = arg2; + sPSSData->field_2204[id].sprite->data[7] = arg3; + sPSSData->field_2204[id].sprite->callback = sub_80D1B14; + break; + case 3: + sPSSData->field_2204[id].sprite->data[0] = 0; + sPSSData->field_2204[id].sprite->callback = sub_80D1B94; + sPSSData->field_2204[id].sprite->data[6] = arg2; + sPSSData->field_2204[id].sprite->data[7] = arg3; + break; + case 4: + sPSSData->field_2204[id].sprite->data[0] = 0; + sPSSData->field_2204[id].sprite->data[6] = arg2; + sPSSData->field_2204[id].sprite->data[7] = arg3; + sPSSData->field_2204[id].sprite->callback = sub_80D1C30; + break; + case 7: + sPSSData->field_2204[id].sprite->callback = sub_80D1CCC; + break; + } +} + +static void sub_80D1740(u8 id, bool8 arg1) +{ + if (id >= 3) + return; + + sPSSData->field_2204[id].unk10 = arg1; + sPSSData->field_2204[id].sprite->invisible = (arg1 == FALSE); +} + +static const u32 *GetItemIconPic(u16 itemId) +{ + return GetItemIconPicOrPalette(itemId, 0); +} + +static const u32 *GetItemIconPalette(u16 itemId) +{ + return GetItemIconPicOrPalette(itemId, 1); +} + +static void PrintItemDescription(void) +{ + const u8 *description; + + if (IsActiveItemMoving()) + description = ItemId_GetDescription(sPSSData->movingItem); + else + description = ItemId_GetDescription(sPSSData->cursorMonItem); + + FillWindowPixelBuffer(2, 0x11); + AddTextPrinterParameterized5(2, 1, description, 4, 0, 0, NULL, 0, 1); +} + +static void sub_80D1818(void) +{ + sPSSData->field_2236 = 0x15; + LoadBgTiles(0, gUnknown_0857BB24, 0x80, 0x13A); + sub_80D19B4(0); +} + +static bool8 sub_80D184C(void) +{ + s32 i, var; + + if (sPSSData->field_2236 == 0) + return FALSE; + + sPSSData->field_2236--; + var = 0x15 - sPSSData->field_2236; + for (i = 0; i < var; i++) + { + WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + sPSSData->field_2236 + i, i, 13, 1, 7, 15, 21); + } + + sub_80D19B4(var); + return (sPSSData->field_2236 != 0); +} + +static bool8 sub_80D18E4(void) +{ + s32 i, var; + + if (sPSSData->field_2236 == 0x16) + return FALSE; + + if (sPSSData->field_2236 == 0) + FillBgTilemapBufferRect(0, 0, 21, 12, 1, 9, 17); + + sPSSData->field_2236++; + var = 0x15 - sPSSData->field_2236; + for (i = 0; i < var; i++) + { + WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + sPSSData->field_2236 + i, i, 13, 1, 7, 15, 21); + } + + if (var >= 0) + sub_80D19B4(var); + + FillBgTilemapBufferRect(0, 0, var + 1, 12, 1, 9, 0x11); + schedule_bg_copy_tilemap_to_vram(0); + return TRUE; +} + +static void sub_80D19B4(u32 arg0) +{ + if (arg0 != 0) + { + FillBgTilemapBufferRect(0, 0x13A, 0, 0xC, arg0, 1, 0xFu); + FillBgTilemapBufferRect(0, 0x93A, 0, 0x14, arg0, 1, 0xFu); + } + FillBgTilemapBufferRect(0, 0x13B, arg0, 0xD, 1, 7, 0xFu); + FillBgTilemapBufferRect(0, 0x13C, arg0, 0xC, 1, 1, 0xFu); + FillBgTilemapBufferRect(0, 0x13D, arg0, 0x14, 1, 1, 0xFu); + schedule_bg_copy_tilemap_to_vram(0); +} + +static void sub_80D1A48(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + { + sub_80D1740(sprite->data[0], FALSE); + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_80D1A74(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->data[1] = sprite->pos1.x << 4; + sprite->data[2] = sprite->pos1.y << 4; + sprite->data[3] = 10; + sprite->data[4] = 21; + sprite->data[5] = 0; + sprite->data[0]++; + case 1: + sprite->data[1] -= sprite->data[3]; + sprite->data[2] -= sprite->data[4]; + sprite->pos1.x = sprite->data[1] >> 4; + sprite->pos1.y = sprite->data[2] >> 4; + if (++sprite->data[5] > 11) + sprite->callback = sub_80D1AD8; + break; + } +} + +static void sub_80D1AD8(struct Sprite *sprite) +{ + sprite->pos1.x = sPSSData->field_CB4->pos1.x + 4; + sprite->pos1.y = sPSSData->field_CB4->pos1.y + sPSSData->field_CB4->pos2.y + 8; + sprite->oam.priority = sPSSData->field_CB4->oam.priority; +} + +static void sub_80D1B14(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->data[1] = sprite->pos1.x << 4; + sprite->data[2] = sprite->pos1.y << 4; + sprite->data[3] = 10; + sprite->data[4] = 21; + sprite->data[5] = 0; + sprite->data[0]++; + case 1: + sprite->data[1] += sprite->data[3]; + sprite->data[2] += sprite->data[4]; + sprite->pos1.x = sprite->data[1] >> 4; + sprite->pos1.y = sprite->data[2] >> 4; + if (++sprite->data[5] > 11) + { + sub_80D140C(sub_80D13C4(sprite), sprite->data[6], sprite->data[7]); + sprite->callback = SpriteCallbackDummy; + } + break; + } +} + +static void sub_80D1B94(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->data[1] = sprite->pos1.x << 4; + sprite->data[2] = sprite->pos1.y << 4; + sprite->data[3] = 10; + sprite->data[4] = 21; + sprite->data[5] = 0; + sprite->data[0]++; + case 1: + sprite->data[1] -= sprite->data[3]; + sprite->data[2] -= sprite->data[4]; + sprite->pos1.x = sprite->data[1] >> 4; + sprite->pos1.y = sprite->data[2] >> 4; + sprite->pos2.x = gSineTable[sprite->data[5] * 8] >> 4; + if (++sprite->data[5] > 11) + { + sub_80D140C(sub_80D13C4(sprite), sprite->data[6], sprite->data[7]); + sprite->pos2.x = 0; + sprite->callback = sub_80D1AD8; + } + break; + } +} + +static void sub_80D1C30(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->data[1] = sprite->pos1.x << 4; + sprite->data[2] = sprite->pos1.y << 4; + sprite->data[3] = 10; + sprite->data[4] = 21; + sprite->data[5] = 0; + sprite->data[0]++; + case 1: + sprite->data[1] += sprite->data[3]; + sprite->data[2] += sprite->data[4]; + sprite->pos1.x = sprite->data[1] >> 4; + sprite->pos1.y = sprite->data[2] >> 4; + sprite->pos2.x = -(gSineTable[sprite->data[5] * 8] >> 4); + if (++sprite->data[5] > 11) + { + sub_80D140C(sub_80D13C4(sprite), sprite->data[6], sprite->data[7]); + sprite->callback = SpriteCallbackDummy; + sprite->pos2.x = 0; + } + break; + } +} + +static void sub_80D1CCC(struct Sprite *sprite) +{ + sprite->pos1.y -= 8; + if (sprite->pos1.y + sprite->pos2.y < -16) + { + sprite->callback = SpriteCallbackDummy; + sub_80D1740(sub_80D13C4(sprite), FALSE); + } +} + +void nullsub_pss(void) +{ + +} + +void nullsub_98(void) +{ + +} + +// Functions here are general utility functions. +u8 StorageGetCurrentBox(void) +{ + return gPokemonStoragePtr->currentBox; +} + +static void SetCurrentBox(u8 boxId) +{ + if (boxId < TOTAL_BOXES_COUNT) + gPokemonStoragePtr->currentBox = boxId; +} + +u32 GetBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request) +{ + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) + return GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request); + else + return 0; +} + +void SetBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, const void *value) +{ + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) + SetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request, value); +} + +u32 GetCurrentBoxMonData(u8 boxPosition, s32 request) +{ + return GetBoxMonDataAt(gPokemonStoragePtr->currentBox, boxPosition, request); +} + +void SetCurrentBoxMonData(u8 boxPosition, s32 request, const void *value) +{ + SetBoxMonDataAt(gPokemonStoragePtr->currentBox, boxPosition, request, value); +} + +void GetBoxMonNickAt(u8 boxId, u8 boxPosition, u8 *dst) +{ + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) + GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_NICKNAME, dst); + else + *dst = EOS; +} + +u32 GetBoxMonLevelAt(u8 boxId, u8 boxPosition) +{ + u32 lvl; + + // BUG: Missed 'else' statement. + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT && GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_HAS_SPECIES)) + lvl = GetLevelFromBoxMonExp(&gPokemonStoragePtr->boxes[boxId][boxPosition]); + // else + lvl = 0; + + return lvl; +} + +void SetBoxMonNickAt(u8 boxId, u8 boxPosition, const u8 *nick) +{ + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) + SetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_NICKNAME, nick); +} + +u32 GetAndCopyBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, void *dst) +{ + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) + return GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request, dst); + else + return 0; +} + +void SetBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon *src) +{ + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) + gPokemonStoragePtr->boxes[boxId][boxPosition] = *src; +} + +void CopyBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon *dst) +{ + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) + *dst = gPokemonStoragePtr->boxes[boxId][boxPosition]; +} + +void CreateBoxMonAt(u8 boxId, u8 boxPosition, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 personality, u8 otIDType, u32 otID) +{ + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) + { + CreateBoxMon(&gPokemonStoragePtr->boxes[boxId][boxPosition], + species, + level, + fixedIV, + hasFixedPersonality, personality, + otIDType, otID); + } +} + +void ZeroBoxMonAt(u8 boxId, u8 boxPosition) +{ + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) + ZeroBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition]); +} + +void BoxMonAtToMon(u8 boxId, u8 boxPosition, struct Pokemon *dst) +{ + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) + BoxMonToMon(&gPokemonStoragePtr->boxes[boxId][boxPosition], dst); +} + +struct BoxPokemon *GetBoxedMonPtr(u8 boxId, u8 boxPosition) +{ + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) + return &gPokemonStoragePtr->boxes[boxId][boxPosition]; + else + return NULL; +} + +u8 *GetBoxNamePtr(u8 boxId) +{ + if (boxId < TOTAL_BOXES_COUNT) + return gPokemonStoragePtr->boxNames[boxId]; + else + return NULL; +} + +u8 GetBoxWallpaper(u8 boxId) +{ + if (boxId < TOTAL_BOXES_COUNT) + return gPokemonStoragePtr->boxWallpapers[boxId]; + else + return 0; +} + +void SetBoxWallpaper(u8 boxId, u8 wallpaperId) +{ + if (boxId < TOTAL_BOXES_COUNT && wallpaperId < WALLPAPER_COUNT) + gPokemonStoragePtr->boxWallpapers[boxId] = wallpaperId; +} + +s16 sub_80D214C(struct BoxPokemon *boxMons, u8 currIndex, u8 maxIndex, u8 arg3) +{ + s16 i; + s16 adder = -1; + + if (arg3 < 2) + adder = 1; + + if (arg3 == 1 || arg3 == 3) + { + for (i = (s8)currIndex + adder; i >= 0 && i <= maxIndex; i += adder) + { + if (GetBoxMonData(&boxMons[i], MON_DATA_SPECIES) != SPECIES_NONE) + return i; + } + } + else + { + for (i = (s8)currIndex + adder; i >= 0 && i <= maxIndex; i += adder) + { + if (GetBoxMonData(&boxMons[i], MON_DATA_SPECIES) != SPECIES_NONE + && !GetBoxMonData(&boxMons[i], MON_DATA_IS_EGG)) + return i; + } + } + + return -1; +} + +bool8 CheckFreePokemonStorageSpace(void) +{ + s32 i, j; + + for (i = 0; i < TOTAL_BOXES_COUNT; i++) + { + for (j = 0; j < IN_BOX_COUNT; j++) + { + if (!GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_HAS_SPECIES)) + return TRUE; + } + } + + return FALSE; +} + +bool32 CheckBoxMonSanityAt(u32 boxId, u32 boxPosition) +{ + if (boxId < TOTAL_BOXES_COUNT + && boxPosition < IN_BOX_COUNT + && GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_HAS_SPECIES) + && !GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_IS_EGG) + && !GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_IS_BAD_EGG)) + return TRUE; + else + return FALSE; +} + +u32 CountStorageNonEggMons(void) +{ + s32 i, j; + u32 count = 0; + + for (i = 0; i < TOTAL_BOXES_COUNT; i++) + { + for (j = 0; j < IN_BOX_COUNT; j++) + { + if (GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_HAS_SPECIES) + && !GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_IS_EGG)) + count++; + } + } + + return count; +} + +u32 CountAllStorageMons(void) +{ + s32 i, j; + u32 count = 0; + + for (i = 0; i < TOTAL_BOXES_COUNT; i++) + { + for (j = 0; j < IN_BOX_COUNT; j++) + { + if (GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_HAS_SPECIES) + || GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_IS_EGG)) + count++; + } + } + + return count; +} + +bool32 AnyStorageMonWithMove(u16 moveId) +{ + u16 moves[] = {moveId, MOVES_COUNT}; + s32 i, j; + + for (i = 0; i < TOTAL_BOXES_COUNT; i++) + { + for (j = 0; j < IN_BOX_COUNT; j++) + { + if (GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_HAS_SPECIES) + && !GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_IS_EGG) + && GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_KNOWN_MOVES, moves)) + return TRUE; + } + } + + return FALSE; +} + +void ResetWaldaWallpaper(void) +{ + gSaveBlock1Ptr->waldaPhrase.iconId = 0; + gSaveBlock1Ptr->waldaPhrase.patternId = 0; + gSaveBlock1Ptr->waldaPhrase.patternUnlocked = FALSE; + gSaveBlock1Ptr->waldaPhrase.colors[0] = RGB(21, 25, 30); + gSaveBlock1Ptr->waldaPhrase.colors[1] = RGB(6, 12, 24); + gSaveBlock1Ptr->waldaPhrase.text[0] = EOS; +} + +void SetWaldaWallpaperLockedOrUnlocked(bool32 unlocked) +{ + gSaveBlock1Ptr->waldaPhrase.patternUnlocked = unlocked; +} + +bool32 IsWaldaWallpaperUnlocked(void) +{ + return gSaveBlock1Ptr->waldaPhrase.patternUnlocked; +} + +u32 GetWaldaWallpaperPatternId(void) +{ + return gSaveBlock1Ptr->waldaPhrase.patternId; +} + +void SetWaldaWallpaperPatternId(u8 id) +{ + if (id < FRIENDS_WALLPAPERS_COUNT) + gSaveBlock1Ptr->waldaPhrase.patternId = id; +} + +u32 GetWaldaWallpaperIconId(void) +{ + return gSaveBlock1Ptr->waldaPhrase.iconId; +} + +void SetWaldaWallpaperIconId(u8 id) +{ + if (id < 30) + gSaveBlock1Ptr->waldaPhrase.iconId = id; +} + +u16 *GetWaldaWallpaperColorsPtr(void) +{ + return gSaveBlock1Ptr->waldaPhrase.colors; +} + +void SetWaldaWallpaperColors(u16 color1, u16 color2) +{ + gSaveBlock1Ptr->waldaPhrase.colors[0] = color1; + gSaveBlock1Ptr->waldaPhrase.colors[1] = color2; +} + +u8 *GetWaldaPhrasePtr(void) +{ + return gSaveBlock1Ptr->waldaPhrase.text; +} + +void SetWaldaPhrase(const u8 *src) +{ + StringCopy(gSaveBlock1Ptr->waldaPhrase.text, src); +} + +bool32 IsWaldaPhraseEmpty(void) +{ + return (gSaveBlock1Ptr->waldaPhrase.text[0] == EOS); +} + +// Not sure what the purpose of these functions is. +// They seem to only be called while PSS is initialized. + +EWRAM_DATA static struct UnkStruct_2039D84 *gUnknown_02039D84 = NULL; +EWRAM_DATA static u16 gUnknown_02039D88 = 0; + +static void sub_80D259C(u8 count) +{ + u16 i; + + gUnknown_02039D84 = Alloc(sizeof(*gUnknown_02039D84) * count); + gUnknown_02039D88 = (gUnknown_02039D84 == NULL) ? 0 : count; + for (i = 0; i < gUnknown_02039D88; i++) + { + gUnknown_02039D84[i].field_18 = NULL; + gUnknown_02039D84[i].field_2C = 0; + } +} + +static void sub_80D25F0(void) +{ + Free(gUnknown_02039D84); +} + +static void sub_80D2604(void) +{ + s32 i; + + for (i = 0; i < gUnknown_02039D88; i++) + { + if (gUnknown_02039D84[i].field_2C == 1) + sub_80D2918(i); + } +} + +struct +{ + u16 a; + u16 b; +} +static const sUnkVars[][4] = +{ + { + {0x0100, 0x0100}, + {0x0200, 0x0100}, + {0x0100, 0x0200}, + {0x0200, 0x0200}, + }, + { + {0x0080, 0x0080}, + {0x0100, 0x0100}, + {0x0200, 0x0200}, + {0x0400, 0x0400}, + }, +}; + +static void sub_80D2644(u8 id, u8 bg, const void *arg2, u16 arg3, u16 arg4) +{ + u16 bgScreenSize, bgType; + + if (id >= gUnknown_02039D88) + return; + + gUnknown_02039D84[id].field_18 = NULL; + gUnknown_02039D84[id].field_1C = arg2; + gUnknown_02039D84[id].field_2B = bg; + gUnknown_02039D84[id].field_24 = arg3; + gUnknown_02039D84[id].field_26 = arg4; + + bgScreenSize = GetBgAttribute(bg, BG_ATTR_SCREENSIZE); + bgType = GetBgAttribute(bg, BG_ATTR_TYPE); + gUnknown_02039D84[id].field_20 = sUnkVars[bgType][bgScreenSize].a; + gUnknown_02039D84[id].field_22 = sUnkVars[bgType][bgScreenSize].b; + if (bgType != 0) + gUnknown_02039D84[id].field_2A = 1; + else + gUnknown_02039D84[id].field_2A = 2; + + gUnknown_02039D84[id].field_28 = gUnknown_02039D84[id].field_2A * arg3; + gUnknown_02039D84[id].field_0[1].field_4 = arg3; + gUnknown_02039D84[id].field_0[1].field_6 = arg4; + gUnknown_02039D84[id].field_0[1].field_0 = 0; + gUnknown_02039D84[id].field_0[1].field_2 = 0; + gUnknown_02039D84[id].field_0[1].field_8 = 0; + gUnknown_02039D84[id].field_0[1].field_A = 0; + gUnknown_02039D84[id].field_0[0] = gUnknown_02039D84[id].field_0[1]; + gUnknown_02039D84[id].field_2C = 1; +} + +static void sub_80D2740(u8 id, const void *arg1) +{ + if (id >= gUnknown_02039D88) + return; + + gUnknown_02039D84[id].field_18 = arg1; + gUnknown_02039D84[id].field_2C = 1; +} + +static void sub_80D2770(u8 id, u16 arg1, u16 arg2) +{ + if (id >= gUnknown_02039D88) + return; + + gUnknown_02039D84[id].field_0[1].field_8 = arg1; + gUnknown_02039D84[id].field_0[1].field_A = arg2; + gUnknown_02039D84[id].field_2C = 1; +} + +static void sub_80D27AC(u8 id, u16 arg1, u16 arg2, u16 arg3, u16 arg4) +{ + if (id >= gUnknown_02039D88) + return; + + gUnknown_02039D84[id].field_0[1].field_0 = arg1; + gUnknown_02039D84[id].field_0[1].field_2 = arg2; + gUnknown_02039D84[id].field_0[1].field_4 = arg3; + gUnknown_02039D84[id].field_0[1].field_6 = arg4; + gUnknown_02039D84[id].field_2C = 1; +} + +static void sub_80D27F4(u8 id, u8 arg1, s8 arg2) +{ + if (id >= gUnknown_02039D88) + return; + + switch (arg1) + { + case 0: + gUnknown_02039D84[id].field_0[1].field_8 += arg2; + gUnknown_02039D84[id].field_0[1].field_4 -= arg2; + break; + case 1: + gUnknown_02039D84[id].field_0[1].field_0 += arg2; + gUnknown_02039D84[id].field_0[1].field_4 += arg2; + break; + case 2: + gUnknown_02039D84[id].field_0[1].field_A += arg2; + gUnknown_02039D84[id].field_0[1].field_6 -= arg2; + break; + case 3: + gUnknown_02039D84[id].field_0[1].field_2 -= arg2; + gUnknown_02039D84[id].field_0[1].field_6 += arg2; + break; + case 4: + gUnknown_02039D84[id].field_0[1].field_8 += arg2; + break; + case 5: + gUnknown_02039D84[id].field_0[1].field_A += arg2; + break; + } + + gUnknown_02039D84[id].field_2C = 1; +} + +static void sub_80D2918(u8 id) +{ + if (id >= gUnknown_02039D88) + return; + + if (gUnknown_02039D84[id].field_18 != NULL) + sub_80D2960(id); + + sub_80D29F8(id); + gUnknown_02039D84[id].field_0[0] = gUnknown_02039D84[id].field_0[1]; +} + +static void sub_80D2960(u8 id) +{ + s32 i; + u32 adder = gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_20; + const void *tiles = (gUnknown_02039D84[id].field_18 + (adder * gUnknown_02039D84[id].field_0[0].field_A)) + + (gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_0[0].field_8); + + for (i = 0; i < gUnknown_02039D84[id].field_0[0].field_6; i++) + { + CopyToBgTilemapBufferRect(gUnknown_02039D84[id].field_2B, + tiles, + gUnknown_02039D84[id].field_0[0].field_8, + gUnknown_02039D84[id].field_0[0].field_A + i, + gUnknown_02039D84[id].field_0[0].field_4, + 1); + tiles += adder; + } +} + +static void sub_80D29F8(u8 id) +{ + s32 i; + u32 adder = gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_24; + const void *tiles = (gUnknown_02039D84[id].field_1C + (adder * gUnknown_02039D84[id].field_0[1].field_2)) + + (gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_0[1].field_0); + + for (i = 0; i < gUnknown_02039D84[id].field_0[1].field_6; i++) + { + CopyToBgTilemapBufferRect(gUnknown_02039D84[id].field_2B, + tiles, + gUnknown_02039D84[id].field_0[1].field_8, + gUnknown_02039D84[id].field_0[1].field_A + i, + gUnknown_02039D84[id].field_0[1].field_4, + 1); + tiles += adder; + } +} + +EWRAM_DATA static struct UnkStruct_2000020 *gUnknown_02039D8C = NULL; + +static void sub_80D2A90(struct UnkStruct_2000020 *arg0, struct UnkStruct_2000028 *arg1, u32 arg2) +{ + gUnknown_02039D8C = arg0; + arg0->unk_00 = arg1; + arg0->unk_05 = arg2; + arg0->unk_04 = 0; +} + +static void sub_80D2AA4(void) +{ + u16 i; + + if (gUnknown_02039D8C->unk_04) + { + for (i = 0; i < gUnknown_02039D8C->unk_04; i++) + { + struct UnkStruct_2000028 *unkStruct = &gUnknown_02039D8C->unk_00[i]; + unkStruct->unk_0c(unkStruct); + } + + gUnknown_02039D8C->unk_04 = 0; + } +} + +static bool8 sub_80D2AEC(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height, u16 unkArg) +{ + struct UnkStruct_2000028 *unkStruct; + + if (gUnknown_02039D8C->unk_04 >= gUnknown_02039D8C->unk_05) + return FALSE; + + unkStruct = &gUnknown_02039D8C->unk_00[gUnknown_02039D8C->unk_04++]; + unkStruct->unk_08 = width * 2; + unkStruct->unk_04 = dest + 2 * (dTop * 32 + dLeft); + unkStruct->unk_00 = src + 2 * (sTop * unkArg + sLeft); + unkStruct->newField = height; + unkStruct->unk_0a = unkArg; + unkStruct->unk_0c = sub_80D2B88; + return TRUE; +} + +static void sub_80D2B88(struct UnkStruct_2000028 *unkStruct) +{ + u16 i; + + for (i = 0; i < unkStruct->newField; i++) + { + CpuSet(unkStruct->unk_00, unkStruct->unk_04, (unkStruct->unk_08 / 2)); + unkStruct->unk_04 += 64; + unkStruct->unk_00 += (unkStruct->unk_0a * 2); + } +} + +static bool8 sub_80D2BC0(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height) +{ + struct UnkStruct_2000028 *unkStruct; + + if (gUnknown_02039D8C->unk_04 >= gUnknown_02039D8C->unk_05) + return FALSE; + + unkStruct = &gUnknown_02039D8C->unk_00[gUnknown_02039D8C->unk_04++]; + unkStruct->unk_08 = width * 2; + unkStruct->unk_04 = dest + ((dTop * 32) + dLeft) * 2; + unkStruct->newField = height; + unkStruct->unk_0c = sub_80D2C1C; + return TRUE; +} + +static void sub_80D2C1C(struct UnkStruct_2000028 *unkStruct) +{ + u16 i; + + for (i = 0; i < unkStruct->newField; i++) + { + Dma3FillLarge_(0, unkStruct->unk_04, unkStruct->unk_08, 16); + unkStruct->unk_04 += 64; + } +} diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index fb2a43786..14d5aa9dc 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -5,6 +5,7 @@ #include "frontier_util.h" #include "battle_message.h" #include "battle_tent.h" +#include "battle_factory.h" #include "bg.h" #include "contest.h" #include "contest_effect.h" @@ -45,8 +46,6 @@ #include "constants/songs.h" #include "constants/species.h" -extern bool8 sub_81A6BF4(void); - static EWRAM_DATA struct UnkSummaryStruct { /*0x00*/ union { @@ -129,7 +128,6 @@ struct UnkStruct_61CC04 }; // forward declarations -bool8 IsMultiBattle(void); static bool8 SummaryScreen_LoadGraphics(void); static void SummaryScreen_LoadingCB2(void); static void InitBGs(void); @@ -238,8 +236,6 @@ static void sub_81C4568(u8 a, u8 b); static u8 sub_81C45F4(struct Pokemon *a, s16 *b); static u8 sub_81C47B4(struct Pokemon *unused); static void sub_81C4844(struct Sprite *); -void SummaryScreen_SetUnknownTaskId(u8 a); -void SummaryScreen_DestroyUnknownTask(void); static void sub_81C48F0(void); static void CreateMonMarkingsSprite(struct Pokemon *mon); static void RemoveAndCreateMonMarkingsSprite(struct Pokemon *mon); @@ -315,7 +311,7 @@ static const struct UnkStruct_61CC04 gUnknown_0861CC10 = static const s8 gUnknown_0861CC1C[] = {0, 2, 3, 1, 4, 5}; static const struct WindowTemplate gUnknown_0861CC24[] = { - { + {//Text for Pokemon Info .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, @@ -324,7 +320,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 1, }, - { + {//Text for Pokemon Skills .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, @@ -333,7 +329,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 23, }, - { + {//Text for Battle Moves .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, @@ -342,7 +338,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 45, }, - { + {//Text for Contest Moves .bg = 0, .tilemapLeft = 0, .tilemapTop = 0, @@ -351,7 +347,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 67, }, - { + { //Text on Pokemon Info: Button prompt: Cancel .bg = 0, .tilemapLeft = 22, .tilemapTop = 0, @@ -360,7 +356,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 7, .baseBlock = 89, }, - { + {//Info button found under moves .bg = 0, .tilemapLeft = 22, .tilemapTop = 0, @@ -369,7 +365,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 7, .baseBlock = 105, }, - { + {//Switch button under moves when viewing moves .bg = 0, .tilemapLeft = 22, .tilemapTop = 0, @@ -378,7 +374,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 7, .baseBlock = 121, }, - { + {//Unknown .bg = 0, .tilemapLeft = 11, .tilemapTop = 4, @@ -387,7 +383,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 137, }, - { + {//Unknown .bg = 0, .tilemapLeft = 11, .tilemapTop = 4, @@ -396,7 +392,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 137, }, - { + {//Type on pokemon info page .bg = 0, .tilemapLeft = 11, .tilemapTop = 6, @@ -405,7 +401,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 173, }, - { + {//HP, Attack and Defense text .bg = 0, .tilemapLeft = 10, .tilemapTop = 7, @@ -414,7 +410,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 209, }, - { + {//Sp. atk, Sp. Def and Speed texxt .bg = 0, .tilemapLeft = 22, .tilemapTop = 7, @@ -423,7 +419,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 245, }, - { + {//EXP and next lvl. .bg = 0, .tilemapLeft = 10, .tilemapTop = 14, @@ -432,7 +428,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 275, }, - { + {//Unknown .bg = 0, .tilemapLeft = 0, .tilemapTop = 18, @@ -441,7 +437,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 319, }, - { + {//move text: Power, Accuracy and their numeric values. .bg = 0, .tilemapLeft = 1, .tilemapTop = 15, @@ -450,7 +446,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 331, }, - { + {//contest text: appeal and jam .bg = 0, .tilemapLeft = 1, .tilemapTop = 15, @@ -459,7 +455,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 367, }, - { + {//Unknown .bg = 0, .tilemapLeft = 22, .tilemapTop = 4, @@ -468,7 +464,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 387, }, - { + {//No. .bg = 0, .tilemapLeft = 1, .tilemapTop = 2, @@ -477,7 +473,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 7, .baseBlock = 387, }, - { + {//Upper name .bg = 0, .tilemapLeft = 1, .tilemapTop = 12, @@ -486,7 +482,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = .paletteNum = 6, .baseBlock = 395, }, - { + {//Lower name .bg = 0, .tilemapLeft = 1, .tilemapTop = 14, @@ -499,7 +495,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] = }; static const struct WindowTemplate gUnknown_0861CCCC[] = { - { + {//Original Trainer .bg = 0, .tilemapLeft = 11, .tilemapTop = 4, @@ -508,7 +504,7 @@ static const struct WindowTemplate gUnknown_0861CCCC[] = .paletteNum = 6, .baseBlock = 449, }, - { + {//ID numbers .bg = 0, .tilemapLeft = 22, .tilemapTop = 4, @@ -517,7 +513,7 @@ static const struct WindowTemplate gUnknown_0861CCCC[] = .paletteNum = 6, .baseBlock = 471, }, - { + {//Ability .bg = 0, .tilemapLeft = 11, .tilemapTop = 9, @@ -526,7 +522,7 @@ static const struct WindowTemplate gUnknown_0861CCCC[] = .paletteNum = 6, .baseBlock = 485, }, - { + {//Trainer Memo .bg = 0, .tilemapLeft = 11, .tilemapTop = 14, @@ -538,7 +534,7 @@ static const struct WindowTemplate gUnknown_0861CCCC[] = }; static const struct WindowTemplate gUnknown_0861CCEC[] = { - { + {//Held Item string .bg = 0, .tilemapLeft = 10, .tilemapTop = 4, @@ -547,7 +543,7 @@ static const struct WindowTemplate gUnknown_0861CCEC[] = .paletteNum = 6, .baseBlock = 449, }, - { + {//Ribbon string .bg = 0, .tilemapLeft = 20, .tilemapTop = 4, @@ -556,7 +552,7 @@ static const struct WindowTemplate gUnknown_0861CCEC[] = .paletteNum = 6, .baseBlock = 469, }, - { + {//Stat numbers left (HP, ATK & DEF) .bg = 0, .tilemapLeft = 16, .tilemapTop = 7, @@ -565,7 +561,7 @@ static const struct WindowTemplate gUnknown_0861CCEC[] = .paletteNum = 6, .baseBlock = 489, }, - { + {//Stat numbers right (SP.ATK, SP.DEF & SPEED) .bg = 0, .tilemapLeft = 27, .tilemapTop = 7, @@ -574,7 +570,7 @@ static const struct WindowTemplate gUnknown_0861CCEC[] = .paletteNum = 6, .baseBlock = 525, }, - { + {//Exp numbers .bg = 0, .tilemapLeft = 24, .tilemapTop = 14, @@ -586,7 +582,7 @@ static const struct WindowTemplate gUnknown_0861CCEC[] = }; static const struct WindowTemplate gUnknown_0861CD14[] = { - { + {//Move names? .bg = 0, .tilemapLeft = 15, .tilemapTop = 4, @@ -595,7 +591,7 @@ static const struct WindowTemplate gUnknown_0861CD14[] = .paletteNum = 6, .baseBlock = 449, }, - { + {//PP Numbers .bg = 0, .tilemapLeft = 24, .tilemapTop = 4, @@ -604,7 +600,7 @@ static const struct WindowTemplate gUnknown_0861CD14[] = .paletteNum = 8, .baseBlock = 539, }, - { + {//Move description text .bg = 0, .tilemapLeft = 10, .tilemapTop = 15, @@ -1005,7 +1001,7 @@ void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, pssData->maxMonIndex = maxMonIndex; pssData->callback = callback; - if (mode == PSS_MODE_UNK2) + if (mode == PSS_MODE_BOX) pssData->isBoxMon = TRUE; else pssData->isBoxMon = FALSE; @@ -1013,7 +1009,7 @@ void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, switch (mode) { case PSS_MODE_NORMAL: - case PSS_MODE_UNK2: + case PSS_MODE_BOX: pssData->minPageIndex = 0; pssData->maxPageIndex = 3; break; @@ -1255,27 +1251,27 @@ static bool8 SummaryScreen_DecompressGraphics(void) pssData->unk40F0++; break; case 7: - LoadCompressedObjectPic(&sSpriteSheet_MoveTypes); + LoadCompressedSpriteSheet(&sSpriteSheet_MoveTypes); pssData->unk40F0++; break; case 8: - LoadCompressedObjectPic(&gUnknown_0861D074); + LoadCompressedSpriteSheet(&gUnknown_0861D074); pssData->unk40F0++; break; case 9: - LoadCompressedObjectPic(&gUnknown_0861D0F8); + LoadCompressedSpriteSheet(&gUnknown_0861D0F8); pssData->unk40F0++; break; case 10: - LoadCompressedObjectPalette(&gUnknown_0861D100); + LoadCompressedSpritePalette(&gUnknown_0861D100); pssData->unk40F0++; break; case 11: - LoadCompressedObjectPalette(&gUnknown_0861D07C); + LoadCompressedSpritePalette(&gUnknown_0861D07C); pssData->unk40F0++; break; case 12: - LoadCompressedPalette(&gMoveTypes_Pal, 0x1D0, 0x60); + LoadCompressedPalette(gMoveTypes_Pal, 0x1D0, 0x60); pssData->unk40F0 = 0; return TRUE; } @@ -1310,7 +1306,7 @@ static bool8 ExtractMonDataToSummaryStruct(struct Pokemon *a) sum->altAbility = GetMonData(a, MON_DATA_ALT_ABILITY); sum->item = GetMonData(a, MON_DATA_HELD_ITEM); sum->pid = GetMonData(a, MON_DATA_PERSONALITY); - sum->sanity = GetMonData(a, MON_DATA_SANITY_BIT1); + sum->sanity = GetMonData(a, MON_DATA_SANITY_IS_BAD_EGG); if (sum->sanity) sum->isEgg = TRUE; @@ -1319,7 +1315,7 @@ static bool8 ExtractMonDataToSummaryStruct(struct Pokemon *a) break; case 1: - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { sum->moves[i] = GetMonData(a, MON_DATA_MOVE1+i); sum->pp[i] = GetMonData(a, MON_DATA_PP1+i); @@ -1327,7 +1323,7 @@ static bool8 ExtractMonDataToSummaryStruct(struct Pokemon *a) sum->ppBonuses = GetMonData(a, MON_DATA_PP_BONUSES); break; case 2: - if (pssData->monList.mons == gPlayerParty || pssData->mode == PSS_MODE_UNK2 || pssData->unk40EF == TRUE) + if (pssData->monList.mons == gPlayerParty || pssData->mode == PSS_MODE_BOX || pssData->unk40EF == TRUE) { sum->nature = GetNature(a); sum->currentHP = GetMonData(a, MON_DATA_HP); @@ -1692,15 +1688,15 @@ static void sub_81C0B8C(u8 taskId) if (pssData->unk40C9 == 0) { data[1] = 1; - SetBgAttribute(1, 7, 1); - SetBgAttribute(2, 7, 2); + SetBgAttribute(1, BG_ATTR_PRIORITY, 1); + SetBgAttribute(2, BG_ATTR_PRIORITY, 2); schedule_bg_copy_tilemap_to_vram(1); } else { data[1] = 2; - SetBgAttribute(2, 7, 1); - SetBgAttribute(1, 7, 2); + SetBgAttribute(2, BG_ATTR_PRIORITY, 1); + SetBgAttribute(1, BG_ATTR_PRIORITY, 2); schedule_bg_copy_tilemap_to_vram(2); } ChangeBgX(data[1], 0, 0); @@ -1749,14 +1745,14 @@ static void sub_81C0D44(u8 taskId) s16 *data = gTasks[taskId].data; if (pssData->unk40C9 == 0) { - SetBgAttribute(1, 7, 1); - SetBgAttribute(2, 7, 2); + SetBgAttribute(1, BG_ATTR_PRIORITY, 1); + SetBgAttribute(2, BG_ATTR_PRIORITY, 2); schedule_bg_copy_tilemap_to_vram(2); } else { - SetBgAttribute(2, 7, 1); - SetBgAttribute(1, 7, 2); + SetBgAttribute(2, BG_ATTR_PRIORITY, 1); + SetBgAttribute(1, BG_ATTR_PRIORITY, 2); schedule_bg_copy_tilemap_to_vram(1); } if (pssData->currPageIndex > 1) @@ -1855,7 +1851,7 @@ static void sub_81C0F44(u8 taskId) static bool8 sub_81C1040(void) { u8 i; - for (i = 1; i < 4; i++) + for (i = 1; i < MAX_MON_MOVES; i++) { if (pssData->summary.moves[i] != 0) return TRUE; @@ -1871,14 +1867,14 @@ static void sub_81C1070(s16 *a, s8 b, u8 *c) PlaySE(SE_SELECT); moveIndex = *c; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { moveIndex += b; if (moveIndex > a[0]) moveIndex = 0; else if (moveIndex < 0) moveIndex = a[0]; - if (moveIndex == 4) + if (moveIndex == MAX_MON_MOVES) { move = pssData->newMove; break; @@ -2147,7 +2143,7 @@ static void sub_81C174C(u8 taskId) static bool8 sub_81C18A8(void) { - if (pssData->firstMoveIndex == MAX_MON_MOVES || pssData->newMove == MOVE_NONE || sub_81B6D14(pssData->summary.moves[pssData->firstMoveIndex]) != 1) + if (pssData->firstMoveIndex == MAX_MON_MOVES || pssData->newMove == MOVE_NONE || IsMoveHm(pssData->summary.moves[pssData->firstMoveIndex]) != 1) return TRUE; else return FALSE; @@ -3552,7 +3548,7 @@ static void PrintContestMoveDescription(u8 moveSlot) { u16 move; - if (moveSlot == 4) + if (moveSlot == MAX_MON_MOVES) move = pssData->newMove; else move = pssData->summary.moves[moveSlot]; @@ -3748,7 +3744,7 @@ static void sub_81C4420(void) { u8 i; struct PokeSummary *summary = &pssData->summary; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (summary->moves[i] != MOVE_NONE) SetMoveTypeSpritePosAndType(gBattleMoves[summary->moves[i]].type, 0x55, 0x20 + (i * 0x10), i + 3); @@ -3761,7 +3757,7 @@ static void sub_81C4484(void) { u8 i; struct PokeSummary *summary = &pssData->summary; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { if (summary->moves[i] != MOVE_NONE) SetMoveTypeSpritePosAndType(NUMBER_OF_MON_TYPES + gContestMoves[summary->moves[i]].contestCategory, 0x55, 0x20 + (i * 0x10), i + 3); @@ -3829,7 +3825,7 @@ static u8 sub_81C45F4(struct Pokemon *mon, s16 *a1) { if (gMonSpritesGfxPtr != NULL) { - if (pssData->monList.mons == gPlayerParty || pssData->mode == PSS_MODE_UNK2 || pssData->unk40EF == TRUE) + if (pssData->monList.mons == gPlayerParty || pssData->mode == PSS_MODE_BOX || pssData->unk40EF == TRUE) { HandleLoadSpecialPokePic_2(&gMonFrontPicTable[summary->species2], gMonSpritesGfxPtr->sprites[1], summary->species2, summary->pid); } @@ -3840,7 +3836,7 @@ static u8 sub_81C45F4(struct Pokemon *mon, s16 *a1) } else { - if (pssData->monList.mons == gPlayerParty || pssData->mode == PSS_MODE_UNK2 || pssData->unk40EF == TRUE) + if (pssData->monList.mons == gPlayerParty || pssData->mode == PSS_MODE_BOX || pssData->unk40EF == TRUE) { HandleLoadSpecialPokePic_2(&gMonFrontPicTable[summary->species2], sub_806F4F8(0, 1), summary->species2, summary->pid); } @@ -3854,7 +3850,7 @@ static u8 sub_81C45F4(struct Pokemon *mon, s16 *a1) return -1; case 1: pal = GetMonSpritePalStructFromOtIdPersonality(summary->species2, summary->OTID, summary->pid); - LoadCompressedObjectPalette(pal); + LoadCompressedSpritePalette(pal); SetMultiuseSpriteTemplateToPokemon(pal->tag, 1); (*a1)++; return -1; diff --git a/src/post_battle_event_funcs.c b/src/post_battle_event_funcs.c index 934972b7c..3cbf6ecd2 100644 --- a/src/post_battle_event_funcs.c +++ b/src/post_battle_event_funcs.c @@ -34,12 +34,12 @@ int GameClear(void) if (GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME) == 0) SetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME, (gSaveBlock2Ptr->playTimeHours << 16) | (gSaveBlock2Ptr->playTimeMinutes << 8) | gSaveBlock2Ptr->playTimeSeconds); - SetSecretBase2Field_9(); + SetContinueGameWarpStatus(); if (gSaveBlock2Ptr->playerGender == MALE) - sub_8084F6C(HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F); + SetContinueGameWarpToHealLocation(HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F); else - sub_8084F6C(HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F); + SetContinueGameWarpToHealLocation(HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F); ribbonGet = FALSE; @@ -50,8 +50,8 @@ int GameClear(void) ribbonCounts[i].partyIndex = i; ribbonCounts[i].count = 0; - if (GetMonData(mon, MON_DATA_SANITY_BIT2) - && !GetMonData(mon, MON_DATA_SANITY_BIT3) + if (GetMonData(mon, MON_DATA_SANITY_HAS_SPECIES) + && !GetMonData(mon, MON_DATA_SANITY_IS_EGG) && !GetMonData(mon, MON_DATA_CHAMPION_RIBBON)) { u8 val[1] = {TRUE}; diff --git a/src/psychic.c b/src/psychic.c index efd15f746..5756fe97f 100644 --- a/src/psychic.c +++ b/src/psychic.c @@ -1,18 +1,33 @@ #include "global.h" #include "battle_anim.h" +#include "gpu_regs.h" +#include "palette.h" +#include "sound.h" +#include "scanline_effect.h" +#include "trig.h" #include "constants/rgb.h" +#include "constants/songs.h" -extern void sub_80A77C8(struct Sprite *); -extern void sub_810F1EC(struct Sprite *); -extern void sub_810F1EC(struct Sprite *); -extern void sub_810F58C(struct Sprite *); -extern void TranslateAnimSpriteToTargetMonLocation(struct Sprite *); -extern void sub_810F634(struct Sprite *); -extern void sub_810F6B0(struct Sprite *); -extern void sub_810FBA8(struct Sprite *); -extern void sub_810FDF0(struct Sprite *); -extern void sub_80A77C8(struct Sprite *); -extern void sub_8110240(struct Sprite *); +void sub_810F1EC(struct Sprite *); +void sub_810F58C(struct Sprite *); +void sub_810F634(struct Sprite *); +void sub_810F6B0(struct Sprite *); +void sub_810FBA8(struct Sprite *); +void sub_810FDF0(struct Sprite *); +void sub_8110240(struct Sprite *); +static void sub_810F340(struct Sprite *); +static void sub_810F3C8(struct Sprite *); +static void sub_810F400(struct Sprite *); +static void sub_810F46C(struct Sprite *); +static void sub_810F524(struct Sprite *); +static void sub_810F740(struct Sprite *); +static void sub_810F774(struct Sprite *); +static void sub_810F810(u8); +static void sub_810F898(u8); +static void sub_810F9D4(u8); +static void sub_810FD3C(u8); +static void sub_810FF34(u8); +static void sub_8110134(u8); const union AffineAnimCmd gUnknown_0859652C[] = { @@ -403,3 +418,744 @@ const struct SpriteTemplate gUnknown_08596920 = .affineAnims = gUnknown_08596918, .callback = sub_8110240, }; + +void sub_810F1EC(struct Sprite *sprite) +{ + u8 isContest = IsContest(); + + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || isContest) + { + sprite->oam.priority = 2; + sprite->subpriority = 200; + } + + if (!isContest) + { + u8 battlerCopy; + u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + u8 rank = GetBattlerSpriteBGPriorityRank(battler); + int var0 = 1; + u8 toBG_2 = (rank ^ var0) != 0; + + if (IsBattlerSpriteVisible(battler)) + MoveBattlerSpriteToBG(battler, toBG_2, FALSE); + + battler = BATTLE_PARTNER(battlerCopy); + if (IsBattlerSpriteVisible(battler)) + MoveBattlerSpriteToBG(battler, toBG_2 ^ var0, FALSE); + } + + if (!isContest && IsDoubleBattle()) + { + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) + { + sprite->pos1.x = 72; + sprite->pos1.y = 80; + } + else + { + sprite->pos1.x = 176; + sprite->pos1.y = 40; + } + } + else + { + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0]; + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1]; + } + + sprite->data[0] = 256 + IndexOfSpritePaletteTag(gBattleAnimArgs[2]) * 16; + + if (isContest) + { + sprite->pos1.y += 9; + sprite->callback = sub_810F3C8; + sprite->callback(sprite); + } + else + { + sprite->callback = sub_810F340; + } +} + +static void sub_810F340(struct Sprite *sprite) +{ + u8 battler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + if (!sprite->data[7]) + { + sprite->data[7] = 1; + return; + } + + if (IsBattlerSpriteVisible(battler)) + gSprites[gBattlerSpriteIds[battler]].invisible = 1; + + battler = BATTLE_PARTNER(battler); + if (IsBattlerSpriteVisible(battler)) + gSprites[gBattlerSpriteIds[battler]].invisible = 1; + + sprite->callback = sub_810F3C8; + sprite->callback(sprite); +} + +static void sub_810F3C8(struct Sprite *sprite) +{ + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3])); + if (sprite->data[3] == 13) + sprite->callback = sub_810F400; + else + sprite->data[3]++; +} + +static void sub_810F400(struct Sprite *sprite) +{ + u16 color; + u16 startOffset; + int i; + + if (++sprite->data[1] == 2) + { + sprite->data[1] = 0; + startOffset = sprite->data[0]; + color = gPlttBufferFaded[startOffset + 8]; + + for (i = 8; i > 0; i--) + gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1]; + + gPlttBufferFaded[startOffset + 1] = color; + + if (++sprite->data[2] == 16) + sprite->callback = sub_810F46C; + } +} + +static void sub_810F46C(struct Sprite *sprite) +{ + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3])); + + if (--sprite->data[3] == -1) + { + if (!IsContest()) + { + u8 battlerCopy; + u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + + if (IsBattlerSpriteVisible(battler)) + gSprites[gBattlerSpriteIds[battler]].invisible = 0; + + battler = BATTLE_PARTNER(battlerCopy); + if (IsBattlerSpriteVisible(battler)) + gSprites[gBattlerSpriteIds[battler]].invisible = 0; + } + + sprite->invisible = 1; + sprite->callback = sub_810F524; + } +} + +static void sub_810F524(struct Sprite *sprite) +{ + if (!IsContest()) + { + u8 battlerCopy; + u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + u8 rank = GetBattlerSpriteBGPriorityRank(battler); + int var0 = 1; + u8 toBG_2 = (rank ^ var0) != 0; + + if (IsBattlerSpriteVisible(battler)) + sub_80A477C(toBG_2); + + battler = battlerCopy ^ 2; + if (IsBattlerSpriteVisible(battler)) + sub_80A477C(toBG_2 ^ var0); + } + + sprite->callback = DestroyAnimSprite; +} + +void sub_810F58C(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + int arg3 = gBattleAnimArgs[3]; + bool8 respectMonPicOffsets = FALSE; + if (arg3 == 0) + respectMonPicOffsets = TRUE; + + if (!IsContest() && IsDoubleBattle()) + { + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) + { + sprite->pos1.x = 72 - gBattleAnimArgs[0]; + sprite->pos1.y = gBattleAnimArgs[1] + 80; + } + else + { + sprite->pos1.x = gBattleAnimArgs[0] + 176; + sprite->pos1.y = gBattleAnimArgs[1] + 40; + } + } + else + { + if (gBattleAnimArgs[2] == 0) + InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets); + else + InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); + } + + sprite->data[0]++; + } + else + { + if (sprite->animEnded || sprite->affineAnimEnded) + DestroySpriteAndMatrix(sprite); + } +} + +void sub_810F634(struct Sprite *sprite) +{ + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); + + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + { + StartSpriteAnim(sprite, 1); + sprite->pos1.x -= 40; + sprite->pos1.y += 10; + sprite->data[1] = -1; + } + else + { + sprite->pos1.x += 40; + sprite->pos1.y -= 10; + sprite->data[1] = 1; + } + + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); + sprite->callback = RunStoredCallbackWhenAnimEnds; +} + +void sub_810F6B0(struct Sprite *sprite) +{ + s16 x = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2; + s16 y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / -2; + + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) + x = -x; + + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + x; + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + y; + + if (sprite->pos1.y < 16) + sprite->pos1.y = 16; + + StoreSpriteCallbackInData6(sprite, sub_810F740); + sprite->callback = RunStoredCallbackWhenAnimEnds; +} + +static void sub_810F740(struct Sprite *sprite) +{ + sprite->oam.affineMode = 1; + sprite->affineAnims = gUnknown_08596740; + sprite->data[0] = 0; + InitSpriteAffineAnim(sprite); + sprite->callback = sub_810F774; +} + +static void sub_810F774(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (sprite->affineAnimEnded) + { + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = 0; + sprite->data[1] = 18; + sprite->data[0]++; + } + break; + case 1: + if (--sprite->data[1] == -1) + DestroyAnimSprite(sprite); + break; + } +} + +void sub_810F7D4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); + task->data[0] = spriteId; + PrepareAffineAnimInTaskData(task, spriteId, gUnknown_0859675C); + task->func = sub_810F810; +} + +static void sub_810F810(u8 taskId) +{ + if (!RunAffineAnimFromTaskData(&gTasks[taskId])) + DestroyAnimVisualTask(taskId); +} + +void sub_810F83C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); + task->data[0] = spriteId; + task->data[1] = 0; + task->data[2] = 0; + task->data[3] = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 4 : 8; + + PrepareAffineAnimInTaskData(task, task->data[0], gUnknown_0859677C); + task->func = sub_810F898; +} + +static void sub_810F898(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[1]) + { + case 0: + RunAffineAnimFromTaskData(task); + if (++task->data[2] > 19) + task->data[1]++; + break; + case 1: + if (task->data[3] != 0) + { + gSprites[task->data[0]].pos2.y -= 8; + task->data[3]--; + } + else + { + gSprites[task->data[0]].invisible = 1; + gSprites[task->data[0]].pos1.x = 272; + ResetSpriteRotScale(task->data[0]); + DestroyAnimVisualTask(taskId); + } + break; + } +} + +void sub_810F940(u8 taskId) +{ + u16 var0, var1; + + struct Task *task = &gTasks[taskId]; + + task->data[3] = 16; + task->data[4] = 0; + task->data[13] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); + task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); + + var0 = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 3; + var1 = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 3; + task->data[12] = var0 > var1 ? var0 : var1; + + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); + + task->func = sub_810F9D4; +} + +static void sub_810F9D4(u8 taskId) +{ + u16 i; + u8 spriteId; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (++task->data[1] > 8) + { + task->data[1] = 0; + spriteId = CreateSprite(&gUnknown_08596794, task->data[13], task->data[14], 0); + task->data[task->data[2] + 8] = spriteId; + if (spriteId != MAX_SPRITES) + { + switch (task->data[2]) + { + case 0: + gSprites[spriteId].pos2.x = task->data[12]; + gSprites[spriteId].pos2.y = -task->data[12]; + break; + case 1: + gSprites[spriteId].pos2.x = -task->data[12]; + gSprites[spriteId].pos2.y = task->data[12]; + break; + case 2: + gSprites[spriteId].pos2.x = task->data[12]; + gSprites[spriteId].pos2.y = task->data[12]; + break; + case 3: + gSprites[spriteId].pos2.x = -task->data[12]; + gSprites[spriteId].pos2.y = -task->data[12]; + break; + } + } + + if (++task->data[2] == 5) + task->data[0]++; + } + break; + case 1: + if (task->data[1] & 1) + task->data[3]--; + else + task->data[4]++; + + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4])); + if (++task->data[1] == 32) + { + for (i = 8; i < 13; i++) + { + if (task->data[i] != 64) + DestroySprite(&gSprites[task->data[i]]); + } + + task->data[0]++; + } + break; + case 2: + task->data[0]++; + break; + case 3: + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + DestroyAnimVisualTask(taskId); + break; + } +} + +static void sub_810FB60(struct Sprite *sprite) +{ + if (sprite->data[1] > sprite->data[0] - 10) + sprite->invisible = sprite->data[1] & 1; + + if (sprite->data[1] == sprite->data[0]) + DestroyAnimSprite(sprite); + + sprite->data[1]++; +} + +void sub_810FBA8(struct Sprite *sprite) +{ + if (gBattleAnimArgs[0] == 0) + { + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); + } + + sprite->data[0] = gBattleAnimArgs[1]; + sprite->callback = sub_810FB60; +} + +void sub_810FBF0(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (IsContest()) + { + if (gBattleAnimArgs[0] == 1) + { + task->data[10] = -10; + task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8; + task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) + 8; + task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_RIGHT) - 8; + task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) + 8; + } + else + { + task->data[10] = 10; + task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_LEFT) + 8; + task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM) - 8; + task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_LEFT) + 8; + task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_BOTTOM) - 8; + } + } + else + { + if (gBattleAnimArgs[0] == 1) + { + task->data[10] = -10; + task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_LEFT) + 8; + task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) + 8; + task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_LEFT) + 8; + task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) + 8; + } + else + { + task->data[10] = 10; + task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_RIGHT) - 8; + task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM) - 8; + task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8; + task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_BOTTOM) - 8; + } + } + + task->data[1] = 6; + task->func = sub_810FD3C; +} + +static void sub_810FD3C(u8 taskId) +{ + u8 spriteId; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (++task->data[1] > 6) + { + task->data[1] = 0; + spriteId = CreateSprite(&gUnknown_08596864, task->data[11], task->data[12], 0); + if (spriteId != 64) + { + gSprites[spriteId].data[0] = 16; + gSprites[spriteId].data[2] = task->data[13]; + gSprites[spriteId].data[4] = task->data[14]; + gSprites[spriteId].data[5] = task->data[10]; + + InitAnimArcTranslation(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], task->data[2] & 3); + } + + if (++task->data[2] == 12) + task->data[0]++; + } + break; + case 1: + if (++task->data[1] > 17) + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_810FDF0(struct Sprite *sprite) +{ + if (TranslateAnimArc(sprite)) + { + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); + } +} + +void sub_810FE14(u8 taskId) +{ + s16 i; + u8 yOffset; + struct ScanlineEffectParams scanlineParams; + struct Task *task = &gTasks[taskId]; + + yOffset = GetBattlerYCoordWithElevation(gBattleAnimTarget); + task->data[14] = yOffset - 32; + + switch (gBattleAnimArgs[0]) + { + case 0: + task->data[11] = 2; + task->data[12] = 5; + task->data[13] = 64; + task->data[15] = yOffset + 32; + break; + case 1: + task->data[11] = 2; + task->data[12] = 5; + task->data[13] = 192; + task->data[15] = yOffset + 32; + break; + case 2: + task->data[11] = 4; + task->data[12] = 4; + task->data[13] = 0; + task->data[15] = yOffset + 32; + break; + } + + if (task->data[14] < 0) + task->data[14] = 0; + + if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1) + { + task->data[10] = gBattle_BG1_X; + scanlineParams.dmaDest = ®_BG1HOFS; + } + else + { + task->data[10] = gBattle_BG2_X; + scanlineParams.dmaDest = ®_BG2HOFS; + } + + i = task->data[14]; + while (i <= task->data[14] + 64) + { + gScanlineEffectRegBuffers[0][i] = task->data[10]; + gScanlineEffectRegBuffers[1][i] = task->data[10]; + i++; + } + + scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; + scanlineParams.initState = 1; + scanlineParams.unused9 = 0; + ScanlineEffect_SetParams(scanlineParams); + task->func = sub_810FF34; +} + +static void sub_810FF34(u8 taskId) +{ + s16 sineIndex, i; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + sineIndex = task->data[13]; + i = task->data[14]; + while (i <= task->data[15]) + { + s16 var2 = (gSineTable[sineIndex] >> task->data[12]); + if (var2 > 0) + var2 += (task->data[1] & 3); + else if (var2 < 0) + var2 -= (task->data[1] & 3); + + gScanlineEffectRegBuffers[0][i] = task->data[10] + var2; + gScanlineEffectRegBuffers[1][i] = task->data[10] + var2; + sineIndex += task->data[11]; + i++; + } + + if (++task->data[1] > 23) + task->data[0]++; + break; + case 1: + gScanlineEffect.state = 3; + task->data[0]++; + break; + case 2: + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_8110034(u8 taskId) +{ + s16 spriteId; + s16 matrixNum; + struct Task *task = &gTasks[taskId]; + + matrixNum = AllocOamMatrix(); + if (matrixNum == 0xFF) + { + DestroyAnimVisualTask(taskId); + return; + } + + spriteId = CloneBattlerSpriteWithBlend(gBattleAnimArgs[0]); + if (spriteId < 0) + { + FreeOamMatrix(matrixNum); + DestroyAnimVisualTask(taskId); + return; + } + + gSprites[spriteId].callback = SpriteCallbackDummy; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; + gSprites[spriteId].oam.matrixNum = matrixNum; + gSprites[spriteId].affineAnimPaused = 1; + gSprites[spriteId].subpriority++; + SetSpriteRotScale(spriteId, 256, 256, 0); + CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode); + task->data[13] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); + task->data[14] = matrixNum; + task->data[15] = spriteId; + task->func = sub_8110134; +} + +static void sub_8110134(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[1] += 4; + task->data[2] = 256 - (gSineTable[task->data[1]] >> 1); + SetSpriteRotScale(task->data[15], task->data[2], task->data[2], 0); + SetBattlerSpriteYOffsetFromOtherYScale(task->data[15], task->data[13]); + if (task->data[1] == 48) + task->data[0]++; + break; + case 1: + task->data[1] -= 4; + task->data[2] = 256 - (gSineTable[task->data[1]] >> 1);; + SetSpriteRotScale(task->data[15], task->data[2], task->data[2], 0); + SetBattlerSpriteYOffsetFromOtherYScale(task->data[15], task->data[13]); + if (task->data[1] == 0) + task->data[0]++; + break; + case 2: + obj_delete_but_dont_free_vram(&gSprites[task->data[15]]); + task->data[0]++; + break; + case 3: + FreeOamMatrix(task->data[14]); + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_8110240(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); + + if (IsContest()) + sprite->pos1.y += 12; + + sprite->data[1] = 8; + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1])); + sprite->data[0]++; + break; + case 1: + if (sprite->affineAnimEnded) + { + PlaySE12WithPanning(SE_W100, BattleAnimAdjustPanning(-64)); + ChangeSpriteAffineAnim(sprite, 1); + sprite->data[0]++; + } + break; + case 2: + if (sprite->data[2]++ > 1) + { + sprite->data[2] = 0; + sprite->data[1]--; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1])); + if (sprite->data[1] == 0) + { + sprite->data[0]++; + sprite->invisible = 1; + } + } + + sprite->data[3] += 0x380; + sprite->pos2.y -= sprite->data[3] >> 8; + sprite->data[3] &= 0xFF; + break; + case 3: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + DestroyAnimSprite(sprite); + break; + } +} diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index b22e1db32..00a73a0a2 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -1528,14 +1528,14 @@ static void sub_81D706C(void) LZDecompressWram(gRaySceneClouds1_Tilemap, sRayScene->tilemapBuffers[1]); LZDecompressWram(gRaySceneClouds3_Tilemap, sRayScene->tilemapBuffers[2]); LoadCompressedPalette(gRaySceneClouds_Pal, 0, 0x40); - LoadCompressedObjectPic(&sUnknown_0862A8C4); - LoadCompressedObjectPic(&sUnknown_0862A8F8); - LoadCompressedObjectPic(&sUnknown_0862A924); - LoadCompressedObjectPic(&sUnknown_0862A9D4); - LoadCompressedObjectPic(&sUnknown_0862AA14); - LoadCompressedObjectPic(&sUnknown_0862AA34); - LoadCompressedObjectPalette(&sUnknown_0862A8CC); - LoadCompressedObjectPalette(&sUnknown_0862A9DC); + LoadCompressedSpriteSheet(&sUnknown_0862A8C4); + LoadCompressedSpriteSheet(&sUnknown_0862A8F8); + LoadCompressedSpriteSheet(&sUnknown_0862A924); + LoadCompressedSpriteSheet(&sUnknown_0862A9D4); + LoadCompressedSpriteSheet(&sUnknown_0862AA14); + LoadCompressedSpriteSheet(&sUnknown_0862AA34); + LoadCompressedSpritePalette(&sUnknown_0862A8CC); + LoadCompressedSpritePalette(&sUnknown_0862A9DC); } static void Task_DuoFightAnim(u8 taskId) @@ -1708,7 +1708,7 @@ static void sub_81D752C(u8 taskId) if (data[0] != 16) { data[0]++; - SetGpuReg(REG_OFFSET_BLDALPHA, (data[0] << 8) | (16 - data[0])); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - data[0], data[0])); } } @@ -1943,8 +1943,8 @@ static void sub_81D7E9C(void) LZDecompressWram(gRaySceneOvercast_Tilemap, sRayScene->tilemapBuffers[1]); LZDecompressWram(gRaySceneRayquaza_Tilemap, sRayScene->tilemapBuffers[2]); LoadCompressedPalette(gRaySceneRayquaza_Pal, 0, 0x40); - LoadCompressedObjectPic(&sUnknown_0862AA90); - LoadCompressedObjectPalette(&sUnknown_0862AA98); + LoadCompressedSpriteSheet(&sUnknown_0862AA90); + LoadCompressedSpritePalette(&sUnknown_0862AA98); } static void Task_RayTakesFlightAnim(u8 taskId) @@ -1954,7 +1954,7 @@ static void Task_RayTakesFlightAnim(u8 taskId) sub_81D7E10(); sub_81D7E9C(); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x808); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8)); BlendPalettes(-1, 0x10, 0); SetVBlankCallback(VBlankCB_RayquazaScene); CreateTask(sub_81D81A4, 0); @@ -2118,9 +2118,9 @@ static void sub_81D8358(void) LoadCompressedPalette(gRaySceneOvercast2_Pal, 0, 0x40); gPlttBufferUnfaded[0] = RGB_WHITE; gPlttBufferFaded[0] = RGB_WHITE; - LoadCompressedObjectPic(&sUnknown_0862AAFC); - LoadCompressedObjectPic(&sUnknown_0862AB04); - LoadCompressedObjectPalette(&sUnknown_0862AB0C); + LoadCompressedSpriteSheet(&sUnknown_0862AAFC); + LoadCompressedSpriteSheet(&sUnknown_0862AB04); + LoadCompressedSpritePalette(&sUnknown_0862AB0C); } static void sub_81D844C(void) @@ -2153,7 +2153,7 @@ static void Task_RayDescendsAnim(u8 taskId) sub_81D82B0(); sub_81D8358(); SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x1000); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); BlendPalettes(-1, 0x10, 0); SetVBlankCallback(VBlankCB_RayquazaScene); sRayScene->field_2008 = 0; @@ -2489,16 +2489,16 @@ static void sub_81D8CC4(void) LZDecompressWram(gRaySceneHushBg_Tilemap, sRayScene->tilemapBuffers[0]); LZDecompressWram(gRaySceneHushRing_Map, sRayScene->tilemapBuffers[2]); LoadCompressedPalette(gRaySceneHushBg_Pal, 0, 0x60); - LoadCompressedObjectPic(&sUnknown_0862AC28); - LoadCompressedObjectPic(&sUnknown_0862AC30); - LoadCompressedObjectPic(&sUnknown_0862AC38); - LoadCompressedObjectPic(&sUnknown_0862AC40); - LoadCompressedObjectPic(&sUnknown_0862AC48); - LoadCompressedObjectPic(&sUnknown_0862AC50); - LoadCompressedObjectPalette(&sUnknown_0862AC58); - LoadCompressedObjectPalette(&sUnknown_0862AC60); - LoadCompressedObjectPalette(&sUnknown_0862AC68); - LoadCompressedObjectPalette(&sUnknown_0862AC70); + LoadCompressedSpriteSheet(&sUnknown_0862AC28); + LoadCompressedSpriteSheet(&sUnknown_0862AC30); + LoadCompressedSpriteSheet(&sUnknown_0862AC38); + LoadCompressedSpriteSheet(&sUnknown_0862AC40); + LoadCompressedSpriteSheet(&sUnknown_0862AC48); + LoadCompressedSpriteSheet(&sUnknown_0862AC50); + LoadCompressedSpritePalette(&sUnknown_0862AC58); + LoadCompressedSpritePalette(&sUnknown_0862AC60); + LoadCompressedSpritePalette(&sUnknown_0862AC68); + LoadCompressedSpritePalette(&sUnknown_0862AC70); } static void Task_RayChasesAwayAnim(u8 taskId) @@ -2509,7 +2509,7 @@ static void Task_RayChasesAwayAnim(u8 taskId) sub_81D68C8(); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND); - SetGpuReg(REG_OFFSET_BLDALPHA, 0xE09); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(9, 14)); BlendPalettes(-1, 0x10, 0); SetVBlankCallback(VBlankCB_RayquazaScene); data[0] = 0; diff --git a/src/record_mixing.c b/src/record_mixing.c index 2b497c82b..189033685 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -741,711 +741,184 @@ static u8 sub_80E7B54(void) return gUnknown_03001160; } -#ifdef NONMATCHING static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows) { - // r9 = which - u16 i; - u16 j; + u16 i, j; u8 linkPlayerCount; - u16 language; - u16 otNameLanguage; - u16 nicknameLanguage; - u32 version; - u8 dcMail1; - u8 dcMail2; - u8 r1_80e7b54; - struct DayCareMail *recordMixingMail; + u8 tableId; struct RecordMixingDayCareMail *_src; + u8 which0, which1; + void *ptr; u8 sp04[4]; u8 sp08[4]; - struct RecordMixingDayCareMail *sp0c[4]; // -> sp+48 - u8 sp1c[4][2]; // [][0] -> sp+4c, [][1] -> sp+50 + struct RecordMixingDayCareMail *sp0c[4]; + u8 sp1c[4][2]; u8 sp24[4][2]; - // sp+2c = src - // sp+30 = recordSize u8 sp34; u16 oldSeed; - bool32 anyRS; // sp+3c + bool32 anyRS; oldSeed = Random2(); SeedRng2(gLinkPlayers[0].trainerId); linkPlayerCount = GetLinkPlayerCount(); - for (i = 0; i < 4; i ++) + for (i = 0; i < 4; i++) { sp04[i] = 0xFF; sp08[i] = 0; sp1c[i][0] = 0; sp1c[i][1] = 0; } + anyRS = Link_AnyPartnersPlayingRubyOrSapphire(); - for (i = 0; i < GetLinkPlayerCount(); i ++) // r8 = i + for (i = 0; i < GetLinkPlayerCount(); i++) { - // sp+54 = linkPlayerCount << 16 - // sp+44 = which * recordSize - _src = (void *)src + i * recordSize; // r7 - language = gLinkPlayers[i].language; // r9 - version = (u8)gLinkPlayers[i].version; // sp+40 - for (j = 0; j < _src->unk_70; j ++) + u32 language, version; + + _src = (void *)src + i * recordSize; + language = gLinkPlayers[i].language; + version = gLinkPlayers[i].version & 0xFF; + for (j = 0; j < _src->numDaycareMons; j ++) { - // r10 = ~0x10 - recordMixingMail = &_src->unk_00[j]; - if (recordMixingMail->mail.itemId != ITEM_NONE) + u16 otNameLanguage, nicknameLanguage; + struct DayCareMail *recordMixingMail = &_src->mail[j]; + + if (!recordMixingMail->message.itemId) + continue; + + if (anyRS) { - if (anyRS) + if (StringLength(recordMixingMail->OT_name) <= 5) { - if (StringLength(recordMixingMail->OT_name) <= 5) - { - otNameLanguage = LANGUAGE_JAPANESE; - } - else - { - StripExtCtrlCodes(recordMixingMail->OT_name); - otNameLanguage = language; - } - if (recordMixingMail->monName[0] == EXT_CTRL_CODE_BEGIN && recordMixingMail->monName[1] == EXT_CTRL_CODE_JPN) - { - StripExtCtrlCodes(recordMixingMail->monName); - nicknameLanguage = LANGUAGE_JAPANESE; - } - else - { - nicknameLanguage = language; - } - if (version == VERSION_RUBY || version == VERSION_SAPPHIRE) - { - recordMixingMail->language_maybe = otNameLanguage; - recordMixingMail->unknown = nicknameLanguage; - } + otNameLanguage = LANGUAGE_JAPANESE; } - else if (language == LANGUAGE_JAPANESE) + else { - if (IsStringJapanese(recordMixingMail->OT_name)) - { - recordMixingMail->language_maybe = LANGUAGE_JAPANESE; - } - else - { - recordMixingMail->language_maybe = GAME_LANGUAGE; - } - if (IsStringJapanese(recordMixingMail->monName)) - { - recordMixingMail->unknown = LANGUAGE_JAPANESE; - } - else - { - recordMixingMail->unknown = GAME_LANGUAGE; - } + StripExtCtrlCodes(recordMixingMail->OT_name); + otNameLanguage = language; + } + + if (recordMixingMail->monName[0] == EXT_CTRL_CODE_BEGIN && recordMixingMail->monName[1] == EXT_CTRL_CODE_JPN) + { + StripExtCtrlCodes(recordMixingMail->monName); + nicknameLanguage = LANGUAGE_JAPANESE; + } + else + { + nicknameLanguage = language; + } + + if (version == VERSION_RUBY || version == VERSION_SAPPHIRE) + { + recordMixingMail->gameLanguage = otNameLanguage; + recordMixingMail->monLanguage = nicknameLanguage; } } + else if (language == LANGUAGE_JAPANESE) + { + if (IsStringJapanese(recordMixingMail->OT_name)) + recordMixingMail->gameLanguage = LANGUAGE_JAPANESE; + else + recordMixingMail->gameLanguage = GAME_LANGUAGE; + + if (IsStringJapanese(recordMixingMail->monName)) + recordMixingMail->monLanguage = LANGUAGE_JAPANESE; + else + recordMixingMail->monLanguage = GAME_LANGUAGE; + } } } + sp34 = 0; - for (i = 0; i < linkPlayerCount; i ++) + for (i = 0; i < linkPlayerCount; i++) { - _src = (void *)src + i * recordSize; // r7 - if (_src->unk_70 != 0) + _src = (void *)src + i * recordSize; + if (_src->numDaycareMons == 0) + continue; + + for (j = 0; j < _src->numDaycareMons; j ++) { - for (j = 0; j < _src->unk_70; j ++) - { - if (_src->unk_74[j] == 0) - { - sp1c[i][j] = 1; - } - } + if (!_src->holdsItem[j]) + sp1c[i][j] = 1; } } - i = 0; - for (j = 0; j < linkPlayerCount; j ++) + + j = 0; + for (i = 0; i < linkPlayerCount; i++) { - _src = (void *)src + j * recordSize; - if (sp1c[j][0] == TRUE || sp1c[j][1] == TRUE) - { - sp34 ++; - } - if (sp1c[j][0] == TRUE && sp1c[j][1] == FALSE) + _src = (void *)src + i * recordSize; + if (sp1c[i][0] == TRUE || sp1c[i][1] == TRUE) + sp34++; + + if (sp1c[i][0] == TRUE && sp1c[i][1] == FALSE) { - sp24[i][0] = j; - sp24[i][1] = 0; - i ++; + sp24[j][0] = i; + sp24[j][1] = 0; + j++; } - else if (sp1c[j][0] == FALSE && sp1c[j][1] == TRUE) + else if (sp1c[i][0] == FALSE && sp1c[i][1] == TRUE) { - sp24[i][0] = j; - sp24[i][1] = 0; - i ++; + sp24[j][0] = i; + sp24[j][1] = 1; + j++; } - else if (sp1c[j][0] == TRUE && sp1c[j][1] == TRUE) + else if (sp1c[i][0] == TRUE && sp1c[i][1] == TRUE) { - sp24[i][0] = j; - dcMail1 = sub_80E7A9C(&_src->unk_00[0]); - dcMail2 = sub_80E7A9C(&_src->unk_00[1]); - if (!dcMail1 && dcMail2) + u32 var1, var2; + + sp24[j][0] = i; + var1 = sub_80E7A9C(&_src->mail[0]); + var2 = sub_80E7A9C(&_src->mail[1]); + if (!var1 && var2) { - sp24[i][1] = 1; + register u8 one asm("r0") = 1; // boo, a fakematch + sp24[j][1] = one; } - else if ((dcMail1 && dcMail2) || (!dcMail1 && !dcMail2)) + else if ((var1 && var2) || (!var1 && !var2)) { - sp24[i][1] = Random2() % 2; + sp24[j][1] = Random2() % 2; } - else + else if (var1 && !var2) { - sp24[i][1] = 0; + sp24[j][1] = 0; } - i ++; + j++; } } - for (i = 0; i < 4; i ++) + + for (i = 0; i < 4; i++) { _src = &src[which * recordSize]; sp0c[i] = _src; } - r1_80e7b54 = sub_80E7B54() % 3; + + tableId = sub_80E7B54() % 3; switch (sp34) { - case 2: - sub_80E7AA4(src, recordSize, sp24, 0, 1); - break; - case 3: - sub_80E7AA4(src, recordSize, sp24, gUnknown_0858CFB8[r1_80e7b54][0], gUnknown_0858CFB8[r1_80e7b54][1]); - break; - case 4: - sub_80E7AA4(src, recordSize, sp24, gUnknown_0858CFBE[r1_80e7b54][0], gUnknown_0858CFBE[r1_80e7b54][1]); - sub_80E7AA4(src, recordSize, sp24, gUnknown_0858CFBE[r1_80e7b54][2], gUnknown_0858CFBE[r1_80e7b54][3]); - break; + case 2: + sub_80E7AA4(src, recordSize, sp24, 0, 1); + break; + case 3: + which0 = gUnknown_0858CFB8[tableId][0]; + which1 = gUnknown_0858CFB8[tableId][1]; + sub_80E7AA4(src, recordSize, sp24, which0, which1); + break; + case 4: + ptr = sp24; + which0 = gUnknown_0858CFBE[tableId][0]; + which1 = gUnknown_0858CFBE[tableId][1]; + sub_80E7AA4(src, recordSize, ptr, which0, which1); + which0 = gUnknown_0858CFBE[tableId][2]; + which1 = gUnknown_0858CFBE[tableId][3]; + sub_80E7AA4(src, recordSize, ptr, which0, which1); + break; } + _src = (void *)src + which * recordSize; - memcpy(&gSaveBlock1Ptr->daycare.mons[0].misc.mail, &_src->unk_00[0], sizeof(struct DayCareMail)); - memcpy(&gSaveBlock1Ptr->daycare.mons[1].misc.mail, &_src->unk_00[1], sizeof(struct DayCareMail)); + memcpy(&gSaveBlock1Ptr->daycare.mons[0].mail, &_src->mail[0], sizeof(struct DayCareMail)); + memcpy(&gSaveBlock1Ptr->daycare.mons[1].mail, &_src->mail[1], sizeof(struct DayCareMail)); SeedRng(oldSeed); } -#else -NAKED -static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0x58\n" - "\tstr r0, [sp, 0x2C]\n" - "\tstr r1, [sp, 0x30]\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tmov r9, r2\n" - "\tbl Random2\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tstr r0, [sp, 0x38]\n" - "\tldr r0, =gLinkPlayers\n" - "\tldrh r0, [r0, 0x4]\n" - "\tbl SeedRng2\n" - "\tbl GetLinkPlayerCount\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tmovs r0, 0\n" - "\tmov r8, r0\n" - "\tmov r1, sp\n" - "\tadds r1, 0x1C\n" - "\tstr r1, [sp, 0x4C]\n" - "\tmov r2, sp\n" - "\tadds r2, 0x1D\n" - "\tstr r2, [sp, 0x50]\n" - "\tmov r3, sp\n" - "\tadds r3, 0xC\n" - "\tstr r3, [sp, 0x48]\n" - "\tmovs r7, 0xFF\n" - "\tadd r3, sp, 0x8\n" - "\tmovs r2, 0\n" - "\tadds r6, r1, 0\n" - "\tldr r5, [sp, 0x50]\n" - "_080E7BB0:\n" - "\tmov r1, sp\n" - "\tadd r1, r8\n" - "\tadds r1, 0x4\n" - "\tldrb r0, [r1]\n" - "\torrs r0, r7\n" - "\tstrb r0, [r1]\n" - "\tmov r1, r8\n" - "\tadds r0, r3, r1\n" - "\tstrb r2, [r0]\n" - "\tlsls r1, 1\n" - "\tadds r0, r6, r1\n" - "\tstrb r2, [r0]\n" - "\tadds r1, r5, r1\n" - "\tstrb r2, [r1]\n" - "\tmov r0, r8\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r8, r0\n" - "\tcmp r0, 0x3\n" - "\tbls _080E7BB0\n" - "\tbl Link_AnyPartnersPlayingRubyOrSapphire\n" - "\tstr r0, [sp, 0x3C]\n" - "\tmovs r2, 0\n" - "\tmov r8, r2\n" - "\tlsls r4, 16\n" - "\tstr r4, [sp, 0x54]\n" - "\tldr r0, [sp, 0x30]\n" - "\tmov r3, r9\n" - "\tmuls r3, r0\n" - "\tstr r3, [sp, 0x44]\n" - "\tb _080E7D04\n" - "\t.pool\n" - "_080E7BF8:\n" - "\tldr r1, [sp, 0x30]\n" - "\tmov r0, r8\n" - "\tmuls r0, r1\n" - "\tldr r2, [sp, 0x2C]\n" - "\tadds r7, r2, r0\n" - "\tldr r1, =gLinkPlayers\n" - "\tmov r3, r8\n" - "\tlsls r0, r3, 3\n" - "\tsubs r0, r3\n" - "\tlsls r0, 2\n" - "\tadds r0, r1\n" - "\tldrh r1, [r0, 0x1A]\n" - "\tmov r9, r1\n" - "\tldrb r0, [r0]\n" - "\tstr r0, [sp, 0x40]\n" - "\tmovs r6, 0\n" - "\tldr r0, [r7, 0x70]\n" - "\tcmp r6, r0\n" - "\tbcs _080E7CFA\n" - "\tmovs r2, 0x10\n" - "\tnegs r2, r2\n" - "\tmov r10, r2\n" - "_080E7C24:\n" - "\tlsls r0, r6, 3\n" - "\tsubs r0, r6\n" - "\tlsls r0, 3\n" - "\tadds r5, r7, r0\n" - "\tldrh r0, [r5, 0x20]\n" - "\tcmp r0, 0\n" - "\tbeq _080E7CEE\n" - "\tldr r3, [sp, 0x3C]\n" - "\tcmp r3, 0\n" - "\tbeq _080E7C9A\n" - "\tadds r4, r5, 0\n" - "\tadds r4, 0x24\n" - "\tadds r0, r4, 0\n" - "\tbl StringLength\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tcmp r0, 0x5\n" - "\tbhi _080E7C54\n" - "\tmovs r4, 0x1\n" - "\tb _080E7C5C\n" - "\t.pool\n" - "_080E7C54:\n" - "\tadds r0, r4, 0\n" - "\tbl StripExtCtrlCodes\n" - "\tmov r4, r9\n" - "_080E7C5C:\n" - "\tldrh r1, [r5, 0x2C]\n" - "\tldr r0, =0x000015fc\n" - "\tcmp r1, r0\n" - "\tbne _080E7C74\n" - "\tadds r0, r5, 0\n" - "\tadds r0, 0x2C\n" - "\tbl StripExtCtrlCodes\n" - "\tmovs r1, 0x1\n" - "\tb _080E7C76\n" - "\t.pool\n" - "_080E7C74:\n" - "\tmov r1, r9\n" - "_080E7C76:\n" - "\tldr r0, [sp, 0x40]\n" - "\tsubs r0, 0x1\n" - "\tcmp r0, 0x1\n" - "\tbhi _080E7CEE\n" - "\tadds r2, r5, 0\n" - "\tadds r2, 0x37\n" - "\tmovs r0, 0xF\n" - "\tands r4, r0\n" - "\tldrb r0, [r2]\n" - "\tmov r3, r10\n" - "\tands r0, r3\n" - "\torrs r0, r4\n" - "\tlsls r1, 4\n" - "\tmovs r3, 0xF\n" - "\tands r0, r3\n" - "\torrs r0, r1\n" - "\tstrb r0, [r2]\n" - "\tb _080E7CEE\n" - "_080E7C9A:\n" - "\tmov r0, r9\n" - "\tcmp r0, 0x1\n" - "\tbne _080E7CEE\n" - "\tadds r0, r5, 0\n" - "\tadds r0, 0x24\n" - "\tbl IsStringJapanese\n" - "\tcmp r0, 0\n" - "\tbeq _080E7CBA\n" - "\tadds r0, r5, 0\n" - "\tadds r0, 0x37\n" - "\tldrb r1, [r0]\n" - "\tmov r2, r10\n" - "\tands r1, r2\n" - "\tmovs r2, 0x1\n" - "\tb _080E7CC6\n" - "_080E7CBA:\n" - "\tadds r0, r5, 0\n" - "\tadds r0, 0x37\n" - "\tldrb r1, [r0]\n" - "\tmov r3, r10\n" - "\tands r1, r3\n" - "\tmovs r2, 0x2\n" - "_080E7CC6:\n" - "\torrs r1, r2\n" - "\tstrb r1, [r0]\n" - "\tadds r4, r0, 0\n" - "\tadds r0, r5, 0\n" - "\tadds r0, 0x2C\n" - "\tbl IsStringJapanese\n" - "\tcmp r0, 0\n" - "\tbeq _080E7CE2\n" - "\tldrb r0, [r4]\n" - "\tmovs r1, 0xF\n" - "\tands r1, r0\n" - "\tmovs r0, 0x10\n" - "\tb _080E7CEA\n" - "_080E7CE2:\n" - "\tldrb r0, [r4]\n" - "\tmovs r1, 0xF\n" - "\tands r1, r0\n" - "\tmovs r0, 0x20\n" - "_080E7CEA:\n" - "\torrs r1, r0\n" - "\tstrb r1, [r4]\n" - "_080E7CEE:\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "\tldr r0, [r7, 0x70]\n" - "\tcmp r6, r0\n" - "\tbcc _080E7C24\n" - "_080E7CFA:\n" - "\tmov r0, r8\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r8, r0\n" - "_080E7D04:\n" - "\tbl GetLinkPlayerCount\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r8, r0\n" - "\tbcs _080E7D12\n" - "\tb _080E7BF8\n" - "_080E7D12:\n" - "\tmovs r0, 0\n" - "\tstr r0, [sp, 0x34]\n" - "\tmov r8, r0\n" - "\tldr r1, [sp, 0x54]\n" - "\tlsrs r0, r1, 16\n" - "\tldr r2, [sp, 0x34]\n" - "\tcmp r2, r0\n" - "\tbcs _080E7D70\n" - "\tadds r5, r0, 0\n" - "_080E7D24:\n" - "\tldr r3, [sp, 0x30]\n" - "\tmov r0, r8\n" - "\tmuls r0, r3\n" - "\tldr r1, [sp, 0x2C]\n" - "\tadds r7, r1, r0\n" - "\tldr r0, [r7, 0x70]\n" - "\tcmp r0, 0\n" - "\tbeq _080E7D62\n" - "\tmovs r6, 0\n" - "\tcmp r6, r0\n" - "\tbcs _080E7D62\n" - "\tadds r3, r7, 0\n" - "\tadds r3, 0x74\n" - "\tldr r2, [sp, 0x4C]\n" - "\tmov r0, r8\n" - "\tlsls r1, r0, 1\n" - "\tmovs r4, 0x1\n" - "_080E7D46:\n" - "\tlsls r0, r6, 1\n" - "\tadds r0, r3, r0\n" - "\tldrh r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _080E7D56\n" - "\tadds r0, r6, r1\n" - "\tadds r0, r2, r0\n" - "\tstrb r4, [r0]\n" - "_080E7D56:\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "\tldr r0, [r7, 0x70]\n" - "\tcmp r6, r0\n" - "\tbcc _080E7D46\n" - "_080E7D62:\n" - "\tmov r0, r8\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r8, r0\n" - "\tcmp r8, r5\n" - "\tbcc _080E7D24\n" - "_080E7D70:\n" - "\tmovs r6, 0\n" - "\tmov r8, r6\n" - "\tldr r1, [sp, 0x54]\n" - "\tcmp r1, 0\n" - "\tbeq _080E7E64\n" - "\tadd r2, sp, 0x24\n" - "\tmov r10, r2\n" - "\tmovs r3, 0x25\n" - "\tadd r3, sp\n" - "\tmov r9, r3\n" - "_080E7D84:\n" - "\tldr r1, [sp, 0x30]\n" - "\tmov r0, r8\n" - "\tmuls r0, r1\n" - "\tldr r2, [sp, 0x2C]\n" - "\tadds r7, r2, r0\n" - "\tmov r3, r8\n" - "\tlsls r1, r3, 1\n" - "\tldr r2, [sp, 0x4C]\n" - "\tadds r0, r2, r1\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0x1\n" - "\tbeq _080E7DA6\n" - "\tldr r3, [sp, 0x50]\n" - "\tadds r0, r3, r1\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0x1\n" - "\tbne _080E7DB0\n" - "_080E7DA6:\n" - "\tldr r0, [sp, 0x34]\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tstr r0, [sp, 0x34]\n" - "_080E7DB0:\n" - "\tldr r2, [sp, 0x4C]\n" - "\tadds r0, r2, r1\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0x1\n" - "\tbne _080E7DD4\n" - "\tldr r3, [sp, 0x50]\n" - "\tadds r0, r3, r1\n" - "\tldrb r2, [r0]\n" - "\tcmp r2, 0\n" - "\tbne _080E7DD4\n" - "_080E7DC4:\n" - "\tlsls r1, r6, 1\n" - "\tmov r3, r10\n" - "\tadds r0, r3, r1\n" - "\tmov r3, r8\n" - "\tstrb r3, [r0]\n" - "\tadd r1, r9\n" - "\tstrb r2, [r1]\n" - "\tb _080E7E4E\n" - "_080E7DD4:\n" - "\tldr r2, [sp, 0x4C]\n" - "\tadds r0, r2, r1\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbne _080E7DE8\n" - "\tldr r3, [sp, 0x50]\n" - "\tadds r0, r3, r1\n" - "\tldrb r2, [r0]\n" - "\tcmp r2, 0x1\n" - "\tbeq _080E7DC4\n" - "_080E7DE8:\n" - "\tldr r2, [sp, 0x4C]\n" - "\tadds r0, r2, r1\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0x1\n" - "\tbne _080E7E54\n" - "\tldr r3, [sp, 0x50]\n" - "\tadds r0, r3, r1\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0x1\n" - "\tbne _080E7E54\n" - "\tlsls r5, r6, 1\n" - "\tmov r1, r10\n" - "\tadds r0, r1, r5\n" - "\tmov r2, r8\n" - "\tstrb r2, [r0]\n" - "\tadds r0, r7, 0\n" - "\tbl sub_80E7A9C\n" - "\tadds r4, r0, 0\n" - "\tlsls r4, 24\n" - "\tlsrs r4, 24\n" - "\tadds r0, r7, 0\n" - "\tadds r0, 0x38\n" - "\tbl sub_80E7A9C\n" - "\tlsls r0, 24\n" - "\tlsrs r1, r0, 24\n" - "\tcmp r4, 0\n" - "\tbne _080E7E30\n" - "\tcmp r1, 0\n" - "\tbeq _080E7E34\n" - "\tmov r3, r9\n" - "\tadds r1, r3, r5\n" - "\tmovs r0, 0x1\n" - "\tstrb r0, [r1]\n" - "\tb _080E7E4E\n" - "_080E7E30:\n" - "\tcmp r1, 0\n" - "\tbeq _080E7E48\n" - "_080E7E34:\n" - "\tbl Random2\n" - "\tmov r1, r9\n" - "\tadds r2, r1, r5\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmovs r1, 0x1\n" - "\tands r0, r1\n" - "\tstrb r0, [r2]\n" - "\tb _080E7E4E\n" - "_080E7E48:\n" - "\tmov r2, r9\n" - "\tadds r0, r2, r5\n" - "\tstrb r1, [r0]\n" - "_080E7E4E:\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "_080E7E54:\n" - "\tmov r0, r8\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r3, r0, 16\n" - "\tmov r8, r3\n" - "\tldr r1, [sp, 0x54]\n" - "\tcmp r0, r1\n" - "\tbcc _080E7D84\n" - "_080E7E64:\n" - "\tmovs r2, 0\n" - "\tmov r8, r2\n" - "\tldr r3, [sp, 0x44]\n" - "\tlsls r0, r3, 4\n" - "\tsubs r0, r3\n" - "\tlsls r0, 3\n" - "\tldr r1, [sp, 0x2C]\n" - "\tadds r7, r1, r0\n" - "\tldr r1, [sp, 0x48]\n" - "_080E7E76:\n" - "\tmov r2, r8\n" - "\tlsls r0, r2, 2\n" - "\tadds r0, r1, r0\n" - "\tstr r7, [r0]\n" - "\tmov r0, r8\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tmov r8, r0\n" - "\tcmp r0, 0x3\n" - "\tbls _080E7E76\n" - "\tbl sub_80E7B54\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmovs r1, 0x3\n" - "\tbl __umodsi3\n" - "\tlsls r0, 24\n" - "\tlsrs r1, r0, 24\n" - "\tldr r3, [sp, 0x34]\n" - "\tcmp r3, 0x3\n" - "\tbeq _080E7EC8\n" - "\tcmp r3, 0x3\n" - "\tbgt _080E7EAE\n" - "\tcmp r3, 0x2\n" - "\tbeq _080E7EB6\n" - "\tb _080E7F1C\n" - "_080E7EAE:\n" - "\tldr r0, [sp, 0x34]\n" - "\tcmp r0, 0x4\n" - "\tbeq _080E7EE8\n" - "\tb _080E7F1C\n" - "_080E7EB6:\n" - "\tadd r2, sp, 0x24\n" - "\tmovs r0, 0x1\n" - "\tstr r0, [sp]\n" - "\tldr r0, [sp, 0x2C]\n" - "\tldr r1, [sp, 0x30]\n" - "\tmovs r3, 0\n" - "\tbl sub_80E7AA4\n" - "\tb _080E7F1C\n" - "_080E7EC8:\n" - "\tldr r0, =gUnknown_0858CFB8\n" - "\tlsls r1, 1\n" - "\tadds r2, r1, r0\n" - "\tldrb r3, [r2]\n" - "\tadds r0, 0x1\n" - "\tadds r1, r0\n" - "\tldrb r0, [r1]\n" - "\tadd r2, sp, 0x24\n" - "\tstr r0, [sp]\n" - "\tldr r0, [sp, 0x2C]\n" - "\tldr r1, [sp, 0x30]\n" - "\tbl sub_80E7AA4\n" - "\tb _080E7F1C\n" - "\t.pool\n" - "_080E7EE8:\n" - "\tadd r6, sp, 0x24\n" - "\tldr r4, =gUnknown_0858CFBE\n" - "\tlsls r5, r1, 2\n" - "\tadds r0, r5, r4\n" - "\tldrb r3, [r0]\n" - "\tadds r0, r4, 0x1\n" - "\tadds r0, r5, r0\n" - "\tldrb r0, [r0]\n" - "\tstr r0, [sp]\n" - "\tldr r0, [sp, 0x2C]\n" - "\tldr r1, [sp, 0x30]\n" - "\tadds r2, r6, 0\n" - "\tbl sub_80E7AA4\n" - "\tadds r0, r4, 0x2\n" - "\tadds r0, r5, r0\n" - "\tldrb r3, [r0]\n" - "\tadds r4, 0x3\n" - "\tadds r5, r4\n" - "\tldrb r0, [r5]\n" - "\tstr r0, [sp]\n" - "\tldr r0, [sp, 0x2C]\n" - "\tldr r1, [sp, 0x30]\n" - "\tadds r2, r6, 0\n" - "\tbl sub_80E7AA4\n" - "_080E7F1C:\n" - "\tldr r1, [sp, 0x2C]\n" - "\tldr r2, [sp, 0x44]\n" - "\tadds r7, r1, r2\n" - "\tldr r4, =gSaveBlock1Ptr\n" - "\tldr r0, [r4]\n" - "\tmovs r3, 0xC2\n" - "\tlsls r3, 6\n" - "\tadds r0, r3\n" - "\tadds r1, r7, 0\n" - "\tmovs r2, 0x38\n" - "\tbl memcpy\n" - "\tldr r0, [r4]\n" - "\tldr r1, =0x0000310c\n" - "\tadds r0, r1\n" - "\tadds r1, r7, 0\n" - "\tadds r1, 0x38\n" - "\tmovs r2, 0x38\n" - "\tbl memcpy\n" - "\tldr r0, [sp, 0x38]\n" - "\tbl SeedRng\n" - "\tadd sp, 0x58\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.pool"); -} -#endif // NONMATCHING + static void ReceiveGiftItem(u16 *item, u8 which) { @@ -1481,14 +954,14 @@ static void sub_80E7FF8(u8 taskId) task->data[0] = 6; break; case 2: - sub_8076D5C(); + SetContinueGameWarpStatusToDynamicWarp(); sub_8153430(); task->data[0] ++; break; case 3: if (sub_8153474()) { - sav2_gender2_inplace_and_xFE(); + ClearContinueGameWarpStatus2(); task->data[0] = 4; task->data[1] = 0; } @@ -1530,7 +1003,7 @@ static void sub_80E7FF8(u8 taskId) task->data[0] ++; break; case 9: - if (sub_800A520()) + if (IsLinkTaskFinished()) DestroyTask(taskId); break; } diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 81935b7c6..03823dd45 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -718,7 +718,7 @@ void RecordedBattle_CopyBattlerMoves(void) if (sUnknown_0203C7AC == 2) return; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_MON_MOVES; i++) { sPlayerMonMoves[gActiveBattler / 2][i] = gBattleMons[gActiveBattler].moves[i]; } @@ -739,17 +739,17 @@ void sub_818603C(u8 arg0) { if (arg0 == 1) { - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { if (gBattleMons[battlerId].moves[j] != sPlayerMonMoves[battlerId / 2][j]) break; } - if (j != 4) // player's mon's move has been changed + if (j != MAX_MON_MOVES) // player's mon's move has been changed { RecordedBattle_SetBattlerAction(battlerId, ACTION_MOVE_CHANGE); - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { - for (k = 0; k < 4; k++) + for (k = 0; k < MAX_MON_MOVES; k++) { if (gBattleMons[battlerId].moves[j] == sPlayerMonMoves[battlerId / 2][k]) { @@ -772,11 +772,11 @@ void sub_818603C(u8 arg0) u8 var; RecordedBattle_GetBattlerAction(battlerId); - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { ppBonuses[j] = ((gBattleMons[battlerId].ppBonuses & ((3 << (j << 1)))) >> (j << 1)); } - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { array1[j] = RecordedBattle_GetBattlerAction(battlerId); movePp.moves[j] = gBattleMons[battlerId].moves[array1[j]]; @@ -784,14 +784,14 @@ void sub_818603C(u8 arg0) array3[j] = ppBonuses[array1[j]]; array2[j] = (gDisableStructs[battlerId].unk18_b & gBitTable[j]) >> j; } - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { gBattleMons[battlerId].moves[j] = movePp.moves[j]; gBattleMons[battlerId].pp[j] = movePp.pp[j]; } gBattleMons[battlerId].ppBonuses = 0; gDisableStructs[battlerId].unk18_b = 0; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { gBattleMons[battlerId].ppBonuses |= (array3[j]) << (j << 1); gDisableStructs[battlerId].unk18_b |= (array2[j]) << (j); @@ -799,23 +799,23 @@ void sub_818603C(u8 arg0) if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED)) { - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { ppBonuses[j] = ((GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1)); } - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { movePp.moves[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + array1[j], NULL); movePp.pp[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP1 + array1[j], NULL); array3[j] = ppBonuses[array1[j]]; } - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + j, &movePp.moves[j]); SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP1 + j, &movePp.pp[j]); } var = 0; - for (j = 0; j < 4; j++) + for (j = 0; j < MAX_MON_MOVES; j++) { var |= (array3[j]) << (j << 1); } diff --git a/src/region_map.c b/src/region_map.c index d7b53d631..ff0c19167 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -11,7 +11,6 @@ #include "overworld.h" #include "constants/flags.h" #include "event_data.h" -#include "rom6.h" #include "secret_base.h" #include "string_util.h" #include "international_string_util.h" @@ -20,10 +19,13 @@ #include "constants/songs.h" #include "m4a.h" #include "field_effect.h" +#include "field_specials.h" +#include "fldeff.h" #include "region_map.h" #include "constants/region_map_sections.h" #include "heal_location.h" #include "constants/heal_locations.h" +#include "constants/map_types.h" #define MAP_WIDTH 28 #define MAP_HEIGHT 15 @@ -426,82 +428,82 @@ bool8 sub_8122DB0(void) { switch (gRegionMap->initStep) { - case 0: - if (gRegionMap->bgManaged) - { - decompress_and_copy_tile_data_to_vram(gRegionMap->bgNum, sRegionMapBkgnd_GfxLZ, 0, 0, 0); - } - else - { - LZ77UnCompVram(sRegionMapBkgnd_GfxLZ, (u16 *)BG_CHAR_ADDR(2)); - } - break; - case 1: - if (gRegionMap->bgManaged) - { - if (!free_temp_tile_data_buffers_if_possible()) - { - decompress_and_copy_tile_data_to_vram(gRegionMap->bgNum, sRegionMapBkgnd_TilemapLZ, 0, 0, 1); - } - } - else - { - LZ77UnCompVram(sRegionMapBkgnd_TilemapLZ, (u16 *)BG_SCREEN_ADDR(28)); - } - break; - case 2: + case 0: + if (gRegionMap->bgManaged) + { + decompress_and_copy_tile_data_to_vram(gRegionMap->bgNum, sRegionMapBkgnd_GfxLZ, 0, 0, 0); + } + else + { + LZ77UnCompVram(sRegionMapBkgnd_GfxLZ, (u16 *)BG_CHAR_ADDR(2)); + } + break; + case 1: + if (gRegionMap->bgManaged) + { if (!free_temp_tile_data_buffers_if_possible()) { - LoadPalette(sRegionMapBkgnd_Pal, 0x70, 0x60); - } - break; - case 3: - LZ77UnCompWram(sRegionMapCursorSmallGfxLZ, gRegionMap->cursorSmallImage); - break; - case 4: - LZ77UnCompWram(sRegionMapCursorLargeGfxLZ, gRegionMap->cursorLargeImage); - break; - case 5: - RegionMap_InitializeStateBasedOnPlayerLocation(); - gRegionMap->playerIconSpritePosX = gRegionMap->cursorPosX; - gRegionMap->playerIconSpritePosY = gRegionMap->cursorPosY; - gRegionMap->mapSecId = CorrectSpecialMapSecId_Internal(gRegionMap->mapSecId); - gRegionMap->iconDrawType = get_flagnr_blue_points(gRegionMap->mapSecId); - GetMapName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16); - break; - case 6: - if (gRegionMap->zoomed == FALSE) - { - CalcZoomScrollParams(0, 0, 0, 0, 0x100, 0x100, 0); - } - else - { - gRegionMap->scrollX = gRegionMap->cursorPosX * 8 - 0x34; - gRegionMap->scrollY = gRegionMap->cursorPosY * 8 - 0x44; - gRegionMap->zoomedCursorPosX = gRegionMap->cursorPosX; - gRegionMap->zoomedCursorPosY = gRegionMap->cursorPosY; - CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, 0x80, 0x80, 0); + decompress_and_copy_tile_data_to_vram(gRegionMap->bgNum, sRegionMapBkgnd_TilemapLZ, 0, 0, 1); } - break; - case 7: - RegionMap_GetPositionOfCursorWithinMapSection(); - UpdateRegionMapVideoRegs(); - gRegionMap->cursorSprite = NULL; - gRegionMap->playerIconSprite = NULL; - gRegionMap->cursorMovementFrameCounter = 0; - gRegionMap->blinkPlayerIcon = FALSE; - if (gRegionMap->bgManaged) - { - SetBgAttribute(gRegionMap->bgNum, BG_CTRL_ATTR_MAPBASEINDEX, 2); - SetBgAttribute(gRegionMap->bgNum, BG_CTRL_ATTR_VISIBLE, gRegionMap->charBaseIdx); - SetBgAttribute(gRegionMap->bgNum, BG_CTRL_ATTR_CHARBASEINDEX, gRegionMap->mapBaseIdx); - SetBgAttribute(gRegionMap->bgNum, BG_CTRL_ATTR_PRIORITY, 1); - SetBgAttribute(gRegionMap->bgNum, BG_CTRL_ATTR_SCREENSIZE, 1); - } - gRegionMap->initStep++; - return FALSE; - default: - return FALSE; + } + else + { + LZ77UnCompVram(sRegionMapBkgnd_TilemapLZ, (u16 *)BG_SCREEN_ADDR(28)); + } + break; + case 2: + if (!free_temp_tile_data_buffers_if_possible()) + { + LoadPalette(sRegionMapBkgnd_Pal, 0x70, 0x60); + } + break; + case 3: + LZ77UnCompWram(sRegionMapCursorSmallGfxLZ, gRegionMap->cursorSmallImage); + break; + case 4: + LZ77UnCompWram(sRegionMapCursorLargeGfxLZ, gRegionMap->cursorLargeImage); + break; + case 5: + RegionMap_InitializeStateBasedOnPlayerLocation(); + gRegionMap->playerIconSpritePosX = gRegionMap->cursorPosX; + gRegionMap->playerIconSpritePosY = gRegionMap->cursorPosY; + gRegionMap->mapSecId = CorrectSpecialMapSecId_Internal(gRegionMap->mapSecId); + gRegionMap->iconDrawType = get_flagnr_blue_points(gRegionMap->mapSecId); + GetMapName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16); + break; + case 6: + if (gRegionMap->zoomed == FALSE) + { + CalcZoomScrollParams(0, 0, 0, 0, 0x100, 0x100, 0); + } + else + { + gRegionMap->scrollX = gRegionMap->cursorPosX * 8 - 0x34; + gRegionMap->scrollY = gRegionMap->cursorPosY * 8 - 0x44; + gRegionMap->zoomedCursorPosX = gRegionMap->cursorPosX; + gRegionMap->zoomedCursorPosY = gRegionMap->cursorPosY; + CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, 0x80, 0x80, 0); + } + break; + case 7: + RegionMap_GetPositionOfCursorWithinMapSection(); + UpdateRegionMapVideoRegs(); + gRegionMap->cursorSprite = NULL; + gRegionMap->playerIconSprite = NULL; + gRegionMap->cursorMovementFrameCounter = 0; + gRegionMap->blinkPlayerIcon = FALSE; + if (gRegionMap->bgManaged) + { + SetBgAttribute(gRegionMap->bgNum, BG_ATTR_SCREENSIZE, 2); + SetBgAttribute(gRegionMap->bgNum, BG_ATTR_CHARBASEINDEX, gRegionMap->charBaseIdx); + SetBgAttribute(gRegionMap->bgNum, BG_ATTR_MAPBASEINDEX, gRegionMap->mapBaseIdx); + SetBgAttribute(gRegionMap->bgNum, BG_ATTR_WRAPAROUND, 1); + SetBgAttribute(gRegionMap->bgNum, BG_ATTR_PALETTEMODE, 1); + } + gRegionMap->initStep++; + return FALSE; + default: + return FALSE; } gRegionMap->initStep++; return TRUE; @@ -863,7 +865,7 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void) u16 y; u16 dimensionScale; u16 xOnMap; - struct WarpData *storedWarp; + struct WarpData *warp; if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SS_TIDAL_CORRIDOR) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SS_TIDAL_CORRIDOR) @@ -877,11 +879,11 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void) switch (GetMapTypeByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)) { default: - case 1: - case 2: - case 3: - case 5: - case 6: + case MAP_TYPE_TOWN: + case MAP_TYPE_CITY: + case MAP_TYPE_ROUTE: + case MAP_TYPE_UNDERWATER: + case MAP_TYPE_6: gRegionMap->mapSecId = gMapHeader.regionMapSectionId; gRegionMap->playerIsInCave = FALSE; mapWidth = gMapHeader.mapLayout->width; @@ -893,17 +895,17 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void) gRegionMap->playerIsInCave = TRUE; } break; - case 4: - case 7: + case MAP_TYPE_UNDERGROUND: + case MAP_TYPE_7: if (gMapHeader.flags & 0x02) { - mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->warp4.mapGroup, gSaveBlock1Ptr->warp4.mapNum); + mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->escapeWarp.mapGroup, gSaveBlock1Ptr->escapeWarp.mapNum); gRegionMap->mapSecId = mapHeader->regionMapSectionId; gRegionMap->playerIsInCave = TRUE; mapWidth = mapHeader->mapLayout->width; mapHeight = mapHeader->mapLayout->height; - x = gSaveBlock1Ptr->warp4.x; - y = gSaveBlock1Ptr->warp4.y; + x = gSaveBlock1Ptr->escapeWarp.x; + y = gSaveBlock1Ptr->escapeWarp.y; } else { @@ -915,27 +917,26 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void) y = 1; } break; - case 9: - mapHeader = Overworld_GetMapHeaderByGroupAndId((u16)gSaveBlock1Ptr->warp2.mapGroup, (u16)gSaveBlock1Ptr->warp2.mapNum); + case MAP_TYPE_SECRET_BASE: + mapHeader = Overworld_GetMapHeaderByGroupAndId((u16)gSaveBlock1Ptr->dynamicWarp.mapGroup, (u16)gSaveBlock1Ptr->dynamicWarp.mapNum); gRegionMap->mapSecId = mapHeader->regionMapSectionId; gRegionMap->playerIsInCave = TRUE; mapWidth = mapHeader->mapLayout->width; mapHeight = mapHeader->mapLayout->height; - x = gSaveBlock1Ptr->warp2.x; - y = gSaveBlock1Ptr->warp2.y; + x = gSaveBlock1Ptr->dynamicWarp.x; + y = gSaveBlock1Ptr->dynamicWarp.y; break; - case 8: - + case MAP_TYPE_INDOOR: gRegionMap->mapSecId = gMapHeader.regionMapSectionId; if (gRegionMap->mapSecId != MAPSEC_DYNAMIC) { - storedWarp = &gSaveBlock1Ptr->warp4; - mapHeader = Overworld_GetMapHeaderByGroupAndId(storedWarp->mapGroup, storedWarp->mapNum); + warp = &gSaveBlock1Ptr->escapeWarp; + mapHeader = Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum); } else { - storedWarp = &gSaveBlock1Ptr->warp2; - mapHeader = Overworld_GetMapHeaderByGroupAndId(storedWarp->mapGroup, storedWarp->mapNum); + warp = &gSaveBlock1Ptr->dynamicWarp; + mapHeader = Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum); gRegionMap->mapSecId = mapHeader->regionMapSectionId; } if (RegionMap_IsPlayerInCave(gRegionMap->mapSecId)) @@ -948,8 +949,8 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void) } mapWidth = mapHeader->mapLayout->width; mapHeight = mapHeader->mapLayout->height; - x = storedWarp->x; - y = storedWarp->y; + x = warp->x; + y = warp->y; break; } @@ -1901,25 +1902,25 @@ static void sub_8124E0C(void) switch (sFlyMap->regionMap.mapSecId) { case MAPSEC_SOUTHERN_ISLAND: - sub_8084CCC(HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR); + SetWarpDestinationToHealLocation(HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR); break; case MAPSEC_BATTLE_FRONTIER: - sub_8084CCC(HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST); + SetWarpDestinationToHealLocation(HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST); break; case MAPSEC_LITTLEROOT_TOWN: - sub_8084CCC(gSaveBlock2Ptr->playerGender == MALE ? HEAL_LOCATION_LITTLEROOT_TOWN_1 : HEAL_LOCATION_LITTLEROOT_TOWN_2); + SetWarpDestinationToHealLocation(gSaveBlock2Ptr->playerGender == MALE ? HEAL_LOCATION_LITTLEROOT_TOWN_1 : HEAL_LOCATION_LITTLEROOT_TOWN_2); break; case MAPSEC_EVER_GRANDE_CITY: - sub_8084CCC(FlagGet(FLAG_LANDMARK_POKEMON_LEAGUE) && sFlyMap->regionMap.posWithinMapSec == 0 ? HEAL_LOCATION_EVER_GRANDE_CITY_2 : HEAL_LOCATION_EVER_GRANDE_CITY_1); + SetWarpDestinationToHealLocation(FlagGet(FLAG_LANDMARK_POKEMON_LEAGUE) && sFlyMap->regionMap.posWithinMapSec == 0 ? HEAL_LOCATION_EVER_GRANDE_CITY_2 : HEAL_LOCATION_EVER_GRANDE_CITY_1); break; default: if (sMapHealLocations[sFlyMap->regionMap.mapSecId][2] != 0) { - sub_8084CCC(sMapHealLocations[sFlyMap->regionMap.mapSecId][2]); + SetWarpDestinationToHealLocation(sMapHealLocations[sFlyMap->regionMap.mapSecId][2]); } else { - warp1_set_2(sMapHealLocations[sFlyMap->regionMap.mapSecId][0], sMapHealLocations[sFlyMap->regionMap.mapSecId][1], -1); + SetWarpDestinationToMapWarp(sMapHealLocations[sFlyMap->regionMap.mapSecId][0], sMapHealLocations[sFlyMap->regionMap.mapSecId][1], -1); } break; } diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 06d2af5b7..1b17c372c 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -50,8 +50,8 @@ static void CB2_ReshowBattleScreenAfterMenu(void) case 0: ScanlineEffect_Clear(); BattleInitBgsAndWindows(); - SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0); - SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0); + SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); + SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); ShowBg(0); ShowBg(1); ShowBg(2); diff --git a/src/rock.c b/src/rock.c index ff3840fb3..ebf477ec1 100644 --- a/src/rock.c +++ b/src/rock.c @@ -421,7 +421,7 @@ void AnimTask_LoadSandstormBackground(u8 taskId) sub_80A6B30(&unknownStruct); sub_80A6CC0(unknownStruct.bgId, gUnknown_08D8D58C, unknownStruct.tilesOffset); sub_80A6D60(&unknownStruct, gUnknown_08D8D410, 0); - LoadCompressedPalette(&gBattleAnimSpritePalette_261, unknownStruct.unk8 * 16, 32); + LoadCompressedPalette(gBattleAnimSpritePalette_261, unknownStruct.unk8 * 16, 32); if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) var0 = 1; diff --git a/src/rom_8011DC0.c b/src/rom_8011DC0.c index deec55c9d..813d143d2 100644 --- a/src/rom_8011DC0.c +++ b/src/rom_8011DC0.c @@ -189,7 +189,6 @@ extern u16 gUnknown_02022C3C; extern u8 gUnknown_02022C20[]; extern u8 gFieldLinkPlayerCount; extern u8 gUnknown_03005DB4; -extern u8 gSelectedOrderFromParty[]; extern struct MailStruct gUnknown_020321C0[PARTY_SIZE]; extern u8 gUnknown_02032298[2]; @@ -1316,7 +1315,7 @@ u32 sub_8013B8C(struct UnkStruct_Group *arg0, s32 id) if (gUnknown_02022C2C == 4 && structPtr->unk.field_0.unk_00.unk_01_2 != 3) { - if (!(gSaveBlock2Ptr->specialSaveWarp & 0x80)) + if (!(gSaveBlock2Ptr->specialSaveWarpFlags & 0x80)) return 1; else if (structPtr->unk.field_0.unk_00.unk_00_7) return 0; @@ -1634,8 +1633,8 @@ void sub_8014210(u16 battleFlags) void sub_8014290(u16 arg0, u16 x, u16 y) { VarSet(VAR_0x4087, arg0); - Overworld_SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y); - saved_warp2_set_2(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y); + SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y); + SetDynamicWarpWithCoords(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y); WarpIntoMap(); } @@ -1646,7 +1645,7 @@ void sub_8014304(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 arg4) gFieldLinkPlayerCount = GetLinkPlayerCount(); gUnknown_03005DB4 = GetMultiplayerId(); SetCableClubWarp(); - Overworld_SetWarpDestination(mapGroup, mapNum, -1, x, y); + SetWarpDestination(mapGroup, mapNum, -1, x, y); WarpIntoMap(); } @@ -1698,12 +1697,12 @@ void sub_801440C(u8 taskId) { case 65: case 81: - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); gMain.savedCallback = sub_801AC54; sub_81B8518(3); break; case 1: - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); sub_80143E4(gBlockSendBuffer, TRUE); HealPlayerParty(); SavePlayerParty(); @@ -1712,7 +1711,7 @@ void sub_801440C(u8 taskId) SetMainCallback2(sub_8014384); break; case 2: - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); HealPlayerParty(); SavePlayerParty(); LoadPlayerBag(); @@ -1721,7 +1720,7 @@ void sub_801440C(u8 taskId) SetMainCallback2(sub_8014384); break; case 3: - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); HealPlayerParty(); SavePlayerParty(); LoadPlayerBag(); @@ -1731,18 +1730,18 @@ void sub_801440C(u8 taskId) break; case 4: sub_80143E4(gBlockSendBuffer, TRUE); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); sub_8014304(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, 3); SetMainCallback2(sub_8014384); break; case 15: sub_80143E4(gBlockSendBuffer, TRUE); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); sub_8014304(MAP_GROUP(RECORD_CORNER), MAP_NUM(RECORD_CORNER), 8, 9, 4); SetMainCallback2(sub_8014384); break; case 68: - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); CreateTask(sub_8013F90, 0); break; case 5: @@ -1839,7 +1838,7 @@ void sub_8014790(u8 taskId) } break; case 3: - if (sub_800A520()) + if (IsLinkTaskFinished()) { DestroyTask(taskId); sub_80149D8(); @@ -2096,7 +2095,7 @@ void sub_8014A40(u8 taskId) data->state++; break; case 17: - if (sub_800A520()) + if (IsLinkTaskFinished()) DestroyTask(taskId); break; } @@ -2265,7 +2264,7 @@ void sub_8014F48(u8 taskId) sub_800ADF8(); break; case 12: - if (sub_800A520()) + if (IsLinkTaskFinished()) DestroyTask(taskId); break; } @@ -2444,7 +2443,7 @@ void sub_80152F4(u8 taskId) sub_800ADF8(); break; case 14: - if (sub_800A520()) + if (IsLinkTaskFinished()) DestroyTask(taskId); break; } @@ -2837,7 +2836,7 @@ void sub_80156E0(u8 taskId) } break; case 41: - if (sub_800A520()) + if (IsLinkTaskFinished()) { if (GetMultiplayerId() == 0) { @@ -3034,7 +3033,7 @@ void sub_80156E0(u8 taskId) data->state = 15; break; case 15: - if (sub_800A520()) + if (IsLinkTaskFinished()) data->state = 16; break; case 16: diff --git a/src/rom_8034C54.c b/src/rom_8034C54.c index e175ecc64..cc875bd3f 100644 --- a/src/rom_8034C54.c +++ b/src/rom_8034C54.c @@ -3,6 +3,7 @@ #include "alloc.h" #include "decompress.h" #include "main.h" +#include "battle_main.h" struct UnkStruct2 { @@ -31,8 +32,6 @@ struct UnkStruct1 struct UnkStruct2 *array; }; -extern const struct SpriteTemplate gUnknown_0831AC88; - // this file's functions static u8 sub_8035518(u8 arg0);; static void sub_8034EFC(struct UnkStruct2 *arg0); @@ -133,7 +132,7 @@ bool32 sub_8034D14(u32 id, s32 arg1, const struct UnkStruct3 *arg2) compSpriteSheet = *(struct CompressedSpriteSheet*)(arg2->spriteSheet); compSpriteSheet.size = GetDecompressedDataSize(arg2->spriteSheet->data); - gUnknown_02022E10->array[id].tileStart = LoadCompressedObjectPic(&compSpriteSheet); + gUnknown_02022E10->array[id].tileStart = LoadCompressedSpriteSheet(&compSpriteSheet); } if (gUnknown_02022E10->array[id].tileStart == 0xFFFF) diff --git a/src/roulette_util.c b/src/roulette_util.c index a197cfa09..c556a4af5 100755 --- a/src/roulette_util.c +++ b/src/roulette_util.c @@ -206,463 +206,227 @@ void sub_8151A9C(struct UnkStruct0 *r0, u16 r1) } } -void sub_8151B3C(struct InnerStruct203CF18 *arg0) +void InitPulseBlend(struct PulseBlend *pulseBlend) { u8 i = 0; - arg0->unk0 = 0; - memset(&arg0->unk4, 0, sizeof(arg0->unk4)); + pulseBlend->usedPulseBlendPalettes = 0; + memset(&pulseBlend->pulseBlendPalettes, 0, sizeof(pulseBlend->pulseBlendPalettes)); for (; i < 16; i++) - { - arg0->unk4[i].unk0 = i; - } + pulseBlend->pulseBlendPalettes[i].paletteSelector = i; } -int sub_8151B68(struct InnerStruct203CF18 *arg0, const struct InnerStruct203CF18_3 *arg1) +int InitPulseBlendPaletteSettings(struct PulseBlend *pulseBlend, const struct PulseBlendSettings *settings) { u8 i = 0; - struct InnerStruct203CF18_2 *r4 = NULL; + struct PulseBlendPalette *pulseBlendPalette = NULL; - if (!arg0->unk4[0].unk1_7) + if (!pulseBlend->pulseBlendPalettes[0].inUse) { - r4 = &arg0->unk4[0]; + pulseBlendPalette = &pulseBlend->pulseBlendPalettes[0]; } else { while (++i < 16) { - if (!arg0->unk4[i].unk1_7) + if (!pulseBlend->pulseBlendPalettes[i].inUse) { - r4 = &arg0->unk4[i]; + pulseBlendPalette = &pulseBlend->pulseBlendPalettes[i]; break; } } } - if (r4 == 0) + if (pulseBlendPalette == NULL) return 0xFF; - r4->unk1_0 = 0; - r4->unk1_4 = 0; - r4->unk1_6 = 1; - r4->unk1_7 = 1; - r4->unk2 = 0; - r4->unk3 = 0; - memcpy(&r4->unk4, arg1, sizeof(*arg1)); + pulseBlendPalette->blendCoeff = 0; + pulseBlendPalette->fadeDirection = 0; + pulseBlendPalette->available = 1; + pulseBlendPalette->inUse = 1; + pulseBlendPalette->delayCounter = 0; + pulseBlendPalette->fadeCycleCounter = 0; + memcpy(&pulseBlendPalette->pulseBlendSettings, settings, sizeof(*settings)); return i; } -void sub_8151BD4(struct InnerStruct203CF18_2 *arg0) +static void ClearPulseBlendPalettesSettings(struct PulseBlendPalette *pulseBlendPalette) { u16 i; - if (!arg0->unk1_6 && arg0->unk4.unk7_6) + if (!pulseBlendPalette->available && pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload) { - for (i = arg0->unk4.unk2; i < arg0->unk4.unk2 + arg0->unk4.unk4; i++) + for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++) gPlttBufferFaded[i] = gPlttBufferUnfaded[i]; } - memset(&arg0->unk4, 0, sizeof(arg0->unk4)); - arg0->unk1_0 = 0; - arg0->unk1_4 = 0; - arg0->unk1_5 = 0; - arg0->unk1_6 = 1; - arg0->unk1_7 = 0; - arg0->unk3 = 0; - arg0->unk2 = 0; + memset(&pulseBlendPalette->pulseBlendSettings, 0, sizeof(pulseBlendPalette->pulseBlendSettings)); + pulseBlendPalette->blendCoeff = 0; + pulseBlendPalette->fadeDirection = 0; + pulseBlendPalette->unk1_5 = 0; + pulseBlendPalette->available = 1; + pulseBlendPalette->inUse = 0; + pulseBlendPalette->fadeCycleCounter = 0; + pulseBlendPalette->delayCounter = 0; } -void sub_8151C50(struct InnerStruct203CF18 *arg0, u16 arg1, u8 arg2) +void UnloadUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection) { u16 i = 0; - if (!arg2) + if (!multiSelection) { - sub_8151BD4(&arg0->unk4[arg1 & 0xF]); + ClearPulseBlendPalettesSettings(&pulseBlend->pulseBlendPalettes[pulseBlendPaletteSelector & 0xF]); } else { for (i = 0; i < 16; i++) { - if ((arg1 & 1) && arg0->unk4[i].unk1_7) - sub_8151BD4(&arg0->unk4[i]); + if ((pulseBlendPaletteSelector & 1) && pulseBlend->pulseBlendPalettes[i].inUse) + ClearPulseBlendPalettesSettings(&pulseBlend->pulseBlendPalettes[i]); - arg1 >>= 1; + pulseBlendPaletteSelector >>= 1; } } } -// there seems to be a temp var involved inside the first if block -void sub_8151CA8(struct InnerStruct203CF18 *arg0, u16 arg1, u8 arg2) +void MarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection) { u8 i = 0; - if (!arg2) + if (!multiSelection) { - i = arg1 & 0xF; - arg0->unk4[i].unk1_6 = 0; - arg0->unk0 |= 1 << i; + i = pulseBlendPaletteSelector & 0xF; + pulseBlend->pulseBlendPalettes[i].available = 0; + pulseBlend->usedPulseBlendPalettes |= 1 << i; } else { for (i = 0; i < 16; i++) { - if (!(arg1 & 1) || !arg0->unk4[i].unk1_7 || !arg0->unk4[i].unk1_6) + if (!(pulseBlendPaletteSelector & 1) || !pulseBlend->pulseBlendPalettes[i].inUse || !pulseBlend->pulseBlendPalettes[i].available) { - arg1 <<= 1; + pulseBlendPaletteSelector <<= 1; } else { - arg0->unk4[i].unk1_6 = 0; - arg0->unk0 |= 1 << i; + pulseBlend->pulseBlendPalettes[i].available = 0; + pulseBlend->usedPulseBlendPalettes |= 1 << i; } } } } -void sub_8151D28(struct InnerStruct203CF18 *arg0, u16 arg1, u8 arg2) +void UnmarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection) { u16 i; - struct InnerStruct203CF18_2 *var0; + struct PulseBlendPalette *pulseBlendPalette; u8 j = 0; - if (!arg2) + if (!multiSelection) { - var0 = &arg0->unk4[arg1 & 0xF]; - if (!var0->unk1_6 && var0->unk1_7) + pulseBlendPalette = &pulseBlend->pulseBlendPalettes[pulseBlendPaletteSelector & 0xF]; + if (!pulseBlendPalette->available && pulseBlendPalette->inUse) { - if (var0->unk4.unk7_6) + if (pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload) { - for (i = var0->unk4.unk2; i < var0->unk4.unk2 + var0->unk4.unk4; i++) + for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++) gPlttBufferFaded[i] = gPlttBufferUnfaded[i]; } - var0->unk1_6 = 1; - arg0->unk0 &= ~(1 << j); + pulseBlendPalette->available = 1; + pulseBlend->usedPulseBlendPalettes &= ~(1 << j); } } else { for (j = 0; j < 16; j++) { - var0 = &arg0->unk4[j]; - if (!(arg1 & 1) || var0->unk1_6 || !var0->unk1_7) + pulseBlendPalette = &pulseBlend->pulseBlendPalettes[j]; + if (!(pulseBlendPaletteSelector & 1) || pulseBlendPalette->available || !pulseBlendPalette->inUse) { - arg1 <<= 1; + pulseBlendPaletteSelector <<= 1; } else { - if (var0->unk4.unk7_6) + if (pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload) { - for (i = var0->unk4.unk2; i < var0->unk4.unk2 + var0->unk4.unk4; i++) + for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++) gPlttBufferFaded[i] = gPlttBufferUnfaded[i]; } - var0->unk1_6 = 1; - arg0->unk0 &= ~(1 << j); + pulseBlendPalette->available = 1; + pulseBlend->usedPulseBlendPalettes &= ~(1 << j); } } } } -#ifdef NONMATCHING -void sub_8151E50(struct InnerStruct203CF18 *arg0) +void UpdatePulseBlend(struct PulseBlend *pulseBlend) { - struct InnerStruct203CF18_2 *var0; + struct PulseBlendPalette *pulseBlendPalette; u8 i = 0; - if (arg0->unk0) + if (pulseBlend->usedPulseBlendPalettes) { for (i = 0; i < 16; i++) { - var0 = &arg0->unk4[i]; - if ((!var0->unk1_6 && var0->unk1_7) && (!gPaletteFade.active || !var0->unk4.unk7_7)) + pulseBlendPalette = &pulseBlend->pulseBlendPalettes[i]; + if ((!pulseBlendPalette->available && pulseBlendPalette->inUse) && (!gPaletteFade.active || !pulseBlendPalette->pulseBlendSettings.unk7_7)) { - if (--var0->unk2 == 0xFF) + if (--pulseBlendPalette->delayCounter == 0xFF) { - var0->unk2 = var0->unk4.unk5; - BlendPalette(var0->unk4.unk2, var0->unk4.unk4, var0->unk1_0, var0->unk4.unk0); - switch (var0->unk4.unk7_4) + pulseBlendPalette->delayCounter = pulseBlendPalette->pulseBlendSettings.delay; + BlendPalette(pulseBlendPalette->pulseBlendSettings.paletteOffset, pulseBlendPalette->pulseBlendSettings.numColors, pulseBlendPalette->blendCoeff, pulseBlendPalette->pulseBlendSettings.blendColor); + switch (pulseBlendPalette->pulseBlendSettings.fadeType) { - case 0: - if (var0->unk1_0++ == var0->unk4.unk7_0) + case 0: // Fade all the way to the max blend amount, then wrap around + // BUG: This comparison will never be true for maxBlendCoeff values that are >= 8. This is because + // maxBlendCoeff is a signed 4-bit field, but blendCoeff is an unsigned 4-bit field. This code is never + // reached, anyway, so the bug is not observable in vanilla gameplay. + if (pulseBlendPalette->blendCoeff++ == pulseBlendPalette->pulseBlendSettings.maxBlendCoeff) { - var0->unk3++; - var0->unk1_0 = 0; + pulseBlendPalette->fadeCycleCounter++; + pulseBlendPalette->blendCoeff = 0; } break; - case 1: - if (var0->unk1_4) + case 1: // Fade in and out + if (pulseBlendPalette->fadeDirection) { - if (--var0->unk1_0 == 0) + if (--pulseBlendPalette->blendCoeff == 0) { - var0->unk3++; - var0->unk1_4 ^= 1; + pulseBlendPalette->fadeCycleCounter++; + pulseBlendPalette->fadeDirection ^= 1; } } else { - if (var0->unk1_0++ == var0->unk4.unk7_0 - 1) + u8 max = (pulseBlendPalette->pulseBlendSettings.maxBlendCoeff - 1) & 0xF; + if (pulseBlendPalette->blendCoeff++ == max) { - var0->unk3++; - var0->unk1_4 ^= 1; + pulseBlendPalette->fadeCycleCounter++; + pulseBlendPalette->fadeDirection ^= 1; } } break; - case 2: - if (var0->unk1_4) - var0->unk1_0 = 0; + case 2: // Flip back and forth + if (pulseBlendPalette->fadeDirection) + pulseBlendPalette->blendCoeff = 0; else - var0->unk1_0 = var0->unk4.unk7_0; + pulseBlendPalette->blendCoeff = pulseBlendPalette->pulseBlendSettings.maxBlendCoeff & 0xF; - var0->unk1_4 ^= 1; - var0->unk3++; + pulseBlendPalette->fadeDirection ^= 1; + pulseBlendPalette->fadeCycleCounter++; break; } - if (var0->unk4.unk6 != 0xFF && var0->unk3 == 0xFF) - sub_8151D28(arg0, var0->unk0, 0); + if (pulseBlendPalette->pulseBlendSettings.numFadeCycles != 0xFF + && pulseBlendPalette->fadeCycleCounter == pulseBlendPalette->pulseBlendSettings.numFadeCycles) + UnmarkUsedPulseBlendPalettes(pulseBlend, pulseBlendPalette->paletteSelector, FALSE); } } } } } -#else -NAKED -void sub_8151E50(struct InnerStruct203CF18 *arg0) -{ - asm_unified("\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - mov r10, r0\n\ - ldr r1, [sp]\n\ - ldrh r0, [r1]\n\ - cmp r0, 0\n\ - bne _08151E6C\n\ - b _08151FF6\n\ -_08151E6C:\n\ - movs r2, 0xF\n\ - mov r9, r2\n\ - movs r3, 0x10\n\ - negs r3, r3\n\ - mov r8, r3\n\ - movs r7, 0x1\n\ -_08151E78:\n\ - mov r5, r10\n\ - lsls r0, r5, 1\n\ - add r0, r10\n\ - lsls r0, 2\n\ - adds r0, 0x4\n\ - ldr r1, [sp]\n\ - adds r4, r1, r0\n\ - ldrb r2, [r4, 0x1]\n\ - movs r3, 0xC0\n\ - ands r3, r2\n\ - cmp r3, 0x80\n\ - beq _08151E92\n\ - b _08151FE6\n\ -_08151E92:\n\ - ldr r0, =gPaletteFade\n\ - ldrb r1, [r0, 0x7]\n\ - adds r0, r3, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08151EA8\n\ - ldrb r0, [r4, 0xB]\n\ - ands r3, r0\n\ - cmp r3, 0\n\ - beq _08151EA8\n\ - b _08151FE6\n\ -_08151EA8:\n\ - ldrb r0, [r4, 0x2]\n\ - subs r0, 0x1\n\ - strb r0, [r4, 0x2]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0xFF\n\ - beq _08151EB8\n\ - b _08151FE6\n\ -_08151EB8:\n\ - ldrb r0, [r4, 0x9]\n\ - strb r0, [r4, 0x2]\n\ - ldrh r0, [r4, 0x6]\n\ - ldrb r1, [r4, 0x8]\n\ - lsls r2, 28\n\ - lsrs r2, 28\n\ - ldrh r3, [r4, 0x4]\n\ - bl BlendPalette\n\ - ldrb r5, [r4, 0xB]\n\ - lsls r0, r5, 26\n\ - asrs r0, 30\n\ - cmp r0, 0x1\n\ - beq _08151F16\n\ - cmp r0, 0x1\n\ - bgt _08151EE4\n\ - cmp r0, 0\n\ - beq _08151EEA\n\ - b _08151FD0\n\ - .pool\n\ -_08151EE4:\n\ - cmp r0, 0x2\n\ - beq _08151F92\n\ - b _08151FD0\n\ -_08151EEA:\n\ - ldrb r2, [r4, 0x1]\n\ - lsls r1, r2, 28\n\ - lsrs r0, r1, 28\n\ - adds r0, 0x1\n\ - mov r3, r9\n\ - ands r0, r3\n\ - mov r6, r8\n\ - adds r3, r6, 0\n\ - ands r3, r2\n\ - orrs r3, r0\n\ - strb r3, [r4, 0x1]\n\ - lsrs r1, 28\n\ - lsls r0, r5, 28\n\ - asrs r0, 28\n\ - cmp r1, r0\n\ - bne _08151FD0\n\ - ldrb r0, [r4, 0x3]\n\ - adds r0, 0x1\n\ - strb r0, [r4, 0x3]\n\ - ands r3, r6\n\ - strb r3, [r4, 0x1]\n\ - b _08151FD0\n\ -_08151F16:\n\ - ldrb r3, [r4, 0x1]\n\ - movs r0, 0x10\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _08151F54\n\ - lsls r0, r3, 28\n\ - lsrs r0, 28\n\ - subs r0, 0x1\n\ - mov r5, r9\n\ - ands r0, r5\n\ - mov r2, r8\n\ - ands r2, r3\n\ - orrs r2, r0\n\ - strb r2, [r4, 0x1]\n\ - cmp r0, 0\n\ - bne _08151FD0\n\ - ldrb r0, [r4, 0x3]\n\ - adds r0, 0x1\n\ - strb r0, [r4, 0x3]\n\ - lsls r0, r2, 27\n\ - lsrs r0, 31\n\ - eors r0, r7\n\ - ands r0, r7\n\ - lsls r0, 4\n\ - movs r3, 0x11\n\ - negs r3, r3\n\ - adds r1, r3, 0\n\ - ands r2, r1\n\ - orrs r2, r0\n\ - strb r2, [r4, 0x1]\n\ - b _08151FD0\n\ -_08151F54:\n\ - lsls r0, r5, 28\n\ - asrs r0, 28\n\ - subs r0, 0x1\n\ - mov r5, r9\n\ - ands r0, r5\n\ - lsls r2, r3, 28\n\ - lsrs r1, r2, 28\n\ - adds r1, 0x1\n\ - ands r1, r5\n\ - mov r5, r8\n\ - ands r3, r5\n\ - orrs r3, r1\n\ - strb r3, [r4, 0x1]\n\ - lsrs r2, 28\n\ - cmp r2, r0\n\ - bne _08151FD0\n\ - ldrb r0, [r4, 0x3]\n\ - adds r0, 0x1\n\ - strb r0, [r4, 0x3]\n\ - lsls r0, r3, 27\n\ - lsrs r0, 31\n\ - eors r0, r7\n\ - ands r0, r7\n\ - lsls r0, 4\n\ - movs r2, 0x11\n\ - negs r2, r2\n\ - adds r1, r2, 0\n\ - ands r3, r1\n\ - orrs r3, r0\n\ - strb r3, [r4, 0x1]\n\ - b _08151FD0\n\ -_08151F92:\n\ - ldrb r2, [r4, 0x1]\n\ - movs r0, 0x10\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08151FA2\n\ - mov r0, r8\n\ - ands r0, r2\n\ - b _08151FB0\n\ -_08151FA2:\n\ - lsls r1, r5, 28\n\ - asrs r1, 28\n\ - mov r3, r9\n\ - ands r1, r3\n\ - mov r0, r8\n\ - ands r0, r2\n\ - orrs r0, r1\n\ -_08151FB0:\n\ - strb r0, [r4, 0x1]\n\ - ldrb r2, [r4, 0x1]\n\ - lsls r0, r2, 27\n\ - lsrs r0, 31\n\ - eors r0, r7\n\ - ands r0, r7\n\ - lsls r0, 4\n\ - movs r5, 0x11\n\ - negs r5, r5\n\ - adds r1, r5, 0\n\ - ands r2, r1\n\ - orrs r2, r0\n\ - strb r2, [r4, 0x1]\n\ - ldrb r0, [r4, 0x3]\n\ - adds r0, 0x1\n\ - strb r0, [r4, 0x3]\n\ -_08151FD0:\n\ - ldrb r1, [r4, 0xA]\n\ - cmp r1, 0xFF\n\ - beq _08151FE6\n\ - ldrb r0, [r4, 0x3]\n\ - cmp r0, r1\n\ - bne _08151FE6\n\ - ldrb r1, [r4]\n\ - ldr r0, [sp]\n\ - movs r2, 0\n\ - bl sub_8151D28\n\ -_08151FE6:\n\ - mov r0, r10\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - cmp r0, 0xF\n\ - bhi _08151FF6\n\ - b _08151E78\n\ -_08151FF6:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0"); -} -#endif // NONMATCHING void sub_8152008(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height) { diff --git a/src/save.c b/src/save.c index 4ae516fc9..cfbe5b848 100644 --- a/src/save.c +++ b/src/save.c @@ -5,6 +5,7 @@ #include "decompress.h" #include "load_save.h" #include "overworld.h" +#include "pokemon_storage_system.h" #include "main.h" #include "constants/game_stat.h" @@ -76,7 +77,7 @@ extern void DoSaveFailedScreen(u8); // save_failed_screen extern bool32 ProgramFlashSectorAndVerify(u8 sector, u8 *data); extern void save_serialize_map(void); extern void sub_800ADF8(void); -extern bool8 sub_800A520(void); +extern bool8 IsLinkTaskFinished(void); // iwram common u16 gLastWrittenSector; @@ -913,7 +914,7 @@ void sub_8153688(u8 taskId) taskData[0] = 2; break; case 2: - if (sub_800A520()) + if (IsLinkTaskFinished()) { if (taskData[2] == 0) save_serialize_map(); @@ -922,7 +923,7 @@ void sub_8153688(u8 taskId) break; case 3: if (taskData[2] == 0) - sub_8076D5C(); + SetContinueGameWarpStatusToDynamicWarp(); sub_8153380(); taskData[0] = 4; break; @@ -945,12 +946,12 @@ void sub_8153688(u8 taskId) break; case 7: if (taskData[2] == 0) - sav2_gender2_inplace_and_xFE(); + ClearContinueGameWarpStatus2(); sub_800ADF8(); taskData[0] = 8; break; case 8: - if (sub_800A520()) + if (IsLinkTaskFinished()) { sub_8153408(); taskData[0] = 9; @@ -961,7 +962,7 @@ void sub_8153688(u8 taskId) taskData[0] = 10; break; case 10: - if (sub_800A520()) + if (IsLinkTaskFinished()) taskData[0]++; break; case 11: diff --git a/src/save_location.c b/src/save_location.c index d49afa736..2443b3161 100644 --- a/src/save_location.c +++ b/src/save_location.c @@ -2,11 +2,6 @@ #include "save_location.h" #include "constants/maps.h" -// specialSaveWarp flags -#define POKECENTER_SAVEWARP (1 << 1) -#define LOBBY_SAVEWARP (1 << 2) -#define UNK_SPECIAL_SAVE_WARP_FLAG_3 (1 << 3) - static bool32 IsCurMapInLocationList(const u16 *list) { s32 i; @@ -94,26 +89,26 @@ static bool32 sub_81AFCEC(void) static void TrySetPokeCenterWarpStatus(void) { if (IsCurMapPokeCenter() == FALSE) - gSaveBlock2Ptr->specialSaveWarp &= ~(POKECENTER_SAVEWARP); + gSaveBlock2Ptr->specialSaveWarpFlags &= ~(POKECENTER_SAVEWARP); else - gSaveBlock2Ptr->specialSaveWarp |= POKECENTER_SAVEWARP; + gSaveBlock2Ptr->specialSaveWarpFlags |= POKECENTER_SAVEWARP; } static void TrySetReloadWarpStatus(void) { if (!IsCurMapReloadLocation()) - gSaveBlock2Ptr->specialSaveWarp &= ~(LOBBY_SAVEWARP); + gSaveBlock2Ptr->specialSaveWarpFlags &= ~(LOBBY_SAVEWARP); else - gSaveBlock2Ptr->specialSaveWarp |= LOBBY_SAVEWARP; + gSaveBlock2Ptr->specialSaveWarpFlags |= LOBBY_SAVEWARP; } // this function definitely sets a warp status, but because the list is empty, it's unknown what this does yet. static void sub_81AFD5C(void) { if (!sub_81AFCEC()) - gSaveBlock2Ptr->specialSaveWarp &= ~(UNK_SPECIAL_SAVE_WARP_FLAG_3); + gSaveBlock2Ptr->specialSaveWarpFlags &= ~(UNK_SPECIAL_SAVE_WARP_FLAG_3); else - gSaveBlock2Ptr->specialSaveWarp |= UNK_SPECIAL_SAVE_WARP_FLAG_3; + gSaveBlock2Ptr->specialSaveWarpFlags |= UNK_SPECIAL_SAVE_WARP_FLAG_3; } void TrySetMapSaveWarpStatus(void) @@ -136,5 +131,5 @@ void sub_81AFDA0(void) void sub_81AFDD0(void) { - gSaveBlock2Ptr->specialSaveWarp |= 0x80; + gSaveBlock2Ptr->specialSaveWarpFlags |= 0x80; } diff --git a/src/scrcmd.c b/src/scrcmd.c index e699bfeab..837259a7f 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -49,12 +49,12 @@ #include "trainer_see.h" #include "tv.h" #include "window.h" +#include "constants/event_objects.h" typedef u16 (*SpecialFunc)(void); typedef void (*NativeFunc)(void); -extern const u8 *gUnknown_020375C0; - +EWRAM_DATA const u8 *gUnknown_020375C0 = NULL; static EWRAM_DATA u32 gUnknown_020375C4 = 0; static EWRAM_DATA u16 sPauseCounter = 0; static EWRAM_DATA u16 sMovingNpcId = 0; @@ -735,7 +735,7 @@ bool8 ScrCmd_setmaplayoutindex(struct ScriptContext *ctx) { u16 value = VarGet(ScriptReadHalfword(ctx)); - sub_8085524(value); + SetCurrentMapLayout(value); return FALSE; } @@ -747,8 +747,8 @@ bool8 ScrCmd_warp(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); - sub_80AF734(); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); + DoWarp(); ResetInitialPlayerAvatarState(); return TRUE; } @@ -761,8 +761,8 @@ bool8 ScrCmd_warpsilent(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); - sp13E_warp_to_last_warp(); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); + DoDiveWarp(); ResetInitialPlayerAvatarState(); return TRUE; } @@ -775,8 +775,8 @@ bool8 ScrCmd_warpdoor(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); - sub_80AF7D0(); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); + DoDoorWarp(); ResetInitialPlayerAvatarState(); return TRUE; } @@ -790,10 +790,10 @@ bool8 ScrCmd_warphole(struct ScriptContext *ctx) PlayerGetDestCoords(&x, &y); if (mapGroup == 0xFF && mapNum == 0xFF) - SetFixedHoleWarpAsDestination(x - 7, y - 7); + SetWarpDestinationToFixedHoleWarp(x - 7, y - 7); else - Overworld_SetWarpDestination(mapGroup, mapNum, -1, x - 7, y - 7); - sp13F_fall_to_last_warp(); + SetWarpDestination(mapGroup, mapNum, -1, x - 7, y - 7); + DoFallWarp(); ResetInitialPlayerAvatarState(); return TRUE; } @@ -806,7 +806,7 @@ bool8 ScrCmd_warpteleport(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); sub_80AF848(); ResetInitialPlayerAvatarState(); return TRUE; @@ -820,7 +820,7 @@ bool8 ScrCmd_warpD7(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); sub_80AF87C(); ResetInitialPlayerAvatarState(); return TRUE; @@ -834,7 +834,7 @@ bool8 ScrCmd_setwarp(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); return FALSE; } @@ -846,7 +846,7 @@ bool8 ScrCmd_setdynamicwarp(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); - saved_warp2_set_2(0, mapGroup, mapNum, warpId, x, y); + SetDynamicWarpWithCoords(0, mapGroup, mapNum, warpId, x, y); return FALSE; } @@ -882,7 +882,7 @@ bool8 ScrCmd_setescapewarp(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); - sub_8084DD4(mapGroup, mapNum, warpId, x, y); + SetEscapeWarp(mapGroup, mapNum, warpId, x, y); return FALSE; } @@ -1239,11 +1239,11 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx) bool8 ScrCmd_releaseall(struct ScriptContext *ctx) { - u8 objectId; + u8 playerObjectId; HideFieldMessageBox(); - objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0); - EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]); + playerObjectId = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0); + EventObjectClearHeldMovementIfFinished(&gEventObjects[playerObjectId]); sub_80D338C(); UnfreezeEventObjects(); return FALSE; @@ -1251,13 +1251,13 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx) bool8 ScrCmd_release(struct ScriptContext *ctx) { - u8 objectId; + u8 playerObjectId; HideFieldMessageBox(); if (gEventObjects[gSelectedEventObject].active) EventObjectClearHeldMovementIfFinished(&gEventObjects[gSelectedEventObject]); - objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0); - EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]); + playerObjectId = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0); + EventObjectClearHeldMovementIfFinished(&gEventObjects[playerObjectId]); sub_80D338C(); UnfreezeEventObjects(); return FALSE; @@ -1485,7 +1485,7 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) StringExpandPlaceholders(gStringVar4, ptr + 6); - width = GetStringWidth(6, gStringVar4, -1) / 8; + width = GetStringWidth(6, gStringVar4, -1) / 8u; if (width > 0x1C) width = 0x1C; @@ -1713,8 +1713,7 @@ bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx) u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL); if (!species) break; - // UB: GetMonData() arguments don't match function definition - if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && pokemon_has_move(&gPlayerParty[i], moveId) == TRUE) + if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && MonKnowsMove(&gPlayerParty[i], moveId) == TRUE) { gSpecialVar_Result = i; gSpecialVar_0x8004 = species; @@ -1999,7 +1998,7 @@ bool8 ScrCmd_setrespawn(struct ScriptContext *ctx) { u16 healLocationId = VarGet(ScriptReadHalfword(ctx)); - Overworld_SetHealLocationWarp(healLocationId); + SetLastHealLocationWarp(healLocationId); return FALSE; } @@ -2236,7 +2235,7 @@ bool8 ScrCmd_warpD1(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); sub_808D074(GetPlayerFacingDirection()); sub_80B0244(); ResetInitialPlayerAvatarState(); @@ -2290,7 +2289,7 @@ bool8 ScrCmd_warpE0(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); - Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); + SetWarpDestination(mapGroup, mapNum, warpId, x, y); sub_80AF79C(); ResetInitialPlayerAvatarState(); return TRUE; diff --git a/src/script_menu.c b/src/script_menu.c index 2aa546288..6f16b1a8a 100644 --- a/src/script_menu.c +++ b/src/script_menu.c @@ -1640,27 +1640,27 @@ static void sub_80E2A94(u8 multichoiceId) { case 77: FillWindowPixelBuffer(0, 0x11); - AddTextPrinterParameterized2(0, 1, gUnknown_0858BBAC[GetMenuCursorPos()], 0, NULL, 2, 1, 3); + AddTextPrinterParameterized2(0, 1, gUnknown_0858BBAC[Menu_GetCursorPos()], 0, NULL, 2, 1, 3); break; case 76: FillWindowPixelBuffer(0, 0x11); - AddTextPrinterParameterized2(0, 1, gUnknown_0858BB9C[GetMenuCursorPos()], 0, NULL, 2, 1, 3); + AddTextPrinterParameterized2(0, 1, gUnknown_0858BB9C[Menu_GetCursorPos()], 0, NULL, 2, 1, 3); break; case 78: FillWindowPixelBuffer(0, 0x11); - AddTextPrinterParameterized2(0, 1, gUnknown_0858BBBC[GetMenuCursorPos()], 0, NULL, 2, 1, 3); + AddTextPrinterParameterized2(0, 1, gUnknown_0858BBBC[Menu_GetCursorPos()], 0, NULL, 2, 1, 3); break; case 79: FillWindowPixelBuffer(0, 0x11); - AddTextPrinterParameterized2(0, 1, gUnknown_0858BBCC[GetMenuCursorPos()], 0, NULL, 2, 1, 3); + AddTextPrinterParameterized2(0, 1, gUnknown_0858BBCC[Menu_GetCursorPos()], 0, NULL, 2, 1, 3); break; case 75: FillWindowPixelBuffer(0, 0x11); - AddTextPrinterParameterized2(0, 1, gUnknown_0858BBEC[GetMenuCursorPos()], 0, NULL, 2, 1, 3); + AddTextPrinterParameterized2(0, 1, gUnknown_0858BBEC[Menu_GetCursorPos()], 0, NULL, 2, 1, 3); break; case 74: FillWindowPixelBuffer(0, 0x11); - AddTextPrinterParameterized2(0, 1, gUnknown_0858BBE0[GetMenuCursorPos()], 0, NULL, 2, 1, 3); + AddTextPrinterParameterized2(0, 1, gUnknown_0858BBE0[Menu_GetCursorPos()], 0, NULL, 2, 1, 3); break; } } diff --git a/src/script_pokemon_util_80F87D8.c b/src/script_pokemon_util_80F87D8.c index fc5a06024..15e91ac98 100755 --- a/src/script_pokemon_util_80F87D8.c +++ b/src/script_pokemon_util_80F87D8.c @@ -36,8 +36,6 @@ extern const u16 gEventObjectPalette33[]; extern const u16 gEventObjectPalette34[]; extern const struct CompressedSpriteSheet gMonFrontPicTable[]; -extern u8 gSelectedOrderFromParty[]; - static const u8 gUnknown_0858D8EC[] = { 3, 4, 5, 14 }; static void sub_80F8EE8(u8 taskId); @@ -335,7 +333,7 @@ void ShowContestEntryMonPic(void) HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality); palette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); - LoadCompressedObjectPalette(palette); + LoadCompressedSpritePalette(palette); SetMultiuseSpriteTemplateToPokemon(species, 1); gMultiuseSpriteTemplate.paletteTag = palette->tag; spriteId = CreateSprite(&gMultiuseSpriteTemplate, (left + 1) * 8 + 32, (top * 8) + 40, 0); @@ -453,7 +451,7 @@ static void sub_80F9088(u8 taskId) switch (gTasks[taskId].data[0]) { case 0: - if (sub_800A520()) + if (IsLinkTaskFinished()) { sub_800ADF8(); gTasks[taskId].data[0]++; @@ -463,7 +461,7 @@ static void sub_80F9088(u8 taskId) gTasks[taskId].data[0]++; break; default: - if (sub_800A520() == 1) + if (IsLinkTaskFinished() == 1) { EnableBothScriptContexts(); DestroyTask(taskId); @@ -530,7 +528,7 @@ void HealPlayerParty(void) ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES); // restore PP. - for(j = 0; j < 4; j++) + for(j = 0; j < MAX_MON_MOVES; j++) { arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j); SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg); diff --git a/src/secret_base.c b/src/secret_base.c index a32186419..1f3f9b46a 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -16,11 +16,13 @@ #include "overworld.h" #include "fieldmap.h" #include "field_camera.h" +#include "field_specials.h" #include "field_player_avatar.h" #include "field_screen_effect.h" #include "field_weather.h" #include "event_object_movement.h" #include "field_effect.h" +#include "fldeff.h" #include "fldeff_misc.h" #include "metatile_behavior.h" #include "map_name_popup.h" @@ -32,7 +34,6 @@ #include "event_data.h" #include "battle.h" #include "battle_setup.h" -#include "rom6.h" #include "decoration.h" #include "link.h" #include "tv.h" @@ -365,7 +366,7 @@ void sub_80E8F9C(void) s8 idx; idx = sCurSecretBaseId / 10 * 4; - warp1_set_2(MAP_GROUP(SECRET_BASE_RED_CAVE1), gUnknown_0858CFE8[idx], gUnknown_0858CFE8[idx + 1]); + SetWarpDestinationToMapWarp(MAP_GROUP(SECRET_BASE_RED_CAVE1), gUnknown_0858CFE8[idx], gUnknown_0858CFE8[idx + 1]); } void sub_80E8FD0(u8 taskId) @@ -399,7 +400,7 @@ void sub_80E9068(void) { CreateTask(sub_80E8FD0, 0); FadeScreen(1, 0); - saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); } bool8 sub_80E909C(void) @@ -444,7 +445,7 @@ void sub_80E916C(u8 taskId) if (!gPaletteFade.active) { idx = sCurSecretBaseId / 10 * 4; - Overworld_SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, gUnknown_0858CFE8[idx + 2], gUnknown_0858CFE8[idx + 3]); + SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, gUnknown_0858CFE8[idx + 2], gUnknown_0858CFE8[idx + 3]); WarpIntoMap(); gFieldCallback = sub_80E9108; SetMainCallback2(CB2_LoadMap); @@ -609,7 +610,7 @@ void sub_80E9608(const struct MapPosition *position, const struct MapEvents *eve } } -void sub_80E9668(const struct MapPosition *position, const struct MapEvents *events) +void WarpIntoSecretBase(const struct MapPosition *position, const struct MapEvents *events) { sub_80E9608(position, events); sub_80E8B6C(); @@ -642,7 +643,7 @@ void sub_80E96A4(u8 taskId) } break; case 2: - copy_saved_warp2_bank_and_enter_x_to_warp1(0x7e); + SetWarpDestinationToDynamicWarp(0x7e); WarpIntoMap(); gFieldCallback = mapldr_default; SetMainCallback2(CB2_LoadMap); diff --git a/src/smokescreen.c b/src/smokescreen.c index 9b37cd234..d9780bbb6 100644 --- a/src/smokescreen.c +++ b/src/smokescreen.c @@ -14,8 +14,8 @@ u8 sub_807521C(s16 x, s16 y, u8 a3) if (GetSpriteTileStartByTag(gUnknown_0831C620.tag) == 0xFFFF) { - LoadCompressedObjectPicUsingHeap(&gUnknown_0831C620); - LoadCompressedObjectPaletteUsingHeap(&gUnknown_0831C628); + LoadCompressedSpriteSheetUsingHeap(&gUnknown_0831C620); + LoadCompressedSpritePaletteUsingHeap(&gUnknown_0831C628); } mainSpriteId = CreateInvisibleSpriteWithCallback(sub_8075370); diff --git a/src/sound.c b/src/sound.c index ba3f659cc..c63183bdc 100644 --- a/src/sound.c +++ b/src/sound.c @@ -28,7 +28,6 @@ IWRAM_DATA static u16 sFanfareCounter; // iwram common bool8 gDisableMusic; -extern u32 gBattleTypeFlags; extern struct MusicPlayerInfo gMPlayInfo_BGM; extern struct MusicPlayerInfo gMPlayInfo_SE1; extern struct MusicPlayerInfo gMPlayInfo_SE2; @@ -37,8 +36,6 @@ extern struct ToneData gCryTable[]; extern struct ToneData gCryTable2[]; extern const struct Fanfare sFanfares[]; -extern u16 SpeciesToCryId(u16); - static void Task_Fanfare(u8 taskId); static void CreateFanfareTask(void); static void Task_DuckBGMForPokemonCry(u8 taskId); diff --git a/src/start_menu.c b/src/start_menu.c index 0e52f05fb..0f608b1d2 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -574,13 +574,13 @@ static bool8 HandleStartMenuInput(void) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - sStartMenuCursorPos = MoveMenuCursor(-1); + sStartMenuCursorPos = Menu_MoveCursor(-1); } if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - sStartMenuCursorPos = MoveMenuCursor(1); + sStartMenuCursorPos = Menu_MoveCursor(1); } if (gMain.newKeys & A_BUTTON) @@ -623,7 +623,7 @@ static bool8 StartMenuPokedexCallback(void) IncrementGameStat(GAME_STAT_CHECKED_POKEDEX); PlayRainSoundEffect(); RemoveExtraStartMenuWindows(); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_Pokedex); return TRUE; @@ -638,7 +638,7 @@ static bool8 StartMenuPokemonCallback(void) { PlayRainSoundEffect(); RemoveExtraStartMenuWindows(); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_PartyMenuFromStartMenu); // Display party menu return TRUE; @@ -653,7 +653,7 @@ static bool8 StartMenuBagCallback(void) { PlayRainSoundEffect(); RemoveExtraStartMenuWindows(); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_BagMenuFromStartMenu); // Display bag menu return TRUE; @@ -668,7 +668,7 @@ static bool8 StartMenuPokeNavCallback(void) { PlayRainSoundEffect(); RemoveExtraStartMenuWindows(); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_PokeNav); // Display PokeNav return TRUE; @@ -683,7 +683,7 @@ static bool8 StartMenuPlayerNameCallback(void) { PlayRainSoundEffect(); RemoveExtraStartMenuWindows(); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); if (is_c1_link_related_active() || InUnionRoom()) { @@ -722,7 +722,7 @@ static bool8 StartMenuOptionCallback(void) { PlayRainSoundEffect(); RemoveExtraStartMenuWindows(); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_InitOptionMenu); // Display option menu gMain.savedCallback = CB2_ReturnToFieldWithOpenMenu; @@ -754,7 +754,7 @@ static bool8 StartMenuLinkModePlayerNameCallback(void) if (!gPaletteFade.active) { PlayRainSoundEffect(); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); TrainerCard_ShowLinkCard(gUnknown_03005DB4, CB2_ReturnToFieldWithOpenMenu); return TRUE; @@ -784,7 +784,7 @@ static bool8 StartMenuBattlePyramidBagCallback(void) { PlayRainSoundEffect(); RemoveExtraStartMenuWindows(); - overworld_free_bg_tilemaps(); + CleanupOverworldWindowsAndTilemaps(); SetMainCallback2(CB2_PyramidBagMenuFromStartMenu); return TRUE; @@ -1285,14 +1285,14 @@ static void sub_80A0550(u8 taskId) } break; case 1: - sub_8076D5C(); + SetContinueGameWarpStatusToDynamicWarp(); sub_8153430(); *step = 2; break; case 2: if (sub_8153474()) { - sav2_gender2_inplace_and_xFE(); + ClearContinueGameWarpStatus2(); *step = 3; gSoftResetDisabled = 0; } diff --git a/src/starter_choose.c b/src/starter_choose.c index 46aac5590..2d4a1b1e1 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -412,8 +412,8 @@ void CB2_ChooseStarter(void) LoadPalette(GetOverworldTextboxPalettePtr(), 0xE0, 0x20); LoadPalette(gBirchBagGrassPal, 0, 0x40); - LoadCompressedObjectPic(&gUnknown_085B1ED8[0]); - LoadCompressedObjectPic(&gUnknown_085B1EE8[0]); + LoadCompressedSpriteSheet(&gUnknown_085B1ED8[0]); + LoadCompressedSpriteSheet(&gUnknown_085B1EE8[0]); LoadSpritePalettes(gUnknown_085B1EF8); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); @@ -425,7 +425,7 @@ void CB2_ChooseStarter(void) SetGpuReg(REG_OFFSET_WINOUT, 0x1F); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); - SetGpuReg(REG_OFFSET_BLDCNT, 0xFE); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 7); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); diff --git a/src/text.c b/src/text.c index 07c15596e..a439d3ced 100644 --- a/src/text.c +++ b/src/text.c @@ -9,12 +9,12 @@ #include "window.h" #include "text.h" #include "blit.h" +#include "menu.h" #include "dynamic_placeholder_text_util.h" extern u8 GetKeypadIconWidth(u8 keypadIconId); extern u16 Font6Func(struct TextPrinter *textPrinter); extern u32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese); -extern int GetPlayerTextSpeed(); EWRAM_DATA struct TextPrinter gTempTextPrinter = {0}; EWRAM_DATA struct TextPrinter gTextPrinters[NUM_TEXT_PRINTERS] = {0}; @@ -1858,7 +1858,7 @@ u32 (*GetFontWidthFunc(u8 glyphId))(u16, bool32) return NULL; } -u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) +s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) { bool8 isJapanese; int minGlyphWidth; @@ -1868,7 +1868,7 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) u32 lineWidth; const u8 *bufferPointer; int glyphWidth; - u32 width; + s32 width; isJapanese = 0; minGlyphWidth = 0; @@ -2028,7 +2028,8 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) if (lineWidth > width) return lineWidth; - return width; + else + return width; } u8 RenderTextFont9(u8 *pixels, u8 fontId, u8 *str) diff --git a/src/title_screen.c b/src/title_screen.c index d60e3fc0b..48571ff96 100644 --- a/src/title_screen.c +++ b/src/title_screen.c @@ -518,9 +518,9 @@ void CB2_InitTitleScreen(void) ResetSpriteData(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 9; - LoadCompressedObjectPic(&sSpriteSheet_EmeraldVersion[0]); - LoadCompressedObjectPic(&sSpriteSheet_PressStart[0]); - LoadCompressedObjectPic(&sPokemonLogoShineSpriteSheet[0]); + LoadCompressedSpriteSheet(&sSpriteSheet_EmeraldVersion[0]); + LoadCompressedSpriteSheet(&sSpriteSheet_PressStart[0]); + LoadCompressedSpriteSheet(&sPokemonLogoShineSpriteSheet[0]); LoadPalette(gTitleScreenEmeraldVersionPal, 0x100, 0x20); LoadSpritePalette(&sSpritePalette_PressStart[0]); gMain.state = 2; @@ -553,7 +553,7 @@ void CB2_InitTitleScreen(void) SetGpuReg(REG_OFFSET_WIN1V, 0); SetGpuReg(REG_OFFSET_WININ, 0x1F1F); SetGpuReg(REG_OFFSET_WINOUT, 0x3F1F); - SetGpuReg(REG_OFFSET_BLDCNT, 0x84); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0xC); SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_16COLOR | BGCNT_TXT256x256); @@ -615,8 +615,8 @@ static void Task_TitleScreenPhase1(u8 taskId) SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); - SetGpuReg(REG_OFFSET_BLDCNT, 0x3F50); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x10); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); SetGpuReg(REG_OFFSET_BLDY, 0); // Create left side of version banner @@ -652,8 +652,8 @@ static void Task_TitleScreenPhase2(u8 taskId) else { gTasks[taskId].tSkipToNext = TRUE; - SetGpuReg(REG_OFFSET_BLDCNT, 0x2142); - SetGpuReg(REG_OFFSET_BLDALPHA, 0xF06); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BD); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(6, 15)); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP diff --git a/src/trade.c b/src/trade.c new file mode 100644 index 000000000..ccdd43986 --- /dev/null +++ b/src/trade.c @@ -0,0 +1,6389 @@ +#include "global.h" +#include "alloc.h" +#include "battle_anim.h" +#include "battle_interface.h" +#include "bg.h" +#include "cable_club.h" +#include "data2.h" +#include "daycare.h" +#include "decompress.h" +#include "event_data.h" +#include "evolution_scene.h" +#include "field_screen_effect.h" +#include "gpu_regs.h" +#include "graphics.h" +#include "international_string_util.h" +#include "librfu.h" +#include "link.h" +#include "link_rfu.h" +#include "load_save.h" +#include "mail.h" +#include "main.h" +#include "overworld.h" +#include "palette.h" +#include "party_menu.h" +#include "pokeball.h" +#include "pokedex.h" +#include "pokemon_icon.h" +#include "pokemon_summary_screen.h" +#include "random.h" +#include "rom_8011DC0.h" +#include "save.h" +#include "script.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "text_window.h" +#include "trainer_card.h" +#include "trade.h" +#include "util.h" +#include "window.h" +#include "constants/easy_chat.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/species.h" +#include "constants/songs.h" +#include "constants/rgb.h" + +#define Trade_SendData(ptr) (SendBlock(bitmask_all_link_players_but_self(), ptr->linkData, 20)) + +struct InGameTrade { + /*0x00*/ u8 name[11]; + /*0x0C*/ u16 species; + /*0x0E*/ u8 ivs[6]; + /*0x14*/ bool8 secondAbility; + /*0x18*/ u32 otId; + /*0x1C*/ u8 stats[5]; + /*0x24*/ u32 personality; + /*0x28*/ u16 heldItem; + /*0x2A*/ u8 mailNum; + /*0x2B*/ u8 otName[11]; + /*0x36*/ u8 otGender; + /*0x37*/ u8 sheen; + /*0x38*/ u16 playerSpecies; +}; + +static EWRAM_DATA u8 *gUnknown_02032184 = NULL; +static EWRAM_DATA u8 *gUnknown_02032188[14] = {NULL}; +EWRAM_DATA struct MailStruct gUnknown_020321C0[PARTY_SIZE] = {0}; +EWRAM_DATA u8 gUnknown_02032298[2] = {0}; +static EWRAM_DATA struct { + /*0x0000*/ u8 unk_0; + /*0x0001*/ u8 unk_1; + /*0x0002*/ u8 filler_2[0x28 - 2]; + /*0x0028*/ u8 partyIcons[2][PARTY_SIZE]; + /*0x0034*/ u8 tradeMenuCursorSpriteIdx; + /*0x0035*/ u8 tradeMenuCursorPosition; + /*0x0036*/ u8 partyCounts[2]; + /*0x0038*/ bool8 tradeMenuOptionsActive[12]; + /*0x0044*/ u8 unk_44; + /*0x0045*/ u8 unk_45[2][PARTY_SIZE]; + /*0x0051*/ u8 unk_51[2][PARTY_SIZE]; + /*0x005D*/ u8 unk_5D[2][PARTY_SIZE]; + /*0x0069*/ u8 unk_69; + /*0x006A*/ u8 filler_6A[0x6F - 0x6A]; + /*0x006F*/ u8 unk_6F; + /*0x0070*/ u8 unk_70; + /*0x0071*/ u8 filler_71; + /*0x0072*/ u16 unk_72; + /*0x0074*/ u8 unk_74[2]; + /*0x0076*/ u8 unk_76[2]; + /*0x0078*/ u8 unk_78; + /*0x0079*/ u8 unk_79; + /*0x007A*/ u8 unk_7A; + /*0x007B*/ u8 unk_7B; + /*0x007C*/ u8 filler_7C[0x7E - 0x7C]; + /*0x007E*/ u8 unk_7E; + /*0x007F*/ u8 filler_7F; + /*0x0080*/ u16 linkData[20]; + /*0x00A8*/ u8 unk_A8; + /*0x00A9*/ u8 unk_A9[11]; + /*0x00B4*/ u8 filler_B4[0x8D0-0xB4]; + /*0x08D0*/ struct { + bool8 unk_0; + u16 unk_2; + u8 unk_4; + } unk_8D0[4]; + /*0x08F0*/ u16 tilemapBuffer[0x400]; +} *gUnknown_0203229C = {NULL}; +static EWRAM_DATA struct { + /*0x00*/ struct Pokemon mon; + /*0x64*/ u32 timer; + /*0x68*/ u32 unk_68[2]; + /*0x70*/ u8 filler_70[2]; + /*0x72*/ u8 unk_72; + /*0x73*/ u8 unk_73; + /*0x74*/ u16 linkData[10]; + /*0x88*/ u8 unk_88; + /*0x89*/ u8 unk_89; + /*0x8A*/ u16 unk_8A; + /*0x8C*/ u16 unk_8C; + /*0x8E*/ u8 pokePicSpriteIdxs[2]; + /*0x90*/ u8 unk_90; + /*0x91*/ u8 unk_91; + /*0x92*/ u8 unk_92; + /*0x93*/ u8 unk_93; + /*0x94*/ u16 state; + /*0x96*/ u8 filler_96[0xD2 - 0x96]; + /*0xD2*/ u8 unk_D2; + /*0xD3*/ u8 unk_D3; + /*0xD4*/ u16 unk_D4; + /*0xD6*/ u16 unk_D6; + /*0xD8*/ u16 unk_D8; + /*0xDA*/ u16 unk_DA; + /*0xDC*/ u16 unk_DC; + /*0xDE*/ u16 unk_DE; + /*0xE0*/ s16 bg1vofs; + /*0xE2*/ s16 bg1hofs; + /*0xE4*/ s16 bg2vofs; + /*0xE6*/ s16 bg2hofs; + /*0xE8*/ u16 unk_E8; + /*0xEA*/ u16 unk_EA; + /*0xEC*/ u16 unk_EC; + /*0xEE*/ bool8 isLinkTrade; + /*0xF0*/ u16 tradeSpecies[2]; + /*0xF4*/ u16 cachedMapMusic; + /*0xF6*/ u8 unk_F6[3]; + /*0xF9*/ u8 filler_F9; + /*0xFA*/ u8 unk_FA; + /*0xFB*/ u8 unk_FB; + /*0xFC*/ u8 unk_FC; + /*0xFD*/ u8 unk_FD; + /*0xFE*/ u8 unk_FE; +} *gUnknown_020322A0 = {NULL}; + +static bool32 sub_8077260(void); +static void sub_80773D0(void); +static void sub_807811C(void); +static void sub_807825C(void); +static void sub_80782B8(u8); +static void sub_8078388(void); +static bool8 shedinja_maker_maybe(void); +static void sub_8078C34(void); +static void sub_80795AC(void); +static void sub_807967C(u8); +static void sub_80796B4(u8); +static u8 sub_8079A3C(u8 *, u8, u8); +static void sub_8079AA4(u8 *, u8, u8); +static void sub_8079BE0(u8); +static void sub_8079C4C(u8, u8, u8, u8, u8, u8); +static void sub_8079E44(u8); +static void sub_8079F74(void); +static void sub_8079F88(u8); +static void sub_807A000(u8 taskId); +static void sub_807A024(u8 taskId); +static void sub_807A048(u16, u8); +static u32 sub_807A09C(void); +static void sub_807A0C4(void); +static void sub_807A19C(u8); +static bool8 sub_807A1F0(void); +static void sub_807A308(const u8 *, u8 *, u8); +static void sub_807A320(u8); +static void sub_807A468(u8); +static void sub_807A53C(void); +static void sub_807A5B0(void); +static u32 sub_807A5F4(struct Pokemon *, int, int); +static void sub_807AA28(struct Sprite *sprite); +static void sub_807AA7C(struct Sprite *sprite); +static void sub_807AABC(struct Sprite *sprite); +static void sub_807AAE0(struct Sprite *sprite); +static void sub_807AB04(struct Sprite *sprite); +static void sub_807B170(void); +static void sub_807B60C(void); +static void sub_807B62C(u8); +static void sub_807BA94(void); +static void SetTradeSceneStrings(void); +static u8 sub_807BBC8(void); +static u8 sub_807BBEC(void); +static u8 sub_807CFC8(void); +static void sub_807E55C(struct Sprite *sprite); +static void sub_807E5D8(struct Sprite *sprite); +static void sub_807E64C(struct Sprite *sprite); +static void sub_807E6AC(struct Sprite *sprite); +static void sub_807E784(void); +static void sub_807E974(struct MailStruct *mail, const struct InGameTrade *trade); +static void sub_807EA2C(void); +static void sub_807EACC(void); +static void sub_807EB50(void); +static void c2_080543C4(void); +static void sub_807F110(u8); +static void sub_807F14C(void); +static void c3_08054588(u8); +static void c3_0805465C(u8); +static void sub_807F39C(u8); +static void sub_807F464(void); + +static const u32 sUnref_0832C6A8[] = +{ + 0x00000F2C, + 0x00003D88, + 0x0000001C, + 0x00000024, + 0x00000064, + 0x00000528 +}; +static const u16 gTradeMovesBoxTilemap[] = INCBIN_U16("graphics/trade/moves_box_map.bin"); +static const u16 gTradePartyBoxTilemap[] = INCBIN_U16("graphics/trade/party_box_map.bin"); +static const u8 gTradeStripesBG2Tilemap[] = INCBIN_U8("graphics/trade/stripes_bg2_map.bin"); +static const u8 gTradeStripesBG3Tilemap[] = INCBIN_U8("graphics/trade/stripes_bg3_map.bin"); +static const u8 gText_EmptyString7[] = _(""); +static const u8 gText_ClrWhtHltTrspntShdwDrkGry[] = _("{COLOR WHITE}{HIGHLIGHT TRANSPARENT}{SHADOW DARK_GREY}"); +const u8 gText_MaleSymbol4[] = _("♂"); +const u8 gText_FemaleSymbol4[] = _("♀"); +const u8 gText_GenderlessSymbol[] = _(""); +static const u8 gText_SpaceMove[] = _(" MOVE"); +static const u8 gText_NewLine3[] = _("\n"); +static const u8 gText_Slash2[] = _("/"); +static const u8 gText_Lv2[] = _("Lv. "); +static const u8 gText_ThreeDashes2[] = _("---"); +static const u8 gText_FourQuestionMarks[] = _("????"); +static const u8 gText_832DAE4[] = _(""); +static const u8 gText_IsThisTradeOkay[] = _("Is this trade okay?"); +static const u8 gText_Cancel6[] = _("CANCEL"); +static const u8 gText_ChooseAPkmn[] = _("Choose a POKéMON."); +static const u8 gText_Summary3[] = _("SUMMARY"); +static const u8 gText_Trade2[] = _("TRADE"); +static const u8 gText_CancelTrade[] = _("Cancel trade?"); +static const u8 gJPText_832DB2E[] = _("Bボタン で もどります"); +static const u8 gText_Summary4[] = _("SUMMARY"); +static const u8 gText_Trade3[] = _("TRADE"); +static const u8 gText_CommunicationStandby6[] = _("{COLOR DARK_GREY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GREY}Communication standby…\nPlease wait."); +static const u8 gText_TheTradeHasBeenCanceled[] = _("{COLOR DARK_GREY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GREY}The trade has\nbeen canceled."); +static const u8 gText_YourOnlyPkmnForBattle[] = _("That's your only\nPOKéMON for battle."); +static const u8 gText_WaitingForYourFriend[] = _("{COLOR DARK_GREY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GREY}Waiting for your friend\nto finish…"); +static const u8 gText_YourFriendWantsToTrade[] = _("Your friend wants\nto trade POKéMON."); + +static const struct OamData gOamData_832DC14 = { + .shape = ST_OAM_H_RECTANGLE, + .size = 2, + .priority = 1 +}; + +static const struct OamData gOamData_832DC1C = { + .shape = ST_OAM_H_RECTANGLE, + .size = 3, + .priority = 1 +}; + +static const union AnimCmd gSpriteAnim_832DC24[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_832DC2C[] = { + ANIMCMD_FRAME(32, 5), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_832DC34[] = { + gSpriteAnim_832DC24, + gSpriteAnim_832DC2C +}; + +static const struct SpriteSheet gUnknown_0832DC3C = { + gUnknown_08DDC6E4, 0x800, 300 +}; + +static const struct SpritePalette gUnknown_0832DC44 = { + gUnknown_08DDB444, 2345 +}; + +static const union AnimCmd gSpriteAnim_832DC4C[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_832DC54[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_832DC5C[] = { + ANIMCMD_FRAME(16, 5), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_832DC64[] = { + ANIMCMD_FRAME(24, 5), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_832DC6C[] = { + ANIMCMD_FRAME(32, 5), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_832DC74[] = { + ANIMCMD_FRAME(40, 5), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_832DC7C[] = { + gSpriteAnim_832DC4C, + gSpriteAnim_832DC54, + gSpriteAnim_832DC5C, + gSpriteAnim_832DC64, + gSpriteAnim_832DC6C, + gSpriteAnim_832DC74 +}; + +static const struct SpriteTemplate gSpriteTemplate_832DC94 = +{ + .tileTag = 300, + .paletteTag = 2345, + .oam = &gOamData_832DC1C, + .anims = gSpriteAnimTable_832DC34, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct SpriteTemplate gSpriteTemplate_832DCAC = +{ + .tileTag = 200, + .paletteTag = 4925, + .oam = &gOamData_832DC14, + .anims = gSpriteAnimTable_832DC7C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const u16 TradeScreenTextPalette[] = INCBIN_U16("graphics/trade/text.gbapal"); +static const struct SpritePalette gSpritePalette_TradeScreenText = +{ + TradeScreenTextPalette, 4925 +}; + +// This is used to determine the next mon to select when the D-Pad is +// pressed in a given direction. +// Note that the mons are laid out like this. +// 0-5 are the player's party and 6-11 are the trading partner's party. +// 12 is the cancel button. +// 0 1 6 7 +// 2 3 8 9 +// 4 5 10 11 +// 12 + +static const u8 gTradeNextSelectedMonTable[][4][6] = +{ + { + {4, 2, 12, 12, 0, 0}, + {2, 4, 12, 12, 0, 0}, + {7, 6, 1, 0, 0, 0}, + {1, 6, 7, 0, 0, 0} + }, + { + {5, 3, 12, 12, 0, 0}, + {3, 5, 12, 12, 0, 0}, + {0, 7, 6, 1, 0, 0}, + {6, 7, 0, 1, 0, 0} + }, + { + {0, 0, 0, 0, 0, 0}, + {4, 0, 0, 0, 0, 0}, + {9, 8, 7, 6, 0, 0}, + {3, 1, 0, 0, 0, 0} + }, + { + {1, 1, 1, 1, 0, 0}, + {5, 1, 1, 1, 0, 0}, + {2, 9, 8, 7, 0, 0}, + {8, 9, 6, 6, 0, 0} + }, + { + {2, 2, 2, 2, 0, 0}, + {0, 0, 0, 0, 0, 0}, + {11, 10, 9, 8, 7, 6}, + {5, 3, 1, 0, 0, 0} + }, + { + {3, 3, 3, 3, 0, 0}, + {1, 1, 1, 1, 0, 0}, + {4, 4, 4, 4, 0, 0}, + {10, 8, 6, 0, 0, 0} + }, + { + {10, 8, 12, 0, 0, 0}, + {8, 10, 12, 0, 0, 0}, + {1, 0, 0, 0, 0, 0}, + {7, 0, 1, 0, 0, 0} + }, + { + {12, 0, 0, 0, 0, 0}, + {9, 12, 0, 0, 0, 0}, + {6, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0} + }, + { + {6, 0, 0, 0, 0, 0}, + {10, 6, 0, 0, 0, 0}, + {3, 2, 1, 0, 0, 0}, + {9, 7, 0, 0, 0, 0} + }, + { + {7, 0, 0, 0, 0, 0}, + {11, 12, 0, 0, 0, 0}, + {8, 0, 0, 0, 0, 0}, + {2, 1, 0, 0, 0, 0} + }, + { + {8, 0, 0, 0, 0, 0}, + {6, 0, 0, 0, 0, 0}, + {5, 4, 3, 2, 1, 0}, + {11, 9, 7, 0, 0, 0} + }, + { + {9, 0, 0, 0, 0, 0}, + {12, 0, 0, 0, 0, 0}, + {10, 0, 0, 0, 0, 0}, + {4, 2, 0, 0, 0, 0} + }, + { + {11, 9, 7, 6, 0, 0}, + {7, 6, 0, 0, 0, 0}, + {12, 0, 0, 0, 0, 0}, + {12, 0, 0, 0, 0, 0} + } +}; + +static const u8 gTradeMonSpriteCoords[][2] = +{ + // Your party + {1, 5 }, + {8, 5 }, + {1, 10}, + {8, 10}, + {1, 15}, + {8, 15}, + + // Friend's party + {16, 5 }, + {23, 5 }, + {16, 10}, + {23, 10}, + {16, 15}, + {23, 15}, + + {23, 18} // CANCEL +}; + +static const u8 gTradeLevelDisplayCoords[][6][2] = { + { + // Your party + {5, 4}, + {12, 4}, + {5, 9}, + {12, 9}, + {5, 14}, + {12, 14}, + }, + { + // Friend's party + {20, 4}, + {27, 4}, + {20, 9}, + {27, 9}, + {20, 14}, + {27, 14} + } +}; + +static const u8 gTradeMonBoxCoords[][6][2] = { + { + // Your party + {1, 3}, + {8, 3}, + {1, 8}, + {8, 8}, + {1, 13}, + {8, 13}, + }, + { + // Friend's party + {16, 3}, + {23, 3}, + {16, 8}, + {23, 8}, + {16, 13}, + {23, 13} + } +}; + +static const u8 sUnref_0832DE6E[] = { + 0x00, 0x0e, + 0x0f, 0x1d, + 0x03, 0x05, + 0x03, 0x07, + 0x12, 0x05, + 0x12, 0x07, + 0x08, 0x07, + 0x16, 0x0c, + 0x08, 0x07, + 0x16, 0x0c, + 0x06, 0x07, + 0x18, 0x0c, + 0x06, 0x07, + 0x18, 0x0c, + 0x08, 0x07, + 0x16, 0x0c, + 0x07, 0x07, + 0x17, 0x0c +}; + +static const u8 *const gUnknown_0832DE94[] = +{ + gText_Cancel6, + gText_ChooseAPkmn, + gText_Summary3, + gText_Trade2, + gText_CancelTrade, + gJPText_832DB2E +}; + +static const struct MenuAction gUnknown_0832DEAC[] = { + {gText_Summary4, sub_807A000}, + {gText_Trade3, sub_807A024} +}; + +static const u8 *const gUnknown_0832DEBC[] = { + gText_CommunicationStandby6, + gText_TheTradeHasBeenCanceled, + gText_YourOnlyPkmnForBattle, + gText_OnlyPkmnForBattle, + gText_WaitingForYourFriend, + gText_YourFriendWantsToTrade, + gText_PkmnCantBeTradedNow, + gText_EggCantBeTradedNow, + gText_OtherTrainersPkmnCantBeTraded +}; + +static const u8 gUnknown_0832DEE0[] = { 0, 1, 2 }; + +static const struct BgTemplate gUnknown_0832DEE4[] = +{ + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 5, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 6, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 0, + .mapBaseIndex = 7, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + }, +}; + +static const struct WindowTemplate gUnknown_0832DEF4[] = +{ + { + .bg = 0, + .tilemapLeft = 4, + .tilemapTop = 7, + .width = 22, + .height = 4, + .paletteNum = 15, + .baseBlock = 30 + }, + { + .bg = 0, + .tilemapLeft = 19, + .tilemapTop = 15, + .width = 10, + .height = 4, + .paletteNum = 15, + .baseBlock = 118 + }, + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 5, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 158 + }, + { + .bg = 0, + .tilemapLeft = 7, + .tilemapTop = 5, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 174 + }, + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 10, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 190 + }, + { + .bg = 0, + .tilemapLeft = 7, + .tilemapTop = 10, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 206 + }, + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 15, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 222 + }, + { + .bg = 0, + .tilemapLeft = 7, + .tilemapTop = 15, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 238 + }, + { + .bg = 0, + .tilemapLeft = 15, + .tilemapTop = 5, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 254 + }, + { + .bg = 0, + .tilemapLeft = 22, + .tilemapTop = 5, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 270 + }, + { + .bg = 0, + .tilemapLeft = 15, + .tilemapTop = 10, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 286 + }, + { + .bg = 0, + .tilemapLeft = 22, + .tilemapTop = 10, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 302 + }, + { + .bg = 0, + .tilemapLeft = 15, + .tilemapTop = 15, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 318 + }, + { + .bg = 0, + .tilemapLeft = 22, + .tilemapTop = 15, + .width = 8, + .height = 2, + .paletteNum = 13, + .baseBlock = 334 + }, + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 5, + .width = 14, + .height = 2, + .paletteNum = 13, + .baseBlock = 350 + }, + { + .bg = 0, + .tilemapLeft = 3, + .tilemapTop = 8, + .width = 11, + .height = 8, + .paletteNum = 15, + .baseBlock = 378 + }, + { + .bg = 0, + .tilemapLeft = 17, + .tilemapTop = 5, + .width = 14, + .height = 2, + .paletteNum = 15, + .baseBlock = 466 + }, + { + .bg = 0, + .tilemapLeft = 18, + .tilemapTop = 8, + .width = 11, + .height = 8, + .paletteNum = 15, + .baseBlock = 494 + }, + DUMMY_WIN_TEMPLATE, +}; + +static const struct WindowTemplate gUnknown_0832DF8C = +{ + .bg = 0, + .tilemapLeft = 23, + .tilemapTop = 13, + .width = 5, + .height = 4, + .paletteNum = 15, + .baseBlock = 582 +}; + +static const u8 gJPText_Shedinja[] = _("ヌケニン"); +static const u8 gUnknown_0832DF99[][2] = +{ + {4, 3}, + {19, 3}, + {0, 0} +}; + +static const u16 gTradeBallPalette[] = INCBIN_U16("graphics/trade/ball.gbapal"); +static const u8 gTradeBallTiles[] = INCBIN_U8("graphics/trade/ball.4bpp"); +static const u8 gUnknown_832E5C0[] = INCBIN_U8("graphics/trade/pokeball_symbol.8bpp"); +static const u16 gUnknown_0832FFC0[] = INCBIN_U16("graphics/trade/cable_closeup_map.bin"); +static const u16 gUnknown_083307C0[] = INCBIN_U16("graphics/trade/pokeball_symbol_map.bin"); +static const u16 sUnref_083308C0[] = INCBIN_U16("graphics/trade/unknown_3308C0.gbapal"); +static const u16 gUnknown_083308E0[] = INCBIN_U16("graphics/trade/gba.gbapal"); +static const u16 gUnref_08330900[] = INCBIN_U16("graphics/trade/shadow.gbapal"); +static const u16 gUnref_08330920[] = INCBIN_U16("graphics/trade/black.gbapal"); +static const u16 gUnknown_08330940[] = INCBIN_U16("graphics/trade/misc.gbapal"); +static const u8 gTradeGlow1Tiles[] = INCBIN_U8("graphics/trade/glow1.4bpp"); +static const u8 gTradeGlow2Tiles[] = INCBIN_U8("graphics/trade/glow2.4bpp"); +static const u8 gTradeCableEndTiles[] = INCBIN_U8("graphics/trade/cable_end.4bpp"); +static const u8 gTradeGBAScreenTiles[] = INCBIN_U8("graphics/trade/gba_screen.4bpp"); +const u16 gUnknown_08331F60[] = INCBIN_U16("graphics/trade/shadow_map.bin"); +static const u8 gUnknown_08332F60[] = INCBIN_U8("graphics/trade/gba_affine.8bpp"); +static const u8 sFiller_08335760[64] = {}; +static const u8 gUnknown_083357A0[] = INCBIN_U8("graphics/trade/gba_affine_map_cable.bin"); +static const u8 gUnknown_083358A0[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin"); +static const u16 gUnknown_083359A0[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin"); +static const u16 gUnknown_083369A0[] = INCBIN_U16("graphics/trade/gba_map_cable.bin"); +static const u32 gUnknown_083379A0[] = INCBIN_U32("graphics/trade/unknown_3379A0.bin.lz"); +static const u16 gUnknown_08337AA0[] = INCBIN_U16("graphics/trade/wireless_signal_send.gbapal"); +static const u16 gUnknown_08337CA0[] = INCBIN_U16("graphics/trade/wireless_signal_receive.gbapal"); +static const u16 gUnknown_08337EA0[] = INCBIN_U16("graphics/trade/black.gbapal"); +static const u32 gUnknown_08337EC0[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.lz"); +static const u32 gUnknown_08338550[] = INCBIN_U32("graphics/trade/wireless_signal.bin.lz"); + +static const struct OamData gOamData_8338C44 = { + .affineMode = 1, + .size = 1 +}; + +static const union AnimCmd gSpriteAnim_8338C4C[] = { + ANIMCMD_FRAME( 0, 3), + ANIMCMD_FRAME( 4, 3), + ANIMCMD_FRAME( 8, 3), + ANIMCMD_FRAME(12, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_FRAME(20, 3), + ANIMCMD_FRAME(24, 3), + ANIMCMD_FRAME(28, 3), + ANIMCMD_FRAME(32, 3), + ANIMCMD_FRAME(36, 3), + ANIMCMD_FRAME(40, 3), + ANIMCMD_FRAME(44, 3), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME( 0, 3), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_8338C88[] = { + ANIMCMD_FRAME( 0, 3), + ANIMCMD_FRAME( 4, 3), + ANIMCMD_FRAME( 8, 3), + ANIMCMD_FRAME(12, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_FRAME(20, 3), + ANIMCMD_FRAME(24, 3), + ANIMCMD_FRAME(28, 3), + ANIMCMD_FRAME(32, 3), + ANIMCMD_FRAME(36, 3), + ANIMCMD_FRAME(40, 3), + ANIMCMD_FRAME(44, 3), + ANIMCMD_LOOP(2), + ANIMCMD_FRAME( 0, 3), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_8338C88[] = { + gSpriteAnim_8338C4C, + gSpriteAnim_8338C88 +}; + +static const union AffineAnimCmd gSpriteAffineAnim_8338CCC[] = { + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd gSpriteAffineAnim_8338CDC[] = { + AFFINEANIMCMD_FRAME(-8, 0, 0, 20), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd gSpriteAffineAnim_8338CEC[] = { + AFFINEANIMCMD_FRAME(0x60, 0x100, 0, 0), + AFFINEANIMCMD_FRAME( 0, 0, 0, 5), + AFFINEANIMCMD_FRAME( 8, 0, 0, 20), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_8338D0C[] = { + gSpriteAffineAnim_8338CCC, + gSpriteAffineAnim_8338CDC, + gSpriteAffineAnim_8338CEC +}; + +static const struct SpriteSheet gUnknown_08338D18 = { + gTradeBallTiles, 0x600, 5557 +}; + +static const struct SpritePalette gUnknown_08338D20 = { + gTradeBallPalette, 5558 +}; + +static const struct SpriteTemplate gSpriteTemplate_8338D28 = { + 5557, + 5558, + &gOamData_8338C44, + gSpriteAnimTable_8338C88, + NULL, + gSpriteAffineAnimTable_8338D0C, + sub_807E55C +}; + +static const struct OamData gOamData_8338D40 = { + .affineMode = 1, + .objMode = 1, + .size = 2, + .priority = 1 +}; + +static const union AnimCmd gSpriteAnim_8338D48[] = { + ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_8338D50[] = { + gSpriteAnim_8338D48 +}; + +static const union AffineAnimCmd gSpriteAffineAnim_8338D54[] = { + AFFINEANIMCMD_FRAME(-10, -10, 0, 5), + AFFINEANIMCMD_FRAME(10, 10, 0, 5), + AFFINEANIMCMD_JUMP(0) +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_8338D6C[] = { + gSpriteAffineAnim_8338D54 +}; + +static const struct SpriteSheet gUnknown_08338D70 = { + gTradeGlow1Tiles, 0x200, 5550 +}; + +static const struct SpritePalette gUnknown_08338D78 = { + gUnknown_08330940, 5551 +}; + +static const struct SpritePalette gUnknown_08338D80 = { + gUnknown_083308E0, 5555 +}; + +static const struct SpriteTemplate gUnknown_08338D88 = { + 5550, + 5551, + &gOamData_8338D40, + gSpriteAnimTable_8338D50, + NULL, + gSpriteAffineAnimTable_8338D6C, + sub_807AA28 +}; + +static const struct OamData gOamData_8338DA0 = { + .shape = ST_OAM_V_RECTANGLE, + .size = 2, + .priority = 1 +}; + +static const union AnimCmd gSpriteAnim_8338DA8[] = { + ANIMCMD_FRAME(0, 5, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_8338DB0[] = { + ANIMCMD_FRAME(8, 5, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_8338DB8[] = { + gSpriteAnim_8338DA8, + gSpriteAnim_8338DB0 +}; + +static const struct SpriteSheet gUnknown_08338DC0 = { + gTradeGlow2Tiles, 0x300, 5552 +}; + +static const struct SpriteTemplate gSpriteTemplate_8338DC8 = { + 5552, + 5551, + &gOamData_8338DA0, + gSpriteAnimTable_8338DB8, + NULL, + gDummySpriteAffineAnimTable, + sub_807AA7C +}; + +static const struct OamData gOamData_8338DE0 = { + .shape = ST_OAM_V_RECTANGLE, + .size = 2, + .priority = 1 +}; + +static const union AnimCmd gSpriteAnim_8338DE8[] = { + ANIMCMD_FRAME(0, 10), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_8338DF0[] = { + gSpriteAnim_8338DE8 +}; + +static const struct SpriteSheet gUnknown_08338DF4 = { + gTradeCableEndTiles, 0x100, 5554 +}; + +static const struct SpriteTemplate gSpriteTemplate_8338DFC = { + 5554, + 5555, + &gOamData_8338DE0, + gSpriteAnimTable_8338DF0, + NULL, + gDummySpriteAffineAnimTable, + sub_807AABC +}; + +static const struct OamData gOamData_8338E14 = { + .shape = ST_OAM_H_RECTANGLE, + .size = 3, + .priority = 1 +}; + +static const union AnimCmd gSpriteAnim_8338E1C[] = { + ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(96, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_LOOP(8), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_8338E40[] = { + ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(96, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_LOOP(2), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_8338E64[] = { + gSpriteAnim_8338E1C +}; + +static const union AnimCmd *const gSpriteAnimTable_8338E68[] = { + gSpriteAnim_8338E40 +}; + +static const struct SpriteSheet gUnknown_08338E6C = { + gTradeGBAScreenTiles, 0x1000, 5556 +}; + +static const struct SpriteTemplate gSpriteTemplate_8338E74 = { + 5556, + 5555, + &gOamData_8338E14, + gSpriteAnimTable_8338E64, + NULL, + gDummySpriteAffineAnimTable, + sub_807AB04 +}; + +static const struct SpriteTemplate gSpriteTemplate_8338E8C = { + 5556, + 5555, + &gOamData_8338E14, + gSpriteAnimTable_8338E68, + NULL, + gDummySpriteAffineAnimTable, + sub_807AB04 +}; + +static const u16 gUnknown_08338EA4[] = INCBIN_U16("graphics/trade/unknown_338EA4.gbapal"); + +static const union AffineAnimCmd gSpriteAffineAnim_8338EBC[] = { + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_JUMP(0) +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_8338ECC[] = { + gSpriteAffineAnim_8338EBC +}; + +static const struct InGameTrade gIngameTrades[] = { + { + _("DOTS"), SPECIES_SEEDOT, + 5, 4, 5, 4, 4, 4, + TRUE, 38726, + 30, 5, 5, 5, 5, + 0x84, + ITEM_CHESTO_BERRY, -1, + _("KOBE"), MALE, 10, + SPECIES_RALTS + }, { + _("PLUSES"), SPECIES_PLUSLE, + 4, 4, 4, 5, 5, 4, + FALSE, 73996, + 5, 5, 30, 5, 5, + 0x6F, + ITEM_WOOD_MAIL, 0, + _("ROMAN"), MALE, 10, + SPECIES_VOLBEAT + }, { + _("SEASOR"), + SPECIES_HORSEA, + 5, 4, 4, 4, 5, 4, + FALSE, 46285, + 5, 5, 5, 5, 30, + 0x7F, + ITEM_WAVE_MAIL, 1, + _("SKYLAR"), MALE, 10, + SPECIES_BAGON + }, { + _("MEOWOW"), + SPECIES_MEOWTH, + 4, 5, 4, 5, 4, 4, + FALSE, 91481, + 5, 5, 5, 30, 5, + 0x8B, + ITEM_RETRO_MAIL, 2, + _("ISIS"), FEMALE, 10, + SPECIES_SKITTY + } +}; + +static const u16 gIngameTradeMail[][10] = { + { + EC_WORD_BE, + EC_WORD_NICE, + EC_WORD_TO, + EC_POKEMON(PLUSLE), + EC_WORD_EXCL, + EC_POKEMON(VOLBEAT), + EC_WORD_WILL, + EC_WORD_BE, + EC_WORD_FANTASTIC, + 0 + }, { + EC_WORD_I, + EC_WORD_WILL, + EC_WORD_MAKE, + EC_POKEMON(BAGON), + EC_WORD_TOUGH, + EC_WORD_PLEASE, + EC_WORD_TRAIN, + EC_POKEMON(HORSEA), + EC_WORD_WELL, + 0 + }, { + EC_WORD_THANK_YOU, + EC_WORD_FOR, + EC_POKEMON(SKITTY), + EC_POKEMON2(MEOWTH), + EC_WORD_CRIES, + EC_WORD_IN, + EC_WORD_A, + EC_WORD_CUTE, + EC_WORD_WAY, + 0 + } +}; + +static const struct WindowTemplate gUnknown_08338FFC[] = +{ + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 15, + .width = 26, + .height = 4, + .paletteNum = 0, + .baseBlock = 64 + }, + DUMMY_WIN_TEMPLATE +}; + +const struct WindowTemplate gUnknown_0833900C = +{ + .bg = 0, + .tilemapLeft = 21, + .tilemapTop = 9, + .width = 5, + .height = 4, + .paletteNum = 15, + .baseBlock = 188 +}; + +static const struct BgTemplate gUnknown_08339014[] = +{ + { + .bg = 0, + .charBaseIndex = 3, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 5, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 1, + .mapBaseIndex = 18, + .screenSize = 1, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 0, + .mapBaseIndex = 6, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + }, +}; + +static const s8 gTradeBallVerticalVelocityTable[] = { + 0, 0, 1, 0, + 1, 0, 1, 1, + 1, 1, 2, 2, + 2, 2, 3, 3, + 3, 3, 4, 4, + 4, 4, -4, -4, + -4, -3, -3, -3, + -3, -2, -2, -2, + -2, -1, -1, -1, + -1, 0, -1, 0, + -1, 0, 0, 0, + 0, 0, 1, 0, + 1, 0, 1, 1, + 1, 1, 2, 2, + 2, 2, 3, 3, + 3, 3, 4, 4, + 4, 4, -4, -3, + -3, -2, -2, -1, + -1, -1, 0, -1, + 0, 0, 0, 0, + 0, 0, 1, 0, + 1, 1, 1, 2, + 2, 3, 3, 4, + -4, -3, -2, -1, + -1, -1, 0, 0, + 0, 0, 1, 0, + 1, 1, 2, 3 +}; + +static const u8 gUnknown_08339090[][2] = +{ + {0, 1}, + {1, 1}, + {2, 1}, + {3, 1}, + {4, 1}, + {5, 2}, + {6, 2}, + {7, 2}, + {8, 2}, + {9, 2}, + {10, 3}, + {11, 3}, + {12, 3}, + {13, 4}, + {14, 5}, + {15, 2}, + {0, 1}, + {1, 1}, + {2, 1}, + {3, 1}, + {4, 1}, + {5, 2}, + {6, 2}, + {7, 2}, + {8, 2}, + {9, 2}, + {10, 3}, + {11, 3}, + {12, 3}, + {13, 4}, + {14, 5}, + {16, 1}, + {16, -1}, + {0, 0} +}; + +// external to this file +extern const struct CompressedSpriteSheet gMonFrontPicTable[]; +extern const struct MonCoords gMonFrontPicCoords[]; + +static bool8 sub_8077170(const void *a0, u32 a1) +{ + if (gUnknown_02022C2C == 29) + { + rfu_NI_setSendData(gUnknown_03004140.unk_00, 84, a0, a1); + return TRUE; + } + else + { + return SendBlock(0, a0, a1); + } +} + +static void sub_80771AC(u8 a0) +{ + sub_800A4D8(a0); +} + +static bool32 sub_80771BC(void) +{ + if (gUnknown_02022C2C == 29) + { + if (gUnknown_03007880[sub_800E87C(gUnknown_03004140.unk_00)]->unk_0 == 0) + { + return TRUE; + } + else + { + return FALSE; + } + } + else + { + return IsLinkTaskFinished(); + } +} + +static u32 _GetBlockReceivedStatus(void) +{ + return GetBlockReceivedStatus(); +} + +static void sub_8077210(void) +{ + if (sub_8077260()) + { + rfu_clearSlot(12, gUnknown_03004140.unk_00); + } + else + { + ResetBlockReceivedFlags(); + } +} + +static void sub_8077234(u32 a0) +{ + if (sub_8077260()) + { + rfu_clearSlot(12, gUnknown_03004140.unk_00); + } + else + { + ResetBlockReceivedFlag(a0); + } +} + +static bool32 sub_8077260(void) +{ + if (gWirelessCommType && gUnknown_02022C2C == 29) + { + return TRUE; + } + else + { + return FALSE; + } +} + +static void sub_8077288(u8 unused) +{ + sub_800ADF8(); +} + +static bool32 _IsLinkTaskFinished(void) +{ + return IsLinkTaskFinished(); +} + +static void sub_80772A4(void) +{ + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + ResetPaletteFade(); + + gPaletteFade.bufferTransferDisabled = TRUE; + + SetVBlankCallback(sub_807811C); + LoadPalette(gUnknown_0860F074, 0xF0, 20); + LoadPalette(gUnknown_0860F074, 0xD0, 20); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_0832DEE4, ARRAY_COUNT(gUnknown_0832DEE4)); + SetBgTilemapBuffer(1, gUnknown_0203229C->tilemapBuffer); + + if (InitWindows(gUnknown_0832DEF4)) + { + u32 i; + + DeactivateAllTextPrinters(); + + for (i = 0; i < 18; i++) + { + ClearWindowTilemap(i); + FillWindowPixelBuffer(i, 0); + } + + FillBgTilemapBufferRect(0, 0, 0, 0, 30, 20, 15); + LoadUserWindowBorderGfx_(0, 20, 0xC0); + LoadUserWindowBorderGfx(2, 1, 0xE0); + LoadMonIconPalettes(); + gUnknown_0203229C->unk_69 = 0; + gUnknown_0203229C->unk_6F = 0; + gUnknown_0203229C->unk_70 = 0; + gUnknown_0203229C->unk_74[0] = 0; + gUnknown_0203229C->unk_74[1] = 0; + gUnknown_0203229C->unk_7A = 0; + gUnknown_0203229C->unk_7B = 0; + gUnknown_0203229C->unk_A8 = 0; + } +} + +void sub_80773AC(void) +{ + SetMainCallback2(sub_80773D0); + gMain.callback1 = NULL; + gEnemyPartyCount = 0; +} + +static void sub_80773D0(void) +{ + int i; + struct SpriteTemplate temp; + u8 id; + u32 xPos; + + switch (gMain.state) + { + case 0: + gUnknown_0203229C = AllocZeroed(sizeof(*gUnknown_0203229C)); + sub_80772A4(); + gUnknown_02032184 = AllocZeroed(0xE00); + + for (i = 0; i < 14; i++) + { + gUnknown_02032188[i] = &gUnknown_02032184[i * 256]; + } + + gMain.state++; + break; + case 1: + gPaletteFade.bufferTransferDisabled = FALSE; + + for (i = 0; i < PARTY_SIZE; i++) + { + CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, 0x20, FALSE, 0, 0, 0); + } + + sub_807A19C(0); + ShowBg(0); + + if (!gReceivedRemoteLinkPlayers) + { + gLinkType = 0x1122; + gUnknown_0203229C->unk_A8 = 0; + + if (gWirelessCommType) + { + sub_800B488(); + OpenLink(); + sub_8011BA4(); + } + else + { + OpenLink(); + gMain.state++; + CreateTask(task00_08081A90, 1); + } + } + else + { + gMain.state = 4; + } + break; + case 2: + gUnknown_0203229C->unk_A8++; + if (gUnknown_0203229C->unk_A8 > 11) + { + gUnknown_0203229C->unk_A8 = 0; + gMain.state++; + } + break; + case 3: + if (GetLinkPlayerCount_2() >= sub_800AA48()) + { + if (IsLinkMaster()) + { + if (++gUnknown_0203229C->unk_A8 > 30) + { + sub_800A620(); + gMain.state++; + } + } + else + { + gMain.state++; + } + } + break; + case 4: + if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) + { + sub_8011BD0(); + CalculatePlayerPartyCount(); + gMain.state++; + gUnknown_0203229C->unk_A8 = 0; + if (gWirelessCommType) + { + sub_801048C(TRUE); + sub_800ADF8(); + } + } + break; + case 5: + if (gWirelessCommType) + { + if (sub_8010500()) + { + gMain.state++; + sub_800E0E8(); + CreateWirelessStatusIndicatorSprite(0, 0); + } + } + else + { + gMain.state++; + } + break; + case 6: + if (shedinja_maker_maybe()) + { + sub_807A5B0(); + gMain.state++; + } + break; + case 7: + CalculateEnemyPartyCount(); + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + gUnknown_0203229C->partyCounts[0] = gPlayerPartyCount; + gUnknown_0203229C->partyCounts[1] = gEnemyPartyCount; + + for (i = 0; i < gUnknown_0203229C->partyCounts[0]; i++) + { + struct Pokemon *mon = &gPlayerParty[i]; + gUnknown_0203229C->partyIcons[0][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2), + sub_80D3014, + (gTradeMonSpriteCoords[i][0] * 8) + 14, + (gTradeMonSpriteCoords[i][1] * 8) - 12, + 1, + GetMonData(mon, MON_DATA_PERSONALITY), + TRUE); + } + + for (i = 0; i < gUnknown_0203229C->partyCounts[1]; i++) + { + struct Pokemon *mon = &gEnemyParty[i]; + gUnknown_0203229C->partyIcons[1][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2, NULL), + sub_80D3014, + (gTradeMonSpriteCoords[i + PARTY_SIZE][0] * 8) + 14, + (gTradeMonSpriteCoords[i + PARTY_SIZE][1] * 8) - 12, + 1, + GetMonData(mon, MON_DATA_PERSONALITY), + FALSE); + } + gMain.state++; + break; + case 8: + LoadHeldItemIcons(); + sub_81B5D4C(&gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->partyIcons[0], 0); + gMain.state++; + break; + case 9: + sub_81B5D4C(&gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->partyIcons[0], 1); + gMain.state++; + break; + case 10: + sub_80C6D80(gSaveBlock2Ptr->playerName, gUnknown_02032188[0], 0, 0, 3); + id = GetMultiplayerId(); + sub_80C6D80(gLinkPlayers[id ^ 1].name, gUnknown_02032188[3], 0, 0, 3); + sub_80C6D80(gUnknown_0832DE94[0], gUnknown_02032188[6], 0, 0, 2); + sub_807A308(gUnknown_0832DE94[1], gUnknown_02032188[8], 24); + gMain.state++; + gUnknown_0203229C->unk_A8 = 0; + break; + case 11: + if (sub_807A1F0()) + gMain.state++; + break; + case 12: + xPos = GetStringCenterAlignXOffset(1, gSaveBlock2Ptr->playerName, 120); + for (i = 0; i < 3; i++) + { + temp = gSpriteTemplate_832DCAC; + temp.tileTag += i; + CreateSprite(&temp, xPos + (i * 32) + 16, 10, 1); + } + + xPos = GetStringCenterAlignXOffset(1, gLinkPlayers[GetMultiplayerId() ^ 1].name, 120); + for (i = 0; i < 3; i++) + { + temp = gSpriteTemplate_832DCAC; + temp.tileTag += i + 3; + CreateSprite(&temp, xPos + (i * 32) + 136, 10, 1); + } + gMain.state++; + break; + case 13: + temp = gSpriteTemplate_832DCAC; + temp.tileTag += 6; + CreateSprite(&temp, 215, 152, 1); + temp = gSpriteTemplate_832DCAC; + temp.tileTag += 7; + CreateSprite(&temp, 247, 152, 1); + + for (i = 0; i < PARTY_SIZE; i++) + { + temp = gSpriteTemplate_832DCAC; + temp.tileTag += i + 8; + CreateSprite(&temp, (i * 32) + 24, 150, 1); + } + + gUnknown_0203229C->tradeMenuCursorSpriteIdx = CreateSprite(&gSpriteTemplate_832DC94, gTradeMonSpriteCoords[0][0] * 8 + 32, gTradeMonSpriteCoords[0][1] * 8, 2); + gUnknown_0203229C->tradeMenuCursorPosition = 0; + gMain.state++; + rbox_fill_rectangle(0); + break; + case 14: + sub_807A320(0); + sub_8079BE0(0); + gUnknown_0203229C->unk_0 = 0; + gUnknown_0203229C->unk_1 = 0; + sub_8078388(); + gMain.state++; + PlayBGM(MUS_P_SCHOOL); + break; + case 15: + sub_807A320(1); + sub_8079BE0(1); + gMain.state++; + // fallthrough + case 16: + sub_80782B8(0); + gMain.state++; + break; + case 17: + sub_80782B8(1); + gMain.state++; + break; + case 18: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + gMain.state++; + break; + case 19: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + sub_80782B8(2); + gMain.state++; + break; + case 20: + sub_807A468(0); + gMain.state++; + break; + case 21: + sub_807A468(1); + sub_807A53C(); + gMain.state++; + break; + case 22: + if (!gPaletteFade.active) + { + gMain.callback1 = sub_8078C34; + SetMainCallback2(sub_807825C); + } + break; + } + + RunTextPrinters(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_8077B74(void) +{ + int i; + struct SpriteTemplate temp; + u8 id; + u32 xPos; + + switch (gMain.state) + { + case 0: + sub_80772A4(); + gMain.state++; + break; + case 1: + gMain.state++; + gUnknown_0203229C->unk_A8 = 0; + break; + case 2: + gMain.state++; + break; + case 3: + gMain.state++; + break; + case 4: + CalculatePlayerPartyCount(); + gMain.state++; + break; + case 5: + if (gWirelessCommType) + { + sub_800E0E8(); + CreateWirelessStatusIndicatorSprite(0, 0); + } + gMain.state++; + break; + case 6: + gMain.state++; + break; + case 7: + CalculateEnemyPartyCount(); + gUnknown_0203229C->partyCounts[0] = gPlayerPartyCount; + gUnknown_0203229C->partyCounts[1] = gEnemyPartyCount; + ClearWindowTilemap(0); + sub_8079BE0(0); + sub_8079BE0(1); + + for (i = 0; i < gUnknown_0203229C->partyCounts[0]; i++) + { + struct Pokemon *mon = &gPlayerParty[i]; + gUnknown_0203229C->partyIcons[0][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2, NULL), + sub_80D3014, + (gTradeMonSpriteCoords[i][0] * 8) + 14, + (gTradeMonSpriteCoords[i][1] * 8) - 12, + 1, + GetMonData(mon, MON_DATA_PERSONALITY), + TRUE); + } + + for (i = 0; i < gUnknown_0203229C->partyCounts[1]; i++) + { + struct Pokemon *mon = &gEnemyParty[i]; + gUnknown_0203229C->partyIcons[1][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2, NULL), + sub_80D3014, + (gTradeMonSpriteCoords[i + PARTY_SIZE][0] * 8) + 14, + (gTradeMonSpriteCoords[i + PARTY_SIZE][1] * 8) - 12, + 1, + GetMonData(mon, MON_DATA_PERSONALITY), + FALSE); + } + gMain.state++; + break; + case 8: + LoadHeldItemIcons(); + sub_81B5D4C(&gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->partyIcons[0], 0); + gMain.state++; + break; + case 9: + sub_81B5D4C(&gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->partyIcons[0], 1); + gMain.state++; + break; + case 10: + sub_80C6D80(gSaveBlock2Ptr->playerName, gUnknown_02032188[0], 0, 0, 3); + id = GetMultiplayerId(); + sub_80C6D80(gLinkPlayers[id ^ 1].name, gUnknown_02032188[3], 0, 0, 3); + sub_80C6D80(gUnknown_0832DE94[0], gUnknown_02032188[6], 0, 0, 2); + sub_807A308(gUnknown_0832DE94[1], gUnknown_02032188[8], 24); + gMain.state++; + gUnknown_0203229C->unk_A8 = 0; + break; + case 11: + if (sub_807A1F0()) + gMain.state++; + break; + case 12: + xPos = GetStringCenterAlignXOffset(1, gSaveBlock2Ptr->playerName, 120); + for (i = 0; i < 3; i++) + { + temp = gSpriteTemplate_832DCAC; + temp.tileTag += i; + CreateSprite(&temp, xPos + (i * 32) + 16, 10, 1); + } + + xPos = GetStringCenterAlignXOffset(1, gLinkPlayers[GetMultiplayerId() ^ 1].name, 120); + for (i = 0; i < 3; i++) + { + temp = gSpriteTemplate_832DCAC; + temp.tileTag += i + 3; + CreateSprite(&temp, xPos + (i * 32) + 136, 10, 1); + } + gMain.state++; + break; + case 13: + temp = gSpriteTemplate_832DCAC; + temp.tileTag += 6; + CreateSprite(&temp, 215, 152, 1); + temp = gSpriteTemplate_832DCAC; + temp.tileTag += 7; + CreateSprite(&temp, 247, 152, 1); + + for (i = 0; i < PARTY_SIZE; i++) + { + temp = gSpriteTemplate_832DCAC; + temp.tileTag += i + 8; + CreateSprite(&temp, (i * 32) + 24, 150, 1); + } + + if (gUnknown_0203229C->tradeMenuCursorPosition < PARTY_SIZE) + gUnknown_0203229C->tradeMenuCursorPosition = gUnknown_0203CF20; + else + gUnknown_0203229C->tradeMenuCursorPosition = gUnknown_0203CF20 + PARTY_SIZE; + + gUnknown_0203229C->tradeMenuCursorSpriteIdx = CreateSprite(&gSpriteTemplate_832DC94, gTradeMonSpriteCoords[gUnknown_0203229C->tradeMenuCursorPosition][0] * 8 + 32, gTradeMonSpriteCoords[gUnknown_0203229C->tradeMenuCursorPosition][1] * 8, 2); + gMain.state = 16; + break; + case 16: + sub_80782B8(0); + gMain.state++; + break; + case 17: + sub_80782B8(1); + gUnknown_0203229C->unk_0 = 0; + gUnknown_0203229C->unk_1 = 0; + sub_8078388(); + gMain.state++; + break; + case 18: + gPaletteFade.bufferTransferDisabled = FALSE; + BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + gMain.state++; + break; + case 19: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + sub_80782B8(2); + gMain.state++; + break; + case 20: + gMain.state++; + break; + case 21: + sub_807A53C(); + gMain.state++; + break; + case 22: + if (!gPaletteFade.active) + { + SetMainCallback2(sub_807825C); + } + break; + } + + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_807811C(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void sub_8078130(void) +{ + if (++gUnknown_0203229C->unk_A8 > 15) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_0203229C->unk_6F = 10; + } +} + +static void sub_807816C(void) +{ + if (!gPaletteFade.active) + { + gUnknown_02032298[0] = gUnknown_0203229C->tradeMenuCursorPosition; + gUnknown_02032298[1] = gUnknown_0203229C->unk_7E; + + if (gWirelessCommType) + { + gUnknown_0203229C->unk_6F = 16; + } + else + { + sub_800ABF4(32); + gUnknown_0203229C->unk_6F = 13; + } + } +} + +static void sub_80781C8(void) +{ + gMain.savedCallback = sub_80773AC; + + if (gWirelessCommType) + { + if (sub_8010500()) + { + Free(gUnknown_02032184); + FreeAllWindowBuffers(); + Free(gUnknown_0203229C); + gMain.callback1 = NULL; + sub_800E084(); + SetMainCallback2(sub_807AE50); + } + } + else + { + if (!gReceivedRemoteLinkPlayers) + { + Free(gUnknown_02032184); + FreeAllWindowBuffers(); + Free(gUnknown_0203229C); + gMain.callback1 = NULL; + SetMainCallback2(sub_807AE50); + } + } +} + +static void sub_807825C(void) +{ + u8 temp; + + sub_80795AC(); + sub_807A0C4(); + sub_80796B4(0); + sub_80796B4(1); + + SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_0203229C->unk_0++); + SetGpuReg(REG_OFFSET_BG3HOFS, gUnknown_0203229C->unk_1--); + + RunTextPrintersAndIsPrinter0Active(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_80782B8(u8 a0) +{ + int i; + + switch (a0) + { + case 0: + LoadPalette(gUnknown_08DDB3E4, 0, 0x60); + LoadBgTiles(1, gUnknown_08DDB464, 0x1280, 0); + CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_08DDCF04, 0, 0, 32, 20, 0); + LoadBgTilemap(2, gTradeStripesBG2Tilemap, 0x800, 0); + break; + case 1: + LoadBgTilemap(3, gTradeStripesBG3Tilemap, 0x800, 0); + sub_8079E44(0); + sub_8079E44(1); + CopyBgTilemapBufferToVram(1); + break; + case 2: + for (i = 0; i < 4; i++) + { + SetGpuReg(REG_OFFSET_BG0HOFS + (i * 2), 0); + } + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + break; + } +} + +static void sub_8078388(void) +{ + int i; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (i < gUnknown_0203229C->partyCounts[0]) + { + gSprites[gUnknown_0203229C->partyIcons[0][i]].invisible = FALSE; + gUnknown_0203229C->tradeMenuOptionsActive[i] = TRUE; + } + else + { + gUnknown_0203229C->tradeMenuOptionsActive[i] = FALSE; + } + + if (i < gUnknown_0203229C->partyCounts[1]) + { + gSprites[gUnknown_0203229C->partyIcons[1][i]].invisible = FALSE; + gUnknown_0203229C->tradeMenuOptionsActive[i + PARTY_SIZE] = TRUE; + } + else + { + gUnknown_0203229C->tradeMenuOptionsActive[i + PARTY_SIZE] = FALSE; + } + } + + gUnknown_0203229C->unk_44 = 1; +} + +// why not just use memcpy? +static void Trade_Memcpy(void *dataDest, const void *dataSrc, u32 count) +{ + u8 *dest = dataDest; + const u8 *src = dataSrc; + u32 i; + + for (i = 0; i < count; i++) + { + dest[i] = src[i]; + } +} + +static bool8 shedinja_maker_maybe(void) +{ + u8 id = GetMultiplayerId(); + int i; + struct Pokemon *mon; + + switch (gUnknown_0203229C->unk_69) + { + case 0: + Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[0], 2 * sizeof(struct Pokemon)); + gUnknown_0203229C->unk_69++; + gUnknown_0203229C->unk_A8 = 0; + break; + case 1: + if (sub_80771BC()) + { + if (_GetBlockReceivedStatus() == 0) + { + gUnknown_0203229C->unk_69++; + } + else + { + sub_8077210(); + gUnknown_0203229C->unk_69++; + } + } + break; + case 3: + if (id == 0) + { + sub_80771AC(1); + } + gUnknown_0203229C->unk_69++; + break; + case 4: + if (_GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(&gEnemyParty[0], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon)); + sub_8077210(); + gUnknown_0203229C->unk_69++; + } + break; + case 5: + Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[2], 2 * sizeof(struct Pokemon)); + gUnknown_0203229C->unk_69++; + break; + case 7: + if (id == 0) + { + sub_80771AC(1); + } + gUnknown_0203229C->unk_69++; + break; + case 8: + if (_GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(&gEnemyParty[2], gBlockRecvBuffer[id ^ 1], 200); + sub_8077210(); + gUnknown_0203229C->unk_69++; + } + break; + case 9: + Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[4], 200); + gUnknown_0203229C->unk_69++; + break; + case 11: + if (id == 0) + { + sub_80771AC(1); + } + gUnknown_0203229C->unk_69++; + break; + case 12: + if (_GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(&gEnemyParty[4], gBlockRecvBuffer[id ^ 1], 200); + sub_8077210(); + gUnknown_0203229C->unk_69++; + } + break; + case 13: + Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, 220); + gUnknown_0203229C->unk_69++; + break; + case 15: + if (id == 0) + { + sub_80771AC(3); + } + gUnknown_0203229C->unk_69++; + break; + case 16: + if (_GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(gUnknown_020321C0, gBlockRecvBuffer[id ^ 1], 216); + sub_8077210(); + gUnknown_0203229C->unk_69++; + } + break; + case 17: + Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->giftRibbons, 11); + gUnknown_0203229C->unk_69++; + break; + case 19: + if (id == 0) + { + sub_80771AC(4); + } + gUnknown_0203229C->unk_69++; + break; + case 20: + if (_GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(gUnknown_0203229C->unk_A9, gBlockRecvBuffer[id ^ 1], 11); + sub_8077210(); + gUnknown_0203229C->unk_69++; + } + break; + case 21: + for (i = 0, mon = gEnemyParty; i < PARTY_SIZE; mon++, i++) + { + u8 name[POKEMON_NAME_LENGTH + 1]; + u16 species = GetMonData(mon, MON_DATA_SPECIES); + + if (species != SPECIES_NONE) + { + if (species == SPECIES_SHEDINJA && GetMonData(mon, MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE) + { + GetMonData(mon, MON_DATA_NICKNAME, name); + + if (!StringCompareWithoutExtCtrlCodes(name, gJPText_Shedinja)) + { + SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[SPECIES_SHEDINJA]); + } + } + } + } + return TRUE; + case 2: + case 6: + case 10: + case 14: + case 18: + gUnknown_0203229C->unk_A8++; + if (gUnknown_0203229C->unk_A8 > 10) + { + gUnknown_0203229C->unk_A8 = 0; + gUnknown_0203229C->unk_69++; + } + break; + } + return FALSE; +} + +static void sub_80787B8(void) +{ + sub_807A308(gText_IsThisTradeOkay, (void *)(OBJ_VRAM0 + (gUnknown_0203229C->unk_72 * 32)), 24); +} + +static void sub_80787E0(u8 a0, u8 a1) +{ + if (a1 & 1) + { + switch (gBlockRecvBuffer[0][0]) + { + case 0xEEAA: + gUnknown_0203229C->unk_78 = 2; + break; + case 0xAABB: + gUnknown_0203229C->unk_78 = 1; + break; + case 0xBBBB: + gUnknown_0203229C->unk_7A = 1; + break; + case 0xBBCC: + gUnknown_0203229C->unk_7A = 2; + break; + } + sub_8077234(0); + } + + if (a1 & 2) + { + switch (gBlockRecvBuffer[1][0]) + { + case 0xEEAA: + gUnknown_0203229C->unk_79 = 2; + break; + case 0xAABB: + gUnknown_0203229C->unk_7E = gBlockRecvBuffer[1][1] + 6; + gUnknown_0203229C->unk_79 = 1; + break; + case 0xBBBB: + gUnknown_0203229C->unk_7B = 1; + break; + case 0xBBCC: + gUnknown_0203229C->unk_7B = 2; + break; + } + sub_8077234(1); + } +} + +static void sub_8078900(u8 a0, u8 a1) +{ + if (a1 & 1) + { + switch (gBlockRecvBuffer[0][0]) + { + case 0xEEBB: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sub_807A19C(4); + gUnknown_0203229C->unk_6F = 11; + break; + case 0xEECC: + sub_807A19C(5); + gUnknown_0203229C->unk_6F = 8; + break; + case 0xDDDD: + gUnknown_0203229C->unk_7E = gBlockRecvBuffer[0][1] + 6; + rbox_fill_rectangle(0); + sub_807967C(gUnknown_0203229C->tradeMenuCursorPosition); + sub_807967C(gUnknown_0203229C->unk_7E); + gUnknown_0203229C->unk_6F = 7; + break; + case 0xCCDD: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_0203229C->unk_6F = 10; + break; + case 0xDDEE: + sub_807A19C(1); + gUnknown_0203229C->unk_6F = 8; + } + sub_8077234(0); + } + + if (a1 & 2) + sub_8077234(1); +} + +static void sub_80789FC(void) +{ + if (gUnknown_0203229C->unk_78 && gUnknown_0203229C->unk_79) + { + if (gUnknown_0203229C->unk_78 == 1 && gUnknown_0203229C->unk_79 == 1) + { + gUnknown_0203229C->unk_6F = 6; + gUnknown_0203229C->linkData[0] = 0xDDDD; + gUnknown_0203229C->linkData[1] = gUnknown_0203229C->tradeMenuCursorPosition; + sub_807A048(5, 0); + gUnknown_0203229C->unk_78 = gUnknown_0203229C->unk_79 = 0; + } + else if (gUnknown_0203229C->unk_78 == 1 && gUnknown_0203229C->unk_79 == 2) + { + sub_807A19C(1); + gUnknown_0203229C->linkData[0] = 0xEECC; + gUnknown_0203229C->linkData[1] = 0; + sub_807A048(5, 0); + gUnknown_0203229C->unk_7A = gUnknown_0203229C->unk_7B = 0; + gUnknown_0203229C->unk_78 = gUnknown_0203229C->unk_79 = 0; + gUnknown_0203229C->unk_6F = 8; + } + else if (gUnknown_0203229C->unk_78 == 2 && gUnknown_0203229C->unk_79 == 1) + { + sub_807A19C(5); + gUnknown_0203229C->linkData[0] = 0xDDEE; + gUnknown_0203229C->linkData[1] = 0; + sub_807A048(5, 0); + gUnknown_0203229C->unk_7A = gUnknown_0203229C->unk_7B = 0; + gUnknown_0203229C->unk_78 = gUnknown_0203229C->unk_79 = 0; + gUnknown_0203229C->unk_6F = 8; + } + else if (gUnknown_0203229C->unk_78 == 2 && gUnknown_0203229C->unk_79 == 2) + { + gUnknown_0203229C->linkData[0] = 0xEEBB; + gUnknown_0203229C->linkData[1] = 0; + sub_807A048(5, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_0203229C->unk_78 = gUnknown_0203229C->unk_79 = 0; + gUnknown_0203229C->unk_6F = 11; + } + } + + if (gUnknown_0203229C->unk_7A && gUnknown_0203229C->unk_7B) + { + if (gUnknown_0203229C->unk_7A == 1 && gUnknown_0203229C->unk_7B == 1) + { + gUnknown_0203229C->linkData[0] = 0xCCDD; + gUnknown_0203229C->linkData[1] = 0; + sub_807A048(5, 0); + gUnknown_0203229C->unk_7A = 0; + gUnknown_0203229C->unk_7B = 0; + gUnknown_0203229C->unk_6F = 9; + } + + if (gUnknown_0203229C->unk_7A == 2 || gUnknown_0203229C->unk_7B == 2) + { + sub_807A19C(1); + gUnknown_0203229C->linkData[0] = 0xDDEE; + gUnknown_0203229C->linkData[1] = 0; + sub_807A048(5, 0); + gUnknown_0203229C->unk_7A = 0; + gUnknown_0203229C->unk_7B = 0; + gUnknown_0203229C->unk_6F = 8; + } + } +} + +static void sub_8078BFC(u16 *a0, u16 a1, u16 a2) +{ + a0[0] = a1; + a0[1] = a2; + sub_807A048(5, 0); +} + +static void sub_8078C10(u16 a0, u16 a1) +{ + sub_8078BFC(gUnknown_0203229C->linkData, a0, a1); +} + +static void sub_8078C34(void) +{ + u8 mpId = GetMultiplayerId(); + u8 status; + + if ((status = _GetBlockReceivedStatus())) + { + if (mpId == 0) + sub_80787E0(mpId, status); + else + sub_8078900(mpId, status); + } + + if (mpId == 0) + sub_80789FC(); +} + +static u8 sub_8078C6C(u8 oldPosition, u8 direction) +{ + int i; + u8 newPosition = 0; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (gUnknown_0203229C->tradeMenuOptionsActive[gTradeNextSelectedMonTable[oldPosition][direction][i]] == TRUE) + { + newPosition = gTradeNextSelectedMonTable[oldPosition][direction][i]; + break; + } + } + + return newPosition; +} + +static void TradeMenuMoveCursor(u8 *tradeMenuCursorPosition, u8 direction) +{ + u8 newPosition = sub_8078C6C(*tradeMenuCursorPosition, direction); + + if (newPosition == 12) // CANCEL + { + StartSpriteAnim(&gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx], 1); + gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].pos1.x = 224; + gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].pos1.y = 160; + } + else + { + StartSpriteAnim(&gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx], 0); + gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].pos1.x = gTradeMonSpriteCoords[newPosition][0] * 8 + 32; + gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].pos1.y = gTradeMonSpriteCoords[newPosition][1] * 8; + } + + if (*tradeMenuCursorPosition != newPosition) + { + PlaySE(SE_SELECT); + } + + *tradeMenuCursorPosition = newPosition; +} + +static void sub_8078D78(void) +{ + sub_807A19C(0); + gUnknown_0203229C->unk_6F = 100; + + if (GetMultiplayerId() == 1) + { + sub_8078C10(0xAABB, gUnknown_0203229C->tradeMenuCursorPosition); + } + else + { + gUnknown_0203229C->unk_78 = 1; + } +} + +static void sub_8078DBC(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + TradeMenuMoveCursor(&gUnknown_0203229C->tradeMenuCursorPosition, 0); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + TradeMenuMoveCursor(&gUnknown_0203229C->tradeMenuCursorPosition, 1); + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + TradeMenuMoveCursor(&gUnknown_0203229C->tradeMenuCursorPosition, 2); + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + TradeMenuMoveCursor(&gUnknown_0203229C->tradeMenuCursorPosition, 3); + } + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + + if (gUnknown_0203229C->tradeMenuCursorPosition < 6) + { + sub_8098858(1, 1, 14); + FillWindowPixelBuffer(1, 0x11); + PrintMenuTable(1, 2, gUnknown_0832DEAC); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(1, 2, 0); + PutWindowTilemap(1); + CopyWindowToVram(1, 3); + gUnknown_0203229C->unk_6F = 1; + } + else if (gUnknown_0203229C->tradeMenuCursorPosition < 12) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_0203229C->unk_6F = 2; + } + else if (gUnknown_0203229C->tradeMenuCursorPosition == 12) + { + CreateYesNoMenu(&gUnknown_0832DF8C, 1, 14, 0); + gUnknown_0203229C->unk_6F = 4; + sub_807A308(gUnknown_0832DE94[4], (void *)(OBJ_VRAM0 + gUnknown_0203229C->unk_72 * 32), 24); + } + } +} + +static void sub_8078EF8(void) +{ + sub_8079F74(); + gUnknown_0203229C->unk_6F = 0; + gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].invisible = FALSE; + sub_807A308(gUnknown_0832DE94[1], (void *)(OBJ_VRAM0 + gUnknown_0203229C->unk_72 * 32), 24); +} + +static void sub_8078F50(void) +{ + switch (Menu_ProcessInputNoWrap()) + { + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + sub_8078EF8(); + break; + case MENU_NOTHING_CHOSEN: + break; + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_0203229C->unk_6F = 2; + break; + case 1: + switch (sub_807A5F4(gPlayerParty, gPlayerPartyCount, gUnknown_0203229C->tradeMenuCursorPosition)) + { + case 0: + sub_8078D78(); + gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].invisible = TRUE; + break; + case 1: + sub_807A048(3, 3); + gUnknown_0203229C->unk_6F = 8; + break; + case 2: + case 4: + sub_807A048(3, 6); + gUnknown_0203229C->unk_6F = 8; + break; + case 3: + case 5: + sub_807A048(3, 7); + gUnknown_0203229C->unk_6F = 8; + break; + } + break; + } +} + +static void sub_8079034(void) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + PlaySE(SE_SELECT); + sub_8078EF8(); + } +} + +static void sub_807905C(void) +{ + if (!gPaletteFade.active) + { + if (gUnknown_0203229C->tradeMenuCursorPosition < PARTY_SIZE) + { + ShowPokemonSummaryScreen(PSS_MODE_UNK1, gPlayerParty, gUnknown_0203229C->tradeMenuCursorPosition, gUnknown_0203229C->partyCounts[0] - 1, sub_8077B74); + } + else + { + ShowPokemonSummaryScreen(PSS_MODE_UNK1, gEnemyParty, gUnknown_0203229C->tradeMenuCursorPosition - PARTY_SIZE, gUnknown_0203229C->partyCounts[1] - 1, sub_8077B74); + } + FreeAllWindowBuffers(); + } +} + +static u8 sub_80790D4(u8 *a0, u8 a1, u8 a2, u8 a3) +{ + int i; + u16 species; + u8 res = 0; + + for (i = 0; i < a1; i++) + { + if (a2 != i) + { + res += a0[i]; + } + } + + a3 %= PARTY_SIZE; + species = GetMonData(&gEnemyParty[a3], MON_DATA_SPECIES); + + if (species == SPECIES_DEOXYS || species == SPECIES_MEW) + { + if (!GetMonData(&gEnemyParty[a3], MON_DATA_OBEDIENCE)) + { + return 2; + } + } + + if (!IsNationalPokedexEnabled()) + { + if (gUnknown_0203229C->unk_51[1][a3] || !IsSpeciesInHoennDex(species)) + { + return 2; + } + } + + if (res) + { + res = 1; + } + + return res; +} + +static bool32 sub_8079174(void) +{ + int i; + u8 arr[12]; + + for (i = 0; i < gUnknown_0203229C->partyCounts[0]; i++) + { + arr[i] = gUnknown_0203229C->unk_45[0][i]; + } + + switch (sub_80790D4(arr, gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->tradeMenuCursorPosition, gUnknown_0203229C->unk_7E)) + { + case 0: + sub_807A048(3, 3); + sub_8078C10(0xBBCC, 0); + break; + case 1: + sub_807A048(3, 1); + sub_8078C10(0xBBBB, 0); + break; + case 2: + sub_807A048(3, 8); + return TRUE; + } + + return FALSE; +} + +static void sub_8079218(void) +{ + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case 0: + if (!sub_8079174()) + { + gUnknown_0203229C->unk_6F = 100; + } + else + { + gUnknown_0203229C->unk_6F = 17; + } + PutWindowTilemap(17); + break; + case 1: + case MENU_B_PRESSED: + sub_807A048(3, 1); + if (sub_80771BC()) + sub_8078C10(0xBBCC, 0); + gUnknown_0203229C->unk_6F = 100; + PutWindowTilemap(17); + break; + } +} + +static void sub_807929C(void) +{ + int i; + + for (i = 0; i < gUnknown_0203229C->partyCounts[1] - 4; i++) + { + PutWindowTilemap(i + 12); + CopyWindowToVram(i + 12, 1); + } +} + +static void sub_80792E4(void) +{ + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case 0: + sub_807A19C(4); + sub_8078C10(0xEEAA, 0); + gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].invisible = TRUE; + gUnknown_0203229C->unk_6F = 100; + sub_807929C(); + break; + case 1: + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + sub_8078EF8(); + break; + } +} + +static void sub_807935C(void) +{ + if (GetMultiplayerId() == 0) + { + rbox_fill_rectangle(0); + sub_807967C(gUnknown_0203229C->tradeMenuCursorPosition); + sub_807967C(gUnknown_0203229C->unk_7E); + } + gUnknown_0203229C->unk_6F = 7; +} + +static void sub_8079398(void) +{ + if (gUnknown_0203229C->unk_74[0] == 5 && gUnknown_0203229C->unk_74[1] == 5) + { + sub_80787B8(); + gUnknown_0203229C->unk_6F = 14; + } +} + +static void DisplayMessageAndContinueTask(void) +{ + gUnknown_0203229C->unk_A8++; + + if (gUnknown_0203229C->unk_A8 > 120) + { + CreateYesNoMenu(&gUnknown_0832DF8C, 1, 14, 0); + gUnknown_0203229C->unk_A8 = 0; + gUnknown_0203229C->unk_6F = 3; + } +} + +static void sub_8079408(void) +{ + int i; + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + rbox_fill_rectangle(0); + rbox_fill_rectangle(1); + + for (i = 0; i < 4; i++) + { + FillWindowPixelBuffer(i + 14, 0); + rbox_fill_rectangle(i + 14); + } + + sub_8079F88(0); + sub_8079F88(1); + gUnknown_0203229C->unk_6F = 0; + gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].invisible = FALSE; + } +} + +static void sub_8079490(void) +{ + if (!gPaletteFade.active) + { + if (gWirelessCommType) + { + sub_800ADF8(); + } + else + { + sub_800ABF4(12); + } + + gUnknown_0203229C->unk_6F = 12; + } +} + +static void sub_80794CC(void) +{ + if (gWirelessCommType) + { + if (sub_80771BC() && sub_807A09C() == 0) + { + Free(gUnknown_02032184); + Free(gUnknown_0203229C); + FreeAllWindowBuffers(); + sub_800E084(); + SetMainCallback2(c2_8056854); + } + } + else + { + if (!gReceivedRemoteLinkPlayers) + { + Free(gUnknown_02032184); + Free(gUnknown_0203229C); + FreeAllWindowBuffers(); + SetMainCallback2(c2_8056854); + } + } +} + +static void sub_8079550(void) +{ + if (!sub_801048C(FALSE) && sub_807A09C() == 0) + { + sub_800ADF8(); + gUnknown_0203229C->unk_6F = 13; + } +} + +static void sub_807957C(void) +{ + if (gMain.newKeys & A_BUTTON) + { + sub_8078C10(0xBBCC, 0); + gUnknown_0203229C->unk_6F = 100; + } +} + +static void sub_80795AC(void) +{ + switch (gUnknown_0203229C->unk_6F) + { + case 0: + sub_8078DBC(); + break; + case 1: + sub_8078F50(); + break; + case 2: + sub_807905C(); + break; + case 3: + sub_8079218(); + break; + case 4: + sub_80792E4(); + break; + case 6: + sub_807935C(); + break; + case 7: + sub_8079398(); + break; + case 8: + sub_8079408(); + break; + case 9: + sub_8078130(); + break; + case 10: + sub_807816C(); + break; + case 11: + sub_8079490(); + break; + case 12: + sub_80794CC(); + break; + case 13: + sub_80781C8(); + break; + case 14: + DisplayMessageAndContinueTask(); + break; + case 15: + sub_8079034(); + break; + case 16: + sub_8079550(); + break; + case 17: + sub_807957C(); + break; + } +} + +static void sub_807967C(u8 a0) +{ + u8 whichParty = a0 / PARTY_SIZE; + + if (gUnknown_0203229C->unk_74[whichParty] == 0) + { + gUnknown_0203229C->unk_74[whichParty] = 1; + gUnknown_0203229C->unk_76[whichParty] = a0; + } +} + +static void sub_80796B4(u8 a0) +{ + s8 nameStringWidth; + u8 nickname[20]; + u8 movesString[56]; + u8 i; + u8 partyIdx; + u8 whichParty; + u8 monIdx = gUnknown_0203229C->unk_76[a0]; + + whichParty = 1; + if (gUnknown_0203229C->unk_76[a0] < PARTY_SIZE) + whichParty = 0; + partyIdx = monIdx % PARTY_SIZE; + nameStringWidth = 0; + + switch (gUnknown_0203229C->unk_74[a0]) + { + case 1: + for (i = 0; i < gUnknown_0203229C->partyCounts[a0]; i++) + { + gSprites[gUnknown_0203229C->partyIcons[0][i + (whichParty * PARTY_SIZE)]].invisible = TRUE; + } + + for (i = 0; i < 6; i++) + { + ClearWindowTilemap(i + (a0 * 6 + 2)); + } + + gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].invisible = FALSE; + gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].data[0] = 20; + gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].data[2] = (gTradeMonSpriteCoords[whichParty * PARTY_SIZE][0] + gTradeMonSpriteCoords[whichParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; + gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].data[4] = (gTradeMonSpriteCoords[whichParty * PARTY_SIZE][1] * 8) - 12; + StoreSpriteCallbackInData6(&gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]], sub_80D3014); + gUnknown_0203229C->unk_74[a0]++; + sub_80A6DEC(&gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]]); + CopyToBgTilemapBufferRect_ChangePalette(1, gTradePartyBoxTilemap, a0 * 15, 0, 15, 17, 0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(0); + + if (whichParty == 0) + sub_8079F74(); + break; + case 2: + if (gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].callback == sub_80D3014) + gUnknown_0203229C->unk_74[a0] = 3; + break; + case 3: + CopyToBgTilemapBufferRect_ChangePalette(1, gTradeMovesBoxTilemap, whichParty * 15, 0, 15, 17, 0); + CopyBgTilemapBufferToVram(1); + gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].pos1.x = (gTradeMonSpriteCoords[whichParty * PARTY_SIZE][0] + gTradeMonSpriteCoords[whichParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; + gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].pos1.y = (gTradeMonSpriteCoords[whichParty * PARTY_SIZE][1] * 8) - 12; + gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].pos2.x = 0; + gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].pos2.y = 0; + nameStringWidth = sub_8079A3C(nickname, whichParty, partyIdx); + AddTextPrinterParameterized3((a0 * 2) + 14, 0, (80 - nameStringWidth) / 2, 4, gUnknown_0832DEE0, 0, nickname); + sub_8079AA4(movesString, whichParty, partyIdx); + AddTextPrinterParameterized4((a0 * 2) + 15, 1, 0, 0, 0, 0, gUnknown_0832DEE0, 0, movesString); + PutWindowTilemap((a0 * 2) + 14); + CopyWindowToVram((a0 * 2) + 14, 3); + PutWindowTilemap((a0 * 2) + 15); + CopyWindowToVram((a0 * 2) + 15, 3); + gUnknown_0203229C->unk_74[a0]++; + break; + case 4: + sub_8079C4C(a0, partyIdx, gUnknown_0832DF99[a0][0] + 4, gUnknown_0832DF99[a0][1] + 1, gUnknown_0832DF99[a0][0], gUnknown_0832DF99[a0][1]); + gUnknown_0203229C->unk_74[a0]++; + break; + } +} + +static u8 sub_8079A3C(u8 *str, u8 whichParty, u8 monIdx) +{ + u8 nickname[12]; + + if (whichParty == 0) + GetMonData(&gPlayerParty[monIdx], MON_DATA_NICKNAME, nickname); + else + GetMonData(&gEnemyParty[monIdx], MON_DATA_NICKNAME, nickname); + + StringCopy10(str, nickname); + return GetStringWidth(0, str, GetFontAttribute(0, FONTATTR_LETTER_SPACING)); +} + +static void sub_8079AA4(u8 *a0, u8 a1, u8 a2) +{ + u16 arr[4]; + u16 i; + + if (!gUnknown_0203229C->unk_51[a1][a2]) + { + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (!a1) + { + arr[i] = GetMonData(&gPlayerParty[a2], i + MON_DATA_MOVE1, NULL); + } + else + { + arr[i] = GetMonData(&gEnemyParty[a2], i + MON_DATA_MOVE1, NULL); + } + } + + StringCopy(a0, gText_EmptyString7); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (arr[i] != MOVE_NONE) + { + StringAppend(a0, gMoveNames[arr[i]]); + } + + StringAppend(a0, gText_NewLine3); + } + } + else + { + StringCopy(a0, gText_EmptyString7); + StringAppend(a0, gText_FourQuestionMarks); + } +} + +static void sub_8079B84(u8 whichParty, u8 windowId, u8 *str) +{ + u8 xPos; + windowId += (whichParty * PARTY_SIZE) + 2; + xPos = GetStringCenterAlignXOffset(0, str, 64); + AddTextPrinterParameterized3(windowId, 0, xPos, 4, gUnknown_0832DEE0, 0, str); + PutWindowTilemap(windowId); + CopyWindowToVram(windowId, 3); +} + +static void sub_8079BE0(u8 whichParty) +{ + u8 i; + u8 sp[20]; + u8 sp14[32]; + struct Pokemon *mons = whichParty == 0 ? gPlayerParty : gEnemyParty; + + for (i = 0; i < gUnknown_0203229C->partyCounts[whichParty]; i++) + { + GetMonData(&mons[i], MON_DATA_NICKNAME, sp); + StringCopy10(sp14, sp); + sub_8079B84(whichParty, i, sp14); + } +} + +static void sub_8079C4C(u8 whichParty, u8 monIdx, u8 a2, u8 a3, u8 a4, u8 a5) +{ + u8 level; + u32 r2; + u8 gender; + u8 nickname[12]; + + CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_08DDD704, a4, a5, 6, 3, 0); + CopyBgTilemapBufferToVram(1); + + if (whichParty == 0) + level = GetMonData(&gPlayerParty[monIdx], MON_DATA_LEVEL, NULL); + else + level = GetMonData(&gEnemyParty[monIdx], MON_DATA_LEVEL, NULL); + + if (gUnknown_0203229C->unk_51[whichParty][monIdx] == 0) + { + if (level / 10 != 0) + gUnknown_0203229C->tilemapBuffer[a2 + (a3 * 32)] = (level / 10) + 0x60; + + gUnknown_0203229C->tilemapBuffer[a2 + (a3 * 32) + 1] = (level % 10) + 0x70; + } + else + { + gUnknown_0203229C->tilemapBuffer[a2 + (a3 * 32) - 32] = gUnknown_0203229C->tilemapBuffer[a2 + (a3 * 32) - 33]; + gUnknown_0203229C->tilemapBuffer[a2 + (a3 * 32) - 31] = gUnknown_0203229C->tilemapBuffer[a2 + (a3 * 32) - 36] | 0x400; + } + + if (gUnknown_0203229C->unk_51[whichParty][monIdx] != 0) + { + r2 = 0x480; + } + else + { + if (whichParty == 0) + { + gender = GetMonGender(&gPlayerParty[monIdx]); + GetMonData(&gPlayerParty[monIdx], MON_DATA_NICKNAME, nickname); + } + else + { + gender = GetMonGender(&gEnemyParty[monIdx]); + GetMonData(&gEnemyParty[monIdx], MON_DATA_NICKNAME, nickname); + } + + switch (gender) + { + case MON_MALE: + r2 = !NameHasGenderSymbol(nickname, MON_MALE) ? 0x84 : 0x83; + break; + case MON_FEMALE: + r2 = !NameHasGenderSymbol(nickname, MON_FEMALE) ? 0x85 : 0x83; + break; + default: + r2 = 0x83; + break; + } + } + gUnknown_0203229C->tilemapBuffer[(a3 - 1) * 32 + a2 + 1] = r2; +} + +// Very close but loop preamble not working. +#ifdef NONMATCHING +static void sub_8079E44(u8 whichParty) +{ + int i; + + for (i = 0; i < gUnknown_0203229C->partyCounts[whichParty]; i++) + { + sub_8079C4C(whichParty, i, gTradeLevelDisplayCoords[whichParty][i][0], gTradeLevelDisplayCoords[whichParty][i][1], gTradeMonBoxCoords[whichParty][i][0], gTradeMonBoxCoords[whichParty][i][1]); + } +} +#else +NAKED +static void sub_8079E44(u8 whichParty) +{ + asm_unified("push {r4-r7,lr}\n\ + sub sp, 0x8\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + movs r7, 0\n\ + ldr r0, =gUnknown_0203229C\n\ + ldr r0, [r0]\n\ + adds r0, 0x36\n\ + adds r0, r6\n\ + ldrb r0, [r0]\n\ + cmp r7, r0\n\ + bge _08079E94\n\ + lsls r0, r6, 1\n\ + adds r0, r6\n\ + ldr r1, =gTradeLevelDisplayCoords\n\ + lsls r0, 2\n\ + adds r5, r0, r1\n\ + ldr r1, =gTradeMonBoxCoords\n\ + adds r4, r0, r1\n\ +_08079E6A:\n\ + lsls r1, r7, 24\n\ + lsrs r1, 24\n\ + ldrb r2, [r5]\n\ + ldrb r3, [r5, 0x1]\n\ + ldrb r0, [r4]\n\ + str r0, [sp]\n\ + ldrb r0, [r4, 0x1]\n\ + str r0, [sp, 0x4]\n\ + adds r0, r6, 0\n\ + bl sub_8079C4C\n\ + adds r5, 0x2\n\ + adds r4, 0x2\n\ + adds r7, 0x1\n\ + ldr r0, =gUnknown_0203229C\n\ + ldr r0, [r0]\n\ + adds r0, 0x36\n\ + adds r0, r6\n\ + ldrb r0, [r0]\n\ + cmp r7, r0\n\ + blt _08079E6A\n\ +_08079E94:\n\ + add sp, 0x8\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} +#endif // NONMATCHING + +static void sub_8079EA8(u8 whichParty) +{ + int i; + + for (i = 0; i < gUnknown_0203229C->partyCounts[whichParty]; i++) + { + gSprites[gUnknown_0203229C->partyIcons[whichParty][i]].invisible = FALSE; + gSprites[gUnknown_0203229C->partyIcons[whichParty][i]].pos1.x = gTradeMonSpriteCoords[(whichParty * PARTY_SIZE) + i][0] * 8 + 14; + gSprites[gUnknown_0203229C->partyIcons[whichParty][i]].pos1.y = gTradeMonSpriteCoords[(whichParty * PARTY_SIZE) + i][1] * 8 - 12; + gSprites[gUnknown_0203229C->partyIcons[whichParty][i]].pos2.x = 0; + gSprites[gUnknown_0203229C->partyIcons[whichParty][i]].pos2.y = 0; + } +} + +static void sub_8079F74(void) +{ + rbox_fill_rectangle(1); + sub_8079BE0(1); +} + +static void sub_8079F88(u8 a0) +{ + CopyToBgTilemapBufferRect_ChangePalette(1, gTradePartyBoxTilemap, a0 * 15, 0, 15, 17, 0); + CopyBgTilemapBufferToVram(1); + sub_8079E44(a0); + sub_8079BE0(a0); + sub_8079EA8(a0); + sub_807A308(gUnknown_0832DE94[1], (void *)(OBJ_VRAM0 + (gUnknown_0203229C->unk_72 * 32)), 24); + gUnknown_0203229C->unk_74[a0] = 0; +} + +static void sub_807A000(u8 taskId) +{ + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(0); +} + +static void sub_807A024(u8 taskId) +{ + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(0); +} + +static void sub_807A048(u16 a0, u8 a1) +{ + int i; + + for (i = 0; i < 4; i++) + { + if (!gUnknown_0203229C->unk_8D0[i].unk_0) + { + gUnknown_0203229C->unk_8D0[i].unk_2 = a0; + gUnknown_0203229C->unk_8D0[i].unk_4 = a1; + gUnknown_0203229C->unk_8D0[i].unk_0 = TRUE; + break; + } + } +} + +static u32 sub_807A09C(void) +{ + u32 acc = 0; + int i; + + for (i = 0; i < 4; i++) + { + acc += gUnknown_0203229C->unk_8D0[i].unk_0; + } + + return acc; +} + +static void sub_807A0C4(void) +{ + int i; + + for (i = 0; i < 4; i++) + { + if (gUnknown_0203229C->unk_8D0[i].unk_0) + { + if (gUnknown_0203229C->unk_8D0[i].unk_2) + { + gUnknown_0203229C->unk_8D0[i].unk_2--; + } + else + { + switch (gUnknown_0203229C->unk_8D0[i].unk_4) + { + case 0: + sub_8077170(gUnknown_0203229C->linkData, 20); + break; + case 1: + sub_807A19C(0); + break; + case 2: + sub_807A19C(2); + break; + case 3: + case 4: + case 5: + sub_807A19C(3); + break; + case 6: + sub_807A19C(6); + break; + case 7: + sub_807A19C(7); + break; + case 8: + sub_807A19C(8); + break; + } + gUnknown_0203229C->unk_8D0[i].unk_0 = 0; + } + } + } +} + +static void sub_807A19C(u8 a0) +{ + FillWindowPixelBuffer(0, 0x11); + AddTextPrinterParameterized(0, 1, gUnknown_0832DEBC[a0], 0, 1, TEXT_SPEED_FF, NULL); + sub_8098858(0, 20, 12); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); +} + +static bool8 sub_807A1F0(void) +{ + struct SpriteSheet sheet; + + if (gUnknown_0203229C->unk_A8 < 14) + { + sheet.data = gUnknown_02032188[gUnknown_0203229C->unk_A8]; + sheet.size = 0x100; + sheet.tag = 200 + gUnknown_0203229C->unk_A8; + } + + switch (gUnknown_0203229C->unk_A8) + { + case 0 ... 7: + LoadSpriteSheet(&sheet); + gUnknown_0203229C->unk_A8++; + break; + case 8: + gUnknown_0203229C->unk_72 = LoadSpriteSheet(&sheet); + gUnknown_0203229C->unk_A8++; + break; + case 9 ... 13: + LoadSpriteSheet(&sheet); + gUnknown_0203229C->unk_A8++; + break; + case 14: + LoadSpritePalette(&gSpritePalette_TradeScreenText); + gUnknown_0203229C->unk_A8++; + break; + case 15: + LoadSpritePalette(&gUnknown_0832DC44); + gUnknown_0203229C->unk_A8++; + break; + case 16: + LoadSpriteSheet(&gUnknown_0832DC3C); + gUnknown_0203229C->unk_A8++; + break; + case 17: + gUnknown_0203229C->unk_A8 = 0; + return TRUE; + } + + return FALSE; +} + +static void sub_807A308(const u8 *a0, u8 *a1, u8 unused) +{ + sub_80C6D80(a0, a1, 0, 0, 6); +} + +static void sub_807A320(u8 who) +{ + int i; + + switch (who) + { + case 0: + for (i = 0; i < gUnknown_0203229C->partyCounts[who]; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) == TRUE) + { + gUnknown_0203229C->unk_45[who][i] = 0; + gUnknown_0203229C->unk_51[who][i] = 1; + } + else if (GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) + { + gUnknown_0203229C->unk_45[who][i] = 0; + gUnknown_0203229C->unk_51[who][i] = 0; + } + else + { + gUnknown_0203229C->unk_45[who][i] = 1; + gUnknown_0203229C->unk_51[who][i] = 0; + } + } + break; + case 1: + for (i = 0; i < gUnknown_0203229C->partyCounts[who]; i++) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG) == TRUE) + { + gUnknown_0203229C->unk_45[who][i] = 0; + gUnknown_0203229C->unk_51[who][i] = 1; + } + else if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) + { + gUnknown_0203229C->unk_45[who][i] = 0; + gUnknown_0203229C->unk_51[who][i] = 0; + } + else + { + gUnknown_0203229C->unk_45[who][i] = 1; + gUnknown_0203229C->unk_51[who][i] = 0; + } + } + break; + } +} + +static void sub_807A468(u8 who) +{ + u16 i, curHp, maxHp; + + switch (who) + { + case 0: + for (i = 0; i < gUnknown_0203229C->partyCounts[0]; i++) + { + curHp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + maxHp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); + gUnknown_0203229C->unk_5D[0][i] = GetHPBarLevel(curHp, maxHp); + } + break; + case 1: + for (i = 0; i < gUnknown_0203229C->partyCounts[1]; i++) + { + curHp = GetMonData(&gEnemyParty[i], MON_DATA_HP); + maxHp = GetMonData(&gEnemyParty[i], MON_DATA_MAX_HP); + gUnknown_0203229C->unk_5D[1][i] = GetHPBarLevel(curHp, maxHp); + } + break; + } +} + +static void sub_807A53C(void) +{ + int i, j; + + for (i = 0; i < 2; i++) + { + for (j = 0; j < gUnknown_0203229C->partyCounts[i]; j++) + { + sub_80D32C8(&gSprites[gUnknown_0203229C->partyIcons[i][j]], 4 - gUnknown_0203229C->unk_5D[i][j]); + } + } +} + +static void sub_807A5B0(void) +{ + int i; + + for (i = 0; i < 11; i++) + { + if (gSaveBlock1Ptr->giftRibbons[i] == 0 && gUnknown_0203229C->unk_A9[i] != 0) + { + if (gUnknown_0203229C->unk_A9[i] < 64) + gSaveBlock1Ptr->giftRibbons[i] = gUnknown_0203229C->unk_A9[i]; + } + } +} + +static u32 sub_807A5F4(struct Pokemon *monList, int a1, int monIdx) +{ + int i, sum; + struct LinkPlayer *player; + u32 species[6]; + u32 species2[6]; + + for (i = 0; i < a1; i++) + { + species2[i] = GetMonData(&monList[i], MON_DATA_SPECIES2); + species[i] = GetMonData(&monList[i], MON_DATA_SPECIES); + } + + if (!IsNationalPokedexEnabled()) + { + if (species2[monIdx] == SPECIES_EGG) + { + return 3; + } + + if (!IsSpeciesInHoennDex(species2[monIdx])) + { + return 2; + } + } + + player = &gLinkPlayers[GetMultiplayerId() ^ 1]; + if ((player->version & 0xFF) != VERSION_RUBY && + (player->version & 0xFF) != VERSION_SAPPHIRE) + { + if ((player->name[10] & 0xF) == 0) + { + if (species2[monIdx] == SPECIES_EGG) + { + return 5; + } + + if (!IsSpeciesInHoennDex(species2[monIdx])) + { + return 4; + } + } + } + + if (species[monIdx] == SPECIES_DEOXYS || species[monIdx] == SPECIES_MEW) + { + if (!GetMonData(&monList[monIdx], MON_DATA_OBEDIENCE)) + { + return 4; + } + } + + for (i = 0; i < a1; i++) + { + if (species2[i] == SPECIES_EGG) + { + species2[i] = SPECIES_NONE; + } + } + + for (sum = 0, i = 0; i < a1; i++) + { + if (i != monIdx) + { + sum += species2[i]; + } + } + + if (sum != 0) + { + return 0; + } + else + { + return 1; + } +} + +#ifdef NONMATCHING +s32 sub_807A728(void) +{ + s32 val; + u16 version; + + if (gReceivedRemoteLinkPlayers) + { + val = 0; + version = (gLinkPlayers[GetMultiplayerId() ^ 1].version & 0xFF); + + if (version == VERSION_RUBY || version == VERSION_SAPPHIRE || version == VERSION_EMERALD) + { + // this value could actually be anything 0 or less + val = 0; + } + else if (version == VERSION_FIRE_RED || version == VERSION_LEAF_GREEN) + { + val = 2; + } + + if (val > 0) + { + if (gLinkPlayers[GetMultiplayerId()].name[10] & 0xF0) + { + if (val == 2) + { + if (gLinkPlayers[GetMultiplayerId() ^ 1].name[10] & 0xF0) + { + return 0; + } + else + { + return 2; + } + } + } + else + { + return 1; + } + } + } + return 0; +} +#else +NAKED +s32 sub_807A728(void) +{ + asm_unified("push {r4-r7,lr}\n\ + ldr r0, =gReceivedRemoteLinkPlayers\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _0807A7B4\n\ + movs r4, 0\n\ + bl GetMultiplayerId\n\ + ldr r5, =gLinkPlayers\n\ + movs r7, 0x1\n\ + eors r0, r7\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, r0, 3\n\ + subs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r5\n\ + ldrb r1, [r1]\n\ + subs r0, r1, 0x1\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x2\n\ + bls _0807A7B4\n\ + subs r0, r1, 0x4\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bhi _0807A762\n\ + movs r4, 0x2\n\ +_0807A762:\n\ + cmp r4, 0\n\ + ble _0807A7B4\n\ + bl GetMultiplayerId\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, r0, 3\n\ + subs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r5\n\ + ldrb r1, [r1, 0x12]\n\ + movs r6, 0xF0\n\ + adds r0, r6, 0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0807A7B0\n\ + cmp r4, 0x2\n\ + bne _0807A7B4\n\ + bl GetMultiplayerId\n\ + eors r0, r7\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, r0, 3\n\ + subs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r5\n\ + ldrb r1, [r1, 0x12]\n\ + adds r0, r6, 0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0807A7B4\n\ + movs r0, 0x2\n\ + b _0807A7B6\n\ + .pool\n\ +_0807A7B0:\n\ + movs r0, 0x1\n\ + b _0807A7B6\n\ +_0807A7B4:\n\ + movs r0, 0\n\ +_0807A7B6:\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1"); +} +#endif // NONMATCHING + +static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isObedientBitSet) +{ + if (species == SPECIES_DEOXYS || species == SPECIES_MEW) + { + if (!isObedientBitSet) + return TRUE; + } + return FALSE; +} + +int sub_807A7E0(struct UnkLinkRfuStruct_02022B14Substruct a0, struct UnkLinkRfuStruct_02022B14Substruct a1, u16 species1, u16 species2, u8 type, u16 species3, u8 isObedientBitSet) +{ + u8 r9 = a0.unk_01_0; + u8 r2 = a0.unk_00_7; + u8 r10 = a1.unk_01_0; + u8 r0 = a1.unk_00_7; + u8 r1 = a1.unk_01_2; + + if (r1 != 3) + { + if (!r2) + { + return 8; + } + else if (!r0) + { + return 9; + } + } + + if (IsDeoxysOrMewUntradable(species3, isObedientBitSet)) + { + return 4; + } + + if (species2 == SPECIES_EGG) + { + if (species1 != species2) + { + return 2; + } + } + else + { + if (gBaseStats[species1].type1 != type && gBaseStats[species1].type2 != type) + { + return 1; + } + } + + if (species1 == SPECIES_EGG && species1 != species2) + { + return 3; + } + + if (!r9) + { + if (species1 == SPECIES_EGG) + { + return 6; + } + + if (!IsSpeciesInHoennDex(species1)) + { + return 4; + } + + if (!IsSpeciesInHoennDex(species2)) + { + return 5; + } + } + + if (!r10 && !IsSpeciesInHoennDex(species1)) + { + return 7; + } + + return 0; +} + +int sub_807A8D0(struct UnkLinkRfuStruct_02022B14Substruct a0, u16 species, u16 a2, u8 a3) +{ + u8 unk = a0.unk_01_0; + + if (IsDeoxysOrMewUntradable(a2, a3)) + { + return 1; + } + + if (unk) + { + return 0; + } + + if (species == SPECIES_EGG) + { + return 2; + } + + if (IsSpeciesInHoennDex(species)) + { + return 0; + } + + return 1; +} + +// r6/r7 flip. Ugh. +#ifdef NONMATCHING +int sub_807A918(struct Pokemon *mon, u16 monIdx) +{ + int i, version, versions, unk, unk2; + int speciesArray[PARTY_SIZE]; + + for (i = 0; i < gPlayerPartyCount; i++) + { + speciesArray[i] = GetMonData(&mon[i], MON_DATA_SPECIES2); + if (speciesArray[i] == SPECIES_EGG) + { + speciesArray[i] = 0; + } + } + + versions = 0; + unk = 1; + for (i = 0; i < GetLinkPlayerCount(); i++) + { + version = gLinkPlayers[i].version & 0xFF; + if (version == VERSION_FIRE_RED || + version == VERSION_LEAF_GREEN) + { + versions = 0; + } + else + { + versions |= 1; + } + } + + for (i = 0; i < GetLinkPlayerCount(); i++) + { + struct LinkPlayer *player = &gLinkPlayers[i]; + if ((player->name[8] & 0xF) == 0) + { + unk = 0; + } + + if (versions && (player->name[8] / 16)) + { + unk = 0; + } + } + + if (unk == 0) + { + if (!IsSpeciesInHoennDex(speciesArray[monIdx])) + { + return 2; + } + + if (speciesArray[monIdx] == SPECIES_NONE) + { + return 3; + } + } + + unk2 = 0; + for (i = 0; i < gPlayerPartyCount; i++) + { + if (monIdx != i) + { + unk2 += speciesArray[i]; + } + } + + if (!unk2) + { + return 1; + } + else + { + return 0; + } +} +#else +NAKED +int sub_807A918(struct Pokemon *mon, u16 a1) +{ + asm_unified("push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0x18\n\ + adds r6, r0, 0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + mov r8, r1\n\ + movs r5, 0\n\ + ldr r0, =gPlayerPartyCount\n\ + ldrb r0, [r0]\n\ + cmp r5, r0\n\ + bge _0807A95A\n\ + mov r4, sp\n\ +_0807A934:\n\ + movs r0, 0x64\n\ + muls r0, r5\n\ + adds r0, r6, r0\n\ + movs r1, 0x41\n\ + bl GetMonData\n\ + str r0, [r4]\n\ + movs r1, 0xCE\n\ + lsls r1, 1\n\ + cmp r0, r1\n\ + bne _0807A94E\n\ + movs r0, 0\n\ + str r0, [r4]\n\ +_0807A94E:\n\ + adds r4, 0x4\n\ + adds r5, 0x1\n\ + ldr r0, =gPlayerPartyCount\n\ + ldrb r0, [r0]\n\ + cmp r5, r0\n\ + blt _0807A934\n\ +_0807A95A:\n\ + movs r7, 0\n\ + movs r6, 0x1\n\ + movs r5, 0\n\ + ldr r4, =gLinkPlayers\n\ + b _0807A980\n\ + .pool\n\ +_0807A96C:\n\ + ldrb r0, [r4]\n\ + subs r0, 0x4\n\ + cmp r0, 0x1\n\ + bhi _0807A978\n\ + movs r7, 0\n\ + b _0807A97C\n\ +_0807A978:\n\ + movs r0, 0x1\n\ + orrs r7, r0\n\ +_0807A97C:\n\ + adds r4, 0x1C\n\ + adds r5, 0x1\n\ +_0807A980:\n\ + bl GetLinkPlayerCount\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r5, r0\n\ + blt _0807A96C\n\ + movs r5, 0\n\ + movs r4, 0\n\ + b _0807A9B4\n\ +_0807A992:\n\ + ldr r0, =gLinkPlayers\n\ + adds r2, r4, r0\n\ + ldrb r1, [r2, 0x10]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0807A9A2\n\ + movs r6, 0\n\ +_0807A9A2:\n\ + cmp r7, 0\n\ + beq _0807A9B0\n\ + ldrb r0, [r2, 0x10]\n\ + lsrs r0, 4\n\ + cmp r0, 0\n\ + beq _0807A9B0\n\ + movs r6, 0\n\ +_0807A9B0:\n\ + adds r4, 0x1C\n\ + adds r5, 0x1\n\ +_0807A9B4:\n\ + bl GetLinkPlayerCount\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r5, r0\n\ + blt _0807A992\n\ + cmp r6, 0\n\ + bne _0807A9EA\n\ + mov r1, r8\n\ + lsls r0, r1, 2\n\ + mov r1, sp\n\ + adds r4, r1, r0\n\ + ldrh r0, [r4]\n\ + bl IsSpeciesInHoennDex\n\ + cmp r0, 0\n\ + bne _0807A9E0\n\ + movs r0, 0x2\n\ + b _0807AA1A\n\ + .pool\n\ +_0807A9E0:\n\ + ldr r0, [r4]\n\ + cmp r0, 0\n\ + bne _0807A9EA\n\ + movs r0, 0x3\n\ + b _0807AA1A\n\ +_0807A9EA:\n\ + movs r2, 0\n\ + movs r5, 0\n\ + ldr r0, =gPlayerPartyCount\n\ + ldrb r0, [r0]\n\ + cmp r2, r0\n\ + bge _0807AA0A\n\ + adds r3, r0, 0\n\ + mov r1, sp\n\ +_0807A9FA:\n\ + cmp r8, r5\n\ + beq _0807AA02\n\ + ldr r0, [r1]\n\ + adds r2, r0\n\ +_0807AA02:\n\ + adds r1, 0x4\n\ + adds r5, 0x1\n\ + cmp r5, r3\n\ + blt _0807A9FA\n\ +_0807AA0A:\n\ + cmp r2, 0\n\ + beq _0807AA18\n\ + movs r0, 0\n\ + b _0807AA1A\n\ + .pool\n\ +_0807AA18:\n\ + movs r0, 0x1\n\ +_0807AA1A:\n\ + add sp, 0x18\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1"); +} +#endif // NONMATCHING + +static void sub_807AA28(struct Sprite *sprite) +{ + if (++sprite->data[0] == 10) + { + PlaySE(SE_BOWA); + sprite->data[0] = 0; + } +} + +static void sub_807AA4C(struct Sprite *sprite) +{ + if (!sprite->invisible && ++sprite->data[0] == 10) + { + PlaySE(SE_W207B); + sprite->data[0] = 0; + } +} + +static void sub_807AA7C(struct Sprite *sprite) +{ + if (!sprite->data[1]) + { + if (++sprite->data[0] == 12) + sprite->data[0] = 0; + + LoadPalette(&gUnknown_08338EA4[sprite->data[0]], (sprite->oam.paletteNum + 16) * 16 + 4, 2); + } +} + +static void sub_807AABC(struct Sprite *sprite) +{ + sprite->data[0]++; + sprite->pos2.y++; + + if (sprite->data[0] == 10) + DestroySprite(sprite); +} + +static void sub_807AAE0(struct Sprite *sprite) +{ + sprite->data[0]++; + sprite->pos2.y--; + + if (sprite->data[0] == 10) + DestroySprite(sprite); +} + +static void sub_807AB04(struct Sprite *sprite) +{ + if (++sprite->data[0] == 15) + { + PlaySE(SE_W107); + sprite->data[0] = 0; + } +} + +static void sub_807AB28(void) +{ + struct BgAffineDstData affine; + + DoBgAffineSet(&affine, gUnknown_020322A0->unk_D4 * 0x100, gUnknown_020322A0->unk_D6 * 0x100, gUnknown_020322A0->unk_DC, gUnknown_020322A0->unk_DE, gUnknown_020322A0->unk_E8, gUnknown_020322A0->unk_E8, gUnknown_020322A0->unk_EC); + SetGpuReg(REG_OFFSET_BG2PA, affine.pa); + SetGpuReg(REG_OFFSET_BG2PB, affine.pb); + SetGpuReg(REG_OFFSET_BG2PC, affine.pc); + SetGpuReg(REG_OFFSET_BG2PD, affine.pd); + SetGpuReg(REG_OFFSET_BG2X_L, affine.dx); + SetGpuReg(REG_OFFSET_BG2X_H, affine.dx >> 16); + SetGpuReg(REG_OFFSET_BG2Y_L, affine.dy); + SetGpuReg(REG_OFFSET_BG2Y_H, affine.dy >> 16); +} + +static void sub_807ABCC(void) +{ + u16 dispcnt; + + SetGpuReg(REG_OFFSET_BG1VOFS, gUnknown_020322A0->bg1vofs); + SetGpuReg(REG_OFFSET_BG1HOFS, gUnknown_020322A0->bg1hofs); + + dispcnt = GetGpuReg(REG_OFFSET_DISPCNT); + if ((dispcnt & 7) == DISPCNT_MODE_0) + { + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_020322A0->bg2vofs); + SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_020322A0->bg2hofs); + } + else + { + sub_807AB28(); + } +} + +static void sub_807AC24(void) +{ + sub_807ABCC(); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void sub_807AC3C(void) +{ + gUnknown_020322A0->unk_8A = 0; + gUnknown_020322A0->unk_88 = 0; + gUnknown_020322A0->unk_89 = 0; +} + +static void sub_807AC64(void) +{ + if (gUnknown_020322A0->unk_88 == gUnknown_020322A0->unk_89) + gUnknown_020322A0->unk_8A++; + else + gUnknown_020322A0->unk_8A = 0; + + if (gUnknown_020322A0->unk_8A > 300) + { + CloseLink(); + SetMainCallback2(CB2_LinkError); + gUnknown_020322A0->unk_8A = 0; + gUnknown_020322A0->unk_89 = 0; + gUnknown_020322A0->unk_88 = 0; + } + + gUnknown_020322A0->unk_89 = gUnknown_020322A0->unk_88; +} + +static u32 sub_807ACDC(void) +{ + if (gReceivedRemoteLinkPlayers) + return GetMultiplayerId(); + return 0; +} + +static void sub_807ACFC(u8 whichParty, u8 a1) +{ + int pos = 0; + struct Pokemon *mon = NULL; + u16 species; + u32 personality; + + if (whichParty == 0) + { + mon = &gPlayerParty[gUnknown_02032298[0]]; + pos = 1; + } + + if (whichParty == 1) + { + mon = &gEnemyParty[gUnknown_02032298[1] % PARTY_SIZE]; + pos = 3; + } + + switch (a1) + { + case 0: + species = GetMonData(mon, MON_DATA_SPECIES2); + personality = GetMonData(mon, MON_DATA_PERSONALITY); + + if (whichParty == 0) + HandleLoadSpecialPokePic_2(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality); + else + HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[whichParty * 2 + 1], species, personality); + + LoadCompressedSpritePalette(GetMonSpritePalStruct(mon)); + gUnknown_020322A0->tradeSpecies[whichParty] = species; + gUnknown_020322A0->unk_68[whichParty] = personality; + break; + case 1: + SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, pos); + gUnknown_020322A0->pokePicSpriteIdxs[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6); + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[whichParty]].invisible = TRUE; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy; + break; + } +} + +void sub_807AE50(void) +{ + switch (gMain.state) + { + case 0: + if (!gReceivedRemoteLinkPlayers) + { + gLinkType = 0x1144; + CloseLink(); + } + gUnknown_020322A0 = AllocZeroed(sizeof(*gUnknown_020322A0)); + AllocateMonSpritesGfx(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + SetVBlankCallback(sub_807AC24); + sub_807B170(); + sub_807AC3C(); + gMain.state++; + gUnknown_020322A0->unk_8C = 0; + gUnknown_020322A0->state = 0; + gUnknown_020322A0->isLinkTrade = TRUE; + gUnknown_020322A0->unk_D4 = 64; + gUnknown_020322A0->unk_D6 = 64; + gUnknown_020322A0->unk_D8 = 0; + gUnknown_020322A0->unk_DA = 0; + gUnknown_020322A0->unk_DC = 120; + gUnknown_020322A0->unk_DE = 80; + gUnknown_020322A0->unk_E8 = 256; + gUnknown_020322A0->unk_EC = 0; + break; + case 1: + if (!gReceivedRemoteLinkPlayers) + { + gUnknown_020322A0->unk_FA = 1; + OpenLink(); + gMain.state++; + gUnknown_020322A0->timer = 0; + } + else + { + gMain.state = 4; + } + break; + case 2: + if (++gUnknown_020322A0->timer > 60) + { + gUnknown_020322A0->timer = 0; + gMain.state++; + } + break; + case 3: + if (IsLinkMaster()) + { + if (GetLinkPlayerCount_2() >= sub_800AA48()) + { + if (++gUnknown_020322A0->timer > 30) + { + sub_800A620(); + gMain.state++; + } + } + else + { + sub_807AC64(); + } + } + else + { + gMain.state++; + } + break; + case 4: + sub_807AC64(); + if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) + gMain.state++; + break; + case 5: + gUnknown_020322A0->unk_72 = 0; + gUnknown_020322A0->unk_73 = 0; + gUnknown_020322A0->unk_93 = 0; + sub_807ACFC(0, 0); + gMain.state++; + break; + case 6: + sub_807ACFC(0, 1); + gMain.state++; + break; + case 7: + sub_807ACFC(1, 0); + gMain.state++; + break; + case 8: + sub_807ACFC(1, 1); + sub_807B154(); + gMain.state++; + break; + case 9: + sub_807BA94(); + LoadSpriteSheet(&gUnknown_08338D18); + LoadSpritePalette(&gUnknown_08338D20); + gMain.state++; + break; + case 10: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + ShowBg(0); + gMain.state++; + break; + case 11: + sub_807B140(); + SetTradeSceneStrings(); + gMain.state++; + break; + case 12: + if (!gPaletteFade.active) + { + if (gWirelessCommType) + { + sub_800E0E8(); + CreateWirelessStatusIndicatorSprite(0, 0); + } + SetMainCallback2(sub_807EA2C); + } + break; + } + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_807B140(void) +{ + sub_807B62C(5); + sub_807B62C(0); +} + +void sub_807B154(void) +{ + FillWindowPixelBuffer(0, 0xFF); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); +} + +static void sub_807B170(void) +{ + SetGpuReg(REG_OFFSET_DISPCNT, 0); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_08339014, ARRAY_COUNT(gUnknown_08339014)); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + SetBgTilemapBuffer(0, Alloc(0x800)); + SetBgTilemapBuffer(1, Alloc(0x800)); + SetBgTilemapBuffer(3, Alloc(0x800)); + DeactivateAllTextPrinters(); + DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0); + LZDecompressWram(gBattleTextboxTilemap, gDecompressionBuffer); + CopyToBgTilemapBuffer(0, gDecompressionBuffer, 0x800, 0); + LoadCompressedPalette(gBattleTextboxPalette, 0, 0x20); + InitWindows(gUnknown_08338FFC); + DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0); + LZDecompressWram(gBattleTextboxTilemap, gDecompressionBuffer); + CopyToBgTilemapBuffer(0, gDecompressionBuffer, 0x800, 0); + LoadCompressedPalette(gBattleTextboxPalette, 0, 0x20); +} + +// In-game trade init +static void sub_807B270(void) +{ + u8 otName[11]; + + switch (gMain.state) + { + case 0: + gUnknown_02032298[0] = gSpecialVar_0x8005; + gUnknown_02032298[1] = 6; + StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); + GetMonData(&gEnemyParty[0], MON_DATA_OT_NAME, otName); + StringCopy(gLinkPlayers[1].name, otName); + gLinkPlayers[0].language = LANGUAGE_ENGLISH; + gLinkPlayers[1].language = GetMonData(&gEnemyParty[0], MON_DATA_LANGUAGE); + gUnknown_020322A0 = AllocZeroed(sizeof(*gUnknown_020322A0)); + AllocateMonSpritesGfx(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + SetVBlankCallback(sub_807AC24); + sub_807B170(); + gUnknown_020322A0->isLinkTrade = FALSE; + gUnknown_020322A0->unk_8C = 0; + gUnknown_020322A0->state = 0; + gUnknown_020322A0->unk_D4 = 64; + gUnknown_020322A0->unk_D6 = 64; + gUnknown_020322A0->unk_D8 = 0; + gUnknown_020322A0->unk_DA = 0; + gUnknown_020322A0->unk_DC = 120; + gUnknown_020322A0->unk_DE = 80; + gUnknown_020322A0->unk_E8 = 256; + gUnknown_020322A0->unk_EC = 0; + gUnknown_020322A0->timer = 0; + gMain.state = 5; + break; + case 5: + sub_807ACFC(0, 0); + gMain.state++; + break; + case 6: + sub_807ACFC(0, 1); + gMain.state++; + break; + case 7: + sub_807ACFC(1, 0); + ShowBg(0); + gMain.state++; + break; + case 8: + sub_807ACFC(1, 1); + FillWindowPixelBuffer(0, 0xFF); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); + gMain.state++; + break; + case 9: + sub_807BA94(); + LoadSpriteSheet(&gUnknown_08338D18); + LoadSpritePalette(&gUnknown_08338D20); + gMain.state++; + break; + case 10: + ShowBg(0); + gMain.state++; + break; + case 11: + sub_807B62C(5); + sub_807B62C(0); + SetTradeSceneStrings(); + gMain.state++; + break; + case 12: + SetMainCallback2(sub_807B60C); + break; + } + + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_807B464(u8 partyIdx) +{ + struct Pokemon *mon = &gPlayerParty[partyIdx]; + + if (!GetMonData(mon, MON_DATA_IS_EGG)) + { + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + species = SpeciesToNationalPokedexNum(species); + GetSetPokedexFlag(species, FLAG_SET_SEEN); + HandleSetPokedexFlag(species, FLAG_SET_CAUGHT, personality); + } +} + +static void sub_807B4C4(void) +{ + u8 mpId = GetMultiplayerId(); + // Originally in Ruby but commented out + /*if (gLinkPlayers[mpId ^ 1].lp_field_2 == 0x8000) + EnableNationalPokedex();*/ +} + +static void sub_807B4D0(u8 a0, u8 a1) +{ + u8 friendship; + + struct Pokemon *playerMon = &gPlayerParty[a0]; + u16 playerMail = GetMonData(playerMon, MON_DATA_MAIL); + + struct Pokemon *partnerMon = &gEnemyParty[a1]; + u16 partnerMail = GetMonData(partnerMon, MON_DATA_MAIL); + + if (playerMail != 0xFF) + ClearMailStruct(&gSaveBlock1Ptr->mail[playerMail]); + + // This is where the actual trade happens!! + gUnknown_020322A0->mon = *playerMon; + *playerMon = *partnerMon; + *partnerMon = gUnknown_020322A0->mon; + + friendship = 70; + if (!GetMonData(playerMon, MON_DATA_IS_EGG)) + SetMonData(playerMon, MON_DATA_FRIENDSHIP, &friendship); + + if (partnerMail != 0xFF) + GiveMailToMon2(playerMon, &gUnknown_020321C0[partnerMail]); + + sub_807B464(a0); + if (gReceivedRemoteLinkPlayers) + sub_807B4C4(); +} + +static void sub_807B5B8(void) +{ + switch (gUnknown_020322A0->unk_93) + { + case 1: + if (IsLinkTaskFinished()) + { + Trade_SendData(gUnknown_020322A0); + gUnknown_020322A0->unk_93++; + } + // fallthrough + case 2: + gUnknown_020322A0->unk_93 = 0; + break; + } +} + +static void sub_807B60C(void) +{ + sub_807BBC8(); + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_807B62C(u8 a0) +{ + switch (a0) + { + case 0: + gUnknown_020322A0->bg2vofs = 0; + gUnknown_020322A0->bg2hofs = 180; + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG0_ON | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | + BGCNT_CHARBASE(1) | + BGCNT_16COLOR | + BGCNT_SCREENBASE(18) | + BGCNT_TXT512x256); + LoadPalette(gTradeGba2_Pal, 16, 0x60); + DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(1), 0x1420, 0x1000); + DmaCopy16Defvars(3, gUnknown_08331F60, (void *) BG_SCREEN_ADDR(18), 0x1000); + break; + case 1: + gUnknown_020322A0->bg1hofs = 0; + gUnknown_020322A0->bg1vofs = 348; + SetGpuReg(REG_OFFSET_BG1VOFS, 348); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) | + BGCNT_CHARBASE(0) | + BGCNT_16COLOR | + BGCNT_SCREENBASE(5) | + BGCNT_TXT256x512); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | + BGCNT_CHARBASE(1) | + BGCNT_16COLOR | + BGCNT_SCREENBASE(18) | + BGCNT_TXT256x512); + + if (gUnknown_020322A0->unk_FA) + { + DmaCopy16Defvars(3, gUnknown_083369A0, (void *) BG_SCREEN_ADDR(5), 0x1000); + } + else + { + DmaCopy16Defvars(3, gUnknown_083359A0, (void *) BG_SCREEN_ADDR(5), 0x1000); + } + + DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(0), 0x1420, 0x1000); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + break; + case 2: + gUnknown_020322A0->bg1vofs = 0; + gUnknown_020322A0->bg1hofs = 0; + if (!gUnknown_020322A0->unk_FA) + { + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + LZ77UnCompVram(gUnknown_083379A0, (void *) BG_SCREEN_ADDR(5)); + BlendPalettes(0x8, 16, RGB_BLACK); + } + else + { + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + DmaCopy16Defvars(3, gUnknown_0832FFC0, (void *) BG_SCREEN_ADDR(5), 0x800); + BlendPalettes(0x1, 16, RGB_BLACK); + } + break; + case 3: + LoadPalette(gUnknown_08337EA0, 48, 0x20); + LZ77UnCompVram(gUnknown_08337EC0, (void *) BG_CHAR_ADDR(1)); + LZ77UnCompVram(gUnknown_08338550, (void *) BG_SCREEN_ADDR(18)); + gUnknown_020322A0->bg2vofs = 80; + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + break; + case 4: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | + BGCNT_CHARBASE(1) | + BGCNT_256COLOR | + BGCNT_SCREENBASE(18) | + BGCNT_AFF128x128); + gUnknown_020322A0->unk_D4 = 64; + gUnknown_020322A0->unk_D6 = 92; + gUnknown_020322A0->unk_E8 = 32; + gUnknown_020322A0->unk_EA = 1024; + gUnknown_020322A0->unk_EC = 0; + + DmaCopyLarge16(3, gUnknown_08332F60, (void *) BG_CHAR_ADDR(1), 0x2840, 0x1000); + + if (gUnknown_020322A0->unk_FA) + { + DmaCopy16Defvars(3, gUnknown_083357A0, (void *) BG_SCREEN_ADDR(18), 0x100); + } + else + { + DmaCopy16Defvars(3, gUnknown_083358A0, (void *) BG_SCREEN_ADDR(18), 0x100); + } + break; + case 5: + gUnknown_020322A0->bg1vofs = 0; + gUnknown_020322A0->bg1hofs = 0; + break; + case 6: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | + BGCNT_CHARBASE(1) | + BGCNT_256COLOR | + BGCNT_SCREENBASE(18) | + BGCNT_AFF128x128); + gUnknown_020322A0->unk_D4 = 64; + gUnknown_020322A0->unk_D6 = 92; + gUnknown_020322A0->unk_E8 = 256; + gUnknown_020322A0->unk_EA = 128; + gUnknown_020322A0->unk_DC = 120; + gUnknown_020322A0->unk_DE = 80; + gUnknown_020322A0->unk_EC = 0; + + DmaCopyLarge16(3, gUnknown_08332F60, (void *) BG_CHAR_ADDR(1), 0x2840, 0x1000); + + if (gUnknown_020322A0->unk_FA) + { + DmaCopy16Defvars(3, gUnknown_083357A0, (void *) BG_SCREEN_ADDR(18), 0x100); + } + else + { + DmaCopy16Defvars(3, gUnknown_083358A0, (void *) BG_SCREEN_ADDR(18), 0x100); + } + break; + case 7: + gUnknown_020322A0->bg2vofs = 0; + gUnknown_020322A0->bg2hofs = 0; + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | + BGCNT_CHARBASE(1) | + BGCNT_16COLOR | + BGCNT_SCREENBASE(18) | + BGCNT_TXT512x256); + LoadPalette(gTradeGba2_Pal, 16, 0x60); + DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(1), 0x1420, 0x1000); + DmaCopy16Defvars(3, gUnknown_08331F60, (void *) BG_SCREEN_ADDR(18), 0x1000); + break; + } +} + +static void sub_807BA94(void) +{ + LoadSpriteSheet(&gUnknown_08338D70); + LoadSpriteSheet(&gUnknown_08338DC0); + LoadSpriteSheet(&gUnknown_08338DF4); + LoadSpriteSheet(&gUnknown_08338E6C); + LoadSpritePalette(&gUnknown_08338D78); + LoadSpritePalette(&gUnknown_08338D80); +} + +static void SetTradeSceneStrings(void) +{ + /*Sets the variable strings printed on the + *actual trading screen. For use in strings + *like "[Pokemon] will be sent to [Trainer]." + */ + u8 mpId; + u8 name[20]; + const struct InGameTrade *ingameTrade; + + if (gUnknown_020322A0->isLinkTrade) + { + mpId = GetMultiplayerId(); + StringCopy(gStringVar1, gLinkPlayers[mpId ^ 1].name); + GetMonData(&gEnemyParty[gUnknown_02032298[1] % PARTY_SIZE], MON_DATA_NICKNAME, name); + StringCopy10(gStringVar3, name); + GetMonData(&gPlayerParty[gUnknown_02032298[0]], MON_DATA_NICKNAME, name); + StringCopy10(gStringVar2, name); + } + else + { + ingameTrade = &gIngameTrades[gSpecialVar_0x8004]; + StringCopy(gStringVar1, ingameTrade->otName); + StringCopy10(gStringVar3, ingameTrade->name); + GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, name); + StringCopy10(gStringVar2, name); + } +} + +static u8 sub_807BBC8(void) +{ + if (gUnknown_020322A0->unk_FA) + { + return sub_807BBEC(); + } + else + { + return sub_807CFC8(); + } +} + +static bool8 sub_807BBEC(void) +{ + u16 evoTarget; + + switch (gUnknown_020322A0->state) + { + case 0: + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x = -180; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[gUnknown_020322A0->tradeSpecies[0]].y_offset; + gUnknown_020322A0->state++; + gUnknown_020322A0->cachedMapMusic = GetCurrentMapMusic(); + PlayNewMapMusic(MUS_SHINKA); + break; + case 1: + if (gUnknown_020322A0->bg2hofs > 0) + { + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x += 3; + gUnknown_020322A0->bg2hofs -= 3; + } + else + { + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x = 0; + gUnknown_020322A0->bg2hofs = 0; + gUnknown_020322A0->state = 10; + } + break; + case 10: + StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); + sub_807F1A8(0, gStringVar4, 0); + + if (gUnknown_020322A0->tradeSpecies[0] != SPECIES_EGG) + { + PlayCry1(gUnknown_020322A0->tradeSpecies[0], 0); + } + + gUnknown_020322A0->state = 11; + gUnknown_020322A0->timer = 0; + break; + case 11: + if (++gUnknown_020322A0->timer == 80) + { + gUnknown_020322A0->unk_D2 = sub_807671C(gUnknown_020322A0->pokePicSpriteIdxs[0], gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); + gUnknown_020322A0->state++; + StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); + sub_807F1A8(0, gStringVar4, 0); + } + break; + case 12: + if (gSprites[gUnknown_020322A0->unk_D2].callback == SpriteCallbackDummy) + { + gUnknown_020322A0->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, 32, 0); + gSprites[gUnknown_020322A0->unk_D3].callback = sub_807E5D8; + DestroySprite(&gSprites[gUnknown_020322A0->unk_D2]); + gUnknown_020322A0->state++; + } + break; + case 13: + // The game waits here for the sprite to finish its animation sequence. + break; + case 14: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_020322A0->state = 20; + break; + case 20: + if (!gPaletteFade.active) + { + sub_807B62C(4); + FillWindowPixelBuffer(0, 0xFF); + CopyWindowToVram(0, 3); + gUnknown_020322A0->state++; + } + break; + case 21: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + gUnknown_020322A0->state++; + break; + case 22: + if (!gPaletteFade.active) + { + gUnknown_020322A0->state = 23; + } + break; + case 23: + if (gUnknown_020322A0->unk_EA > 0x100) + { + gUnknown_020322A0->unk_EA -= 0x34; + } + else + { + sub_807B62C(1); + gUnknown_020322A0->unk_EA = 0x80; + gUnknown_020322A0->state++; + gUnknown_020322A0->timer = 0; + } + gUnknown_020322A0->unk_E8 = 0x8000 / gUnknown_020322A0->unk_EA; + break; + case 24: + if (++gUnknown_020322A0->timer > 20) + { + sub_807AB28(); + gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0); + gUnknown_020322A0->state++; + } + break; + case 25: + if (gSprites[gUnknown_020322A0->unk_91].animEnded) + { + DestroySprite(&gSprites[gUnknown_020322A0->unk_91]); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | + BLDCNT_TGT2_BG1 | + BLDCNT_TGT2_BG2); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 4)); + gUnknown_020322A0->state++; + } + break; + case 26: + if (--gUnknown_020322A0->bg1vofs == 316) + { + gUnknown_020322A0->state++; + } + if (gUnknown_020322A0->bg1vofs == 328) + { + gUnknown_020322A0->unk_92 = CreateSprite(&gSpriteTemplate_8338DFC, 128, 65, 0); + } + break; + case 27: + gUnknown_020322A0->unk_90 = CreateSprite(&gUnknown_08338D88, 128, 80, 3); + gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 128, 80, 0); + StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_91], 1); + gUnknown_020322A0->state++; + break; + case 28: + if ((gUnknown_020322A0->bg1vofs -= 2) == 166) + { + gUnknown_020322A0->state = 200; + } + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + break; + case 200: + gSprites[gUnknown_020322A0->unk_90].pos1.y -= 2; + gSprites[gUnknown_020322A0->unk_91].pos1.y -= 2; + if (gSprites[gUnknown_020322A0->unk_90].pos1.y < -8) + { + gUnknown_020322A0->state = 29; + } + break; + case 29: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + gUnknown_020322A0->state = 30; + break; + case 30: + if (!gPaletteFade.active) + { + DestroySprite(&gSprites[gUnknown_020322A0->unk_90]); + DestroySprite(&gSprites[gUnknown_020322A0->unk_91]); + sub_807B62C(2); + gUnknown_020322A0->state++; + } + break; + case 31: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + gUnknown_020322A0->unk_90 = CreateSprite(&gSpriteTemplate_8338DC8, 111, 170, 0); + gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 129, -10, 0); + gUnknown_020322A0->state++; + break; + case 32: + if (!gPaletteFade.active) + { + PlaySE(SE_TK_WARPOUT); + gUnknown_020322A0->state++; + } + gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3; + gSprites[gUnknown_020322A0->unk_91].pos2.y += 3; + break; + case 33: + gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3; + gSprites[gUnknown_020322A0->unk_91].pos2.y += 3; + if (gSprites[gUnknown_020322A0->unk_90].pos2.y <= -90) + { + gSprites[gUnknown_020322A0->unk_90].data[1] = 1; + gSprites[gUnknown_020322A0->unk_91].data[1] = 1; + gUnknown_020322A0->state++; + } + break; + case 34: + BlendPalettes(0x1, 16, RGB_WHITEALPHA); + gUnknown_020322A0->state++; + break; + case 35: + BlendPalettes(0x1, 0, RGB_WHITEALPHA); + gUnknown_020322A0->state++; + break; + case 36: + BlendPalettes(0x1, 16, RGB_WHITEALPHA); + gUnknown_020322A0->state++; + break; + case 37: + if (!IsMonSpriteNotFlipped(gUnknown_020322A0->tradeSpecies[0])) + { + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].affineAnims = gSpriteAffineAnimTable_8338ECC; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].oam.affineMode = 3; + CalcCenterToCornerVec(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0, 3, 3); + StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0); + } + else + { + StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0); + } + StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]], 0); + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos1.x = 60; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.x = 180; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos1.y = 192; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.y = -32; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].invisible = FALSE; + gUnknown_020322A0->state++; + break; + case 38: + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y -= 3; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.y += 3; + if (gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y < -160 && gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y >= -163) + { + PlaySE(SE_TK_WARPIN); + } + if (gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y < -222) + { + gSprites[gUnknown_020322A0->unk_90].data[1] = 0; + gSprites[gUnknown_020322A0->unk_91].data[1] = 0; + gUnknown_020322A0->state++; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = TRUE; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].invisible = TRUE; + BlendPalettes(0x1, 0, RGB_WHITEALPHA); + } + break; + case 39: + gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3; + gSprites[gUnknown_020322A0->unk_91].pos2.y += 3; + if (gSprites[gUnknown_020322A0->unk_90].pos2.y <= -222) + { + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + gUnknown_020322A0->state++; + DestroySprite(&gSprites[gUnknown_020322A0->unk_90]); + DestroySprite(&gSprites[gUnknown_020322A0->unk_91]); + } + break; + case 40: + if (!gPaletteFade.active) + { + gUnknown_020322A0->state++; + sub_807B62C(1); + gUnknown_020322A0->bg1vofs = 166; + gUnknown_020322A0->unk_90 = CreateSprite(&gUnknown_08338D88, 128, -20, 3); + gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 128, -20, 0); + StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_91], 1); + } + break; + case 41: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + gUnknown_020322A0->state++; + break; + case 42: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + if (!gPaletteFade.active) + { + gUnknown_020322A0->state++; + } + break; + case 43: + gSprites[gUnknown_020322A0->unk_90].pos2.y += 3; + gSprites[gUnknown_020322A0->unk_91].pos2.y += 3; + if (gSprites[gUnknown_020322A0->unk_90].pos2.y + gSprites[gUnknown_020322A0->unk_90].pos1.y == 64) + { + gUnknown_020322A0->state++; + } + break; + case 44: + if ((gUnknown_020322A0->bg1vofs += 2) > 316) + { + gUnknown_020322A0->bg1vofs = 316; + gUnknown_020322A0->state++; + } + break; + case 45: + DestroySprite(&gSprites[gUnknown_020322A0->unk_90]); + DestroySprite(&gSprites[gUnknown_020322A0->unk_91]); + gUnknown_020322A0->state++; + gUnknown_020322A0->timer = 0; + break; + case 46: + if (++gUnknown_020322A0->timer == 10) + { + gUnknown_020322A0->state++; + } + break; + case 47: + if (++gUnknown_020322A0->bg1vofs > 348) + { + gUnknown_020322A0->bg1vofs = 348; + gUnknown_020322A0->state++; + } + if (gUnknown_020322A0->bg1vofs == 328 && gUnknown_020322A0->unk_FA) + { + gUnknown_020322A0->unk_92 = CreateSprite(&gSpriteTemplate_8338DFC, 128, 65, 0); + gSprites[gUnknown_020322A0->unk_92].callback = sub_807AAE0; + } + break; + case 48: + gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0); + gUnknown_020322A0->state = 50; + break; + case 50: + if (gSprites[gUnknown_020322A0->unk_91].animEnded) + { + DestroySprite(&gSprites[gUnknown_020322A0->unk_91]); + sub_807B62C(6); + gUnknown_020322A0->state++; + PlaySE(SE_W028); + } + break; + case 51: + if (gUnknown_020322A0->unk_EA < 0x400) + { + gUnknown_020322A0->unk_EA += 0x34; + } + else + { + gUnknown_020322A0->unk_EA = 0x400; + gUnknown_020322A0->state++; + } + gUnknown_020322A0->unk_E8 = 0x8000 / gUnknown_020322A0->unk_EA; + break; + case 52: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_020322A0->state = 60; + break; + + case 60: + if (!gPaletteFade.active) + { + sub_807B62C(5); + sub_807B62C(7); + gPaletteFade.bufferTransferDisabled = TRUE; + gUnknown_020322A0->state++; + } + break; + case 61: + gPaletteFade.bufferTransferDisabled = FALSE; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + gUnknown_020322A0->state++; + break; + case 62: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + if (!gPaletteFade.active) + { + gUnknown_020322A0->state++; + } + break; + case 63: + gUnknown_020322A0->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, -8, 0); + gSprites[gUnknown_020322A0->unk_D3].data[3] = 74; + gSprites[gUnknown_020322A0->unk_D3].callback = sub_807E6AC; + StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_D3], 1); + StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->unk_D3], 2); + BlendPalettes(1 << (16 + gSprites[gUnknown_020322A0->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA); + gUnknown_020322A0->state++; + gUnknown_020322A0->timer = 0; + break; + case 64: + BeginNormalPaletteFade(1 << (16 + gSprites[gUnknown_020322A0->unk_D3].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); + gUnknown_020322A0->state++; + break; + case 65: + if (gSprites[gUnknown_020322A0->unk_D3].callback == SpriteCallbackDummy) + { + HandleLoadSpecialPokePic_2(&gMonFrontPicTable[gUnknown_020322A0->tradeSpecies[1]], gMonSpritesGfxPtr->sprites[3], gUnknown_020322A0->tradeSpecies[1], gUnknown_020322A0->unk_68[1]); + gUnknown_020322A0->state++; + } + break; + case 66: + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.x = 120; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[gUnknown_020322A0->tradeSpecies[1]].y_offset + 60; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.x = 0; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.y = 0; + StartSpriteAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]], 0); + CreatePokeballSpriteToReleaseMon(gUnknown_020322A0->pokePicSpriteIdxs[1], gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, gUnknown_020322A0->tradeSpecies[1]); + FreeSpriteOamMatrix(&gSprites[gUnknown_020322A0->unk_D3]); + DestroySprite(&gSprites[gUnknown_020322A0->unk_D3]); + gUnknown_020322A0->state++; + break; + case 67: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG0_ON | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + StringExpandPlaceholders(gStringVar4, gText_XSentOverY); + sub_807F1A8(0, gStringVar4, 0); + gUnknown_020322A0->state = 167; + gUnknown_020322A0->timer = 0; + break; + // 167 and 267 are extra cases added in for animations + case 167: + if (++gUnknown_020322A0->timer > 60) + { + gUnknown_020322A0->state = 267; + gUnknown_020322A0->timer = 0; + } + break; + case 267: + if (IsCryFinished()) + { + gUnknown_020322A0->state = 68; + } + break; + case 68: + if (++gUnknown_020322A0->timer == 10) + { + PlayFanfare(MUS_FANFA5); + } + if (gUnknown_020322A0->timer == 250) + { + gUnknown_020322A0->state++; + StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX); + sub_807F1A8(0, gStringVar4, 0); + gUnknown_020322A0->timer = 0; + } + break; + case 69: + if (++gUnknown_020322A0->timer == 60) + { + gUnknown_020322A0->state++; + } + break; + case 70: + sub_807F14C(); + gUnknown_020322A0->state++; + break; + case 71: + if (gUnknown_020322A0->isLinkTrade) + { + return TRUE; + } + else if (gMain.newKeys & A_BUTTON) + { + gUnknown_020322A0->state++; + } + break; + case 72: // Only if in-game trade + sub_807B4D0(gSpecialVar_0x8005, 0); + gCB2_AfterEvolution = sub_807B60C; + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_02032298[0]], TRUE, ITEM_NONE); + if (evoTarget != SPECIES_NONE) + { + TradeEvolutionScene(&gPlayerParty[gUnknown_02032298[0]], evoTarget, gUnknown_020322A0->pokePicSpriteIdxs[1], gUnknown_02032298[0]); + } + gUnknown_020322A0->state++; + break; + case 73: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_020322A0->state++; + break; + case 74: + if (!gPaletteFade.active) + { + PlayNewMapMusic(gUnknown_020322A0->cachedMapMusic); + if (gUnknown_020322A0) + { + FreeAllWindowBuffers(); + Free(GetBgTilemapBuffer(3)); + Free(GetBgTilemapBuffer(1)); + Free(GetBgTilemapBuffer(0)); + FreeMonSpritesGfx(); + FREE_AND_SET_NULL(gUnknown_020322A0); + } + SetMainCallback2(CB2_ReturnToField); + sub_807E784(); + } + break; + } + return FALSE; +} + +static bool8 sub_807CFC8(void) +{ + u16 evoTarget; + + switch (gUnknown_020322A0->state) + { + case 0: + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x = -180; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[gUnknown_020322A0->tradeSpecies[0]].y_offset; + gUnknown_020322A0->state++; + gUnknown_020322A0->cachedMapMusic = GetCurrentMapMusic(); + PlayNewMapMusic(MUS_SHINKA); + break; + case 1: + if (gUnknown_020322A0->bg2hofs > 0) + { + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x += 3; + gUnknown_020322A0->bg2hofs -= 3; + } + else + { + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x = 0; + gUnknown_020322A0->bg2hofs = 0; + gUnknown_020322A0->state = 10; + } + break; + case 10: + StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); + sub_807F1A8(0, gStringVar4, 0); + + if (gUnknown_020322A0->tradeSpecies[0] != SPECIES_EGG) + { + PlayCry1(gUnknown_020322A0->tradeSpecies[0], 0); + } + + gUnknown_020322A0->state = 11; + gUnknown_020322A0->timer = 0; + break; + case 11: + if (++gUnknown_020322A0->timer == 80) + { + gUnknown_020322A0->unk_D2 = sub_807671C(gUnknown_020322A0->pokePicSpriteIdxs[0], gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); + gUnknown_020322A0->state++; + StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); + sub_807F1A8(0, gStringVar4, 0); + } + break; + case 12: + if (gSprites[gUnknown_020322A0->unk_D2].callback == SpriteCallbackDummy) + { + gUnknown_020322A0->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, 32, 0); + gSprites[gUnknown_020322A0->unk_D3].callback = sub_807E5D8; + DestroySprite(&gSprites[gUnknown_020322A0->unk_D2]); + gUnknown_020322A0->state++; + } + break; + case 13: + // The game waits here for the sprite to finish its animation sequence. + break; + case 14: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_020322A0->state = 20; + break; + case 20: + if (!gPaletteFade.active) + { + sub_807B62C(4); + FillWindowPixelBuffer(0, 0xFF); + CopyWindowToVram(0, 3); + gUnknown_020322A0->state++; + } + break; + case 21: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + gUnknown_020322A0->state++; + break; + case 22: + if (!gPaletteFade.active) + { + gUnknown_020322A0->state = 23; + } + break; + case 23: + if (gUnknown_020322A0->unk_EA > 0x100) + { + gUnknown_020322A0->unk_EA -= 0x34; + } + else + { + sub_807B62C(1); + gUnknown_020322A0->unk_EA = 0x80; + gUnknown_020322A0->state = 124; + gUnknown_020322A0->timer = 0; + } + gUnknown_020322A0->unk_E8 = 0x8000 / gUnknown_020322A0->unk_EA; + break; + case 124: + if (++gUnknown_020322A0->timer > 20) + { + sub_807B62C(3); + gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338E8C, 120, 80, 0); + gUnknown_020322A0->state++; + } + break; + case 125: + if (gSprites[gUnknown_020322A0->unk_91].animEnded) + { + DestroySprite(&gSprites[gUnknown_020322A0->unk_91]); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | + BLDCNT_TGT1_OBJ | + BLDCNT_EFFECT_BLEND | + BLDCNT_TGT2_BG2); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 4)); + CreateTask(c3_08054588, 5); + gUnknown_020322A0->state++; + } + break; + case 126: + if (!FuncIsActiveTask(c3_08054588)) + { + gUnknown_020322A0->state = 26; + } + break; + case 26: + if (--gUnknown_020322A0->bg1vofs == 316) + { + gUnknown_020322A0->state++; + } + break; + case 27: + gUnknown_020322A0->unk_90 = CreateSprite(&gUnknown_08338D88, 120, 80, 3); + gSprites[gUnknown_020322A0->unk_90].callback = sub_807AA4C; + gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 120, 80, 0); + StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_91], 1); + gUnknown_020322A0->state++; + break; + case 28: + if ((gUnknown_020322A0->bg1vofs -= 3) == 166) + { + gUnknown_020322A0->state = 200; + } + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + break; + case 200: + gSprites[gUnknown_020322A0->unk_90].pos1.y -= 2; + gSprites[gUnknown_020322A0->unk_91].pos1.y -= 2; + if (gSprites[gUnknown_020322A0->unk_90].pos1.y < -8) + { + gUnknown_020322A0->state = 29; + } + break; + case 29: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + gUnknown_020322A0->state = 30; + break; + case 30: + if (!gPaletteFade.active) + { + DestroySprite(&gSprites[gUnknown_020322A0->unk_90]); + DestroySprite(&gSprites[gUnknown_020322A0->unk_91]); + sub_807B62C(2); + gUnknown_020322A0->state++; + } + break; + case 31: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + gUnknown_020322A0->unk_90 = CreateSprite(&gSpriteTemplate_8338DC8, 111, 170, 0); + gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 129, -10, 0); + gUnknown_020322A0->state++; + break; + case 32: + if (!gPaletteFade.active) + { + PlaySE(SE_TK_WARPOUT); + gUnknown_020322A0->state++; + } + gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3; + gSprites[gUnknown_020322A0->unk_91].pos2.y += 3; + break; + case 33: + gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3; + gSprites[gUnknown_020322A0->unk_91].pos2.y += 3; + if (gSprites[gUnknown_020322A0->unk_90].pos2.y <= -90) + { + gSprites[gUnknown_020322A0->unk_90].data[1] = 1; + gSprites[gUnknown_020322A0->unk_91].data[1] = 1; + gUnknown_020322A0->state++; + CreateTask(c3_0805465C, 5); + } + break; + case 34: + BlendPalettes(0x8, 16, RGB_WHITEALPHA); + gUnknown_020322A0->state++; + break; + case 35: + BlendPalettes(0x8, 16, RGB_WHITEALPHA); + gUnknown_020322A0->state++; + break; + case 36: + BlendPalettes(0x8, 16, RGB_WHITEALPHA); + gUnknown_020322A0->state++; + break; + case 37: + if (!IsMonSpriteNotFlipped(gUnknown_020322A0->tradeSpecies[0])) + { + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].affineAnims = gSpriteAffineAnimTable_8338ECC; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].oam.affineMode = 3; + CalcCenterToCornerVec(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0, 3, 3); + StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0); + } + else + { + StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0); + } + StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]], 0); + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos1.x = 40; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.x = 200; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos1.y = 192; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.y = -32; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].invisible = FALSE; + gUnknown_020322A0->state++; + break; + case 38: + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y -= 3; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.y += 3; + if (gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y < -160 && gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y >= -163) + { + PlaySE(SE_TK_WARPIN); + } + if (gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y < -222) + { + gSprites[gUnknown_020322A0->unk_90].data[1] = 0; + gSprites[gUnknown_020322A0->unk_91].data[1] = 0; + gUnknown_020322A0->state++; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = TRUE; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].invisible = TRUE; + CreateTask(sub_807F39C, 5); + } + break; + case 39: + gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3; + gSprites[gUnknown_020322A0->unk_91].pos2.y += 3; + if (gSprites[gUnknown_020322A0->unk_90].pos2.y <= -222) + { + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + gUnknown_020322A0->state++; + DestroySprite(&gSprites[gUnknown_020322A0->unk_90]); + DestroySprite(&gSprites[gUnknown_020322A0->unk_91]); + } + break; + case 40: + if (!gPaletteFade.active) + { + gUnknown_020322A0->state++; + sub_807B62C(1); + gUnknown_020322A0->bg1vofs = 166; + sub_807B62C(3); + gUnknown_020322A0->bg2vofs = 412; + gUnknown_020322A0->unk_90 = CreateSprite(&gUnknown_08338D88, 120, -20, 3); + gSprites[gUnknown_020322A0->unk_90].callback = sub_807AA4C; + gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 120, -20, 0); + StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_91], 1); + } + break; + case 41: + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + gUnknown_020322A0->state++; + break; + case 42: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_OBJ_ON); + if (!gPaletteFade.active) + { + gUnknown_020322A0->state++; + } + break; + case 43: + gSprites[gUnknown_020322A0->unk_90].pos2.y += 4; + gSprites[gUnknown_020322A0->unk_91].pos2.y += 4; + if (gSprites[gUnknown_020322A0->unk_90].pos2.y + gSprites[gUnknown_020322A0->unk_90].pos1.y == 64) + { + gUnknown_020322A0->state = 144; + gUnknown_020322A0->timer = 0; + } + break; + case 144: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG1_ON | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + gUnknown_020322A0->bg1vofs += 3; + gUnknown_020322A0->bg2vofs += 3; + if (++gUnknown_020322A0->timer == 10) + { + u8 taskId = CreateTask(c3_08054588, 5); + gTasks[taskId].data[2] = 1; + } + if (gUnknown_020322A0->bg1vofs > 316) + { + gUnknown_020322A0->bg1vofs = 316; + gUnknown_020322A0->state++; + } + break; + case 145: + DestroySprite(&gSprites[gUnknown_020322A0->unk_90]); + DestroySprite(&gSprites[gUnknown_020322A0->unk_91]); + gUnknown_020322A0->state++; + gUnknown_020322A0->timer = 0; + break; + case 146: + if (!FuncIsActiveTask(c3_08054588)) + { + gUnknown_020322A0->state = 46; + gUnknown_020322A0->timer = 0; + } + break; + case 46: + if (++gUnknown_020322A0->timer == 10) + { + gUnknown_020322A0->state++; + } + break; + case 47: + if (++gUnknown_020322A0->bg1vofs > 348) + { + gUnknown_020322A0->bg1vofs = 348; + gUnknown_020322A0->state++; + } + break; + case 48: + gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0); + gUnknown_020322A0->state = 50; + break; + case 50: + if (gSprites[gUnknown_020322A0->unk_91].animEnded) + { + DestroySprite(&gSprites[gUnknown_020322A0->unk_91]); + sub_807B62C(6); + gUnknown_020322A0->state++; + PlaySE(SE_W028); + } + break; + case 51: + if (gUnknown_020322A0->unk_EA < 0x400) + { + gUnknown_020322A0->unk_EA += 0x34; + } + else + { + gUnknown_020322A0->unk_EA = 0x400; + gUnknown_020322A0->state++; + } + gUnknown_020322A0->unk_E8 = 0x8000 / gUnknown_020322A0->unk_EA; + break; + case 52: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_020322A0->state = 60; + break; + case 60: + if (!gPaletteFade.active) + { + sub_807B62C(5); + sub_807B62C(7); + gPaletteFade.bufferTransferDisabled = TRUE; + gUnknown_020322A0->state++; + } + break; + case 61: + gPaletteFade.bufferTransferDisabled = FALSE; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + gUnknown_020322A0->state++; + break; + case 62: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + if (!gPaletteFade.active) + { + gUnknown_020322A0->state++; + } + break; + case 63: + gUnknown_020322A0->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, -8, 0); + gSprites[gUnknown_020322A0->unk_D3].data[3] = 74; + gSprites[gUnknown_020322A0->unk_D3].callback = sub_807E6AC; + StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_D3], 1); + StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->unk_D3], 2); + BlendPalettes(1 << (16 + gSprites[gUnknown_020322A0->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA); + gUnknown_020322A0->state++; + gUnknown_020322A0->timer = 0; + break; + case 64: + BeginNormalPaletteFade(1 << (16 + gSprites[gUnknown_020322A0->unk_D3].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); + gUnknown_020322A0->state++; + break; + case 65: + if (gSprites[gUnknown_020322A0->unk_D3].callback == SpriteCallbackDummy) + { + HandleLoadSpecialPokePic_2(&gMonFrontPicTable[gUnknown_020322A0->tradeSpecies[1]], gMonSpritesGfxPtr->sprites[3], gUnknown_020322A0->tradeSpecies[1], gUnknown_020322A0->unk_68[1]); + gUnknown_020322A0->state++; + } + break; + case 66: + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.x = 120; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[gUnknown_020322A0->tradeSpecies[1]].y_offset + 60; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.x = 0; + gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.y = 0; + StartSpriteAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]], 0); + CreatePokeballSpriteToReleaseMon(gUnknown_020322A0->pokePicSpriteIdxs[1], gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, gUnknown_020322A0->tradeSpecies[1]); + FreeSpriteOamMatrix(&gSprites[gUnknown_020322A0->unk_D3]); + DestroySprite(&gSprites[gUnknown_020322A0->unk_D3]); + gUnknown_020322A0->state++; + break; + case 67: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | + DISPCNT_OBJ_1D_MAP | + DISPCNT_BG0_ON | + DISPCNT_BG2_ON | + DISPCNT_OBJ_ON); + StringExpandPlaceholders(gStringVar4, gText_XSentOverY); + sub_807F1A8(0, gStringVar4, 0); + gUnknown_020322A0->state = 167; + gUnknown_020322A0->timer = 0; + break; + // 167 and 267 are extra cases added in for animations + case 167: + if (++gUnknown_020322A0->timer > 60) + { + gUnknown_020322A0->state = 267; + gUnknown_020322A0->timer = 0; + } + break; + case 267: + if (IsCryFinished()) + { + gUnknown_020322A0->state = 68; + } + break; + case 68: + if (++gUnknown_020322A0->timer == 10) + { + PlayFanfare(MUS_FANFA5); + } + if (gUnknown_020322A0->timer == 250) + { + gUnknown_020322A0->state++; + StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX); + sub_807F1A8(0, gStringVar4, 0); + gUnknown_020322A0->timer = 0; + } + break; + case 69: + if (++gUnknown_020322A0->timer == 60) + { + gUnknown_020322A0->state++; + } + break; + case 70: + sub_807F14C(); + gUnknown_020322A0->state++; + break; + case 71: + if (gUnknown_020322A0->isLinkTrade) + { + return TRUE; + } + else if (gMain.newKeys & A_BUTTON) + { + gUnknown_020322A0->state++; + } + break; + case 72: // Only if in-game trade + sub_807B4D0(gSpecialVar_0x8005, 0); + gCB2_AfterEvolution = sub_807B60C; + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_02032298[0]], TRUE, ITEM_NONE); + if (evoTarget != SPECIES_NONE) + { + TradeEvolutionScene(&gPlayerParty[gUnknown_02032298[0]], evoTarget, gUnknown_020322A0->pokePicSpriteIdxs[1], gUnknown_02032298[0]); + } + gUnknown_020322A0->state++; + break; + case 73: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_020322A0->state++; + break; + case 74: + if (!gPaletteFade.active) + { + PlayNewMapMusic(gUnknown_020322A0->cachedMapMusic); + if (gUnknown_020322A0) + { + FreeAllWindowBuffers(); + Free(GetBgTilemapBuffer(3)); + Free(GetBgTilemapBuffer(1)); + Free(GetBgTilemapBuffer(0)); + FreeMonSpritesGfx(); + FREE_AND_SET_NULL(gUnknown_020322A0); + } + SetMainCallback2(CB2_ReturnToField); + sub_807E784(); + } + break; + } + return FALSE; +} + +static void c2_08053788(void) +{ + u16 evoTarget; + switch (gMain.state) + { + case 0: + gMain.state = 4; + gSoftResetDisabled = TRUE; + break; + case 4: + gCB2_AfterEvolution = sub_807EB50; + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_02032298[0]], TRUE, ITEM_NONE); + if (evoTarget != SPECIES_NONE) + TradeEvolutionScene(&gPlayerParty[gUnknown_02032298[0]], evoTarget, gUnknown_020322A0->pokePicSpriteIdxs[1], gUnknown_02032298[0]); + else if (sub_8077260()) + SetMainCallback2(sub_807F464); + else + SetMainCallback2(sub_807EB50); + gUnknown_02032298[0] = 255; + break; + } + if (!HasLinkErrorOccurred()) + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_807E4DC(void) +{ + u8 blockReceivedStatus; + sub_807ACDC(); + blockReceivedStatus = GetBlockReceivedStatus(); + if (blockReceivedStatus & 0x01) + { + if (gBlockRecvBuffer[0][0] == 0xDCBA) + { + SetMainCallback2(c2_08053788); + } + if (gBlockRecvBuffer[0][0] == 0xABCD) + { + gUnknown_020322A0->unk_72 = 1; + } + ResetBlockReceivedFlag(0); + } + if (blockReceivedStatus & 0x02) + { + if (gBlockRecvBuffer[1][0] == 0xABCD) + { + gUnknown_020322A0->unk_73 = 1; + } + ResetBlockReceivedFlag(1); + } +} + +static void sub_807E55C(struct Sprite *sprite) +{ + sprite->pos1.y += sprite->data[0] / 10; + sprite->data[5] += sprite->data[1]; + sprite->pos1.x = sprite->data[5] / 10; + if (sprite->pos1.y > 0x4c) + { + sprite->pos1.y = 0x4c; + sprite->data[0] = -(sprite->data[0] * sprite->data[2]) / 100; + sprite->data[3] ++; + } + if (sprite->pos1.x == 0x78) + sprite->data[1] = 0; + sprite->data[0] += sprite->data[4]; + if (sprite->data[3] == 4) + { + sprite->data[7] = 1; + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_807E5D8(struct Sprite *sprite) +{ + sprite->pos2.y += gTradeBallVerticalVelocityTable[sprite->data[0]]; + if (sprite->data[0] == 22) + PlaySE(SE_KON); + if (++ sprite->data[0] == 44) + { + PlaySE(SE_W025); + sprite->callback = sub_807E64C; + sprite->data[0] = 0; + BeginNormalPaletteFade(1 << (16 + sprite->oam.paletteNum), -1, 0, 16, RGB_WHITEALPHA); + } +} + +static void sub_807E64C(struct Sprite *sprite) +{ + if (sprite->data[1] == 20) + StartSpriteAffineAnim(sprite, 1); + if (++ sprite->data[1] > 20) + { + sprite->pos2.y -= gTradeBallVerticalVelocityTable[sprite->data[0]]; + if (++ sprite->data[0] == 23) + { + DestroySprite(sprite); + gUnknown_020322A0->state = 14; // Resume the master trade animation + } + } +} + +static void sub_807E6AC(struct Sprite *sprite) +{ + if (sprite->data[2] == 0) + { + if ((sprite->pos1.y += 4) > sprite->data[3]) + { + sprite->data[2] ++; + sprite->data[0] = 0x16; + PlaySE(SE_KON); + } + } + else + { + if (sprite->data[0] == 0x42) + PlaySE(SE_KON2); + if (sprite->data[0] == 0x5c) + PlaySE(SE_KON3); + if (sprite->data[0] == 0x6b) + PlaySE(SE_KON4); + sprite->pos2.y += gTradeBallVerticalVelocityTable[sprite->data[0]]; + if (++sprite->data[0] == 0x6c) + sprite->callback = SpriteCallbackDummy; + } +} + +u16 GetInGameTradeSpeciesInfo(void) +{ + const struct InGameTrade *inGameTrade = &gIngameTrades[gSpecialVar_0x8004]; + StringCopy(gStringVar1, gSpeciesNames[inGameTrade->playerSpecies]); + StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); + return inGameTrade->playerSpecies; +} + +static void sub_807E784(void) +{ + u8 nickname[32]; + const struct InGameTrade *inGameTrade = &gIngameTrades[gSpecialVar_0x8004]; + GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); + StringCopy10(gStringVar1, nickname); + StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); +} + +static void _CreateInGameTradePokemon(u8 whichPlayerMon, u8 whichInGameTrade) +{ + const struct InGameTrade *inGameTrade = &gIngameTrades[whichInGameTrade]; + u8 level = GetMonData(&gPlayerParty[whichPlayerMon], MON_DATA_LEVEL); + + struct MailStruct mail; + u8 metLocation = 0xFE; + u8 isMail; + struct Pokemon *pokemon = &gEnemyParty[0]; + + CreateMon(pokemon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId); + + SetMonData(pokemon, MON_DATA_HP_IV, &inGameTrade->ivs[0]); + SetMonData(pokemon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]); + SetMonData(pokemon, MON_DATA_DEF_IV, &inGameTrade->ivs[2]); + SetMonData(pokemon, MON_DATA_SPEED_IV, &inGameTrade->ivs[3]); + SetMonData(pokemon, MON_DATA_SPATK_IV, &inGameTrade->ivs[4]); + SetMonData(pokemon, MON_DATA_SPDEF_IV, &inGameTrade->ivs[5]); + SetMonData(pokemon, MON_DATA_NICKNAME, inGameTrade->name); + SetMonData(pokemon, MON_DATA_OT_NAME, inGameTrade->otName); + SetMonData(pokemon, MON_DATA_OT_GENDER, &inGameTrade->otGender); + SetMonData(pokemon, MON_DATA_ALT_ABILITY, &inGameTrade->secondAbility); + SetMonData(pokemon, MON_DATA_BEAUTY, &inGameTrade->stats[1]); + SetMonData(pokemon, MON_DATA_CUTE, &inGameTrade->stats[2]); + SetMonData(pokemon, MON_DATA_COOL, &inGameTrade->stats[0]); + SetMonData(pokemon, MON_DATA_SMART, &inGameTrade->stats[3]); + SetMonData(pokemon, MON_DATA_TOUGH, &inGameTrade->stats[4]); + SetMonData(pokemon, MON_DATA_SHEEN, &inGameTrade->sheen); + SetMonData(pokemon, MON_DATA_MET_LOCATION, &metLocation); + + isMail = FALSE; + if (inGameTrade->heldItem != ITEM_NONE) + { + if (ItemIsMail(inGameTrade->heldItem)) + { + sub_807E974(&mail, inGameTrade); + gUnknown_020321C0[0] = mail; + SetMonData(pokemon, MON_DATA_MAIL, &isMail); + SetMonData(pokemon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem); + } + else + { + SetMonData(pokemon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem); + } + } + CalculateMonStats(&gEnemyParty[0]); +} + +static void sub_807E974(struct MailStruct *mail, const struct InGameTrade *trade) { + s32 i; + + for (i = 0; i < 9; i++) + { + mail->words[i] = gIngameTradeMail[trade->mailNum][i]; + } + + StringCopy(mail->playerName, trade->otName); + PadNameString(mail->playerName, CHAR_SPACE); + + mail->trainerId[0] = trade->otId >> 24; + mail->trainerId[1] = trade->otId >> 16; + mail->trainerId[2] = trade->otId >> 8; + mail->trainerId[3] = trade->otId; + mail->species = trade->species; + mail->itemId = trade->heldItem; +} + +u16 GetTradeSpecies(void) +{ + if (GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_IS_EGG)) + return SPECIES_NONE; + return GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_SPECIES); +} + +void CreateInGameTradePokemon(void) +{ + _CreateInGameTradePokemon(gSpecialVar_0x8005, gSpecialVar_0x8004); +} + +static void sub_807EA2C(void) +{ + if (sub_807BBC8() == TRUE) + { + DestroySprite(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]]); + FreeSpriteOamMatrix(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]]); + sub_807B4D0(gUnknown_02032298[0], gUnknown_02032298[1] % 6); + if (!sub_8077260()) + { + gUnknown_020322A0->linkData[0] = 0xABCD; + gUnknown_020322A0->unk_93 = 1; + } + SetMainCallback2(sub_807EACC); + } + sub_807B5B8(); + sub_807E4DC(); + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_807EACC(void) +{ + u8 mpId = sub_807ACDC(); + if (sub_8077260()) + { + SetMainCallback2(c2_08053788); + } + else + { + sub_807E4DC(); + if (mpId == 0 && gUnknown_020322A0->unk_72 == 1 && gUnknown_020322A0->unk_73 == 1) + { + gUnknown_020322A0->linkData[0] = 0xDCBA; + Trade_SendData(gUnknown_020322A0); + gUnknown_020322A0->unk_72 = 2; + gUnknown_020322A0->unk_73 = 2; + } + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_807EB50(void) +{ + switch (gMain.state) + { + case 0: + gMain.state++; + StringExpandPlaceholders(gStringVar4, gText_CommunicationStandby5); + sub_807F1A8(0, gStringVar4, 0); + break; + case 1: + sub_8077288(0); + gMain.state = 100; + gUnknown_020322A0->timer = 0; + break; + case 100: + if (++gUnknown_020322A0->timer > 180) + { + gMain.state = 101; + gUnknown_020322A0->timer = 0; + } + if (_IsLinkTaskFinished()) + { + gMain.state = 2; + } + break; + case 101: + if (_IsLinkTaskFinished()) + { + gMain.state = 2; + } + break; + case 2: + gMain.state = 50; + StringExpandPlaceholders(gStringVar4, gText_SavingDontTurnOffPower); + sub_807F1A8(0, gStringVar4, 0); + break; + case 50: + if (!InUnionRoom()) + IncrementGameStat(GAME_STAT_POKEMON_TRADES); + if (gWirelessCommType) + { + sub_801B990(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); + } + SetContinueGameWarpStatusToDynamicWarp(); + sub_8153380(); + gMain.state++; + gUnknown_020322A0->timer = 0; + break; + case 51: + if (++gUnknown_020322A0->timer == 5) + { + gMain.state++; + } + break; + case 52: + if (sub_81533AC()) + { + ClearContinueGameWarpStatus2(); + gMain.state = 4; + } + else + { + gUnknown_020322A0->timer = 0; + gMain.state = 51; + } + break; + case 4: + sub_81533E0(); + gMain.state = 40; + gUnknown_020322A0->timer = 0; + break; + case 40: + if (++gUnknown_020322A0->timer > 50) + { + if (GetMultiplayerId() == 0) + { + gUnknown_020322A0->timer = Random() % 30; + } + else + { + gUnknown_020322A0->timer = 0; + } + gMain.state = 41; + } + break; + case 41: + if (gUnknown_020322A0->timer == 0) + { + sub_8077288(1); + gMain.state = 42; + } + else + { + gUnknown_020322A0->timer--; + } + break; + case 42: + if (_IsLinkTaskFinished()) + { + sub_8153408(); + gMain.state = 5; + } + break; + case 5: + if (++gUnknown_020322A0->timer > 60) + { + gMain.state++; + sub_8077288(2); + } + break; + case 6: + if (_IsLinkTaskFinished()) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gMain.state ++; + } + break; + case 7: + if (!gPaletteFade.active) + { + FadeOutBGM(3); + gMain.state++; + } + break; + case 8: + if (IsBGMStopped() == TRUE) + { + if (gWirelessCommType && gMain.savedCallback == sub_80773AC) + { + sub_8077288(3); + } + else + { + sub_800AC34(); + } + gMain.state++; + } + break; + case 9: + if (gWirelessCommType && gMain.savedCallback == sub_80773AC) + { + if (_IsLinkTaskFinished()) + { + gSoftResetDisabled = FALSE; + SetMainCallback2(c2_080543C4); + } + } + else if (!gReceivedRemoteLinkPlayers) + { + gSoftResetDisabled = FALSE; + SetMainCallback2(c2_080543C4); + } + break; + } + if (!HasLinkErrorOccurred()) + { + RunTasks(); + } + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void c2_080543C4(void) +{ + if (!gPaletteFade.active) + { + FreeAllWindowBuffers(); + Free(GetBgTilemapBuffer(3)); + Free(GetBgTilemapBuffer(1)); + Free(GetBgTilemapBuffer(0)); + FreeMonSpritesGfx(); + FREE_AND_SET_NULL(gUnknown_020322A0); + if (gWirelessCommType) + sub_800E084(); + SetMainCallback2(gMain.savedCallback); + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void DoInGameTradeScene(void) +{ + ScriptContext2_Enable(); + CreateTask(sub_807F110, 10); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); +} + +static void sub_807F110(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(sub_807B270); + gFieldCallback = sub_80AF168; + DestroyTask(taskId); + } +} + +static void sub_807F14C(void) +{ + u8 i; + u8 numRibbons = 0; + for (i = 0; i < 12; i ++) + { + numRibbons += GetMonData(&gEnemyParty[gUnknown_02032298[1] % 6], MON_DATA_CHAMPION_RIBBON + i); + } + if (numRibbons != 0) + FlagSet(FLAG_SYS_RIBBON_GET); +} + +void sub_807F19C(void) +{ + sub_807B170(); +} + +void sub_807F1A8(u8 windowId, const u8 *str, u8 speed) +{ + FillWindowPixelBuffer(windowId, 0xFF); + gUnknown_020322A0->unk_F6[0] = 15; + gUnknown_020322A0->unk_F6[1] = 1; + gUnknown_020322A0->unk_F6[2] = 6; + AddTextPrinterParameterized4(windowId, 1, 0, 2, 0, 0, gUnknown_020322A0->unk_F6, speed, str); + CopyWindowToVram(windowId, 3); +} + +static void c3_08054588(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + u16 unk = gUnknown_08339090[data[0]][0] * 16; + + if (!data[2]) + { + if (unk == 0x100) + LoadPalette(gUnknown_08337EA0, 0x30, 32); + else + LoadPalette(&gUnknown_08337AA0[unk], 0x30, 32); + } + else + { + if (unk == 0x100) + LoadPalette(gUnknown_08337EA0, 0x30, 32); + else + LoadPalette(&gUnknown_08337CA0[unk], 0x30, 32); + } + + if (gUnknown_08339090[data[0]][0] == 0 && data[1] == 0) + PlaySE(SE_W215); + + if (data[1] == gUnknown_08339090[data[0]][1]) + { + data[0]++; + data[1] = 0; + if (gUnknown_08339090[data[0]][1] == 0xFF) + { + DestroyTask(taskId); + } + } + else + { + data[1]++; + } +} + +static void c3_0805465C(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (data[0] == 0) + { + gUnknown_020322A0->unk_FB = gUnknown_020322A0->unk_FD = 120; + gUnknown_020322A0->unk_FC = 0; + gUnknown_020322A0->unk_FE = 160; + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | + WININ_WIN0_BG1 | + WININ_WIN0_OBJ); + } + + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(gUnknown_020322A0->unk_FB, gUnknown_020322A0->unk_FD)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(gUnknown_020322A0->unk_FC, gUnknown_020322A0->unk_FE)); + + data[0]++; + gUnknown_020322A0->unk_FB -= 5; + gUnknown_020322A0->unk_FD += 5; + + if (gUnknown_020322A0->unk_FB < 80) + { + DestroyTask(taskId); + } +} + +static void sub_807F39C(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (data[0] == 0) + { + gUnknown_020322A0->unk_FB = 80; + gUnknown_020322A0->unk_FD = 160; + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | + WININ_WIN0_BG1 | + WININ_WIN0_OBJ); + } + + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(gUnknown_020322A0->unk_FB, gUnknown_020322A0->unk_FD)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(gUnknown_020322A0->unk_FC, gUnknown_020322A0->unk_FE)); + + if (gUnknown_020322A0->unk_FB != 120) + { + data[0]++; + gUnknown_020322A0->unk_FB += 5; + gUnknown_020322A0->unk_FD -= 5; + + if (gUnknown_020322A0->unk_FB >= 116) + BlendPalettes(0x8, 0, RGB_WHITEALPHA); + } + else + { + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + DestroyTask(taskId); + } +} + +static void sub_807F464(void) +{ + switch (gMain.state) + { + case 0: + gMain.state = 1; + StringExpandPlaceholders(gStringVar4, gText_CommunicationStandby5); + sub_807F1A8(0, gStringVar4, 0); + break; + case 1: + sub_8077288(0); + gMain.state = 2; + gUnknown_020322A0->timer = 0; + break; + case 2: + if (_IsLinkTaskFinished()) + { + gMain.state = 3; + StringExpandPlaceholders(gStringVar4, gText_SavingDontTurnOffPower); + sub_807F1A8(0, gStringVar4, 0); + IncrementGameStat(GAME_STAT_POKEMON_TRADES); + sub_8153380(); + gUnknown_020322A0->timer = 0; + } + break; + case 3: + if (++gUnknown_020322A0->timer == 5) + { + gMain.state = 4; + } + break; + case 4: + if (sub_81533AC()) + { + gMain.state = 5; + } + else + { + gUnknown_020322A0->timer = 0; + gMain.state = 3; + } + break; + case 5: + sub_81533E0(); + gMain.state = 6; + gUnknown_020322A0->timer = 0; + break; + case 6: + if (++gUnknown_020322A0->timer > 10) + { + if (GetMultiplayerId() == 0) + { + gUnknown_020322A0->timer = Random() % 30; + } + else + { + gUnknown_020322A0->timer = 0; + } + gMain.state = 7; + } + break; + case 7: + if (gUnknown_020322A0->timer == 0) + { + sub_8077288(1); + gMain.state = 8; + } + else + { + gUnknown_020322A0->timer--; + } + break; + case 8: + if (_IsLinkTaskFinished()) + { + sub_8153408(); + gMain.state = 9; + } + break; + case 9: + if (++gUnknown_020322A0->timer > 60) + { + gMain.state++; + sub_8077288(2); + } + break; + case 10: + if (_IsLinkTaskFinished()) + { + FadeOutBGM(3); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gMain.state = 11; + } + break; + case 11: + if (!gPaletteFade.active && IsBGMStopped() == TRUE) + { + sub_8077288(3); + gMain.state = 12; + } + break; + case 12: + if (_IsLinkTaskFinished()) + { + gSoftResetDisabled = FALSE; + SetMainCallback2(c2_080543C4); + } + break; + } + + if (!HasLinkErrorOccurred()) + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c index f5354a1e8..5ddae218b 100644 --- a/src/trainer_pokemon_sprites.c +++ b/src/trainer_pokemon_sprites.c @@ -115,7 +115,7 @@ static void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 else { sCreatingSpriteTemplate.paletteTag = paletteTag; - LoadCompressedObjectPalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality)); + LoadCompressedSpritePalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality)); } } else @@ -128,7 +128,7 @@ static void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 else { sCreatingSpriteTemplate.paletteTag = paletteTag; - LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[species]); + LoadCompressedSpritePalette(&gTrainerFrontPicPaletteTable[species]); } } } @@ -6,6 +6,8 @@ #include "event_data.h" #include "fieldmap.h" #include "field_camera.h" +#include "field_specials.h" +#include "fldeff.h" #include "strings.h" #include "string_util.h" #include "international_string_util.h" @@ -24,7 +26,6 @@ #include "event_scripts.h" #include "shop.h" #include "lilycove_lady.h" -#include "rom6.h" #include "pokedex.h" #include "event_object_movement.h" #include "text.h" @@ -861,13 +862,13 @@ void SetTVMetatilesOnMap(int width, int height, u16 tileId) void TurnOffTVScreen(void) { - SetTVMetatilesOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height, 0x0002); + SetTVMetatilesOnMap(gBackupMapLayout.width, gBackupMapLayout.height, 0x0002); DrawWholeMapView(); } void TurnOnTVScreen(void) { - SetTVMetatilesOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height, 0x0003); + SetTVMetatilesOnMap(gBackupMapLayout.width, gBackupMapLayout.height, 0x0003); DrawWholeMapView(); } @@ -3469,7 +3470,7 @@ void ChangeBoxPokemonNickname(void) void ChangeBoxPokemonNickname_CB(void) { - SetBoxMonNickFromAnyBox(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, gStringVar2); + SetBoxMonNickAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, gStringVar2); CB2_ReturnToFieldContinueScriptPlayMapMusic(); } diff --git a/src/unk_pokedex_area_screen_helper.c b/src/unk_pokedex_area_screen_helper.c index 67fd52cb5..0041d628c 100644 --- a/src/unk_pokedex_area_screen_helper.c +++ b/src/unk_pokedex_area_screen_helper.c @@ -22,21 +22,21 @@ void sub_81C4D70(const struct UnkStruct_1C4D70 *template) if (unk == 0) { - SetBgAttribute(template->bg, BG_CTRL_ATTR_WRAPAROUND, 0); + SetBgAttribute(template->bg, BG_ATTR_METRIC, 0); decompress_and_copy_tile_data_to_vram(template->bg, gUnknown_0861D1A0, 0, template->unk2, unk); sub_8199D3C(decompress_and_copy_tile_data_to_vram(template->bg, gUnknown_0861DEF4, 0, 0, 1), template->unk2, 32, 32, unk); } else { - SetBgAttribute(template->bg, BG_CTRL_ATTR_WRAPAROUND, 2); - SetBgAttribute(template->bg, 9, 1); + SetBgAttribute(template->bg, BG_ATTR_METRIC, 2); + SetBgAttribute(template->bg, BG_ATTR_TYPE, 1); decompress_and_copy_tile_data_to_vram(template->bg, gUnknown_0861E208, 0, template->unk2, 0); sub_8199D3C(decompress_and_copy_tile_data_to_vram(template->bg, gUnknown_0861EF64, 0, 0, 1), template->unk2, 64, 64, 1); } ChangeBgX(template->bg, 0, 0); ChangeBgY(template->bg, 0, 0); - SetBgAttribute(template->bg, BG_CTRL_ATTR_SCREENSIZE, 1); + SetBgAttribute(template->bg, BG_ATTR_PALETTEMODE, 1); CpuCopy32(gUnknown_0861D140, &gPlttBufferUnfaded[0x70], 0x60); *gUnknown_0203CF28 = template->bg; } diff --git a/src/unk_transition.c b/src/unk_transition.c index 18cee2544..d56998b5b 100644 --- a/src/unk_transition.c +++ b/src/unk_transition.c @@ -35,11 +35,13 @@ static bool8 sub_81DB290(struct Task *task); static bool8 sub_81DB328(struct Task *task); // const rom data -// TODO: move those from .s file to .c -extern const u32 gUnknown_0862AD54[]; -extern const u32 gUnknown_0862AF30[]; -extern const u32 gUnknown_0862B0DC[]; -extern const u16 gUnknown_0862B53C[]; +static const u32 gUnknown_0862AD54[] = INCBIN_U32("graphics/battle_transitions/frontier_transition.4bpp.lz"); +static const u32 gUnknown_0862AF30[] = INCBIN_U32("graphics/battle_transitions/frontier_transition.bin"); +static const u32 gUnknown_0862B0DC[] = INCBIN_U32("graphics/battle_transitions/frontier_transition_circles.4bpp.lz"); +static const u16 gUnknown_0862B53C[] = INCBIN_U16("graphics/battle_transitions/frontier_transition.gbapal"); + +// Unused Empty data. Feel free to delete. +static const u8 sFiller[0x1C0] = {0}; static const struct OamData sOamData_862B71C = { @@ -185,7 +187,7 @@ static void sub_81DA700(void) LZ77UnCompVram(gUnknown_0862AD54, dst2); LZ77UnCompVram(gUnknown_0862AF30, dst1); LoadPalette(gUnknown_0862B53C, 0xF0, 0x20); - LoadCompressedObjectPic(&sUnknown_0862B724); + LoadCompressedSpriteSheet(&sUnknown_0862B724); LoadSpritePalette(&sUnknown_0862B72C); } @@ -335,8 +337,8 @@ static bool8 sub_81DAACC(struct Task *task) else { sub_81DA700(); - SetGpuReg(REG_OFFSET_BLDCNT, 0x3F41); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x1000); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgY(0, 0x500, 2); @@ -366,11 +368,11 @@ static bool8 sub_81DAB4C(struct Task *task) } else { - u16 var; + u16 blnd; task->data[2]++; - var = task->data[2]; - SetGpuReg(REG_OFFSET_BLDALPHA, (var) | ((16 - var) << 8)); + blnd = task->data[2]; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(blnd, 16 - blnd)); } return FALSE; diff --git a/src/walda_phrase.c b/src/walda_phrase.c index ff2ee7399..83004777f 100644 --- a/src/walda_phrase.c +++ b/src/walda_phrase.c @@ -7,18 +7,11 @@ #include "text.h" #include "new_game.h" #include "overworld.h" +#include "pokemon_storage_system.h" +#include "field_screen_effect.h" extern const u8 gText_Peekaboo[]; -extern u8 *GetWaldaPhrasePtr(void); -extern bool32 IsWaldaPhraseEmpty(void); -extern void sub_80AF168(void); -extern void SetWaldaPhrase(const u8 *src); -extern void SetWaldaWallpaperPatternId(u8 patternId); -extern void SetWaldaWallpaperIconId(u8 iconId); -extern void SetWaldaWallpaperColors(u16 backgroundColor, u16 foregroundColor); -extern void SetWaldaWallpaperLockedOrUnlocked(bool32 unlocked); - // this file's functions static void CB2_HandleGivenWaldaPhrase(void); static u32 GetWaldaPhraseInputCase(u8 *inputPtr); diff --git a/src/wallclock.c b/src/wallclock.c index 5c8d920e7..546750ba6 100644 --- a/src/wallclock.c +++ b/src/wallclock.c @@ -585,11 +585,11 @@ static void WallClockVblankCallback(void) static void LoadWallClockGraphics(void) { SetVBlankCallback(NULL); - SetGpuReg(REG_OFFSET_DISPCNT, 0x0000); - SetGpuReg(REG_OFFSET_BG3CNT, 0x0000); - SetGpuReg(REG_OFFSET_BG2CNT, 0x0000); - SetGpuReg(REG_OFFSET_BG1CNT, 0x0000); - SetGpuReg(REG_OFFSET_BG0CNT, 0x0000); + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_BG3CNT, 0); + SetGpuReg(REG_OFFSET_BG2CNT, 0); + SetGpuReg(REG_OFFSET_BG1CNT, 0); + SetGpuReg(REG_OFFSET_BG0CNT, 0); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); @@ -623,7 +623,7 @@ static void LoadWallClockGraphics(void) ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); - LoadCompressedObjectPic(&gUnknown_085B2208); + LoadCompressedSpriteSheet(&gUnknown_085B2208); LoadSpritePalettes(gUnknown_085B2218); } @@ -633,9 +633,9 @@ static void WallClockInit(void) EnableInterrupts(INTR_FLAG_VBLANK); SetVBlankCallback(WallClockVblankCallback); SetMainCallback2(WallClockMainCallback); - SetGpuReg(REG_OFFSET_BLDCNT, 0x0000); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x0000); - SetGpuReg(REG_OFFSET_BLDY, 0x0000); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); ShowBg(0); ShowBg(2); diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 906cca3a0..2e6f1642a 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -88,20 +88,12 @@ static bool8 CheckFeebas(void) x -= 7; y -= 7; -#ifdef NONMATCHING + if (y >= gRoute119WaterTileData[3 * 0 + 0] && y <= gRoute119WaterTileData[3 * 0 + 1]) + route119Section = 0; if (y >= gRoute119WaterTileData[3 * 1 + 0] && y <= gRoute119WaterTileData[3 * 1 + 1]) route119Section = 1; if (y >= gRoute119WaterTileData[3 * 2 + 0] && y <= gRoute119WaterTileData[3 * 2 + 1]) route119Section = 2; -#else - { - register const u16 *arr asm("r0"); - if (y >= (arr = gRoute119WaterTileData)[3 * 1 + 0] && y <= arr[3 * 1 + 1]) - route119Section = 1; - if (y >= arr[3 * 2 + 0] && y <= arr[3 * 2 + 1]) - route119Section = 2; - } -#endif if (Random() % 100 > 49) // 50% chance of encountering Feebas return FALSE; @@ -251,7 +243,7 @@ static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon) rand = Random() % range; // check ability for max level mon - if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)) + if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) { u8 ability = GetMonAbility(&gPlayerParty[0]); if (ability == ABILITY_HUSTLE || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_PRESSURE) @@ -332,7 +324,7 @@ static u8 PickWildMonNature(void) } } // check synchronize for a pokemon with the same ability - if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3) + if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG) && GetMonAbility(&gPlayerParty[0]) == ABILITY_SYNCHRONIZE && Random() % 2 == 0) { @@ -360,7 +352,7 @@ static void CreateWildMon(u16 species, u8 level) } if (checkCuteCharm - && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3) + && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG) && GetMonAbility(&gPlayerParty[0]) == ABILITY_CUTE_CHARM && Random() % 3 != 0) { @@ -478,7 +470,7 @@ static bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility) encounterRate = encounterRate * 80 / 100; ApplyFluteEncounterRateMod(&encounterRate); ApplyCleanseTagEncounterRateMod(&encounterRate); - if (!ignoreAbility && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)) + if (!ignoreAbility && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) { u32 ability = GetMonAbility(&gPlayerParty[0]); @@ -868,7 +860,7 @@ static bool8 IsAbilityAllowingEncounter(u8 level) { u8 ability; - if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)) + if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) return TRUE; ability = GetMonAbility(&gPlayerParty[0]); @@ -905,7 +897,7 @@ static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex) { - if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)) + if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)) return FALSE; else if (GetMonAbility(&gPlayerParty[0]) != ability) return FALSE; diff --git a/src/window.c b/src/window.c index 4e1a38eff..3da529178 100644 --- a/src/window.c +++ b/src/window.c @@ -63,7 +63,7 @@ bool16 InitWindows(const struct WindowTemplate *templates) if (gUnknown_03002F70[bgLayer] == NULL) { - attrib = GetBgAttribute(bgLayer, 0x8); + attrib = GetBgAttribute(bgLayer, BG_ATTR_METRIC); if (attrib != 0xFFFF) { @@ -141,7 +141,7 @@ u16 AddWindow(const struct WindowTemplate *template) if (gUnknown_03002F70[bgLayer] == NULL) { - attrib = GetBgAttribute(bgLayer, 0x8); + attrib = GetBgAttribute(bgLayer, BG_ATTR_METRIC); if (attrib != 0xFFFF) { @@ -276,16 +276,16 @@ void CopyWindowToVram(u8 windowId, u8 mode) switch (mode) { - case 1: - CopyBgTilemapBufferToVram(windowLocal.window.bg); - break; - case 2: - LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock); - break; - case 3: - LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock); - CopyBgTilemapBufferToVram(windowLocal.window.bg); - break; + case 1: + CopyBgTilemapBufferToVram(windowLocal.window.bg); + break; + case 2: + LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock); + break; + case 3: + LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock); + CopyBgTilemapBufferToVram(windowLocal.window.bg); + break; } } @@ -308,16 +308,16 @@ void CopyWindowRectToVram(u32 windowId, u32 mode, u32 x, u32 y, u32 w, u32 h) switch (mode) { - case 1: - CopyBgTilemapBufferToVram(windowLocal.window.bg); - break; - case 2: - LoadBgTiles(windowLocal.window.bg, windowLocal.tileData + (rectPos * 32), rectSize, windowLocal.window.baseBlock + rectPos); - break; - case 3: - LoadBgTiles(windowLocal.window.bg, windowLocal.tileData + (rectPos * 32), rectSize, windowLocal.window.baseBlock + rectPos); - CopyBgTilemapBufferToVram(windowLocal.window.bg); - break; + case 1: + CopyBgTilemapBufferToVram(windowLocal.window.bg); + break; + case 2: + LoadBgTiles(windowLocal.window.bg, windowLocal.tileData + (rectPos * 32), rectSize, windowLocal.window.baseBlock + rectPos); + break; + case 3: + LoadBgTiles(windowLocal.window.bg, windowLocal.tileData + (rectPos * 32), rectSize, windowLocal.window.baseBlock + rectPos); + CopyBgTilemapBufferToVram(windowLocal.window.bg); + break; } } } @@ -328,7 +328,7 @@ void PutWindowTilemap(u8 windowId) WriteSequenceToBgTilemapBuffer( windowLocal.window.bg, - GetBgAttribute(windowLocal.window.bg, 0xA) + windowLocal.window.baseBlock, + GetBgAttribute(windowLocal.window.bg, BG_ATTR_BASETILE) + windowLocal.window.baseBlock, windowLocal.window.tilemapLeft, windowLocal.window.tilemapTop, windowLocal.window.width, @@ -340,7 +340,7 @@ void PutWindowTilemap(u8 windowId) void PutWindowRectTilemapOverridePalette(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 palette) { struct Window windowLocal = gWindows[windowId]; - u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.bg, 0xA); + u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.bg, BG_ATTR_BASETILE); int i; for (i = 0; i < height; ++i) @@ -376,7 +376,7 @@ void ClearWindowTilemap(u8 windowId) void PutWindowRectTilemap(u8 windowId, u8 x, u8 y, u8 width, u8 height) { struct Window windowLocal = gWindows[windowId]; - u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.bg, 0xA); + u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.bg, BG_ATTR_BASETILE); int i; for (i = 0; i < height; ++i) @@ -601,7 +601,7 @@ static void nullsub_9(void) } -u16 AddWindow8Bit(struct WindowTemplate *template) +u16 AddWindow8Bit(const struct WindowTemplate *template) { u16 windowId; u8* memAddress; @@ -617,7 +617,7 @@ u16 AddWindow8Bit(struct WindowTemplate *template) bgLayer = template->bg; if (gUnknown_03002F70[bgLayer] == 0) { - u16 attribute = GetBgAttribute(bgLayer, 8); + u16 attribute = GetBgAttribute(bgLayer, BG_ATTR_METRIC); if (attribute != 0xFFFF) { s32 i; @@ -669,12 +669,12 @@ void FillWindowPixelRect8Bit(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, FillBitmapRect8Bit(&pixelRect, x, y, width, height, fillValue); } -void BlitBitmapRectToWindow4BitTo8Bit(u8 windowId, u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 paletteNum) +void BlitBitmapRectToWindow4BitTo8Bit(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 paletteNum) { struct Bitmap sourceRect; struct Bitmap destRect; - sourceRect.pixels = (u8*)pixels; + sourceRect.pixels = (u8*) pixels; sourceRect.width = srcWidth; sourceRect.height = srcHeight; @@ -692,16 +692,16 @@ void CopyWindowToVram8Bit(u8 windowId, u8 mode) switch (mode) { - case 1: - CopyBgTilemapBufferToVram(sWindowPtr->window.bg); - break; - case 2: - LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock); - break; - case 3: - LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock); - CopyBgTilemapBufferToVram(sWindowPtr->window.bg); - break; + case 1: + CopyBgTilemapBufferToVram(sWindowPtr->window.bg); + break; + case 2: + LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock); + break; + case 3: + LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock); + CopyBgTilemapBufferToVram(sWindowPtr->window.bg); + break; } } |