diff options
Diffstat (limited to 'src')
65 files changed, 4427 insertions, 4796 deletions
diff --git a/src/battle_anim.c b/src/battle_anim.c index 0b011b0f3..ae4e6cf47 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1823,7 +1823,7 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo { s32 i; - sub_80767F0(); + ResetSpritePriorityOfAllVisibleBattlers(); UpdateOamPriorityInAllHealthboxes(0); for (i = 0; i < MAX_BATTLERS_COUNT; i++) { @@ -2128,7 +2128,7 @@ static void ScriptCmd_end(void) if (!continuousAnim) { m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 256); - sub_80767F0(); + ResetSpritePriorityOfAllVisibleBattlers(); UpdateOamPriorityInAllHealthboxes(1); gAnimScriptActive = FALSE; } diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index ab12c02b4..1d7761351 100644 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -3135,7 +3135,7 @@ void AnimTask_RolePlaySilhouette(u8 taskId) coord1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); coord2 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); - spriteId = sub_80768D0(species, isBackPic, 0, coord1 + xOffset, coord2, 5, personality, otId, gBattleAnimTarget, 1); + spriteId = CreateAdditionalMonSpriteForMoveAnim(species, isBackPic, 0, coord1 + xOffset, coord2, 5, personality, otId, gBattleAnimTarget, 1); gSprites[spriteId].oam.priority = priority; gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; FillPalette(RGB_WHITE, (gSprites[spriteId].oam.paletteNum << 4) + 0x100, 32); @@ -3172,7 +3172,7 @@ static void AnimTask_RolePlaySilhouetteStep2(u8 taskId) TrySetSpriteRotScale(&gSprites[spriteId], TRUE, gTasks[taskId].data[10], gTasks[taskId].data[11], 0); if (++gTasks[taskId].data[12] == 9) { - sub_8075AD8(&gSprites[spriteId]); + TryResetSpriteAffineState(&gSprites[spriteId]); DestroySpriteAndFreeResources_(&gSprites[spriteId]); gTasks[taskId].func = DestroyAnimVisualTaskAndDisableBlend; } @@ -4906,7 +4906,7 @@ void AnimTask_SnatchOpposingMonMove(u8 taskId) x = -32; } - spriteId2 = sub_80768D0(species, isBackPic, 0, x, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y), subpriority, personality, otId, gBattleAnimAttacker, 0); + spriteId2 = CreateAdditionalMonSpriteForMoveAnim(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); diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 46f62a03c..c47a29976 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -23,17 +23,17 @@ static void PlayerThrowBall_RunLinearTranslation_ThenceSetCBtoStoredInData6(stru static void SpriteCB_RunAnimFastLinearTranslation(struct Sprite *sprite); static bool8 Dummy_ReturnFalse(void); static void AnimThrowProjectile_Step(struct Sprite *sprite); -static void sub_80760D0(u8 taskId); +static void AnimTask_AlphaFadeIn_Step(u8 taskId); static void AnimTask_BlendMonInAndOutSetup(struct Task *task); static void AnimTask_BlendMonInAndOutStep(u8 taskId); static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId); -static void sub_8077118(u8 taskId); -static void sub_80771E4(struct Task *task, u8 taskId); -static void sub_8077268(struct Sprite *sprite); -static void sub_80772F4(struct Sprite *sprite); +static void AnimTask_AttackerPunchWithTrace_Step(u8 taskId); +static void PunchAnim_CreateTraceSprite(struct Task *task, u8 taskId); +static void SpriteCB_PunchTrace(struct Sprite *sprite); +static void SpriteCB_WeatherBallUp_Step(struct Sprite *sprite); static EWRAM_DATA union AffineAnimCmd *sAnimTaskAffineAnim = NULL; -static EWRAM_DATA u32 gUnknown_2037F2C = 0; // not used +UNUSED static EWRAM_DATA u32 gUnknown_2037F2C = 0; // not used static const struct UCoords8 sBattlerCoords[][4] = { @@ -77,11 +77,11 @@ static const u8 sCastformBackSpriteYCoords[] = 0, // HAIL }; -static const struct SpriteTemplate gUnknown_83AE054[] = +static const struct SpriteTemplate sSpriteTemplates_AdditionalForAnim[] = { { - .tileTag = 0xD755, - .paletteTag = 0xD755, + .tileTag = 55125, + .paletteTag = 55125, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, @@ -89,8 +89,8 @@ static const struct SpriteTemplate gUnknown_83AE054[] = .callback = SpriteCallbackDummy, }, { - .tileTag = 0xD756, - .paletteTag = 0xD756, + .tileTag = 55126, + .paletteTag = 55126, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, @@ -99,10 +99,10 @@ static const struct SpriteTemplate gUnknown_83AE054[] = } }; -static const struct SpriteSheet gUnknown_83AE084[] = +static const struct SpriteSheet sMoveAnimAdtlSprSheets[] = { - { gMiscBlank_Gfx, 0x800, 0xD755 }, - { gMiscBlank_Gfx, 0x800, 0xD756 }, + { gMiscBlank_Gfx, 0x800, 55125 }, + { gMiscBlank_Gfx, 0x800, 55126 }, // unused }; u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType) @@ -390,6 +390,8 @@ static void SetCallbackToStoredInData6(struct Sprite *sprite) sprite->callback = (SpriteCallback)callback; } +// x = a * sin(theta0 + dtheta * t) +// y = a * cos(theta0 + dtheta * t) void TranslateSpriteInCircleOverDuration(struct Sprite *sprite) { if (sprite->data[3]) @@ -409,6 +411,8 @@ void TranslateSpriteInCircleOverDuration(struct Sprite *sprite) } } +// x = (a0 + da * t) * sin(theta0 + dtheta * t) +// y = (a0 + da * t) * cos(theta0 + dtheta * t) void TranslateSpriteInGrowingCircleOverDuration(struct Sprite *sprite) { if (sprite->data[3]) @@ -430,7 +434,9 @@ void TranslateSpriteInGrowingCircleOverDuration(struct Sprite *sprite) } // not used -static void sub_8074B5C(struct Sprite *sprite) +// x = alpl * sin(alpha0 + dalpha * t) +// y = ampl * cos(beta0 + dbeta * t) +static void TranslateSpriteInLissajousCurveOverDuration(struct Sprite *sprite) { if (sprite->data[3]) { @@ -454,6 +460,8 @@ static void sub_8074B5C(struct Sprite *sprite) } } +// x = a * sin(theta0 + dtheta * t) +// y = b * cos(theta0 + dtheta * t) void TranslateSpriteInEllipseOverDuration(struct Sprite *sprite) { if (sprite->data[3]) @@ -484,14 +492,14 @@ void WaitAnimForDuration(struct Sprite *sprite) SetCallbackToStoredInData6(sprite); } -static void sub_8074C64(struct Sprite *sprite) +static void SetupAndStartSpriteLinearTranslation(struct Sprite *sprite) { - sub_8074C80(sprite); + SetupLinearTranslationWithFixedDuration(sprite); sprite->callback = TranslateSpriteLinear; sprite->callback(sprite); } -void sub_8074C80(struct Sprite *sprite) +void SetupLinearTranslationWithFixedDuration(struct Sprite *sprite) { s16 old; s32 xDiff; @@ -554,13 +562,13 @@ static void TranslateSpriteLinearFixedPointIconFrame(struct Sprite *sprite) } // not used -static void sub_8074D80(struct Sprite *sprite) +static void SetupAndStartSpriteLinearTranslationToTarget(struct Sprite *sprite) { sprite->data[1] = sprite->pos1.x + sprite->pos2.x; sprite->data[3] = sprite->pos1.y + sprite->pos2.y; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); - sprite->callback = sub_8074C64; + sprite->callback = SetupAndStartSpriteLinearTranslation; } void TranslateMonSpriteLinear(struct Sprite *sprite) @@ -621,17 +629,17 @@ void DestroySpriteAndMatrix(struct Sprite *sprite) } // not used -static void sub_8074EF4(struct Sprite *sprite) +static void SetupAndStartSpriteLinearTranslationToAttacker(struct Sprite *sprite) { sprite->data[1] = sprite->pos1.x + sprite->pos2.x; sprite->data[3] = sprite->pos1.y + sprite->pos2.y; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); - sprite->callback = sub_8074C64; + sprite->callback = SetupAndStartSpriteLinearTranslation; } // not used -static void sub_8074F38(struct Sprite *sprite) +static void SpriteResetPaletteStructAndDestroy(struct Sprite *sprite) { ResetPaletteStructByUid(sprite->data[5]); DestroySpriteAndMatrix(sprite); @@ -1094,7 +1102,7 @@ void InitAnimFastLinearTranslationWithSpeed(struct Sprite *sprite) InitAnimFastLinearTranslation(sprite); } -void sub_8075830(struct Sprite *sprite) +void InitAndStartAnimFastLinearTranslationWithSpeed(struct Sprite *sprite) { sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; @@ -1188,7 +1196,7 @@ void TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 x } } -void sub_8075AD8(struct Sprite *sprite) +void TryResetSpriteAffineState(struct Sprite *sprite) { TrySetSpriteRotScale(sprite, TRUE, 0x100, 0x100, 0); sprite->affineAnimPaused = FALSE; @@ -1487,10 +1495,10 @@ void AnimTask_AlphaFadeIn(u8 taskId) gTasks[taskId].data[7] = gBattleAnimArgs[2]; gTasks[taskId].data[8] = gBattleAnimArgs[3]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gBattleAnimArgs[0], gBattleAnimArgs[1])); - gTasks[taskId].func = sub_80760D0; + gTasks[taskId].func = AnimTask_AlphaFadeIn_Step; } -static void sub_80760D0(u8 taskId) +static void AnimTask_AlphaFadeIn_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -1750,19 +1758,19 @@ void *LoadPointerFromVars(s16 lo, s16 hi) return (void *)((u16)lo | ((u16)hi << 16)); } -void sub_80765D4(struct Task *task, u8 spriteId, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7) +void BattleAnimHelper_SetSpriteSquashParams(struct Task *task, u8 spriteId, s16 xScale0, s16 yScale0, s16 xScale1, s16 yScale1, u16 duration) { - task->data[8] = a7; + task->data[8] = duration; task->data[15] = spriteId; - task->data[9] = a3; - task->data[10] = a4; - task->data[13] = a5; - task->data[14] = a6; - task->data[11] = (a5 - a3) / a7; - task->data[12] = (a6 - a4) / a7; + task->data[9] = xScale0; + task->data[10] = yScale0; + task->data[13] = xScale1; + task->data[14] = yScale1; + task->data[11] = (xScale1 - xScale0) / duration; + task->data[12] = (yScale1 - yScale0) / duration; } -u8 sub_8076640(struct Task *task) +u8 BattleAnimHelper_RunSpriteSquash(struct Task *task) { if (!task->data[8]) return 0; @@ -1801,7 +1809,7 @@ void AnimTask_GetFrustrationPowerLevel(u8 taskId) } // not used -static void sub_80766EC(u8 priority) +static void SetOamPriorityOfAllVisibleBattlers(u8 priority) { if (IsBattlerSpriteVisible(gBattleAnimTarget)) gSprites[gBattlerSpriteIds[gBattleAnimTarget]].oam.priority = priority; @@ -1813,7 +1821,7 @@ static void sub_80766EC(u8 priority) gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority = priority; } -void sub_80767F0(void) +void ResetSpritePriorityOfAllVisibleBattlers(void) { s32 i; @@ -1863,18 +1871,18 @@ u8 GetBattlerSpriteBGPriorityRank(u8 battlerId) return 1; } -u8 sub_80768D0(u16 species, bool8 isBackpic, u8 a3, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, u32 a10) +u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 templateId, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, bool32 ignoreDeoxys) { u8 spriteId; - u16 sheet = LoadSpriteSheet(&gUnknown_83AE084[a3]); - u16 palette = AllocSpritePalette(gUnknown_83AE054[a3].paletteTag); + u16 sheet = LoadSpriteSheet(&sMoveAnimAdtlSprSheets[templateId]); + u16 palette = AllocSpritePalette(sSpriteTemplates_AdditionalForAnim[templateId].paletteTag); if (gMonSpritesGfxPtr != NULL && gMonSpritesGfxPtr->multiUseBuffer == NULL) gMonSpritesGfxPtr->multiUseBuffer = AllocZeroed(0x2000); if (!isBackpic) { LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), (palette * 0x10) + 0x100, 0x20); - if (a10 == 1 || ShouldIgnoreDeoxysForm(5, battlerId) == 1 || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0) + if (ignoreDeoxys == TRUE || ShouldIgnoreDeoxysForm(DEOXYS_CHECK_BATTLE_ANIM, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0) LoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->multiUseBuffer, species, @@ -1890,7 +1898,7 @@ u8 sub_80768D0(u16 species, bool8 isBackpic, u8 a3, s16 x, s16 y, u8 subpriority else { LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), (palette * 0x10) + 0x100, 0x20); - if (a10 == 1 || ShouldIgnoreDeoxysForm(5, battlerId) == 1 || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0) + if (ignoreDeoxys == TRUE || ShouldIgnoreDeoxysForm(DEOXYS_CHECK_BATTLE_ANIM, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0) LoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], gMonSpritesGfxPtr->multiUseBuffer, species, @@ -1906,9 +1914,9 @@ u8 sub_80768D0(u16 species, bool8 isBackpic, u8 a3, s16 x, s16 y, u8 subpriority RequestDma3Copy(gMonSpritesGfxPtr->multiUseBuffer, (void *)(OBJ_VRAM0 + (sheet * 0x20)), 0x800, 1); FREE_AND_SET_NULL(gMonSpritesGfxPtr->multiUseBuffer); if (!isBackpic) - spriteId = CreateSprite(&gUnknown_83AE054[a3], x, y + gMonFrontPicCoords[species].y_offset, subpriority); + spriteId = CreateSprite(&sSpriteTemplates_AdditionalForAnim[templateId], x, y + gMonFrontPicCoords[species].y_offset, subpriority); else - spriteId = CreateSprite(&gUnknown_83AE054[a3], x, y + gMonBackPicCoords[species].y_offset, subpriority); + spriteId = CreateSprite(&sSpriteTemplates_AdditionalForAnim[templateId], x, y + gMonBackPicCoords[species].y_offset, subpriority); return spriteId; } @@ -2048,20 +2056,20 @@ void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x *y = (battlerY + partnerY) / 2; } -u8 sub_8076E34(s32 battlerId, u8 spriteId, s32 species) +u8 CreateCloneOfSpriteInWindowMode(s32 battlerId, u8 spriteId, s32 species) { u8 newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); gSprites[newSpriteId] = gSprites[spriteId]; gSprites[newSpriteId].usingSheet = TRUE; gSprites[newSpriteId].oam.priority = 0; - gSprites[newSpriteId].oam.objMode = 2; + gSprites[newSpriteId].oam.objMode = ST_OAM_OBJ_WINDOW; gSprites[newSpriteId].oam.tileNum = gSprites[spriteId].oam.tileNum; gSprites[newSpriteId].callback = SpriteCallbackDummy; return newSpriteId; } -void sub_8076ED8(struct Sprite *sprite) +void SpriteCB_AnimTranslateSpriteLinearAndFlicker(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) @@ -2083,7 +2091,7 @@ void sub_8076ED8(struct Sprite *sprite) sprite->callback = TranslateSpriteLinearAndFlicker; } -void sub_8076F58(struct Sprite *sprite) +void SpriteCB_AnimTranslateSpriteLinearAndFlicker2(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { @@ -2104,7 +2112,7 @@ void sub_8076F58(struct Sprite *sprite) sprite->callback = TranslateSpriteLinearAndFlicker; } -void sub_8076FD0(struct Sprite *sprite) +void SpriteCB_TrackOffsetFromAttackerAndWaitAnim(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) @@ -2138,16 +2146,16 @@ void AnimTask_AttackerPunchWithTrace(u8 taskId) task->data[6] = 3; CpuCopy32(&gPlttBufferUnfaded[src], &gPlttBufferFaded[dest], 0x20); BlendPalette(dest, 16, gBattleAnimArgs[1], gBattleAnimArgs[0]); - task->func = sub_8077118; + task->func = AnimTask_AttackerPunchWithTrace_Step; } -static void sub_8077118(u8 taskId) +static void AnimTask_AttackerPunchWithTrace_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[2]) { case 0: - sub_80771E4(task, taskId); + PunchAnim_CreateTraceSprite(task, taskId); gSprites[task->data[0]].pos2.x += task->data[1]; if (++task->data[3] == 5) { @@ -2156,7 +2164,7 @@ static void sub_8077118(u8 taskId) } break; case 1: - sub_80771E4(task, taskId); + PunchAnim_CreateTraceSprite(task, taskId); gSprites[task->data[0]].pos2.x -= task->data[1]; if (--task->data[3] == 0) { @@ -2174,7 +2182,7 @@ static void sub_8077118(u8 taskId) } } -static void sub_80771E4(struct Task *task, u8 taskId) +static void PunchAnim_CreateTraceSprite(struct Task *task, u8 taskId) { s16 spriteId = CloneBattlerSpriteWithBlend(0); @@ -2186,12 +2194,12 @@ static void sub_80771E4(struct Task *task, u8 taskId) gSprites[spriteId].data[1] = taskId; gSprites[spriteId].data[2] = spriteId; gSprites[spriteId].pos2.x = gSprites[task->data[0]].pos2.x; - gSprites[spriteId].callback = sub_8077268; + gSprites[spriteId].callback = SpriteCB_PunchTrace; ++task->data[5]; } } -static void sub_8077268(struct Sprite *sprite) +static void SpriteCB_PunchTrace(struct Sprite *sprite) { if (--sprite->data[0] == 0) { @@ -2200,7 +2208,7 @@ static void sub_8077268(struct Sprite *sprite) } } -void sub_807729C(struct Sprite *sprite) +void SpriteCB_WeatherBallUp(struct Sprite *sprite) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); @@ -2209,10 +2217,10 @@ void sub_807729C(struct Sprite *sprite) else sprite->data[0] = -10; sprite->data[1] = -40; - sprite->callback = sub_80772F4; + sprite->callback = SpriteCB_WeatherBallUp_Step; } -static void sub_80772F4(struct Sprite *sprite) +static void SpriteCB_WeatherBallUp_Step(struct Sprite *sprite) { sprite->data[2] += sprite->data[0]; sprite->data[3] += sprite->data[1]; diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c index 23dc0461e..4bae32599 100644 --- a/src/battle_anim_status_effects.c +++ b/src/battle_anim_status_effects.c @@ -43,7 +43,7 @@ const struct SpriteTemplate gSpriteTemplate_83BF3F8 = .anims = sSpriteAnimTable_83BF3F4, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8076F58, + .callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker2, }; const struct SpriteTemplate gSpriteTemplate_83BF410 = @@ -54,7 +54,7 @@ const struct SpriteTemplate gSpriteTemplate_83BF410 = .anims = sSpriteAnimTable_83BF3F4, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8076ED8, + .callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker, }; static const union AnimCmd sUnknown_83BF428[] = @@ -76,7 +76,7 @@ const struct SpriteTemplate gWeatherBallUpSpriteTemplate = .anims = sSpriteAnimTable_83BF430, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_807729C, + .callback = SpriteCB_WeatherBallUp, }; const struct SpriteTemplate gWeatherBallNormalDownSpriteTemplate = @@ -113,7 +113,7 @@ const struct SpriteTemplate gSpriteTemplate_83BF480 = .anims = sSpriteAnimTable_83BF47C, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8076FD0, + .callback = SpriteCB_TrackOffsetFromAttackerAndWaitAnim, }; const struct SpriteTemplate gSpriteTemplate_83BF498 = @@ -124,7 +124,7 @@ const struct SpriteTemplate gSpriteTemplate_83BF498 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8076F58, + .callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker2, }; static const union AnimCmd sUnknown_83BF4B0[] = @@ -160,7 +160,7 @@ const struct SpriteTemplate gSpriteTemplate_83BF4D4 = .anims = sSpriteAniimTable_83BF4C8, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8076F58, + .callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker2, }; static const union AnimCmd sUnknown_83BF4EC[] = @@ -194,7 +194,7 @@ const struct SpriteTemplate gSpriteTemplate_83BF514 = .anims = sSpriteAnimTable_83BF4F4, .images = NULL, .affineAnims = sSpriteAffineAnimTable_83BF510, - .callback = sub_8076ED8, + .callback = SpriteCB_AnimTranslateSpriteLinearAndFlicker, }; static const u8 sUnknown_83BF52C[] = _("TASK OVER\nタスクがオ-バ-しました"); diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index ae2a4a407..6ac9b0fe7 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -330,7 +330,7 @@ void AnimTask_SetUpCurseBackground(u8 taskId) else species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); - newSpriteId = sub_8076E34(gBattleAnimAttacker, spriteId, species); + newSpriteId = CreateCloneOfSpriteInWindowMode(gBattleAnimAttacker, spriteId, species); GetBattleAnimBg1Data(&animBgData); AnimLoadCompressedBgTilemap(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_tilemap); if (IsContest()) @@ -446,11 +446,11 @@ static void sub_80BB2A0(u8 taskId) u8 battlerSpriteId; battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler1]; - spriteId = sub_8076E34(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species); + spriteId = CreateCloneOfSpriteInWindowMode(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species); if (sAnimStatsChangeData->data[3]) { battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler2]; - newSpriteId = sub_8076E34(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species); + newSpriteId = CreateCloneOfSpriteInWindowMode(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species); } GetBattleAnimBg1Data(&animBgData); if (sAnimStatsChangeData->data[0] == 0) @@ -752,9 +752,9 @@ void sub_80BBA20(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); else species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); - spriteId = sub_8076E34(battler1, gBattlerSpriteIds[battler1], species); + spriteId = CreateCloneOfSpriteInWindowMode(battler1, gBattlerSpriteIds[battler1], species); if (arg4) - newSpriteId = sub_8076E34(battler2, gBattlerSpriteIds[battler2], species); + newSpriteId = CreateCloneOfSpriteInWindowMode(battler2, gBattlerSpriteIds[battler2], species); GetBattleAnimBg1Data(&animBgData); AnimLoadCompressedBgTilemap(animBgData.bgId, tilemap); if (IsContest()) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index a0495ac15..c0cb6fe71 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -487,7 +487,7 @@ void TryReceiveLinkBattleData(void) s32 j; u8 *recvBuffer; - if (gReceivedRemoteLinkPlayers && (gBattleTypeFlags & BATTLE_TYPE_20) && (gLinkPlayers[0].linkType == 0x2211)) + if (gReceivedRemoteLinkPlayers && (gBattleTypeFlags & BATTLE_TYPE_LINK_ESTABLISHED) && (gLinkPlayers[0].linkType == 0x2211)) { LinkRfu_DestroyIdleTask(); for (i = 0; i < GetLinkPlayerCount(); ++i) diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index d0025de01..aac9b990d 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -387,7 +387,7 @@ void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId) } otId = GetMonData(mon, MON_DATA_OT_ID); position = GetBattlerPosition(battlerId); - if (ShouldIgnoreDeoxysForm(1, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) + if (ShouldIgnoreDeoxysForm(DEOXYS_CHECK_BATTLE_SPRITE, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites[position], species, currentPersonality); diff --git a/src/battle_main.c b/src/battle_main.c index d7f43ce75..021a0ca81 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -701,7 +701,7 @@ static void CB2_InitBattleInternal(void) } gMain.inBattle = TRUE; for (i = 0; i < PARTY_SIZE; ++i) - AdjustFriendship(&gPlayerParty[i], 3); + AdjustFriendship(&gPlayerParty[i], FRIENDSHIP_EVENT_LEAGUE_BATTLE); gBattleCommunication[MULTIUSE_STATE] = 0; } @@ -1051,7 +1051,7 @@ static void CB2_HandleStartBattle(void) SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - gBattleTypeFlags |= BATTLE_TYPE_20; + gBattleTypeFlags |= BATTLE_TYPE_LINK_ESTABLISHED; } } break; @@ -1409,7 +1409,7 @@ static void CB2_HandleStartMultiBattle(void) gMain.callback1 = BattleMainCB1; SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) - gBattleTypeFlags |= BATTLE_TYPE_20; + gBattleTypeFlags |= BATTLE_TYPE_LINK_ESTABLISHED; } break; case 5: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 35328d6c1..30b8bda88 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3241,7 +3241,7 @@ static void atk23_getexp(void) gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterMonId]; gBattlescriptCurrInstr = BattleScript_LevelUp; gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8)); - AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterMonId], 0); + AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterMonId], FRIENDSHIP_EVENT_GROW_LEVEL); // update battle mon structure after level up if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterMonId && gBattleMons[0].hp) { diff --git a/src/battle_transition.c b/src/battle_transition.c index 7d117f50f..e07bcd582 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -1033,7 +1033,7 @@ static bool8 BT_Phase2SlidingPokeballs_LoadBgGfx(struct Task *task) u16 *tilemapAddr, *tilesetAddr; BT_GetBg0TilemapAndTilesetBase(&tilemapAddr, &tilesetAddr); - CpuSet(sSlidingPokeballTilemap, tilesetAddr, 0x20); + CpuCopy16(sSlidingPokeballTilemap, tilesetAddr, 0x40); CpuFill32(0, tilemapAddr, 0x800); LoadPalette(sSlidingPokeballBigPokeballPalette, 0xF0, 0x20); ++task->tState; @@ -1827,7 +1827,7 @@ static bool8 BT_Phase2Mugshot_LoadGfx(struct Task *task) const u16 *mugshotsMap = sVsBarTilemap; BT_GetBg0TilemapAndTilesetBase(&tilemapAddr, &tilesetAddr); - CpuSet(sVsBarTileset, tilesetAddr, 0xF0); + CpuCopy16(sVsBarTileset, tilesetAddr, 0x1E0); LoadPalette(sVsBarOpponentPalettes[task->tWhichMugshot], 0xF0, 0x20); LoadPalette(sVsBarPlayerPalettes[gSaveBlock2Ptr->playerGender], 0xFA, 0xC); for (i = 0; i < 20; ++i) @@ -2438,7 +2438,7 @@ static bool8 BT_Phase2GridSquares_LoadGfx(struct Task *task) u16 *tilemapAddr, *tilesetAddr; BT_GetBg0TilemapAndTilesetBase(&tilemapAddr, &tilesetAddr); - CpuSet(sGridSquareTileset, tilesetAddr, 0x10); + CpuCopy16(sGridSquareTileset, tilesetAddr, 0x20); CpuFill16(0xF000, tilemapAddr, 0x800); LoadPalette(sSlidingPokeballBigPokeballPalette, 0xF0, 0x20); ++task->tState; @@ -2454,7 +2454,7 @@ static bool8 BT_Phase2GridSquares_UpdateTileset(struct Task *task) BT_GetBg0TilesetBase(&tilesetAddr); task->tDelay = 3; ++task->tWhichGrid; - CpuSet(sGridSquareTileset + (task->tWhichGrid * 8), tilesetAddr, 0x10); + CpuCopy16(sGridSquareTileset + (task->tWhichGrid * 8), tilesetAddr, 0x20); if (task->tWhichGrid > 0xD) { ++task->tState; @@ -2501,7 +2501,7 @@ static bool8 BT_Phase2BlackDoodles_Init(struct Task *task) sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0); for (i = 0; i < 160; ++i) gScanlineEffectRegBuffers[0][i] = WIN_RANGE(0, 0xF0); - CpuSet(gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 160); + CpuCopy16(gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 0x140); SetVBlankCallback(VBCB_BT_Phase2BlackDoodles); ++task->tState; return TRUE; diff --git a/src/battle_util2.c b/src/battle_util2.c index b1036ef0b..e3fa1a6a7 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -85,12 +85,12 @@ void AdjustFriendshipOnBattleFaint(u8 battlerId) if (gBattleMons[opposingBattlerId].level > gBattleMons[battlerId].level) { if (gBattleMons[opposingBattlerId].level - gBattleMons[battlerId].level > 29) - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 9); + AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_LARGE); else - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 7); + AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_SMALL); } else { - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 7); + AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_SMALL); } } diff --git a/src/berry.c b/src/berry.c index d4ea0dae3..c5b8af7f8 100644 --- a/src/berry.c +++ b/src/berry.c @@ -3,10 +3,6 @@ #include "text.h" #include "constants/items.h" -#if !defined(NONMATCHING) && MODERN -#define static -#endif - static const u8 sBerryDescriptionPart1_Cheri[] = _("とても かわいい はなが さく."); static const u8 sBerryDescriptionPart2_Cheri[] = _("まっかな みは とても からい."); static const u8 sBerryDescriptionPart1_Chesto[] = _("そとの かわの ぶぶんも なかみも すべてが"); @@ -925,7 +921,7 @@ const struct BerryTree gBlankBerryTree = {}; berries[ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX]; \ }) -void sub_809C718(void) +void InitEnigmaBerry(void) { s32 i; @@ -937,96 +933,39 @@ void sub_809C718(void) gSaveBlock1Ptr->enigmaBerry.checksum = GetEnigmaBerryChecksum(&gSaveBlock1Ptr->enigmaBerry); } -void sub_809C794(void) +void ClearEnigmaBerries(void) { CpuFill16(0, &gSaveBlock1Ptr->enigmaBerry, sizeof(gSaveBlock1Ptr->enigmaBerry)); - sub_809C718(); + InitEnigmaBerry(); } -#ifdef NONMATCHING +struct ReceivedEnigmaBerry +{ + struct Berry2 berry; + u8 unk_001C[0x4FA]; + u8 itemEffect[18]; + u8 holdEffect; + u8 holdEffectParam; +}; + void SetEnigmaBerry(u8 * berry) { struct EnigmaBerry * enigmaBerry; + struct ReceivedEnigmaBerry * src2; + s32 i; - sub_809C794(); - - { - const struct Berry2 * src = (const struct Berry2 *)berry; - struct Berry2 * dest = &gSaveBlock1Ptr->enigmaBerry.berry; - *dest = *src; - } + ClearEnigmaBerries(); + src2 = (struct ReceivedEnigmaBerry *)berry; enigmaBerry = &gSaveBlock1Ptr->enigmaBerry; - { - s32 i = 0; - u8 * dest = gSaveBlock1Ptr->enigmaBerry.itemEffect; - const u8 * src = berry + 0x516; - - for (i = 0; i < 18; i++) dest[i] = src[i]; - } - enigmaBerry->holdEffect = berry[0x528]; - enigmaBerry->holdEffectParam = berry[0x529]; + + enigmaBerry->berry = src2->berry; + for (i = 0; i < 18; i++) + enigmaBerry->itemEffect[i] = src2->itemEffect[i]; + enigmaBerry->holdEffect = src2->holdEffect; + enigmaBerry->holdEffectParam = src2->holdEffectParam; enigmaBerry->checksum = GetEnigmaBerryChecksum(enigmaBerry); } -#else -NAKED -void SetEnigmaBerry(u8 * berry) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tadds r4, r0, 0\n" - "\tbl sub_809C794\n" - "\tadds r5, r4, 0\n" - "\tldr r0, _0809C824 @ =gSaveBlock1Ptr\n" - "\tldr r2, [r0]\n" - "\tldr r0, _0809C828 @ =0x000030ec\n" - "\tadds r4, r2, r0\n" - "\tadds r1, r4, 0\n" - "\tadds r0, r5, 0\n" - "\tldm r0!, {r3,r6,r7}\n" - "\tstm r1!, {r3,r6,r7}\n" - "\tldm r0!, {r3,r6,r7}\n" - "\tstm r1!, {r3,r6,r7}\n" - "\tldr r0, [r0]\n" - "\tstr r0, [r1]\n" - "\tmovs r3, 0\n" - "\tldr r0, _0809C82C @ =0x00003108\n" - "\tadds r6, r2, r0\n" - "\tldr r1, _0809C830 @ =0x00000516\n" - "\tadds r2, r5, r1\n" - "_0809C7F0:\n" - "\tadds r0, r6, r3\n" - "\tadds r1, r2, r3\n" - "\tldrb r1, [r1]\n" - "\tstrb r1, [r0]\n" - "\tadds r3, 0x1\n" - "\tcmp r3, 0x11\n" - "\tble _0809C7F0\n" - "\tmovs r3, 0xA5\n" - "\tlsls r3, 3\n" - "\tadds r0, r5, r3\n" - "\tldrb r0, [r0]\n" - "\tadds r1, r4, 0\n" - "\tadds r1, 0x2E\n" - "\tstrb r0, [r1]\n" - "\tldr r6, _0809C834 @ =0x00000529\n" - "\tadds r0, r5, r6\n" - "\tldrb r0, [r0]\n" - "\tadds r1, 0x1\n" - "\tstrb r0, [r1]\n" - "\tadds r0, r4, 0\n" - "\tbl GetEnigmaBerryChecksum\n" - "\tstr r0, [r4, 0x30]\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0809C824: .4byte gSaveBlock1Ptr\n" - "_0809C828: .4byte 0x000030ec\n" - "_0809C82C: .4byte 0x00003108\n" - "_0809C830: .4byte 0x00000516\n" - "_0809C834: .4byte 0x00000529"); -} -#endif u32 GetEnigmaBerryChecksum(struct EnigmaBerry * enigmaBerry) { diff --git a/src/bike.c b/src/bike.c index e31fd27a4..b1d39ca21 100644 --- a/src/bike.c +++ b/src/bike.c @@ -268,11 +268,11 @@ bool32 IsRunningDisallowed(u8 metatileBehavior) return TRUE; } -static bool8 MetatileBehaviorForbidsBiking(u8 r4) +static bool8 MetatileBehaviorForbidsBiking(u8 metatileBehavior) { - if (MetatileBehavior_IsMB0A(r4)) + if (MetatileBehavior_IsMB0A(metatileBehavior)) return TRUE; - if (!MetatileBehavior_ReturnFalse_9(r4)) + if (!MetatileBehavior_ReturnFalse_9(metatileBehavior)) return FALSE; if (PlayerGetZCoord() & 1) return FALSE; diff --git a/src/blend_palette.c b/src/blend_palette.c index 8cd65ae4b..f454a2a6e 100644 --- a/src/blend_palette.c +++ b/src/blend_palette.c @@ -19,7 +19,7 @@ void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) } } -void sub_8045314(u16 * palbuff, u16 blend_pal, u32 coefficient, s32 size) +void BlendPalettesAt(u16 * palbuff, u16 blend_pal, u32 coefficient, s32 size) { if (coefficient == 16) { diff --git a/src/braille_text.c b/src/braille_text.c index 9be01bf75..c58df8e8e 100644 --- a/src/braille_text.c +++ b/src/braille_text.c @@ -4,8 +4,6 @@ #include "text.h" #include "sound.h" -extern u8 gGlyphInfo[]; - static const u8 gUnknown_846FB08[] = {1, 2, 4}; static const u16 sFont6BrailleGlyphs[] = INCBIN_U16("graphics/fonts/font6.fwjpnfont"); @@ -136,7 +134,7 @@ u16 Font6Func(struct TextPrinter *textPrinter) } DecompressGlyphFont6(char_); CopyGlyphToWindow(textPrinter); - textPrinter->printerTemplate.currentX += gGlyphInfo[0x80] + textPrinter->printerTemplate.letterSpacing; + textPrinter->printerTemplate.currentX += gGlyphInfo.width + textPrinter->printerTemplate.letterSpacing; return 0; case 1: if (TextPrinterWait(textPrinter)) @@ -207,12 +205,12 @@ static void DecompressGlyphFont6(u16 glyph) const u16 *glyphs; glyphs = sFont6BrailleGlyphs + 0x100 * (glyph / 8) + 0x10 * (glyph % 8); - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20)); - DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40)); - DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo + 0x60)); - gGlyphInfo[0x80] = 0x10; - gGlyphInfo[0x81] = 0x10; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = 0x10; + gGlyphInfo.height = 0x10; } s32 GetGlyphWidthFont6(u16 font_type, bool32 isJapanese) diff --git a/src/cable_club.c b/src/cable_club.c index 039dea19c..34b023281 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -723,7 +723,7 @@ static void sub_8081624(void) void CB2_ReturnFromCableClubBattle(void) { - gBattleTypeFlags &= (u16)~BATTLE_TYPE_20; + gBattleTypeFlags &= (u16)~BATTLE_TYPE_LINK_ESTABLISHED; Overworld_ResetMapMusic(); LoadPlayerParty(); SavePlayerBag(); diff --git a/src/credits.c b/src/credits.c index 5bf2eae7f..09bdb89c2 100644 --- a/src/credits.c +++ b/src/credits.c @@ -11,6 +11,7 @@ #include "trainer_pokemon_sprites.h" #include "menu.h" #include "field_weather.h" +#include "quest_log.h" #include "constants/maps.h" #include "constants/field_weather.h" @@ -785,7 +786,7 @@ static bool32 DoOverworldMapScrollScene(UNUSED u8 unused) sCreditsMgr->subseqno++; // fallthrough case 1: - if (!Overworld_DoScrollSceneForCredits(&sCreditsMgr->ovwldseqno, sOverworldMapScenes[sCreditsMgr->whichMon], 0)) + if (!Overworld_DoScrollSceneForCredits(&sCreditsMgr->ovwldseqno, sOverworldMapScenes[sCreditsMgr->whichMon], QL_TINT_NONE)) return FALSE; CreateCreditsWindow(); SetGpuReg(REG_OFFSET_WIN0H, 0xF0); diff --git a/src/dark.c b/src/dark.c index 142366fea..e8b0b7e62 100644 --- a/src/dark.c +++ b/src/dark.c @@ -799,7 +799,7 @@ void AnimTask_MetallicShine(u8 taskId) else species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); - newSpriteId = sub_8076E34(gBattleAnimAttacker, spriteId, species); + newSpriteId = CreateCloneOfSpriteInWindowMode(gBattleAnimAttacker, spriteId, species); GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgTilemap(animBg.bgId, gMetalShineTilemap); AnimLoadCompressedBgGfx(animBg.bgId, gMetalShineGfx, animBg.tilesOffset); diff --git a/src/data/object_events/object_event_graphics_info.h b/src/data/object_events/object_event_graphics_info.h index f43e6f628..41a883b40 100644 --- a/src/data/object_events/object_event_graphics_info.h +++ b/src/data/object_events/object_event_graphics_info.h @@ -1,7 +1,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedNormal = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_8, OBJ_EVENT_PAL_TAG_10, 512, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_RedGreenNormal, gObjectEventPicTable_RedNormal, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedBike = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_8, OBJ_EVENT_PAL_TAG_10, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RedBike, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedSurf = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_8, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_RedGreenSurf, gObjectEventPicTable_RedSurf, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedItem = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_8, OBJ_EVENT_PAL_TAG_10, 256, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_RedGreenItem, gObjectEventPicTable_RedItem, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedFieldMove = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_8, OBJ_EVENT_PAL_TAG_10, 256, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_RedGreenItem, gObjectEventPicTable_RedItem, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Policeman = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_0, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Policeman, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RSBrendan = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RSBrendan, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RSMay = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RSMay, gDummySpriteAffineAnimTable}; @@ -70,7 +70,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_StrengthBoulder = const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenNormal = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_17, OBJ_EVENT_PAL_TAG_10, 512, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_RedGreenNormal, gObjectEventPicTable_GreenNormal, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenBike = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_17, OBJ_EVENT_PAL_TAG_10, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_GreenBike, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenSurf = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_17, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_RedGreenSurf, gObjectEventPicTable_GreenSurf, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenItem = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_17, OBJ_EVENT_PAL_TAG_10, 256, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_RedGreenItem, gObjectEventPicTable_GreenItem, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenFieldMove = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_17, OBJ_EVENT_PAL_TAG_10, 256, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_RedGreenItem, gObjectEventPicTable_GreenItem, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_83A45F4 = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_8, OBJ_EVENT_PAL_TAG_10, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RedBike, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RocketM = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RocketM, gDummySpriteAffineAnimTable}; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Celio = {SPRITE_INVALID_TAG, OBJ_EVENT_PAL_TAG_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Celio, gDummySpriteAffineAnimTable}; diff --git a/src/data/object_events/object_event_graphics_info_pointers.h b/src/data/object_events/object_event_graphics_info_pointers.h index 164199089..82588ba9a 100644 --- a/src/data/object_events/object_event_graphics_info_pointers.h +++ b/src/data/object_events/object_event_graphics_info_pointers.h @@ -1,14 +1,14 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedNormal; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedBike; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedSurf; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedItem; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedFieldMove; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedFish; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedVSSeeker; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RedVSSeekerBike; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenNormal; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenBike; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenSurf; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenItem; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenFieldMove; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenFish; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenVSSeeker; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GreenVSSeekerBike; @@ -156,14 +156,14 @@ const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM [OBJ_EVENT_GFX_RED_NORMAL] = &gObjectEventGraphicsInfo_RedNormal, [OBJ_EVENT_GFX_RED_BIKE] = &gObjectEventGraphicsInfo_RedBike, [OBJ_EVENT_GFX_RED_SURF] = &gObjectEventGraphicsInfo_RedSurf, - [OBJ_EVENT_GFX_RED_ITEM] = &gObjectEventGraphicsInfo_RedItem, + [OBJ_EVENT_GFX_RED_FIELD_MOVE] = &gObjectEventGraphicsInfo_RedFieldMove, [OBJ_EVENT_GFX_RED_FISH] = &gObjectEventGraphicsInfo_RedFish, [OBJ_EVENT_GFX_RED_VS_SEEKER] = &gObjectEventGraphicsInfo_RedVSSeeker, [OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE] = &gObjectEventGraphicsInfo_RedVSSeekerBike, [OBJ_EVENT_GFX_GREEN_NORMAL] = &gObjectEventGraphicsInfo_GreenNormal, [OBJ_EVENT_GFX_GREEN_BIKE] = &gObjectEventGraphicsInfo_GreenBike, [OBJ_EVENT_GFX_GREEN_SURF] = &gObjectEventGraphicsInfo_GreenSurf, - [OBJ_EVENT_GFX_GREEN_ITEM] = &gObjectEventGraphicsInfo_GreenItem, + [OBJ_EVENT_GFX_GREEN_FIELD_MOVE] = &gObjectEventGraphicsInfo_GreenFieldMove, [OBJ_EVENT_GFX_GREEN_FISH] = &gObjectEventGraphicsInfo_GreenFish, [OBJ_EVENT_GFX_GREEN_VS_SEEKER] = &gObjectEventGraphicsInfo_GreenVSSeeker, [OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE] = &gObjectEventGraphicsInfo_GreenVSSeekerBike, diff --git a/src/daycare.c b/src/daycare.c index bbd0d89a6..97190c1d6 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -1,5 +1,6 @@ #include "global.h" #include "gflib.h" +#include "data.h" #include "battle.h" #include "constants/items.h" #include "mail_data.h" @@ -1682,13 +1683,13 @@ void ScriptHatchMon(void) AddHatchedMonToParty(gSpecialVar_0x8004); } -static bool8 sub_8046E34(struct DayCare *daycare, u8 daycareId) +static bool8 BufferDayCareMonReceivedMail(struct DayCare *daycare, u8 daycareId) { u8 nick[0x20]; struct DaycareMon *daycareMon = &daycare->mons[daycareId]; DayCare_GetBoxMonNickname(&daycareMon->mon, nick); - if (daycareMon->mail.message.itemId != 0 + if (daycareMon->mail.message.itemId != ITEM_NONE && (StringCompare(nick, daycareMon->mail.monName) != 0 || StringCompare(gSaveBlock2Ptr->playerName, daycareMon->mail.OT_name) != 0)) { @@ -1702,7 +1703,7 @@ static bool8 sub_8046E34(struct DayCare *daycare, u8 daycareId) bool8 DaycareMonReceivedMail(void) { - return sub_8046E34(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004); + return BufferDayCareMonReceivedMail(&gSaveBlock1Ptr->daycare, gSpecialVar_0x8004); } extern const struct CompressedSpriteSheet gMonFrontPicTable[]; @@ -1841,7 +1842,7 @@ static void CB2_EggHatch_0(void) SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); LoadPalette(gTradeGba2_Pal, 0x10, 0xA0); LoadBgTiles(1, gTradeGba_Gfx, 0x1420, 0); - CopyToBgTilemapBuffer(1, gUnknown_826601C, 0x1000, 0); + CopyToBgTilemapBuffer(1, gTradeOrHatchMonShadowTilemap, 0x1000, 0); CopyBgTilemapBufferToVram(1); gMain.state++; break; @@ -2040,16 +2041,6 @@ static void SpriteCB_Egg_1(struct Sprite* sprite) } } -struct UnkStruct_82349CC -{ - u8 field_0; - u8 field_1; - u8 field_2; - u8 field_3; -}; - -extern const struct UnkStruct_82349CC gMonFrontPicCoords[NUM_SPECIES]; - static void SpriteCB_Egg_2(struct Sprite* sprite) { if (++sprite->data[2] > 30) @@ -2062,7 +2053,7 @@ static void SpriteCB_Egg_2(struct Sprite* sprite) sprite->data[0] = 0; species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES); gSprites[sEggHatchData->pokeSpriteID].pos2.x = 0; - gSprites[sEggHatchData->pokeSpriteID].pos2.y = gMonFrontPicCoords[species].field_1; + gSprites[sEggHatchData->pokeSpriteID].pos2.y = gMonFrontPicCoords[species].y_offset; } else { diff --git a/src/dynamic_placeholder_text_util.c b/src/dynamic_placeholder_text_util.c index eede1ae48..8167c0d2b 100644 --- a/src/dynamic_placeholder_text_util.c +++ b/src/dynamic_placeholder_text_util.c @@ -6,13 +6,13 @@ static EWRAM_DATA const u8 *sStringPointers[8] = {0}; static const u8 sTextColorTable[] = { - // [LOW_NYBBLE / 2] = 0xXY, // HIGH_NYBBLE + // [LOW_NYBBLE / 2] = 0xXY, // HIGH_NYBBLE [OBJ_EVENT_GFX_RED_NORMAL / 2] = 0x00, // OBJ_EVENT_GFX_RED_BIKE - [OBJ_EVENT_GFX_RED_SURF / 2] = 0x00, // OBJ_EVENT_GFX_RED_ITEM + [OBJ_EVENT_GFX_RED_SURF / 2] = 0x00, // OBJ_EVENT_GFX_RED_FIELD_MOVE [OBJ_EVENT_GFX_RED_FISH / 2] = 0x00, // OBJ_EVENT_GFX_RED_VS_SEEKER - [OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE / 2] = 0x10, // OBJ_EVENT_GFX_GREEN_NORMAL + [OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE / 2] = 0x10, // OBJ_EVENT_GFX_GREEN_NORMAL [OBJ_EVENT_GFX_GREEN_BIKE / 2] = 0x11, // OBJ_EVENT_GFX_GREEN_SURF - [OBJ_EVENT_GFX_GREEN_ITEM / 2] = 0x11, // OBJ_EVENT_GFX_GREEN_FISH + [OBJ_EVENT_GFX_GREEN_FIELD_MOVE / 2] = 0x11, // OBJ_EVENT_GFX_GREEN_FISH [OBJ_EVENT_GFX_GREEN_VS_SEEKER / 2] = 0x11, // OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE [OBJ_EVENT_GFX_RS_BRENDAN / 2] = 0x10, // OBJ_EVENT_GFX_RS_MAY [OBJ_EVENT_GFX_LITTLE_BOY / 2] = 0x10, // OBJ_EVENT_GFX_LITTLE_GIRL @@ -108,7 +108,7 @@ u8 *DynamicPlaceholderTextUtil_ExpandPlaceholders(u8 *dest, const u8 *src) { while (*src != EOS) { - if (*src != CHAR_SPECIAL_F7) + if (*src != CHAR_DYNAMIC_PLACEHOLDER) { *dest++ = *src++; } diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 1f9b47691..8b1dffa51 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -2002,7 +2002,7 @@ static void SetPlayerAvatarObjectEventIdAndObjectId(u8 objectEventId, u8 spriteI gPlayerAvatar.objectEventId = objectEventId; gPlayerAvatar.spriteId = spriteId; gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gObjectEvents[objectEventId].graphicsId); - SetPlayerAvatarExtraStateTransition(gObjectEvents[objectEventId].graphicsId, 0x20); + SetPlayerAvatarExtraStateTransition(gObjectEvents[objectEventId].graphicsId, PLAYER_AVATAR_FLAG_CONTROLLABLE); } void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId) @@ -2223,7 +2223,7 @@ void PatchObjectPalette(u16 paletteTag, u8 paletteSlot) u8 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag); LoadPalette(sObjectEventSpritePalettes[paletteIndex].data, 16 * paletteSlot + 0x100, 0x20); - sub_8083598(paletteSlot); + ApplyGlobalFieldPaletteTint(paletteSlot); } void PatchObjectPaletteRange(const u16 *paletteTags, u8 minSlot, u8 maxSlot) @@ -2787,7 +2787,7 @@ static bool8 MovementType_WanderAround_Step5(struct ObjectEvent *objectEvent, st static bool8 MovementType_WanderAround_Step5Duplicate(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - ObjectEventSetSingleMovement(objectEvent, sprite, sub_8063F2C(objectEvent->movementDirection)); + ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkSlowestMovementAction(objectEvent->movementDirection)); objectEvent->singleMovementActive = TRUE; sprite->data[1] = 6; return TRUE; @@ -5222,7 +5222,7 @@ u8 sub_8063F10(u32 idx) return gUnknown_83A64F6[direction]; } -dirn_to_anim(sub_8063F2C, gUnknown_83A64FB); +dirn_to_anim(GetWalkSlowestMovementAction, gUnknown_83A64FB); dirn_to_anim(GetWalkSlowMovementAction, gUnknown_83A6500); dirn_to_anim(GetWalkNormalMovementAction, gUnknown_83A6505); dirn_to_anim(GetWalkFastMovementAction, gUnknown_83A650A); @@ -5232,7 +5232,7 @@ dirn_to_anim(GetWalkFastestMovementAction, gUnknown_83A6519); dirn_to_anim(GetSlideMovementAction, gUnknown_83A651E); dirn_to_anim(GetPlayerRunMovementAction, gUnknown_83A6523); dirn_to_anim(GetPlayerRunSlowMovementAction, gUnknown_83A6528); -dirn_to_anim(sub_80640E4, gUnknown_83A652D); +dirn_to_anim(GetSpinMovementAction, gUnknown_83A652D); dirn_to_anim(GetJump2MovementAction, gUnknown_83A6532); dirn_to_anim(GetJumpInPlaceMovementAction, gUnknown_83A6537); dirn_to_anim(GetJumpInPlaceTurnAroundMovementAction, gUnknown_83A653C); @@ -5328,7 +5328,7 @@ static void ObjectEventSetSingleMovement(struct ObjectEvent *objectEvent, struct if (gQuestLogPlaybackState == 2) { - sub_81124EC(objectEvent->localId, objectEvent->mapNum, objectEvent->mapGroup, animId); + QuestLogRecordNPCStep(objectEvent->localId, objectEvent->mapNum, objectEvent->mapGroup, animId); } } diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 572c6af6b..ca5453d7d 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -56,7 +56,7 @@ static bool8 TryStartMiscWalkingScripts(u16 metatileBehavior); static bool8 TryStartStepCountScript(u16 metatileBehavior); static void UpdateHappinessStepCounter(void); static bool8 UpdatePoisonStepCounter(void); -static bool8 CheckStandardWildEncounter(u32 encounter); +static bool8 CheckStandardWildEncounter(u32 metatileAttributes); static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); static void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection); static u8 GetFacingSignpostType(u16 metatileBehvaior, u8 direction); @@ -105,11 +105,11 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) { if (GetPlayerSpeed() != 4) { - if ((newKeys & START_BUTTON) && !(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FISHING)) + if ((newKeys & START_BUTTON) && !(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED)) input->pressedStartButton = TRUE; if (!QL_IS_PLAYBACK_STATE) { - if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FISHING)) + if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED)) { if (newKeys & SELECT_BUTTON) input->pressedSelectButton = TRUE; @@ -195,12 +195,12 @@ int ProcessPlayerFieldInput(struct FieldInput *input) struct MapPosition position; u8 playerDirection; u16 metatileBehavior; - u32 r8; + u32 metatileAttributes; ResetFacingNpcOrSignPostVars(); playerDirection = GetPlayerFacingDirection(); GetPlayerPosition(&position); - r8 = MapGridGetMetatileAttributeAt(position.x, position.y, 0xFF); + metatileAttributes = MapGridGetMetatileAttributeAt(position.x, position.y, 0xFF); metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); FieldClearPlayerInput(&gInputToStoreInQuestLogMaybe); @@ -241,7 +241,7 @@ int ProcessPlayerFieldInput(struct FieldInput *input) metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); } } - if (input->checkStandardWildEncounter && CheckStandardWildEncounter(r8) == TRUE) + if (input->checkStandardWildEncounter && CheckStandardWildEncounter(metatileAttributes) == TRUE) { gInputToStoreInQuestLogMaybe.checkStandardWildEncounter = TRUE; return TRUE; @@ -520,57 +520,57 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me if (MetatileBehavior_IsRegionMap(metatileBehavior) == TRUE) return EventScript_WallTownMap; if (MetatileBehavior_IsBookshelf(metatileBehavior) == TRUE) - return gUnknown_81A7606; + return EventScript_Bookshelf; if (MetatileBehavior_IsPokeMartShelf(metatileBehavior) == TRUE) - return gUnknown_81A760F; + return EventScript_PokeMartShelf; if (MetatileBehavior_IsFood(metatileBehavior) == TRUE) - return gUnknown_81A7618; + return EventScript_Food; if (MetatileBehavior_IsImpressiveMachine(metatileBehavior) == TRUE) - return gUnknown_81A7633; + return EventScript_ImpressiveMachine; if (MetatileBehavior_IsBlueprints(metatileBehavior) == TRUE) - return gUnknown_81A763C; + return EventScript_Blueprints; if (MetatileBehavior_IsVideoGame(metatileBehavior) == TRUE) - return gUnknown_81A7621; + return EventScript_VideoGame; if (MetatileBehavior_IsBurglary(metatileBehavior) == TRUE) - return gUnknown_81A7645; + return EventScript_Burglary; if (MetatileBehavior_IsComputer(metatileBehavior) == TRUE) - return gUnknown_81A762A; - if (MetatileBehavior_IsMBA3(metatileBehavior) == TRUE) + return EventScript_Computer; + if (MetatileBehavior_IsTrainerTowerMonitor(metatileBehavior) == TRUE) return TrainerTower_EventScript_ShowTime; if (MetatileBehavior_IsPlayerFacingTVScreen(metatileBehavior, direction) == TRUE) - return gUnknown_81A764E; + return EventScript_PlayerFacingTVScreen; if (MetatileBehavior_IsCabinet(metatileBehavior) == TRUE) - return gUnknown_81A7657; + return EventScript_Cabinet; if (MetatileBehavior_IsKitchen(metatileBehavior) == TRUE) - return gUnknown_81A7660; + return EventScript_Kitchen; if (MetatileBehavior_IsDresser(metatileBehavior) == TRUE) - return gUnknown_81A7669; + return EventScript_Dresser; if (MetatileBehavior_IsSnacks(metatileBehavior) == TRUE) - return gUnknown_81A7672; + return EventScript_Snacks; if (MetatileBehavior_IsPainting(metatileBehavior) == TRUE) - return gUnknown_81A767B; + return EventScript_Painting; if (MetatileBehavior_IsPowerPlantMachine(metatileBehavior) == TRUE) - return gUnknown_81A7684; + return EventScript_PowerPlantMachine; if (MetatileBehavior_IsTelephone(metatileBehavior) == TRUE) - return gUnknown_81A768D; + return EventScript_Telephone; if (MetatileBehavior_IsAdvertisingPoster(metatileBehavior) == TRUE) - return gUnknown_81A7696; + return EventScript_AdvertisingPoster; if (MetatileBehavior_IsTastyFood(metatileBehavior) == TRUE) - return gUnknown_81A769F; + return EventScript_TastyFood; if (MetatileBehavior_IsTrashBin(metatileBehavior) == TRUE) - return gUnknown_81A76A8; + return EventScript_TrashBin; if (MetatileBehavior_IsCup(metatileBehavior) == TRUE) - return gUnknown_81A76B1; - if (MetatileBehavior_ReturnFalse_19(metatileBehavior) == TRUE) - return gUnknown_81A76BA; - if (MetatileBehavior_ReturnFalse_20(metatileBehavior) == TRUE) - return gUnknown_81A76C3; + return EventScript_Cup; + if (MetatileBehavior_IsPolishedWindow(metatileBehavior) == TRUE) + return EventScript_PolishedWindow; + if (MetatileBehavior_IsBeautifulSkyWindow(metatileBehavior) == TRUE) + return EventScript_BeautifulSkyWindow; if (MetatileBehavior_IsBlinkingLights(metatileBehavior) == TRUE) - return gUnknown_81A76CC; - if (MetatileBehavior_IsMB9F(metatileBehavior) == TRUE) - return gUnknown_81A76D5; - if (MetatileBehavior_IsPlayerFacingMB_8D(metatileBehavior, direction) == TRUE) - return CableClub_EventScript_81BBFD8; + return EventScript_BlinkingLights; + if (MetatileBehavior_IsNeatlyLinedUpTools(metatileBehavior) == TRUE) + return EventScript_NeatlyLinedUpTools; + if (MetatileBehavior_IsPlayerFacingCableClubWirelessMonitor(metatileBehavior, direction) == TRUE) + return CableClub_EventScript_ShowWirelessCommunicationScreen; if (MetatileBehavior_IsQuestionnaire(metatileBehavior) == TRUE) return EventScript_Questionnaire; if (MetatileBehavior_IsPlayerFacingBattleRecords(metatileBehavior, direction) == TRUE) @@ -625,7 +625,7 @@ static bool8 TryStartStepBasedScript(struct MapPosition *position, u16 metatileB return TRUE; if (TryStartStepCountScript(metatileBehavior) == TRUE) return TRUE; - if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FISHING) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior) && UpdateRepelCounter() == TRUE) + if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior) && UpdateRepelCounter() == TRUE) return TRUE; return FALSE; } @@ -655,7 +655,7 @@ static bool8 TryStartStepCountScript(u16 metatileBehavior) UpdateHappinessStepCounter(); - if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FISHING) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior)) + if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior)) { if (UpdateVsSeekerStepCounter() == TRUE) { @@ -737,37 +737,37 @@ void RestartWildEncounterImmunitySteps(void) ResetEncounterRateModifiers(); } -static bool8 CheckStandardWildEncounter(u32 encounter) +static bool8 CheckStandardWildEncounter(u32 metatileAttributes) { - return TryStandardWildEncounter(encounter); + return TryStandardWildEncounter(metatileAttributes); } static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection) { - u8 r4; + u8 signpostType; const u8 * script; if (JOY_HELD(DPAD_LEFT | DPAD_RIGHT)) return FALSE; if (playerDirection == DIR_EAST || playerDirection == DIR_WEST) return FALSE; - r4 = GetFacingSignpostType(metatileBehavior, playerDirection); - if (r4 == SIGNPOST_POKECENTER) + signpostType = GetFacingSignpostType(metatileBehavior, playerDirection); + if (signpostType == SIGNPOST_POKECENTER) { SetUpWalkIntoSignScript(EventScript_PokecenterSign, playerDirection); return TRUE; } - else if (r4 == SIGNPOST_POKEMART) + else if (signpostType == SIGNPOST_POKEMART) { SetUpWalkIntoSignScript(EventScript_PokemartSign, playerDirection); return TRUE; } - else if (r4 == SIGNPOST_INDIGO_1) + else if (signpostType == SIGNPOST_INDIGO_1) { SetUpWalkIntoSignScript(EventScript_Indigo_UltimateGoal, playerDirection); return TRUE; } - else if (r4 == SIGNPOST_INDIGO_2) + else if (signpostType == SIGNPOST_INDIGO_2) { SetUpWalkIntoSignScript(EventScript_Indigo_HighestAuthority, playerDirection); return TRUE; @@ -777,7 +777,7 @@ static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u16 m script = GetSignpostScriptAtMapPosition(position); if (script == NULL) return FALSE; - if (r4 != SIGNPOST_SCRIPTED) + if (signpostType != SIGNPOST_SCRIPTED) return FALSE; SetUpWalkIntoSignScript(script, playerDirection); return TRUE; diff --git a/src/field_effect.c b/src/field_effect.c index a5533c466..5942e68fd 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -422,9 +422,9 @@ static void FieldEffectScript_LoadTiles(const u8 **script) *script += sizeof(u32); } -void sub_8083598(u8 paletteIdx) +void ApplyGlobalFieldPaletteTint(u8 paletteIdx) { - switch (gUnknown_2036E28) + switch (gGlobalFieldTintMode) { case 0: return; @@ -435,7 +435,7 @@ void sub_8083598(u8 paletteIdx) TintPalette_SepiaTone(&gPlttBufferUnfaded[(paletteIdx + 16) * 16], 0x10); break; case 3: - sub_8111F38((paletteIdx + 16) * 16, 0x10); + QuestLog_BackUpPalette((paletteIdx + 16) * 16, 0x10); TintPalette_GrayScale(&gPlttBufferUnfaded[(paletteIdx + 16) * 16], 0x10); break; default: @@ -450,7 +450,7 @@ static void FieldEffectScript_LoadFadedPal(const u8 **script) u8 idx = IndexOfSpritePaletteTag(spritePalette->tag); LoadSpritePalette(spritePalette); if (idx == 0xFF) - sub_8083598(IndexOfSpritePaletteTag(spritePalette->tag)); + ApplyGlobalFieldPaletteTint(IndexOfSpritePaletteTag(spritePalette->tag)); UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(spritePalette->tag)); *script += sizeof(u32); } @@ -461,7 +461,7 @@ static void FieldEffectScript_LoadPal(const u8 **script) u8 idx = IndexOfSpritePaletteTag(spritePalette->tag); LoadSpritePalette(spritePalette); if (idx != 0xFF) - sub_8083598(IndexOfSpritePaletteTag(spritePalette->tag)); + ApplyGlobalFieldPaletteTint(IndexOfSpritePaletteTag(spritePalette->tag)); *script += sizeof(u32); } @@ -1293,7 +1293,7 @@ static bool8 EscalatorWarpEffect_1(struct Task * task) FreezeObjectEvents(); CameraObjectReset2(); StartEscalator(task->data[1]); - sub_81128BC(1); + QuestLog_OnEscalatorWarp(QL_ESCALATOR_OUT); task->data[0]++; return FALSE; } @@ -1534,7 +1534,7 @@ static bool8 EscalatorWarpInEffect_7(struct Task * task) UnfreezeObjectEvents(); ObjectEventSetHeldMovement(objectEvent, GetWalkNormalMovementAction(DIR_EAST)); DestroyTask(FindTaskIdByFunc(Task_EscalatorWarpInFieldEffect)); - sub_81128BC(2); + QuestLog_OnEscalatorWarp(QL_ESCALATOR_IN); } return FALSE; } @@ -1600,7 +1600,7 @@ static bool8 waterfall_2_wait_anim_finish_probably(struct Task * task, struct Ob static bool8 waterfall_3_move_player_probably(struct Task * task, struct ObjectEvent * playerObj) { - ObjectEventSetHeldMovement(playerObj, sub_8063F2C(DIR_NORTH)); + ObjectEventSetHeldMovement(playerObj, GetWalkSlowestMovementAction(DIR_NORTH)); task->data[0]++; return FALSE; } @@ -2907,7 +2907,7 @@ static void UseSurfEffect_1(struct Task * task) ScriptContext2_Enable(); FreezeObjectEvents(); gPlayerAvatar.preventStep = TRUE; - SetPlayerAvatarStateMask(8); + SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING); PlayerGetDestCoords(&task->data[1], &task->data[2]); MoveCoords(gObjectEvents[gPlayerAvatar.objectEventId].movementDirection, &task->data[1], &task->data[2]); task->data[0]++; @@ -2919,7 +2919,7 @@ static void UseSurfEffect_2(struct Task * task) objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (!ObjectEventIsMovementOverridden(objectEvent) || ObjectEventClearHeldMovementIfFinished(objectEvent)) { - sub_805CB70(); + StartPlayerAvatarSummonMonForFieldMoveAnim(); ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); task->data[0]++; } @@ -2943,7 +2943,7 @@ static void UseSurfEffect_4(struct Task * task) if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) { objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(2)); + ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); ObjectEventClearHeldMovementIfFinished(objectEvent); ObjectEventSetHeldMovement(objectEvent, sub_80641C0(objectEvent->movementDirection)); gFieldEffectArguments[0] = task->data[1]; @@ -2961,7 +2961,7 @@ static void UseSurfEffect_5(struct Task * task) if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { gPlayerAvatar.preventStep = FALSE; - gPlayerAvatar.flags &= 0xdf; + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_CONTROLLABLE; ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->movementDirection)); sub_80DC44C(objectEvent->fieldEffectSpriteId, 1); UnfreezeObjectEvents(); @@ -2988,7 +2988,7 @@ static void (*const sUseVsSeekerEffectFuncs[])(struct Task * task) = { u32 FldEff_UseVsSeeker(void) { if (gQuestLogState == QL_STATE_RECORDING) - sub_811278C(8, 89); + QuestLogRecordPlayerAvatarGfxTransitionWithDuration(8, 89); CreateTask(Task_FldEffUseVsSeeker, 0xFF); return 0; } @@ -3011,7 +3011,7 @@ static void UseVsSeekerEffect_2(struct Task * task) struct ObjectEvent * playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; if (!ObjectEventIsMovementOverridden(playerObj) || ObjectEventClearHeldMovementIfFinished(playerObj)) { - sub_805CBE8(); + StartPlayerAvatarVsSeekerAnim(); ObjectEventSetHeldMovement(playerObj, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); task->data[0]++; } @@ -3023,11 +3023,11 @@ static void UseVsSeekerEffect_3(struct Task * task) if (ObjectEventClearHeldMovementIfFinished(playerObj)) { if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_ACRO_BIKE | PLAYER_AVATAR_FLAG_MACH_BIKE)) - ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(1)); + ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_BIKE)); else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(2)); + ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); else - ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(0)); + ObjectEventSetGraphicsId(playerObj, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL)); ObjectEventForceSetHeldMovement(playerObj, GetFaceDirectionMovementAction(playerObj->facingDirection)); task->data[0]++; } @@ -3131,8 +3131,8 @@ static void UseFlyEffect_1(struct Task * task) { task->data[15] = gPlayerAvatar.flags; gPlayerAvatar.preventStep = TRUE; - SetPlayerAvatarStateMask(1); - sub_805CB70(); + SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT); + StartPlayerAvatarSummonMonForFieldMoveAnim(); ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); task->data[0]++; } @@ -3191,7 +3191,7 @@ static void UseFlyEffect_6(struct Task * task) if ((++task->data[2]) >= 8) { struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(2)); + ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); StartSpriteAnim(&gSprites[objectEvent->spriteId], 0x16); objectEvent->inanimate = TRUE; ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT); @@ -3437,12 +3437,12 @@ static void FlyInEffect_1(struct Task * task) task->data[2] = 33; task->data[15] = gPlayerAvatar.flags; gPlayerAvatar.preventStep = TRUE; - SetPlayerAvatarStateMask(0x01); - if (task->data[15] & 0x08) + SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT); + if (task->data[15] & PLAYER_AVATAR_FLAG_SURFING) { sub_80DC44C(objectEvent->fieldEffectSpriteId, 0); } - ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(2)); + ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); CameraObjectReset2(); ObjectEventTurn(objectEvent, DIR_WEST); StartSpriteAnim(&gSprites[objectEvent->spriteId], 0x16); @@ -3518,7 +3518,7 @@ static void FlyInEffect_4(struct Task * task) sprite->pos2.x = 0; sprite->pos2.y = 0; sprite->coordOffsetEnabled = TRUE; - sub_805CB70(); + StartPlayerAvatarSummonMonForFieldMoveAnim(); ObjectEventSetHeldMovement(objectEvent, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); task->data[0]++; } @@ -3550,10 +3550,10 @@ static void FlyInEffect_7(struct Task * task) if ((--task->data[1]) == 0) { objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - state = 0; - if (task->data[15] & 0x08) + state = PLAYER_AVATAR_GFX_NORMAL; + if (task->data[15] & PLAYER_AVATAR_FLAG_SURFING) { - state = 2; + state = PLAYER_AVATAR_GFX_RIDE; sub_80DC44C(objectEvent->fieldEffectSpriteId, 1); } ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(state)); diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index d86811ca8..a03add123 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -26,13 +26,13 @@ #include "constants/metatile_behaviors.h" #include "constants/moves.h" -static EWRAM_DATA struct ObjectEvent * gUnknown_2036E30 = NULL; +static EWRAM_DATA struct ObjectEvent * sPlayerObjectPtr = NULL; static EWRAM_DATA u8 sTeleportSavedFacingDirection = DIR_NONE; EWRAM_DATA struct ObjectEvent gObjectEvents[OBJECT_EVENTS_COUNT] = {}; EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {}; static u8 ObjectEventCB2_NoMovement2(struct ObjectEvent * object, struct Sprite * sprite); -static bool8 sub_805B528(void); +static bool8 TryUpdatePlayerSpinDirection(void); static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent * playerObjEvent, u8 direction); static void npc_clear_strange_bits(struct ObjectEvent * playerObjEvent); static bool8 TryDoMetatileBehaviorForcedMovement(void); @@ -78,17 +78,17 @@ static void PlayerAvatarTransition_ReturnToField(struct ObjectEvent * playerObje static bool8 PlayerIsAnimActive(void); static bool8 PlayerCheckIfAnimFinishedOrInactive(void); static bool8 player_is_anim_in_certain_ranges(void); -static bool8 sub_805BF58(void); +static bool8 player_is_anim_in_certain_ranges__running_state_not_turn(void); static void PlayCollisionSoundIfNotFacingWarp(u8 direction); static void PlayerGoSpin(u8 direction); -static void sub_805C2CC(u8 metatileBehavior); +static void PlayerApplyTileForcedMovement(u8 metatileBehavior); static bool8 MetatileAtCoordsIsWaterTile(s16 x, s16 y); -static void sub_805CC40(struct ObjectEvent * playerObjEvent); +static void HandleWarpArrowSpriteHideShow(struct ObjectEvent * playerObjEvent); static void StartStrengthAnim(u8 objectEventId, u8 direction); static void Task_BumpBoulder(u8 taskId); -static bool8 sub_805CD64(struct Task * task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj); -static bool8 do_boulder_dust(struct Task * task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj); -static bool8 sub_805CE20(struct Task * task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj); +static bool8 DoBoulderInit(struct Task * task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj); +static bool8 DoBoulderDust(struct Task * task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj); +static bool8 DoBoulderFinish(struct Task * task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj); static void DoPlayerMatJump(void); static void DoPlayerAvatarSecretBaseMatJump(u8 taskId); static bool8 PlayerAvatar_DoSecretBaseMatJump(struct Task * task, struct ObjectEvent * playerObj); @@ -136,8 +136,8 @@ void player_step(u8 direction, u16 newKeys, u16 heldKeys) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - sub_805CC40(playerObjEvent); - if (!gPlayerAvatar.preventStep && !sub_805B528()) + HandleWarpArrowSpriteHideShow(playerObjEvent); + if (!gPlayerAvatar.preventStep && !TryUpdatePlayerSpinDirection()) { if (!TryInterruptObjectEventSpecialAnim(playerObjEvent, direction)) { @@ -194,26 +194,26 @@ static void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 held static void PlayerAllowForcedMovementIfMovingSameDirection(void) { if (gPlayerAvatar.runningState == MOVING) - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_FIELD_MOVE; + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_CONTROLLABLE; } -static bool8 sub_805B528(void) +static bool8 TryUpdatePlayerSpinDirection(void) { - if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FISHING) && MetatileBehavior_IsSpinTile(gPlayerAvatar.lastSpinTile)) + if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED) && MetatileBehavior_IsSpinTile(gPlayerAvatar.lastSpinTile)) { - gUnknown_2036E30 = &gObjectEvents[gPlayerAvatar.objectEventId]; - if (gUnknown_2036E30->heldMovementFinished) + sPlayerObjectPtr = &gObjectEvents[gPlayerAvatar.objectEventId]; + if (sPlayerObjectPtr->heldMovementFinished) { - if (MetatileBehavior_IsStopSpinning(gUnknown_2036E30->currentMetatileBehavior)) + if (MetatileBehavior_IsStopSpinning(sPlayerObjectPtr->currentMetatileBehavior)) { return FALSE; } - if (MetatileBehavior_IsSpinTile(gUnknown_2036E30->currentMetatileBehavior)) + if (MetatileBehavior_IsSpinTile(sPlayerObjectPtr->currentMetatileBehavior)) { - gPlayerAvatar.lastSpinTile = gUnknown_2036E30->currentMetatileBehavior; + gPlayerAvatar.lastSpinTile = sPlayerObjectPtr->currentMetatileBehavior; } - ObjectEventClearHeldMovement(gUnknown_2036E30); - sub_805C2CC(gPlayerAvatar.lastSpinTile); + ObjectEventClearHeldMovement(sPlayerObjectPtr); + PlayerApplyTileForcedMovement(gPlayerAvatar.lastSpinTile); } return TRUE; } @@ -221,8 +221,8 @@ static bool8 sub_805B528(void) } static const struct { - bool8 (*unk0)(u8 metatileBehavior); - bool8 (*unk4)(void); + bool8 (*check)(u8 metatileBehavior); + bool8 (*apply)(void); } sForcedMovementFuncs[] = { {MetatileBehavior_IsUnknownMovement48, ForcedMovement_Slip}, {MetatileBehavior_IsIce_2, ForcedMovement_Slip}, @@ -252,37 +252,38 @@ static bool8 TryDoMetatileBehaviorForcedMovement(void) { int i; u8 behavior; - if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FIELD_MOVE)) + if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_CONTROLLABLE)) { behavior = gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior; - for (i = 0; sForcedMovementFuncs[i].unk0 != NULL; i++) + for (i = 0; sForcedMovementFuncs[i].check != NULL; i++) { - if (sForcedMovementFuncs[i].unk0(behavior)) + if (sForcedMovementFuncs[i].check(behavior)) { gPlayerAvatar.lastSpinTile = behavior; - return sForcedMovementFuncs[i].unk4(); + return sForcedMovementFuncs[i].apply(); } } - return sForcedMovementFuncs[i].unk4(); + return sForcedMovementFuncs[i].apply(); } else { - for (i = 0; sForcedMovementFuncs[i].unk0 != NULL; i++) + // Calls ForcedMovement_None but with extra steps + for (i = 0; sForcedMovementFuncs[i].check != NULL; i++) ; - return sForcedMovementFuncs[i].unk4(); + return sForcedMovementFuncs[i].apply(); } } static bool8 ForcedMovement_None(void) { - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FISHING) + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; playerObjEvent->facingDirectionLocked = FALSE; playerObjEvent->enableAnim = TRUE; SetObjectEventDirection(playerObjEvent, playerObjEvent->facingDirection); - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_FISHING; + gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_FORCED; } return FALSE; } @@ -292,7 +293,7 @@ static u8 DoForcedMovement(u8 direction, MovementAction movementAction) struct PlayerAvatar *playerAvatar = &gPlayerAvatar; u8 collision = CheckForPlayerAvatarCollision(direction); - playerAvatar->flags |= PLAYER_AVATAR_FLAG_FISHING; + playerAvatar->flags |= PLAYER_AVATAR_FLAG_FORCED; if (collision) { ForcedMovement_None(); @@ -304,7 +305,7 @@ static u8 DoForcedMovement(u8 direction, MovementAction movementAction) { if (collision == COLLISION_LEDGE_JUMP) PlayerJumpLedge(direction); - playerAvatar->flags |= PLAYER_AVATAR_FLAG_FISHING; + playerAvatar->flags |= PLAYER_AVATAR_FLAG_FORCED; playerAvatar->runningState = MOVING; return 1; } @@ -581,12 +582,12 @@ u8 CheckForObjectEventCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u return collision; } -static const u8 gUnknown_835B820[] = { - MOVEMENT_ACTION_FACE_DOWN_FAST, - MOVEMENT_ACTION_FACE_DOWN_FAST, - MOVEMENT_ACTION_FACE_UP_FAST, - MOVEMENT_ACTION_FACE_LEFT_FAST, - MOVEMENT_ACTION_FACE_RIGHT_FAST +static const u8 sQuestLogSurfDismountActionIds[] = { + QL_PLAYER_GFX_STOP_SURF_S, + QL_PLAYER_GFX_STOP_SURF_S, + QL_PLAYER_GFX_STOP_SURF_N, + QL_PLAYER_GFX_STOP_SURF_W, + QL_PLAYER_GFX_STOP_SURF_E }; static bool8 CanStopSurfing(s16 x, s16 y, u8 direction) @@ -595,7 +596,7 @@ static bool8 CanStopSurfing(s16 x, s16 y, u8 direction) && MapGridGetZCoordAt(x, y) == 3 && GetObjectEventIdByXYZ(x, y, 3) == OBJECT_EVENTS_COUNT) { - sub_811278C(gUnknown_835B820[direction], 16); + QuestLogRecordPlayerAvatarGfxTransitionWithDuration(sQuestLogSurfDismountActionIds[direction], 16); CreateStopSurfingTask(direction); return TRUE; } @@ -641,7 +642,7 @@ static bool8 TryPushBoulder(s16 x, s16 y, u8 direction) } } -static bool8 (*const gUnknown_835B828[])(u8) = { +static bool8 (*const sAcroBikeTrickMetatiles[])(u8) = { MetatileBehavior_IsBumpySlope, MetatileBehavior_IsIsolatedVerticalRail, MetatileBehavior_IsIsolatedHorizontalRail, @@ -649,7 +650,7 @@ static bool8 (*const gUnknown_835B828[])(u8) = { MetatileBehavior_IsHorizontalRail }; -static const u8 gUnknown_835B83C[] = { +static const u8 sAcroBikeTrickCollisionTypes[] = { COLLISION_WHEELIE_HOP, COLLISION_ISOLATED_VERTICAL_RAIL, COLLISION_ISOLATED_HORIZONTAL_RAIL, @@ -661,11 +662,11 @@ static void CheckAcroBikeCollision(s16 x, s16 y, u8 metatileBehavior, u8 *collis { u8 i; - for (i = 0; i < NELEMS(gUnknown_835B828); i++) + for (i = 0; i < NELEMS(sAcroBikeTrickMetatiles); i++) { - if (gUnknown_835B828[i](metatileBehavior)) + if (sAcroBikeTrickMetatiles[i](metatileBehavior)) { - *collision = gUnknown_835B83C[i]; + *collision = sAcroBikeTrickCollisionTypes[i]; return; } } @@ -677,15 +678,15 @@ void SetPlayerAvatarTransitionFlags(u16 flags) DoPlayerAvatarTransition(); } -static void (*const gUnknown_835B844[])(struct ObjectEvent *) = { - [PLAYER_AVATAR_STATE_NORMAL] = PlayerAvatarTransition_Normal, - [PLAYER_AVATAR_STATE_MACH_BIKE] = PlayerAvatarTransition_Bike, - [PLAYER_AVATAR_STATE_ACRO_BIKE] = PlayerAvatarTransition_Bike, - [PLAYER_AVATAR_STATE_SURFING] = PlayerAvatarTransition_Surfing, - [PLAYER_AVATAR_STATE_UNDERWATER] = PlayerAvatarTransition_Underwater, - [PLAYER_AVATAR_STATE_FIELD_MOVE] = PlayerAvatarTransition_ReturnToField, - [PLAYER_AVATAR_STATE_FISHING] = PlayerAvatarTransition_Dummy, - [PLAYER_AVATAR_STATE_WATERING] = PlayerAvatarTransition_Dummy +static void (*const sPlayerAvatarTransitionFuncs[])(struct ObjectEvent *) = { + [PLAYER_AVATAR_STATE_NORMAL] = PlayerAvatarTransition_Normal, + [PLAYER_AVATAR_STATE_MACH_BIKE] = PlayerAvatarTransition_Bike, + [PLAYER_AVATAR_STATE_ACRO_BIKE] = PlayerAvatarTransition_Bike, + [PLAYER_AVATAR_STATE_SURFING] = PlayerAvatarTransition_Surfing, + [PLAYER_AVATAR_STATE_UNDERWATER] = PlayerAvatarTransition_Underwater, + [PLAYER_AVATAR_STATE_CONTROLLABLE] = PlayerAvatarTransition_ReturnToField, + [PLAYER_AVATAR_STATE_FORCED] = PlayerAvatarTransition_Dummy, + [PLAYER_AVATAR_STATE_DASH] = PlayerAvatarTransition_Dummy }; static void DoPlayerAvatarTransition(void) @@ -695,10 +696,10 @@ static void DoPlayerAvatarTransition(void) if (flags != 0) { - for (i = 0; i < NELEMS(gUnknown_835B844); i++, flags >>= 1) + for (i = 0; i < NELEMS(sPlayerAvatarTransitionFuncs); i++, flags >>= 1) { if (flags & 1) - gUnknown_835B844[i](&gObjectEvents[gPlayerAvatar.objectEventId]); + sPlayerAvatarTransitionFuncs[i](&gObjectEvents[gPlayerAvatar.objectEventId]); } gPlayerAvatar.transitionFlags = 0; } @@ -711,21 +712,21 @@ static void PlayerAvatarTransition_Dummy(struct ObjectEvent * playerObjEvent) static void PlayerAvatarTransition_Normal(struct ObjectEvent * playerObjEvent) { - sub_8150474(0); - sub_8150498(0); + QuestLogTryRecordPlayerAvatarGfxTransition(QL_PLAYER_GFX_NORMAL); + QuestLogCallUpdatePlayerSprite(QL_PLAYER_GFX_NORMAL); } static void PlayerAvatarTransition_Bike(struct ObjectEvent * playerObjEvent) { - sub_8150474(1); - sub_8150498(1); + QuestLogTryRecordPlayerAvatarGfxTransition(QL_PLAYER_GFX_BIKE); + QuestLogCallUpdatePlayerSprite(QL_PLAYER_GFX_BIKE); InitPlayerAvatarBikeState(0, 0); } static void PlayerAvatarTransition_Surfing(struct ObjectEvent * playerObjEvent) { - sub_8150474(3); - sub_8150498(3); + QuestLogTryRecordPlayerAvatarGfxTransition(QL_PLAYER_GFX_SURF); + QuestLogCallUpdatePlayerSprite(QL_PLAYER_GFX_SURF); } static void PlayerAvatarTransition_Underwater(struct ObjectEvent * playerObjEvent) @@ -735,10 +736,10 @@ static void PlayerAvatarTransition_Underwater(struct ObjectEvent * playerObjEven static void PlayerAvatarTransition_ReturnToField(struct ObjectEvent * playerObjEvent) { - gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_FIELD_MOVE; + gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_CONTROLLABLE; } -void sub_805BEB8(void) +void UpdatePlayerAvatarTransitionState(void) { gPlayerAvatar.tileTransitionState = T_NOT_MOVING; if (PlayerIsAnimActive()) @@ -750,7 +751,7 @@ void sub_805BEB8(void) } else { - if (!sub_805BF58()) + if (!player_is_anim_in_certain_ranges__running_state_not_turn()) gPlayerAvatar.tileTransitionState = T_TILE_CENTER; } } @@ -770,7 +771,7 @@ static bool8 player_is_anim_in_certain_ranges(void) return FALSE; } -static bool8 sub_805BF58(void) +static bool8 player_is_anim_in_certain_ranges__running_state_not_turn(void) { if (player_is_anim_in_certain_ranges() && gPlayerAvatar.runningState != TURN_DIRECTION) return TRUE; @@ -809,25 +810,25 @@ static void PlayerSetAnimId(u8 movementActionId, u8 copyableMovement) { PlayerSetCopyableMovement(copyableMovement); if (!ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], movementActionId)) - sub_8112628(movementActionId); + QuestLogRecordPlayerStep(movementActionId); } } -static void sub_805C06C(struct ObjectEvent * objectEvent, u8 movementAction) +static void QL_TryRecordPlayerStepWithDuration0(struct ObjectEvent * objectEvent, u8 movementAction) { if (!ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], movementAction)) - sub_81126AC(movementAction, 0); + QuestLogRecordPlayerStepWithDuration(movementAction, 0); } -static void sub_805C0A4(struct ObjectEvent * objectEvent, u8 movementAction) +static void QL_TryRecordNPCStepWithDuration32(struct ObjectEvent * objectEvent, u8 movementAction) { if (!ObjectEventSetHeldMovement(objectEvent, movementAction)) - sub_8112588(objectEvent->localId, objectEvent->mapNum, objectEvent->mapGroup, movementAction, 32); + QuestLogRecordNPCStepWithDuration(objectEvent->localId, objectEvent->mapNum, objectEvent->mapGroup, movementAction, 32); } -void sub_805C0D4(u8 direction) +void PlayerGoSlowest(u8 direction) { - PlayerSetAnimId(sub_8063F2C(direction), 2); + PlayerSetAnimId(GetWalkSlowestMovementAction(direction), 2); } void PlayerGoSlow(u8 direction) @@ -919,17 +920,17 @@ void HandleEnforcedLookDirectionOnPlayerStopMoving(void) static void PlayerGoSpin(u8 direction) { - PlayerSetAnimId(sub_80640E4(direction), 3); + PlayerSetAnimId(GetSpinMovementAction(direction), 3); } -static void sub_805C2CC(u8 metatileBehavior) +static void PlayerApplyTileForcedMovement(u8 metatileBehavior) { int i; - for (i = 0; sForcedMovementFuncs[i].unk0 != NULL; i++) + for (i = 0; sForcedMovementFuncs[i].check != NULL; i++) { - if (sForcedMovementFuncs[i].unk0(metatileBehavior)) - sForcedMovementFuncs[i].unk4(); + if (sForcedMovementFuncs[i].check(metatileBehavior)) + sForcedMovementFuncs[i].apply(); } } @@ -978,12 +979,12 @@ static void PlayerAcroWheelieCollide(u8 direction) PlayerSetAnimId(GetAcroWheelieInPlaceDirectionMovementAction(direction), 2); } -static void sub_805C408(u8 direction) +static void PlayerAcroPopWheelie(u8 direction) { PlayerSetAnimId(GetAcroPopWheelieMoveDirectionMovementAction(direction), 2); } -static void sub_805C420(u8 direction) +static void PlayerAcroWheelieMove(u8 direction) { PlayerSetAnimId(GetAcroWheelieMoveDirectionMovementAction(direction), 2); } @@ -1107,7 +1108,7 @@ u8 GetPlayerAvatarObjectId(void) return gPlayerAvatar.spriteId; } -void sub_805C774(void) +void CancelPlayerForcedMovement(void) { ForcedMovement_None(); } @@ -1126,12 +1127,12 @@ void StopPlayerAvatar(void) } static const u8 sPlayerAvatarGfxIds[][GENDER_COUNT] = { - {OBJ_EVENT_GFX_RED_NORMAL, OBJ_EVENT_GFX_GREEN_NORMAL}, - {OBJ_EVENT_GFX_RED_BIKE, OBJ_EVENT_GFX_GREEN_BIKE}, - {OBJ_EVENT_GFX_RED_SURF, OBJ_EVENT_GFX_GREEN_SURF}, - {OBJ_EVENT_GFX_RED_ITEM, OBJ_EVENT_GFX_GREEN_ITEM}, - {OBJ_EVENT_GFX_RED_FISH, OBJ_EVENT_GFX_GREEN_FISH}, - {OBJ_EVENT_GFX_RED_VS_SEEKER, OBJ_EVENT_GFX_GREEN_VS_SEEKER}, + [PLAYER_AVATAR_GFX_NORMAL] = {OBJ_EVENT_GFX_RED_NORMAL, OBJ_EVENT_GFX_GREEN_NORMAL}, + [PLAYER_AVATAR_GFX_BIKE] = {OBJ_EVENT_GFX_RED_BIKE, OBJ_EVENT_GFX_GREEN_BIKE}, + [PLAYER_AVATAR_GFX_RIDE] = {OBJ_EVENT_GFX_RED_SURF, OBJ_EVENT_GFX_GREEN_SURF}, + [PLAYER_AVATAR_GFX_FIELD_MOVE] = {OBJ_EVENT_GFX_RED_FIELD_MOVE, OBJ_EVENT_GFX_GREEN_FIELD_MOVE}, + [PLAYER_AVATAR_GFX_FISH] = {OBJ_EVENT_GFX_RED_FISH, OBJ_EVENT_GFX_GREEN_FISH}, + [PLAYER_AVATAR_GFX_VSSEEKER] = {OBJ_EVENT_GFX_RED_VS_SEEKER, OBJ_EVENT_GFX_GREEN_VS_SEEKER}, }; static const u8 sHoennLinkPartnerGfxIds[] = { @@ -1166,7 +1167,7 @@ u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId) case OBJ_EVENT_GFX_GREEN_NORMAL: case OBJ_EVENT_GFX_GREEN_BIKE: case OBJ_EVENT_GFX_GREEN_SURF: - case OBJ_EVENT_GFX_GREEN_ITEM: + case OBJ_EVENT_GFX_GREEN_FIELD_MOVE: case OBJ_EVENT_GFX_GREEN_FISH: return FEMALE; default: @@ -1226,7 +1227,7 @@ void ClearPlayerAvatarInfo(void) void SetPlayerAvatarStateMask(u8 flags) { - gPlayerAvatar.flags &= (PLAYER_AVATAR_FLAG_DASH | PLAYER_AVATAR_FLAG_FISHING | PLAYER_AVATAR_FLAG_FIELD_MOVE); + gPlayerAvatar.flags &= (PLAYER_AVATAR_FLAG_DASH | PLAYER_AVATAR_FLAG_FORCED | PLAYER_AVATAR_FLAG_CONTROLLABLE); gPlayerAvatar.flags |= flags; } @@ -1258,21 +1259,21 @@ u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 graphicsId, u8 gender) u8 GetPlayerAvatarGraphicsIdByCurrentState(void) { u8 i; - u8 r5 = gPlayerAvatar.flags; + u8 flags = gPlayerAvatar.flags; for (i = 0; i < NELEMS(*sPlayerAvatarGfxToStateFlag); i++) { - if (sPlayerAvatarGfxToStateFlag[gPlayerAvatar.gender][i][1] & r5) + if (sPlayerAvatarGfxToStateFlag[gPlayerAvatar.gender][i][1] & flags) return sPlayerAvatarGfxToStateFlag[gPlayerAvatar.gender][i][0]; } return 0; } -void SetPlayerAvatarExtraStateTransition(u8 graphicsId, u8 b) +void SetPlayerAvatarExtraStateTransition(u8 graphicsId, u8 extras) { u8 unk = GetPlayerAvatarStateTransitionByGraphicsId(graphicsId, gPlayerAvatar.gender); - gPlayerAvatar.transitionFlags |= unk | b; + gPlayerAvatar.transitionFlags |= unk | extras; DoPlayerAvatarTransition(); } @@ -1283,7 +1284,7 @@ void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) struct ObjectEvent *objectEvent; playerObjEventTemplate.localId = OBJ_EVENT_ID_PLAYER; - playerObjEventTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, gender); + playerObjEventTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_GFX_NORMAL, gender); playerObjEventTemplate.x = x - 7; playerObjEventTemplate.y = y - 7; playerObjEventTemplate.elevation = 0; @@ -1305,7 +1306,7 @@ void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) gPlayerAvatar.objectEventId = objectEventId; gPlayerAvatar.spriteId = objectEvent->spriteId; gPlayerAvatar.gender = gender; - SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_FIELD_MOVE | PLAYER_AVATAR_FLAG_ON_FOOT); + SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_CONTROLLABLE | PLAYER_AVATAR_FLAG_ON_FOOT); } void SetPlayerInvisibility(bool8 invisible) @@ -1315,34 +1316,34 @@ void SetPlayerInvisibility(bool8 invisible) gSprites[gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId].invisible = invisible; } -void sub_805CB70(void) +void StartPlayerAvatarSummonMonForFieldMoveAnim(void) { - ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_SURFING)); + ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_FIELD_MOVE)); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], 0); } -static const u8 gUnknown_835B88E[] = { +static const u8 sPlayerAvatarVsSeekerBikeGfxIds[] = { OBJ_EVENT_GFX_RED_VS_SEEKER_BIKE, OBJ_EVENT_GFX_GREEN_VS_SEEKER_BIKE }; -u8 sub_805CBB8(void) +u8 GetPlayerAvatarVsSeekerGfxId(void) { if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) - return gUnknown_835B88E[gPlayerAvatar.gender]; + return sPlayerAvatarVsSeekerBikeGfxIds[gPlayerAvatar.gender]; else - return GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_FIELD_MOVE); + return GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_VSSEEKER); } -void sub_805CBE8(void) +void StartPlayerAvatarVsSeekerAnim(void) { - ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], sub_805CBB8()); + ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarVsSeekerGfxId()); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], 0); } -void sub_805CC2C(u8 direction) +void StartPlayerAvatarFishAnim(u8 direction) { - sub_8150498(2); + QuestLogCallUpdatePlayerSprite(QL_PLAYER_GFX_FISH); } void nullsub_24(u8 direction) @@ -1362,7 +1363,7 @@ static bool8 (*const sArrowWarpMetatileBehaviorChecks2[])(u8) = { MetatileBehavior_IsEastArrowWarp }; -static void sub_805CC40(struct ObjectEvent *objectEvent) +static void HandleWarpArrowSpriteHideShow(struct ObjectEvent *objectEvent) { s16 x; s16 y; @@ -1383,10 +1384,10 @@ static void sub_805CC40(struct ObjectEvent *objectEvent) SetSpriteInvisible(objectEvent->warpArrowSpriteId); } -static bool8 (*const gUnknown_835B8A0[])(struct Task * task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj) = { - sub_805CD64, - do_boulder_dust, - sub_805CE20 +static bool8 (*const sBoulderTaskSteps[])(struct Task * task, struct ObjectEvent * playerObj, struct ObjectEvent * boulderObj) = { + DoBoulderInit, + DoBoulderDust, + DoBoulderFinish }; static void StartStrengthAnim(u8 a, u8 b) @@ -1400,13 +1401,13 @@ static void StartStrengthAnim(u8 a, u8 b) static void Task_BumpBoulder(u8 taskId) { - while (gUnknown_835B8A0[gTasks[taskId].data[0]](&gTasks[taskId], + while (sBoulderTaskSteps[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gObjectEvents[gTasks[taskId].data[1]])) ; } -static bool8 sub_805CD64(struct Task *task, struct ObjectEvent *playerObject, struct ObjectEvent *strengthObject) +static bool8 DoBoulderInit(struct Task *task, struct ObjectEvent *playerObject, struct ObjectEvent *strengthObject) { ScriptContext2_Enable(); gPlayerAvatar.preventStep = TRUE; @@ -1414,15 +1415,15 @@ static bool8 sub_805CD64(struct Task *task, struct ObjectEvent *playerObject, st return FALSE; } -static bool8 do_boulder_dust(struct Task *task, struct ObjectEvent *playerObject, struct ObjectEvent *strengthObject) +static bool8 DoBoulderDust(struct Task *task, struct ObjectEvent *playerObject, struct ObjectEvent *strengthObject) { if (!ObjectEventIsMovementOverridden(playerObject) && !ObjectEventIsMovementOverridden(strengthObject)) { ObjectEventClearHeldMovementIfFinished(playerObject); ObjectEventClearHeldMovementIfFinished(strengthObject); - sub_805C06C(playerObject, GetWalkInPlaceNormalMovementAction((u8)task->data[2])); - sub_805C0A4(strengthObject, sub_8063F2C((u8)task->data[2])); + QL_TryRecordPlayerStepWithDuration0(playerObject, GetWalkInPlaceNormalMovementAction((u8)task->data[2])); + QL_TryRecordNPCStepWithDuration32(strengthObject, GetWalkSlowestMovementAction((u8)task->data[2])); gFieldEffectArguments[0] = strengthObject->currentCoords.x; gFieldEffectArguments[1] = strengthObject->currentCoords.y; gFieldEffectArguments[2] = strengthObject->previousElevation; @@ -1434,7 +1435,7 @@ static bool8 do_boulder_dust(struct Task *task, struct ObjectEvent *playerObject return FALSE; } -static bool8 sub_805CE20(struct Task *task, struct ObjectEvent *playerObject, struct ObjectEvent *strengthObject) +static bool8 DoBoulderFinish(struct Task *task, struct ObjectEvent *playerObject, struct ObjectEvent *strengthObject) { if (ObjectEventCheckHeldMovementStatus(playerObject) && ObjectEventCheckHeldMovementStatus(strengthObject)) @@ -1472,12 +1473,12 @@ static bool8 PlayerAvatar_DoSecretBaseMatJump(struct Task *task, struct ObjectEv if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { PlaySE(SE_LEDGE); - sub_805C06C(objectEvent, GetJumpInPlaceMovementAction(objectEvent->facingDirection)); + QL_TryRecordPlayerStepWithDuration0(objectEvent, GetJumpInPlaceMovementAction(objectEvent->facingDirection)); task->data[1]++; if (task->data[1] > 1) { gPlayerAvatar.preventStep = FALSE; - gPlayerAvatar.transitionFlags |= PLAYER_AVATAR_FLAG_FIELD_MOVE; + gPlayerAvatar.transitionFlags |= PLAYER_AVATAR_FLAG_CONTROLLABLE; DestroyTask(FindTaskIdByFunc(DoPlayerAvatarSecretBaseMatJump)); } } @@ -1522,7 +1523,7 @@ static bool8 PlayerAvatar_SecretBaseMatSpinStep1(struct Task *task, struct Objec { u8 direction; - sub_805C06C(objectEvent, GetFaceDirectionMovementAction(direction = directions[objectEvent->movementDirection - 1])); + QL_TryRecordPlayerStepWithDuration0(objectEvent, GetFaceDirectionMovementAction(direction = directions[objectEvent->movementDirection - 1])); if (direction == (u8)task->data[1]) task->data[2]++; task->data[0]++; @@ -1544,7 +1545,7 @@ static bool8 PlayerAvatar_SecretBaseMatSpinStep2(struct Task *task, struct Objec if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { - sub_805C06C(objectEvent, actions[task->data[2]]); + QL_TryRecordPlayerStepWithDuration0(objectEvent, actions[task->data[2]]); task->data[0] = 1; } return FALSE; @@ -1554,7 +1555,7 @@ static bool8 PlayerAvatar_SecretBaseMatSpinStep3(struct Task *task, struct Objec { if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { - sub_805C06C(objectEvent, sub_8063F2C(GetOppositeDirection(task->data[1]))); + QL_TryRecordPlayerStepWithDuration0(objectEvent, GetWalkSlowestMovementAction(GetOppositeDirection(task->data[1]))); ScriptContext2_Disable(); gPlayerAvatar.preventStep = FALSE; DestroyTask(FindTaskIdByFunc(PlayerAvatar_DoSecretBaseMatSpin)); @@ -1596,7 +1597,7 @@ void SeafoamIslandsB4F_CurrentDumpsPlayerOnLand(void) { if (gQuestLogPlaybackState != 1 && gQuestLogPlaybackState != 3) { - sub_811278C(gUnknown_835B820[DIR_NORTH], 16); + QuestLogRecordPlayerAvatarGfxTransitionWithDuration(sQuestLogSurfDismountActionIds[DIR_NORTH], 16); CreateStopSurfingTask(DIR_NORTH); } } @@ -1611,7 +1612,7 @@ static void Task_StopSurfingInit(u8 taskId) return; } sub_80DC44C(playerObjEvent->fieldEffectSpriteId, 2); - sub_805C06C(playerObjEvent, sub_80641EC((u8)gTasks[taskId].data[0])); + QL_TryRecordPlayerStepWithDuration0(playerObjEvent, sub_80641EC((u8)gTasks[taskId].data[0])); gTasks[taskId].func = Task_WaitStopSurfing; } @@ -1621,8 +1622,8 @@ static void Task_WaitStopSurfing(u8 taskId) if (ObjectEventClearHeldMovementIfFinished(playerObjEvent)) { - ObjectEventSetGraphicsId(playerObjEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_NORMAL)); - sub_805C06C(playerObjEvent, GetFaceDirectionMovementAction(playerObjEvent->facingDirection)); + ObjectEventSetGraphicsId(playerObjEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL)); + QL_TryRecordPlayerStepWithDuration0(playerObjEvent, GetFaceDirectionMovementAction(playerObjEvent->facingDirection)); gPlayerAvatar.preventStep = FALSE; ScriptContext2_Disable(); UnfreezeObjectEvents(); @@ -1674,8 +1675,8 @@ void StartFishing(u8 rod) gTasks[taskId].tFishingRod = rod; Task_Fishing(taskId); - if (sub_8150474(2) == TRUE) - sub_8112C9C(); + if (QuestLogTryRecordPlayerAvatarGfxTransition(QL_PLAYER_GFX_FISH) == TRUE) + QL_AfterRecordFishActionSuccessful(); } @@ -1705,7 +1706,7 @@ static bool8 Fishing2(struct Task *task) playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; ObjectEventClearHeldMovementIfActive(playerObjEvent); playerObjEvent->enableAnim = 1; - sub_805CC2C(playerObjEvent->facingDirection); + StartPlayerAvatarFishAnim(playerObjEvent->facingDirection); task->tStep++; return FALSE; } diff --git a/src/field_poison.c b/src/field_poison.c index d4ed5e45f..1e2a30c0c 100644 --- a/src/field_poison.c +++ b/src/field_poison.c @@ -33,7 +33,7 @@ static void FaintFromFieldPoison(u8 partyIdx) { struct Pokemon *pokemon = gPlayerParty + partyIdx; u32 status = STATUS1_NONE; - AdjustFriendship(pokemon, 8); + AdjustFriendship(pokemon, FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE); SetMonData(pokemon, MON_DATA_STATUS, &status); GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1); StringGetEnd10(gStringVar1); diff --git a/src/field_specials.c b/src/field_specials.c index 8e5c79cb1..fdb26e9e7 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -109,9 +109,9 @@ void ResetCyclingRoadChallengeData(void) u8 GetPlayerAvatarBike(void) { - if (TestPlayerAvatarFlags(4)) + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) return 1; - else if (TestPlayerAvatarFlags(2)) + else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) return 2; else return 0; @@ -1800,10 +1800,10 @@ void SetUsedPkmnCenterQuestLogEvent(void) } static const struct { - u16 grp; - u16 num; - u16 grp2; - u16 num2; + u16 inside_grp; + u16 inside_num; + u16 outside_grp; + u16 outside_num; } sInsideOutsidePairs[51] = { [QL_LOCATION_HOME] = {MAP(PALLET_TOWN_PLAYERS_HOUSE_1F), MAP(PALLET_TOWN)}, [QL_LOCATION_OAKS_LAB] = {MAP(PALLET_TOWN_PROFESSOR_OAKS_LAB), MAP(PALLET_TOWN)}, @@ -1858,85 +1858,87 @@ static const struct { [QL_LOCATION_CERULEAN_CAVE] = {MAP(CERULEAN_CAVE_1F), MAP(CERULEAN_CITY)} }; -void sub_80CC534(void) +void QuestLog_CheckDepartingIndoorsMap(void) { u8 i; for (i = 0; i < NELEMS(sInsideOutsidePairs); i++) { - if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[i].grp && gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[i].num) + if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[i].inside_grp && gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[i].inside_num) { - if (VarGet(VAR_0x404D) != QL_LOCATION_ROCKET_HIDEOUT || i != QL_LOCATION_GAME_CORNER) + if (VarGet(VAR_QL_ENTRANCE) != QL_LOCATION_ROCKET_HIDEOUT || i != QL_LOCATION_GAME_CORNER) { - VarSet(VAR_0x404D, i); - FlagSet(FLAG_0x808); + VarSet(VAR_QL_ENTRANCE, i); + FlagSet(FLAG_SYS_QL_DEPARTED); } break; } } } -void sub_80CC59C(void) +struct QuestLogDepartedData { + u8 map_section_id; + u8 entrance_id; +}; + +void QuestLog_TryRecordDepartedLocation(void) { s16 x, y; - struct { - u8 unk0; - u8 unk1; - } sp0; - u16 r5 = VarGet(VAR_0x404D); - sp0.unk0 = 0; - sp0.unk1 = 0; - if (FlagGet(FLAG_0x808)) - { - if (r5 == QL_LOCATION_VIRIDIAN_FOREST_1) + struct QuestLogDepartedData event_buffer; + u16 ql_entrance_id = VarGet(VAR_QL_ENTRANCE); + event_buffer.map_section_id = 0; + event_buffer.entrance_id = 0; + if (FlagGet(FLAG_SYS_QL_DEPARTED)) + { + if (ql_entrance_id == QL_LOCATION_VIRIDIAN_FOREST_1) { if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_NORTH_ENTRANCE))) { - sp0.unk0 = MAPSEC_ROUTE_2; + event_buffer.map_section_id = MAPSEC_ROUTE_2; if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE2_VIRIDIAN_FOREST_SOUTH_ENTRANCE)) - sp0.unk1 = r5; + event_buffer.entrance_id = ql_entrance_id; else - sp0.unk1 = r5 + 1; - SetQuestLogEvent(QL_EVENT_DEPARTED, (void *)&sp0); - FlagClear(FLAG_0x808); + event_buffer.entrance_id = ql_entrance_id + 1; + SetQuestLogEvent(QL_EVENT_DEPARTED, (void *)&event_buffer); + FlagClear(FLAG_SYS_QL_DEPARTED); return; } } - else if (r5 == QL_LOCATION_LEAGUE_GATE_1) + else if (ql_entrance_id == QL_LOCATION_LEAGUE_GATE_1) { if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE22) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE23))) { - sp0.unk0 = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[r5].grp, sInsideOutsidePairs[r5].num)->regionMapSectionId; + event_buffer.map_section_id = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[ql_entrance_id].inside_grp, sInsideOutsidePairs[ql_entrance_id].inside_num)->regionMapSectionId; if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22)) - sp0.unk1 = r5; + event_buffer.entrance_id = ql_entrance_id; else - sp0.unk1 = r5 + 1; - SetQuestLogEvent(QL_EVENT_DEPARTED, (void *)&sp0); - FlagClear(FLAG_0x808); + event_buffer.entrance_id = ql_entrance_id + 1; + SetQuestLogEvent(QL_EVENT_DEPARTED, (void *)&event_buffer); + FlagClear(FLAG_SYS_QL_DEPARTED); return; } } - if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[r5].grp2 && gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[r5].num2) + if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[ql_entrance_id].outside_grp && gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[ql_entrance_id].outside_num) { - sp0.unk0 = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[r5].grp, sInsideOutsidePairs[r5].num)->regionMapSectionId; - sp0.unk1 = r5; - if (r5 == QL_LOCATION_ROCK_TUNNEL_1) + event_buffer.map_section_id = Overworld_GetMapHeaderByGroupAndId(sInsideOutsidePairs[ql_entrance_id].inside_grp, sInsideOutsidePairs[ql_entrance_id].inside_num)->regionMapSectionId; + event_buffer.entrance_id = ql_entrance_id; + if (ql_entrance_id == QL_LOCATION_ROCK_TUNNEL_1) { PlayerGetDestCoords(&x, &y); if (x != 15 || y != 26) - sp0.unk1++; + event_buffer.entrance_id++; } - else if (r5 == QL_LOCATION_SEAFOAM_ISLANDS_1) + else if (ql_entrance_id == QL_LOCATION_SEAFOAM_ISLANDS_1) { PlayerGetDestCoords(&x, &y); if (x != 67 || y != 15) - sp0.unk1++; + event_buffer.entrance_id++; } - SetQuestLogEvent(QL_EVENT_DEPARTED, (void *)&sp0); - FlagClear(FLAG_0x808); - if (r5 == QL_LOCATION_ROCKET_HIDEOUT) + SetQuestLogEvent(QL_EVENT_DEPARTED, (void *)&event_buffer); + FlagClear(FLAG_SYS_QL_DEPARTED); + if (ql_entrance_id == QL_LOCATION_ROCKET_HIDEOUT) { - VarSet(VAR_0x404D, QL_LOCATION_GAME_CORNER); - FlagSet(FLAG_0x808); + VarSet(VAR_QL_ENTRANCE, QL_LOCATION_GAME_CORNER); + FlagSet(FLAG_SYS_QL_DEPARTED); } } } @@ -2064,7 +2066,7 @@ void RunMassageCooldownStepCounter(void) void DaisyMassageServices(void) { - AdjustFriendship(&gPlayerParty[gSpecialVar_0x8004], 6); + AdjustFriendship(&gPlayerParty[gSpecialVar_0x8004], FRIENDSHIP_EVENT_MASSAGE); VarSet(VAR_MASSAGE_COOLDOWN_STEP_COUNTER, 0); } @@ -2143,7 +2145,7 @@ void DoPokemonLeagueLightingEffect(void) LoadPalette(sEliteFourLightingPalettes[0], 0x70, 0x20); } data[1] = 0; - sub_8059948(7, 1); + Fieldmap_ApplyGlobalTintToPaletteSlot(7, 1); } } @@ -2153,7 +2155,7 @@ static void Task_RunPokemonLeagueLightingEffect(u8 taskId) if (!gPaletteFade.active && FlagGet(FLAG_TEMP_2) != FALSE && FlagGet(FLAG_TEMP_5) != TRUE - && gUnknown_2036E28 != 3 + && gGlobalFieldTintMode != QL_TINT_BACKUP_GRAYSCALE && --data[0] == 0 ) { @@ -2170,7 +2172,7 @@ static void Task_RunPokemonLeagueLightingEffect(u8 taskId) data[0] = sEliteFourLightingTimers[data[1]]; LoadPalette(sEliteFourLightingPalettes[data[1]], 0x70, 0x20); } - sub_8059948(7, 1); + Fieldmap_ApplyGlobalTintToPaletteSlot(7, 1); } } @@ -2187,7 +2189,7 @@ static void Task_CancelPokemonLeagueLightingEffect(u8 taskId) { LoadPalette(sEliteFourLightingPalettes[11], 0x70, 0x20); } - sub_8059948(7, 1); + Fieldmap_ApplyGlobalTintToPaletteSlot(7, 1); if (gPaletteFade.active) { BlendPalettes(0x00000080, 16, RGB_BLACK); @@ -2400,7 +2402,7 @@ static void MoveDeoxysObject(u8 num) { u8 mapObjId; LoadPalette(sDeoxysObjectPals[num], 0x1A0, 0x08); - sub_8083598(10); + ApplyGlobalFieldPaletteTint(10); TryGetObjectEventIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjId); if (num == 0) PlaySE(SE_M_CONFUSE_RAY); @@ -2446,7 +2448,7 @@ void SetDeoxysTrianglePalette(void) { u8 num = VarGet(VAR_DEOXYS_INTERACTION_NUM); LoadPalette(sDeoxysObjectPals[num], 0x1A0, 0x08); - sub_8083598(10); + ApplyGlobalFieldPaletteTint(10); } bool8 IsBadEggInParty(void) @@ -2481,7 +2483,7 @@ void BrailleCursorToggle(void) if (gSpecialVar_0x8006 == 0) sBrailleTextCursorSpriteID = CreateTextCursorSpriteForOakSpeech(0, x, gSpecialVar_0x8005, 0, 0); else - sub_8006398(sBrailleTextCursorSpriteID); + DestroyTextCursorSprite(sBrailleTextCursorSpriteID); } } diff --git a/src/field_weather.c b/src/field_weather.c index b097524bc..e36f1a23c 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -43,7 +43,7 @@ struct WeatherCallbacks static EWRAM_DATA struct Weather sWeather = {}; static EWRAM_DATA u8 sFieldEffectPaletteGammaTypes[32] = {}; static EWRAM_DATA const u8 *sPaletteGammaTypes = NULL; -static EWRAM_DATA u16 gUnknown_20386A8 = 0; +static EWRAM_DATA u16 sDroughtFrameDelay = 0; static void Task_WeatherMain(u8 taskId); static void Task_WeatherInit(u8 taskId); @@ -127,7 +127,7 @@ static const u8 sBasePaletteGammaTypes[32] = { GAMMA_NORMAL, }; -const u16 gUnknown_83C2CE0[] = INCBIN_U16("graphics/field_effects/unk_83C2CE0.gbapal"); +const u16 gDefaultWeatherSpritePalette[] = INCBIN_U16("graphics/weather/default.gbapal"); const u16 gCloudsWeatherPalette[] = INCBIN_U16("graphics/weather/cloud.gbapal"); const u16 gSandstormWeatherPalette[] = INCBIN_U16("graphics/weather/sandstorm.gbapal"); const u8 gWeatherFogDiagonalTiles[] = INCBIN_U8("graphics/weather/fog_diagonal.4bpp"); @@ -146,8 +146,8 @@ void StartWeather(void) if (!FuncIsActiveTask(Task_WeatherMain)) { u8 index = AllocSpritePalette(0x1200); - CpuCopy32(gUnknown_83C2CE0, &gPlttBufferUnfaded[0x100 + index * 16], 32); - sub_8083598(index); + CpuCopy32(gDefaultWeatherSpritePalette, &gPlttBufferUnfaded[0x100 + index * 16], 32); + ApplyGlobalFieldPaletteTint(index); BuildGammaShiftTables(); gWeatherPtr->altGammaSpritePalIndex = index; gWeatherPtr->weatherPicSpritePalIndex = index; @@ -350,8 +350,8 @@ static void UpdateWeatherGammaShift(void) static void FadeInScreenWithWeather(void) { - if (++gWeatherPtr->unknown_6CB > 1) - gWeatherPtr->unknown_6CA = 0; + if (++gWeatherPtr->fadeInCounter > 1) + gWeatherPtr->fadeInActive = 0; switch (gWeatherPtr->currWeather) { @@ -692,7 +692,7 @@ static bool8 LightenSpritePaletteInFog(u8 paletteIndex) return FALSE; } -void sub_807A790(s8 gammaIndex) +void WeatherShiftGammaIfPalStateIdle(s8 gammaIndex) { if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { @@ -701,7 +701,7 @@ void sub_807A790(s8 gammaIndex) } } -void sub_807A7C4(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) +void WeatherBeginGammaFade(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) { if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { @@ -710,7 +710,7 @@ void sub_807A7C4(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) gWeatherPtr->gammaTargetIndex = gammaTargetIndex; gWeatherPtr->gammaStepFrameCounter = 0; gWeatherPtr->gammaStepDelay = gammaStepDelay; - sub_807A790(gammaIndex); + WeatherShiftGammaIfPalStateIdle(gammaIndex); } } @@ -761,7 +761,7 @@ void FadeScreen(u8 mode, s8 delay) if (fadeOut) { if (useWeatherPal) - CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); + CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor); gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; @@ -775,8 +775,8 @@ void FadeScreen(u8 mode, s8 delay) BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor); gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; - gWeatherPtr->unknown_6CA = 1; - gWeatherPtr->unknown_6CB = 0; + gWeatherPtr->fadeInActive = 1; + gWeatherPtr->fadeInCounter = 0; Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); gWeatherPtr->readyForInit = TRUE; } @@ -843,8 +843,8 @@ void FadeSelectedPals(u8 mode, s8 delay, u32 selectedPalettes) BeginNormalPaletteFade(selectedPalettes, delay, 16, 0, fadeColor); gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; - gWeatherPtr->unknown_6CA = 1; - gWeatherPtr->unknown_6CB = 0; + gWeatherPtr->fadeInActive = 1; + gWeatherPtr->fadeInCounter = 0; Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); gWeatherPtr->readyForInit = TRUE; } @@ -864,7 +864,7 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) switch (gWeatherPtr->palProcessingState) { case WEATHER_PAL_STATE_SCREEN_FADING_IN: - if (gWeatherPtr->unknown_6CA != 0) + if (gWeatherPtr->fadeInActive != 0) { if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) MarkFogSpritePalToLighten(paletteIndex); @@ -899,10 +899,10 @@ void ApplyWeatherGammaShiftToPal(u8 paletteIndex) ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); } -static u8 sub_80ABF20(void) +static u8 IsWeatherFadingIn(void) { if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN) - return gWeatherPtr->unknown_6CA; + return gWeatherPtr->fadeInActive; else return 0; } @@ -937,51 +937,54 @@ bool8 LoadDroughtWeatherPalettes(void) return FALSE; } -static void sub_807AC50(s8 gammaIndex) +static void SetDroughtGamma(s8 gammaIndex) { - sub_807A790(-gammaIndex - 1); + WeatherShiftGammaIfPalStateIdle(-gammaIndex - 1); } -void sub_807AC60(void) +void DroughtStateInit(void) { - gWeatherPtr->unknown_73C = 0; - gWeatherPtr->unknown_740 = 0; - gWeatherPtr->unknown_742 = 0; - gWeatherPtr->unknown_73E = 0; - gUnknown_20386A8 = 5; + gWeatherPtr->droughtBrightnessStage = 0; + gWeatherPtr->droughtTimer = 0; + gWeatherPtr->droughtState = 0; + gWeatherPtr->droughtLastBrightnessStage = 0; + sDroughtFrameDelay = 5; } -void sub_807AC98(void) +void DroughtStateRun(void) { - switch (gWeatherPtr->unknown_742) + switch (gWeatherPtr->droughtState) { case 0: - if (++gWeatherPtr->unknown_740 > gUnknown_20386A8) + // Ramp up + if (++gWeatherPtr->droughtTimer > sDroughtFrameDelay) { - gWeatherPtr->unknown_740 = 0; - sub_807AC50(gWeatherPtr->unknown_73C++); - if (gWeatherPtr->unknown_73C > 5) + gWeatherPtr->droughtTimer = 0; + SetDroughtGamma(gWeatherPtr->droughtBrightnessStage++); + if (gWeatherPtr->droughtBrightnessStage > 5) { - gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C; - gWeatherPtr->unknown_742 = 1; - gWeatherPtr->unknown_740 = 0x3C; + gWeatherPtr->droughtLastBrightnessStage = gWeatherPtr->droughtBrightnessStage; + gWeatherPtr->droughtState = 1; + gWeatherPtr->droughtTimer = 60; } } break; case 1: - gWeatherPtr->unknown_740 = (gWeatherPtr->unknown_740 + 3) & 0x7F; - gWeatherPtr->unknown_73C = ((gSineTable[gWeatherPtr->unknown_740] - 1) >> 6) + 2; - if (gWeatherPtr->unknown_73C != gWeatherPtr->unknown_73E) - sub_807AC50(gWeatherPtr->unknown_73C); - gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C; + // Oscillate + gWeatherPtr->droughtTimer = (gWeatherPtr->droughtTimer + 3) & 0x7F; + gWeatherPtr->droughtBrightnessStage = ((gSineTable[gWeatherPtr->droughtTimer] - 1) >> 6) + 2; + if (gWeatherPtr->droughtBrightnessStage != gWeatherPtr->droughtLastBrightnessStage) + SetDroughtGamma(gWeatherPtr->droughtBrightnessStage); + gWeatherPtr->droughtLastBrightnessStage = gWeatherPtr->droughtBrightnessStage; break; case 2: - if (++gWeatherPtr->unknown_740 > gUnknown_20386A8) + // Ramp down + if (++gWeatherPtr->droughtTimer > sDroughtFrameDelay) { - gWeatherPtr->unknown_740 = 0; - sub_807AC50(--gWeatherPtr->unknown_73C); - if (gWeatherPtr->unknown_73C == 3) - gWeatherPtr->unknown_742 = 0; + gWeatherPtr->droughtTimer = 0; + SetDroughtGamma(--gWeatherPtr->droughtBrightnessStage); + if (gWeatherPtr->droughtBrightnessStage == 3) + gWeatherPtr->droughtState = 0; } break; } @@ -1042,7 +1045,7 @@ bool8 Weather_UpdateBlend(void) return FALSE; } -static void sub_807AF00(u8 a) +UNUSED static void Unused_SetWeather(u8 a) { switch (a) { @@ -1137,7 +1140,7 @@ void SetWeatherScreenFadeOut(void) gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } -void sub_807B070(void) +void WeatherProcessingIdle(void) { gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } @@ -1154,7 +1157,7 @@ void ResetPreservedPalettesInWeather(void) sPaletteGammaTypes = sBasePaletteGammaTypes; } -void sub_807B0C4(u16 *palbuf, u16 *unused, u32 size) +void SlightlyDarkenPalsInWeather(u16 *palbuf, u16 *unused, u32 size) { switch (gWeatherPtr->currWeather) { @@ -1163,7 +1166,7 @@ void sub_807B0C4(u16 *palbuf, u16 *unused, u32 size) case WEATHER_RAIN_THUNDERSTORM: case WEATHER_SHADE: case WEATHER_DOWNPOUR: - sub_8045314(palbuf, RGB_BLACK, 3, size); + BlendPalettesAt(palbuf, RGB_BLACK, 3, size); break; } } diff --git a/src/field_weather_effects.c b/src/field_weather_effects.c index f935b3afb..40af10b73 100644 --- a/src/field_weather_effects.c +++ b/src/field_weather_effects.c @@ -239,19 +239,19 @@ void Drought_Main(void) gWeatherPtr->initStep++; break; case 3: - sub_807AC60(); + DroughtStateInit(); gWeatherPtr->initStep++; break; case 4: - sub_807AC98(); - if (gWeatherPtr->unknown_73C == 6) + DroughtStateRun(); + if (gWeatherPtr->droughtBrightnessStage == 6) { gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->initStep++; } break; default: - sub_807AC98(); + DroughtStateRun(); break; } } @@ -1064,7 +1064,7 @@ void Thunderstorm_Main(void) gWeatherPtr->initStep++; // fall through case 8: - sub_807A790(19); + WeatherShiftGammaIfPalStateIdle(19); if (gWeatherPtr->unknown_6EB == 0 && gWeatherPtr->unknown_6EC == 1) SetThunderCounter(20); @@ -1074,7 +1074,7 @@ void Thunderstorm_Main(void) case 9: if (--gWeatherPtr->unknown_6E6 == 0) { - sub_807A790(3); + WeatherShiftGammaIfPalStateIdle(3); gWeatherPtr->unknown_6EA = 1; if (--gWeatherPtr->unknown_6EC != 0) { @@ -1103,7 +1103,7 @@ void Thunderstorm_Main(void) if (--gWeatherPtr->unknown_6E6 == 0) { SetThunderCounter(100); - sub_807A790(19); + WeatherShiftGammaIfPalStateIdle(19); gWeatherPtr->unknown_6E6 = (Random() & 0xF) + 30; gWeatherPtr->initStep++; } @@ -1111,7 +1111,7 @@ void Thunderstorm_Main(void) case 13: if (--gWeatherPtr->unknown_6E6 == 0) { - sub_807A7C4(19, 3, 5); + WeatherBeginGammaFade(19, 3, 5); gWeatherPtr->initStep++; } break; diff --git a/src/fieldmap.c b/src/fieldmap.c index 53110396d..7ece8b622 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -31,7 +31,7 @@ EWRAM_DATA u16 gBackupMapData[VIRTUAL_MAP_SIZE] = {}; EWRAM_DATA struct MapHeader gMapHeader = {}; EWRAM_DATA struct Camera gCamera = {}; static EWRAM_DATA struct ConnectionFlags gMapConnectionFlags = {}; -EWRAM_DATA u8 gUnknown_2036E28 = 0; +EWRAM_DATA u8 gGlobalFieldTintMode = QL_TINT_NONE; static const struct ConnectionFlags sDummyConnectionFlags = {}; @@ -890,48 +890,48 @@ static void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 nu } } -static void sub_80598CC(u16 a0, u16 a1) +static void Fieldmap_ApplyGlobalTintToPaletteEntries(u16 offset, u16 size) { - switch (gUnknown_2036E28) + switch (gGlobalFieldTintMode) { - case 0: + case QL_TINT_NONE: return; - case 1: - TintPalette_GrayScale(gPlttBufferUnfaded + a0, a1); + case QL_TINT_GRAYSCALE: + TintPalette_GrayScale(gPlttBufferUnfaded + offset, size); break; - case 2: - TintPalette_SepiaTone(gPlttBufferUnfaded + a0, a1); + case QL_TINT_SEPIA: + TintPalette_SepiaTone(gPlttBufferUnfaded + offset, size); break; - case 3: - sub_8111F38(a0, a1); - TintPalette_GrayScale(gPlttBufferUnfaded + a0, a1); + case QL_TINT_BACKUP_GRAYSCALE: + QuestLog_BackUpPalette(offset, size); + TintPalette_GrayScale(gPlttBufferUnfaded + offset, size); break; default: return; } - CpuCopy16(gPlttBufferUnfaded + a0, gPlttBufferFaded + a0, a1 * sizeof(u16)); + CpuCopy16(gPlttBufferUnfaded + offset, gPlttBufferFaded + offset, size * sizeof(u16)); } -void sub_8059948(u8 a0, u8 a1) +void Fieldmap_ApplyGlobalTintToPaletteSlot(u8 slot, u8 count) { - switch (gUnknown_2036E28) + switch (gGlobalFieldTintMode) { - case 0: + case QL_TINT_NONE: return; - case 1: - TintPalette_GrayScale(gPlttBufferUnfaded + a0 * 16, a1 * 16); + case QL_TINT_GRAYSCALE: + TintPalette_GrayScale(gPlttBufferUnfaded + slot * 16, count * 16); break; - case 2: - TintPalette_SepiaTone(gPlttBufferUnfaded + a0 * 16, a1 * 16); + case QL_TINT_SEPIA: + TintPalette_SepiaTone(gPlttBufferUnfaded + slot * 16, count * 16); break; - case 3: - sub_8111F38(a0 * 16, a1 * 16); - TintPalette_GrayScale(gPlttBufferUnfaded + a0 * 16, a1 * 16); + case QL_TINT_BACKUP_GRAYSCALE: + QuestLog_BackUpPalette(slot * 16, count * 16); + TintPalette_GrayScale(gPlttBufferUnfaded + slot * 16, count * 16); break; default: return; } - CpuFastCopy(gPlttBufferUnfaded + a0 * 16, gPlttBufferFaded + a0 * 16, a1 * 16 * sizeof(u16)); + CpuFastCopy(gPlttBufferUnfaded + slot * 16, gPlttBufferFaded + slot * 16, count * 16 * sizeof(u16)); } static void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOffset, u16 size) @@ -944,17 +944,17 @@ static void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOff { LoadPalette(&black, destOffset, 2); LoadPalette(((u16*)tileset->palettes) + 1, destOffset + 1, size - 2); - sub_80598CC(destOffset + 1, (size - 2) >> 1); + Fieldmap_ApplyGlobalTintToPaletteEntries(destOffset + 1, (size - 2) >> 1); } else if (tileset->isSecondary == TRUE) { LoadPalette(((u16*)tileset->palettes) + (NUM_PALS_IN_PRIMARY * 16), destOffset, size); - sub_80598CC(destOffset, size >> 1); + Fieldmap_ApplyGlobalTintToPaletteEntries(destOffset, size >> 1); } else { LoadCompressedPalette((u32*)tileset->palettes, destOffset, size); - sub_80598CC(destOffset, size >> 1); + Fieldmap_ApplyGlobalTintToPaletteEntries(destOffset, size >> 1); } } } diff --git a/src/fire.c b/src/fire.c index 3a3e6be9b..938fb4796 100644 --- a/src/fire.c +++ b/src/fire.c @@ -29,7 +29,7 @@ static void AnimFireRing_Step3(struct Sprite *sprite); static void UpdateFireRingCircleOffset(struct Sprite *sprite); static void sub_80ACE28(struct Sprite *sprite); static void sub_80ACE50(struct Sprite *sprite); -static void sub_80ACF14(u8 taskId); +static void AnimTask_EruptionLaunchRocks_Step(u8 taskId); static void sub_80AD1F8(u8 spriteId, u8 taskId, u8 a3); static u16 sub_80AD374(u8 spriteId); static void sub_80AD3C8(struct Sprite *sprite, s16 x, s16 y); @@ -741,17 +741,17 @@ void AnimTask_EruptionLaunchRocks(u8 taskId) // initialize animation task for Mo task->data[5] = GetBattlerSide(gBattleAnimAttacker); task->data[6] = 0; PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL); - task->func = sub_80ACF14; + task->func = AnimTask_EruptionLaunchRocks_Step; } -static void sub_80ACF14(u8 taskId) // animate Move_ERUPTION? +static void AnimTask_EruptionLaunchRocks_Step(u8 taskId) // animate Move_ERUPTION? { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: - sub_80765D4(task, task->data[15], 0x100, 0x100, 0xE0, 0x200, 0x20); + BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x100, 0x100, 0xE0, 0x200, 0x20); ++task->data[0]; // fall through case 1: @@ -771,7 +771,7 @@ static void sub_80ACF14(u8 taskId) // animate Move_ERUPTION? ++gSprites[task->data[15]].pos1.y; } } - if(!sub_8076640(task)) + if(!BattleAnimHelper_RunSpriteSquash(task)) { SetBattlerSpriteYOffsetFromYScale(task->data[15]); gSprites[task->data[15]].pos2.x = 0; @@ -785,15 +785,15 @@ static void sub_80ACF14(u8 taskId) // animate Move_ERUPTION? if (++task->data[1] > 4) { if (task->data[5]) - sub_80765D4(task, task->data[15], 0xE0, 0x200, 0x180, 0xF0, 0x6); + BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0xE0, 0x200, 0x180, 0xF0, 0x6); else - sub_80765D4(task, task->data[15], 0xE0, 0x200, 0x180, 0xC0, 0x6); + BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0xE0, 0x200, 0x180, 0xC0, 0x6); task->data[1] = 0; ++task->data[0]; } break; case 3: - if (!sub_8076640(task)) + if (!BattleAnimHelper_RunSpriteSquash(task)) { sub_80AD1F8(task->data[15], taskId, 6); ++task->data[0]; @@ -811,9 +811,9 @@ static void sub_80ACF14(u8 taskId) // animate Move_ERUPTION? if (++task->data[3] > 0x18) { if (task->data[5]) - sub_80765D4(task, task->data[15], 0x180, 0xF0, 0x100, 0x100, 0x8); + BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x180, 0xF0, 0x100, 0x100, 0x8); else - sub_80765D4(task, task->data[15], 0x180, 0xC0, 0x100, 0x100, 0x8); + BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x180, 0xC0, 0x100, 0x100, 0x8); if (task->data[2] & 1) gSprites[task->data[15]].pos2.y -= 3; task->data[1] = 0; @@ -825,7 +825,7 @@ static void sub_80ACF14(u8 taskId) // animate Move_ERUPTION? case 5: if (task->data[5]) --gSprites[task->data[15]].pos1.y; - if (!sub_8076640(task)) + if (!BattleAnimHelper_RunSpriteSquash(task)) { gSprites[task->data[15]].pos1.y = task->data[4]; ResetSpriteRotScale(task->data[15]); diff --git a/src/fldeff_rocksmash.c b/src/fldeff_rocksmash.c index ef11affd7..c5bc0d072 100644 --- a/src/fldeff_rocksmash.c +++ b/src/fldeff_rocksmash.c @@ -60,7 +60,7 @@ static void Task_FieldEffectShowMon_Init(u8 taskId) } else { - sub_805CB70(); + StartPlayerAvatarSummonMonForFieldMoveAnim(); ObjectEventSetHeldMovement(&gObjectEvents[mapObjId], MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); gTasks[taskId].func = Task_FieldEffectShowMon_WaitPlayerAnim; } diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c index 082a7b184..e9373bd05 100644 --- a/src/fldeff_sweetscent.c +++ b/src/fldeff_sweetscent.c @@ -10,7 +10,7 @@ #include "wild_encounter.h" #include "constants/songs.h" -static EWRAM_DATA u8 *gUnknown_203AAB0 = NULL; +static EWRAM_DATA u8 *sPlttBufferBak = NULL; static void FieldCallback_SweetScent(void); static void StartSweetScentFieldEffect(void); @@ -51,9 +51,9 @@ static void StartSweetScentFieldEffect(void) u8 taskId; PlaySE(SE_M_SWEET_SCENT); - gUnknown_203AAB0 = (u8 *)Alloc(0x400); - CpuFastSet(gPlttBufferUnfaded, gUnknown_203AAB0, 0x100); - CpuFastSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x100); + sPlttBufferBak = (u8 *)Alloc(PLTT_SIZE); + CpuFastCopy(gPlttBufferUnfaded, sPlttBufferBak, PLTT_SIZE); + CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, PLTT_SIZE); BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, RGB(31, 0, 0)); taskId = CreateTask(TrySweetScentEncounter, 0); gTasks[taskId].data[0] = 0; @@ -71,7 +71,7 @@ static void TrySweetScentEncounter(u8 taskId) data[0] = 0; if (SweetScentWildEncounter() == TRUE) { - Free(gUnknown_203AAB0); + Free(sPlttBufferBak); DestroyTask(taskId); } else @@ -91,9 +91,9 @@ static void FailSweetScentEncounter(u8 taskId) { if (!gPaletteFade.active) { - CpuFastSet(gUnknown_203AAB0, gPlttBufferUnfaded, 0x100); - sub_807B070(); - Free(gUnknown_203AAB0); + CpuFastCopy(sPlttBufferBak, gPlttBufferUnfaded, PLTT_SIZE); + WeatherProcessingIdle(); + Free(sPlttBufferBak); ScriptContext1_SetupScript(EventScript_FailSweetScent); DestroyTask(taskId); } diff --git a/src/flying.c b/src/flying.c index c68fda99f..fd8f69e89 100644 --- a/src/flying.c +++ b/src/flying.c @@ -1159,7 +1159,7 @@ static void AnimDiveWaterSplash(struct Sprite *sprite) sprite->pos2.y = t2; if (sprite->data[2] == 24) { - sub_8075AD8(sprite); + TryResetSpriteAffineState(sprite); DestroyAnimSprite(sprite); } break; diff --git a/src/ghost.c b/src/ghost.c index 0efcc28d4..c8ddf3c12 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -643,7 +643,7 @@ static void sub_80B5AD4(u8 taskId) break; case 1: task->data[14] = (task->data[14] + 16) * 16; - CpuSet(&gPlttBufferUnfaded[task->data[4]], &gPlttBufferFaded[task->data[14]], 0x4000008); + CpuCopy32(&gPlttBufferUnfaded[task->data[4]], &gPlttBufferFaded[task->data[14]], 0x20); BlendPalette(task->data[4], 16, 10, RGB(13, 0, 15)); ++task->data[15]; break; diff --git a/src/help_system.c b/src/help_system.c index 196053274..27ec64baa 100644 --- a/src/help_system.c +++ b/src/help_system.c @@ -1,1203 +1,2480 @@ #include "global.h" #include "gflib.h" -#include "decompress.h" -#include "m4a.h" #include "event_data.h" +#include "event_scripts.h" +#include "field_player_avatar.h" #include "help_system.h" -#include "list_menu.h" +#include "item.h" +#include "link.h" +#include "overworld.h" +#include "pokedex.h" +#include "quest_log.h" +#include "save.h" +#include "save_location.h" #include "strings.h" -#include "event_data.h" +#include "constants/items.h" +#include "constants/maps.h" #include "constants/songs.h" -#if !defined(NONMATCHING) && MODERN -#define static -#endif +#define HELP_NONE 0 +#define HELP_END 0xFF -extern u8 gGlyphInfo[]; +// Help Main Topics +enum HelpSystemTopics +{ + TOPIC_WHAT_TO_DO, + TOPIC_HOW_TO_DO, + TOPIC_TERMS, + TOPIC_ABOUT_GAME, + TOPIC_TYPE_MATCHUP, + TOPIC_EXIT, + TOPIC_COUNT +}; -bool8 gHelpSystemEnabled; +static EWRAM_DATA u16 sHelpSystemContextId = 0; +static EWRAM_DATA u8 sSeenHelpSystemIntro = 0; -struct HelpSystemVideoState +struct HelpSystemState { - /*0x00*/ MainCallback savedVblankCb; - /*0x04*/ MainCallback savedHblankCb; - /*0x08*/ u16 savedDispCnt; - /*0x0a*/ u16 savedBg0Cnt; - /*0x0c*/ u16 savedBg0Hofs; - /*0x0e*/ u16 savedBg0Vofs; - /*0x10*/ u16 savedBldCnt; - /*0x12*/ u8 savedTextColor[3]; - /*0x15*/ u8 state; -}; - -static EWRAM_DATA u8 sMapTilesBackup[BG_CHAR_SIZE] = {0}; -EWRAM_DATA u8 gUnknown_203F174 = 0; -EWRAM_DATA bool8 gHelpSystemToggleWithRButtonDisabled = FALSE; -static EWRAM_DATA u8 sDelayTimer = 0; -static EWRAM_DATA u8 sInHelpSystem = 0; -static EWRAM_DATA struct HelpSystemVideoState sVideoState = {0}; -EWRAM_DATA struct HelpSystemListMenu gHelpSystemListMenu = {0}; -EWRAM_DATA struct ListMenuItem gHelpSystemListMenuItems[52] = {0}; - -static const u16 sTiles[] = INCBIN_U16("graphics/help_system/unk_8464008.4bpp"); -static const u16 sPals[] = INCBIN_U16("graphics/help_system/unk_8464008.gbapal"); - -u8 RunHelpSystemCallback(void) + // 0: Top level + // 1: Submenu + // 2: Help content + u8 level; + + // enum HelpSystemTopics + u8 topic; + + // Where the player's cursor was at top level + u8 scrollMain; + + // Where the player's cursor was at submenu + u8 scrollSub; +}; + +struct HelpSystemState gHelpSystemState; +u16 gHelpContextIdBackup; + +static bool32 IsCurrentMapInArray(const u16 * mapIdxs); +static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); +static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); +static bool8 HelpSystem_ShouldShowBasicTerms(void); +static bool8 IsHelpSystemSubmenuEnabled(u8); +static bool8 HasGottenAtLeastOneHM(void); + +static void PrintWelcomeMessageOnPanel1(void); +static void PrintTextOnPanel2Row52RightAlign(const u8 *); +static void ResetHelpSystemCursor(struct HelpSystemListMenu * a0); +static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); + +static const u8 *const sHelpSystemTopicPtrs[TOPIC_COUNT] = { + [TOPIC_WHAT_TO_DO] = Help_Text_WhatShouldIDo, + [TOPIC_HOW_TO_DO] = Help_Text_HowDoIDoThis, + [TOPIC_TERMS] = Help_Text_WhatDoesThisTermMean, + [TOPIC_ABOUT_GAME] = Help_Text_AboutThisGame, + [TOPIC_TYPE_MATCHUP] = Help_Text_TypeMatchupList, + [TOPIC_EXIT] = Help_Text_Exit +}; + +static const u8 *const sHelpSystemTopicMouseoverDescriptionPtrs[TOPIC_COUNT] = { + [TOPIC_WHAT_TO_DO] = Help_Text_DescWhatShouldIDo, + [TOPIC_HOW_TO_DO] = Help_Text_DescHowDoIDoThis, + [TOPIC_TERMS] = Help_Text_DescWhatDoesThisTermMean, + [TOPIC_ABOUT_GAME] = Help_Text_DescAboutThisGame, + [TOPIC_TYPE_MATCHUP] = Help_Text_DescTypeMatchupList, + [TOPIC_EXIT] = Help_Text_DescExit +}; + +// Submenu IDs for TOPIC_WHAT_TO_DO +enum { - s32 i; + HELP_PLAYING_FOR_FIRST_TIME = 1, + HELP_WHAT_SHOULD_I_BE_DOING, + HELP_CANT_GET_OUT_OF_ROOM, + HELP_CANT_FIND_PERSON_I_WANT, + HELP_TALKED_TO_EVERYONE_NOW_WHAT, + HELP_SOMEONE_BLOCKING_MY_WAY, + HELP_I_CANT_GO_ON, + HELP_OUT_OF_THINGS_TO_DO, + HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, + HELP_WHAT_ARE_MY_ADVENTURE_BASICS, + HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, + HELP_HOW_ARE_CAVES_DIFFERENT, + HELP_HOW_DO_I_PROGRESS, + HELP_WHEN_CAN_I_USE_ITEM, + HELP_WHATS_A_BATTLE, + HELP_HOW_DO_I_PREPARE_FOR_BATTLE, + HELP_WHAT_IS_A_MONS_VITALITY, + HELP_MY_MONS_ARE_HURT, + HELP_WHAT_IS_STATUS_PROBLEM, + HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, + HELP_CANT_CATCH_MONS, + HELP_RAN_OUT_OF_POTIONS, + HELP_CAN_I_BUY_POKEBALLS, + HELP_WHATS_A_TRAINER, + HELP_HOW_DO_I_WIN_AGAINST_TRAINER, + HELP_WHERE_DO_MONS_APPEAR, + HELP_WHAT_ARE_MOVES, + HELP_WHAT_ARE_HIDDEN_MOVES, + HELP_WHAT_MOVES_SHOULD_I_USE, + HELP_WANT_TO_ADD_MORE_MOVES, + HELP_WANT_TO_MAKE_MON_STRONGER, + HELP_FOE_MONS_TOO_STRONG, + HELP_WHAT_DO_I_DO_IN_CAVE, + HELP_NOTHING_I_WANT_TO_KNOW, + HELP_WHATS_POKEMON_CENTER, + HELP_WHATS_POKEMON_MART, + HELP_WANT_TO_END_GAME, + HELP_WHATS_A_MON, + HELP_WHAT_IS_THAT_PERSON_LIKE, + HELP_WHAT_DOES_HIDDEN_MOVE_DO, + HELP_WHAT_DO_I_DO_IN_SAFARI, + HELP_WHAT_ARE_SAFARI_RULES, + HELP_WANT_TO_END_SAFARI, + HELP_WHAT_IS_A_GYM, +}; - switch (sVideoState.state) - { - case 0: - sInHelpSystem = 0; - if (gSaveBlock2Ptr->optionsButtonMode != OPTIONS_BUTTON_MODE_HELP) - return 0; - if (JOY_NEW(R_BUTTON) && gHelpSystemToggleWithRButtonDisabled == TRUE) - return 0; - if (JOY_NEW(L_BUTTON | R_BUTTON)) - { - if (!sub_812B45C() || !gHelpSystemEnabled) - { - PlaySE(SE_HELP_ERROR); - return 0; - } - m4aMPlayStop(&gMPlayInfo_SE1); - m4aMPlayStop(&gMPlayInfo_SE2); - PlaySE(SE_HELP_OPEN); - if (!gUnknown_203F174) - m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x80); - SaveCallbacks(); - sInHelpSystem = 1; - sVideoState.state = 1; - } - break; - case 1: - SaveMapTiles(); - SaveMapGPURegs(); - SaveMapTextColors(); - (*(vu16 *)PLTT) = sPals[15]; - SetGpuReg(REG_OFFSET_DISPCNT, 0); - sVideoState.state = 2; - break; - case 2: - RequestDma3Fill(0, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT); - RequestDma3Copy(sPals, (void *)PLTT, sizeof(sPals), DMA3_16BIT); - RequestDma3Copy(sTiles, gDecompressionBuffer + 0x3EE0, sizeof(sTiles), DMA3_16BIT); - sVideoState.state = 3; - break; - case 3: - sub_813BCF4(); - HelpSystem_FillPanel3(); - HelpSystem_FillPanel2(); - HelpSystem_PrintText_Row61(gString_Help); - sub_813BD14(1); - if (HelpSystem_UpdateHasntSeenIntro() == TRUE) - HelpSystemSubroutine_PrintWelcomeMessage(&gHelpSystemListMenu, gHelpSystemListMenuItems); - else - HelpSystemSubroutine_WelcomeEndGotoMenu(&gHelpSystemListMenu, gHelpSystemListMenuItems); - sub_813BE78(1); - sub_813BF50(1); - CommitTilemap(); - sVideoState.state = 4; - break; - case 4: - SetGpuReg(REG_OFFSET_BLDCNT, 0); - SetGpuReg(REG_OFFSET_BG0HOFS, 0); - SetGpuReg(REG_OFFSET_BG0VOFS, 0); - SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31)); - SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON); - sVideoState.state = 5; - break; - case 5: - if (!RunHelpMenuSubroutine(&gHelpSystemListMenu, gHelpSystemListMenuItems)) - { - PlaySE(SE_HELP_CLOSE); - sVideoState.state = 6; - } - break; - case 6: - SetGpuReg(REG_OFFSET_DISPCNT, 0); - RestoreMapTiles(); - for (i = 0; i < 0x200; i += 2) - { - *((vu16 *)(PLTT + 0x000 + i)) = sPals[15]; - *((vu16 *)(PLTT + 0x200 + i)) = sPals[15]; - } - sVideoState.state = 7; - break; - case 7: - if (!gUnknown_203F174) - m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100); - RestoreMapTextColors(); - RestoreGPURegs(); - sVideoState.state = 8; - break; - case 8: - RestoreCallbacks(); - sInHelpSystem = 0; - sVideoState.state = 0; - break; - } - return sVideoState.state; -} +static const u8 *const sHelpSystemSpecializedQuestionTextPtrs[] = { + [HELP_NONE] = NULL, + [HELP_PLAYING_FOR_FIRST_TIME] = Help_Text_PlayingForFirstTime, + [HELP_WHAT_SHOULD_I_BE_DOING] = Help_Text_WhatShouldIBeDoing, + [HELP_CANT_GET_OUT_OF_ROOM] = Help_Text_CantGetOutOfRoom, + [HELP_CANT_FIND_PERSON_I_WANT] = Help_Text_CantFindPersonIWant, + [HELP_TALKED_TO_EVERYONE_NOW_WHAT] = Help_Text_TalkedToEveryoneNowWhat, + [HELP_SOMEONE_BLOCKING_MY_WAY] = Help_Text_SomeoneBlockingMyWay, + [HELP_I_CANT_GO_ON] = Help_Text_ICantGoOn, + [HELP_OUT_OF_THINGS_TO_DO] = Help_Text_OutOfThingsToDo, + [HELP_WHAT_HAPPENED_TO_ITEM_I_GOT] = Help_Text_WhatHappenedToItemIGot, + [HELP_WHAT_ARE_MY_ADVENTURE_BASICS] = Help_Text_WhatAreMyAdventureBasics, + [HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT] = Help_Text_HowAreRoadsForestsDifferent, + [HELP_HOW_ARE_CAVES_DIFFERENT] = Help_Text_HowAreCavesDifferent, + [HELP_HOW_DO_I_PROGRESS] = Help_Text_HowDoIProgress, + [HELP_WHEN_CAN_I_USE_ITEM] = Help_Text_WhenCanIUseItem, + [HELP_WHATS_A_BATTLE] = Help_Text_WhatsABattle, + [HELP_HOW_DO_I_PREPARE_FOR_BATTLE] = Help_Text_HowDoIPrepareForBattle, + [HELP_WHAT_IS_A_MONS_VITALITY] = Help_Text_WhatIsAMonsVitality, + [HELP_MY_MONS_ARE_HURT] = Help_Text_MyMonsAreHurt, + [HELP_WHAT_IS_STATUS_PROBLEM] = Help_Text_WhatIsStatusProblem, + [HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT] = Help_Text_WhatHappensIfAllMyMonsFaint, + [HELP_CANT_CATCH_MONS] = Help_Text_CantCatchMons, + [HELP_RAN_OUT_OF_POTIONS] = Help_Text_RanOutOfPotions, + [HELP_CAN_I_BUY_POKEBALLS] = Help_Text_CanIBuyPokeBalls, + [HELP_WHATS_A_TRAINER] = Help_Text_WhatsATrainer, + [HELP_HOW_DO_I_WIN_AGAINST_TRAINER] = Help_Text_HowDoIWinAgainstTrainer, + [HELP_WHERE_DO_MONS_APPEAR] = Help_Text_WhereDoMonsAppear, + [HELP_WHAT_ARE_MOVES] = Help_Text_WhatAreMoves, + [HELP_WHAT_ARE_HIDDEN_MOVES] = Help_Text_WhatAreHiddenMoves, + [HELP_WHAT_MOVES_SHOULD_I_USE] = Help_Text_WhatMovesShouldIUse, + [HELP_WANT_TO_ADD_MORE_MOVES] = Help_Text_WantToAddMoreMoves, + [HELP_WANT_TO_MAKE_MON_STRONGER] = Help_Text_WantToMakeMonStronger, + [HELP_FOE_MONS_TOO_STRONG] = Help_Text_FoeMonsTooStrong, + [HELP_WHAT_DO_I_DO_IN_CAVE] = Help_Text_WhatDoIDoInCave, + [HELP_NOTHING_I_WANT_TO_KNOW] = Help_Text_NothingIWantToKnow, + [HELP_WHATS_POKEMON_CENTER] = Help_Text_WhatsPokemonCenter, + [HELP_WHATS_POKEMON_MART] = Help_Text_WhatsPokemonMart, + [HELP_WANT_TO_END_GAME] = Help_Text_WantToEndGame, + [HELP_WHATS_A_MON] = Help_Text_WhatsAMon, + [HELP_WHAT_IS_THAT_PERSON_LIKE] = Help_Text_WhatIsThatPersonLike, + [HELP_WHAT_DOES_HIDDEN_MOVE_DO] = Help_Text_WhatDoesHiddenMoveDo, + [HELP_WHAT_DO_I_DO_IN_SAFARI] = Help_Text_WhatDoIDoInSafari, + [HELP_WHAT_ARE_SAFARI_RULES] = Help_Text_WhatAreSafariRules, + [HELP_WANT_TO_END_SAFARI] = Help_Text_WantToEndSafari, + [HELP_WHAT_IS_A_GYM] = Help_Text_WhatIsAGym +}; + +static const u8 *const sHelpSystemSpecializedAnswerTextPtrs[] = { + [HELP_NONE] = NULL, + [HELP_PLAYING_FOR_FIRST_TIME] = Help_Text_AnswerPlayingForFirstTime, + [HELP_WHAT_SHOULD_I_BE_DOING] = Help_Text_AnswerWhatShouldIBeDoing, + [HELP_CANT_GET_OUT_OF_ROOM] = Help_Text_AnswerCantGetOutOfRoom, + [HELP_CANT_FIND_PERSON_I_WANT] = Help_Text_AnswerCantFindPersonIWant, + [HELP_TALKED_TO_EVERYONE_NOW_WHAT] = Help_Text_AnswerTalkedToEveryoneNowWhat, + [HELP_SOMEONE_BLOCKING_MY_WAY] = Help_Text_AnswerSomeoneBlockingMyWay, + [HELP_I_CANT_GO_ON] = Help_Text_AnswerICantGoOn, + [HELP_OUT_OF_THINGS_TO_DO] = Help_Text_AnswerOutOfThingsToDo, + [HELP_WHAT_HAPPENED_TO_ITEM_I_GOT] = Help_Text_AnswerWhatHappenedToItemIGot, + [HELP_WHAT_ARE_MY_ADVENTURE_BASICS] = Help_Text_AnswerWhatAreMyAdventureBasics, + [HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT] = Help_Text_AnswerHowAreRoadsForestsDifferent, + [HELP_HOW_ARE_CAVES_DIFFERENT] = Help_Text_AnswerHowAreCavesDifferent, + [HELP_HOW_DO_I_PROGRESS] = Help_Text_AnswerHowDoIProgress, + [HELP_WHEN_CAN_I_USE_ITEM] = Help_Text_AnswerWhenCanIUseItem, + [HELP_WHATS_A_BATTLE] = Help_Text_AnswerWhatsABattle, + [HELP_HOW_DO_I_PREPARE_FOR_BATTLE] = Help_Text_AnswerHowDoIPrepareForBattle, + [HELP_WHAT_IS_A_MONS_VITALITY] = Help_Text_AnswerWhatIsAMonsVitality, + [HELP_MY_MONS_ARE_HURT] = Help_Text_AnswerMyMonsAreHurt, + [HELP_WHAT_IS_STATUS_PROBLEM] = Help_Text_AnswerWhatIsStatusProblem, + [HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT] = Help_Text_AnswerWhatHappensIfAllMyMonsFaint, + [HELP_CANT_CATCH_MONS] = Help_Text_AnswerCantCatchMons, + [HELP_RAN_OUT_OF_POTIONS] = Help_Text_AnswerRanOutOfPotions, + [HELP_CAN_I_BUY_POKEBALLS] = Help_Text_AnswerCanIBuyPokeBalls, + [HELP_WHATS_A_TRAINER] = Help_Text_AnswerWhatsATrainer, + [HELP_HOW_DO_I_WIN_AGAINST_TRAINER] = Help_Text_AnswerHowDoIWinAgainstTrainer, + [HELP_WHERE_DO_MONS_APPEAR] = Help_Text_AnswerWhereDoMonsAppear, + [HELP_WHAT_ARE_MOVES] = Help_Text_AnswerWhatAreMoves, + [HELP_WHAT_ARE_HIDDEN_MOVES] = Help_Text_AnswerWhatAreHiddenMoves, + [HELP_WHAT_MOVES_SHOULD_I_USE] = Help_Text_AnswerWhatMovesShouldIUse, + [HELP_WANT_TO_ADD_MORE_MOVES] = Help_Text_AnswerWantToAddMoreMoves, + [HELP_WANT_TO_MAKE_MON_STRONGER] = Help_Text_AnswerWantToMakeMonStronger, + [HELP_FOE_MONS_TOO_STRONG] = Help_Text_AnswerFoeMonsTooStrong, + [HELP_WHAT_DO_I_DO_IN_CAVE] = Help_Text_AnswerWhatDoIDoInCave, + [HELP_NOTHING_I_WANT_TO_KNOW] = Help_Text_AnswerNothingIWantToKnow, + [HELP_WHATS_POKEMON_CENTER] = Help_Text_AnswerWhatsPokemonCenter, + [HELP_WHATS_POKEMON_MART] = Help_Text_AnswerWhatsPokemonMart, + [HELP_WANT_TO_END_GAME] = Help_Text_AnswerWantToEndGame, + [HELP_WHATS_A_MON] = Help_Text_AnswerWhatsAMon, + [HELP_WHAT_IS_THAT_PERSON_LIKE] = Help_Text_AnswerWhatIsThatPersonLike, + [HELP_WHAT_DOES_HIDDEN_MOVE_DO] = Help_Text_AnswerWhatDoesHiddenMoveDo, + [HELP_WHAT_DO_I_DO_IN_SAFARI] = Help_Text_AnswerWhatDoIDoInSafari, + [HELP_WHAT_ARE_SAFARI_RULES] = Help_Text_AnswerWhatAreSafariRules, + [HELP_WANT_TO_END_SAFARI] = Help_Text_AnswerWantToEndSafari, + [HELP_WHAT_IS_A_GYM] = Help_Text_AnswerWhatIsAGym +}; -void SaveCallbacks(void) +// Submenu IDs for TOPIC_HOW_TO_DO +enum { - vu16 * dma; - sVideoState.savedVblankCb = gMain.vblankCallback; - sVideoState.savedHblankCb = gMain.hblankCallback; - gMain.vblankCallback = NULL; - gMain.hblankCallback = NULL; - - dma = (void *)REG_ADDR_DMA0; - dma[5] &= ~(DMA_START_MASK | DMA_DREQ_ON | DMA_REPEAT); - dma[5] &= ~DMA_ENABLE; - dma[5]; -} + HELP_USING_POKEDEX = 1, + HELP_USING_POKEMON, + HELP_USING_SUMMARY, + HELP_USING_SWITCH, + HELP_USING_ITEM, + HELP_USING_BAG, + HELP_USING_AN_ITEM, + HELP_USING_KEYITEM, + HELP_USING_POKEBALL, + HELP_USING_PLAYER, + HELP_USING_SAVE, + HELP_USING_OPTION, + HELP_USING_POTION, + HELP_USING_TOWN_MAP, + HELP_USING_TM, + HELP_USING_HM, + HELP_USING_MOVE_OUTSIDE_OF_BATTLE, + HELP_RIDING_BICYCLE, + HELP_ENTERING_NAME, + HELP_USING_PC, + HELP_USING_BILLS_PC, + HELP_USING_WITHDRAW, + HELP_USING_DEPOSIT, + HELP_USING_MOVE, + HELP_MOVING_ITEMS, + HELP_USING_PLAYERS_PC, + HELP_USING_WITHDRAW_ITEM, + HELP_USING_DEPOSIT_ITEM, + HELP_USING_MAILBOX, + HELP_USING_PROF_OAKS_PC, + HELP_OPENING_MENU, + HELP_USING_FIGHT, + HELP_USING_POKEMON2, + HELP_USING_SHIFT, + HELP_USING_SUMMARY2, + HELP_USING_BAG2, + HELP_READING_POKEDEX, + HELP_USING_HOME_PC, + HELP_USING_ITEM_STORAGE, + HELP_USING_WITHDRAW_ITEM2, + HELP_USING_DEPOSIT_ITEM2, + HELP_USING_MAILBOX2, + HELP_USING_RUN, + HELP_REGISTER_KEY_ITEM, + HELP_USING_BALL, + HELP_USING_BAIT, + HELP_USING_ROCK, + HELP_USING_HALL_OF_FAME, +}; + +static const u8 *const sHelpSystemMenuTopicTextPtrs[] = { + [HELP_NONE] = NULL, + [HELP_USING_POKEDEX] = Help_Text_UsingPokedex, + [HELP_USING_POKEMON] = Help_Text_UsingPokemon, + [HELP_USING_SUMMARY] = Help_Text_UsingSummary, + [HELP_USING_SWITCH] = Help_Text_UsingSwitch, + [HELP_USING_ITEM] = Help_Text_UsingItem, + [HELP_USING_BAG] = Help_Text_UsingBag, + [HELP_USING_AN_ITEM] = Help_Text_UsingAnItem, + [HELP_USING_KEYITEM] = Help_Text_UsingKeyItem, + [HELP_USING_POKEBALL] = Help_Text_UsingPokeBall, + [HELP_USING_PLAYER] = Help_Text_UsingPlayer, + [HELP_USING_SAVE] = Help_Text_UsingSave, + [HELP_USING_OPTION] = Help_Text_UsingOption, + [HELP_USING_POTION] = Help_Text_UsingPotion, + [HELP_USING_TOWN_MAP] = Help_Text_UsingTownMap, + [HELP_USING_TM] = Help_Text_UsingTM, + [HELP_USING_HM] = Help_Text_UsingHM, + [HELP_USING_MOVE_OUTSIDE_OF_BATTLE] = Help_Text_UsingMoveOutsideOfBattle, + [HELP_RIDING_BICYCLE] = Help_Text_RidingBicycle, + [HELP_ENTERING_NAME] = Help_Text_EnteringName, + [HELP_USING_PC] = Help_Text_UsingPC, + [HELP_USING_BILLS_PC] = Help_Text_UsingBillsPC, + [HELP_USING_WITHDRAW] = Help_Text_UsingWithdraw, + [HELP_USING_DEPOSIT] = Help_Text_UsingDeposit, + [HELP_USING_MOVE] = Help_Text_UsingMove, + [HELP_MOVING_ITEMS] = Help_Text_MovingItems, + [HELP_USING_PLAYERS_PC] = Help_Text_UsingPlayersPC, + [HELP_USING_WITHDRAW_ITEM] = Help_Text_UsingWithdrawItem, + [HELP_USING_DEPOSIT_ITEM] = Help_Text_UsingDepositItem, + [HELP_USING_MAILBOX] = Help_Text_UsingMailbox, + [HELP_USING_PROF_OAKS_PC] = Help_Text_UsingProfOaksPC, + [HELP_OPENING_MENU] = Help_Text_OpeningMenu, + [HELP_USING_FIGHT] = Help_Text_UsingFight, + [HELP_USING_POKEMON2] = Help_Text_UsingPokemon2, + [HELP_USING_SHIFT] = Help_Text_UsingShift, + [HELP_USING_SUMMARY2] = Help_Text_UsingSummary2, + [HELP_USING_BAG2] = Help_Text_UsingBag2, + [HELP_READING_POKEDEX] = Help_Text_ReadingPokedex, + [HELP_USING_HOME_PC] = Help_Text_UsingHomePC, + [HELP_USING_ITEM_STORAGE] = Help_Text_UsingItemStorage, + [HELP_USING_WITHDRAW_ITEM2] = Help_Text_UsingWithdrawItem2, + [HELP_USING_DEPOSIT_ITEM2] = Help_Text_UsingDepositItem2, + [HELP_USING_MAILBOX2] = Help_Text_UsingMailbox2, + [HELP_USING_RUN] = Help_Text_UsingRun, + [HELP_REGISTER_KEY_ITEM] = Help_Text_RegisterKeyItem, + [HELP_USING_BALL] = Help_Text_UsingBall, + [HELP_USING_BAIT] = Help_Text_UsingBait, + [HELP_USING_ROCK] = Help_Text_UsingRock, + [HELP_USING_HALL_OF_FAME] = Help_Text_UsingHallOfFame +}; + +static const u8 *const sHelpSystemHowToUseMenuTextPtrs[] = { + [HELP_NONE] = NULL, + [HELP_USING_POKEDEX] = Help_Text_HowToUsePokedex, + [HELP_USING_POKEMON] = Help_Text_HowToUsePokemon, + [HELP_USING_SUMMARY] = Help_Text_HowToUseSummary, + [HELP_USING_SWITCH] = Help_Text_HowToUseSwitch, + [HELP_USING_ITEM] = Help_Text_HowToUseItem, + [HELP_USING_BAG] = Help_Text_HowToUseBag, + [HELP_USING_AN_ITEM] = Help_Text_HowToUseAnItem, + [HELP_USING_KEYITEM] = Help_Text_HowToUseKeyItem, + [HELP_USING_POKEBALL] = Help_Text_HowToUsePokeBall, + [HELP_USING_PLAYER] = Help_Text_HowToUsePlayer, + [HELP_USING_SAVE] = Help_Text_HowToUseSave, + [HELP_USING_OPTION] = Help_Text_HowToUseOption, + [HELP_USING_POTION] = Help_Text_HowToUsePotion, + [HELP_USING_TOWN_MAP] = Help_Text_HowToUseTownMap, + [HELP_USING_TM] = Help_Text_HowToUseTM, + [HELP_USING_HM] = Help_Text_HowToUseHM, + [HELP_USING_MOVE_OUTSIDE_OF_BATTLE] = Help_Text_HowToUseMoveOutsideOfBattle, + [HELP_RIDING_BICYCLE] = Help_Text_HowToRideBicycle, + [HELP_ENTERING_NAME] = Help_Text_HowToEnterName, + [HELP_USING_PC] = Help_Text_HowToUsePC, + [HELP_USING_BILLS_PC] = Help_Text_HowToUseBillsPC, + [HELP_USING_WITHDRAW] = Help_Text_HowToUseWithdraw, + [HELP_USING_DEPOSIT] = Help_Text_HowToUseDeposit, + [HELP_USING_MOVE] = Help_Text_HowToUseMove, + [HELP_MOVING_ITEMS] = Help_Text_HowToMoveItems, + [HELP_USING_PLAYERS_PC] = Help_Text_HowToUsePlayersPC, + [HELP_USING_WITHDRAW_ITEM] = Help_Text_HowToUseWithdrawItem, + [HELP_USING_DEPOSIT_ITEM] = Help_Text_HowToUseDepositItem, + [HELP_USING_MAILBOX] = Help_Text_HowToUseMailbox, + [HELP_USING_PROF_OAKS_PC] = Help_Text_HowToUseProfOaksPC, + [HELP_OPENING_MENU] = Help_Text_HowToOpenMenu, + [HELP_USING_FIGHT] = Help_Text_HowToUseFight, + [HELP_USING_POKEMON2] = Help_Text_HowToUsePokemon2, + [HELP_USING_SHIFT] = Help_Text_HowToUseShift, + [HELP_USING_SUMMARY2] = Help_Text_HowToUseSummary2, + [HELP_USING_BAG2] = Help_Text_HowToUseBag2, + [HELP_READING_POKEDEX] = Help_Text_HowToReadPokedex, + [HELP_USING_HOME_PC] = Help_Text_HowToUseHomePC, + [HELP_USING_ITEM_STORAGE] = Help_Text_HowToUseItemStorage, + [HELP_USING_WITHDRAW_ITEM2] = Help_Text_HowToUseWithdrawItem2, + [HELP_USING_DEPOSIT_ITEM2] = Help_Text_HowToUseDepositItem2, + [HELP_USING_MAILBOX2] = Help_Text_HowToUseMailbox2, + [HELP_USING_RUN] = Help_Text_HowToUseRun, + [HELP_REGISTER_KEY_ITEM] = Help_Text_HowToRegisterKeyItem, + [HELP_USING_BALL] = Help_Text_HowToUseBall, + [HELP_USING_BAIT] = Help_Text_HowToUseBait, + [HELP_USING_ROCK] = Help_Text_HowToUseRock, + [HELP_USING_HALL_OF_FAME] = Help_Text_HowToUseHallOfFame +}; + +// Submenu IDs for TOPIC_TERMS +enum +{ + HELP_TERM_HP = 1, + HELP_TERM_EXP, + HELP_TERM_MOVES, + HELP_TERM_ATTACK, + HELP_TERM_DEFENSE, + HELP_TERM_SPATK, + HELP_TERM_SPDEF, + HELP_TERM_SPEED, + HELP_TERM_LEVEL, + HELP_TERM_TYPE, + HELP_TERM_OT, + HELP_TERM_ITEM, + HELP_TERM_ABILITY, + HELP_TERM_MONEY, + HELP_TERM_MOVE_TYPE, + HELP_TERM_NATURE, + HELP_TERM_ID_NO, + HELP_TERM_PP, + HELP_TERM_POWER, + HELP_TERM_ACCURACY, + HELP_TERM_FNT, + HELP_TERM_ITEMS, + HELP_TERM_KEYITEMS, + HELP_TERM_POKEBALLS, + HELP_TERM_POKEDEX, + HELP_TERM_PLAY_TIME, + HELP_TERM_BADGES, + HELP_TERM_TEXT_SPEED, + HELP_TERM_BATTLE_SCENE, + HELP_TERM_BATTLE_STYLE, + HELP_TERM_SOUND, + HELP_TERM_BUTTON_MODE, + HELP_TERM_FRAME, + HELP_TERM_CANCEL, + HELP_TERM_TM, + HELP_TERM_HM, + HELP_TERM_HM_MOVE, + HELP_TERM_EVOLUTION, + HELP_TERM_STATUS_PROBLEM, + HELP_TERM_POKEMON, + HELP_TERM_ID_NO2, + HELP_TERM_MONEY2, + HELP_TERM_BADGES2, +}; + +static const u8 *const sHelpSystemTermTextPtrs[] = { + [HELP_NONE] = NULL, + [HELP_TERM_HP] = Help_Text_HP, + [HELP_TERM_EXP] = Help_Text_EXP, + [HELP_TERM_MOVES] = Help_Text_Moves, + [HELP_TERM_ATTACK] = Help_Text_Attack, + [HELP_TERM_DEFENSE] = Help_Text_Defense, + [HELP_TERM_SPATK] = Help_Text_SpAtk, + [HELP_TERM_SPDEF] = Help_Text_SpDef, + [HELP_TERM_SPEED] = Help_Text_Speed, + [HELP_TERM_LEVEL] = Help_Text_Level, + [HELP_TERM_TYPE] = Help_Text_Type, + [HELP_TERM_OT] = Help_Text_OT, + [HELP_TERM_ITEM] = Help_Text_Item, + [HELP_TERM_ABILITY] = Help_Text_Ability, + [HELP_TERM_MONEY] = Help_Text_Money, + [HELP_TERM_MOVE_TYPE] = Help_Text_MoveType, + [HELP_TERM_NATURE] = Help_Text_Nature, + [HELP_TERM_ID_NO] = Help_Text_IDNo, + [HELP_TERM_PP] = Help_Text_PP, + [HELP_TERM_POWER] = Help_Text_Power, + [HELP_TERM_ACCURACY] = Help_Text_Accuracy, + [HELP_TERM_FNT] = Help_Text_FNT, + [HELP_TERM_ITEMS] = Help_Text_Items, + [HELP_TERM_KEYITEMS] = Help_Text_KeyItems, + [HELP_TERM_POKEBALLS] = Help_Text_PokeBalls, + [HELP_TERM_POKEDEX] = Help_Text_Pokedex, + [HELP_TERM_PLAY_TIME] = Help_Text_PlayTime, + [HELP_TERM_BADGES] = Help_Text_Badges, + [HELP_TERM_TEXT_SPEED] = Help_Text_TextSpeed, + [HELP_TERM_BATTLE_SCENE] = Help_Text_BattleScene, + [HELP_TERM_BATTLE_STYLE] = Help_Text_BattleStyle, + [HELP_TERM_SOUND] = Help_Text_Sound, + [HELP_TERM_BUTTON_MODE] = Help_Text_ButtonMode, + [HELP_TERM_FRAME] = Help_Text_Frame, + [HELP_TERM_CANCEL] = Help_Text_Cancel2, + [HELP_TERM_TM] = Help_Text_TM, + [HELP_TERM_HM] = Help_Text_HM, + [HELP_TERM_HM_MOVE] = Help_Text_HMMove, + [HELP_TERM_EVOLUTION] = Help_Text_Evolution, + [HELP_TERM_STATUS_PROBLEM] = Help_Text_StatusProblem, + [HELP_TERM_POKEMON] = Help_Text_Pokemon, + [HELP_TERM_ID_NO2] = Help_Text_IDNo2, + [HELP_TERM_MONEY2] = Help_Text_Money2, + [HELP_TERM_BADGES2] = Help_Text_Badges2 +}; + +static const u8 *const sHelpSystemTermDefinitionsTextPtrs[] = { + [HELP_NONE] = NULL, + [HELP_TERM_HP] = Help_Text_DefineHP, + [HELP_TERM_EXP] = Help_Text_DefineEXP, + [HELP_TERM_MOVES] = Help_Text_DefineMoves, + [HELP_TERM_ATTACK] = Help_Text_DefineAttack, + [HELP_TERM_DEFENSE] = Help_Text_DefineDefense, + [HELP_TERM_SPATK] = Help_Text_DefineSpAtk, + [HELP_TERM_SPDEF] = Help_Text_DefineSpDef, + [HELP_TERM_SPEED] = Help_Text_DefineSpeed, + [HELP_TERM_LEVEL] = Help_Text_DefineLevel, + [HELP_TERM_TYPE] = Help_Text_DefineType, + [HELP_TERM_OT] = Help_Text_DefineOT, + [HELP_TERM_ITEM] = Help_Text_DefineItem, + [HELP_TERM_ABILITY] = Help_Text_DefineAbility, + [HELP_TERM_MONEY] = Help_Text_DefineMoney, + [HELP_TERM_MOVE_TYPE] = Help_Text_DefineMoveType, + [HELP_TERM_NATURE] = Help_Text_DefineNature, + [HELP_TERM_ID_NO] = Help_Text_DefineIDNo, + [HELP_TERM_PP] = Help_Text_DefinePP, + [HELP_TERM_POWER] = Help_Text_DefinePower, + [HELP_TERM_ACCURACY] = Help_Text_DefineAccuracy, + [HELP_TERM_FNT] = Help_Text_DefineFNT, + [HELP_TERM_ITEMS] = Help_Text_DefineItems, + [HELP_TERM_KEYITEMS] = Help_Text_DefineKeyItems, + [HELP_TERM_POKEBALLS] = Help_Text_DefinePokeBalls, + [HELP_TERM_POKEDEX] = Help_Text_DefinePokedex, + [HELP_TERM_PLAY_TIME] = Help_Text_DefinePlayTime, + [HELP_TERM_BADGES] = Help_Text_DefineBadges, + [HELP_TERM_TEXT_SPEED] = Help_Text_DefineTextSpeed, + [HELP_TERM_BATTLE_SCENE] = Help_Text_DefineBattleScene, + [HELP_TERM_BATTLE_STYLE] = Help_Text_DefineBattleStyle, + [HELP_TERM_SOUND] = Help_Text_DefineSound, + [HELP_TERM_BUTTON_MODE] = Help_Text_DefineButtonMode, + [HELP_TERM_FRAME] = Help_Text_DefineFrame, + [HELP_TERM_CANCEL] = Help_Text_DefineCancel2, + [HELP_TERM_TM] = Help_Text_DefineTM, + [HELP_TERM_HM] = Help_Text_DefineHM, + [HELP_TERM_HM_MOVE] = Help_Text_DefineHMMove, + [HELP_TERM_EVOLUTION] = Help_Text_DefineEvolution, + [HELP_TERM_STATUS_PROBLEM] = Help_Text_DefineStatusProblem, + [HELP_TERM_POKEMON] = Help_Text_DefinePokemon, + [HELP_TERM_ID_NO2] = Help_Text_DefineIDNo2, + [HELP_TERM_MONEY2] = Help_Text_DefineMoney2, + [HELP_TERM_BADGES2] = Help_Text_DefineBadges2 +}; -void SaveMapGPURegs(void) +// Submenu IDs for TOPIC_ABOUT_GAME +enum { - sVideoState.savedDispCnt = GetGpuReg(REG_OFFSET_DISPCNT); - sVideoState.savedBg0Cnt = GetGpuReg(REG_OFFSET_BG0CNT); - sVideoState.savedBg0Hofs = GetGpuReg(REG_OFFSET_BG0HOFS); - sVideoState.savedBg0Vofs = GetGpuReg(REG_OFFSET_BG0VOFS); - sVideoState.savedBldCnt = GetGpuReg(REG_OFFSET_BLDCNT); + HELP_THE_HELP_SYSTEM = 1, + HELP_THE_GAME, + HELP_WIRELESS_ADAPTER, + HELP_GAME_FUNDAMENTALS_1, + HELP_GAME_FUNDAMENTALS_2, + HELP_GAME_FUNDAMENTALS_3, + HELP_WHAT_ARE_POKEMON, +}; + +static const u8 *const sHelpSystemGeneralTopicTextPtrs[] = { + [HELP_NONE] = NULL, + [HELP_THE_HELP_SYSTEM] = Help_Text_TheHelpSystem, + [HELP_THE_GAME] = Help_Text_TheGame, + [HELP_WIRELESS_ADAPTER] = Help_Text_WirelessAdapter, + [HELP_GAME_FUNDAMENTALS_1] = Help_Text_GameFundamentals1, + [HELP_GAME_FUNDAMENTALS_2] = Help_Text_GameFundamentals2, + [HELP_GAME_FUNDAMENTALS_3] = Help_Text_GameFundamentals3, + [HELP_WHAT_ARE_POKEMON] = Help_Text_WhatArePokemon +}; + +static const u8 *const sHelpSystemGeneralTopicDescriptionTextPtrs[] = { + [HELP_NONE] = NULL, + [HELP_THE_HELP_SYSTEM] = Help_Text_DescTheHelpSystem, + [HELP_THE_GAME] = Help_Text_DescTheGame, + [HELP_WIRELESS_ADAPTER] = Help_Text_DescWirelessAdapter, + [HELP_GAME_FUNDAMENTALS_1] = Help_Text_DescGameFundamentals1, + [HELP_GAME_FUNDAMENTALS_2] = Help_Text_DescGameFundamentals2, + [HELP_GAME_FUNDAMENTALS_3] = Help_Text_DescGameFundamentals3, + [HELP_WHAT_ARE_POKEMON] = Help_Text_DescWhatArePokemon +}; + +// An enum for the type matchups isn't necessary, when used they're always used in their entirety +// Macro below is used to reference the entire group at once +#define HELP_TYPE_MATCHUPS \ + 1, \ + 2, 3, \ + 4, 5, \ + 6, 7, \ + 8, 9, \ + 10, 11, \ + 12, 13, \ + 14, 15, \ + 16, 17, \ + 18, 19, \ + 20, 21, \ + 22, 23, \ + 24, 25, \ + 26, 27, \ + 28, 29, \ + 30, 31, \ + 32, 33, \ + 34, 35 \ + +static const u8 *const sHelpSystemTypeMatchupTextPtrs[] = { + [HELP_NONE] = NULL, + [1] = Help_Text_UsingTypeMatchupList, + [2] = Help_Text_OwnMoveDark, + [3] = Help_Text_OwnPokemonDark, + [4] = Help_Text_OwnMoveRock, + [5] = Help_Text_OwnPokemonRock, + [6] = Help_Text_OwnMovePsychic, + [7] = Help_Text_OwnPokemonPsychic, + [8] = Help_Text_OwnMoveFighting, + [9] = Help_Text_OwnPokemonFighting, + [10] = Help_Text_OwnMoveGrass, + [11] = Help_Text_OwnPokemonGrass, + [12] = Help_Text_OwnMoveGhost, + [13] = Help_Text_OwnPokemonGhost, + [14] = Help_Text_OwnMoveIce, + [15] = Help_Text_OwnPokemonIce, + [16] = Help_Text_OwnMoveGround, + [17] = Help_Text_OwnPokemonGround, + [18] = Help_Text_OwnMoveElectric, + [19] = Help_Text_OwnPokemonElectric, + [20] = Help_Text_OwnMovePoison, + [21] = Help_Text_OwnPokemonPoison, + [22] = Help_Text_OwnMoveDragon, + [23] = Help_Text_OwnPokemonDragon, + [24] = Help_Text_OwnMoveNormal, + [25] = Help_Text_OwnPokemonNormal, + [26] = Help_Text_OwnMoveSteel, + [27] = Help_Text_OwnPokemonSteel, + [28] = Help_Text_OwnMoveFlying, + [29] = Help_Text_OwnPokemonFlying, + [30] = Help_Text_OwnMoveFire, + [31] = Help_Text_OwnPokemonFire, + [32] = Help_Text_OwnMoveWater, + [33] = Help_Text_OwnPokemonWater, + [34] = Help_Text_OwnMoveBug, + [35] = Help_Text_OwnPokemonBug +}; + +static const u8 *const sHelpSystemTypeMatchupDescriptionTextPtrs[] = { + [HELP_NONE] = NULL, + [1] = Help_Text_HowToUseTypeMatchupList, + [2] = Help_Text_TypeMatchupOwnMoveDark, + [3] = Help_Text_TypeMatchupOwnPokemonDark, + [4] = Help_Text_TypeMatchupOwnMoveRock, + [5] = Help_Text_TypeMatchupOwnPokemonRock, + [6] = Help_Text_TypeMatchupOwnMovePsychic, + [7] = Help_Text_TypeMatchupOwnPokemonPsychic, + [8] = Help_Text_TypeMatchupOwnMoveFighting, + [9] = Help_Text_TypeMatchupOwnPokemonFighting, + [10] = Help_Text_TypeMatchupOwnMoveGrass, + [11] = Help_Text_TypeMatchupOwnPokemonGrass, + [12] = Help_Text_TypeMatchupOwnMoveGhost, + [13] = Help_Text_TypeMatchupOwnPokemonGhost, + [14] = Help_Text_TypeMatchupOwnMoveIce, + [15] = Help_Text_TypeMatchupOwnPokemonIce, + [16] = Help_Text_TypeMatchupOwnMoveGround, + [17] = Help_Text_TypeMatchupOwnPokemonGround, + [18] = Help_Text_TypeMatchupOwnMoveElectric, + [19] = Help_Text_TypeMatchupOwnPokemonElectric, + [20] = Help_Text_TypeMatchupOwnMovePoison, + [21] = Help_Text_TypeMatchupOwnPokemonPoison, + [22] = Help_Text_TypeMatchupOwnMoveDragon, + [23] = Help_Text_TypeMatchupOwnPokemonDragon, + [24] = Help_Text_TypeMatchupOwnMoveNormal, + [25] = Help_Text_TypeMatchupOwnPokemonNormal, + [26] = Help_Text_TypeMatchupOwnMoveSteel, + [27] = Help_Text_TypeMatchupOwnPokemonSteel, + [28] = Help_Text_TypeMatchupOwnMoveFlying, + [29] = Help_Text_TypeMatchupOwnPokemonFlying, + [30] = Help_Text_TypeMatchupOwnMoveFire, + [31] = Help_Text_TypeMatchupOwnPokemonFire, + [32] = Help_Text_TypeMatchupOwnMoveWater, + [33] = Help_Text_TypeMatchupOwnPokemonWater, + [34] = Help_Text_TypeMatchupOwnMoveBug, + [35] = Help_Text_TypeMatchupOwnPokemonBug +}; + +static const u8 sAboutGame_TitleScreen[] = { + HELP_THE_HELP_SYSTEM, + HELP_THE_GAME, + HELP_WIRELESS_ADAPTER, + HELP_END +}; + +static const u8 sAboutGame_NewGame[] = { + HELP_THE_HELP_SYSTEM, + HELP_THE_GAME, + HELP_WIRELESS_ADAPTER, + HELP_END +}; + +static const u8 sHowTo_NamingScreen[] = { + HELP_ENTERING_NAME, + HELP_END +}; + +static const u8 sAboutGame_NamingScreen[] = { + HELP_THE_HELP_SYSTEM, + HELP_THE_GAME, + HELP_WIRELESS_ADAPTER, + HELP_END +}; + +static const u8 sHowTo_Pokedex[] = { + HELP_USING_POKEDEX, + HELP_READING_POKEDEX, + HELP_END +}; + +static const u8 sHowTo_PartyMenu[] = { + HELP_USING_POKEMON, + HELP_USING_SUMMARY, + HELP_USING_SWITCH, + HELP_USING_ITEM, + HELP_USING_MOVE_OUTSIDE_OF_BATTLE, + HELP_END +}; + +static const u8 sTerms_PartyMenu[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_END +}; + +static const u8 sHowTo_PokemonInfo[] = { + HELP_USING_POKEMON, + HELP_USING_SUMMARY, + HELP_END +}; + +static const u8 sTerms_PokemonInfo[] = { + HELP_TERM_LEVEL, + HELP_TERM_TYPE, + HELP_TERM_OT, + HELP_TERM_ID_NO, + HELP_TERM_ITEM, + HELP_TERM_NATURE, + HELP_END +}; + +static const u8 sTerms_PokemonSkills[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_ATTACK, + HELP_TERM_DEFENSE, + HELP_TERM_SPATK, + HELP_TERM_SPDEF, + HELP_TERM_SPEED, + HELP_TERM_EXP, + HELP_TERM_ABILITY, + HELP_END +}; + +static const u8 sTerms_PokemonMoves[] = { + HELP_TERM_LEVEL, + HELP_TERM_MOVES, + HELP_TERM_TYPE, + HELP_TERM_MOVE_TYPE, + HELP_TERM_PP, + HELP_TERM_POWER, + HELP_TERM_ACCURACY, + HELP_END +}; + +static const u8 sHowTo_Bag[] = { + HELP_USING_BAG, + HELP_USING_AN_ITEM, + HELP_USING_KEYITEM, + HELP_REGISTER_KEY_ITEM, + HELP_USING_POKEBALL, + HELP_USING_POTION, + HELP_USING_TOWN_MAP, + HELP_USING_TM, + HELP_USING_HM, + HELP_RIDING_BICYCLE, + HELP_END +}; + +static const u8 sTerms_Bag[] = { + HELP_TERM_ITEMS, + HELP_TERM_KEYITEMS, + HELP_TERM_POKEBALLS, + HELP_END +}; + +static const u8 sHowTo_TrainerCardFront[] = { + HELP_USING_PLAYER, + HELP_END +}; + +static const u8 sTerms_TrainerCardFront[] = { + HELP_TERM_ID_NO, + HELP_TERM_MONEY, + HELP_TERM_POKEDEX, + HELP_TERM_PLAY_TIME, + HELP_TERM_BADGES, + HELP_END +}; + +static const u8 sHowTo_TrainerCardBack[] = { + HELP_USING_PLAYER, + HELP_END +}; + +static const u8 sHowTo_Save[] = { + HELP_USING_SAVE, + HELP_END +}; + +static const u8 sTerms_Save[] = { + HELP_TERM_BADGES2, + HELP_TERM_POKEDEX, + HELP_TERM_PLAY_TIME, + HELP_END +}; + +static const u8 sHowTo_Options[] = { + HELP_USING_OPTION, + HELP_END +}; + +static const u8 sTerms_Options[] = { + HELP_TERM_TEXT_SPEED, + HELP_TERM_BATTLE_SCENE, + HELP_TERM_BATTLE_STYLE, + HELP_TERM_SOUND, + HELP_TERM_BUTTON_MODE, + HELP_TERM_FRAME, + HELP_TERM_CANCEL, + HELP_END +}; + +static const u8 sWhatToDo_PlayersHouse[] = { + HELP_WHAT_SHOULD_I_BE_DOING, + HELP_CANT_GET_OUT_OF_ROOM, + HELP_CANT_FIND_PERSON_I_WANT, + HELP_END +}; + +static const u8 sAboutGame_PlayersHouse[] = { + HELP_THE_HELP_SYSTEM, + HELP_THE_GAME, + HELP_WIRELESS_ADAPTER, + HELP_WHAT_ARE_POKEMON, + HELP_END +}; + +static const u8 sWhatToDo_OaksLab[] = { + HELP_WHAT_SHOULD_I_BE_DOING, + HELP_CANT_FIND_PERSON_I_WANT, + HELP_TALKED_TO_EVERYONE_NOW_WHAT, + HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, + HELP_WANT_TO_END_GAME, + HELP_END +}; + +static const u8 sHowTo_OaksLab[] = { + HELP_OPENING_MENU, + HELP_USING_POKEDEX, + HELP_USING_POKEMON, + HELP_USING_SUMMARY, + HELP_USING_SWITCH, + HELP_USING_ITEM, + HELP_USING_BAG, + HELP_USING_AN_ITEM, + HELP_USING_KEYITEM, + HELP_REGISTER_KEY_ITEM, + HELP_USING_POKEBALL, + HELP_USING_POTION, + HELP_USING_TOWN_MAP, + HELP_USING_TM, + HELP_USING_HM, + HELP_USING_PLAYER, + HELP_USING_SAVE, + HELP_USING_OPTION, + HELP_USING_MOVE_OUTSIDE_OF_BATTLE, + HELP_END +}; + +static const u8 sTerms_OaksLab[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_MOVES, + HELP_TERM_TYPE, + HELP_TERM_POKEMON, + HELP_END +}; + +static const u8 sWhatToDo_PokeCenter[] = { + HELP_WHAT_SHOULD_I_BE_DOING, + HELP_TALKED_TO_EVERYONE_NOW_WHAT, + HELP_SOMEONE_BLOCKING_MY_WAY, + HELP_WHAT_ARE_MY_ADVENTURE_BASICS, + HELP_WHATS_POKEMON_CENTER, + HELP_WHATS_POKEMON_MART, + HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, + HELP_WANT_TO_END_GAME, + HELP_END +}; + +static const u8 sHowTo_PokeCenter[] = { + HELP_OPENING_MENU, + HELP_USING_POKEDEX, + HELP_USING_POKEMON, + HELP_USING_SUMMARY, + HELP_USING_SWITCH, + HELP_USING_ITEM, + HELP_USING_BAG, + HELP_USING_AN_ITEM, + HELP_USING_KEYITEM, + HELP_REGISTER_KEY_ITEM, + HELP_USING_POKEBALL, + HELP_USING_POTION, + HELP_USING_TOWN_MAP, + HELP_USING_TM, + HELP_USING_HM, + HELP_USING_PLAYER, + HELP_USING_SAVE, + HELP_USING_OPTION, + HELP_USING_MOVE_OUTSIDE_OF_BATTLE, + HELP_USING_PC, + HELP_END +}; + +static const u8 sTerms_PokeCenter[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_MOVES, + HELP_TERM_TYPE, + HELP_TERM_POKEMON, + HELP_END +}; + +static const u8 sAboutGame_PokeCenter[] = { + HELP_WIRELESS_ADAPTER, + HELP_WHAT_ARE_POKEMON, + HELP_GAME_FUNDAMENTALS_1, + HELP_GAME_FUNDAMENTALS_2, + HELP_GAME_FUNDAMENTALS_3, + HELP_END +}; + +static const u8 sWhatToDo_Mart[] = { + HELP_WHAT_SHOULD_I_BE_DOING, + HELP_TALKED_TO_EVERYONE_NOW_WHAT, + HELP_SOMEONE_BLOCKING_MY_WAY, + HELP_WHAT_ARE_MY_ADVENTURE_BASICS, + HELP_WHATS_POKEMON_CENTER, + HELP_WHATS_POKEMON_MART, + HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, + HELP_WANT_TO_END_GAME, + HELP_END +}; + +static const u8 sHowTo_Mart[] = { + HELP_OPENING_MENU, + HELP_USING_POKEDEX, + HELP_USING_POKEMON, + HELP_USING_SUMMARY, + HELP_USING_SWITCH, + HELP_USING_ITEM, + HELP_USING_BAG, + HELP_USING_AN_ITEM, + HELP_USING_KEYITEM, + HELP_REGISTER_KEY_ITEM, + HELP_USING_POKEBALL, + HELP_USING_POTION, + HELP_USING_TOWN_MAP, + HELP_USING_TM, + HELP_USING_HM, + HELP_USING_PLAYER, + HELP_USING_SAVE, + HELP_USING_OPTION, + HELP_USING_MOVE_OUTSIDE_OF_BATTLE, + HELP_END +}; + +static const u8 sTerms_Mart[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_MOVES, + HELP_TERM_TYPE, + HELP_TERM_ITEM, + HELP_TERM_MONEY, + HELP_TERM_ITEMS, + HELP_TERM_KEYITEMS, + HELP_TERM_POKEBALLS, + HELP_TERM_FNT, + HELP_END +}; + +static const u8 sWhatToDo_Gym[] = { + HELP_SOMEONE_BLOCKING_MY_WAY, + HELP_WHAT_ARE_MY_ADVENTURE_BASICS, + HELP_WHATS_POKEMON_CENTER, + HELP_WHATS_POKEMON_MART, + HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, + HELP_WANT_TO_END_GAME, + HELP_END +}; + +static const u8 sHowTo_Gym[] = { + HELP_OPENING_MENU, + HELP_USING_POKEDEX, + HELP_USING_POKEMON, + HELP_USING_SUMMARY, + HELP_USING_SWITCH, + HELP_USING_ITEM, + HELP_USING_BAG, + HELP_USING_AN_ITEM, + HELP_USING_KEYITEM, + HELP_REGISTER_KEY_ITEM, + HELP_USING_POKEBALL, + HELP_USING_POTION, + HELP_USING_TOWN_MAP, + HELP_USING_TM, + HELP_USING_HM, + HELP_USING_PLAYER, + HELP_USING_SAVE, + HELP_USING_OPTION, + HELP_USING_MOVE_OUTSIDE_OF_BATTLE, + HELP_END +}; + +static const u8 sTerms_Gym[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_MOVES, + HELP_TERM_TYPE, + HELP_TERM_FNT, + HELP_END +}; + +static const u8 sTypeMatchups_Gym[] = { + HELP_TYPE_MATCHUPS, + HELP_END +}; + +static const u8 sWhatToDo_Indoors[] = { + HELP_WHAT_SHOULD_I_BE_DOING, + HELP_WHAT_ARE_MY_ADVENTURE_BASICS, + HELP_CANT_FIND_PERSON_I_WANT, + HELP_TALKED_TO_EVERYONE_NOW_WHAT, + HELP_SOMEONE_BLOCKING_MY_WAY, + HELP_I_CANT_GO_ON, + HELP_HOW_DO_I_PROGRESS, + HELP_WHAT_IS_THAT_PERSON_LIKE, + HELP_OUT_OF_THINGS_TO_DO, + HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, + HELP_WHAT_DO_I_DO_IN_CAVE, + HELP_WHATS_POKEMON_CENTER, + HELP_WHATS_POKEMON_MART, + HELP_WHAT_IS_A_GYM, + HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, + HELP_WHEN_CAN_I_USE_ITEM, + HELP_RAN_OUT_OF_POTIONS, + HELP_CAN_I_BUY_POKEBALLS, + HELP_WHATS_A_BATTLE, + HELP_HOW_DO_I_PREPARE_FOR_BATTLE, + HELP_WHAT_IS_A_MONS_VITALITY, + HELP_WHERE_DO_MONS_APPEAR, + HELP_CANT_CATCH_MONS, + HELP_WANT_TO_MAKE_MON_STRONGER, + HELP_FOE_MONS_TOO_STRONG, + HELP_MY_MONS_ARE_HURT, + HELP_WHAT_IS_STATUS_PROBLEM, + HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, + HELP_WHATS_A_TRAINER, + HELP_HOW_DO_I_WIN_AGAINST_TRAINER, + HELP_WHAT_ARE_MOVES, + HELP_WANT_TO_ADD_MORE_MOVES, + HELP_WHAT_ARE_HIDDEN_MOVES, + HELP_WHAT_DOES_HIDDEN_MOVE_DO, + HELP_WANT_TO_END_GAME, + HELP_END +}; + +static const u8 sHowTo_Indoors[] = { + HELP_OPENING_MENU, + HELP_USING_POKEDEX, + HELP_USING_POKEMON, + HELP_USING_SUMMARY, + HELP_USING_SWITCH, + HELP_USING_ITEM, + HELP_USING_BAG, + HELP_USING_AN_ITEM, + HELP_USING_KEYITEM, + HELP_REGISTER_KEY_ITEM, + HELP_USING_POKEBALL, + HELP_USING_POTION, + HELP_USING_TOWN_MAP, + HELP_USING_TM, + HELP_USING_HM, + HELP_USING_PLAYER, + HELP_USING_SAVE, + HELP_USING_OPTION, + HELP_USING_MOVE_OUTSIDE_OF_BATTLE, + HELP_END +}; + +static const u8 sTerms_Indoors[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_TYPE, + HELP_TERM_OT, + HELP_TERM_ITEM, + HELP_TERM_ABILITY, + HELP_TERM_FNT, + HELP_END +}; + +static const u8 sWhatToDo_Overworld[] = { + HELP_WHAT_SHOULD_I_BE_DOING, + HELP_WHAT_ARE_MY_ADVENTURE_BASICS, + HELP_CANT_FIND_PERSON_I_WANT, + HELP_TALKED_TO_EVERYONE_NOW_WHAT, + HELP_SOMEONE_BLOCKING_MY_WAY, + HELP_I_CANT_GO_ON, + HELP_HOW_DO_I_PROGRESS, + HELP_WHAT_IS_THAT_PERSON_LIKE, + HELP_OUT_OF_THINGS_TO_DO, + HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, + HELP_WHAT_DO_I_DO_IN_CAVE, + HELP_WHATS_POKEMON_CENTER, + HELP_WHATS_POKEMON_MART, + HELP_WHAT_IS_A_GYM, + HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, + HELP_WHEN_CAN_I_USE_ITEM, + HELP_RAN_OUT_OF_POTIONS, + HELP_CAN_I_BUY_POKEBALLS, + HELP_WHATS_A_BATTLE, + HELP_HOW_DO_I_PREPARE_FOR_BATTLE, + HELP_WHAT_IS_A_MONS_VITALITY, + HELP_WHERE_DO_MONS_APPEAR, + HELP_CANT_CATCH_MONS, + HELP_WANT_TO_MAKE_MON_STRONGER, + HELP_FOE_MONS_TOO_STRONG, + HELP_MY_MONS_ARE_HURT, + HELP_WHAT_IS_STATUS_PROBLEM, + HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, + HELP_WHATS_A_TRAINER, + HELP_HOW_DO_I_WIN_AGAINST_TRAINER, + HELP_WHAT_ARE_MOVES, + HELP_WANT_TO_ADD_MORE_MOVES, + HELP_WHAT_ARE_HIDDEN_MOVES, + HELP_WHAT_DOES_HIDDEN_MOVE_DO, + HELP_WANT_TO_END_GAME, + HELP_END +}; + +static const u8 sHowTo_Overworld[] = { + HELP_OPENING_MENU, + HELP_USING_POKEDEX, + HELP_USING_POKEMON, + HELP_USING_BAG, + HELP_USING_PLAYER, + HELP_USING_SAVE, + HELP_USING_OPTION, + HELP_USING_MOVE_OUTSIDE_OF_BATTLE, + HELP_END +}; + +static const u8 sTerms_Overworld[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_TYPE, + HELP_TERM_OT, + HELP_TERM_ITEM, + HELP_TERM_ABILITY, + HELP_TERM_FNT, + HELP_TERM_POKEMON, + HELP_END +}; + +static const u8 sWhatToDo_Dungeon[] = { + HELP_WHAT_ARE_MY_ADVENTURE_BASICS, + HELP_I_CANT_GO_ON, + HELP_HOW_DO_I_PROGRESS, + HELP_WHAT_IS_THAT_PERSON_LIKE, + HELP_OUT_OF_THINGS_TO_DO, + HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, + HELP_WHAT_DO_I_DO_IN_CAVE, + HELP_WHATS_POKEMON_CENTER, + HELP_WHATS_POKEMON_MART, + HELP_WHAT_IS_A_GYM, + HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, + HELP_WHEN_CAN_I_USE_ITEM, + HELP_RAN_OUT_OF_POTIONS, + HELP_WHATS_A_BATTLE, + HELP_HOW_DO_I_PREPARE_FOR_BATTLE, + HELP_WHAT_IS_A_MONS_VITALITY, + HELP_WHERE_DO_MONS_APPEAR, + HELP_CANT_CATCH_MONS, + HELP_WANT_TO_MAKE_MON_STRONGER, + HELP_FOE_MONS_TOO_STRONG, + HELP_MY_MONS_ARE_HURT, + HELP_WHAT_IS_STATUS_PROBLEM, + HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, + HELP_WHATS_A_TRAINER, + HELP_HOW_DO_I_WIN_AGAINST_TRAINER, + HELP_WHAT_ARE_MOVES, + HELP_WANT_TO_ADD_MORE_MOVES, + HELP_WHAT_ARE_HIDDEN_MOVES, + HELP_WHAT_DOES_HIDDEN_MOVE_DO, + HELP_WANT_TO_END_GAME, + HELP_END +}; + +static const u8 sHowTo_Dungeon[] = { + HELP_OPENING_MENU, + HELP_USING_POKEDEX, + HELP_USING_POKEMON, + HELP_USING_BAG, + HELP_USING_PLAYER, + HELP_USING_SAVE, + HELP_USING_OPTION, + HELP_USING_MOVE_OUTSIDE_OF_BATTLE, + HELP_END +}; + +static const u8 sTerms_Dungeon[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_TYPE, + HELP_TERM_OT, + HELP_TERM_ITEM, + HELP_TERM_ABILITY, + HELP_TERM_FNT, + HELP_END +}; + +static const u8 sWhatToDo_Surfing[] = { + HELP_I_CANT_GO_ON, + HELP_WHAT_IS_THAT_PERSON_LIKE, + HELP_OUT_OF_THINGS_TO_DO, + HELP_WHAT_IS_A_GYM, + HELP_CANT_CATCH_MONS, + HELP_WANT_TO_MAKE_MON_STRONGER, + HELP_FOE_MONS_TOO_STRONG, + HELP_MY_MONS_ARE_HURT, + HELP_WHAT_IS_STATUS_PROBLEM, + HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, + HELP_WHATS_A_TRAINER, + HELP_HOW_DO_I_WIN_AGAINST_TRAINER, + HELP_WHAT_ARE_MOVES, + HELP_WANT_TO_ADD_MORE_MOVES, + HELP_WHAT_ARE_HIDDEN_MOVES, + HELP_WHAT_DOES_HIDDEN_MOVE_DO, + HELP_WANT_TO_END_GAME, + HELP_END +}; + +static const u8 sHowTo_Surfing[] = { + HELP_OPENING_MENU, + HELP_USING_POKEDEX, + HELP_USING_POKEMON, + HELP_USING_BAG, + HELP_USING_PLAYER, + HELP_USING_SAVE, + HELP_USING_OPTION, + HELP_USING_MOVE_OUTSIDE_OF_BATTLE, + HELP_END +}; + +static const u8 sTerms_Surfing[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_TYPE, + HELP_TERM_OT, + HELP_TERM_ITEM, + HELP_TERM_ABILITY, + HELP_TERM_FNT, + HELP_END +}; + +static const u8 sWhatToDo_WildBattle[] = { + HELP_WHATS_A_BATTLE, + HELP_WHAT_ARE_MOVES, + HELP_WHAT_MOVES_SHOULD_I_USE, + HELP_WHAT_IS_A_MONS_VITALITY, + HELP_MY_MONS_ARE_HURT, + HELP_CANT_CATCH_MONS, + HELP_CAN_I_BUY_POKEBALLS, + HELP_RAN_OUT_OF_POTIONS, + HELP_WANT_TO_MAKE_MON_STRONGER, + HELP_FOE_MONS_TOO_STRONG, + HELP_WHAT_IS_STATUS_PROBLEM, + HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, + HELP_END +}; + +static const u8 sHowTo_WildBattle[] = { + HELP_USING_FIGHT, + HELP_USING_POKEMON2, + HELP_USING_SHIFT, + HELP_USING_SUMMARY2, + HELP_USING_BAG2, + HELP_USING_AN_ITEM, + HELP_USING_POKEBALL, + HELP_USING_RUN, + HELP_END +}; + +static const u8 sTerms_WildBattle[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_MOVES, + HELP_TERM_ATTACK, + HELP_TERM_DEFENSE, + HELP_TERM_SPATK, + HELP_TERM_SPDEF, + HELP_TERM_SPEED, + HELP_TERM_TYPE, + HELP_TERM_ABILITY, + HELP_TERM_MOVE_TYPE, + HELP_TERM_PP, + HELP_TERM_POWER, + HELP_TERM_ACCURACY, + HELP_TERM_STATUS_PROBLEM, + HELP_TERM_FNT, + HELP_END +}; + +static const u8 sTypeMatchups_WildBattle[] = { + HELP_TYPE_MATCHUPS, + HELP_END +}; + +static const u8 sWhatToDo_TrainerBattleSingle[] = { + HELP_WHATS_A_BATTLE, + HELP_WHAT_ARE_MOVES, + HELP_WHAT_MOVES_SHOULD_I_USE, + HELP_WHAT_IS_A_MONS_VITALITY, + HELP_MY_MONS_ARE_HURT, + HELP_RAN_OUT_OF_POTIONS, + HELP_WANT_TO_MAKE_MON_STRONGER, + HELP_FOE_MONS_TOO_STRONG, + HELP_WHAT_IS_STATUS_PROBLEM, + HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, + HELP_END +}; + +static const u8 sHowTo_TrainerBattleSingle[] = { + HELP_USING_FIGHT, + HELP_USING_POKEMON2, + HELP_USING_SHIFT, + HELP_USING_SUMMARY2, + HELP_USING_BAG2, + HELP_USING_AN_ITEM, + HELP_USING_RUN, + HELP_END +}; + +static const u8 sTerms_TrainerBattleSingle[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_MOVES, + HELP_TERM_ATTACK, + HELP_TERM_DEFENSE, + HELP_TERM_SPATK, + HELP_TERM_SPDEF, + HELP_TERM_SPEED, + HELP_TERM_TYPE, + HELP_TERM_ABILITY, + HELP_TERM_MOVE_TYPE, + HELP_TERM_PP, + HELP_TERM_POWER, + HELP_TERM_ACCURACY, + HELP_TERM_STATUS_PROBLEM, + HELP_TERM_FNT, + HELP_END +}; + +static const u8 sTypeMatchups_TrainerBattleSingle[] = { + HELP_TYPE_MATCHUPS, + HELP_END +}; + +static const u8 sWhatToDo_TrainerBattleDouble[] = { + HELP_WHATS_A_BATTLE, + HELP_WHAT_ARE_MOVES, + HELP_WHAT_MOVES_SHOULD_I_USE, + HELP_WHAT_IS_A_MONS_VITALITY, + HELP_MY_MONS_ARE_HURT, + HELP_RAN_OUT_OF_POTIONS, + HELP_WANT_TO_MAKE_MON_STRONGER, + HELP_FOE_MONS_TOO_STRONG, + HELP_WHAT_IS_STATUS_PROBLEM, + HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, + HELP_END +}; + +static const u8 sHowTo_TrainerBattleDouble[] = { + HELP_USING_FIGHT, + HELP_USING_POKEMON2, + HELP_USING_SHIFT, + HELP_USING_SUMMARY2, + HELP_USING_BAG2, + HELP_USING_AN_ITEM, + HELP_USING_RUN, + HELP_END +}; + +static const u8 sTerms_TrainerBattleDouble[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_MOVES, + HELP_TERM_ATTACK, + HELP_TERM_DEFENSE, + HELP_TERM_SPATK, + HELP_TERM_SPDEF, + HELP_TERM_SPEED, + HELP_TERM_TYPE, + HELP_TERM_ABILITY, + HELP_TERM_MOVE_TYPE, + HELP_TERM_PP, + HELP_TERM_POWER, + HELP_TERM_ACCURACY, + HELP_TERM_STATUS_PROBLEM, + HELP_TERM_FNT, + HELP_END +}; + +static const u8 sTypeMatchups_TrainerBattleDouble[] = { + HELP_TYPE_MATCHUPS, + HELP_END +}; + +static const u8 sWhatToDo_SafariBattle[] = { + HELP_WHAT_DO_I_DO_IN_SAFARI, + HELP_WHAT_ARE_SAFARI_RULES, + HELP_WANT_TO_END_SAFARI, + HELP_END +}; + +static const u8 sHowTo_SafariBattle[] = { + HELP_USING_BALL, + HELP_USING_BAIT, + HELP_USING_ROCK, + HELP_USING_RUN, + HELP_END +}; + +static const u8 sTerms_SafariBattle[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_MOVES, + HELP_TERM_ATTACK, + HELP_TERM_DEFENSE, + HELP_TERM_SPATK, + HELP_TERM_SPDEF, + HELP_TERM_SPEED, + HELP_TERM_TYPE, + HELP_TERM_ABILITY, + HELP_TERM_MOVE_TYPE, + HELP_TERM_PP, + HELP_TERM_POWER, + HELP_TERM_ACCURACY, + HELP_END +}; + +static const u8 sTypeMatchups_SafariBattle[] = { + HELP_TYPE_MATCHUPS, + HELP_END +}; + +static const u8 sHowTo_PC[] = { + HELP_USING_PC, + HELP_USING_BILLS_PC, + HELP_USING_WITHDRAW, + HELP_USING_DEPOSIT, + HELP_USING_MOVE, + HELP_MOVING_ITEMS, + HELP_USING_PLAYERS_PC, + HELP_USING_WITHDRAW_ITEM, + HELP_USING_DEPOSIT_ITEM, + HELP_USING_MAILBOX, + HELP_USING_PROF_OAKS_PC, + HELP_USING_HALL_OF_FAME, + HELP_END +}; + +static const u8 sHowTo_BillsPC[] = { + HELP_USING_PC, + HELP_USING_BILLS_PC, + HELP_USING_WITHDRAW, + HELP_USING_DEPOSIT, + HELP_USING_MOVE, + HELP_MOVING_ITEMS, + HELP_USING_PLAYERS_PC, + HELP_USING_WITHDRAW_ITEM, + HELP_USING_DEPOSIT_ITEM, + HELP_USING_MAILBOX, + HELP_USING_PROF_OAKS_PC, + HELP_USING_HALL_OF_FAME, + HELP_END +}; + +static const u8 sHowTo_PlayersPCItems[] = { + HELP_USING_PC, + HELP_USING_BILLS_PC, + HELP_USING_WITHDRAW, + HELP_USING_DEPOSIT, + HELP_USING_MOVE, + HELP_MOVING_ITEMS, + HELP_USING_PLAYERS_PC, + HELP_USING_WITHDRAW_ITEM, + HELP_USING_DEPOSIT_ITEM, + HELP_USING_MAILBOX, + HELP_USING_PROF_OAKS_PC, + HELP_USING_HALL_OF_FAME, + HELP_END +}; + +static const u8 sHowTo_PlayersPCMailbox[] = { + HELP_USING_PC, + HELP_USING_BILLS_PC, + HELP_USING_WITHDRAW, + HELP_USING_DEPOSIT, + HELP_USING_MOVE, + HELP_MOVING_ITEMS, + HELP_USING_PLAYERS_PC, + HELP_USING_WITHDRAW_ITEM, + HELP_USING_DEPOSIT_ITEM, + HELP_USING_MAILBOX, + HELP_USING_PROF_OAKS_PC, + HELP_USING_HALL_OF_FAME, + HELP_END +}; + +static const u8 sHowTo_PCMisc[] = { + HELP_USING_PC, + HELP_USING_BILLS_PC, + HELP_USING_WITHDRAW, + HELP_USING_DEPOSIT, + HELP_USING_MOVE, + HELP_MOVING_ITEMS, + HELP_USING_PLAYERS_PC, + HELP_USING_WITHDRAW_ITEM, + HELP_USING_DEPOSIT_ITEM, + HELP_USING_MAILBOX, + HELP_USING_PROF_OAKS_PC, + HELP_USING_HALL_OF_FAME, + HELP_END +}; + +static const u8 sHowTo_BedroomPC[] = { + HELP_USING_HOME_PC, + HELP_USING_ITEM_STORAGE, + HELP_USING_WITHDRAW_ITEM2, + HELP_USING_DEPOSIT_ITEM2, + HELP_USING_MAILBOX2, + HELP_END +}; + +static const u8 sHowTo_BedroomPCItems[] = { + HELP_USING_HOME_PC, + HELP_USING_ITEM_STORAGE, + HELP_USING_WITHDRAW_ITEM2, + HELP_USING_DEPOSIT_ITEM2, + HELP_USING_MAILBOX2, + HELP_END +}; + +static const u8 sHowTo_BedroomPCMailbox[] = { + HELP_USING_HOME_PC, + HELP_USING_ITEM_STORAGE, + HELP_USING_WITHDRAW_ITEM2, + HELP_USING_DEPOSIT_ITEM2, + HELP_USING_MAILBOX2, + HELP_END +}; + +static const u8 sTerms_Basic[] = { + HELP_TERM_LEVEL, + HELP_TERM_HP, + HELP_TERM_EXP, + HELP_TERM_MOVES, + HELP_TERM_TM, + HELP_TERM_HM_MOVE, + HELP_TERM_HM, + HELP_TERM_ATTACK, + HELP_TERM_DEFENSE, + HELP_TERM_SPATK, + HELP_TERM_SPDEF, + HELP_TERM_SPEED, + HELP_TERM_TYPE, + HELP_TERM_OT, + HELP_TERM_ITEM, + HELP_TERM_ABILITY, + HELP_TERM_MOVE_TYPE, + HELP_TERM_NATURE, + HELP_TERM_ID_NO, + HELP_TERM_PP, + HELP_TERM_POWER, + HELP_TERM_ACCURACY, + HELP_TERM_STATUS_PROBLEM, + HELP_TERM_FNT, + HELP_TERM_EVOLUTION, + HELP_TERM_ITEMS, + HELP_TERM_KEYITEMS, + HELP_TERM_POKEBALLS, + HELP_TERM_PLAY_TIME, + HELP_TERM_MONEY, + HELP_TERM_BADGES, + HELP_END +}; + + +// Cant get this to match as a 2D array but it probably should be one, [HELPCONTEXT_COUNT][TOPIC_COUNT - 1] (Excludes TOPIC_EXIT) +static const u8 *const sHelpSystemSubmenuItemLists[HELPCONTEXT_COUNT * (TOPIC_COUNT - 1)] = { + NULL, NULL, NULL, NULL, NULL, // HELPCONTEXT_NONE + NULL, NULL, NULL, sAboutGame_TitleScreen, NULL, // HELPCONTEXT_TITLE_SCREEN + NULL, NULL, NULL, sAboutGame_NewGame, NULL, // HELPCONTEXT_NEW_GAME + NULL, sHowTo_NamingScreen, NULL, sAboutGame_NamingScreen, NULL, // HELPCONTEXT_NAMING_SCREEN + NULL, sHowTo_Pokedex, NULL, NULL, NULL, // HELPCONTEXT_POKEDEX + NULL, sHowTo_PartyMenu, sTerms_PartyMenu, NULL, NULL, // HELPCONTEXT_PARTY_MENU + NULL, sHowTo_PokemonInfo, sTerms_PokemonInfo, NULL, NULL, // HELPCONTEXT_POKEMON_INFO + NULL, NULL, sTerms_PokemonSkills, NULL, NULL, // HELPCONTEXT_POKEMON_SKILLS + NULL, NULL, sTerms_PokemonMoves, NULL, NULL, // HELPCONTEXT_POKEMON_MOVES + NULL, sHowTo_Bag, sTerms_Bag, NULL, NULL, // HELPCONTEXT_BAG + NULL, sHowTo_TrainerCardFront, sTerms_TrainerCardFront, NULL, NULL, // HELPCONTEXT_TRAINER_CARD_FRONT + NULL, sHowTo_TrainerCardBack, NULL, NULL, NULL, // HELPCONTEXT_TRAINER_CARD_BACK + NULL, sHowTo_Save, sTerms_Save, NULL, NULL, // HELPCONTEXT_SAVE + NULL, sHowTo_Options, sTerms_Options, NULL, NULL, // HELPCONTEXT_OPTIONS + sWhatToDo_PlayersHouse, NULL, NULL, sAboutGame_PlayersHouse, NULL, // HELPCONTEXT_PLAYERS_HOUSE + sWhatToDo_OaksLab, sHowTo_OaksLab, sTerms_OaksLab, NULL, NULL, // HELPCONTEXT_OAKS_LAB + sWhatToDo_PokeCenter, sHowTo_PokeCenter, sTerms_PokeCenter, sAboutGame_PokeCenter, NULL, // HELPCONTEXT_POKECENTER + sWhatToDo_Mart, sHowTo_Mart, sTerms_Mart, NULL, NULL, // HELPCONTEXT_MART + sWhatToDo_Gym, sHowTo_Gym, sTerms_Gym, NULL, sTypeMatchups_Gym, // HELPCONTEXT_GYM + sWhatToDo_Indoors, sHowTo_Indoors, sTerms_Indoors, NULL, NULL, // HELPCONTEXT_INDOORS + sWhatToDo_Overworld, sHowTo_Overworld, sTerms_Overworld, NULL, NULL, // HELPCONTEXT_OVERWORLD + sWhatToDo_Dungeon, sHowTo_Dungeon, sTerms_Dungeon, NULL, NULL, // HELPCONTEXT_DUNGEON + sWhatToDo_Surfing, sHowTo_Surfing, sTerms_Surfing, NULL, NULL, // HELPCONTEXT_SURFING + sWhatToDo_WildBattle, sHowTo_WildBattle, sTerms_WildBattle, NULL, sTypeMatchups_WildBattle, // HELPCONTEXT_WILD_BATTLE + sWhatToDo_TrainerBattleSingle, sHowTo_TrainerBattleSingle, sTerms_TrainerBattleSingle, NULL, sTypeMatchups_TrainerBattleSingle, // HELPCONTEXT_TRAINER_BATTLE_SINGLE + sWhatToDo_TrainerBattleDouble, sHowTo_TrainerBattleDouble, sTerms_TrainerBattleDouble, NULL, sTypeMatchups_TrainerBattleDouble, // HELPCONTEXT_TRAINER_BATTLE_DOUBLE + sWhatToDo_SafariBattle, sHowTo_SafariBattle, sTerms_SafariBattle, NULL, sTypeMatchups_SafariBattle, // HELPCONTEXT_SAFARI_BATTLE + NULL, sHowTo_PC, NULL, NULL, NULL, // HELPCONTEXT_PC + NULL, sHowTo_BillsPC, NULL, NULL, NULL, // HELPCONTEXT_BILLS_PC + NULL, sHowTo_PlayersPCItems, NULL, NULL, NULL, // HELPCONTEXT_PLAYERS_PC_ITEMS + NULL, sHowTo_PlayersPCMailbox, NULL, NULL, NULL, // HELPCONTEXT_PLAYERS_PC_MAILBOX + NULL, sHowTo_PCMisc, NULL, NULL, NULL, // HELPCONTEXT_PC_MISC + NULL, sHowTo_BedroomPC, NULL, NULL, NULL, // HELPCONTEXT_BEDROOM_PC + NULL, sHowTo_BedroomPCItems, NULL, NULL, NULL, // HELPCONTEXT_BEDROOM_PC_ITEMS + NULL, sHowTo_BedroomPCMailbox, NULL, NULL, NULL, // HELPCONTEXT_BEDROOM_PC_MAILBOX + NULL, NULL, NULL, NULL, NULL // HELPCONTEXT_UNUSED +}; + +static const u16 unref_845BCB0[] = INCBIN_U16("graphics/help_system/unk_845BCB0.bin"); + +static const u8 sHelpSystemContextTopicOrder[TOPIC_COUNT] = { + TOPIC_ABOUT_GAME, + TOPIC_WHAT_TO_DO, + TOPIC_HOW_TO_DO, + TOPIC_TERMS, + TOPIC_TYPE_MATCHUP, + TOPIC_EXIT +}; + +#define CONTEXT_TOPIC_FLAGS(whatToDo, howToDo, terms, aboutGame, typeMatchup, exit) \ + { \ + [TOPIC_WHAT_TO_DO] = whatToDo, \ + [TOPIC_HOW_TO_DO] = howToDo, \ + [TOPIC_TERMS] = terms, \ + [TOPIC_ABOUT_GAME] = aboutGame, \ + [TOPIC_TYPE_MATCHUP] = typeMatchup, \ + [TOPIC_EXIT] = exit \ + } \ + +static const bool8 sHelpSystemContextTopicFlags[HELPCONTEXT_COUNT + 1][TOPIC_COUNT] = { + [HELPCONTEXT_NONE] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE), + [HELPCONTEXT_TITLE_SCREEN] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE), + [HELPCONTEXT_NEW_GAME] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE), + [HELPCONTEXT_NAMING_SCREEN] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE), + [HELPCONTEXT_POKEDEX] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), + [HELPCONTEXT_PARTY_MENU] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_POKEMON_INFO] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_POKEMON_SKILLS] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_POKEMON_MOVES] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_BAG] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_TRAINER_CARD_FRONT] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_TRAINER_CARD_BACK] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), + [HELPCONTEXT_SAVE] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_OPTIONS] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_PLAYERS_HOUSE] = CONTEXT_TOPIC_FLAGS( TRUE, FALSE, FALSE, TRUE, FALSE, TRUE), + [HELPCONTEXT_OAKS_LAB] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_POKECENTER] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, TRUE, FALSE, TRUE), + [HELPCONTEXT_MART] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_GYM] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), + [HELPCONTEXT_INDOORS] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_OVERWORLD] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_DUNGEON] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_SURFING] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), + [HELPCONTEXT_WILD_BATTLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), + [HELPCONTEXT_TRAINER_BATTLE_SINGLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), + [HELPCONTEXT_TRAINER_BATTLE_DOUBLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), + [HELPCONTEXT_SAFARI_BATTLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), + [HELPCONTEXT_PC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), + [HELPCONTEXT_BILLS_PC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), + [HELPCONTEXT_PLAYERS_PC_ITEMS] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), + [HELPCONTEXT_PLAYERS_PC_MAILBOX] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), + [HELPCONTEXT_PC_MISC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), + [HELPCONTEXT_BEDROOM_PC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), + [HELPCONTEXT_BEDROOM_PC_ITEMS] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), + [HELPCONTEXT_BEDROOM_PC_MAILBOX] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), + [HELPCONTEXT_UNUSED] = {}, + [HELPCONTEXT_COUNT] = {} +}; + +static const u16 sMartMaps[] = { + MAP_VIRIDIAN_CITY_MART, + MAP_PEWTER_CITY_MART, + MAP_CERULEAN_CITY_MART, + MAP_LAVENDER_TOWN_MART, + MAP_VERMILION_CITY_MART, + MAP_CELADON_CITY_DEPARTMENT_STORE_1F, + MAP_CELADON_CITY_DEPARTMENT_STORE_2F, + MAP_CELADON_CITY_DEPARTMENT_STORE_3F, + MAP_CELADON_CITY_DEPARTMENT_STORE_4F, + MAP_CELADON_CITY_DEPARTMENT_STORE_5F, + MAP_CELADON_CITY_DEPARTMENT_STORE_ROOF, + MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR, + MAP_FUCHSIA_CITY_MART, + MAP_CINNABAR_ISLAND_MART, + MAP_SAFFRON_CITY_MART, + MAP_THREE_ISLAND_MART, + MAP_FOUR_ISLAND_MART, + MAP_SEVEN_ISLAND_MART, + MAP_SIX_ISLAND_MART, + MAP_UNDEFINED +}; + +static const u16 sGymMaps[] = { + MAP_PEWTER_CITY_GYM, + MAP_CERULEAN_CITY_GYM, + MAP_VERMILION_CITY_GYM, + MAP_CELADON_CITY_GYM, + MAP_FUCHSIA_CITY_GYM, + MAP_SAFFRON_CITY_GYM, + MAP_CINNABAR_ISLAND_GYM, + MAP_VIRIDIAN_CITY_GYM, + MAP_UNDEFINED +}; + +static const u8 sDungeonMaps[][3] = { + { MAP_GROUP(VIRIDIAN_FOREST), MAP_NUM(VIRIDIAN_FOREST), 1 }, + { MAP_GROUP(MT_MOON_1F), MAP_NUM(MT_MOON_1F), 3 }, + { MAP_GROUP(ROCK_TUNNEL_1F), MAP_NUM(ROCK_TUNNEL_1F), 2 }, + { MAP_GROUP(DIGLETTS_CAVE_NORTH_ENTRANCE), MAP_NUM(DIGLETTS_CAVE_NORTH_ENTRANCE), 3 }, + { MAP_GROUP(SEAFOAM_ISLANDS_1F), MAP_NUM(SEAFOAM_ISLANDS_1F), 5 }, + { MAP_GROUP(VICTORY_ROAD_1F), MAP_NUM(VICTORY_ROAD_1F), 3 }, + { MAP_GROUP(CERULEAN_CAVE_1F), MAP_NUM(CERULEAN_CAVE_1F), 3 }, + { MAP_GROUP(MT_EMBER_RUBY_PATH_B4F), MAP_NUM(MT_EMBER_RUBY_PATH_B4F), 1 }, + { MAP_GROUP(MT_EMBER_SUMMIT_PATH_1F), MAP_NUM(MT_EMBER_SUMMIT_PATH_1F), 3 }, + { MAP_GROUP(MT_EMBER_RUBY_PATH_B5F), MAP_NUM(MT_EMBER_RUBY_PATH_B5F), 7 }, + { MAP_GROUP(THREE_ISLAND_BERRY_FOREST), MAP_NUM(THREE_ISLAND_BERRY_FOREST), 1 }, + { MAP_GROUP(SIX_ISLAND_PATTERN_BUSH), MAP_NUM(SIX_ISLAND_PATTERN_BUSH), 1 }, + { MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ENTRANCE), MAP_NUM(FIVE_ISLAND_LOST_CAVE_ENTRANCE), 15 }, + { MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), 4 }, + { MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), MAP_NUM(SIX_ISLAND_ALTERING_CAVE), 1 }, + { MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), 7 } +}; + +void SetHelpContextDontCheckBattle(u8 contextId) +{ + sHelpSystemContextId = contextId; } -void SaveMapTiles(void) +void SetHelpContext(u8 contextId) { - RequestDma3Copy((void *)BG_CHAR_ADDR(3), sMapTilesBackup, BG_CHAR_SIZE, DMA3_16BIT); + switch (sHelpSystemContextId) + { + case HELPCONTEXT_WILD_BATTLE: + case HELPCONTEXT_TRAINER_BATTLE_SINGLE: + case HELPCONTEXT_TRAINER_BATTLE_DOUBLE: + case HELPCONTEXT_SAFARI_BATTLE: + if (contextId == HELPCONTEXT_BAG + || contextId == HELPCONTEXT_PARTY_MENU + || contextId == HELPCONTEXT_POKEMON_INFO + || contextId == HELPCONTEXT_POKEMON_SKILLS + || contextId == HELPCONTEXT_POKEMON_MOVES) + break; + // fallthrough + default: + sHelpSystemContextId = contextId; + break; + } } -void SaveMapTextColors(void) +void Script_SetHelpContext(void) { - SaveTextColors( - &sVideoState.savedTextColor[0], - &sVideoState.savedTextColor[1], - &sVideoState.savedTextColor[2] - ); + sHelpSystemContextId = gSpecialVar_0x8004; } -void RestoreCallbacks(void) +void BackupHelpContext(void) { - gMain.vblankCallback = sVideoState.savedVblankCb; - gMain.hblankCallback = sVideoState.savedHblankCb; + gHelpContextIdBackup = sHelpSystemContextId; } -void RestoreGPURegs(void) +void RestoreHelpContext(void) { - SetGpuReg(REG_OFFSET_BLDCNT, sVideoState.savedBldCnt); - SetGpuReg(REG_OFFSET_BG0HOFS, sVideoState.savedBg0Hofs); - SetGpuReg(REG_OFFSET_BG0VOFS, sVideoState.savedBg0Vofs); - SetGpuReg(REG_OFFSET_BG0CNT, sVideoState.savedBg0Cnt); - SetGpuReg(REG_OFFSET_DISPCNT, sVideoState.savedDispCnt); + sHelpSystemContextId = gHelpContextIdBackup; } -void RestoreMapTiles(void) +static bool32 IsInMartMap(void) { - RequestDma3Copy(sMapTilesBackup, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT); + return IsCurrentMapInArray(sMartMaps); } -void RestoreMapTextColors(void) +static bool32 IsInGymMap(void) { - RestoreTextColors( - &sVideoState.savedTextColor[0], - &sVideoState.savedTextColor[1], - &sVideoState.savedTextColor[2] - ); + return IsCurrentMapInArray(sGymMaps); } -void CommitTilemap(void) +static bool32 IsCurrentMapInArray(const u16 * mapIdxs) { - RequestDma3Copy(gDecompressionBuffer, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT); + u16 mapIdx = (gSaveBlock1Ptr->location.mapGroup << 8) + gSaveBlock1Ptr->location.mapNum; + s32 i; + + for (i = 0; mapIdxs[i] != MAP_UNDEFINED; i++) + { + if (mapIdxs[i] == mapIdx) + return TRUE; + } + + return FALSE; } -void HS_DrawBgTilemapRect(u16 baseTile, u8 left, u8 top, u8 width, u8 height, u16 increment) +static bool8 IsInDungeonMap(void) { - u16 i, j; + u8 i, j; - for (i = top; i < top + height; i++) + for (i = 0; i < NELEMS(sDungeonMaps); i++) { - for (j = left; j < left + width; j++) + for (j = 0; j < sDungeonMaps[i][2]; j++) { - *((u16 *)(gDecompressionBuffer + 0x3800 + 64 * i + 2 * j)) = baseTile; - baseTile += increment; + if ( + sDungeonMaps[i][0] == gSaveBlock1Ptr->location.mapGroup + && sDungeonMaps[i][1] + j == gSaveBlock1Ptr->location.mapNum + && (i != 15 /* TANOBY */ || FlagGet(FLAG_SYS_UNLOCKED_TANOBY_RUINS) == TRUE) + ) + return TRUE; } } - CommitTilemap(); + return FALSE; } -void sub_813BCF4(void) -{ - HS_DrawBgTilemapRect(0x1FF, 0, 0, 30, 20, 0); -} +#define IN_PLAYERS_HOUSE \ + ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) \ + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)) \ + || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F) \ + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F))) \ + + #define IN_OAKS_LAB \ + (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PROFESSOR_OAKS_LAB) \ + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PROFESSOR_OAKS_LAB)) \ -void sub_813BD14(u8 mode) +void SetHelpContextForMap(void) { - switch (mode) + HelpSystem_EnableToggleWithRButton(); + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) + SetHelpContext(HELPCONTEXT_SURFING); + else if (IsInDungeonMap()) + SetHelpContext(HELPCONTEXT_DUNGEON); + else if (IsMapTypeIndoors(gMapHeader.mapType)) { - case 0: - HS_DrawBgTilemapRect(0x1FF, 1, 0, 7, 2, 0); - break; - case 1: - HS_DrawBgTilemapRect(0x1E8, 1, 0, 7, 2, 1); - break; + if (IN_PLAYERS_HOUSE) + SetHelpContext(HELPCONTEXT_PLAYERS_HOUSE); + else if (IN_OAKS_LAB) + SetHelpContext(HELPCONTEXT_OAKS_LAB); + else if (IsCurMapPokeCenter() == TRUE) + SetHelpContext(HELPCONTEXT_POKECENTER); + else if (IsInMartMap() == TRUE) + SetHelpContext(HELPCONTEXT_MART); + else if (IsInGymMap() == TRUE) + SetHelpContext(HELPCONTEXT_GYM); + else + SetHelpContext(HELPCONTEXT_INDOORS); } + else + SetHelpContext(HELPCONTEXT_OVERWORLD); } -void sub_813BD5C(u8 mode) +bool8 HelpSystem_UpdateHasntSeenIntro(void) { - switch (mode) - { - case 0: - HS_DrawBgTilemapRect(0x1FF, 13, 0, 16, 2, 0); - break; - case 1: - HS_DrawBgTilemapRect(0x1A0, 13, 0, 16, 2, 1); - break; - } + if (sSeenHelpSystemIntro == TRUE) + return FALSE; + + if (gSaveFileStatus != SAVE_STATUS_EMPTY && gSaveFileStatus != SAVE_STATUS_INVALID && FlagGet(FLAG_SYS_SAW_HELP_SYSTEM_INTRO)) + return FALSE; + + FlagSet(FLAG_SYS_SAW_HELP_SYSTEM_INTRO); + sSeenHelpSystemIntro = TRUE; + return TRUE; } -void sub_813BDA4(u8 mode) +bool8 HelpSystem_IsSinglePlayer(void) { - switch (mode) - { - case 0: - HS_DrawBgTilemapRect(0x1FF, 2, 3, 26, 16, 0); - break; - case 1: - HS_DrawBgTilemapRect(0x000, 2, 3, 26, 16, 1); - break; - } + if (gReceivedRemoteLinkPlayers == TRUE) + return FALSE; + return TRUE; } -void sub_813BDE8(u8 mode) +void HelpSystem_Disable(void) { - switch (mode) - { - case 0: - HS_DrawBgTilemapRect(0x1FF, 1, 3, 28, 16, 0); - break; - case 1: - HS_DrawBgTilemapRect(0x1FA, 1, 3, 28, 17, 0); - break; - } + gHelpSystemEnabled = FALSE; } -void sub_813BE30(u8 mode) +void HelpSystem_Enable(void) { - switch (mode) + if (!QL_IS_PLAYBACK_STATE) { - case 0: - HS_DrawBgTilemapRect(0x1FF, 2, 14, 26, 5, 0); - break; - case 1: - HS_DrawBgTilemapRect(0x11E, 2, 14, 26, 5, 1); - break; + gHelpSystemEnabled = TRUE; + HelpSystem_EnableToggleWithRButton(); } } -void sub_813BE78(u8 mode) +void HelpSystem_DisableToggleWithRButton(void) { - switch (mode) - { - case 0: - HS_DrawBgTilemapRect(0x1FF, 1, 2, 28, 1, 0); - HS_DrawBgTilemapRect(0x1FF, 1, 19, 28, 1, 0); - break; - case 1: - HS_DrawBgTilemapRect(0x1F7, 1, 2, 28, 1, 0); - HS_DrawBgTilemapRect(0x1F8, 1, 19, 28, 1, 0); - break; - } + gHelpSystemToggleWithRButtonDisabled = TRUE; } -void sub_813BEE4(u8 mode) +void HelpSystem_EnableToggleWithRButton(void) { - switch (mode) - { - case 0: - HS_DrawBgTilemapRect(0x1FF, 1, 2, 28, 1, 0); - HS_DrawBgTilemapRect(0x1FF, 1, 19, 28, 1, 0); - break; - case 1: - HS_DrawBgTilemapRect(0x1FB, 1, 2, 28, 1, 0); - HS_DrawBgTilemapRect(0x1FC, 1, 19, 28, 1, 0); - break; - } + gHelpSystemToggleWithRButtonDisabled = FALSE; } -void sub_813BF50(u8 mode) +static void ResetHelpSystemListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - switch (mode) - { - case 0: - HS_DrawBgTilemapRect(0x1FF, 0, 0, 1, 20, 0); - HS_DrawBgTilemapRect(0x1FF, 29, 0, 1, 20, 0); - break; - case 1: - HS_DrawBgTilemapRect(0x1F9, 0, 0, 1, 20, 0); - HS_DrawBgTilemapRect(0x1F9, 29, 0, 1, 20, 0); - break; - } + helpListMenu->sub.items = listMenuItemsBuffer; + helpListMenu->sub.totalItems = 1; + helpListMenu->sub.maxShowed = 1; + helpListMenu->sub.left = 1; + helpListMenu->sub.top = 4; } -void sub_813BFC0(u8 mode) +static void BuildAndPrintMainTopicsListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - switch (mode) - { - case 0: - HS_DrawBgTilemapRect(0x1FF, 1, 5, 28, 1, 0); - break; - case 1: - HS_DrawBgTilemapRect(0x1FC, 1, 5, 28, 1, 0); - break; - } + ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer); + BuildMainTopicsListAndMoveToH00(helpListMenu, listMenuItemsBuffer); + PrintTextOnPanel2Row52RightAlign(gText_HelpSystemControls_PickOkEnd); + HelpSystem_InitListMenuController(helpListMenu, 0, gHelpSystemState.scrollMain); + PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer); + HS_ShowOrHideMainWindowText(1); + HS_ShowOrHideControlsGuideInTopRight(1); } -void sub_813C004(u8 a0, u8 mode) +static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - switch (mode) + u8 i; + u8 totalItems = 0; + for (i = 0; i < TOPIC_COUNT; i++) { - case 0: - HS_DrawBgTilemapRect(0x1FF, 28, 3, 1, 1, 0); - HS_DrawBgTilemapRect(0x1FF, 28, 18, 1, 1, 0); - break; - case 1: - if (a0 == 0) - HS_DrawBgTilemapRect(0x1FE, 28, 3, 1, 1, 0); - else - HS_DrawBgTilemapRect(0x1FD, 28, 18, 1, 1, 0); - break; + if (sHelpSystemContextTopicFlags[sHelpSystemContextId][sHelpSystemContextTopicOrder[i]] == TRUE) + { + listMenuItemsBuffer[totalItems].label = sHelpSystemTopicPtrs[sHelpSystemContextTopicOrder[i]]; + listMenuItemsBuffer[totalItems].index = sHelpSystemContextTopicOrder[i]; + totalItems++; + } } + listMenuItemsBuffer[totalItems - 1].index = -2; + helpListMenu->sub.totalItems = totalItems; + helpListMenu->sub.maxShowed = totalItems; + helpListMenu->sub.left = 0; } -#define HelpSystemHandleRenderGlyph(character) ({\ - do {DecompressAndRenderGlyph(font, character, &srcBlit, &destBlit, dest, x, y, width, height);} while (0); font;\ -}) +static void BuildAndPrintSubmenuList(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) +{ + HS_SetMainWindowBgBrightness(0); + HS_ShowOrHideHeaderLine_Darker_FooterStyle(0); + HS_ShowOrHideHeaderAndFooterLines_Lighter(1); + ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer); + SetHelpSystemSubmenuItems(helpListMenu, listMenuItemsBuffer); + PrintTextOnPanel2Row52RightAlign(gText_HelpSystemControls_PickOkCancel); + HelpSystem_InitListMenuController(helpListMenu, helpListMenu->itemsAbove, helpListMenu->cursorPos); + HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[gHelpSystemState.topic], 0, 0); + HS_ShowOrHideMainWindowText(1); + HS_ShowOrHideControlsGuideInTopRight(1); +} -#ifdef NONMATCHING -void HelpSystemRenderText(u8 font, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height) +static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - // font -> sp+24 - // dest -> sp+28 - // src -> r9 - // x -> sp+34 - // y -> r10 - // width -> sp+2C - // height -> sp+30 - struct Bitmap srcBlit; - struct Bitmap destBlit; + u8 totalItems = 0; + const u8 * submenuItems = sHelpSystemSubmenuItemLists[sHelpSystemContextId * 5 + gHelpSystemState.topic]; // accessing as 2D array u8 i; - u8 orig_x = x; - s32 clearPixels; - - while (1) + for (i = 0; submenuItems[i] != HELP_END; i++) { - u16 curChar = *src++; - switch (curChar) + if (IsHelpSystemSubmenuEnabled(submenuItems[i]) == TRUE) { - case EOS: - return; - case PLACEHOLDER_BEGIN: - curChar = *src++; - if (curChar == 1) { - for (i = 0; i < 10; i++) - { - if (gSaveBlock2Ptr->playerName[i] == EOS) - break; - HelpSystemHandleRenderGlyph(gSaveBlock2Ptr->playerName[i]); - x += gGlyphInfo[0x80]; - } - } - else if (curChar == 2) - { - for (i = 0; ; i++) - { - if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC) == TRUE) - { - if (gString_Bill[i] == EOS) - break; - HelpSystemHandleRenderGlyph(gString_Bill[i]); - } - else - { - if (gString_Someone[i] == EOS) - break; - HelpSystemHandleRenderGlyph(gString_Someone[i]); - } - x += gGlyphInfo[0x80]; - } - } - break; - case CHAR_PROMPT_SCROLL: - case CHAR_PROMPT_CLEAR: - case CHAR_NEWLINE: - x = orig_x; - y += gGlyphInfo[0x81] + 1; - break; - case EXT_CTRL_CODE_BEGIN: - curChar = *src++; - switch (curChar) - { - case 4: - src++; - //fallthrough - case 11: - case 16: - src++; - //fallthrough - case 1: - case 2: - case 3: - case 5: - case 6: - case 8: - case 12: - case 13: - case 14: - src++; - break; - case 19: - clearPixels = *src + orig_x - x; - if (clearPixels > 0) - { - destBlit.pixels = dest; - destBlit.width = width * 8; - destBlit.height = height * 8; - FillBitmapRect4Bit(&destBlit, x, y, clearPixels, GetFontAttribute(font, 1), 0); - x += clearPixels; - } - src++; - break; - case 17: - case 18: - case 20: - src++; - break; - case 7: - case 9: - case 10: - case 15: - case 21: - case 22: - break; - } - break; - case CHAR_KEYPAD_ICON: - curChar = *src++; - srcBlit.pixels = (u8 *)gKeypadIconTiles + 0x20 * GetKeypadIconTileOffset(curChar); - srcBlit.width = 0x80; - srcBlit.height = 0x80; - destBlit.pixels = dest; - destBlit.width = width * 8; - destBlit.height = height * 8; - BlitBitmapRect4Bit(&srcBlit, &destBlit, 0, 0, x, y, GetKeypadIconWidth(curChar), GetKeypadIconHeight(curChar), 0); - x += GetKeypadIconWidth(curChar); - break; - case CHAR_EXTRA_EMOJI: - curChar = 0x100 | *src++; - //fallthrough - default: - if (curChar == CHAR_SPACE) - { - if (font == 0) - x += 5; - else - x += 4; - } - else - { - HelpSystemHandleRenderGlyph(curChar); - x += gGlyphInfo[0x80]; - } - break; + if (gHelpSystemState.topic == TOPIC_WHAT_TO_DO) + listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedQuestionTextPtrs[submenuItems[i]]; + else if (gHelpSystemState.topic == TOPIC_HOW_TO_DO) + listMenuItemsBuffer[totalItems].label = sHelpSystemMenuTopicTextPtrs[submenuItems[i]]; + else if (gHelpSystemState.topic == TOPIC_TERMS) + listMenuItemsBuffer[totalItems].label = sHelpSystemTermTextPtrs[submenuItems[i]]; + else if (gHelpSystemState.topic == TOPIC_ABOUT_GAME) + listMenuItemsBuffer[totalItems].label = sHelpSystemGeneralTopicTextPtrs[submenuItems[i]]; + else // TOPIC_TYPE_MATCHUP + listMenuItemsBuffer[totalItems].label = sHelpSystemTypeMatchupTextPtrs[submenuItems[i]]; + listMenuItemsBuffer[totalItems].index = submenuItems[i]; + totalItems++; + } + } + if (HelpSystem_ShouldShowBasicTerms() == TRUE) + { + for (i = 0, submenuItems = sTerms_Basic; submenuItems[i] != HELP_END; i++) + { + listMenuItemsBuffer[totalItems].label = sHelpSystemTermTextPtrs[submenuItems[i]]; + listMenuItemsBuffer[totalItems].index = submenuItems[i]; + totalItems++; } } + listMenuItemsBuffer[totalItems].label = Help_Text_Cancel; + listMenuItemsBuffer[totalItems].index = -2; + totalItems++; + helpListMenu->sub.totalItems = totalItems; + helpListMenu->sub.maxShowed = 7; + helpListMenu->sub.left = 0; + helpListMenu->sub.top = 21; } -#else -NAKED -void HelpSystemRenderText(u8 font, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height) + +static bool8 HelpSystem_ShouldShowBasicTerms(void) { - 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, 0x38\n" - "\tstr r1, [sp, 0x28]\n" - "\tmov r9, r2\n" - "\tldr r1, [sp, 0x58]\n" - "\tldr r2, [sp, 0x5C]\n" - "\tldr r4, [sp, 0x60]\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tstr r0, [sp, 0x24]\n" - "\tlsls r3, 24\n" - "\tlsrs r7, r3, 24\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tmov r10, r1\n" - "\tlsls r2, 24\n" - "\tlsrs r2, 24\n" - "\tstr r2, [sp, 0x2C]\n" - "\tlsls r4, 24\n" - "\tlsrs r4, 24\n" - "\tstr r4, [sp, 0x30]\n" - "\tstr r7, [sp, 0x34]\n" - "_0813C0AC_masterLoop:\n" - "\tmov r0, r9\n" - "\tldrb r1, [r0]\n" - "\tmovs r2, 0x1\n" - "\tadd r9, r2\n" - "\tadds r0, r1, 0\n" - "\tsubs r0, 0xF8\n" - "\tcmp r0, 0x7\n" - "\tbls _0813C0BE\n" - "\tb _0813C358\n" - "_0813C0BE:\n" - "\tlsls r0, 2\n" - "\tldr r1, _0813C0C8 @ =_0813C0CC\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_0813C0C8: .4byte _0813C0CC\n" - "\t.align 2, 0\n" - "_0813C0CC:\n" - "\t.4byte _0813C2D4\n" - "\t.4byte _0813C348\n" - "\t.4byte _0813C1E4\n" - "\t.4byte _0813C1E4\n" - "\t.4byte _0813C200\n" - "\t.4byte _0813C0EC\n" - "\t.4byte _0813C1E4\n" - "\t.4byte _0813C39C\n" - "_0813C0EC:\n" - "\tmov r0, r9\n" - "\tldrb r1, [r0]\n" - "\tmovs r2, 0x1\n" - "\tadd r9, r2\n" - "\tcmp r1, 0x1\n" - "\tbne _0813C154\n" - "\tmovs r4, 0\n" - "\tldr r0, _0813C14C @ =gSaveBlock2Ptr\n" - "\tldr r1, [r0]\n" - "\tldrb r1, [r1]\n" - "\tcmp r1, 0xFF\n" - "\tbeq _0813C0AC_masterLoop\n" - "\tldr r5, _0813C150 @ =gGlyphInfo + 0x80\n" - "_0813C106:\n" - "\tldr r0, [r0]\n" - "\tadds r0, r4\n" - "\tldrb r1, [r0]\n" - "\tldr r0, [sp, 0x28]\n" - "\tstr r0, [sp]\n" - "\tstr r7, [sp, 0x4]\n" - "\tmov r2, r10\n" - "\tstr r2, [sp, 0x8]\n" - "\tldr r0, [sp, 0x2C]\n" - "\tstr r0, [sp, 0xC]\n" - "\tldr r2, [sp, 0x30]\n" - "\tstr r2, [sp, 0x10]\n" - "\tldr r0, [sp, 0x24]\n" - "\tadd r2, sp, 0x14\n" - "\tadd r3, sp, 0x1C\n" - "\tbl DecompressAndRenderGlyph\n" - "\tldr r0, [sp, 0x24]\n" - "\tldrb r0, [r5]\n" - "\tadds r0, r7, r0\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tadds r0, r4, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tcmp r4, 0x9\n" - "\tbhi _0813C0AC_masterLoop\n" - "\tldr r0, _0813C14C @ =gSaveBlock2Ptr\n" - "\tldr r1, [r0]\n" - "\tadds r1, r4\n" - "\tldrb r1, [r1]\n" - "\tcmp r1, 0xFF\n" - "\tbne _0813C106\n" - "\tb _0813C0AC_masterLoop\n" - "\t.align 2, 0\n" - "_0813C14C: .4byte gSaveBlock2Ptr\n" - "_0813C150: .4byte gGlyphInfo + 0x80\n" - "_0813C154:\n" - "\tcmp r1, 0x2\n" - "\tbne _0813C0AC_masterLoop\n" - "\tmovs r4, 0\n" - "\tldr r5, _0813C160 @ =gGlyphInfo + 0x80\n" - "\tb _0813C1BC\n" - "\t.align 2, 0\n" - "_0813C160: .4byte gGlyphInfo + 0x80\n" - "_0813C164:\n" - "\tldrb r1, [r1]\n" - "\tldr r2, [sp, 0x28]\n" - "\tstr r2, [sp]\n" - "\tstr r7, [sp, 0x4]\n" - "\tmov r0, r10\n" - "\tstr r0, [sp, 0x8]\n" - "\tldr r2, [sp, 0x2C]\n" - "\tstr r2, [sp, 0xC]\n" - "\tldr r0, [sp, 0x30]\n" - "\tstr r0, [sp, 0x10]\n" - "\tldr r0, [sp, 0x24]\n" - "\tadd r2, sp, 0x14\n" - "\tadd r3, sp, 0x1C\n" - "\tbl DecompressAndRenderGlyph\n" - "\tb _0813C1AC\n" - "_0813C184:\n" - "\tldr r0, _0813C1D8 @ =gString_Someone\n" - "\tadds r1, r4, r0\n" - "\tldrb r0, [r1]\n" - "\tcmp r0, 0xFF\n" - "\tbeq _0813C0AC_masterLoop\n" - "\tadds r1, r0, 0\n" - "\tldr r2, [sp, 0x28]\n" - "\tstr r2, [sp]\n" - "\tstr r7, [sp, 0x4]\n" - "\tmov r0, r10\n" - "\tstr r0, [sp, 0x8]\n" - "\tldr r2, [sp, 0x2C]\n" - "\tstr r2, [sp, 0xC]\n" - "\tldr r0, [sp, 0x30]\n" - "\tstr r0, [sp, 0x10]\n" - "\tldr r0, [sp, 0x24]\n" - "\tadd r2, sp, 0x14\n" - "\tadd r3, sp, 0x1C\n" - "\tbl DecompressAndRenderGlyph\n" - "_0813C1AC:\n" - "\tldr r1, [sp, 0x24]\n" - "\tldrb r0, [r5]\n" - "\tadds r0, r7, r0\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tadds r0, r4, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "_0813C1BC:\n" - "\tldr r0, _0813C1DC @ =0x00000834\n" - "\tbl FlagGet\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x1\n" - "\tbne _0813C184\n" - "\tldr r0, _0813C1E0 @ =gString_Bill\n" - "\tadds r1, r4, r0\n" - "\tldrb r0, [r1]\n" - "\tcmp r0, 0xFF\n" - "\tbne _0813C164\n" - "\tb _0813C0AC_masterLoop\n" - "\t.align 2, 0\n" - "_0813C1D8: .4byte gString_Someone\n" - "_0813C1DC: .4byte 0x00000834\n" - "_0813C1E0: .4byte gString_Bill\n" - "_0813C1E4:\n" - "\tldr r7, [sp, 0x34]\n" - "\tldr r1, _0813C1FC @ =gGlyphInfo\n" - "\tadds r1, 0x81\n" - "\tmov r0, r10\n" - "\tadds r0, 0x1\n" - "\tldrb r1, [r1]\n" - "\tadds r0, r1\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmov r10, r0\n" - "\tb _0813C0AC_masterLoop\n" - "\t.align 2, 0\n" - "_0813C1FC: .4byte gGlyphInfo\n" - "_0813C200:\n" - "\tmov r2, r9\n" - "\tldrb r1, [r2]\n" - "\tmovs r0, 0x1\n" - "\tadd r9, r0\n" - "\tsubs r0, r1, 0x1\n" - "\tcmp r0, 0x15\n" - "\tbls _0813C210\n" - "\tb _0813C0AC_masterLoop\n" - "_0813C210:\n" - "\tlsls r0, 2\n" - "\tldr r1, _0813C21C @ =_0813C220\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_0813C21C: .4byte _0813C220\n" - "\t.align 2, 0\n" - "_0813C220:\n" - "\t.4byte _0813C2C8\n" - "\t.4byte _0813C2C8\n" - "\t.4byte _0813C2C8\n" - "\t.4byte _0813C278\n" - "\t.4byte _0813C2C8\n" - "\t.4byte _0813C2C8\n" - "\t.4byte _0813C0AC_masterLoop\n" - "\t.4byte _0813C2C8\n" - "\t.4byte _0813C0AC_masterLoop\n" - "\t.4byte _0813C0AC_masterLoop\n" - "\t.4byte _0813C27C\n" - "\t.4byte _0813C2C8\n" - "\t.4byte _0813C2C8\n" - "\t.4byte _0813C2C8\n" - "\t.4byte _0813C0AC_masterLoop\n" - "\t.4byte _0813C27C\n" - "\t.4byte _0813C2CE\n" - "\t.4byte _0813C2CE\n" - "\t.4byte _0813C282\n" - "\t.4byte _0813C2CE\n" - "\t.4byte _0813C0AC_masterLoop\n" - "\t.4byte _0813C0AC_masterLoop\n" - "_0813C278:\n" - "\tmovs r1, 0x1\n" - "\tadd r9, r1\n" - "_0813C27C:\n" - "\tmovs r2, 0x1\n" - "\tadd r9, r2\n" - "\tb _0813C2C8\n" - "_0813C282:\n" - "\tmov r2, r9\n" - "\tldrb r0, [r2]\n" - "\tldr r1, [sp, 0x34]\n" - "\tadds r0, r1\n" - "\tsubs r6, r0, r7\n" - "\tcmp r6, 0\n" - "\tble _0813C2C8\n" - "\tldr r2, [sp, 0x28]\n" - "\tstr r2, [sp, 0x1C]\n" - "\tldr r1, [sp, 0x2C]\n" - "\tlsls r0, r1, 3\n" - "\tadd r4, sp, 0x1C\n" - "\tmovs r5, 0\n" - "\tstrh r0, [r4, 0x4]\n" - "\tldr r2, [sp, 0x30]\n" - "\tlsls r0, r2, 3\n" - "\tstrh r0, [r4, 0x6]\n" - "\tldr r0, [sp, 0x24]\n" - "\tmovs r1, 0x1\n" - "\tbl GetFontAttribute\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tlsls r3, r6, 16\n" - "\tlsrs r3, 16\n" - "\tstr r0, [sp]\n" - "\tstr r5, [sp, 0x4]\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r7, 0\n" - "\tmov r2, r10\n" - "\tbl FillBitmapRect4Bit\n" - "\tadds r0, r7, r6\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "_0813C2C8:\n" - "\tmovs r0, 0x1\n" - "\tadd r9, r0\n" - "\tb _0813C0AC_masterLoop\n" - "_0813C2CE:\n" - "\tmovs r1, 0x1\n" - "\tadd r9, r1\n" - "\tb _0813C0AC_masterLoop\n" - "_0813C2D4:\n" - "\tmov r2, r9\n" - "\tldrb r1, [r2]\n" - "\tmovs r0, 0x1\n" - "\tadd r9, r0\n" - "\tadds r6, r1, 0\n" - "\tadds r0, r6, 0\n" - "\tbl GetKeypadIconTileOffset\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 19\n" - "\tldr r1, _0813C344 @ =gKeypadIconTiles\n" - "\tadds r0, r1\n" - "\tstr r0, [sp, 0x14]\n" - "\tadd r1, sp, 0x14\n" - "\tmovs r2, 0\n" - "\tmov r8, r2\n" - "\tmovs r0, 0x80\n" - "\tstrh r0, [r1, 0x4]\n" - "\tstrh r0, [r1, 0x6]\n" - "\tldr r0, [sp, 0x28]\n" - "\tstr r0, [sp, 0x1C]\n" - "\tldr r1, [sp, 0x2C]\n" - "\tlsls r0, r1, 3\n" - "\tadd r5, sp, 0x1C\n" - "\tstrh r0, [r5, 0x4]\n" - "\tldr r2, [sp, 0x30]\n" - "\tlsls r0, r2, 3\n" - "\tstrh r0, [r5, 0x6]\n" - "\tadds r0, r6, 0\n" - "\tbl GetKeypadIconWidth\n" - "\tadds r4, r0, 0\n" - "\tlsls r4, 24\n" - "\tlsrs r4, 24\n" - "\tadds r0, r6, 0\n" - "\tbl GetKeypadIconHeight\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tstr r7, [sp]\n" - "\tmov r1, r10\n" - "\tstr r1, [sp, 0x4]\n" - "\tstr r4, [sp, 0x8]\n" - "\tstr r0, [sp, 0xC]\n" - "\tmov r2, r8\n" - "\tstr r2, [sp, 0x10]\n" - "\tadd r0, sp, 0x14\n" - "\tadds r1, r5, 0\n" - "\tmovs r2, 0\n" - "\tmovs r3, 0\n" - "\tbl BlitBitmapRect4Bit\n" - "\tadds r0, r6, 0\n" - "\tbl GetKeypadIconWidth\n" - "\tb _0813C38E\n" - "\t.align 2, 0\n" - "_0813C344: .4byte gKeypadIconTiles\n" - "_0813C348:\n" - "\tmov r0, r9\n" - "\tldrb r1, [r0]\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 1\n" - "\tadds r0, r2, 0\n" - "\torrs r1, r0\n" - "\tmovs r0, 0x1\n" - "\tadd r9, r0\n" - "_0813C358:\n" - "\tcmp r1, 0\n" - "\tbne _0813C36A\n" - "\tldr r1, [sp, 0x24]\n" - "\tcmp r1, 0\n" - "\tbne _0813C366\n" - "\tadds r0, r7, 0x5\n" - "\tb _0813C390\n" - "_0813C366:\n" - "\tadds r0, r7, 0x4\n" - "\tb _0813C390\n" - "_0813C36A:\n" - "\tadd r3, sp, 0x1C\n" - "\tldr r2, [sp, 0x28]\n" - "\tstr r2, [sp]\n" - "\tstr r7, [sp, 0x4]\n" - "\tmov r0, r10\n" - "\tstr r0, [sp, 0x8]\n" - "\tldr r2, [sp, 0x2C]\n" - "\tstr r2, [sp, 0xC]\n" - "\tldr r0, [sp, 0x30]\n" - "\tstr r0, [sp, 0x10]\n" - "\tldr r0, [sp, 0x24]\n" - "\tadd r2, sp, 0x14\n" - "\tbl DecompressAndRenderGlyph\n" - "\tldr r1, [sp, 0x24]\n" - "\tldr r0, _0813C398 @ =gGlyphInfo\n" - "\tadds r0, 0x80\n" - "\tldrb r0, [r0]\n" - "_0813C38E:\n" - "\tadds r0, r7, r0\n" - "_0813C390:\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tb _0813C0AC_masterLoop\n" - "\t.align 2, 0\n" - "_0813C398: .4byte gGlyphInfo\n" - "_0813C39C:\n" - "\tadd sp, 0x38\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"); + if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && gHelpSystemState.topic == TOPIC_TERMS) + return TRUE; + return FALSE; } -#endif //NONMATCHING -void DecompressAndRenderGlyph(u8 font, u16 glyph, struct Bitmap *srcBlit, struct Bitmap *destBlit, u8 *destBuffer, u8 x, u8 y, u8 width, u8 height) +static bool8 IsHelpSystemSubmenuEnabled(u8 id) { - if (font == 0) - DecompressGlyphFont0(glyph, FALSE); - else if (font == 5) - DecompressGlyphFont5(glyph, FALSE); - else - DecompressGlyphFont2(glyph, FALSE); - srcBlit->pixels = gGlyphInfo; - srcBlit->width = 16; - srcBlit->height = 16; - destBlit->pixels = destBuffer; - destBlit->width = width * 8; - destBlit->height = height * 8; - BlitBitmapRect4Bit(srcBlit, destBlit, 0, 0, x, y, gGlyphInfo[0x80], gGlyphInfo[0x81], 0); + u8 i = 0; + + if (gHelpSystemState.topic == TOPIC_WHAT_TO_DO) + { + switch (id) + { + case HELP_PLAYING_FOR_FIRST_TIME: + case HELP_WHAT_SHOULD_I_BE_DOING: + case HELP_CANT_GET_OUT_OF_ROOM: + case HELP_TALKED_TO_EVERYONE_NOW_WHAT: + case HELP_OUT_OF_THINGS_TO_DO: + case HELP_NOTHING_I_WANT_TO_KNOW: + case HELP_WHATS_A_MON: + case HELP_WHAT_DO_I_DO_IN_SAFARI: + case HELP_WHAT_ARE_SAFARI_RULES: + case HELP_WANT_TO_END_SAFARI: + return TRUE; + case HELP_CANT_FIND_PERSON_I_WANT: + return FlagGet(FLAG_VISITED_OAKS_LAB); + case HELP_SOMEONE_BLOCKING_MY_WAY: + case HELP_WHAT_ARE_MY_ADVENTURE_BASICS: + case HELP_HOW_DO_I_PREPARE_FOR_BATTLE: + case HELP_WHAT_IS_STATUS_PROBLEM: + case HELP_RAN_OUT_OF_POTIONS: + case HELP_WHATS_POKEMON_CENTER: + case HELP_WHATS_POKEMON_MART: + return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_CITY); + case HELP_I_CANT_GO_ON: + return FlagGet(FLAG_WORLD_MAP_VERMILION_CITY); + case HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT: + case HELP_WHATS_A_TRAINER: + return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST); + case HELP_WHAT_HAPPENED_TO_ITEM_I_GOT: + case HELP_WHEN_CAN_I_USE_ITEM: + case HELP_HOW_DO_I_PROGRESS: + case HELP_WHATS_A_BATTLE: + case HELP_WHAT_IS_A_MONS_VITALITY: + case HELP_MY_MONS_ARE_HURT: + case HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT: + case HELP_WHERE_DO_MONS_APPEAR: + case HELP_WHAT_MOVES_SHOULD_I_USE: + case HELP_WANT_TO_MAKE_MON_STRONGER: + case HELP_WANT_TO_END_GAME: + return FlagGet(FLAG_SYS_POKEMON_GET); + case HELP_CANT_CATCH_MONS: + case HELP_CAN_I_BUY_POKEBALLS: + return FlagGet(FLAG_SYS_POKEDEX_GET); + case HELP_HOW_ARE_CAVES_DIFFERENT: + case HELP_WHAT_DO_I_DO_IN_CAVE: + case HELP_HOW_DO_I_WIN_AGAINST_TRAINER: + case HELP_FOE_MONS_TOO_STRONG: + case HELP_WHAT_ARE_MOVES: + case HELP_WANT_TO_ADD_MORE_MOVES: + return FlagGet(FLAG_BADGE01_GET); + case HELP_WHAT_ARE_HIDDEN_MOVES: + case HELP_WHAT_DOES_HIDDEN_MOVE_DO: + return HasGottenAtLeastOneHM(); + case HELP_WHAT_IS_THAT_PERSON_LIKE: + return FlagGet(FLAG_GOT_FAME_CHECKER); + case HELP_WHAT_IS_A_GYM: + return FlagGet(FLAG_WORLD_MAP_PEWTER_CITY); + } + return FALSE; + } + if (gHelpSystemState.topic == TOPIC_HOW_TO_DO) + { + switch (id) + { + case HELP_USING_BAG: + case HELP_USING_PLAYER: + case HELP_USING_SAVE: + case HELP_USING_OPTION: + case HELP_ENTERING_NAME: + case HELP_USING_PC: + case HELP_USING_BILLS_PC: + case HELP_USING_WITHDRAW: + case HELP_USING_DEPOSIT: + case HELP_USING_MOVE: + case HELP_MOVING_ITEMS: + case HELP_USING_PLAYERS_PC: + case HELP_USING_WITHDRAW_ITEM: + case HELP_USING_DEPOSIT_ITEM: + case HELP_USING_MAILBOX: + case HELP_OPENING_MENU: + case HELP_USING_BAG2: + case HELP_USING_HOME_PC: + case HELP_USING_ITEM_STORAGE: + case HELP_USING_WITHDRAW_ITEM2: + case HELP_USING_DEPOSIT_ITEM2: + case HELP_USING_MAILBOX2: + case HELP_USING_BALL: + case HELP_USING_BAIT: + case HELP_USING_ROCK: + return TRUE; + case HELP_USING_POKEDEX: + case HELP_USING_PROF_OAKS_PC: + case HELP_READING_POKEDEX: + return FlagGet(FLAG_SYS_POKEDEX_GET); + case HELP_USING_TOWN_MAP: + return CheckBagHasItem(ITEM_TOWN_MAP, 1); + case HELP_USING_POKEMON: + case HELP_USING_SUMMARY: + case HELP_USING_ITEM: + case HELP_USING_AN_ITEM: + case HELP_USING_KEYITEM: + case HELP_USING_POKEBALL: + case HELP_USING_POTION: + case HELP_USING_FIGHT: + case HELP_USING_POKEMON2: + case HELP_USING_SUMMARY2: + case HELP_USING_RUN: + case HELP_REGISTER_KEY_ITEM: + return FlagGet(FLAG_SYS_POKEMON_GET); + case HELP_USING_SWITCH: + case HELP_USING_SHIFT: + // Only show if player has caught mon after starter + if (GetKantoPokedexCount(1) > 1) + return TRUE; + return FALSE; + case HELP_USING_TM: + return FlagGet(FLAG_BADGE01_GET); + case HELP_USING_HM: + case HELP_USING_MOVE_OUTSIDE_OF_BATTLE: + return HasGottenAtLeastOneHM(); + case HELP_RIDING_BICYCLE: + return FlagGet(FLAG_GOT_BICYCLE); + case HELP_USING_HALL_OF_FAME: + return FlagGet(FLAG_SYS_GAME_CLEAR); + } + return FALSE; + } + if (gHelpSystemState.topic == TOPIC_TERMS) + { + if (HelpSystem_ShouldShowBasicTerms() == TRUE) + { + // After defeating Brock, all basic terms are added + // This checks to make sure they arent added twice + for (i = 0; sTerms_Basic[i] != HELP_END; i++) + { + if (sTerms_Basic[i] == id) + return FALSE; + } + } + switch (id) + { + case HELP_TERM_MONEY: + case HELP_TERM_ID_NO: + case HELP_TERM_ITEMS: + case HELP_TERM_KEYITEMS: + case HELP_TERM_POKEBALLS: + case HELP_TERM_POKEDEX: + case HELP_TERM_PLAY_TIME: + case HELP_TERM_BADGES: + case HELP_TERM_TEXT_SPEED: + case HELP_TERM_BATTLE_SCENE: + case HELP_TERM_BATTLE_STYLE: + case HELP_TERM_SOUND: + case HELP_TERM_BUTTON_MODE: + case HELP_TERM_FRAME: + case HELP_TERM_CANCEL: + case HELP_TERM_TM: + case HELP_TERM_EVOLUTION: + return TRUE; + case HELP_TERM_HP: + case HELP_TERM_EXP: + case HELP_TERM_ATTACK: + case HELP_TERM_DEFENSE: + case HELP_TERM_SPATK: + case HELP_TERM_SPDEF: + case HELP_TERM_SPEED: + case HELP_TERM_LEVEL: + case HELP_TERM_TYPE: + case HELP_TERM_OT: + case HELP_TERM_ITEM: + case HELP_TERM_ABILITY: + case HELP_TERM_NATURE: + case HELP_TERM_POWER: + case HELP_TERM_ACCURACY: + case HELP_TERM_FNT: + return FlagGet(FLAG_SYS_POKEMON_GET); + case HELP_TERM_HM: + case HELP_TERM_HM_MOVE: + return HasGottenAtLeastOneHM(); + case HELP_TERM_MOVES: + case HELP_TERM_MOVE_TYPE: + case HELP_TERM_PP: + case HELP_TERM_STATUS_PROBLEM: + return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST); + } + return TRUE; + } + if (gHelpSystemState.topic == TOPIC_ABOUT_GAME) + { + switch (id) + { + case HELP_GAME_FUNDAMENTALS_2: + return FlagGet(FLAG_BADGE01_GET); + case HELP_GAME_FUNDAMENTALS_3: + return FlagGet(FLAG_BADGE02_GET); + } + return TRUE; + } + if (gHelpSystemState.topic == TOPIC_TYPE_MATCHUP) + { + return TRUE; + } + + return FALSE; } -void HelpSystem_PrintText_Row61(const u8 * str) +static bool8 HasGottenAtLeastOneHM(void) { - GenerateFontHalfRowLookupTable(1, 15, 2); - HelpSystemRenderText(5, gDecompressionBuffer + 0x3D00, str, 6, 2, 7, 2); + if (FlagGet(FLAG_GOT_HM01) == TRUE) + return TRUE; + if (FlagGet(FLAG_GOT_HM02) == TRUE) + return TRUE; + if (FlagGet(FLAG_GOT_HM03) == TRUE) + return TRUE; + if (FlagGet(FLAG_GOT_HM04) == TRUE) + return TRUE; + if (FlagGet(FLAG_GOT_HM05) == TRUE) + return TRUE; + if (FlagGet(FLAG_GOT_HM06) == TRUE) + return TRUE; + if (FlagGet(FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_HM07) == TRUE) + return TRUE; + return FALSE; } -void HelpSystem_PrintTextRightAlign_Row52(const u8 * str) +bool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - s32 left = 0x7C - GetStringWidth(0, str, 0); - GenerateFontHalfRowLookupTable(1, 15, 2); - HelpSystemRenderText(0, gDecompressionBuffer + 0x3400, str, left, 2, 16, 2); + switch (helpListMenu->state) + { + case 8: + return HelpSystemSubroutine_PrintWelcomeMessage(helpListMenu, listMenuItemsBuffer); + case 9: + return HelpSystemSubroutine_WelcomeWaitButton(helpListMenu, listMenuItemsBuffer); + case 10: + return HelpSystemSubroutine_WelcomeEndGotoMenu(helpListMenu, listMenuItemsBuffer); + case 0: + return HelpSystemSubroutine_MenuInputHandlerMain(helpListMenu, listMenuItemsBuffer); + case 1: + return HelpMenuSubroutine_InitSubmenu(helpListMenu, listMenuItemsBuffer); + case 2: + return HelpMenuSubroutine_ReturnFromSubmenu(helpListMenu, listMenuItemsBuffer); + case 3: + return HelpMenuSubroutine_SubmenuInputHandler(helpListMenu, listMenuItemsBuffer); + case 4: + return HelpMenuSubroutine_HelpItemPrint(helpListMenu, listMenuItemsBuffer); + case 5: + return HelpMenuSubroutine_ReturnFromHelpItem(helpListMenu, listMenuItemsBuffer); + case 6: + return HelpMenuSubroutine_HelpItemWaitButton(helpListMenu, listMenuItemsBuffer); + } + return FALSE; } -void HelpSystem_PrintTextAt(const u8 * str, u8 x, u8 y) +bool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - GenerateFontHalfRowLookupTable(1, 15, 2); - HelpSystemRenderText(2, gDecompressionBuffer + 0x0000, str, x, y, 26, 16); + PrintTextOnPanel2Row52RightAlign(gText_HelpSystemControls_A_Next); + PrintWelcomeMessageOnPanel1(); + HS_ShowOrHideMainWindowText(1); + HS_ShowOrHideControlsGuideInTopRight(1); + helpListMenu->state = 9; + return TRUE; } -void HelpSystem_PrintTwoStrings(const u8 * str1, const u8 * str2) +bool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - CpuFill16(0xEEEE, gDecompressionBuffer + 0x0000, 0x3400); - GenerateFontHalfRowLookupTable(1, 14, 2); - HelpSystemRenderText(2, gDecompressionBuffer + 0x0000, str1, 0, 0, 26, 16); - HelpSystemRenderText(2, gDecompressionBuffer + 0x09C0, str2, 0, 0, 26, 13); + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + helpListMenu->state = 10; + } + return TRUE; } -void HelpSystem_PrintText_813C584(const u8 * str) +bool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - CpuFill16(0x1111, gDecompressionBuffer + 0x23C0, 0x1040); - GenerateFontHalfRowLookupTable(2, 1, 3); - HelpSystemRenderText(2, gDecompressionBuffer + 0x23C0, str, 2, 6, 26, 5); + gHelpSystemState.scrollMain = 0; + ResetHelpSystemCursor(helpListMenu); + BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer); + helpListMenu->state = 0; + return TRUE; } -void HelpSystem_FillPanel3(void) +bool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - CpuFill16(0xFFFF, gDecompressionBuffer + 0x3D00, 0x1C0); + s32 input = HelpSystem_GetMenuInput(); + switch (input) + { + case -6: + case -2: + return FALSE; + case -5: + case -4: + PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer); + break; + case -3: + case -1: + break; + default: + gHelpSystemState.topic = input; + helpListMenu->state = 1; + break; + } + return TRUE; } -void HelpSystem_FillPanel2(void) +bool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - CpuFill16(0xFFFF, gDecompressionBuffer + 0x3400, 0x400); + gHelpSystemState.level = 1; + gHelpSystemState.scrollMain = helpListMenu->cursorPos; + ResetHelpSystemCursor(helpListMenu); + BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer); + HS_UpdateMenuScrollArrows(); + HelpSystem_SetInputDelay(2); + helpListMenu->state = 3; + return TRUE; } -void HelpSystem_FillPanel1(void) +bool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - CpuFill16(0xFFFF, gDecompressionBuffer + 0x0000, 0x3400); + HS_ShowOrHideScrollArrows(0, 0); + HS_ShowOrHideScrollArrows(1, 0); + gHelpSystemState.level = 0; + BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer); + helpListMenu->state = 0; + return TRUE; } -void HelpSystem_InitListMenuController(struct HelpSystemListMenu * a0, u8 a1, u8 a2) +bool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - gHelpSystemListMenu.sub = a0->sub; - gHelpSystemListMenu.itemsAbove = a1; - gHelpSystemListMenu.cursorPos = a2; - gHelpSystemListMenu.state = 0; - if (gHelpSystemListMenu.sub.totalItems < gHelpSystemListMenu.sub.maxShowed) - gHelpSystemListMenu.sub.maxShowed = gHelpSystemListMenu.sub.totalItems; - sub_813BDA4(0); - HelpSystem_FillPanel1(); - PrintListMenuItems(); - PlaceListMenuCursor(); + s32 input = HelpSystem_GetMenuInput(); + switch (input) + { + case -6: + return FALSE; + case -2: + helpListMenu->state = 2; + break; + case -5: + case -4: + case -3: + case -1: + break; + default: + gHelpSystemState.scrollSub = input; + helpListMenu->state = 4; + break; + } + return TRUE; } -void HelpSystem_SetInputDelay(u8 a0) +void HelpSystem_PrintTopicLabel(void) { - sDelayTimer = a0; + HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[gHelpSystemState.topic], 0, 0); } -s32 HelpSystem_GetMenuInput(void) +bool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - if (sDelayTimer != 0) - { - sDelayTimer--; - return -1; - } - else if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos].index; - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - return -2; - } - else if (JOY_NEW(L_BUTTON | R_BUTTON)) + gHelpSystemState.level = 2; + HS_ShowOrHideMainWindowText(0); + HelpSystem_FillPanel1(); + PrintTextOnPanel2Row52RightAlign(gText_HelpSystemControls_AorBtoCancel); + HS_SetMainWindowBgBrightness(1); + HS_ShowOrHideHeaderAndFooterLines_Darker(1); + + if (gHelpSystemState.topic == TOPIC_WHAT_TO_DO) { - return -6; + HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemSpecializedQuestionTextPtrs[gHelpSystemState.scrollSub], sHelpSystemSpecializedAnswerTextPtrs[gHelpSystemState.scrollSub]); } - else if (JOY_REPT(DPAD_UP)) + else if (gHelpSystemState.topic == TOPIC_HOW_TO_DO) { - if (!MoveCursor(1, 0)) - PlaySE(SE_SELECT); - return -4; + HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemMenuTopicTextPtrs[gHelpSystemState.scrollSub], sHelpSystemHowToUseMenuTextPtrs[gHelpSystemState.scrollSub]); } - else if (JOY_REPT(DPAD_DOWN)) + else if (gHelpSystemState.topic == TOPIC_TERMS) { - if (!MoveCursor(1, 1)) - PlaySE(SE_SELECT); - return -5; + HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemTermTextPtrs[gHelpSystemState.scrollSub], sHelpSystemTermDefinitionsTextPtrs[gHelpSystemState.scrollSub]); } - else if (JOY_REPT(DPAD_LEFT)) + else if (gHelpSystemState.topic == TOPIC_ABOUT_GAME) { - if (!MoveCursor(7, 0)) - PlaySE(SE_SELECT); - return -4; + HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemGeneralTopicTextPtrs[gHelpSystemState.scrollSub], sHelpSystemGeneralTopicDescriptionTextPtrs[gHelpSystemState.scrollSub]); } - else if (JOY_REPT(DPAD_RIGHT)) + else // TOPIC_TYPE_MATCHUP { - if (!MoveCursor(7, 1)) - PlaySE(SE_SELECT); - return -5; + HelpSystem_PrintQuestionAndAnswerPair(sHelpSystemTypeMatchupTextPtrs[gHelpSystemState.scrollSub], sHelpSystemTypeMatchupDescriptionTextPtrs[gHelpSystemState.scrollSub]); } - else - return -1; + HS_ShowOrHideMainWindowText(1); + HS_ShowOrHideControlsGuideInTopRight(1); + helpListMenu->state = 6; + return TRUE; } -void sub_813C75C(void) +bool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - u8 r6 = gHelpSystemListMenu.sub.totalItems - 7; - if (gHelpSystemListMenu.sub.totalItems > 7) - { - s32 r4 = gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos; - sub_813C004(0, 0); - if (r4 == 0) - sub_813C004(1, 1); - else if (gHelpSystemListMenu.itemsAbove == 0 && gHelpSystemListMenu.cursorPos != 0) - sub_813C004(1, 1); - else if (gHelpSystemListMenu.itemsAbove == r6) - sub_813C004(0, 1); - else if (gHelpSystemListMenu.itemsAbove != 0) - { - sub_813C004(0, 1); - sub_813C004(1, 1); - } - } + gHelpSystemState.level = 1; + BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer); + HS_UpdateMenuScrollArrows(); + HelpSystem_SetInputDelay(2); + helpListMenu->state = 3; + return TRUE; } -void PrintListMenuItems(void) +bool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - u8 glyphHeight = GetFontAttribute(2, 1) + 1; - s32 i; - s32 r5 = gHelpSystemListMenu.itemsAbove; - - for (i = 0; i < gHelpSystemListMenu.sub.maxShowed; i++) + if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON)) { - u8 x = gHelpSystemListMenu.sub.left + 8; - u8 y = gHelpSystemListMenu.sub.top + glyphHeight * i; - HelpSystem_PrintTextAt(gHelpSystemListMenu.sub.items[r5].label, x, y); - r5++; + PlaySE(SE_SELECT); + helpListMenu->state = 5; + return TRUE; } + if (JOY_NEW(L_BUTTON | R_BUTTON)) + return FALSE; + return TRUE; } -void PlaceListMenuCursor(void) +static void PrintWelcomeMessageOnPanel1(void) { - u8 glyphHeight = GetFontAttribute(2, 1) + 1; - u8 x = gHelpSystemListMenu.sub.left; - u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.cursorPos; - HelpSystem_PrintTextAt(gText_SelectorArrow2, x, y); + HelpSystem_FillPanel1(); + HelpSystem_PrintTextAt(Help_Text_Greetings, 0, 0); } -void sub_813C860(u8 i) +static void PrintTextOnPanel2Row52RightAlign(const u8 * str) { - u8 glyphHeight = GetFontAttribute(2, 1) + 1; - u8 x = gHelpSystemListMenu.sub.left; - u8 y = gHelpSystemListMenu.sub.top + i * glyphHeight; - HelpSystem_PrintTextAt(gString_HelpSystem_ClearTo8, x, y); + HelpSystem_FillPanel2(); + HelpSystem_PrintTextRightAlign_Row52(str); } -u8 TryMoveCursor1(u8 dirn) +u8 GetHelpSystemMenuLevel(void) { - u16 r4; - if (dirn == 0) - { - if (gHelpSystemListMenu.sub.maxShowed == 1) - r4 = 0; - else - r4 = gHelpSystemListMenu.sub.maxShowed - (gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1)) - 1; - if (gHelpSystemListMenu.itemsAbove == 0) - { - if (gHelpSystemListMenu.cursorPos != 0) - { - gHelpSystemListMenu.cursorPos--; - return 1; - } - else - return 0; - } - if (gHelpSystemListMenu.cursorPos > r4) - { - gHelpSystemListMenu.cursorPos--; - return 1; - } - else - { - gHelpSystemListMenu.itemsAbove--; - return 2; - } - } - else - { - if (gHelpSystemListMenu.sub.maxShowed == 1) - r4 = 0; - else - r4 = gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1); - if (gHelpSystemListMenu.itemsAbove == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed) - { - if (gHelpSystemListMenu.cursorPos < gHelpSystemListMenu.sub.maxShowed - 1) - { - gHelpSystemListMenu.cursorPos++; - return 1; - } - else - return 0; - } - else if (gHelpSystemListMenu.cursorPos < r4) - { - gHelpSystemListMenu.cursorPos++; - return 1; - } - else - { - gHelpSystemListMenu.itemsAbove++; - return 2; - } - } + return gHelpSystemState.level; } -bool8 MoveCursor(u8 by, u8 dirn) +static void ResetHelpSystemCursor(struct HelpSystemListMenu * helpListMenu) { - u8 r7 = gHelpSystemListMenu.cursorPos; - u8 flags = 0; - s32 i; - for (i = 0; i < by; i++) - flags |= TryMoveCursor1(dirn); + helpListMenu->itemsAbove = 0; + helpListMenu->cursorPos = 0; +} - switch (flags) - { - case 0: - default: - // neither changed - return TRUE; - case 1: - // changed cursorPos only - sub_813C860(r7); - PlaceListMenuCursor(); - CommitTilemap(); - break; - case 2: - case 3: - // changed itemsAbove - if (sub_812BF88() == TRUE) - { - HelpSystem_SetInputDelay(2); - HelpSystem_FillPanel1(); - PrintListMenuItems(); - PlaceListMenuCursor(); - HelpSystem_PrintTopicLabel(); - sub_813C75C(); - } - else - { - sub_813BDA4(0); - HelpSystem_FillPanel1(); - PrintListMenuItems(); - PlaceListMenuCursor(); - sub_813BDA4(1); - } - CommitTilemap(); - break; - } - return FALSE; +static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) +{ + s32 index = listMenuItemsBuffer[helpListMenu->itemsAbove + helpListMenu->cursorPos].index; + if (index == -2) + HelpSystem_PrintTopicMouseoverDescription(sHelpSystemTopicMouseoverDescriptionPtrs[5]); + else + HelpSystem_PrintTopicMouseoverDescription(sHelpSystemTopicMouseoverDescriptionPtrs[index]); + HS_ShowOrHideToplevelTooltipWindow(1); } diff --git a/src/help_system_812B1E0.c b/src/help_system_812B1E0.c deleted file mode 100644 index d9ee16cfa..000000000 --- a/src/help_system_812B1E0.c +++ /dev/null @@ -1,2463 +0,0 @@ -#include "global.h" -#include "gflib.h" -#include "event_data.h" -#include "event_scripts.h" -#include "field_player_avatar.h" -#include "help_system.h" -#include "item.h" -#include "link.h" -#include "overworld.h" -#include "pokedex.h" -#include "quest_log.h" -#include "save.h" -#include "save_location.h" -#include "strings.h" -#include "constants/items.h" -#include "constants/maps.h" -#include "constants/songs.h" - -static EWRAM_DATA u16 sHelpSystemContextId = 0; -static EWRAM_DATA u8 sSeenHelpSystemIntro = 0; - -u8 gHelpSystemState[4]; -u16 gHelpContextIdBackup; - -static bool32 IsCurrentMapInArray(const u16 * mapIdxs); -static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -static bool8 HelpSystem_ShouldShowBasicTerms(void); -static bool8 IsHelpSystemSubmenuEnabled(u8); -static bool8 HasGottenAtLeastOneHM(void); - -static void PrintWelcomeMessageOnPanel1(void); -static void PrintTextOnPanel2Row52RightAlign(const u8 *); -static void ResetHelpSystemCursor(struct HelpSystemListMenu * a0); -static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); - -#define HELP_NONE 0 -#define HELP_END 0xFF - -// Help Main Topics -enum -{ - TOPIC_WHAT_TO_DO, - TOPIC_HOW_TO_DO, - TOPIC_TERMS, - TOPIC_ABOUT_GAME, - TOPIC_TYPE_MATCHUP, - TOPIC_EXIT, - TOPIC_COUNT -}; - -static const u8 *const sHelpSystemTopicPtrs[TOPIC_COUNT] = { - [TOPIC_WHAT_TO_DO] = Help_Text_WhatShouldIDo, - [TOPIC_HOW_TO_DO] = Help_Text_HowDoIDoThis, - [TOPIC_TERMS] = Help_Text_WhatDoesThisTermMean, - [TOPIC_ABOUT_GAME] = Help_Text_AboutThisGame, - [TOPIC_TYPE_MATCHUP] = Help_Text_TypeMatchupList, - [TOPIC_EXIT] = Help_Text_Exit -}; - -static const u8 *const sHelpSystemTopicMouseoverDescriptionPtrs[TOPIC_COUNT] = { - [TOPIC_WHAT_TO_DO] = Help_Text_DescWhatShouldIDo, - [TOPIC_HOW_TO_DO] = Help_Text_DescHowDoIDoThis, - [TOPIC_TERMS] = Help_Text_DescWhatDoesThisTermMean, - [TOPIC_ABOUT_GAME] = Help_Text_DescAboutThisGame, - [TOPIC_TYPE_MATCHUP] = Help_Text_DescTypeMatchupList, - [TOPIC_EXIT] = Help_Text_DescExit -}; - -// Submenu IDs for TOPIC_WHAT_TO_DO -enum -{ - HELP_PLAYING_FOR_FIRST_TIME = 1, - HELP_WHAT_SHOULD_I_BE_DOING, - HELP_CANT_GET_OUT_OF_ROOM, - HELP_CANT_FIND_PERSON_I_WANT, - HELP_TALKED_TO_EVERYONE_NOW_WHAT, - HELP_SOMEONE_BLOCKING_MY_WAY, - HELP_I_CANT_GO_ON, - HELP_OUT_OF_THINGS_TO_DO, - HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, - HELP_WHAT_ARE_MY_ADVENTURE_BASICS, - HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, - HELP_HOW_ARE_CAVES_DIFFERENT, - HELP_HOW_DO_I_PROGRESS, - HELP_WHEN_CAN_I_USE_ITEM, - HELP_WHATS_A_BATTLE, - HELP_HOW_DO_I_PREPARE_FOR_BATTLE, - HELP_WHAT_IS_A_MONS_VITALITY, - HELP_MY_MONS_ARE_HURT, - HELP_WHAT_IS_STATUS_PROBLEM, - HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, - HELP_CANT_CATCH_MONS, - HELP_RAN_OUT_OF_POTIONS, - HELP_CAN_I_BUY_POKEBALLS, - HELP_WHATS_A_TRAINER, - HELP_HOW_DO_I_WIN_AGAINST_TRAINER, - HELP_WHERE_DO_MONS_APPEAR, - HELP_WHAT_ARE_MOVES, - HELP_WHAT_ARE_HIDDEN_MOVES, - HELP_WHAT_MOVES_SHOULD_I_USE, - HELP_WANT_TO_ADD_MORE_MOVES, - HELP_WANT_TO_MAKE_MON_STRONGER, - HELP_FOE_MONS_TOO_STRONG, - HELP_WHAT_DO_I_DO_IN_CAVE, - HELP_NOTHING_I_WANT_TO_KNOW, - HELP_WHATS_POKEMON_CENTER, - HELP_WHATS_POKEMON_MART, - HELP_WANT_TO_END_GAME, - HELP_WHATS_A_MON, - HELP_WHAT_IS_THAT_PERSON_LIKE, - HELP_WHAT_DOES_HIDDEN_MOVE_DO, - HELP_WHAT_DO_I_DO_IN_SAFARI, - HELP_WHAT_ARE_SAFARI_RULES, - HELP_WANT_TO_END_SAFARI, - HELP_WHAT_IS_A_GYM, -}; - -static const u8 *const sHelpSystemSpecializedQuestionTextPtrs[] = { - [HELP_NONE] = NULL, - [HELP_PLAYING_FOR_FIRST_TIME] = Help_Text_PlayingForFirstTime, - [HELP_WHAT_SHOULD_I_BE_DOING] = Help_Text_WhatShouldIBeDoing, - [HELP_CANT_GET_OUT_OF_ROOM] = Help_Text_CantGetOutOfRoom, - [HELP_CANT_FIND_PERSON_I_WANT] = Help_Text_CantFindPersonIWant, - [HELP_TALKED_TO_EVERYONE_NOW_WHAT] = Help_Text_TalkedToEveryoneNowWhat, - [HELP_SOMEONE_BLOCKING_MY_WAY] = Help_Text_SomeoneBlockingMyWay, - [HELP_I_CANT_GO_ON] = Help_Text_ICantGoOn, - [HELP_OUT_OF_THINGS_TO_DO] = Help_Text_OutOfThingsToDo, - [HELP_WHAT_HAPPENED_TO_ITEM_I_GOT] = Help_Text_WhatHappenedToItemIGot, - [HELP_WHAT_ARE_MY_ADVENTURE_BASICS] = Help_Text_WhatAreMyAdventureBasics, - [HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT] = Help_Text_HowAreRoadsForestsDifferent, - [HELP_HOW_ARE_CAVES_DIFFERENT] = Help_Text_HowAreCavesDifferent, - [HELP_HOW_DO_I_PROGRESS] = Help_Text_HowDoIProgress, - [HELP_WHEN_CAN_I_USE_ITEM] = Help_Text_WhenCanIUseItem, - [HELP_WHATS_A_BATTLE] = Help_Text_WhatsABattle, - [HELP_HOW_DO_I_PREPARE_FOR_BATTLE] = Help_Text_HowDoIPrepareForBattle, - [HELP_WHAT_IS_A_MONS_VITALITY] = Help_Text_WhatIsAMonsVitality, - [HELP_MY_MONS_ARE_HURT] = Help_Text_MyMonsAreHurt, - [HELP_WHAT_IS_STATUS_PROBLEM] = Help_Text_WhatIsStatusProblem, - [HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT] = Help_Text_WhatHappensIfAllMyMonsFaint, - [HELP_CANT_CATCH_MONS] = Help_Text_CantCatchMons, - [HELP_RAN_OUT_OF_POTIONS] = Help_Text_RanOutOfPotions, - [HELP_CAN_I_BUY_POKEBALLS] = Help_Text_CanIBuyPokeBalls, - [HELP_WHATS_A_TRAINER] = Help_Text_WhatsATrainer, - [HELP_HOW_DO_I_WIN_AGAINST_TRAINER] = Help_Text_HowDoIWinAgainstTrainer, - [HELP_WHERE_DO_MONS_APPEAR] = Help_Text_WhereDoMonsAppear, - [HELP_WHAT_ARE_MOVES] = Help_Text_WhatAreMoves, - [HELP_WHAT_ARE_HIDDEN_MOVES] = Help_Text_WhatAreHiddenMoves, - [HELP_WHAT_MOVES_SHOULD_I_USE] = Help_Text_WhatMovesShouldIUse, - [HELP_WANT_TO_ADD_MORE_MOVES] = Help_Text_WantToAddMoreMoves, - [HELP_WANT_TO_MAKE_MON_STRONGER] = Help_Text_WantToMakeMonStronger, - [HELP_FOE_MONS_TOO_STRONG] = Help_Text_FoeMonsTooStrong, - [HELP_WHAT_DO_I_DO_IN_CAVE] = Help_Text_WhatDoIDoInCave, - [HELP_NOTHING_I_WANT_TO_KNOW] = Help_Text_NothingIWantToKnow, - [HELP_WHATS_POKEMON_CENTER] = Help_Text_WhatsPokemonCenter, - [HELP_WHATS_POKEMON_MART] = Help_Text_WhatsPokemonMart, - [HELP_WANT_TO_END_GAME] = Help_Text_WantToEndGame, - [HELP_WHATS_A_MON] = Help_Text_WhatsAMon, - [HELP_WHAT_IS_THAT_PERSON_LIKE] = Help_Text_WhatIsThatPersonLike, - [HELP_WHAT_DOES_HIDDEN_MOVE_DO] = Help_Text_WhatDoesHiddenMoveDo, - [HELP_WHAT_DO_I_DO_IN_SAFARI] = Help_Text_WhatDoIDoInSafari, - [HELP_WHAT_ARE_SAFARI_RULES] = Help_Text_WhatAreSafariRules, - [HELP_WANT_TO_END_SAFARI] = Help_Text_WantToEndSafari, - [HELP_WHAT_IS_A_GYM] = Help_Text_WhatIsAGym -}; - -static const u8 *const sHelpSystemSpecializedAnswerTextPtrs[] = { - [HELP_NONE] = NULL, - [HELP_PLAYING_FOR_FIRST_TIME] = Help_Text_AnswerPlayingForFirstTime, - [HELP_WHAT_SHOULD_I_BE_DOING] = Help_Text_AnswerWhatShouldIBeDoing, - [HELP_CANT_GET_OUT_OF_ROOM] = Help_Text_AnswerCantGetOutOfRoom, - [HELP_CANT_FIND_PERSON_I_WANT] = Help_Text_AnswerCantFindPersonIWant, - [HELP_TALKED_TO_EVERYONE_NOW_WHAT] = Help_Text_AnswerTalkedToEveryoneNowWhat, - [HELP_SOMEONE_BLOCKING_MY_WAY] = Help_Text_AnswerSomeoneBlockingMyWay, - [HELP_I_CANT_GO_ON] = Help_Text_AnswerICantGoOn, - [HELP_OUT_OF_THINGS_TO_DO] = Help_Text_AnswerOutOfThingsToDo, - [HELP_WHAT_HAPPENED_TO_ITEM_I_GOT] = Help_Text_AnswerWhatHappenedToItemIGot, - [HELP_WHAT_ARE_MY_ADVENTURE_BASICS] = Help_Text_AnswerWhatAreMyAdventureBasics, - [HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT] = Help_Text_AnswerHowAreRoadsForestsDifferent, - [HELP_HOW_ARE_CAVES_DIFFERENT] = Help_Text_AnswerHowAreCavesDifferent, - [HELP_HOW_DO_I_PROGRESS] = Help_Text_AnswerHowDoIProgress, - [HELP_WHEN_CAN_I_USE_ITEM] = Help_Text_AnswerWhenCanIUseItem, - [HELP_WHATS_A_BATTLE] = Help_Text_AnswerWhatsABattle, - [HELP_HOW_DO_I_PREPARE_FOR_BATTLE] = Help_Text_AnswerHowDoIPrepareForBattle, - [HELP_WHAT_IS_A_MONS_VITALITY] = Help_Text_AnswerWhatIsAMonsVitality, - [HELP_MY_MONS_ARE_HURT] = Help_Text_AnswerMyMonsAreHurt, - [HELP_WHAT_IS_STATUS_PROBLEM] = Help_Text_AnswerWhatIsStatusProblem, - [HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT] = Help_Text_AnswerWhatHappensIfAllMyMonsFaint, - [HELP_CANT_CATCH_MONS] = Help_Text_AnswerCantCatchMons, - [HELP_RAN_OUT_OF_POTIONS] = Help_Text_AnswerRanOutOfPotions, - [HELP_CAN_I_BUY_POKEBALLS] = Help_Text_AnswerCanIBuyPokeBalls, - [HELP_WHATS_A_TRAINER] = Help_Text_AnswerWhatsATrainer, - [HELP_HOW_DO_I_WIN_AGAINST_TRAINER] = Help_Text_AnswerHowDoIWinAgainstTrainer, - [HELP_WHERE_DO_MONS_APPEAR] = Help_Text_AnswerWhereDoMonsAppear, - [HELP_WHAT_ARE_MOVES] = Help_Text_AnswerWhatAreMoves, - [HELP_WHAT_ARE_HIDDEN_MOVES] = Help_Text_AnswerWhatAreHiddenMoves, - [HELP_WHAT_MOVES_SHOULD_I_USE] = Help_Text_AnswerWhatMovesShouldIUse, - [HELP_WANT_TO_ADD_MORE_MOVES] = Help_Text_AnswerWantToAddMoreMoves, - [HELP_WANT_TO_MAKE_MON_STRONGER] = Help_Text_AnswerWantToMakeMonStronger, - [HELP_FOE_MONS_TOO_STRONG] = Help_Text_AnswerFoeMonsTooStrong, - [HELP_WHAT_DO_I_DO_IN_CAVE] = Help_Text_AnswerWhatDoIDoInCave, - [HELP_NOTHING_I_WANT_TO_KNOW] = Help_Text_AnswerNothingIWantToKnow, - [HELP_WHATS_POKEMON_CENTER] = Help_Text_AnswerWhatsPokemonCenter, - [HELP_WHATS_POKEMON_MART] = Help_Text_AnswerWhatsPokemonMart, - [HELP_WANT_TO_END_GAME] = Help_Text_AnswerWantToEndGame, - [HELP_WHATS_A_MON] = Help_Text_AnswerWhatsAMon, - [HELP_WHAT_IS_THAT_PERSON_LIKE] = Help_Text_AnswerWhatIsThatPersonLike, - [HELP_WHAT_DOES_HIDDEN_MOVE_DO] = Help_Text_AnswerWhatDoesHiddenMoveDo, - [HELP_WHAT_DO_I_DO_IN_SAFARI] = Help_Text_AnswerWhatDoIDoInSafari, - [HELP_WHAT_ARE_SAFARI_RULES] = Help_Text_AnswerWhatAreSafariRules, - [HELP_WANT_TO_END_SAFARI] = Help_Text_AnswerWantToEndSafari, - [HELP_WHAT_IS_A_GYM] = Help_Text_AnswerWhatIsAGym -}; - -// Submenu IDs for TOPIC_HOW_TO_DO -enum -{ - HELP_USING_POKEDEX = 1, - HELP_USING_POKEMON, - HELP_USING_SUMMARY, - HELP_USING_SWITCH, - HELP_USING_ITEM, - HELP_USING_BAG, - HELP_USING_AN_ITEM, - HELP_USING_KEYITEM, - HELP_USING_POKEBALL, - HELP_USING_PLAYER, - HELP_USING_SAVE, - HELP_USING_OPTION, - HELP_USING_POTION, - HELP_USING_TOWN_MAP, - HELP_USING_TM, - HELP_USING_HM, - HELP_USING_MOVE_OUTSIDE_OF_BATTLE, - HELP_RIDING_BICYCLE, - HELP_ENTERING_NAME, - HELP_USING_PC, - HELP_USING_BILLS_PC, - HELP_USING_WITHDRAW, - HELP_USING_DEPOSIT, - HELP_USING_MOVE, - HELP_MOVING_ITEMS, - HELP_USING_PLAYERS_PC, - HELP_USING_WITHDRAW_ITEM, - HELP_USING_DEPOSIT_ITEM, - HELP_USING_MAILBOX, - HELP_USING_PROF_OAKS_PC, - HELP_OPENING_MENU, - HELP_USING_FIGHT, - HELP_USING_POKEMON2, - HELP_USING_SHIFT, - HELP_USING_SUMMARY2, - HELP_USING_BAG2, - HELP_READING_POKEDEX, - HELP_USING_HOME_PC, - HELP_USING_ITEM_STORAGE, - HELP_USING_WITHDRAW_ITEM2, - HELP_USING_DEPOSIT_ITEM2, - HELP_USING_MAILBOX2, - HELP_USING_RUN, - HELP_REGISTER_KEY_ITEM, - HELP_USING_BALL, - HELP_USING_BAIT, - HELP_USING_ROCK, - HELP_USING_HALL_OF_FAME, -}; - -static const u8 *const sHelpSystemMenuTopicTextPtrs[] = { - [HELP_NONE] = NULL, - [HELP_USING_POKEDEX] = Help_Text_UsingPokedex, - [HELP_USING_POKEMON] = Help_Text_UsingPokemon, - [HELP_USING_SUMMARY] = Help_Text_UsingSummary, - [HELP_USING_SWITCH] = Help_Text_UsingSwitch, - [HELP_USING_ITEM] = Help_Text_UsingItem, - [HELP_USING_BAG] = Help_Text_UsingBag, - [HELP_USING_AN_ITEM] = Help_Text_UsingAnItem, - [HELP_USING_KEYITEM] = Help_Text_UsingKeyItem, - [HELP_USING_POKEBALL] = Help_Text_UsingPokeBall, - [HELP_USING_PLAYER] = Help_Text_UsingPlayer, - [HELP_USING_SAVE] = Help_Text_UsingSave, - [HELP_USING_OPTION] = Help_Text_UsingOption, - [HELP_USING_POTION] = Help_Text_UsingPotion, - [HELP_USING_TOWN_MAP] = Help_Text_UsingTownMap, - [HELP_USING_TM] = Help_Text_UsingTM, - [HELP_USING_HM] = Help_Text_UsingHM, - [HELP_USING_MOVE_OUTSIDE_OF_BATTLE] = Help_Text_UsingMoveOutsideOfBattle, - [HELP_RIDING_BICYCLE] = Help_Text_RidingBicycle, - [HELP_ENTERING_NAME] = Help_Text_EnteringName, - [HELP_USING_PC] = Help_Text_UsingPC, - [HELP_USING_BILLS_PC] = Help_Text_UsingBillsPC, - [HELP_USING_WITHDRAW] = Help_Text_UsingWithdraw, - [HELP_USING_DEPOSIT] = Help_Text_UsingDeposit, - [HELP_USING_MOVE] = Help_Text_UsingMove, - [HELP_MOVING_ITEMS] = Help_Text_MovingItems, - [HELP_USING_PLAYERS_PC] = Help_Text_UsingPlayersPC, - [HELP_USING_WITHDRAW_ITEM] = Help_Text_UsingWithdrawItem, - [HELP_USING_DEPOSIT_ITEM] = Help_Text_UsingDepositItem, - [HELP_USING_MAILBOX] = Help_Text_UsingMailbox, - [HELP_USING_PROF_OAKS_PC] = Help_Text_UsingProfOaksPC, - [HELP_OPENING_MENU] = Help_Text_OpeningMenu, - [HELP_USING_FIGHT] = Help_Text_UsingFight, - [HELP_USING_POKEMON2] = Help_Text_UsingPokemon2, - [HELP_USING_SHIFT] = Help_Text_UsingShift, - [HELP_USING_SUMMARY2] = Help_Text_UsingSummary2, - [HELP_USING_BAG2] = Help_Text_UsingBag2, - [HELP_READING_POKEDEX] = Help_Text_ReadingPokedex, - [HELP_USING_HOME_PC] = Help_Text_UsingHomePC, - [HELP_USING_ITEM_STORAGE] = Help_Text_UsingItemStorage, - [HELP_USING_WITHDRAW_ITEM2] = Help_Text_UsingWithdrawItem2, - [HELP_USING_DEPOSIT_ITEM2] = Help_Text_UsingDepositItem2, - [HELP_USING_MAILBOX2] = Help_Text_UsingMailbox2, - [HELP_USING_RUN] = Help_Text_UsingRun, - [HELP_REGISTER_KEY_ITEM] = Help_Text_RegisterKeyItem, - [HELP_USING_BALL] = Help_Text_UsingBall, - [HELP_USING_BAIT] = Help_Text_UsingBait, - [HELP_USING_ROCK] = Help_Text_UsingRock, - [HELP_USING_HALL_OF_FAME] = Help_Text_UsingHallOfFame -}; - -static const u8 *const sHelpSystemHowToUseMenuTextPtrs[] = { - [HELP_NONE] = NULL, - [HELP_USING_POKEDEX] = Help_Text_HowToUsePokedex, - [HELP_USING_POKEMON] = Help_Text_HowToUsePokemon, - [HELP_USING_SUMMARY] = Help_Text_HowToUseSummary, - [HELP_USING_SWITCH] = Help_Text_HowToUseSwitch, - [HELP_USING_ITEM] = Help_Text_HowToUseItem, - [HELP_USING_BAG] = Help_Text_HowToUseBag, - [HELP_USING_AN_ITEM] = Help_Text_HowToUseAnItem, - [HELP_USING_KEYITEM] = Help_Text_HowToUseKeyItem, - [HELP_USING_POKEBALL] = Help_Text_HowToUsePokeBall, - [HELP_USING_PLAYER] = Help_Text_HowToUsePlayer, - [HELP_USING_SAVE] = Help_Text_HowToUseSave, - [HELP_USING_OPTION] = Help_Text_HowToUseOption, - [HELP_USING_POTION] = Help_Text_HowToUsePotion, - [HELP_USING_TOWN_MAP] = Help_Text_HowToUseTownMap, - [HELP_USING_TM] = Help_Text_HowToUseTM, - [HELP_USING_HM] = Help_Text_HowToUseHM, - [HELP_USING_MOVE_OUTSIDE_OF_BATTLE] = Help_Text_HowToUseMoveOutsideOfBattle, - [HELP_RIDING_BICYCLE] = Help_Text_HowToRideBicycle, - [HELP_ENTERING_NAME] = Help_Text_HowToEnterName, - [HELP_USING_PC] = Help_Text_HowToUsePC, - [HELP_USING_BILLS_PC] = Help_Text_HowToUseBillsPC, - [HELP_USING_WITHDRAW] = Help_Text_HowToUseWithdraw, - [HELP_USING_DEPOSIT] = Help_Text_HowToUseDeposit, - [HELP_USING_MOVE] = Help_Text_HowToUseMove, - [HELP_MOVING_ITEMS] = Help_Text_HowToMoveItems, - [HELP_USING_PLAYERS_PC] = Help_Text_HowToUsePlayersPC, - [HELP_USING_WITHDRAW_ITEM] = Help_Text_HowToUseWithdrawItem, - [HELP_USING_DEPOSIT_ITEM] = Help_Text_HowToUseDepositItem, - [HELP_USING_MAILBOX] = Help_Text_HowToUseMailbox, - [HELP_USING_PROF_OAKS_PC] = Help_Text_HowToUseProfOaksPC, - [HELP_OPENING_MENU] = Help_Text_HowToOpenMenu, - [HELP_USING_FIGHT] = Help_Text_HowToUseFight, - [HELP_USING_POKEMON2] = Help_Text_HowToUsePokemon2, - [HELP_USING_SHIFT] = Help_Text_HowToUseShift, - [HELP_USING_SUMMARY2] = Help_Text_HowToUseSummary2, - [HELP_USING_BAG2] = Help_Text_HowToUseBag2, - [HELP_READING_POKEDEX] = Help_Text_HowToReadPokedex, - [HELP_USING_HOME_PC] = Help_Text_HowToUseHomePC, - [HELP_USING_ITEM_STORAGE] = Help_Text_HowToUseItemStorage, - [HELP_USING_WITHDRAW_ITEM2] = Help_Text_HowToUseWithdrawItem2, - [HELP_USING_DEPOSIT_ITEM2] = Help_Text_HowToUseDepositItem2, - [HELP_USING_MAILBOX2] = Help_Text_HowToUseMailbox2, - [HELP_USING_RUN] = Help_Text_HowToUseRun, - [HELP_REGISTER_KEY_ITEM] = Help_Text_HowToRegisterKeyItem, - [HELP_USING_BALL] = Help_Text_HowToUseBall, - [HELP_USING_BAIT] = Help_Text_HowToUseBait, - [HELP_USING_ROCK] = Help_Text_HowToUseRock, - [HELP_USING_HALL_OF_FAME] = Help_Text_HowToUseHallOfFame -}; - -// Submenu IDs for TOPIC_TERMS -enum -{ - HELP_TERM_HP = 1, - HELP_TERM_EXP, - HELP_TERM_MOVES, - HELP_TERM_ATTACK, - HELP_TERM_DEFENSE, - HELP_TERM_SPATK, - HELP_TERM_SPDEF, - HELP_TERM_SPEED, - HELP_TERM_LEVEL, - HELP_TERM_TYPE, - HELP_TERM_OT, - HELP_TERM_ITEM, - HELP_TERM_ABILITY, - HELP_TERM_MONEY, - HELP_TERM_MOVE_TYPE, - HELP_TERM_NATURE, - HELP_TERM_ID_NO, - HELP_TERM_PP, - HELP_TERM_POWER, - HELP_TERM_ACCURACY, - HELP_TERM_FNT, - HELP_TERM_ITEMS, - HELP_TERM_KEYITEMS, - HELP_TERM_POKEBALLS, - HELP_TERM_POKEDEX, - HELP_TERM_PLAY_TIME, - HELP_TERM_BADGES, - HELP_TERM_TEXT_SPEED, - HELP_TERM_BATTLE_SCENE, - HELP_TERM_BATTLE_STYLE, - HELP_TERM_SOUND, - HELP_TERM_BUTTON_MODE, - HELP_TERM_FRAME, - HELP_TERM_CANCEL, - HELP_TERM_TM, - HELP_TERM_HM, - HELP_TERM_HM_MOVE, - HELP_TERM_EVOLUTION, - HELP_TERM_STATUS_PROBLEM, - HELP_TERM_POKEMON, - HELP_TERM_ID_NO2, - HELP_TERM_MONEY2, - HELP_TERM_BADGES2, -}; - -static const u8 *const sHelpSystemTermTextPtrs[] = { - [HELP_NONE] = NULL, - [HELP_TERM_HP] = Help_Text_HP, - [HELP_TERM_EXP] = Help_Text_EXP, - [HELP_TERM_MOVES] = Help_Text_Moves, - [HELP_TERM_ATTACK] = Help_Text_Attack, - [HELP_TERM_DEFENSE] = Help_Text_Defense, - [HELP_TERM_SPATK] = Help_Text_SpAtk, - [HELP_TERM_SPDEF] = Help_Text_SpDef, - [HELP_TERM_SPEED] = Help_Text_Speed, - [HELP_TERM_LEVEL] = Help_Text_Level, - [HELP_TERM_TYPE] = Help_Text_Type, - [HELP_TERM_OT] = Help_Text_OT, - [HELP_TERM_ITEM] = Help_Text_Item, - [HELP_TERM_ABILITY] = Help_Text_Ability, - [HELP_TERM_MONEY] = Help_Text_Money, - [HELP_TERM_MOVE_TYPE] = Help_Text_MoveType, - [HELP_TERM_NATURE] = Help_Text_Nature, - [HELP_TERM_ID_NO] = Help_Text_IDNo, - [HELP_TERM_PP] = Help_Text_PP, - [HELP_TERM_POWER] = Help_Text_Power, - [HELP_TERM_ACCURACY] = Help_Text_Accuracy, - [HELP_TERM_FNT] = Help_Text_FNT, - [HELP_TERM_ITEMS] = Help_Text_Items, - [HELP_TERM_KEYITEMS] = Help_Text_KeyItems, - [HELP_TERM_POKEBALLS] = Help_Text_PokeBalls, - [HELP_TERM_POKEDEX] = Help_Text_Pokedex, - [HELP_TERM_PLAY_TIME] = Help_Text_PlayTime, - [HELP_TERM_BADGES] = Help_Text_Badges, - [HELP_TERM_TEXT_SPEED] = Help_Text_TextSpeed, - [HELP_TERM_BATTLE_SCENE] = Help_Text_BattleScene, - [HELP_TERM_BATTLE_STYLE] = Help_Text_BattleStyle, - [HELP_TERM_SOUND] = Help_Text_Sound, - [HELP_TERM_BUTTON_MODE] = Help_Text_ButtonMode, - [HELP_TERM_FRAME] = Help_Text_Frame, - [HELP_TERM_CANCEL] = Help_Text_Cancel2, - [HELP_TERM_TM] = Help_Text_TM, - [HELP_TERM_HM] = Help_Text_HM, - [HELP_TERM_HM_MOVE] = Help_Text_HMMove, - [HELP_TERM_EVOLUTION] = Help_Text_Evolution, - [HELP_TERM_STATUS_PROBLEM] = Help_Text_StatusProblem, - [HELP_TERM_POKEMON] = Help_Text_Pokemon, - [HELP_TERM_ID_NO2] = Help_Text_IDNo2, - [HELP_TERM_MONEY2] = Help_Text_Money2, - [HELP_TERM_BADGES2] = Help_Text_Badges2 -}; - -static const u8 *const sHelpSystemTermDefinitionsTextPtrs[] = { - [HELP_NONE] = NULL, - [HELP_TERM_HP] = Help_Text_DefineHP, - [HELP_TERM_EXP] = Help_Text_DefineEXP, - [HELP_TERM_MOVES] = Help_Text_DefineMoves, - [HELP_TERM_ATTACK] = Help_Text_DefineAttack, - [HELP_TERM_DEFENSE] = Help_Text_DefineDefense, - [HELP_TERM_SPATK] = Help_Text_DefineSpAtk, - [HELP_TERM_SPDEF] = Help_Text_DefineSpDef, - [HELP_TERM_SPEED] = Help_Text_DefineSpeed, - [HELP_TERM_LEVEL] = Help_Text_DefineLevel, - [HELP_TERM_TYPE] = Help_Text_DefineType, - [HELP_TERM_OT] = Help_Text_DefineOT, - [HELP_TERM_ITEM] = Help_Text_DefineItem, - [HELP_TERM_ABILITY] = Help_Text_DefineAbility, - [HELP_TERM_MONEY] = Help_Text_DefineMoney, - [HELP_TERM_MOVE_TYPE] = Help_Text_DefineMoveType, - [HELP_TERM_NATURE] = Help_Text_DefineNature, - [HELP_TERM_ID_NO] = Help_Text_DefineIDNo, - [HELP_TERM_PP] = Help_Text_DefinePP, - [HELP_TERM_POWER] = Help_Text_DefinePower, - [HELP_TERM_ACCURACY] = Help_Text_DefineAccuracy, - [HELP_TERM_FNT] = Help_Text_DefineFNT, - [HELP_TERM_ITEMS] = Help_Text_DefineItems, - [HELP_TERM_KEYITEMS] = Help_Text_DefineKeyItems, - [HELP_TERM_POKEBALLS] = Help_Text_DefinePokeBalls, - [HELP_TERM_POKEDEX] = Help_Text_DefinePokedex, - [HELP_TERM_PLAY_TIME] = Help_Text_DefinePlayTime, - [HELP_TERM_BADGES] = Help_Text_DefineBadges, - [HELP_TERM_TEXT_SPEED] = Help_Text_DefineTextSpeed, - [HELP_TERM_BATTLE_SCENE] = Help_Text_DefineBattleScene, - [HELP_TERM_BATTLE_STYLE] = Help_Text_DefineBattleStyle, - [HELP_TERM_SOUND] = Help_Text_DefineSound, - [HELP_TERM_BUTTON_MODE] = Help_Text_DefineButtonMode, - [HELP_TERM_FRAME] = Help_Text_DefineFrame, - [HELP_TERM_CANCEL] = Help_Text_DefineCancel2, - [HELP_TERM_TM] = Help_Text_DefineTM, - [HELP_TERM_HM] = Help_Text_DefineHM, - [HELP_TERM_HM_MOVE] = Help_Text_DefineHMMove, - [HELP_TERM_EVOLUTION] = Help_Text_DefineEvolution, - [HELP_TERM_STATUS_PROBLEM] = Help_Text_DefineStatusProblem, - [HELP_TERM_POKEMON] = Help_Text_DefinePokemon, - [HELP_TERM_ID_NO2] = Help_Text_DefineIDNo2, - [HELP_TERM_MONEY2] = Help_Text_DefineMoney2, - [HELP_TERM_BADGES2] = Help_Text_DefineBadges2 -}; - -// Submenu IDs for TOPIC_ABOUT_GAME -enum -{ - HELP_THE_HELP_SYSTEM = 1, - HELP_THE_GAME, - HELP_WIRELESS_ADAPTER, - HELP_GAME_FUNDAMENTALS_1, - HELP_GAME_FUNDAMENTALS_2, - HELP_GAME_FUNDAMENTALS_3, - HELP_WHAT_ARE_POKEMON, -}; - -static const u8 *const sHelpSystemGeneralTopicTextPtrs[] = { - [HELP_NONE] = NULL, - [HELP_THE_HELP_SYSTEM] = Help_Text_TheHelpSystem, - [HELP_THE_GAME] = Help_Text_TheGame, - [HELP_WIRELESS_ADAPTER] = Help_Text_WirelessAdapter, - [HELP_GAME_FUNDAMENTALS_1] = Help_Text_GameFundamentals1, - [HELP_GAME_FUNDAMENTALS_2] = Help_Text_GameFundamentals2, - [HELP_GAME_FUNDAMENTALS_3] = Help_Text_GameFundamentals3, - [HELP_WHAT_ARE_POKEMON] = Help_Text_WhatArePokemon -}; - -static const u8 *const sHelpSystemGeneralTopicDescriptionTextPtrs[] = { - [HELP_NONE] = NULL, - [HELP_THE_HELP_SYSTEM] = Help_Text_DescTheHelpSystem, - [HELP_THE_GAME] = Help_Text_DescTheGame, - [HELP_WIRELESS_ADAPTER] = Help_Text_DescWirelessAdapter, - [HELP_GAME_FUNDAMENTALS_1] = Help_Text_DescGameFundamentals1, - [HELP_GAME_FUNDAMENTALS_2] = Help_Text_DescGameFundamentals2, - [HELP_GAME_FUNDAMENTALS_3] = Help_Text_DescGameFundamentals3, - [HELP_WHAT_ARE_POKEMON] = Help_Text_DescWhatArePokemon -}; - -// An enum for the type matchups isn't necessary, when used they're always used in their entirety -// Macro below is used to reference the entire group at once -#define HELP_TYPE_MATCHUPS \ - 1, \ - 2, 3, \ - 4, 5, \ - 6, 7, \ - 8, 9, \ - 10, 11, \ - 12, 13, \ - 14, 15, \ - 16, 17, \ - 18, 19, \ - 20, 21, \ - 22, 23, \ - 24, 25, \ - 26, 27, \ - 28, 29, \ - 30, 31, \ - 32, 33, \ - 34, 35 \ - -static const u8 *const sHelpSystemTypeMatchupTextPtrs[] = { - [HELP_NONE] = NULL, - [1] = Help_Text_UsingTypeMatchupList, - [2] = Help_Text_OwnMoveDark, - [3] = Help_Text_OwnPokemonDark, - [4] = Help_Text_OwnMoveRock, - [5] = Help_Text_OwnPokemonRock, - [6] = Help_Text_OwnMovePsychic, - [7] = Help_Text_OwnPokemonPsychic, - [8] = Help_Text_OwnMoveFighting, - [9] = Help_Text_OwnPokemonFighting, - [10] = Help_Text_OwnMoveGrass, - [11] = Help_Text_OwnPokemonGrass, - [12] = Help_Text_OwnMoveGhost, - [13] = Help_Text_OwnPokemonGhost, - [14] = Help_Text_OwnMoveIce, - [15] = Help_Text_OwnPokemonIce, - [16] = Help_Text_OwnMoveGround, - [17] = Help_Text_OwnPokemonGround, - [18] = Help_Text_OwnMoveElectric, - [19] = Help_Text_OwnPokemonElectric, - [20] = Help_Text_OwnMovePoison, - [21] = Help_Text_OwnPokemonPoison, - [22] = Help_Text_OwnMoveDragon, - [23] = Help_Text_OwnPokemonDragon, - [24] = Help_Text_OwnMoveNormal, - [25] = Help_Text_OwnPokemonNormal, - [26] = Help_Text_OwnMoveSteel, - [27] = Help_Text_OwnPokemonSteel, - [28] = Help_Text_OwnMoveFlying, - [29] = Help_Text_OwnPokemonFlying, - [30] = Help_Text_OwnMoveFire, - [31] = Help_Text_OwnPokemonFire, - [32] = Help_Text_OwnMoveWater, - [33] = Help_Text_OwnPokemonWater, - [34] = Help_Text_OwnMoveBug, - [35] = Help_Text_OwnPokemonBug -}; - -static const u8 *const sHelpSystemTypeMatchupDescriptionTextPtrs[] = { - [HELP_NONE] = NULL, - [1] = Help_Text_HowToUseTypeMatchupList, - [2] = Help_Text_TypeMatchupOwnMoveDark, - [3] = Help_Text_TypeMatchupOwnPokemonDark, - [4] = Help_Text_TypeMatchupOwnMoveRock, - [5] = Help_Text_TypeMatchupOwnPokemonRock, - [6] = Help_Text_TypeMatchupOwnMovePsychic, - [7] = Help_Text_TypeMatchupOwnPokemonPsychic, - [8] = Help_Text_TypeMatchupOwnMoveFighting, - [9] = Help_Text_TypeMatchupOwnPokemonFighting, - [10] = Help_Text_TypeMatchupOwnMoveGrass, - [11] = Help_Text_TypeMatchupOwnPokemonGrass, - [12] = Help_Text_TypeMatchupOwnMoveGhost, - [13] = Help_Text_TypeMatchupOwnPokemonGhost, - [14] = Help_Text_TypeMatchupOwnMoveIce, - [15] = Help_Text_TypeMatchupOwnPokemonIce, - [16] = Help_Text_TypeMatchupOwnMoveGround, - [17] = Help_Text_TypeMatchupOwnPokemonGround, - [18] = Help_Text_TypeMatchupOwnMoveElectric, - [19] = Help_Text_TypeMatchupOwnPokemonElectric, - [20] = Help_Text_TypeMatchupOwnMovePoison, - [21] = Help_Text_TypeMatchupOwnPokemonPoison, - [22] = Help_Text_TypeMatchupOwnMoveDragon, - [23] = Help_Text_TypeMatchupOwnPokemonDragon, - [24] = Help_Text_TypeMatchupOwnMoveNormal, - [25] = Help_Text_TypeMatchupOwnPokemonNormal, - [26] = Help_Text_TypeMatchupOwnMoveSteel, - [27] = Help_Text_TypeMatchupOwnPokemonSteel, - [28] = Help_Text_TypeMatchupOwnMoveFlying, - [29] = Help_Text_TypeMatchupOwnPokemonFlying, - [30] = Help_Text_TypeMatchupOwnMoveFire, - [31] = Help_Text_TypeMatchupOwnPokemonFire, - [32] = Help_Text_TypeMatchupOwnMoveWater, - [33] = Help_Text_TypeMatchupOwnPokemonWater, - [34] = Help_Text_TypeMatchupOwnMoveBug, - [35] = Help_Text_TypeMatchupOwnPokemonBug -}; - -static const u8 sAboutGame_TitleScreen[] = { - HELP_THE_HELP_SYSTEM, - HELP_THE_GAME, - HELP_WIRELESS_ADAPTER, - HELP_END -}; - -static const u8 sAboutGame_NewGame[] = { - HELP_THE_HELP_SYSTEM, - HELP_THE_GAME, - HELP_WIRELESS_ADAPTER, - HELP_END -}; - -static const u8 sHowTo_NamingScreen[] = { - HELP_ENTERING_NAME, - HELP_END -}; - -static const u8 sAboutGame_NamingScreen[] = { - HELP_THE_HELP_SYSTEM, - HELP_THE_GAME, - HELP_WIRELESS_ADAPTER, - HELP_END -}; - -static const u8 sHowTo_Pokedex[] = { - HELP_USING_POKEDEX, - HELP_READING_POKEDEX, - HELP_END -}; - -static const u8 sHowTo_PartyMenu[] = { - HELP_USING_POKEMON, - HELP_USING_SUMMARY, - HELP_USING_SWITCH, - HELP_USING_ITEM, - HELP_USING_MOVE_OUTSIDE_OF_BATTLE, - HELP_END -}; - -static const u8 sTerms_PartyMenu[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_END -}; - -static const u8 sHowTo_PokemonInfo[] = { - HELP_USING_POKEMON, - HELP_USING_SUMMARY, - HELP_END -}; - -static const u8 sTerms_PokemonInfo[] = { - HELP_TERM_LEVEL, - HELP_TERM_TYPE, - HELP_TERM_OT, - HELP_TERM_ID_NO, - HELP_TERM_ITEM, - HELP_TERM_NATURE, - HELP_END -}; - -static const u8 sTerms_PokemonSkills[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_ATTACK, - HELP_TERM_DEFENSE, - HELP_TERM_SPATK, - HELP_TERM_SPDEF, - HELP_TERM_SPEED, - HELP_TERM_EXP, - HELP_TERM_ABILITY, - HELP_END -}; - -static const u8 sTerms_PokemonMoves[] = { - HELP_TERM_LEVEL, - HELP_TERM_MOVES, - HELP_TERM_TYPE, - HELP_TERM_MOVE_TYPE, - HELP_TERM_PP, - HELP_TERM_POWER, - HELP_TERM_ACCURACY, - HELP_END -}; - -static const u8 sHowTo_Bag[] = { - HELP_USING_BAG, - HELP_USING_AN_ITEM, - HELP_USING_KEYITEM, - HELP_REGISTER_KEY_ITEM, - HELP_USING_POKEBALL, - HELP_USING_POTION, - HELP_USING_TOWN_MAP, - HELP_USING_TM, - HELP_USING_HM, - HELP_RIDING_BICYCLE, - HELP_END -}; - -static const u8 sTerms_Bag[] = { - HELP_TERM_ITEMS, - HELP_TERM_KEYITEMS, - HELP_TERM_POKEBALLS, - HELP_END -}; - -static const u8 sHowTo_TrainerCardFront[] = { - HELP_USING_PLAYER, - HELP_END -}; - -static const u8 sTerms_TrainerCardFront[] = { - HELP_TERM_ID_NO, - HELP_TERM_MONEY, - HELP_TERM_POKEDEX, - HELP_TERM_PLAY_TIME, - HELP_TERM_BADGES, - HELP_END -}; - -static const u8 sHowTo_TrainerCardBack[] = { - HELP_USING_PLAYER, - HELP_END -}; - -static const u8 sHowTo_Save[] = { - HELP_USING_SAVE, - HELP_END -}; - -static const u8 sTerms_Save[] = { - HELP_TERM_BADGES2, - HELP_TERM_POKEDEX, - HELP_TERM_PLAY_TIME, - HELP_END -}; - -static const u8 sHowTo_Options[] = { - HELP_USING_OPTION, - HELP_END -}; - -static const u8 sTerms_Options[] = { - HELP_TERM_TEXT_SPEED, - HELP_TERM_BATTLE_SCENE, - HELP_TERM_BATTLE_STYLE, - HELP_TERM_SOUND, - HELP_TERM_BUTTON_MODE, - HELP_TERM_FRAME, - HELP_TERM_CANCEL, - HELP_END -}; - -static const u8 sWhatToDo_PlayersHouse[] = { - HELP_WHAT_SHOULD_I_BE_DOING, - HELP_CANT_GET_OUT_OF_ROOM, - HELP_CANT_FIND_PERSON_I_WANT, - HELP_END -}; - -static const u8 sAboutGame_PlayersHouse[] = { - HELP_THE_HELP_SYSTEM, - HELP_THE_GAME, - HELP_WIRELESS_ADAPTER, - HELP_WHAT_ARE_POKEMON, - HELP_END -}; - -static const u8 sWhatToDo_OaksLab[] = { - HELP_WHAT_SHOULD_I_BE_DOING, - HELP_CANT_FIND_PERSON_I_WANT, - HELP_TALKED_TO_EVERYONE_NOW_WHAT, - HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, - HELP_WANT_TO_END_GAME, - HELP_END -}; - -static const u8 sHowTo_OaksLab[] = { - HELP_OPENING_MENU, - HELP_USING_POKEDEX, - HELP_USING_POKEMON, - HELP_USING_SUMMARY, - HELP_USING_SWITCH, - HELP_USING_ITEM, - HELP_USING_BAG, - HELP_USING_AN_ITEM, - HELP_USING_KEYITEM, - HELP_REGISTER_KEY_ITEM, - HELP_USING_POKEBALL, - HELP_USING_POTION, - HELP_USING_TOWN_MAP, - HELP_USING_TM, - HELP_USING_HM, - HELP_USING_PLAYER, - HELP_USING_SAVE, - HELP_USING_OPTION, - HELP_USING_MOVE_OUTSIDE_OF_BATTLE, - HELP_END -}; - -static const u8 sTerms_OaksLab[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_MOVES, - HELP_TERM_TYPE, - HELP_TERM_POKEMON, - HELP_END -}; - -static const u8 sWhatToDo_PokeCenter[] = { - HELP_WHAT_SHOULD_I_BE_DOING, - HELP_TALKED_TO_EVERYONE_NOW_WHAT, - HELP_SOMEONE_BLOCKING_MY_WAY, - HELP_WHAT_ARE_MY_ADVENTURE_BASICS, - HELP_WHATS_POKEMON_CENTER, - HELP_WHATS_POKEMON_MART, - HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, - HELP_WANT_TO_END_GAME, - HELP_END -}; - -static const u8 sHowTo_PokeCenter[] = { - HELP_OPENING_MENU, - HELP_USING_POKEDEX, - HELP_USING_POKEMON, - HELP_USING_SUMMARY, - HELP_USING_SWITCH, - HELP_USING_ITEM, - HELP_USING_BAG, - HELP_USING_AN_ITEM, - HELP_USING_KEYITEM, - HELP_REGISTER_KEY_ITEM, - HELP_USING_POKEBALL, - HELP_USING_POTION, - HELP_USING_TOWN_MAP, - HELP_USING_TM, - HELP_USING_HM, - HELP_USING_PLAYER, - HELP_USING_SAVE, - HELP_USING_OPTION, - HELP_USING_MOVE_OUTSIDE_OF_BATTLE, - HELP_USING_PC, - HELP_END -}; - -static const u8 sTerms_PokeCenter[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_MOVES, - HELP_TERM_TYPE, - HELP_TERM_POKEMON, - HELP_END -}; - -static const u8 sAboutGame_PokeCenter[] = { - HELP_WIRELESS_ADAPTER, - HELP_WHAT_ARE_POKEMON, - HELP_GAME_FUNDAMENTALS_1, - HELP_GAME_FUNDAMENTALS_2, - HELP_GAME_FUNDAMENTALS_3, - HELP_END -}; - -static const u8 sWhatToDo_Mart[] = { - HELP_WHAT_SHOULD_I_BE_DOING, - HELP_TALKED_TO_EVERYONE_NOW_WHAT, - HELP_SOMEONE_BLOCKING_MY_WAY, - HELP_WHAT_ARE_MY_ADVENTURE_BASICS, - HELP_WHATS_POKEMON_CENTER, - HELP_WHATS_POKEMON_MART, - HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, - HELP_WANT_TO_END_GAME, - HELP_END -}; - -static const u8 sHowTo_Mart[] = { - HELP_OPENING_MENU, - HELP_USING_POKEDEX, - HELP_USING_POKEMON, - HELP_USING_SUMMARY, - HELP_USING_SWITCH, - HELP_USING_ITEM, - HELP_USING_BAG, - HELP_USING_AN_ITEM, - HELP_USING_KEYITEM, - HELP_REGISTER_KEY_ITEM, - HELP_USING_POKEBALL, - HELP_USING_POTION, - HELP_USING_TOWN_MAP, - HELP_USING_TM, - HELP_USING_HM, - HELP_USING_PLAYER, - HELP_USING_SAVE, - HELP_USING_OPTION, - HELP_USING_MOVE_OUTSIDE_OF_BATTLE, - HELP_END -}; - -static const u8 sTerms_Mart[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_MOVES, - HELP_TERM_TYPE, - HELP_TERM_ITEM, - HELP_TERM_MONEY, - HELP_TERM_ITEMS, - HELP_TERM_KEYITEMS, - HELP_TERM_POKEBALLS, - HELP_TERM_FNT, - HELP_END -}; - -static const u8 sWhatToDo_Gym[] = { - HELP_SOMEONE_BLOCKING_MY_WAY, - HELP_WHAT_ARE_MY_ADVENTURE_BASICS, - HELP_WHATS_POKEMON_CENTER, - HELP_WHATS_POKEMON_MART, - HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, - HELP_WANT_TO_END_GAME, - HELP_END -}; - -static const u8 sHowTo_Gym[] = { - HELP_OPENING_MENU, - HELP_USING_POKEDEX, - HELP_USING_POKEMON, - HELP_USING_SUMMARY, - HELP_USING_SWITCH, - HELP_USING_ITEM, - HELP_USING_BAG, - HELP_USING_AN_ITEM, - HELP_USING_KEYITEM, - HELP_REGISTER_KEY_ITEM, - HELP_USING_POKEBALL, - HELP_USING_POTION, - HELP_USING_TOWN_MAP, - HELP_USING_TM, - HELP_USING_HM, - HELP_USING_PLAYER, - HELP_USING_SAVE, - HELP_USING_OPTION, - HELP_USING_MOVE_OUTSIDE_OF_BATTLE, - HELP_END -}; - -static const u8 sTerms_Gym[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_MOVES, - HELP_TERM_TYPE, - HELP_TERM_FNT, - HELP_END -}; - -static const u8 sTypeMatchups_Gym[] = { - HELP_TYPE_MATCHUPS, - HELP_END -}; - -static const u8 sWhatToDo_Indoors[] = { - HELP_WHAT_SHOULD_I_BE_DOING, - HELP_WHAT_ARE_MY_ADVENTURE_BASICS, - HELP_CANT_FIND_PERSON_I_WANT, - HELP_TALKED_TO_EVERYONE_NOW_WHAT, - HELP_SOMEONE_BLOCKING_MY_WAY, - HELP_I_CANT_GO_ON, - HELP_HOW_DO_I_PROGRESS, - HELP_WHAT_IS_THAT_PERSON_LIKE, - HELP_OUT_OF_THINGS_TO_DO, - HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, - HELP_WHAT_DO_I_DO_IN_CAVE, - HELP_WHATS_POKEMON_CENTER, - HELP_WHATS_POKEMON_MART, - HELP_WHAT_IS_A_GYM, - HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, - HELP_WHEN_CAN_I_USE_ITEM, - HELP_RAN_OUT_OF_POTIONS, - HELP_CAN_I_BUY_POKEBALLS, - HELP_WHATS_A_BATTLE, - HELP_HOW_DO_I_PREPARE_FOR_BATTLE, - HELP_WHAT_IS_A_MONS_VITALITY, - HELP_WHERE_DO_MONS_APPEAR, - HELP_CANT_CATCH_MONS, - HELP_WANT_TO_MAKE_MON_STRONGER, - HELP_FOE_MONS_TOO_STRONG, - HELP_MY_MONS_ARE_HURT, - HELP_WHAT_IS_STATUS_PROBLEM, - HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, - HELP_WHATS_A_TRAINER, - HELP_HOW_DO_I_WIN_AGAINST_TRAINER, - HELP_WHAT_ARE_MOVES, - HELP_WANT_TO_ADD_MORE_MOVES, - HELP_WHAT_ARE_HIDDEN_MOVES, - HELP_WHAT_DOES_HIDDEN_MOVE_DO, - HELP_WANT_TO_END_GAME, - HELP_END -}; - -static const u8 sHowTo_Indoors[] = { - HELP_OPENING_MENU, - HELP_USING_POKEDEX, - HELP_USING_POKEMON, - HELP_USING_SUMMARY, - HELP_USING_SWITCH, - HELP_USING_ITEM, - HELP_USING_BAG, - HELP_USING_AN_ITEM, - HELP_USING_KEYITEM, - HELP_REGISTER_KEY_ITEM, - HELP_USING_POKEBALL, - HELP_USING_POTION, - HELP_USING_TOWN_MAP, - HELP_USING_TM, - HELP_USING_HM, - HELP_USING_PLAYER, - HELP_USING_SAVE, - HELP_USING_OPTION, - HELP_USING_MOVE_OUTSIDE_OF_BATTLE, - HELP_END -}; - -static const u8 sTerms_Indoors[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_TYPE, - HELP_TERM_OT, - HELP_TERM_ITEM, - HELP_TERM_ABILITY, - HELP_TERM_FNT, - HELP_END -}; - -static const u8 sWhatToDo_Overworld[] = { - HELP_WHAT_SHOULD_I_BE_DOING, - HELP_WHAT_ARE_MY_ADVENTURE_BASICS, - HELP_CANT_FIND_PERSON_I_WANT, - HELP_TALKED_TO_EVERYONE_NOW_WHAT, - HELP_SOMEONE_BLOCKING_MY_WAY, - HELP_I_CANT_GO_ON, - HELP_HOW_DO_I_PROGRESS, - HELP_WHAT_IS_THAT_PERSON_LIKE, - HELP_OUT_OF_THINGS_TO_DO, - HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, - HELP_WHAT_DO_I_DO_IN_CAVE, - HELP_WHATS_POKEMON_CENTER, - HELP_WHATS_POKEMON_MART, - HELP_WHAT_IS_A_GYM, - HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, - HELP_WHEN_CAN_I_USE_ITEM, - HELP_RAN_OUT_OF_POTIONS, - HELP_CAN_I_BUY_POKEBALLS, - HELP_WHATS_A_BATTLE, - HELP_HOW_DO_I_PREPARE_FOR_BATTLE, - HELP_WHAT_IS_A_MONS_VITALITY, - HELP_WHERE_DO_MONS_APPEAR, - HELP_CANT_CATCH_MONS, - HELP_WANT_TO_MAKE_MON_STRONGER, - HELP_FOE_MONS_TOO_STRONG, - HELP_MY_MONS_ARE_HURT, - HELP_WHAT_IS_STATUS_PROBLEM, - HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, - HELP_WHATS_A_TRAINER, - HELP_HOW_DO_I_WIN_AGAINST_TRAINER, - HELP_WHAT_ARE_MOVES, - HELP_WANT_TO_ADD_MORE_MOVES, - HELP_WHAT_ARE_HIDDEN_MOVES, - HELP_WHAT_DOES_HIDDEN_MOVE_DO, - HELP_WANT_TO_END_GAME, - HELP_END -}; - -static const u8 sHowTo_Overworld[] = { - HELP_OPENING_MENU, - HELP_USING_POKEDEX, - HELP_USING_POKEMON, - HELP_USING_BAG, - HELP_USING_PLAYER, - HELP_USING_SAVE, - HELP_USING_OPTION, - HELP_USING_MOVE_OUTSIDE_OF_BATTLE, - HELP_END -}; - -static const u8 sTerms_Overworld[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_TYPE, - HELP_TERM_OT, - HELP_TERM_ITEM, - HELP_TERM_ABILITY, - HELP_TERM_FNT, - HELP_TERM_POKEMON, - HELP_END -}; - -static const u8 sWhatToDo_Dungeon[] = { - HELP_WHAT_ARE_MY_ADVENTURE_BASICS, - HELP_I_CANT_GO_ON, - HELP_HOW_DO_I_PROGRESS, - HELP_WHAT_IS_THAT_PERSON_LIKE, - HELP_OUT_OF_THINGS_TO_DO, - HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT, - HELP_WHAT_DO_I_DO_IN_CAVE, - HELP_WHATS_POKEMON_CENTER, - HELP_WHATS_POKEMON_MART, - HELP_WHAT_IS_A_GYM, - HELP_WHAT_HAPPENED_TO_ITEM_I_GOT, - HELP_WHEN_CAN_I_USE_ITEM, - HELP_RAN_OUT_OF_POTIONS, - HELP_WHATS_A_BATTLE, - HELP_HOW_DO_I_PREPARE_FOR_BATTLE, - HELP_WHAT_IS_A_MONS_VITALITY, - HELP_WHERE_DO_MONS_APPEAR, - HELP_CANT_CATCH_MONS, - HELP_WANT_TO_MAKE_MON_STRONGER, - HELP_FOE_MONS_TOO_STRONG, - HELP_MY_MONS_ARE_HURT, - HELP_WHAT_IS_STATUS_PROBLEM, - HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, - HELP_WHATS_A_TRAINER, - HELP_HOW_DO_I_WIN_AGAINST_TRAINER, - HELP_WHAT_ARE_MOVES, - HELP_WANT_TO_ADD_MORE_MOVES, - HELP_WHAT_ARE_HIDDEN_MOVES, - HELP_WHAT_DOES_HIDDEN_MOVE_DO, - HELP_WANT_TO_END_GAME, - HELP_END -}; - -static const u8 sHowTo_Dungeon[] = { - HELP_OPENING_MENU, - HELP_USING_POKEDEX, - HELP_USING_POKEMON, - HELP_USING_BAG, - HELP_USING_PLAYER, - HELP_USING_SAVE, - HELP_USING_OPTION, - HELP_USING_MOVE_OUTSIDE_OF_BATTLE, - HELP_END -}; - -static const u8 sTerms_Dungeon[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_TYPE, - HELP_TERM_OT, - HELP_TERM_ITEM, - HELP_TERM_ABILITY, - HELP_TERM_FNT, - HELP_END -}; - -static const u8 sWhatToDo_Surfing[] = { - HELP_I_CANT_GO_ON, - HELP_WHAT_IS_THAT_PERSON_LIKE, - HELP_OUT_OF_THINGS_TO_DO, - HELP_WHAT_IS_A_GYM, - HELP_CANT_CATCH_MONS, - HELP_WANT_TO_MAKE_MON_STRONGER, - HELP_FOE_MONS_TOO_STRONG, - HELP_MY_MONS_ARE_HURT, - HELP_WHAT_IS_STATUS_PROBLEM, - HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, - HELP_WHATS_A_TRAINER, - HELP_HOW_DO_I_WIN_AGAINST_TRAINER, - HELP_WHAT_ARE_MOVES, - HELP_WANT_TO_ADD_MORE_MOVES, - HELP_WHAT_ARE_HIDDEN_MOVES, - HELP_WHAT_DOES_HIDDEN_MOVE_DO, - HELP_WANT_TO_END_GAME, - HELP_END -}; - -static const u8 sHowTo_Surfing[] = { - HELP_OPENING_MENU, - HELP_USING_POKEDEX, - HELP_USING_POKEMON, - HELP_USING_BAG, - HELP_USING_PLAYER, - HELP_USING_SAVE, - HELP_USING_OPTION, - HELP_USING_MOVE_OUTSIDE_OF_BATTLE, - HELP_END -}; - -static const u8 sTerms_Surfing[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_TYPE, - HELP_TERM_OT, - HELP_TERM_ITEM, - HELP_TERM_ABILITY, - HELP_TERM_FNT, - HELP_END -}; - -static const u8 sWhatToDo_WildBattle[] = { - HELP_WHATS_A_BATTLE, - HELP_WHAT_ARE_MOVES, - HELP_WHAT_MOVES_SHOULD_I_USE, - HELP_WHAT_IS_A_MONS_VITALITY, - HELP_MY_MONS_ARE_HURT, - HELP_CANT_CATCH_MONS, - HELP_CAN_I_BUY_POKEBALLS, - HELP_RAN_OUT_OF_POTIONS, - HELP_WANT_TO_MAKE_MON_STRONGER, - HELP_FOE_MONS_TOO_STRONG, - HELP_WHAT_IS_STATUS_PROBLEM, - HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, - HELP_END -}; - -static const u8 sHowTo_WildBattle[] = { - HELP_USING_FIGHT, - HELP_USING_POKEMON2, - HELP_USING_SHIFT, - HELP_USING_SUMMARY2, - HELP_USING_BAG2, - HELP_USING_AN_ITEM, - HELP_USING_POKEBALL, - HELP_USING_RUN, - HELP_END -}; - -static const u8 sTerms_WildBattle[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_MOVES, - HELP_TERM_ATTACK, - HELP_TERM_DEFENSE, - HELP_TERM_SPATK, - HELP_TERM_SPDEF, - HELP_TERM_SPEED, - HELP_TERM_TYPE, - HELP_TERM_ABILITY, - HELP_TERM_MOVE_TYPE, - HELP_TERM_PP, - HELP_TERM_POWER, - HELP_TERM_ACCURACY, - HELP_TERM_STATUS_PROBLEM, - HELP_TERM_FNT, - HELP_END -}; - -static const u8 sTypeMatchups_WildBattle[] = { - HELP_TYPE_MATCHUPS, - HELP_END -}; - -static const u8 sWhatToDo_TrainerBattleSingle[] = { - HELP_WHATS_A_BATTLE, - HELP_WHAT_ARE_MOVES, - HELP_WHAT_MOVES_SHOULD_I_USE, - HELP_WHAT_IS_A_MONS_VITALITY, - HELP_MY_MONS_ARE_HURT, - HELP_RAN_OUT_OF_POTIONS, - HELP_WANT_TO_MAKE_MON_STRONGER, - HELP_FOE_MONS_TOO_STRONG, - HELP_WHAT_IS_STATUS_PROBLEM, - HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, - HELP_END -}; - -static const u8 sHowTo_TrainerBattleSingle[] = { - HELP_USING_FIGHT, - HELP_USING_POKEMON2, - HELP_USING_SHIFT, - HELP_USING_SUMMARY2, - HELP_USING_BAG2, - HELP_USING_AN_ITEM, - HELP_USING_RUN, - HELP_END -}; - -static const u8 sTerms_TrainerBattleSingle[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_MOVES, - HELP_TERM_ATTACK, - HELP_TERM_DEFENSE, - HELP_TERM_SPATK, - HELP_TERM_SPDEF, - HELP_TERM_SPEED, - HELP_TERM_TYPE, - HELP_TERM_ABILITY, - HELP_TERM_MOVE_TYPE, - HELP_TERM_PP, - HELP_TERM_POWER, - HELP_TERM_ACCURACY, - HELP_TERM_STATUS_PROBLEM, - HELP_TERM_FNT, - HELP_END -}; - -static const u8 sTypeMatchups_TrainerBattleSingle[] = { - HELP_TYPE_MATCHUPS, - HELP_END -}; - -static const u8 sWhatToDo_TrainerBattleDouble[] = { - HELP_WHATS_A_BATTLE, - HELP_WHAT_ARE_MOVES, - HELP_WHAT_MOVES_SHOULD_I_USE, - HELP_WHAT_IS_A_MONS_VITALITY, - HELP_MY_MONS_ARE_HURT, - HELP_RAN_OUT_OF_POTIONS, - HELP_WANT_TO_MAKE_MON_STRONGER, - HELP_FOE_MONS_TOO_STRONG, - HELP_WHAT_IS_STATUS_PROBLEM, - HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT, - HELP_END -}; - -static const u8 sHowTo_TrainerBattleDouble[] = { - HELP_USING_FIGHT, - HELP_USING_POKEMON2, - HELP_USING_SHIFT, - HELP_USING_SUMMARY2, - HELP_USING_BAG2, - HELP_USING_AN_ITEM, - HELP_USING_RUN, - HELP_END -}; - -static const u8 sTerms_TrainerBattleDouble[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_MOVES, - HELP_TERM_ATTACK, - HELP_TERM_DEFENSE, - HELP_TERM_SPATK, - HELP_TERM_SPDEF, - HELP_TERM_SPEED, - HELP_TERM_TYPE, - HELP_TERM_ABILITY, - HELP_TERM_MOVE_TYPE, - HELP_TERM_PP, - HELP_TERM_POWER, - HELP_TERM_ACCURACY, - HELP_TERM_STATUS_PROBLEM, - HELP_TERM_FNT, - HELP_END -}; - -static const u8 sTypeMatchups_TrainerBattleDouble[] = { - HELP_TYPE_MATCHUPS, - HELP_END -}; - -static const u8 sWhatToDo_SafariBattle[] = { - HELP_WHAT_DO_I_DO_IN_SAFARI, - HELP_WHAT_ARE_SAFARI_RULES, - HELP_WANT_TO_END_SAFARI, - HELP_END -}; - -static const u8 sHowTo_SafariBattle[] = { - HELP_USING_BALL, - HELP_USING_BAIT, - HELP_USING_ROCK, - HELP_USING_RUN, - HELP_END -}; - -static const u8 sTerms_SafariBattle[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_MOVES, - HELP_TERM_ATTACK, - HELP_TERM_DEFENSE, - HELP_TERM_SPATK, - HELP_TERM_SPDEF, - HELP_TERM_SPEED, - HELP_TERM_TYPE, - HELP_TERM_ABILITY, - HELP_TERM_MOVE_TYPE, - HELP_TERM_PP, - HELP_TERM_POWER, - HELP_TERM_ACCURACY, - HELP_END -}; - -static const u8 sTypeMatchups_SafariBattle[] = { - HELP_TYPE_MATCHUPS, - HELP_END -}; - -static const u8 sHowTo_PC[] = { - HELP_USING_PC, - HELP_USING_BILLS_PC, - HELP_USING_WITHDRAW, - HELP_USING_DEPOSIT, - HELP_USING_MOVE, - HELP_MOVING_ITEMS, - HELP_USING_PLAYERS_PC, - HELP_USING_WITHDRAW_ITEM, - HELP_USING_DEPOSIT_ITEM, - HELP_USING_MAILBOX, - HELP_USING_PROF_OAKS_PC, - HELP_USING_HALL_OF_FAME, - HELP_END -}; - -static const u8 sHowTo_BillsPC[] = { - HELP_USING_PC, - HELP_USING_BILLS_PC, - HELP_USING_WITHDRAW, - HELP_USING_DEPOSIT, - HELP_USING_MOVE, - HELP_MOVING_ITEMS, - HELP_USING_PLAYERS_PC, - HELP_USING_WITHDRAW_ITEM, - HELP_USING_DEPOSIT_ITEM, - HELP_USING_MAILBOX, - HELP_USING_PROF_OAKS_PC, - HELP_USING_HALL_OF_FAME, - HELP_END -}; - -static const u8 sHowTo_PlayersPCItems[] = { - HELP_USING_PC, - HELP_USING_BILLS_PC, - HELP_USING_WITHDRAW, - HELP_USING_DEPOSIT, - HELP_USING_MOVE, - HELP_MOVING_ITEMS, - HELP_USING_PLAYERS_PC, - HELP_USING_WITHDRAW_ITEM, - HELP_USING_DEPOSIT_ITEM, - HELP_USING_MAILBOX, - HELP_USING_PROF_OAKS_PC, - HELP_USING_HALL_OF_FAME, - HELP_END -}; - -static const u8 sHowTo_PlayersPCMailbox[] = { - HELP_USING_PC, - HELP_USING_BILLS_PC, - HELP_USING_WITHDRAW, - HELP_USING_DEPOSIT, - HELP_USING_MOVE, - HELP_MOVING_ITEMS, - HELP_USING_PLAYERS_PC, - HELP_USING_WITHDRAW_ITEM, - HELP_USING_DEPOSIT_ITEM, - HELP_USING_MAILBOX, - HELP_USING_PROF_OAKS_PC, - HELP_USING_HALL_OF_FAME, - HELP_END -}; - -static const u8 sHowTo_PCMisc[] = { - HELP_USING_PC, - HELP_USING_BILLS_PC, - HELP_USING_WITHDRAW, - HELP_USING_DEPOSIT, - HELP_USING_MOVE, - HELP_MOVING_ITEMS, - HELP_USING_PLAYERS_PC, - HELP_USING_WITHDRAW_ITEM, - HELP_USING_DEPOSIT_ITEM, - HELP_USING_MAILBOX, - HELP_USING_PROF_OAKS_PC, - HELP_USING_HALL_OF_FAME, - HELP_END -}; - -static const u8 sHowTo_BedroomPC[] = { - HELP_USING_HOME_PC, - HELP_USING_ITEM_STORAGE, - HELP_USING_WITHDRAW_ITEM2, - HELP_USING_DEPOSIT_ITEM2, - HELP_USING_MAILBOX2, - HELP_END -}; - -static const u8 sHowTo_BedroomPCItems[] = { - HELP_USING_HOME_PC, - HELP_USING_ITEM_STORAGE, - HELP_USING_WITHDRAW_ITEM2, - HELP_USING_DEPOSIT_ITEM2, - HELP_USING_MAILBOX2, - HELP_END -}; - -static const u8 sHowTo_BedroomPCMailbox[] = { - HELP_USING_HOME_PC, - HELP_USING_ITEM_STORAGE, - HELP_USING_WITHDRAW_ITEM2, - HELP_USING_DEPOSIT_ITEM2, - HELP_USING_MAILBOX2, - HELP_END -}; - -static const u8 sTerms_Basic[] = { - HELP_TERM_LEVEL, - HELP_TERM_HP, - HELP_TERM_EXP, - HELP_TERM_MOVES, - HELP_TERM_TM, - HELP_TERM_HM_MOVE, - HELP_TERM_HM, - HELP_TERM_ATTACK, - HELP_TERM_DEFENSE, - HELP_TERM_SPATK, - HELP_TERM_SPDEF, - HELP_TERM_SPEED, - HELP_TERM_TYPE, - HELP_TERM_OT, - HELP_TERM_ITEM, - HELP_TERM_ABILITY, - HELP_TERM_MOVE_TYPE, - HELP_TERM_NATURE, - HELP_TERM_ID_NO, - HELP_TERM_PP, - HELP_TERM_POWER, - HELP_TERM_ACCURACY, - HELP_TERM_STATUS_PROBLEM, - HELP_TERM_FNT, - HELP_TERM_EVOLUTION, - HELP_TERM_ITEMS, - HELP_TERM_KEYITEMS, - HELP_TERM_POKEBALLS, - HELP_TERM_PLAY_TIME, - HELP_TERM_MONEY, - HELP_TERM_BADGES, - HELP_END -}; - - -// Cant get this to match as a 2D array but it probably should be one, [HELPCONTEXT_COUNT][TOPIC_COUNT - 1] (Excludes TOPIC_EXIT) -static const u8 *const sHelpSystemSubmenuItemLists[HELPCONTEXT_COUNT * (TOPIC_COUNT - 1)] = { - NULL, NULL, NULL, NULL, NULL, // HELPCONTEXT_NONE - NULL, NULL, NULL, sAboutGame_TitleScreen, NULL, // HELPCONTEXT_TITLE_SCREEN - NULL, NULL, NULL, sAboutGame_NewGame, NULL, // HELPCONTEXT_NEW_GAME - NULL, sHowTo_NamingScreen, NULL, sAboutGame_NamingScreen, NULL, // HELPCONTEXT_NAMING_SCREEN - NULL, sHowTo_Pokedex, NULL, NULL, NULL, // HELPCONTEXT_POKEDEX - NULL, sHowTo_PartyMenu, sTerms_PartyMenu, NULL, NULL, // HELPCONTEXT_PARTY_MENU - NULL, sHowTo_PokemonInfo, sTerms_PokemonInfo, NULL, NULL, // HELPCONTEXT_POKEMON_INFO - NULL, NULL, sTerms_PokemonSkills, NULL, NULL, // HELPCONTEXT_POKEMON_SKILLS - NULL, NULL, sTerms_PokemonMoves, NULL, NULL, // HELPCONTEXT_POKEMON_MOVES - NULL, sHowTo_Bag, sTerms_Bag, NULL, NULL, // HELPCONTEXT_BAG - NULL, sHowTo_TrainerCardFront, sTerms_TrainerCardFront, NULL, NULL, // HELPCONTEXT_TRAINER_CARD_FRONT - NULL, sHowTo_TrainerCardBack, NULL, NULL, NULL, // HELPCONTEXT_TRAINER_CARD_BACK - NULL, sHowTo_Save, sTerms_Save, NULL, NULL, // HELPCONTEXT_SAVE - NULL, sHowTo_Options, sTerms_Options, NULL, NULL, // HELPCONTEXT_OPTIONS - sWhatToDo_PlayersHouse, NULL, NULL, sAboutGame_PlayersHouse, NULL, // HELPCONTEXT_PLAYERS_HOUSE - sWhatToDo_OaksLab, sHowTo_OaksLab, sTerms_OaksLab, NULL, NULL, // HELPCONTEXT_OAKS_LAB - sWhatToDo_PokeCenter, sHowTo_PokeCenter, sTerms_PokeCenter, sAboutGame_PokeCenter, NULL, // HELPCONTEXT_POKECENTER - sWhatToDo_Mart, sHowTo_Mart, sTerms_Mart, NULL, NULL, // HELPCONTEXT_MART - sWhatToDo_Gym, sHowTo_Gym, sTerms_Gym, NULL, sTypeMatchups_Gym, // HELPCONTEXT_GYM - sWhatToDo_Indoors, sHowTo_Indoors, sTerms_Indoors, NULL, NULL, // HELPCONTEXT_INDOORS - sWhatToDo_Overworld, sHowTo_Overworld, sTerms_Overworld, NULL, NULL, // HELPCONTEXT_OVERWORLD - sWhatToDo_Dungeon, sHowTo_Dungeon, sTerms_Dungeon, NULL, NULL, // HELPCONTEXT_DUNGEON - sWhatToDo_Surfing, sHowTo_Surfing, sTerms_Surfing, NULL, NULL, // HELPCONTEXT_SURFING - sWhatToDo_WildBattle, sHowTo_WildBattle, sTerms_WildBattle, NULL, sTypeMatchups_WildBattle, // HELPCONTEXT_WILD_BATTLE - sWhatToDo_TrainerBattleSingle, sHowTo_TrainerBattleSingle, sTerms_TrainerBattleSingle, NULL, sTypeMatchups_TrainerBattleSingle, // HELPCONTEXT_TRAINER_BATTLE_SINGLE - sWhatToDo_TrainerBattleDouble, sHowTo_TrainerBattleDouble, sTerms_TrainerBattleDouble, NULL, sTypeMatchups_TrainerBattleDouble, // HELPCONTEXT_TRAINER_BATTLE_DOUBLE - sWhatToDo_SafariBattle, sHowTo_SafariBattle, sTerms_SafariBattle, NULL, sTypeMatchups_SafariBattle, // HELPCONTEXT_SAFARI_BATTLE - NULL, sHowTo_PC, NULL, NULL, NULL, // HELPCONTEXT_PC - NULL, sHowTo_BillsPC, NULL, NULL, NULL, // HELPCONTEXT_BILLS_PC - NULL, sHowTo_PlayersPCItems, NULL, NULL, NULL, // HELPCONTEXT_PLAYERS_PC_ITEMS - NULL, sHowTo_PlayersPCMailbox, NULL, NULL, NULL, // HELPCONTEXT_PLAYERS_PC_MAILBOX - NULL, sHowTo_PCMisc, NULL, NULL, NULL, // HELPCONTEXT_PC_MISC - NULL, sHowTo_BedroomPC, NULL, NULL, NULL, // HELPCONTEXT_BEDROOM_PC - NULL, sHowTo_BedroomPCItems, NULL, NULL, NULL, // HELPCONTEXT_BEDROOM_PC_ITEMS - NULL, sHowTo_BedroomPCMailbox, NULL, NULL, NULL, // HELPCONTEXT_BEDROOM_PC_MAILBOX - NULL, NULL, NULL, NULL, NULL // HELPCONTEXT_UNUSED -}; - -static const u16 unref_845BCB0[] = INCBIN_U16("graphics/help_system/unk_845BCB0.bin"); - -static const u8 sHelpSystemContextTopicOrder[TOPIC_COUNT] = { - TOPIC_ABOUT_GAME, - TOPIC_WHAT_TO_DO, - TOPIC_HOW_TO_DO, - TOPIC_TERMS, - TOPIC_TYPE_MATCHUP, - TOPIC_EXIT -}; - -#define CONTEXT_TOPIC_FLAGS(whatToDo, howToDo, terms, aboutGame, typeMatchup, exit) \ - { \ - [TOPIC_WHAT_TO_DO] = whatToDo, \ - [TOPIC_HOW_TO_DO] = howToDo, \ - [TOPIC_TERMS] = terms, \ - [TOPIC_ABOUT_GAME] = aboutGame, \ - [TOPIC_TYPE_MATCHUP] = typeMatchup, \ - [TOPIC_EXIT] = exit \ - } \ - -static const bool8 sHelpSystemContextTopicFlags[HELPCONTEXT_COUNT + 1][TOPIC_COUNT] = { - [HELPCONTEXT_NONE] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE), - [HELPCONTEXT_TITLE_SCREEN] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE), - [HELPCONTEXT_NEW_GAME] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE), - [HELPCONTEXT_NAMING_SCREEN] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, TRUE, FALSE, TRUE), - [HELPCONTEXT_POKEDEX] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), - [HELPCONTEXT_PARTY_MENU] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_POKEMON_INFO] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_POKEMON_SKILLS] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_POKEMON_MOVES] = CONTEXT_TOPIC_FLAGS(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_BAG] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_TRAINER_CARD_FRONT] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_TRAINER_CARD_BACK] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), - [HELPCONTEXT_SAVE] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_OPTIONS] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_PLAYERS_HOUSE] = CONTEXT_TOPIC_FLAGS( TRUE, FALSE, FALSE, TRUE, FALSE, TRUE), - [HELPCONTEXT_OAKS_LAB] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_POKECENTER] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, TRUE, FALSE, TRUE), - [HELPCONTEXT_MART] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_GYM] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), - [HELPCONTEXT_INDOORS] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_OVERWORLD] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_DUNGEON] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_SURFING] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), - [HELPCONTEXT_WILD_BATTLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), - [HELPCONTEXT_TRAINER_BATTLE_SINGLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), - [HELPCONTEXT_TRAINER_BATTLE_DOUBLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), - [HELPCONTEXT_SAFARI_BATTLE] = CONTEXT_TOPIC_FLAGS( TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), - [HELPCONTEXT_PC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), - [HELPCONTEXT_BILLS_PC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), - [HELPCONTEXT_PLAYERS_PC_ITEMS] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), - [HELPCONTEXT_PLAYERS_PC_MAILBOX] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), - [HELPCONTEXT_PC_MISC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), - [HELPCONTEXT_BEDROOM_PC] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), - [HELPCONTEXT_BEDROOM_PC_ITEMS] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), - [HELPCONTEXT_BEDROOM_PC_MAILBOX] = CONTEXT_TOPIC_FLAGS(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), - [HELPCONTEXT_UNUSED] = {}, - [HELPCONTEXT_COUNT] = {} -}; - -static const u16 sMartMaps[] = { - MAP_VIRIDIAN_CITY_MART, - MAP_PEWTER_CITY_MART, - MAP_CERULEAN_CITY_MART, - MAP_LAVENDER_TOWN_MART, - MAP_VERMILION_CITY_MART, - MAP_CELADON_CITY_DEPARTMENT_STORE_1F, - MAP_CELADON_CITY_DEPARTMENT_STORE_2F, - MAP_CELADON_CITY_DEPARTMENT_STORE_3F, - MAP_CELADON_CITY_DEPARTMENT_STORE_4F, - MAP_CELADON_CITY_DEPARTMENT_STORE_5F, - MAP_CELADON_CITY_DEPARTMENT_STORE_ROOF, - MAP_CELADON_CITY_DEPARTMENT_STORE_ELEVATOR, - MAP_FUCHSIA_CITY_MART, - MAP_CINNABAR_ISLAND_MART, - MAP_SAFFRON_CITY_MART, - MAP_THREE_ISLAND_MART, - MAP_FOUR_ISLAND_MART, - MAP_SEVEN_ISLAND_MART, - MAP_SIX_ISLAND_MART, - MAP_UNDEFINED -}; - -static const u16 sGymMaps[] = { - MAP_PEWTER_CITY_GYM, - MAP_CERULEAN_CITY_GYM, - MAP_VERMILION_CITY_GYM, - MAP_CELADON_CITY_GYM, - MAP_FUCHSIA_CITY_GYM, - MAP_SAFFRON_CITY_GYM, - MAP_CINNABAR_ISLAND_GYM, - MAP_VIRIDIAN_CITY_GYM, - MAP_UNDEFINED -}; - -static const u8 sDungeonMaps[][3] = { - { MAP_GROUP(VIRIDIAN_FOREST), MAP_NUM(VIRIDIAN_FOREST), 1 }, - { MAP_GROUP(MT_MOON_1F), MAP_NUM(MT_MOON_1F), 3 }, - { MAP_GROUP(ROCK_TUNNEL_1F), MAP_NUM(ROCK_TUNNEL_1F), 2 }, - { MAP_GROUP(DIGLETTS_CAVE_NORTH_ENTRANCE), MAP_NUM(DIGLETTS_CAVE_NORTH_ENTRANCE), 3 }, - { MAP_GROUP(SEAFOAM_ISLANDS_1F), MAP_NUM(SEAFOAM_ISLANDS_1F), 5 }, - { MAP_GROUP(VICTORY_ROAD_1F), MAP_NUM(VICTORY_ROAD_1F), 3 }, - { MAP_GROUP(CERULEAN_CAVE_1F), MAP_NUM(CERULEAN_CAVE_1F), 3 }, - { MAP_GROUP(MT_EMBER_RUBY_PATH_B4F), MAP_NUM(MT_EMBER_RUBY_PATH_B4F), 1 }, - { MAP_GROUP(MT_EMBER_SUMMIT_PATH_1F), MAP_NUM(MT_EMBER_SUMMIT_PATH_1F), 3 }, - { MAP_GROUP(MT_EMBER_RUBY_PATH_B5F), MAP_NUM(MT_EMBER_RUBY_PATH_B5F), 7 }, - { MAP_GROUP(THREE_ISLAND_BERRY_FOREST), MAP_NUM(THREE_ISLAND_BERRY_FOREST), 1 }, - { MAP_GROUP(SIX_ISLAND_PATTERN_BUSH), MAP_NUM(SIX_ISLAND_PATTERN_BUSH), 1 }, - { MAP_GROUP(FIVE_ISLAND_LOST_CAVE_ENTRANCE), MAP_NUM(FIVE_ISLAND_LOST_CAVE_ENTRANCE), 15 }, - { MAP_GROUP(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), MAP_NUM(FOUR_ISLAND_ICEFALL_CAVE_ENTRANCE), 4 }, - { MAP_GROUP(SIX_ISLAND_ALTERING_CAVE), MAP_NUM(SIX_ISLAND_ALTERING_CAVE), 1 }, - { MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER), 7 } -}; - -void SetHelpContextDontCheckBattle(u8 contextId) -{ - sHelpSystemContextId = contextId; -} - -void SetHelpContext(u8 contextId) -{ - switch (sHelpSystemContextId) - { - case HELPCONTEXT_WILD_BATTLE: - case HELPCONTEXT_TRAINER_BATTLE_SINGLE: - case HELPCONTEXT_TRAINER_BATTLE_DOUBLE: - case HELPCONTEXT_SAFARI_BATTLE: - if (contextId == HELPCONTEXT_BAG - || contextId == HELPCONTEXT_PARTY_MENU - || contextId == HELPCONTEXT_POKEMON_INFO - || contextId == HELPCONTEXT_POKEMON_SKILLS - || contextId == HELPCONTEXT_POKEMON_MOVES) - break; - // fallthrough - default: - sHelpSystemContextId = contextId; - break; - } -} - -void Script_SetHelpContext(void) -{ - sHelpSystemContextId = gSpecialVar_0x8004; -} - -void BackupHelpContext(void) -{ - gHelpContextIdBackup = sHelpSystemContextId; -} - -void RestoreHelpContext(void) -{ - sHelpSystemContextId = gHelpContextIdBackup; -} - -static bool32 IsInMartMap(void) -{ - return IsCurrentMapInArray(sMartMaps); -} - -static bool32 IsInGymMap(void) -{ - return IsCurrentMapInArray(sGymMaps); -} - -static bool32 IsCurrentMapInArray(const u16 * mapIdxs) -{ - u16 mapIdx = (gSaveBlock1Ptr->location.mapGroup << 8) + gSaveBlock1Ptr->location.mapNum; - s32 i; - - for (i = 0; mapIdxs[i] != MAP_UNDEFINED; i++) - { - if (mapIdxs[i] == mapIdx) - return TRUE; - } - - return FALSE; -} - -static bool8 IsInDungeonMap(void) -{ - u8 i, j; - - for (i = 0; i < NELEMS(sDungeonMaps); i++) - { - for (j = 0; j < sDungeonMaps[i][2]; j++) - { - if ( - sDungeonMaps[i][0] == gSaveBlock1Ptr->location.mapGroup - && sDungeonMaps[i][1] + j == gSaveBlock1Ptr->location.mapNum - && (i != 15 /* TANOBY */ || FlagGet(FLAG_SYS_UNLOCKED_TANOBY_RUINS) == TRUE) - ) - return TRUE; - } - } - - return FALSE; -} - -#define IN_PLAYERS_HOUSE \ - ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) \ - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)) \ - || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F) \ - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F))) \ - - #define IN_OAKS_LAB \ - (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PROFESSOR_OAKS_LAB) \ - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PROFESSOR_OAKS_LAB)) \ - -void SetHelpContextForMap(void) -{ - HelpSystem_EnableToggleWithRButton(); - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) - SetHelpContext(HELPCONTEXT_SURFING); - else if (IsInDungeonMap()) - SetHelpContext(HELPCONTEXT_DUNGEON); - else if (IsMapTypeIndoors(gMapHeader.mapType)) - { - if (IN_PLAYERS_HOUSE) - SetHelpContext(HELPCONTEXT_PLAYERS_HOUSE); - else if (IN_OAKS_LAB) - SetHelpContext(HELPCONTEXT_OAKS_LAB); - else if (IsCurMapPokeCenter() == TRUE) - SetHelpContext(HELPCONTEXT_POKECENTER); - else if (IsInMartMap() == TRUE) - SetHelpContext(HELPCONTEXT_MART); - else if (IsInGymMap() == TRUE) - SetHelpContext(HELPCONTEXT_GYM); - else - SetHelpContext(HELPCONTEXT_INDOORS); - } - else - SetHelpContext(HELPCONTEXT_OVERWORLD); -} - -bool8 HelpSystem_UpdateHasntSeenIntro(void) -{ - if (sSeenHelpSystemIntro == TRUE) - return FALSE; - - if (gSaveFileStatus != SAVE_STATUS_EMPTY && gSaveFileStatus != SAVE_STATUS_INVALID && FlagGet(FLAG_SYS_SAW_HELP_SYSTEM_INTRO)) - return FALSE; - - FlagSet(FLAG_SYS_SAW_HELP_SYSTEM_INTRO); - sSeenHelpSystemIntro = TRUE; - return TRUE; -} - -bool8 sub_812B45C(void) -{ - if (gReceivedRemoteLinkPlayers == TRUE) - return FALSE; - return TRUE; -} - -void HelpSystem_Disable(void) -{ - gHelpSystemEnabled = FALSE; -} - -void HelpSystem_Enable(void) -{ - if (!QL_IS_PLAYBACK_STATE) - { - gHelpSystemEnabled = TRUE; - HelpSystem_EnableToggleWithRButton(); - } -} - -void HelpSystem_DisableToggleWithRButton(void) -{ - gHelpSystemToggleWithRButtonDisabled = TRUE; -} - -void HelpSystem_EnableToggleWithRButton(void) -{ - gHelpSystemToggleWithRButtonDisabled = FALSE; -} - -static void ResetHelpSystemListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - helpListMenu->sub.items = listMenuItemsBuffer; - helpListMenu->sub.totalItems = 1; - helpListMenu->sub.maxShowed = 1; - helpListMenu->sub.left = 1; - helpListMenu->sub.top = 4; -} - -static void BuildAndPrintMainTopicsListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer); - BuildMainTopicsListAndMoveToH00(helpListMenu, listMenuItemsBuffer); - PrintTextOnPanel2Row52RightAlign(gUnknown_841DFAC); - HelpSystem_InitListMenuController(helpListMenu, 0, gHelpSystemState[2]); - PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer); - sub_813BDA4(1); - sub_813BD5C(1); -} - -static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - u8 i; - u8 totalItems = 0; - for (i = 0; i < TOPIC_COUNT; i++) - { - if (sHelpSystemContextTopicFlags[sHelpSystemContextId][sHelpSystemContextTopicOrder[i]] == TRUE) - { - listMenuItemsBuffer[totalItems].label = sHelpSystemTopicPtrs[sHelpSystemContextTopicOrder[i]]; - listMenuItemsBuffer[totalItems].index = sHelpSystemContextTopicOrder[i]; - totalItems++; - } - } - listMenuItemsBuffer[totalItems - 1].index = -2; - helpListMenu->sub.totalItems = totalItems; - helpListMenu->sub.maxShowed = totalItems; - helpListMenu->sub.left = 0; -} - -static void BuildAndPrintSubmenuList(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - sub_813BDE8(0); - sub_813BFC0(0); - sub_813BE78(1); - ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer); - SetHelpSystemSubmenuItems(helpListMenu, listMenuItemsBuffer); - PrintTextOnPanel2Row52RightAlign(gUnknown_841DFC9); - HelpSystem_InitListMenuController(helpListMenu, helpListMenu->itemsAbove, helpListMenu->cursorPos); - HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[gHelpSystemState[1]], 0, 0); - sub_813BDA4(1); - sub_813BD5C(1); -} - -static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - u8 totalItems = 0; - const u8 * submenuItems = sHelpSystemSubmenuItemLists[sHelpSystemContextId * 5 + gHelpSystemState[1]]; // accessing as 2D array - u8 i; - for (i = 0; submenuItems[i] != HELP_END; i++) - { - if (IsHelpSystemSubmenuEnabled(submenuItems[i]) == TRUE) - { - if (gHelpSystemState[1] == TOPIC_WHAT_TO_DO) - listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedQuestionTextPtrs[submenuItems[i]]; - else if (gHelpSystemState[1] == TOPIC_HOW_TO_DO) - listMenuItemsBuffer[totalItems].label = sHelpSystemMenuTopicTextPtrs[submenuItems[i]]; - else if (gHelpSystemState[1] == TOPIC_TERMS) - listMenuItemsBuffer[totalItems].label = sHelpSystemTermTextPtrs[submenuItems[i]]; - else if (gHelpSystemState[1] == TOPIC_ABOUT_GAME) - listMenuItemsBuffer[totalItems].label = sHelpSystemGeneralTopicTextPtrs[submenuItems[i]]; - else // TOPIC_TYPE_MATCHUP - listMenuItemsBuffer[totalItems].label = sHelpSystemTypeMatchupTextPtrs[submenuItems[i]]; - listMenuItemsBuffer[totalItems].index = submenuItems[i]; - totalItems++; - } - } - if (HelpSystem_ShouldShowBasicTerms() == TRUE) - { - for (i = 0, submenuItems = sTerms_Basic; submenuItems[i] != HELP_END; i++) - { - listMenuItemsBuffer[totalItems].label = sHelpSystemTermTextPtrs[submenuItems[i]]; - listMenuItemsBuffer[totalItems].index = submenuItems[i]; - totalItems++; - } - } - listMenuItemsBuffer[totalItems].label = Help_Text_Cancel; - listMenuItemsBuffer[totalItems].index = -2; - totalItems++; - helpListMenu->sub.totalItems = totalItems; - helpListMenu->sub.maxShowed = 7; - helpListMenu->sub.left = 0; - helpListMenu->sub.top = 21; -} - -static bool8 HelpSystem_ShouldShowBasicTerms(void) -{ - if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && gHelpSystemState[1] == TOPIC_TERMS) - return TRUE; - return FALSE; -} - -static bool8 IsHelpSystemSubmenuEnabled(u8 id) -{ - u8 i = 0; - - if (gHelpSystemState[1] == TOPIC_WHAT_TO_DO) - { - switch (id) - { - case HELP_PLAYING_FOR_FIRST_TIME: - case HELP_WHAT_SHOULD_I_BE_DOING: - case HELP_CANT_GET_OUT_OF_ROOM: - case HELP_TALKED_TO_EVERYONE_NOW_WHAT: - case HELP_OUT_OF_THINGS_TO_DO: - case HELP_NOTHING_I_WANT_TO_KNOW: - case HELP_WHATS_A_MON: - case HELP_WHAT_DO_I_DO_IN_SAFARI: - case HELP_WHAT_ARE_SAFARI_RULES: - case HELP_WANT_TO_END_SAFARI: - return TRUE; - case HELP_CANT_FIND_PERSON_I_WANT: - return FlagGet(FLAG_VISITED_OAKS_LAB); - case HELP_SOMEONE_BLOCKING_MY_WAY: - case HELP_WHAT_ARE_MY_ADVENTURE_BASICS: - case HELP_HOW_DO_I_PREPARE_FOR_BATTLE: - case HELP_WHAT_IS_STATUS_PROBLEM: - case HELP_RAN_OUT_OF_POTIONS: - case HELP_WHATS_POKEMON_CENTER: - case HELP_WHATS_POKEMON_MART: - return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_CITY); - case HELP_I_CANT_GO_ON: - return FlagGet(FLAG_WORLD_MAP_VERMILION_CITY); - case HELP_HOW_ARE_ROADS_FORESTS_DIFFERENT: - case HELP_WHATS_A_TRAINER: - return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST); - case HELP_WHAT_HAPPENED_TO_ITEM_I_GOT: - case HELP_WHEN_CAN_I_USE_ITEM: - case HELP_HOW_DO_I_PROGRESS: - case HELP_WHATS_A_BATTLE: - case HELP_WHAT_IS_A_MONS_VITALITY: - case HELP_MY_MONS_ARE_HURT: - case HELP_WHAT_HAPPENS_IF_ALL_MY_MONS_FAINT: - case HELP_WHERE_DO_MONS_APPEAR: - case HELP_WHAT_MOVES_SHOULD_I_USE: - case HELP_WANT_TO_MAKE_MON_STRONGER: - case HELP_WANT_TO_END_GAME: - return FlagGet(FLAG_SYS_POKEMON_GET); - case HELP_CANT_CATCH_MONS: - case HELP_CAN_I_BUY_POKEBALLS: - return FlagGet(FLAG_SYS_POKEDEX_GET); - case HELP_HOW_ARE_CAVES_DIFFERENT: - case HELP_WHAT_DO_I_DO_IN_CAVE: - case HELP_HOW_DO_I_WIN_AGAINST_TRAINER: - case HELP_FOE_MONS_TOO_STRONG: - case HELP_WHAT_ARE_MOVES: - case HELP_WANT_TO_ADD_MORE_MOVES: - return FlagGet(FLAG_BADGE01_GET); - case HELP_WHAT_ARE_HIDDEN_MOVES: - case HELP_WHAT_DOES_HIDDEN_MOVE_DO: - return HasGottenAtLeastOneHM(); - case HELP_WHAT_IS_THAT_PERSON_LIKE: - return FlagGet(FLAG_GOT_FAME_CHECKER); - case HELP_WHAT_IS_A_GYM: - return FlagGet(FLAG_WORLD_MAP_PEWTER_CITY); - } - return FALSE; - } - if (gHelpSystemState[1] == TOPIC_HOW_TO_DO) - { - switch (id) - { - case HELP_USING_BAG: - case HELP_USING_PLAYER: - case HELP_USING_SAVE: - case HELP_USING_OPTION: - case HELP_ENTERING_NAME: - case HELP_USING_PC: - case HELP_USING_BILLS_PC: - case HELP_USING_WITHDRAW: - case HELP_USING_DEPOSIT: - case HELP_USING_MOVE: - case HELP_MOVING_ITEMS: - case HELP_USING_PLAYERS_PC: - case HELP_USING_WITHDRAW_ITEM: - case HELP_USING_DEPOSIT_ITEM: - case HELP_USING_MAILBOX: - case HELP_OPENING_MENU: - case HELP_USING_BAG2: - case HELP_USING_HOME_PC: - case HELP_USING_ITEM_STORAGE: - case HELP_USING_WITHDRAW_ITEM2: - case HELP_USING_DEPOSIT_ITEM2: - case HELP_USING_MAILBOX2: - case HELP_USING_BALL: - case HELP_USING_BAIT: - case HELP_USING_ROCK: - return TRUE; - case HELP_USING_POKEDEX: - case HELP_USING_PROF_OAKS_PC: - case HELP_READING_POKEDEX: - return FlagGet(FLAG_SYS_POKEDEX_GET); - case HELP_USING_TOWN_MAP: - return CheckBagHasItem(ITEM_TOWN_MAP, 1); - case HELP_USING_POKEMON: - case HELP_USING_SUMMARY: - case HELP_USING_ITEM: - case HELP_USING_AN_ITEM: - case HELP_USING_KEYITEM: - case HELP_USING_POKEBALL: - case HELP_USING_POTION: - case HELP_USING_FIGHT: - case HELP_USING_POKEMON2: - case HELP_USING_SUMMARY2: - case HELP_USING_RUN: - case HELP_REGISTER_KEY_ITEM: - return FlagGet(FLAG_SYS_POKEMON_GET); - case HELP_USING_SWITCH: - case HELP_USING_SHIFT: - // Only show if player has caught mon after starter - if (GetKantoPokedexCount(1) > 1) - return TRUE; - return FALSE; - case HELP_USING_TM: - return FlagGet(FLAG_BADGE01_GET); - case HELP_USING_HM: - case HELP_USING_MOVE_OUTSIDE_OF_BATTLE: - return HasGottenAtLeastOneHM(); - case HELP_RIDING_BICYCLE: - return FlagGet(FLAG_GOT_BICYCLE); - case HELP_USING_HALL_OF_FAME: - return FlagGet(FLAG_SYS_GAME_CLEAR); - } - return FALSE; - } - if (gHelpSystemState[1] == TOPIC_TERMS) - { - if (HelpSystem_ShouldShowBasicTerms() == TRUE) - { - // After defeating Brock, all basic terms are added - // This checks to make sure they arent added twice - for (i = 0; sTerms_Basic[i] != HELP_END; i++) - { - if (sTerms_Basic[i] == id) - return FALSE; - } - } - switch (id) - { - case HELP_TERM_MONEY: - case HELP_TERM_ID_NO: - case HELP_TERM_ITEMS: - case HELP_TERM_KEYITEMS: - case HELP_TERM_POKEBALLS: - case HELP_TERM_POKEDEX: - case HELP_TERM_PLAY_TIME: - case HELP_TERM_BADGES: - case HELP_TERM_TEXT_SPEED: - case HELP_TERM_BATTLE_SCENE: - case HELP_TERM_BATTLE_STYLE: - case HELP_TERM_SOUND: - case HELP_TERM_BUTTON_MODE: - case HELP_TERM_FRAME: - case HELP_TERM_CANCEL: - case HELP_TERM_TM: - case HELP_TERM_EVOLUTION: - return TRUE; - case HELP_TERM_HP: - case HELP_TERM_EXP: - case HELP_TERM_ATTACK: - case HELP_TERM_DEFENSE: - case HELP_TERM_SPATK: - case HELP_TERM_SPDEF: - case HELP_TERM_SPEED: - case HELP_TERM_LEVEL: - case HELP_TERM_TYPE: - case HELP_TERM_OT: - case HELP_TERM_ITEM: - case HELP_TERM_ABILITY: - case HELP_TERM_NATURE: - case HELP_TERM_POWER: - case HELP_TERM_ACCURACY: - case HELP_TERM_FNT: - return FlagGet(FLAG_SYS_POKEMON_GET); - case HELP_TERM_HM: - case HELP_TERM_HM_MOVE: - return HasGottenAtLeastOneHM(); - case HELP_TERM_MOVES: - case HELP_TERM_MOVE_TYPE: - case HELP_TERM_PP: - case HELP_TERM_STATUS_PROBLEM: - return FlagGet(FLAG_WORLD_MAP_VIRIDIAN_FOREST); - } - return TRUE; - } - if (gHelpSystemState[1] == TOPIC_ABOUT_GAME) - { - switch (id) - { - case HELP_GAME_FUNDAMENTALS_2: - return FlagGet(FLAG_BADGE01_GET); - case HELP_GAME_FUNDAMENTALS_3: - return FlagGet(FLAG_BADGE02_GET); - } - return TRUE; - } - if (gHelpSystemState[1] == TOPIC_TYPE_MATCHUP) - { - return TRUE; - } - - return FALSE; -} - -static bool8 HasGottenAtLeastOneHM(void) -{ - if (FlagGet(FLAG_GOT_HM01) == TRUE) - return TRUE; - if (FlagGet(FLAG_GOT_HM02) == TRUE) - return TRUE; - if (FlagGet(FLAG_GOT_HM03) == TRUE) - return TRUE; - if (FlagGet(FLAG_GOT_HM04) == TRUE) - return TRUE; - if (FlagGet(FLAG_GOT_HM05) == TRUE) - return TRUE; - if (FlagGet(FLAG_GOT_HM06) == TRUE) - return TRUE; - if (FlagGet(FLAG_HIDE_FOUR_ISLAND_ICEFALL_CAVE_1F_HM07) == TRUE) - return TRUE; - return FALSE; -} - -bool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - switch (helpListMenu->state) - { - case 8: - return HelpSystemSubroutine_PrintWelcomeMessage(helpListMenu, listMenuItemsBuffer); - case 9: - return HelpSystemSubroutine_WelcomeWaitButton(helpListMenu, listMenuItemsBuffer); - case 10: - return HelpSystemSubroutine_WelcomeEndGotoMenu(helpListMenu, listMenuItemsBuffer); - case 0: - return HelpSystemSubroutine_MenuInputHandlerMain(helpListMenu, listMenuItemsBuffer); - case 1: - return HelpMenuSubroutine_InitSubmenu(helpListMenu, listMenuItemsBuffer); - case 2: - return HelpMenuSubroutine_ReturnFromSubmenu(helpListMenu, listMenuItemsBuffer); - case 3: - return HelpMenuSubroutine_SubmenuInputHandler(helpListMenu, listMenuItemsBuffer); - case 4: - return HelpMenuSubroutine_HelpItemPrint(helpListMenu, listMenuItemsBuffer); - case 5: - return HelpMenuSubroutine_ReturnFromHelpItem(helpListMenu, listMenuItemsBuffer); - case 6: - return HelpMenuSubroutine_HelpItemWaitButton(helpListMenu, listMenuItemsBuffer); - } - return FALSE; -} - -bool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - PrintTextOnPanel2Row52RightAlign(gUnknown_841DFA5); - PrintWelcomeMessageOnPanel1(); - sub_813BDA4(1); - sub_813BD5C(1); - helpListMenu->state = 9; - return TRUE; -} - -bool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - helpListMenu->state = 10; - } - return TRUE; -} - -bool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - gHelpSystemState[2] = 0; - ResetHelpSystemCursor(helpListMenu); - BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer); - helpListMenu->state = 0; - return TRUE; -} - -bool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - s32 input = HelpSystem_GetMenuInput(); - switch (input) - { - case -6: - case -2: - return FALSE; - case -5: - case -4: - PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer); - break; - case -3: - case -1: - break; - default: - gHelpSystemState[1] = input; - helpListMenu->state = 1; - break; - } - return TRUE; -} - -bool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - gHelpSystemState[0] = 1; - gHelpSystemState[2] = helpListMenu->cursorPos; - ResetHelpSystemCursor(helpListMenu); - BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer); - sub_813C75C(); - HelpSystem_SetInputDelay(2); - helpListMenu->state = 3; - return TRUE; -} - -bool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - sub_813C004(0, 0); - sub_813C004(1, 0); - gHelpSystemState[0] = 0; - BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer); - helpListMenu->state = 0; - return TRUE; -} - -bool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - s32 input = HelpSystem_GetMenuInput(); - switch (input) - { - case -6: - return FALSE; - case -2: - helpListMenu->state = 2; - break; - case -5: - case -4: - case -3: - case -1: - break; - default: - gHelpSystemState[3] = input; - helpListMenu->state = 4; - break; - } - return TRUE; -} - -void HelpSystem_PrintTopicLabel(void) -{ - HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[gHelpSystemState[1]], 0, 0); -} - -bool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - gHelpSystemState[0] = 2; - sub_813BDA4(0); - HelpSystem_FillPanel1(); - PrintTextOnPanel2Row52RightAlign(gUnknown_841DFBE); - sub_813BDE8(1); - sub_813BEE4(1); - - if (gHelpSystemState[1] == TOPIC_WHAT_TO_DO) - { - HelpSystem_PrintTwoStrings(sHelpSystemSpecializedQuestionTextPtrs[gHelpSystemState[3]], sHelpSystemSpecializedAnswerTextPtrs[gHelpSystemState[3]]); - } - else if (gHelpSystemState[1] == TOPIC_HOW_TO_DO) - { - HelpSystem_PrintTwoStrings(sHelpSystemMenuTopicTextPtrs[gHelpSystemState[3]], sHelpSystemHowToUseMenuTextPtrs[gHelpSystemState[3]]); - } - else if (gHelpSystemState[1] == TOPIC_TERMS) - { - HelpSystem_PrintTwoStrings(sHelpSystemTermTextPtrs[gHelpSystemState[3]], sHelpSystemTermDefinitionsTextPtrs[gHelpSystemState[3]]); - } - else if (gHelpSystemState[1] == TOPIC_ABOUT_GAME) - { - HelpSystem_PrintTwoStrings(sHelpSystemGeneralTopicTextPtrs[gHelpSystemState[3]], sHelpSystemGeneralTopicDescriptionTextPtrs[gHelpSystemState[3]]); - } - else // TOPIC_TYPE_MATCHUP - { - HelpSystem_PrintTwoStrings(sHelpSystemTypeMatchupTextPtrs[gHelpSystemState[3]], sHelpSystemTypeMatchupDescriptionTextPtrs[gHelpSystemState[3]]); - } - sub_813BDA4(1); - sub_813BD5C(1); - helpListMenu->state = 6; - return TRUE; -} - -bool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - gHelpSystemState[0] = 1; - BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer); - sub_813C75C(); - HelpSystem_SetInputDelay(2); - helpListMenu->state = 3; - return TRUE; -} - -bool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - helpListMenu->state = 5; - return TRUE; - } - if (JOY_NEW(L_BUTTON | R_BUTTON)) - return FALSE; - return TRUE; -} - -static void PrintWelcomeMessageOnPanel1(void) -{ - HelpSystem_FillPanel1(); - HelpSystem_PrintTextAt(Help_Text_Greetings, 0, 0); -} - -static void PrintTextOnPanel2Row52RightAlign(const u8 * str) -{ - HelpSystem_FillPanel2(); - HelpSystem_PrintTextRightAlign_Row52(str); -} - -u8 sub_812BF88(void) -{ - return gHelpSystemState[0]; -} - -static void ResetHelpSystemCursor(struct HelpSystemListMenu * helpListMenu) -{ - helpListMenu->itemsAbove = 0; - helpListMenu->cursorPos = 0; -} - -static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) -{ - s32 index = listMenuItemsBuffer[helpListMenu->itemsAbove + helpListMenu->cursorPos].index; - if (index == -2) - HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[5]); - else - HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[index]); - sub_813BE30(1); -} diff --git a/src/help_system_util.c b/src/help_system_util.c new file mode 100644 index 000000000..cd7bd1acf --- /dev/null +++ b/src/help_system_util.c @@ -0,0 +1,856 @@ +#include "global.h" +#include "gflib.h" +#include "decompress.h" +#include "m4a.h" +#include "event_data.h" +#include "help_system.h" +#include "list_menu.h" +#include "strings.h" +#include "constants/songs.h" + +#define ZERO 0 + +bool8 gHelpSystemEnabled; + +struct HelpSystemVideoState +{ + /*0x00*/ MainCallback savedVblankCb; + /*0x04*/ MainCallback savedHblankCb; + /*0x08*/ u16 savedDispCnt; + /*0x0a*/ u16 savedBg0Cnt; + /*0x0c*/ u16 savedBg0Hofs; + /*0x0e*/ u16 savedBg0Vofs; + /*0x10*/ u16 savedBldCnt; + /*0x12*/ u8 savedTextColor[3]; + /*0x15*/ u8 state; +}; + +static EWRAM_DATA u8 sMapTilesBackup[BG_CHAR_SIZE] = {0}; +EWRAM_DATA u8 gDisableHelpSystemVolumeReduce = 0; +EWRAM_DATA bool8 gHelpSystemToggleWithRButtonDisabled = FALSE; +static EWRAM_DATA u8 sDelayTimer = 0; +static EWRAM_DATA u8 sInHelpSystem = 0; +static EWRAM_DATA struct HelpSystemVideoState sVideoState = {0}; +EWRAM_DATA struct HelpSystemListMenu gHelpSystemListMenu = {0}; +EWRAM_DATA struct ListMenuItem gHelpSystemListMenuItems[52] = {0}; + +static const u16 sTiles[] = INCBIN_U16("graphics/help_system/bg_tiles.4bpp"); +static const u16 sPals[] = INCBIN_U16("graphics/help_system/bg_tiles.gbapal"); + +u8 RunHelpSystemCallback(void) +{ + s32 i; + + switch (sVideoState.state) + { + case 0: + sInHelpSystem = 0; + if (gSaveBlock2Ptr->optionsButtonMode != OPTIONS_BUTTON_MODE_HELP) + return 0; + if (JOY_NEW(R_BUTTON) && gHelpSystemToggleWithRButtonDisabled == TRUE) + return 0; + if (JOY_NEW(L_BUTTON | R_BUTTON)) + { + if (!HelpSystem_IsSinglePlayer() || !gHelpSystemEnabled) + { + PlaySE(SE_HELP_ERROR); + return 0; + } + m4aMPlayStop(&gMPlayInfo_SE1); + m4aMPlayStop(&gMPlayInfo_SE2); + PlaySE(SE_HELP_OPEN); + if (!gDisableHelpSystemVolumeReduce) + m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x80); + SaveCallbacks(); + sInHelpSystem = 1; + sVideoState.state = 1; + } + break; + case 1: + SaveMapTiles(); + SaveMapGPURegs(); + SaveMapTextColors(); + (*(vu16 *)PLTT) = sPals[15]; + SetGpuReg(REG_OFFSET_DISPCNT, 0); + sVideoState.state = 2; + break; + case 2: + RequestDma3Fill(0, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT); + RequestDma3Copy(sPals, (void *)PLTT, sizeof(sPals), DMA3_16BIT); + RequestDma3Copy(sTiles, gDecompressionBuffer + 0x3EE0, sizeof(sTiles), DMA3_16BIT); + sVideoState.state = 3; + break; + case 3: + HS_BufferFillMapWithTile1FF(); + HelpSystem_FillPanel3(); + HelpSystem_FillPanel2(); + HelpSystem_PrintTextInTopLeftCorner(gString_Help); + HS_ShowOrHideWordHELPinTopLeft(1); + if (HelpSystem_UpdateHasntSeenIntro() == TRUE) + HelpSystemSubroutine_PrintWelcomeMessage(&gHelpSystemListMenu, gHelpSystemListMenuItems); + else + HelpSystemSubroutine_WelcomeEndGotoMenu(&gHelpSystemListMenu, gHelpSystemListMenuItems); + HS_ShowOrHideHeaderAndFooterLines_Lighter(1); + HS_ShowOrHideVerticalBlackBarsAlongSides(1); + CommitTilemap(); + sVideoState.state = 4; + break; + case 4: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31)); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON); + sVideoState.state = 5; + break; + case 5: + if (!RunHelpMenuSubroutine(&gHelpSystemListMenu, gHelpSystemListMenuItems)) + { + PlaySE(SE_HELP_CLOSE); + sVideoState.state = 6; + } + break; + case 6: + SetGpuReg(REG_OFFSET_DISPCNT, 0); + RestoreMapTiles(); + for (i = 0; i < 0x200; i += 2) + { + *((vu16 *)(PLTT + 0x000 + i)) = sPals[15]; + *((vu16 *)(PLTT + 0x200 + i)) = sPals[15]; + } + sVideoState.state = 7; + break; + case 7: + if (!gDisableHelpSystemVolumeReduce) + m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100); + RestoreMapTextColors(); + RestoreGPURegs(); + sVideoState.state = 8; + break; + case 8: + RestoreCallbacks(); + sInHelpSystem = 0; + sVideoState.state = 0; + break; + } + return sVideoState.state; +} + +void SaveCallbacks(void) +{ + vu16 * dma; + sVideoState.savedVblankCb = gMain.vblankCallback; + sVideoState.savedHblankCb = gMain.hblankCallback; + gMain.vblankCallback = NULL; + gMain.hblankCallback = NULL; + + dma = (void *)REG_ADDR_DMA0; + dma[5] &= ~(DMA_START_MASK | DMA_DREQ_ON | DMA_REPEAT); + dma[5] &= ~DMA_ENABLE; + dma[5]; +} + +void SaveMapGPURegs(void) +{ + sVideoState.savedDispCnt = GetGpuReg(REG_OFFSET_DISPCNT); + sVideoState.savedBg0Cnt = GetGpuReg(REG_OFFSET_BG0CNT); + sVideoState.savedBg0Hofs = GetGpuReg(REG_OFFSET_BG0HOFS); + sVideoState.savedBg0Vofs = GetGpuReg(REG_OFFSET_BG0VOFS); + sVideoState.savedBldCnt = GetGpuReg(REG_OFFSET_BLDCNT); +} + +void SaveMapTiles(void) +{ + RequestDma3Copy((void *)BG_CHAR_ADDR(3), sMapTilesBackup, BG_CHAR_SIZE, DMA3_16BIT); +} + +void SaveMapTextColors(void) +{ + SaveTextColors( + &sVideoState.savedTextColor[0], + &sVideoState.savedTextColor[1], + &sVideoState.savedTextColor[2] + ); +} + +void RestoreCallbacks(void) +{ + gMain.vblankCallback = sVideoState.savedVblankCb; + gMain.hblankCallback = sVideoState.savedHblankCb; +} + +void RestoreGPURegs(void) +{ + SetGpuReg(REG_OFFSET_BLDCNT, sVideoState.savedBldCnt); + SetGpuReg(REG_OFFSET_BG0HOFS, sVideoState.savedBg0Hofs); + SetGpuReg(REG_OFFSET_BG0VOFS, sVideoState.savedBg0Vofs); + SetGpuReg(REG_OFFSET_BG0CNT, sVideoState.savedBg0Cnt); + SetGpuReg(REG_OFFSET_DISPCNT, sVideoState.savedDispCnt); +} + +void RestoreMapTiles(void) +{ + RequestDma3Copy(sMapTilesBackup, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT); +} + +void RestoreMapTextColors(void) +{ + RestoreTextColors( + &sVideoState.savedTextColor[0], + &sVideoState.savedTextColor[1], + &sVideoState.savedTextColor[2] + ); +} + +void CommitTilemap(void) +{ + RequestDma3Copy(gDecompressionBuffer, (void *)BG_CHAR_ADDR(3), BG_CHAR_SIZE, DMA3_16BIT); +} + +void HS_DrawBgTilemapRect(u16 baseTile, u8 left, u8 top, u8 width, u8 height, u16 increment) +{ + u16 i, j; + + for (i = top; i < top + height; i++) + { + for (j = left; j < left + width; j++) + { + *((u16 *)(gDecompressionBuffer + 0x3800 + 64 * i + 2 * j)) = baseTile; + baseTile += increment; + } + } + + CommitTilemap(); +} + +void HS_BufferFillMapWithTile1FF(void) +{ + HS_DrawBgTilemapRect(0x1FF, 0, 0, 30, 20, 0); +} + +void HS_ShowOrHideWordHELPinTopLeft(u8 mode) +{ + switch (mode) + { + case 0: + HS_DrawBgTilemapRect(0x1FF, 1, 0, 7, 2, 0); + break; + case 1: + HS_DrawBgTilemapRect(0x1E8, 1, 0, 7, 2, 1); + break; + } +} + +void HS_ShowOrHideControlsGuideInTopRight(u8 mode) +{ + switch (mode) + { + case 0: + HS_DrawBgTilemapRect(0x1FF, 13, 0, 16, 2, 0); + break; + case 1: + HS_DrawBgTilemapRect(0x1A0, 13, 0, 16, 2, 1); + break; + } +} + +void HS_ShowOrHideMainWindowText(u8 mode) +{ + switch (mode) + { + case 0: + HS_DrawBgTilemapRect(0x1FF, 2, 3, 26, 16, 0); + break; + case 1: + HS_DrawBgTilemapRect(0x000, 2, 3, 26, 16, 1); + break; + } +} + +void HS_SetMainWindowBgBrightness(u8 mode) +{ + switch (mode) + { + case 0: + // Brighter + HS_DrawBgTilemapRect(0x1FF, 1, 3, 28, 16, 0); + break; + case 1: + // Darker + HS_DrawBgTilemapRect(0x1FA, 1, 3, 28, 17, 0); + break; + } +} + +void HS_ShowOrHideToplevelTooltipWindow(u8 mode) +{ + switch (mode) + { + case 0: + HS_DrawBgTilemapRect(0x1FF, 2, 14, 26, 5, 0); + break; + case 1: + HS_DrawBgTilemapRect(0x11E, 2, 14, 26, 5, 1); + break; + } +} + +void HS_ShowOrHideHeaderAndFooterLines_Lighter(u8 mode) +{ + switch (mode) + { + case 0: + HS_DrawBgTilemapRect(0x1FF, 1, 2, 28, 1, 0); + HS_DrawBgTilemapRect(0x1FF, 1, 19, 28, 1, 0); + break; + case 1: + HS_DrawBgTilemapRect(0x1F7, 1, 2, 28, 1, 0); + HS_DrawBgTilemapRect(0x1F8, 1, 19, 28, 1, 0); + break; + } +} + +void HS_ShowOrHideHeaderAndFooterLines_Darker(u8 mode) +{ + switch (mode) + { + case 0: + HS_DrawBgTilemapRect(0x1FF, 1, 2, 28, 1, 0); + HS_DrawBgTilemapRect(0x1FF, 1, 19, 28, 1, 0); + break; + case 1: + HS_DrawBgTilemapRect(0x1FB, 1, 2, 28, 1, 0); + HS_DrawBgTilemapRect(0x1FC, 1, 19, 28, 1, 0); + break; + } +} + +void HS_ShowOrHideVerticalBlackBarsAlongSides(u8 mode) +{ + switch (mode) + { + case 0: + HS_DrawBgTilemapRect(0x1FF, 0, 0, 1, 20, 0); + HS_DrawBgTilemapRect(0x1FF, 29, 0, 1, 20, 0); + break; + case 1: + HS_DrawBgTilemapRect(0x1F9, 0, 0, 1, 20, 0); + HS_DrawBgTilemapRect(0x1F9, 29, 0, 1, 20, 0); + break; + } +} + +void HS_ShowOrHideHeaderLine_Darker_FooterStyle(u8 mode) +{ + switch (mode) + { + case 0: + HS_DrawBgTilemapRect(0x1FF, 1, 5, 28, 1, 0); + break; + case 1: + HS_DrawBgTilemapRect(0x1FC, 1, 5, 28, 1, 0); + break; + } +} + +void HS_ShowOrHideScrollArrows(u8 which, u8 mode) +{ + switch (mode) + { + case 0: + HS_DrawBgTilemapRect(0x1FF, 28, 3, 1, 1, 0); + HS_DrawBgTilemapRect(0x1FF, 28, 18, 1, 1, 0); + break; + case 1: + if (which == 0) // top + HS_DrawBgTilemapRect(0x1FE, 28, 3, 1, 1, 0); + else // bottom + HS_DrawBgTilemapRect(0x1FD, 28, 18, 1, 1, 0); + break; + } +} + +void HelpSystemRenderText(u8 font, u8 * dest, const u8 * src, u8 x, u8 y, u8 width, u8 height) +{ + // font -> sp+24 + // dest -> sp+28 + // src -> r9 + // x -> sp+34 + // y -> r10 + // width -> sp+2C + // height -> sp+30 + struct Bitmap srcBlit; + struct Bitmap destBlit; + u8 orig_x = x; + u8 i = 0; + s32 clearPixels = 0; + + while (1) + { + u16 curChar = *src; + src++; + switch (curChar) + { + case EOS: + return; + case CHAR_NEWLINE: + x = orig_x; + y += gGlyphInfo.height + 1; + break; + case PLACEHOLDER_BEGIN: + curChar = *src; + src++; + if (curChar == PLACEHOLDER_ID_PLAYER) { + for (i = 0; i < 10; i++) + { + if (gSaveBlock2Ptr->playerName[i] == EOS) + { + break; + } + DecompressAndRenderGlyph(font, gSaveBlock2Ptr->playerName[i], &srcBlit, &destBlit, dest, x, y, width, height); + // This is required to match a dummy [sp+#0x24] read here + if (font == 0) + { + x += gGlyphInfo.width; + } + else + { + x += gGlyphInfo.width + ZERO; + } + } + } + else if (curChar == PLACEHOLDER_ID_STRING_VAR_1) + { + for (i = 0; ; i++) + { + if (FlagGet(FLAG_SYS_NOT_SOMEONES_PC) == TRUE) + { + if (gString_Bill[i] == EOS) + { + break; + } + DecompressAndRenderGlyph(font, gString_Bill[i], &srcBlit, &destBlit, dest, x, y, width, height); + } + else + { + if (gString_Someone[i] == EOS) + { + break; + } + DecompressAndRenderGlyph(font, gString_Someone[i], &srcBlit, &destBlit, dest, x, y, width, height); + } + if (font == 0) + { + x += gGlyphInfo.width; + } + else + { + x += gGlyphInfo.width + ZERO; + } + } + } + break; + case CHAR_PROMPT_SCROLL: + case CHAR_PROMPT_CLEAR: + x = orig_x; + y += gGlyphInfo.height + 1; + break; + case EXT_CTRL_CODE_BEGIN: + curChar = *src; + src++; + switch (curChar) + { + case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW: + src++; + //fallthrough + case EXT_CTRL_CODE_PLAY_BGM: + case EXT_CTRL_CODE_PLAY_SE: + src++; + //fallthrough + case EXT_CTRL_CODE_COLOR: + case EXT_CTRL_CODE_HIGHLIGHT: + case EXT_CTRL_CODE_SHADOW: + case EXT_CTRL_CODE_PALETTE: + case EXT_CTRL_CODE_FONT: + case EXT_CTRL_CODE_PAUSE: + case EXT_CTRL_CODE_ESCAPE: + case EXT_CTRL_CODE_SHIFT_RIGHT: + case EXT_CTRL_CODE_SHIFT_DOWN: + src++; + break; + case EXT_CTRL_CODE_CLEAR_TO: + { +#ifdef NONMATCHING + curChar = *src; + clearPixels = curChar + orig_x - x; +#else // dumb fakematch + s32 r0; + register const u8 * _src asm("r2") = src; + asm("":::"r1"); + r0 = *_src; + r0 += orig_x; + clearPixels = r0 - x; +#endif + if (clearPixels > 0) + { + destBlit.pixels = dest; + destBlit.width = width * 8; + destBlit.height = height * 8; + FillBitmapRect4Bit(&destBlit, x, y, clearPixels, GetFontAttribute(font, FONTATTR_MAX_LETTER_HEIGHT), + 0); + x += clearPixels; + } + src++; + break; + } + case EXT_CTRL_CODE_CLEAR: + case EXT_CTRL_CODE_SKIP: + case EXT_CTRL_CODE_MIN_LETTER_SPACING: + src++; + break; + case EXT_CTRL_CODE_RESET_FONT: + case EXT_CTRL_CODE_WAIT_BUTTON: + case EXT_CTRL_CODE_WAIT_SE: + case EXT_CTRL_CODE_FILL_WINDOW: + break; + case EXT_CTRL_CODE_JPN: + case EXT_CTRL_CODE_ENG: + break; + } + break; + case CHAR_KEYPAD_ICON: + curChar = *src; + src++; + srcBlit.pixels = (u8 *)gKeypadIconTiles + 0x20 * GetKeypadIconTileOffset(curChar); + srcBlit.width = 0x80; + srcBlit.height = 0x80; + destBlit.pixels = dest; + destBlit.width = width * 8; + destBlit.height = height * 8; + BlitBitmapRect4Bit(&srcBlit, &destBlit, 0, 0, x, y, GetKeypadIconWidth(curChar), GetKeypadIconHeight(curChar), 0); + x += GetKeypadIconWidth(curChar); + break; + case CHAR_EXTRA_EMOJI: + curChar = *src + 0x100; + src++; + //fallthrough + default: + if (curChar == CHAR_SPACE) + { + if (font == 0) + { + x += 5; + } + else + { + x += 4; + } + } + else + { + DecompressAndRenderGlyph(font, curChar, &srcBlit, &destBlit, dest, x, y, width, height); + if (font == 0) + { + x += gGlyphInfo.width; + } + else + { + x += gGlyphInfo.width + ZERO; + } + } + break; + } + } +} + +void DecompressAndRenderGlyph(u8 font, u16 glyph, struct Bitmap *srcBlit, struct Bitmap *destBlit, u8 *destBuffer, u8 x, u8 y, u8 width, u8 height) +{ + if (font == 0) + DecompressGlyphFont0(glyph, FALSE); + else if (font == 5) + DecompressGlyphFont5(glyph, FALSE); + else + DecompressGlyphFont2(glyph, FALSE); + srcBlit->pixels = gGlyphInfo.pixels; + srcBlit->width = 16; + srcBlit->height = 16; + destBlit->pixels = destBuffer; + destBlit->width = width * 8; + destBlit->height = height * 8; + BlitBitmapRect4Bit(srcBlit, destBlit, 0, 0, x, y, gGlyphInfo.width, gGlyphInfo.height, 0); +} + +void HelpSystem_PrintTextInTopLeftCorner(const u8 * str) +{ + GenerateFontHalfRowLookupTable(1, 15, 2); + HelpSystemRenderText(5, gDecompressionBuffer + 0x3D00, str, 6, 2, 7, 2); +} + +void HelpSystem_PrintTextRightAlign_Row52(const u8 * str) +{ + s32 left = 0x7C - GetStringWidth(0, str, 0); + GenerateFontHalfRowLookupTable(1, 15, 2); + HelpSystemRenderText(0, gDecompressionBuffer + 0x3400, str, left, 2, 16, 2); +} + +void HelpSystem_PrintTextAt(const u8 * str, u8 x, u8 y) +{ + GenerateFontHalfRowLookupTable(1, 15, 2); + HelpSystemRenderText(2, gDecompressionBuffer + 0x0000, str, x, y, 26, 16); +} + +void HelpSystem_PrintQuestionAndAnswerPair(const u8 * question, const u8 * answer) +{ + CpuFill16(0xEEEE, gDecompressionBuffer + 0x0000, 0x3400); + GenerateFontHalfRowLookupTable(1, 14, 2); + HelpSystemRenderText(2, gDecompressionBuffer + 0x0000, question, 0, 0, 26, 16); + HelpSystemRenderText(2, gDecompressionBuffer + 0x09C0, answer, 0, 0, 26, 13); +} + +void HelpSystem_PrintTopicMouseoverDescription(const u8 * str) +{ + CpuFill16(0x1111, gDecompressionBuffer + 0x23C0, 0x1040); + GenerateFontHalfRowLookupTable(2, 1, 3); + HelpSystemRenderText(2, gDecompressionBuffer + 0x23C0, str, 2, 6, 26, 5); +} + +void HelpSystem_FillPanel3(void) +{ + CpuFill16(0xFFFF, gDecompressionBuffer + 0x3D00, 0x1C0); +} + +void HelpSystem_FillPanel2(void) +{ + CpuFill16(0xFFFF, gDecompressionBuffer + 0x3400, 0x400); +} + +void HelpSystem_FillPanel1(void) +{ + CpuFill16(0xFFFF, gDecompressionBuffer + 0x0000, 0x3400); +} + +void HelpSystem_InitListMenuController(struct HelpSystemListMenu * a0, u8 a1, u8 a2) +{ + gHelpSystemListMenu.sub = a0->sub; + gHelpSystemListMenu.itemsAbove = a1; + gHelpSystemListMenu.cursorPos = a2; + gHelpSystemListMenu.state = 0; + if (gHelpSystemListMenu.sub.totalItems < gHelpSystemListMenu.sub.maxShowed) + gHelpSystemListMenu.sub.maxShowed = gHelpSystemListMenu.sub.totalItems; + HS_ShowOrHideMainWindowText(0); + HelpSystem_FillPanel1(); + PrintListMenuItems(); + PlaceListMenuCursor(); +} + +void HelpSystem_SetInputDelay(u8 a0) +{ + sDelayTimer = a0; +} + +s32 HelpSystem_GetMenuInput(void) +{ + if (sDelayTimer != 0) + { + sDelayTimer--; + return -1; + } + else if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos].index; + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + return -2; + } + else if (JOY_NEW(L_BUTTON | R_BUTTON)) + { + return -6; + } + else if (JOY_REPT(DPAD_UP)) + { + if (!MoveCursor(1, 0)) + PlaySE(SE_SELECT); + return -4; + } + else if (JOY_REPT(DPAD_DOWN)) + { + if (!MoveCursor(1, 1)) + PlaySE(SE_SELECT); + return -5; + } + else if (JOY_REPT(DPAD_LEFT)) + { + if (!MoveCursor(7, 0)) + PlaySE(SE_SELECT); + return -4; + } + else if (JOY_REPT(DPAD_RIGHT)) + { + if (!MoveCursor(7, 1)) + PlaySE(SE_SELECT); + return -5; + } + else + return -1; +} + +void HS_UpdateMenuScrollArrows(void) +{ + u8 topItemIdx = gHelpSystemListMenu.sub.totalItems - 7; + if (gHelpSystemListMenu.sub.totalItems > 7) + { + s32 cursorPos = gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos; + HS_ShowOrHideScrollArrows(0, 0); // Hide both + if (cursorPos == 0) + HS_ShowOrHideScrollArrows(1, 1); // Show bottom + else if (gHelpSystemListMenu.itemsAbove == 0 && gHelpSystemListMenu.cursorPos != 0) + HS_ShowOrHideScrollArrows(1, 1); // Show bottom + else if (gHelpSystemListMenu.itemsAbove == topItemIdx) + HS_ShowOrHideScrollArrows(0, 1); // Show top + else if (gHelpSystemListMenu.itemsAbove != 0) + { + // Show both + HS_ShowOrHideScrollArrows(0, 1); + HS_ShowOrHideScrollArrows(1, 1); + } + } +} + +void PrintListMenuItems(void) +{ + u8 glyphHeight = GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 1; + s32 i; + s32 r5 = gHelpSystemListMenu.itemsAbove; + + for (i = 0; i < gHelpSystemListMenu.sub.maxShowed; i++) + { + u8 x = gHelpSystemListMenu.sub.left + 8; + u8 y = gHelpSystemListMenu.sub.top + glyphHeight * i; + HelpSystem_PrintTextAt(gHelpSystemListMenu.sub.items[r5].label, x, y); + r5++; + } +} + +void PlaceListMenuCursor(void) +{ + u8 glyphHeight = GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 1; + u8 x = gHelpSystemListMenu.sub.left; + u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.cursorPos; + HelpSystem_PrintTextAt(gText_SelectorArrow2, x, y); +} + +void HS_RemoveSelectionCursorAt(u8 i) +{ + u8 glyphHeight = GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 1; + u8 x = gHelpSystemListMenu.sub.left; + u8 y = gHelpSystemListMenu.sub.top + i * glyphHeight; + HelpSystem_PrintTextAt(gString_HelpSystem_ClearTo8, x, y); +} + +u8 TryMoveCursor1(u8 dirn) +{ + u16 midPoint; + if (dirn == 0) + { + if (gHelpSystemListMenu.sub.maxShowed == 1) + midPoint = 0; + else + midPoint = gHelpSystemListMenu.sub.maxShowed - (gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1)) - 1; + if (gHelpSystemListMenu.itemsAbove == 0) + { + if (gHelpSystemListMenu.cursorPos != 0) + { + gHelpSystemListMenu.cursorPos--; + return 1; + } + else + return 0; + } + if (gHelpSystemListMenu.cursorPos > midPoint) + { + gHelpSystemListMenu.cursorPos--; + return 1; + } + else + { + gHelpSystemListMenu.itemsAbove--; + return 2; + } + } + else + { + if (gHelpSystemListMenu.sub.maxShowed == 1) + midPoint = 0; + else + midPoint = gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1); + if (gHelpSystemListMenu.itemsAbove == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed) + { + if (gHelpSystemListMenu.cursorPos < gHelpSystemListMenu.sub.maxShowed - 1) + { + gHelpSystemListMenu.cursorPos++; + return 1; + } + else + return 0; + } + else if (gHelpSystemListMenu.cursorPos < midPoint) + { + gHelpSystemListMenu.cursorPos++; + return 1; + } + else + { + gHelpSystemListMenu.itemsAbove++; + return 2; + } + } +} + +bool8 MoveCursor(u8 by, u8 dirn) +{ + u8 r7 = gHelpSystemListMenu.cursorPos; + u8 flags = 0; + s32 i; + for (i = 0; i < by; i++) + flags |= TryMoveCursor1(dirn); + + switch (flags) + { + case 0: + default: + // neither changed + return TRUE; + case 1: + // changed cursorPos only + HS_RemoveSelectionCursorAt(r7); + PlaceListMenuCursor(); + CommitTilemap(); + break; + case 2: + case 3: + // changed itemsAbove + if (GetHelpSystemMenuLevel() == 1) + { + HelpSystem_SetInputDelay(2); + HelpSystem_FillPanel1(); + PrintListMenuItems(); + PlaceListMenuCursor(); + HelpSystem_PrintTopicLabel(); + HS_UpdateMenuScrollArrows(); + } + else + { + HS_ShowOrHideMainWindowText(0); + HelpSystem_FillPanel1(); + PrintListMenuItems(); + PlaceListMenuCursor(); + HS_ShowOrHideMainWindowText(1); + } + CommitTilemap(); + break; + } + return FALSE; +} @@ -533,7 +533,7 @@ static void sub_80AF108(struct Sprite *sprite) sprite->data[2] = gBattleAnimArgs[2] + targetX; sprite->data[3] = gBattleAnimArgs[1] + attackerY; sprite->data[4] = gBattleAnimArgs[3] + targetY; - sub_8074C80(sprite); + SetupLinearTranslationWithFixedDuration(sprite); // won't match with while loop for (; (targetX >= -32 && targetX <= 272) && (targetY >= -32 && targetY <= 192); targetX += sprite->data[1], targetY += sprite->data[2]) ; @@ -548,7 +548,7 @@ static void sub_80AF108(struct Sprite *sprite) sprite->data[2] = targetX; sprite->data[3] = attackerY; sprite->data[4] = targetY; - sub_8074C80(sprite); + SetupLinearTranslationWithFixedDuration(sprite); sprite->data[3] = gBattleAnimArgs[5]; sprite->data[4] = gBattleAnimArgs[6]; sprite->callback = sub_80AF28C; @@ -686,7 +686,7 @@ static void AnimSwirlingSnowball_Step1(struct Sprite *sprite) sprite->pos2.x = sprite->pos2.y = 0; for (i = 0; i < 8; ++i) sprite->data[i] = tempDataHolder[i]; - sprite->callback = sub_8075830; + sprite->callback = InitAndStartAnimFastLinearTranslationWithSpeed; StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step2); } @@ -944,7 +944,7 @@ void AnimTask_Haze1(u8 taskId) GetBattleAnimBg1Data(&animBg); LoadBgTiles(animBg.bgId, gWeatherFogHorizontalTiles, 0x800, animBg.tilesOffset); AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimFogTilemap); - LoadPalette(&gUnknown_83C2CE0, animBg.paletteId * 16, 32); + LoadPalette(&gDefaultWeatherSpritePalette, animBg.paletteId * 16, 32); if (IsContest()) sub_80730C0(animBg.paletteId, animBg.bgTilemap, 0, 0); gTasks[taskId].func = AnimTask_Haze2; @@ -1042,7 +1042,7 @@ void AnimTask_LoadMistTiles(u8 taskId) GetBattleAnimBg1Data(&animBg); LoadBgTiles(animBg.bgId, gWeatherFogHorizontalTiles, 0x800, animBg.tilesOffset); AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimFogTilemap); - LoadPalette(&gUnknown_83C2CE0, animBg.paletteId * 16, 32); + LoadPalette(&gDefaultWeatherSpritePalette, animBg.paletteId * 16, 32); if (IsContest()) sub_80730C0(animBg.paletteId, animBg.bgTilemap, 0, 0); gTasks[taskId].data[15] = -1; diff --git a/src/link.c b/src/link.c index 4a0f8561f..d9de614ea 100644 --- a/src/link.c +++ b/src/link.c @@ -1369,7 +1369,7 @@ static void LinkCB_WaitAckCommand5FFF(void) } if (count == linkPlayerCount) { - gBattleTypeFlags &= ~(BATTLE_TYPE_20 | 0xFFFF0000); + gBattleTypeFlags &= ~(BATTLE_TYPE_LINK_ESTABLISHED | 0xFFFF0000); gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index 31e76dfd0..cf23098d7 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -1325,7 +1325,7 @@ static void RfuFunc_WaitAck5F00(void) } if (count == playerCount) { - gBattleTypeFlags &= ~(BATTLE_TYPE_20 | 0xFFFF0000); + gBattleTypeFlags &= ~(BATTLE_TYPE_LINK_ESTABLISHED | 0xFFFF0000); if (Rfu.parent_child == MODE_CHILD) { Rfu.errorState = 3; diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 4539c884b..4728ca05c 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -850,7 +850,7 @@ bool8 MetatileBehavior_IsStrengthButton(u8 metatileBehavior) return FALSE; } -bool8 MetatileBehavior_IsPlayerFacingMB_8D(u8 tile, u8 playerDirection) +bool8 MetatileBehavior_IsPlayerFacingCableClubWirelessMonitor(u8 tile, u8 playerDirection) { if(playerDirection != DIR_NORTH) return FALSE; @@ -986,8 +986,8 @@ bool8 MetatileBehavior_IsCup(u8 metatileBehavior) return FALSE; } -bool8 MetatileBehavior_ReturnFalse_19(u8 metatileBehavior) { return FALSE; } -bool8 MetatileBehavior_ReturnFalse_20(u8 metatileBehavior) { return FALSE; } +bool8 MetatileBehavior_IsPolishedWindow(u8 metatileBehavior) { return FALSE; } +bool8 MetatileBehavior_IsBeautifulSkyWindow(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_IsBlinkingLights(u8 metatileBehavior) { @@ -997,9 +997,9 @@ bool8 MetatileBehavior_IsBlinkingLights(u8 metatileBehavior) return FALSE; } -bool8 MetatileBehavior_IsMB9F(u8 metatileBehavior) +bool8 MetatileBehavior_IsNeatlyLinedUpTools(u8 metatileBehavior) { - if(metatileBehavior == MB_9F) + if(metatileBehavior == MB_NEATLY_LINED_UP_TOOLS) return TRUE; else return FALSE; @@ -1029,9 +1029,9 @@ bool8 MetatileBehavior_IsBurglary(u8 metatileBehavior) return FALSE; } -bool8 MetatileBehavior_IsMBA3(u8 metatileBehavior) +bool8 MetatileBehavior_IsTrainerTowerMonitor(u8 metatileBehavior) { - if(metatileBehavior == MB_A3) + if(metatileBehavior == MB_TRAINER_TOWER_MONITOR) return TRUE; else return FALSE; diff --git a/src/mevent_show_card.c b/src/mevent_show_card.c index f6687eab7..86864dc4a 100644 --- a/src/mevent_show_card.c +++ b/src/mevent_show_card.c @@ -317,7 +317,7 @@ static void sub_8145A98(void) } for (i = 0, r6 = 0; i < 40; i++) { - if (sMEventScreenData->wonderCard.unk_122[i] != CHAR_SPECIAL_F7) + if (sMEventScreenData->wonderCard.unk_122[i] != CHAR_DYNAMIC_PLACEHOLDER) { sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].nameTxt[r6] = sMEventScreenData->wonderCard.unk_122[i]; r6++; diff --git a/src/new_game.c b/src/new_game.c index 30508cd9a..f96dca32e 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -138,7 +138,7 @@ void NewGameInitData(void) gSaveBlock1Ptr->registeredItem = 0; ClearBag(); NewGameInitPCItems(); - sub_809C794(); + ClearEnigmaBerries(); InitEasyChatPhrases(); ResetTrainerFanClub(); UnionRoomChat_InitializeRegisteredTexts(); diff --git a/src/oak_speech.c b/src/oak_speech.c index 35864576f..96ba0adee 100644 --- a/src/oak_speech.c +++ b/src/oak_speech.c @@ -704,7 +704,7 @@ static void Task_OakSpeech5(u8 taskId) } FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 18); CopyBgTilemapBufferToVram(1); - sub_8006398(gTasks[taskId].data[5]); + DestroyTextCursorSprite(gTasks[taskId].data[5]); sOakSpeechResources->unk_0014[0] = RGB_BLACK; LoadPalette(sOakSpeechResources->unk_0014, 0, 2); gTasks[taskId].data[3] = 32; @@ -822,7 +822,7 @@ static void Task_OakSpeech7(u8 taskId) } break; case 4: - sub_8006398(gTasks[taskId].data[5]); + DestroyTextCursorSprite(gTasks[taskId].data[5]); PlayBGM(MUS_NEW_GAME_EXIT); data[15] = 24; gMain.state++; diff --git a/src/overworld.c b/src/overworld.c index e3e8fb885..10a700e1f 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -292,8 +292,8 @@ void Overworld_ResetStateAfterFly(void) VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0); FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_FLASH_ACTIVE); - FlagClear(FLAG_0x808); - VarSet(VAR_0x404D, 0); + FlagClear(FLAG_SYS_QL_DEPARTED); + VarSet(VAR_QL_ENTRANCE, 0); } void Overworld_ResetStateAfterTeleport(void) @@ -306,8 +306,8 @@ void Overworld_ResetStateAfterTeleport(void) VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0); FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_FLASH_ACTIVE); - FlagClear(FLAG_0x808); - VarSet(VAR_0x404D, 0); + FlagClear(FLAG_SYS_QL_DEPARTED); + VarSet(VAR_QL_ENTRANCE, 0); } void Overworld_ResetStateAfterDigEscRope(void) @@ -320,8 +320,8 @@ void Overworld_ResetStateAfterDigEscRope(void) VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0); FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_FLASH_ACTIVE); - FlagClear(FLAG_0x808); - VarSet(VAR_0x404D, 0); + FlagClear(FLAG_SYS_QL_DEPARTED); + VarSet(VAR_QL_ENTRANCE, 0); } static void Overworld_ResetStateAfterWhitingOut(void) @@ -334,8 +334,8 @@ static void Overworld_ResetStateAfterWhitingOut(void) VarSet(VAR_MAP_SCENE_FUCHSIA_CITY_SAFARI_ZONE_ENTRANCE, 0); FlagClear(FLAG_SYS_USE_STRENGTH); FlagClear(FLAG_SYS_FLASH_ACTIVE); - FlagClear(FLAG_0x808); - VarSet(VAR_0x404D, 0); + FlagClear(FLAG_SYS_QL_DEPARTED); + VarSet(VAR_QL_ENTRANCE, 0); } static void Overworld_ResetStateOnContinue(void) @@ -1393,7 +1393,7 @@ static void DoCB1_Overworld(u16 newKeys, u16 heldKeys) struct FieldInput fieldInput; sub_8112B3C(); - sub_805BEB8(); + UpdatePlayerAvatarTransitionState(); FieldClearPlayerInput(&fieldInput); FieldGetPlayerInput(&fieldInput, newKeys, heldKeys); FieldInput_HandleCancelSignpost(&fieldInput); @@ -1419,7 +1419,7 @@ static void DoCB1_Overworld_QuestLogPlayback(void) struct FieldInput fieldInput; sub_8112B3C(); - sub_805BEB8(); + UpdatePlayerAvatarTransitionState(); sub_8111C68(); FieldClearPlayerInput(&fieldInput); fieldInput = gQuestLogFieldInput; @@ -1848,7 +1848,7 @@ static bool32 load_map_stuff(u8 *state, bool32 a1) (*state)++; break; case 1: - sub_8111F14(); + QuestLog_InitPalettesBackup(); (*state)++; break; case 2: @@ -1865,8 +1865,8 @@ static bool32 load_map_stuff(u8 *state, bool32 a1) sub_8057114(); if (gQuestLogState != QL_STATE_PLAYBACK) { - sub_80CC534(); - sub_80CC59C(); + QuestLog_CheckDepartingIndoorsMap(); + QuestLog_TryRecordDepartedLocation(); } SetHelpContextForMap(); (*state)++; @@ -1931,7 +1931,7 @@ static bool32 sub_8056CD8(u8 *state) { case 0: InitOverworldBgs(); - sub_8111F14(); + QuestLog_InitPalettesBackup(); sub_8057024(FALSE); sub_8057100(); sub_8057114(); @@ -1965,7 +1965,7 @@ static bool32 map_loading_iteration_2_link(u8 *state) (*state)++; break; case 1: - sub_8111F14(); + QuestLog_InitPalettesBackup(); sub_8057024(1); (*state)++; break; @@ -2203,7 +2203,7 @@ static void CreateLinkPlayerSprites(void) void CB2_SetUpOverworldForQLPlaybackWithWarpExit(void) { FieldClearVBlankHBlankCallbacks(); - gUnknown_2036E28 = 1; + gGlobalFieldTintMode = QL_TINT_GRAYSCALE; ScriptContext1_Init(); ScriptContext2_Disable(); SetMainCallback1(NULL); @@ -2214,7 +2214,7 @@ void CB2_SetUpOverworldForQLPlaybackWithWarpExit(void) void CB2_SetUpOverworldForQLPlayback(void) { FieldClearVBlankHBlankCallbacks(); - gUnknown_2036E28 = 1; + gGlobalFieldTintMode = QL_TINT_GRAYSCALE; LoadSaveblockMapHeader(); ScriptContext1_Init(); ScriptContext2_Disable(); @@ -2243,7 +2243,7 @@ static bool32 LoadMap_QLPlayback(u8 *state) case 0: InitOverworldBgs(); FieldClearVBlankHBlankCallbacks(); - sub_8111F14(); + QuestLog_InitPalettesBackup(); sub_81113E4(); sub_8111438(); if (GetQuestLogStartType() == QL_START_WARP) @@ -2316,7 +2316,7 @@ void CB2_EnterFieldFromQuestLog(void) { FieldClearVBlankHBlankCallbacks(); StopMapMusic(); - gUnknown_2036E28 = 3; + gGlobalFieldTintMode = QL_TINT_BACKUP_GRAYSCALE; ResetSafariZoneFlag_(); LoadSaveblockMapHeader(); LoadSaveblockObjEventScripts(); @@ -2367,10 +2367,10 @@ static bool8 FieldCB2_Credits_WaitFade(void) return FALSE; } -bool32 Overworld_DoScrollSceneForCredits(u8 *state_p, const struct CreditsOverworldCmd * script, u8 a2) +bool32 Overworld_DoScrollSceneForCredits(u8 *state_p, const struct CreditsOverworldCmd * script, u8 tintMode) { sCreditsOverworld_Script = script; - gUnknown_2036E28 = a2; + gGlobalFieldTintMode = tintMode; return SetUpScrollSceneForCredits(state_p, 0); } diff --git a/src/party_menu.c b/src/party_menu.c index 1acbc04ea..8dcc1d450 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -4315,7 +4315,7 @@ static void sub_8124E48(void) && PSA_IsCancelDisabled() == TRUE) { GiveMoveToMon(&gPlayerParty[gPartyMenu.slotId], ItemIdToBattleMoveId(gSpecialVar_ItemId)); - AdjustFriendship(&gPlayerParty[gPartyMenu.slotId], 4); + AdjustFriendship(&gPlayerParty[gPartyMenu.slotId], FRIENDSHIP_EVENT_LEARN_TMHM); if (gSpecialVar_ItemId <= ITEM_TM50) RemoveBagItem(gSpecialVar_ItemId, 1); SetMainCallback2(gPartyMenu.exitCallback); @@ -4336,7 +4336,7 @@ static void sub_8124EFC(void) RemoveMonPPBonus(mon, moveIdx); SetMonMoveSlot(mon, ItemIdToBattleMoveId(gSpecialVar_ItemId), moveIdx); - AdjustFriendship(mon, 4); + AdjustFriendship(mon, FRIENDSHIP_EVENT_LEARN_TMHM); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, mon, gSpecialVar_ItemId, move); if (gSpecialVar_ItemId <= ITEM_TM50) RemoveBagItem(gSpecialVar_ItemId, 1); @@ -4837,7 +4837,7 @@ static void Task_LearnedMove(u8 taskId) if (move[1] == 0) { - AdjustFriendship(mon, 4); + AdjustFriendship(mon, FRIENDSHIP_EVENT_LEARN_TMHM); if (item < ITEM_HM01_CUT) RemoveBagItem(item, 1); } diff --git a/src/pokedex_screen.c b/src/pokedex_screen.c index b3f3d18ad..3c05010ae 100644 --- a/src/pokedex_screen.c +++ b/src/pokedex_screen.c @@ -868,7 +868,7 @@ void sub_810250C(void) gUnknown_203ACF0->field_6C = sub_8104BBC(1, 1); gUnknown_203ACF0->field_66 = sub_8104BBC(0, 0); gUnknown_203ACF0->field_68 = sub_8104BBC(1, 0); - sub_8072474(0x80); + SetBGMVolume_SuppressHelpSystemReduction(0x80); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); @@ -925,7 +925,7 @@ bool8 sub_8102798(void) FREE_IF_NOT_NULL(GetBgTilemapBuffer(1)); FREE_IF_NOT_NULL(GetBgTilemapBuffer(2)); FREE_IF_NOT_NULL(GetBgTilemapBuffer(3)); - sub_807249C(); + BGMVolumeMax_EnableHelpSystemReduction(); break; } return TRUE; diff --git a/src/pokemon.c b/src/pokemon.c index f8c03ea02..563073237 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1594,16 +1594,16 @@ static const u8 sStatsToRaise[] = static const s8 sFriendshipEventDeltas[][3] = { - { 5, 3, 2 }, - { 5, 3, 2 }, - { 1, 1, 0 }, - { 3, 2, 1 }, - { 1, 1, 0 }, - { 1, 1, 1 }, - { 3, 3, 3 }, - {-1, -1, -1 }, - {-5, -5, -10 }, - {-5, -5, -10 }, + [FRIENDSHIP_EVENT_GROW_LEVEL] = { 5, 3, 2 }, + [FRIENDSHIP_EVENT_VITAMIN] = { 5, 3, 2 }, + [FRIENDSHIP_EVENT_BATTLE_ITEM] = { 1, 1, 0 }, + [FRIENDSHIP_EVENT_LEAGUE_BATTLE] = { 3, 2, 1 }, + [FRIENDSHIP_EVENT_LEARN_TMHM] = { 1, 1, 0 }, + [FRIENDSHIP_EVENT_WALKING] = { 1, 1, 1 }, + [FRIENDSHIP_EVENT_MASSAGE] = { 3, 3, 3 }, + [FRIENDSHIP_EVENT_FAINT_SMALL] = {-1, -1, -1 }, + [FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE] = {-5, -5, -10 }, + [FRIENDSHIP_EVENT_FAINT_LARGE] = {-5, -5, -10 }, }; static const u16 sHMMoves[] = @@ -1622,7 +1622,7 @@ static const u16 sDeoxysBaseStats[] = 180, // Sp.Attack 20, // Sp.Defense }; -#elif defined LEAFGREEN +#elif defined(LEAFGREEN) static const u16 sDeoxysBaseStats[] = { 50, // Hp @@ -4410,7 +4410,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov static bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId) { - u32 status = GetMonData(mon, MON_DATA_STATUS, 0); + u32 status = GetMonData(mon, MON_DATA_STATUS, NULL); if (status & healMask) { @@ -4874,7 +4874,7 @@ const u8 *Battle_PrintStatBoosterEffectMessage(u16 itemId) u8 GetNature(struct Pokemon *mon) { - return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25; + return GetMonData(mon, MON_DATA_PERSONALITY, NULL) % 25; } static u8 GetNatureFromPersonality(u32 personality) @@ -4886,12 +4886,12 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) { int i; u16 targetSpecies = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); u8 level; u16 friendship; - u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); + u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, NULL); u16 upperPersonality = personality >> 16; u8 holdEffect; @@ -4906,8 +4906,8 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) switch (type) { case EVO_MODE_NORMAL: - level = GetMonData(mon, MON_DATA_LEVEL, 0); - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + level = GetMonData(mon, MON_DATA_LEVEL, NULL); + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); for (i = 0; i < 5; i++) { @@ -4938,17 +4938,17 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) break; case EVO_LEVEL_ATK_GT_DEF: if (gEvolutionTable[species][i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0)) + if (GetMonData(mon, MON_DATA_ATK, NULL) > GetMonData(mon, MON_DATA_DEF, NULL)) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_ATK_EQ_DEF: if (gEvolutionTable[species][i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0)) + if (GetMonData(mon, MON_DATA_ATK, NULL) == GetMonData(mon, MON_DATA_DEF, NULL)) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_ATK_LT_DEF: if (gEvolutionTable[species][i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0)) + if (GetMonData(mon, MON_DATA_ATK, NULL) < GetMonData(mon, MON_DATA_DEF, NULL)) targetSpecies = gEvolutionTable[species][i].targetSpecies; break; case EVO_LEVEL_SILCOON: @@ -5237,15 +5237,10 @@ static u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex) return n; } -// TODO: Move these to constants/trainers.h -#define TRAINER_CLASS_ELITE_FOUR 0x54 -#define TRAINER_CLASS_LEADER 0x57 -#define TRAINER_CLASS_CHAMPION 0x5A - void AdjustFriendship(struct Pokemon *mon, u8 event) { - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES2, NULL); + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); u8 holdEffect; if (heldItem == ITEM_ENIGMA_BERRY) @@ -5262,40 +5257,56 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) if (species && species != SPECIES_EGG) { + s8 delta; + // Friendship level refers to the column in sFriendshipEventDeltas. + // 0-99: Level 0 (maximum increase, typically) + // 100-199: Level 1 + // 200-255: Level 2 u8 friendshipLevel = 0; - s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - if (friendship > 99) + s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); + if (friendship >= 100) friendshipLevel++; - if (friendship > 199) + if (friendship >= 200) friendshipLevel++; - if ((event != FRIENDSHIP_EVENT_WALKING || !(Random() & 1)) - && (event != FRIENDSHIP_EVENT_LEAGUE_BATTLE - || ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) - && (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR - || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER - || gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION)))) + if (event == FRIENDSHIP_EVENT_WALKING) { - s8 delta = sFriendshipEventDeltas[event][friendshipLevel]; - if (delta > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - delta = (150 * delta) / 100; - - friendship += delta; - if (delta > 0) - { - if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL) - friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == GetCurrentRegionMapSectionId()) - friendship++; - } + // 50% chance every 128 steps + if (Random() & 1) + return; + } + if (event == FRIENDSHIP_EVENT_LEAGUE_BATTLE) + { + // Only if it's a trainer battle with league progression significance + if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) + return; + if (!(gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_LEADER_2 + || gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_ELITE_FOUR_2 + || gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_CHAMPION_2)) + return; + } - if (friendship < 0) - friendship = 0; - if (friendship > 255) - friendship = 255; + delta = sFriendshipEventDeltas[event][friendshipLevel]; + if (delta > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + // 50% increase, rounding down + delta = (150 * delta) / 100; - SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); + friendship += delta; + if (delta > 0) + { + if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) + friendship++; + if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) + friendship++; } + + // Clamp to u8 + if (friendship < 0) + friendship = 0; + if (friendship > 255) + friendship = 255; + + SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); } } @@ -5310,7 +5321,7 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) for (i = 0; i < NUM_STATS; i++) { - evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, 0); + evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, NULL); totalEVs += evs[i]; } @@ -5351,7 +5362,7 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) break; } - heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); if (heldItem == ITEM_ENIGMA_BERRY) { @@ -5390,7 +5401,7 @@ u16 GetMonEVCount(struct Pokemon *mon) u16 count = 0; for (i = 0; i < NUM_STATS; i++) - count += GetMonData(mon, MON_DATA_HP_EV + i, 0); + count += GetMonData(mon, MON_DATA_HP_EV + i, NULL); return count; } @@ -5417,7 +5428,7 @@ u8 CheckPartyPokerus(struct Pokemon *party, u8 selection) { do { - if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0) & 0xF)) + if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, NULL) & 0xF)) retVal |= curBit; partyIndex++; curBit <<= 1; @@ -5425,7 +5436,7 @@ u8 CheckPartyPokerus(struct Pokemon *party, u8 selection) } while (selection); } - else if (GetMonData(&party[0], MON_DATA_POKERUS, 0) & 0xF) + else if (GetMonData(&party[0], MON_DATA_POKERUS, NULL) & 0xF) { retVal = 1; } @@ -5445,7 +5456,7 @@ u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection) { do { - if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0)) + if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, NULL)) retVal |= curBit; partyIndex++; curBit <<= 1; @@ -5453,7 +5464,7 @@ u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection) } while (selection); } - else if (GetMonData(&party[0], MON_DATA_POKERUS, 0)) + else if (GetMonData(&party[0], MON_DATA_POKERUS, NULL)) { retVal = 1; } @@ -5511,7 +5522,7 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon) u32 CanMonLearnTMHM(struct Pokemon *mon, u8 tm) { - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES2, NULL); if (species == SPECIES_EGG) { return 0; @@ -5532,12 +5543,12 @@ u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) { u16 learnedMoves[4]; u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); int i, j, k; for (i = 0; i < 4; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); for (i = 0; i < 20; i++) { @@ -5583,15 +5594,15 @@ u8 GetNumberOfRelearnableMoves(struct Pokemon *mon) u16 learnedMoves[4]; u16 moves[20]; u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES2, NULL); + u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); int i, j, k; if (species == SPECIES_EGG) return 0; for (i = 0; i < 4; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); for (i = 0; i < 20; i++) { @@ -5685,9 +5696,9 @@ void PlayMapChosenOrBattleBGM(u16 songId) const u32 *GetMonFrontSpritePal(struct Pokemon *mon) { - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES2, NULL); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); return GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality); } @@ -5707,9 +5718,9 @@ const u32 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 p const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon) { - u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); - u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + u16 species = GetMonData(mon, MON_DATA_SPECIES2, NULL); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); return GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); } @@ -5757,7 +5768,7 @@ bool8 IsTradedMon(struct Pokemon *mon) u8 otName[PLAYER_NAME_LENGTH]; u32 otId; GetMonData(mon, MON_DATA_OT_NAME, otName); - otId = GetMonData(mon, MON_DATA_OT_ID, 0); + otId = GetMonData(mon, MON_DATA_OT_ID, NULL); return IsOtherTrainer(otId, otName); } @@ -5824,7 +5835,7 @@ void SetWildMonHeldItem(void) if (!(gBattleTypeFlags & (BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER))) { u16 rnd = Random() % 100; - u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0); + u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL); if (gBaseStats[species].item1 == gBaseStats[species].item2) { SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); @@ -5843,8 +5854,8 @@ void SetWildMonHeldItem(void) bool8 IsMonShiny(struct Pokemon *mon) { - u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); + u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); return IsShinyOtIdPersonality(otId, personality); } @@ -5893,7 +5904,7 @@ bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) case 0: default: return FALSE; - case 1: + case DEOXYS_CHECK_BATTLE_SPRITE: if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) return FALSE; if (!gMain.inBattle) @@ -5903,7 +5914,7 @@ bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) break; case 2: break; - case 3: + case DEOXYS_CHECK_TRADE_MAIN: if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) return FALSE; if (!gMain.inBattle) @@ -5913,7 +5924,7 @@ bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) return FALSE; case 4: break; - case 5: + case DEOXYS_CHECK_BATTLE_ANIM: if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if (!gMain.inBattle) @@ -5948,7 +5959,7 @@ static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId) u16 statValue; u8 nature; - if (gBattleTypeFlags & BATTLE_TYPE_20 || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS) + if (gBattleTypeFlags & BATTLE_TYPE_LINK_ESTABLISHED || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS) { return statValue = 0; } diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index b2ff1209b..0d10e9948 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -3996,16 +3996,16 @@ static void sub_813995C(void) if (sMonSummaryScreen->savedCallback == CB2_ReturnToTradeMenuFromSummary) { if (sMonSummaryScreen->isEnemyParty == TRUE) - spriteId = CreateMonPicSprite(species, trainerId, personality, 1, 60, 65, 12, 0xffff, 1); + spriteId = CreateMonPicSprite(species, trainerId, personality, TRUE, 60, 65, 12, 0xffff, TRUE); else - spriteId = CreateMonPicSprite_HandleDeoxys(species, trainerId, personality, 1, 60, 65, 12, 0xffff); + spriteId = CreateMonPicSprite_HandleDeoxys(species, trainerId, personality, TRUE, 60, 65, 12, 0xffff); } else { - if (ShouldIgnoreDeoxysForm(3, sLastViewedMonIndex)) - spriteId = CreateMonPicSprite(species, trainerId, personality, 1, 60, 65, 12, 0xffff, 1); + if (ShouldIgnoreDeoxysForm(DEOXYS_CHECK_TRADE_MAIN, sLastViewedMonIndex)) + spriteId = CreateMonPicSprite(species, trainerId, personality, TRUE, 60, 65, 12, 0xffff, TRUE); else - spriteId = CreateMonPicSprite_HandleDeoxys(species, trainerId, personality, 1, 60, 65, 12, 0xffff); + spriteId = CreateMonPicSprite_HandleDeoxys(species, trainerId, personality, TRUE, 60, 65, 12, 0xffff); } FreeSpriteOamMatrix(&gSprites[spriteId]); @@ -4130,7 +4130,7 @@ static void sub_8139DBC(void) } else { - if (ShouldIgnoreDeoxysForm(3, sLastViewedMonIndex)) + if (ShouldIgnoreDeoxysForm(DEOXYS_CHECK_TRADE_MAIN, sLastViewedMonIndex)) sMonSummaryScreen->unk3014 = CreateMonIcon(species, SpriteCallbackDummy, 24, 32, 0, personality, 0); else sMonSummaryScreen->unk3014 = CreateMonIcon(species, SpriteCallbackDummy, 24, 32, 0, personality, 1); diff --git a/src/quest_log.c b/src/quest_log.c index 3ea558356..a9686ab6f 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -77,7 +77,7 @@ EWRAM_DATA u16 *gUnknown_203AE04 = NULL; EWRAM_DATA u16 *sEventRecordingPointer = NULL; static EWRAM_DATA u16 *gUnknown_203AE0C[32] = {NULL}; static EWRAM_DATA void (* sQuestLogCB)(void) = NULL; -static EWRAM_DATA u16 *gUnknown_203AE90 = NULL; +static EWRAM_DATA u16 *sPalettesBackup = NULL; static EWRAM_DATA struct UnkStruct_203AE94 sQuestLogCurrentScene = {0}; static EWRAM_DATA struct QuestLogEntry sQuestLogSceneRecordBuffer[32] = {0}; EWRAM_DATA u16 sQuestLogCursor = 0; @@ -121,7 +121,7 @@ static void Task_QuestLogScene_SavedGame(u8); static void Task_WaitAtEndOfQuestLog(u8); static void Task_EndQuestLog(u8); static bool8 sub_81121D8(u8); -static void sub_811229C(void); +static void QL_SlightlyDarkenSomePals(void); static void TogglePlaybackStateForOverworldLock(u8); static void SetUpQuestLogEntry(u8, struct QuestLogEntry *, u16); static bool8 RecordHeadAtEndOfEntryOrScriptContext2Enabled(void); @@ -420,7 +420,7 @@ void TrySetUpQuestLogScenes_ElseContinueFromSave(u8 taskId) { u8 i; - sub_811381C(); + QL_EnableRecordingSteps(); sNumScenes = 0; for (i = 0; i < QUEST_LOG_SCENE_COUNT; i++) { @@ -1066,15 +1066,15 @@ static void QuestLog_WaitFadeAndCancelPlayback(void) } } -void sub_8111F14(void) +void QuestLog_InitPalettesBackup(void) { if (gQuestLogState == QL_STATE_PLAYBACK_LAST) - gUnknown_203AE90 = AllocZeroed(0x200 * sizeof(u16)); + sPalettesBackup = AllocZeroed(PLTT_SIZE); } -void sub_8111F38(u16 a0, u16 a1) +void QuestLog_BackUpPalette(u16 offset, u16 size) { - CpuSet(gPlttBufferUnfaded + a0, gUnknown_203AE90 + a0, a1); + CpuCopy16(gPlttBufferUnfaded + offset, sPalettesBackup + offset, size * 2); } static bool8 FieldCB2_FinalScene(void) @@ -1152,7 +1152,7 @@ static void Task_EndQuestLog(u8 taskId) case 0: gDisableMapMusicChangeOnMapLoad = 0; Overworld_PlaySpecialMapMusic(); - sub_811229C(); + QL_SlightlyDarkenSomePals(); FillWindowPixelRect(sQuestLogHeaderWindowIds[0], 0xF, 0, 0, sQuestLogHeaderWindowTemplates[0].width * 8, sQuestLogHeaderWindowTemplates[0].height * 8); tState++; break; @@ -1178,13 +1178,13 @@ static void Task_EndQuestLog(u8 taskId) default: if (sQuestLogCurrentScene.sceneEndMode == 1) ShowMapNamePopup(TRUE); - CpuCopy16(gUnknown_203AE90, gPlttBufferUnfaded, 0x400); - Free(gUnknown_203AE90); + CpuCopy16(sPalettesBackup, gPlttBufferUnfaded, PLTT_SIZE); + Free(sPalettesBackup); sQuestLogCurrentScene = (struct UnkStruct_203AE94){}; ClearPlayerHeldMovementAndUnfreezeObjectEvents(); ScriptContext2_Disable(); gTextFlags.autoScroll = FALSE; - gUnknown_2036E28 = 0; + gGlobalFieldTintMode = QL_TINT_NONE; DisableWildEncounters(FALSE); gHelpSystemEnabled = TRUE; DestroyTask(taskId); @@ -1212,16 +1212,16 @@ static bool8 sub_81121D8(u8 taskId) return FALSE; } -static void sub_811229C(void) +static void QL_SlightlyDarkenSomePals(void) { - u16 *buffer = Alloc(0x400); - CpuCopy16(gUnknown_203AE90, buffer, 0x400); - sub_807B0C4(gUnknown_203AE90, gUnknown_203AE90, 0xd0); - sub_807B0C4(gUnknown_203AE90 + 0x110, gUnknown_203AE90 + 0x110, 0x10); - sub_807B0C4(gUnknown_203AE90 + 0x160, gUnknown_203AE90 + 0x160, 0x40); - sub_807B0C4(gUnknown_203AE90 + 0x1b0, gUnknown_203AE90 + 0x1b0, 0x50); - CpuCopy16(gUnknown_203AE90, gPlttBufferUnfaded, 0x400); - CpuCopy16(buffer, gUnknown_203AE90, 0x400); + u16 *buffer = Alloc(PLTT_SIZE); + CpuCopy16(sPalettesBackup, buffer, PLTT_SIZE); + SlightlyDarkenPalsInWeather(sPalettesBackup, sPalettesBackup, 13 * 16); + SlightlyDarkenPalsInWeather(sPalettesBackup + 17 * 16, sPalettesBackup + 17 * 16, 1 * 16); + SlightlyDarkenPalsInWeather(sPalettesBackup + 22 * 16, sPalettesBackup + 22 * 16, 4 * 16); + SlightlyDarkenPalsInWeather(sPalettesBackup + 27 * 16, sPalettesBackup + 27 * 16, 5 * 16); + CpuCopy16(sPalettesBackup, gPlttBufferUnfaded, PLTT_SIZE); + CpuCopy16(buffer, sPalettesBackup, PLTT_SIZE); Free(buffer); } @@ -1295,10 +1295,10 @@ void sub_811246C(struct Sprite *sprite) ObjectEventSetHeldMovement(objectEvent, sMovementScripts[0][0]); sMovementScripts[0][0] = 0xFF; } - if (sMovementScripts[0][1] != OBJ_EVENT_ID_PLAYER) + if (sMovementScripts[0][1] != 0xFF) { - sub_8150454(); - sMovementScripts[0][1] = OBJ_EVENT_ID_PLAYER; + QuestLogUpdatePlayerSprite(sMovementScripts[0][1]); + sMovementScripts[0][1] = 0xFF; } sub_8063E28(objectEvent, sprite); } @@ -1313,7 +1313,7 @@ void sub_811246C(struct Sprite *sprite) } } -void sub_81124EC(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId) +void QuestLogRecordNPCStep(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId) { if (!RecordHeadAtEndOfEntryOrScriptContext2Enabled()) { @@ -1328,7 +1328,7 @@ void sub_81124EC(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId) } } -void sub_8112588(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId, u8 duration) +void QuestLogRecordNPCStepWithDuration(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId, u8 duration) { if (!RecordHeadAtEndOfEntry()) { @@ -1343,7 +1343,7 @@ void sub_8112588(u8 localId, u8 mapNum, u8 mapGroup, u8 movementActionId, u8 dur } } -void sub_8112628(u8 movementActionId) +void QuestLogRecordPlayerStep(u8 movementActionId) { if (!RecordHeadAtEndOfEntryOrScriptContext2Enabled()) { @@ -1360,7 +1360,7 @@ void sub_8112628(u8 movementActionId) } } -void sub_81126AC(u8 movementActionId, u8 duration) +void QuestLogRecordPlayerStepWithDuration(u8 movementActionId, u8 duration) { if (!RecordHeadAtEndOfEntry()) { @@ -1374,7 +1374,7 @@ void sub_81126AC(u8 movementActionId, u8 duration) } } -void sub_8112720(u8 movementActionId) +void QuestLogRecordPlayerAvatarGfxTransition(u8 movementActionId) { if (!RecordHeadAtEndOfEntry()) { @@ -1387,7 +1387,7 @@ void sub_8112720(u8 movementActionId) } } -void sub_811278C(u8 movementActionId, u8 duration) +void QuestLogRecordPlayerAvatarGfxTransitionWithDuration(u8 movementActionId, u8 duration) { if (!RecordHeadAtEndOfEntry()) { @@ -1404,13 +1404,21 @@ void sub_81127F8(struct FieldInput * a0) { if (sQuestLogCursor < sNumEventsInLogEntry) { + // Retain only the following fields: + // - pressedAButton + // - checkStandardWildEncounter + // - heldDirection + // - heldDirection2 + // - tookStep + // - pressedBButton + // - dpadDirection u32 r2 = *(u32 *)a0 & 0x00FF00F3; sCurQuestLogEntry[sQuestLogCursor].duration = sNextStepDelay; sCurQuestLogEntry[sQuestLogCursor].command = 2; sCurQuestLogEntry[sQuestLogCursor].localId = r2; - sCurQuestLogEntry[sQuestLogCursor].mapNum = r2 >> 8; + sCurQuestLogEntry[sQuestLogCursor].mapNum = r2 >> 8; // always 0 sCurQuestLogEntry[sQuestLogCursor].mapGroup = r2 >> 16; - sCurQuestLogEntry[sQuestLogCursor].animId = r2 >> 24; + sCurQuestLogEntry[sQuestLogCursor].animId = r2 >> 24; // always 0 sQuestLogCursor++; if (ScriptContext2_IsEnabled()) sNextStepDelay = TRUE; @@ -1434,13 +1442,13 @@ static void TogglePlaybackStateForOverworldLock(u8 a0) } } -void sub_81128BC(u8 a0) +void QuestLog_OnEscalatorWarp(u8 direction) { u8 r1 = sub_8112CAC(); - switch (a0) + switch (direction) { - case 1: + case QL_ESCALATOR_OUT: // warp out if (r1 == 1) gQuestLogPlaybackState = 3; else if (r1 == 2) @@ -1452,7 +1460,7 @@ void sub_81128BC(u8 a0) gQuestLogPlaybackState = 4; } break; - case 2: + case QL_ESCALATOR_IN: // warp in if (r1 == 1) gQuestLogPlaybackState = 1; else if (r1 == 2) @@ -1546,9 +1554,11 @@ void sub_8112B3C(void) switch (sCurQuestLogEntry[sQuestLogCursor].command) { case 0: + // NPC movement action sMovementScripts[sCurQuestLogEntry[sQuestLogCursor].localId][0] = sCurQuestLogEntry[sQuestLogCursor].animId; break; case 1: + // State transition sMovementScripts[sCurQuestLogEntry[sQuestLogCursor].localId][1] = sCurQuestLogEntry[sQuestLogCursor].animId; break; case 2: @@ -1556,6 +1566,7 @@ void sub_8112B3C(void) *(u32 *)&gQuestLogFieldInput = ((sCurQuestLogEntry[sQuestLogCursor].animId << 24) | (sCurQuestLogEntry[sQuestLogCursor].mapGroup << 16) | (sCurQuestLogEntry[sQuestLogCursor].mapNum << 8) | (sCurQuestLogEntry[sQuestLogCursor].localId << 0)); break; case 3: + // End gQuestLogPlaybackState = 3; break; case 0xFE: @@ -1596,7 +1607,7 @@ void sub_8112B3C(void) } } -void sub_8112C9C(void) +void QL_AfterRecordFishActionSuccessful(void) { sNextStepDelay++; } diff --git a/src/quest_log_events.c b/src/quest_log_events.c index 84a14f5e8..8fe66e183 100644 --- a/src/quest_log_events.c +++ b/src/quest_log_events.c @@ -173,10 +173,10 @@ void SetQuestLogEvent(u16 eventId, const u16 *eventData) if (eventId == QL_EVENT_DEPARTED && sEventShouldNotRecordSteps == 2) { - sub_811381C(); + QL_EnableRecordingSteps(); return; } - sub_811381C(); + QL_EnableRecordingSteps(); if (gQuestLogState == QL_STATE_PLAYBACK) return; @@ -348,7 +348,7 @@ static bool8 ShouldRegisterEvent_HandleBeatStoryTrainer(u16 eventId, const u16 * return FALSE; } -void sub_811381C(void) +void QL_EnableRecordingSteps(void) { sEventShouldNotRecordSteps = 0; } diff --git a/src/quest_log_player.c b/src/quest_log_player.c index da1c2b76e..4dcb13af2 100644 --- a/src/quest_log_player.c +++ b/src/quest_log_player.c @@ -7,71 +7,72 @@ #include "field_effect.h" #include "field_effect_helpers.h" #include "quest_log.h" - -static void sub_81504A8(void); -static void sub_81504E8(void); -static void sub_8150530(void); -static void sub_81505C4(u8 taskId); -static void sub_8150708(void); -static void sub_815077C(void); -static void sub_8150794(u8 taskId); -static void sub_81507CC(void); -static void sub_81507D8(void); -static void sub_81507E4(void); -static void sub_81507F0(void); -static void sub_81507BC(struct ObjectEvent *a0, u8 a1); - -static void (*const gUnknown_8471EDC[])(void) = { - sub_81504A8, - sub_81504E8, - sub_8150530, - sub_8150708, - sub_81507CC, - sub_81507D8, - sub_81507E4, - sub_81507F0, - sub_815077C +#include "quest_log_player.h" + +static void QL_GfxTransition_Normal(void); +static void QL_GfxTransition_Bike(void); +static void QL_GfxTransition_Fish(void); +static void Task_QLFishMovement(u8 taskId); +static void QL_GfxTransition_StartSurf(void); +static void QL_GfxTransition_VSSeeker(void); +static void Task_QLVSSeekerMovement(u8 taskId); +static void QL_GfxTransition_StopSurfSouth(void); +static void QL_GfxTransition_StopSurfNorth(void); +static void QL_GfxTransition_StopSurfWest(void); +static void QL_GfxTransition_StopSurfEast(void); +static void QL_SetObjectGraphicsId(struct ObjectEvent *object, u8 graphicsId); + +static void (*const sQLGfxTransitions[])(void) = { + [QL_PLAYER_GFX_NORMAL] = QL_GfxTransition_Normal, + [QL_PLAYER_GFX_BIKE] = QL_GfxTransition_Bike, + [QL_PLAYER_GFX_FISH] = QL_GfxTransition_Fish, + [QL_PLAYER_GFX_SURF] = QL_GfxTransition_StartSurf, + [QL_PLAYER_GFX_STOP_SURF_S] = QL_GfxTransition_StopSurfSouth, + [QL_PLAYER_GFX_STOP_SURF_N] = QL_GfxTransition_StopSurfNorth, + [QL_PLAYER_GFX_STOP_SURF_W] = QL_GfxTransition_StopSurfWest, + [QL_PLAYER_GFX_STOP_SURF_E] = QL_GfxTransition_StopSurfEast, + [QL_PLAYER_GFX_VSSEEKER] = QL_GfxTransition_VSSeeker }; -void sub_8150454(u8 a0) +void QuestLogUpdatePlayerSprite(u8 state) { - if (a0 < NELEMS(gUnknown_8471EDC)) - gUnknown_8471EDC[a0](); + if (state < NELEMS(sQLGfxTransitions)) + sQLGfxTransitions[state](); } -bool32 sub_8150474(u8 a0) +bool32 QuestLogTryRecordPlayerAvatarGfxTransition(u8 state) { if (gQuestLogPlaybackState == 2) { - sub_8112720(a0); + QuestLogRecordPlayerAvatarGfxTransition(state); return TRUE; } return FALSE; } -void sub_8150498(u8 a0) +void QuestLogCallUpdatePlayerSprite(u8 state) { - return sub_8150454(a0); + return QuestLogUpdatePlayerSprite(state); } -static void sub_81504A8(void) +static void QL_GfxTransition_Normal(void) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(0)); + QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL)); ObjectEventTurn(objectEvent, objectEvent->movementDirection); SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT); } -static void sub_81504E8(void) +static void QL_GfxTransition_Bike(void) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(1)); + QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_BIKE)); ObjectEventTurn(objectEvent, objectEvent->movementDirection); SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_MACH_BIKE); InitPlayerAvatarBikeState(0, 0); } -static void sub_8150530(void) +static void QL_GfxTransition_Fish(void) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; struct Sprite *sprite = &gSprites[objectEvent->spriteId]; @@ -81,17 +82,17 @@ static void sub_8150530(void) u8 taskId; ScriptContext2_Enable(); gPlayerAvatar.preventStep = TRUE; - taskId = CreateTask(sub_81505C4, 0xFF); + taskId = CreateTask(Task_QLFishMovement, 0xFF); gTasks[taskId].data[0] = 0; } else { - sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(4)); + QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_FISH)); StartSpriteAnim(sprite, GetFishingDirectionAnimNum(objectEvent->facingDirection)); } } -static void sub_81505C4(u8 taskId) +static void Task_QLFishMovement(u8 taskId) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; struct Sprite *sprite = &gSprites[objectEvent->spriteId]; @@ -101,7 +102,7 @@ static void sub_81505C4(u8 taskId) case 0: ObjectEventClearHeldMovementIfActive(objectEvent); objectEvent->enableAnim = TRUE; - sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(4)); + QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_FISH)); StartSpriteAnim(sprite, GetFishingDirectionAnimNum(objectEvent->facingDirection)); gTasks[taskId].data[0]++; gTasks[taskId].data[1] = 0; @@ -122,9 +123,9 @@ static void sub_81505C4(u8 taskId) if (sprite->animEnded) { if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)) - sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(0)); + QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL)); else - sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(2)); + QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); ObjectEventTurn(objectEvent, objectEvent->movementDirection); sprite->pos2.x = 0; sprite->pos2.y = 0; @@ -135,14 +136,14 @@ static void sub_81505C4(u8 taskId) } } -static void sub_8150708(void) +static void QL_GfxTransition_StartSurf(void) { struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; u8 fieldEffectId; if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)) { - sub_81507BC(objectEvent, GetPlayerAvatarGraphicsIdByStateId(2)); + QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE)); ObjectEventTurn(objectEvent, objectEvent->movementDirection); SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING); gFieldEffectArguments[0] = objectEvent->currentCoords.x; @@ -154,13 +155,13 @@ static void sub_8150708(void) } } -static void sub_815077C(void) +static void QL_GfxTransition_VSSeeker(void) { FieldEffectStart(FLDEFF_USE_VS_SEEKER); - CreateTask(sub_8150794, 0x00); + CreateTask(Task_QLVSSeekerMovement, 0x00); } -static void sub_8150794(u8 taskId) +static void Task_QLVSSeekerMovement(u8 taskId) { if (!FieldEffectActiveListContains(FLDEFF_USE_VS_SEEKER)) { @@ -170,27 +171,27 @@ static void sub_8150794(u8 taskId) } } -static void sub_81507BC(struct ObjectEvent * a0, u8 a1) +static void QL_SetObjectGraphicsId(struct ObjectEvent * object, u8 graphicsId) { - ObjectEventSetGraphicsId(a0, a1); + ObjectEventSetGraphicsId(object, graphicsId); } -static void sub_81507CC(void) +static void QL_GfxTransition_StopSurfSouth(void) { - CreateStopSurfingTask_NoMusicChange(1); + CreateStopSurfingTask_NoMusicChange(DIR_SOUTH); } -static void sub_81507D8(void) +static void QL_GfxTransition_StopSurfNorth(void) { - CreateStopSurfingTask_NoMusicChange(2); + CreateStopSurfingTask_NoMusicChange(DIR_NORTH); } -static void sub_81507E4(void) +static void QL_GfxTransition_StopSurfWest(void) { - CreateStopSurfingTask_NoMusicChange(3); + CreateStopSurfingTask_NoMusicChange(DIR_WEST); } -static void sub_81507F0(void) +static void QL_GfxTransition_StopSurfEast(void) { - CreateStopSurfingTask_NoMusicChange(4); + CreateStopSurfingTask_NoMusicChange(DIR_EAST); } diff --git a/src/save.c b/src/save.c index 894b420f6..353ad5cb2 100644 --- a/src/save.c +++ b/src/save.c @@ -702,7 +702,7 @@ OK: return 1; } -u8 sub_80DA3AC(void) +u8 SaveGame_AfterLinkTrade(void) { if (gFlashMemoryPresent != TRUE) return 1; @@ -712,18 +712,18 @@ u8 sub_80DA3AC(void) return 0; } -bool8 sub_80DA3D8(void) +bool8 AfterLinkTradeSaveFailed(void) { u8 retVal = sub_80D9AA4(0xE, gRamSaveSectionLocations); if (gDamagedSaveSectors) DoSaveFailedScreen(SAVE_NORMAL); - if (retVal == 0xFF) + if (retVal == SAVE_STATUS_ERROR) return 1; else return 0; } -u8 sub_80DA40C(void) +u8 ClearSaveAfterLinkTradeSaveFailure(void) { sub_80D9B04(0xE, gRamSaveSectionLocations); if (gDamagedSaveSectors) @@ -865,7 +865,7 @@ void Task_SaveGame_UpdatedLinkRecords(u8 taskId) break; case 3: SetContinueGameWarpStatusToDynamicWarp(); - sub_80DA3AC(); + SaveGame_AfterLinkTrade(); gTasks[taskId].data[0] = 4; break; case 4: @@ -876,13 +876,13 @@ void Task_SaveGame_UpdatedLinkRecords(u8 taskId) } break; case 5: - if (sub_80DA3D8()) + if (AfterLinkTradeSaveFailed()) gTasks[taskId].data[0] = 6; else gTasks[taskId].data[0] = 4; break; case 6: - sub_80DA40C(); + ClearSaveAfterLinkTradeSaveFailure(); gTasks[taskId].data[0] = 7; break; case 7: diff --git a/src/sound.c b/src/sound.c index e956896e8..e14cd4c4e 100644 --- a/src/sound.c +++ b/src/sound.c @@ -16,7 +16,7 @@ struct Fanfare // TODO: what are these extern u8 gDisableMapMusicChangeOnMapLoad; -extern u8 gUnknown_203F174; +extern u8 gDisableHelpSystemVolumeReduce; // ewram EWRAM_DATA struct MusicPlayerInfo* gMPlay_PokemonCry = NULL; @@ -630,14 +630,14 @@ bool8 IsSpecialSEPlaying(void) return TRUE; } -void sub_8072474(u16 volume) +void SetBGMVolume_SuppressHelpSystemReduction(u16 volume) { - gUnknown_203F174 = 1; + gDisableHelpSystemVolumeReduce = TRUE; m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, volume); } -void sub_807249C(void) +void BGMVolumeMax_EnableHelpSystemReduction(void) { - gUnknown_203F174 = 0; + gDisableHelpSystemVolumeReduce = FALSE; m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 256); } diff --git a/src/strings.c b/src/strings.c index d620cdc80..e183e5167 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1173,10 +1173,10 @@ const u8 gUnknown_841DF8B[] = _("BRONZE"); const u8 gUnknown_841DF92[] = _("COPPER"); const u8 gUnknown_841DF99[] = _("SILVER"); const u8 gUnknown_841DFA0[] = _("GOLD"); -const u8 gUnknown_841DFA5[] = _("{A_BUTTON}NEXT"); -const u8 gUnknown_841DFAC[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}END"); -const u8 gUnknown_841DFBE[] = _("{A_BUTTON}{B_BUTTON}CANCEL"); -const u8 gUnknown_841DFC9[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}CANCEL"); +const u8 gText_HelpSystemControls_A_Next[] = _("{A_BUTTON}NEXT"); +const u8 gText_HelpSystemControls_PickOkEnd[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}END"); +const u8 gText_HelpSystemControls_AorBtoCancel[] = _("{A_BUTTON}{B_BUTTON}CANCEL"); +const u8 gText_HelpSystemControls_PickOkCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}CANCEL"); const u8 gEasyChatGroupName_Pokemon[] = _("POKéMON"); const u8 gEasyChatGroupName_Trainer[] = _("TRAINER"); const u8 gEasyChatGroupName_Status[] = _("STATUS"); diff --git a/src/teachy_tv.c b/src/teachy_tv.c index 3baaa094a..0ad510721 100644 --- a/src/teachy_tv.c +++ b/src/teachy_tv.c @@ -1283,7 +1283,7 @@ static void TeachyTvLoadMapTilesetToBuffer(struct Tileset *ts, u8 *dstBuffer, u1 if (ts) { if (!ts->isCompressed) - CpuFastSet(ts->tiles, dstBuffer, 8 * size); + CpuFastCopy(ts->tiles, dstBuffer, 0x20 * size); else LZDecompressWram(ts->tiles, dstBuffer); } @@ -1291,7 +1291,7 @@ static void TeachyTvLoadMapTilesetToBuffer(struct Tileset *ts, u8 *dstBuffer, u1 static void TeachyTvPushBackNewMapPalIndexArrayEntry(const struct MapLayout *mStruct, u16 *buf1, u8 *palIndexArray, u16 mapEntry, u16 offset) { - u16 * metaTileEntryAddr = mapEntry <= 0x27F ? &((u16*)(mStruct->primaryTileset->metatiles))[8 * mapEntry] : &((u16*)(mStruct->secondaryTileset->metatiles))[8 * (mapEntry - 0x280)]; + u16 * metaTileEntryAddr = mapEntry < 0x280 ? &((u16*)(mStruct->primaryTileset->metatiles))[8 * mapEntry] : &((u16*)(mStruct->secondaryTileset->metatiles))[8 * (mapEntry - 0x280)]; buf1[0] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[0]) << 12) + 4 * offset; buf1[1] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[1]) << 12) + 4 * offset + 1; buf1[32] = (TeachyTvComputePalIndexArrayEntryByMetaTile(palIndexArray, metaTileEntryAddr[2]) << 12) + 4 * offset + 2; @@ -1316,7 +1316,7 @@ static void TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(u8 *blockBu u8 i, j; u8 * buffer = AllocZeroed(0x20); u8 * src = AllocZeroed(0x20); - CpuFastSet(tileset, buffer, 8); + CpuFastCopy(tileset, buffer, 0x20); if (metaTile & 1) { for (i = 0; i < 8; ++i) @@ -1328,13 +1328,13 @@ static void TeachyTvComputeSingleMapTileBlockFromTilesetAndMetaTiles(u8 *blockBu src[(i << 2) + j] = ((value & 0xF) << 4) + ((value & 0xF0) >> 4); } } - CpuFastSet(src, buffer, 8); + CpuFastCopy(src, buffer, 0x20); } if (metaTile & 2) { for (i = 0; i < 8; ++i) memcpy(&src[4 * i], &buffer[4 * (7 - i)], 4); - CpuFastSet(src, buffer, 8); + CpuFastCopy(src, buffer, 0x20); } for (i = 0; i < 32; ++i) { diff --git a/src/text.c b/src/text.c index 7ccaad063..fbb084244 100644 --- a/src/text.c +++ b/src/text.c @@ -6,7 +6,6 @@ #include "dynamic_placeholder_text_util.h" #include "constants/songs.h" -extern u8 gGlyphInfo[0x90]; extern const struct OamData gOamData_AffineOff_ObjNormal_16x16; static void DecompressGlyphFont3(u16 glyphId, bool32 isJapanese); @@ -657,22 +656,22 @@ u16 RenderText(struct TextPrinter *textPrinter) textPrinter->printerTemplate.currentChar++; switch (currChar) { - case 1: + case EXT_CTRL_CODE_COLOR: textPrinter->printerTemplate.fgColor = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor); return 2; - case 2: + case EXT_CTRL_CODE_HIGHLIGHT: textPrinter->printerTemplate.bgColor = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor); return 2; - case 3: + case EXT_CTRL_CODE_SHADOW: textPrinter->printerTemplate.shadowColor = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor); return 2; - case 4: + case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW: textPrinter->printerTemplate.fgColor = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; textPrinter->printerTemplate.bgColor = *textPrinter->printerTemplate.currentChar; @@ -681,29 +680,29 @@ u16 RenderText(struct TextPrinter *textPrinter) textPrinter->printerTemplate.currentChar++; GenerateFontHalfRowLookupTable(textPrinter->printerTemplate.fgColor, textPrinter->printerTemplate.bgColor, textPrinter->printerTemplate.shadowColor); return 2; - case 5: + case EXT_CTRL_CODE_PALETTE: textPrinter->printerTemplate.currentChar++; return 2; - case 6: + case EXT_CTRL_CODE_FONT: subStruct->glyphId = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; return 2; - case EXT_CTRL_CODE_UNKNOWN_7: + case EXT_CTRL_CODE_RESET_FONT: return 2; - case 8: + case EXT_CTRL_CODE_PAUSE: textPrinter->delayCounter = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; textPrinter->state = 6; return 2; - case 9: + case EXT_CTRL_CODE_WAIT_BUTTON: textPrinter->state = 1; if (gTextFlags.autoScroll) subStruct->autoScrollDelay = 0; return 3; - case 10: + case EXT_CTRL_CODE_WAIT_SE: textPrinter->state = 5; return 3; - case 11: + case EXT_CTRL_CODE_PLAY_BGM: currChar = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; currChar |= *textPrinter->printerTemplate.currentChar << 8; @@ -711,32 +710,32 @@ u16 RenderText(struct TextPrinter *textPrinter) if (!QL_IS_PLAYBACK_STATE) PlayBGM(currChar); return 2; - case 16: + case EXT_CTRL_CODE_PLAY_SE: currChar = *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; currChar |= (*textPrinter->printerTemplate.currentChar << 8); textPrinter->printerTemplate.currentChar++; PlaySE(currChar); return 2; - case 12: + case EXT_CTRL_CODE_ESCAPE: textPrinter->printerTemplate.currentChar++; currChar = *textPrinter->printerTemplate.currentChar; break; - case 13: + case EXT_CTRL_CODE_SHIFT_RIGHT: textPrinter->printerTemplate.currentX = textPrinter->printerTemplate.x + *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; return 2; - case 14: + case EXT_CTRL_CODE_SHIFT_DOWN: textPrinter->printerTemplate.currentY = textPrinter->printerTemplate.y + *textPrinter->printerTemplate.currentChar; textPrinter->printerTemplate.currentChar++; return 2; - case 15: + case EXT_CTRL_CODE_FILL_WINDOW: FillWindowPixelBuffer(textPrinter->printerTemplate.windowId, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); return 2; - case 23: + case EXT_CTRL_CODE_STOP_BGM: m4aMPlayStop(&gMPlayInfo_BGM); return 2; - case 24: + case EXT_CTRL_CODE_RESUME_BGM: m4aMPlayContinue(&gMPlayInfo_BGM); return 2; case EXT_CTRL_CODE_CLEAR: @@ -749,7 +748,7 @@ u16 RenderText(struct TextPrinter *textPrinter) return 0; } return 2; - case 18: + case EXT_CTRL_CODE_SKIP: textPrinter->printerTemplate.currentX = *textPrinter->printerTemplate.currentChar + textPrinter->printerTemplate.x; textPrinter->printerTemplate.currentChar++; return 2; @@ -792,8 +791,8 @@ u16 RenderText(struct TextPrinter *textPrinter) break; case CHAR_KEYPAD_ICON: currChar = *textPrinter->printerTemplate.currentChar++; - gGlyphInfo[0x80] = DrawKeypadIcon(textPrinter->printerTemplate.windowId, currChar, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY); - textPrinter->printerTemplate.currentX += gGlyphInfo[0x80] + textPrinter->printerTemplate.letterSpacing; + gGlyphInfo.width = DrawKeypadIcon(textPrinter->printerTemplate.windowId, currChar, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY); + textPrinter->printerTemplate.currentX += gGlyphInfo.width + textPrinter->printerTemplate.letterSpacing; return 0; case EOS: return 1; @@ -824,8 +823,8 @@ u16 RenderText(struct TextPrinter *textPrinter) if (textPrinter->minLetterSpacing) { - textPrinter->printerTemplate.currentX += gGlyphInfo[0x80]; - width = textPrinter->minLetterSpacing - gGlyphInfo[0x80]; + textPrinter->printerTemplate.currentX += gGlyphInfo.width; + width = textPrinter->minLetterSpacing - gGlyphInfo.width; if (width > 0) { ClearTextSpan(textPrinter, width); @@ -835,9 +834,9 @@ u16 RenderText(struct TextPrinter *textPrinter) else { if (textPrinter->japanese) - textPrinter->printerTemplate.currentX += (gGlyphInfo[0x80] + textPrinter->printerTemplate.letterSpacing); + textPrinter->printerTemplate.currentX += (gGlyphInfo.width + textPrinter->printerTemplate.letterSpacing); else - textPrinter->printerTemplate.currentX += gGlyphInfo[0x80]; + textPrinter->printerTemplate.currentX += gGlyphInfo.width; } return 0; case 1: @@ -924,61 +923,61 @@ s32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing) temp = strLocal[strPos++]; switch (temp) { - case 0xFE: - case 0xFF: - lineWidths[line] = width; - width = 0; - line++; - break; - case 0xFC: - temp2 = strLocal[strPos++]; - switch (temp2) - { - case 0x4: - ++strPos; - case 0xB: - case 0x10: - ++strPos; - case 0x1: - case 0x2: - case 0x3: - case 0x5: - case 0x6: - case 0x8: - case 0xC: - case 0xD: - case 0xE: - case 0x11: - case 0x12: - case 0x13: - case 0x14: - ++strPos; - break; - case 0x7: - case 0x9: - case 0xA: - case 0xF: - case 0x15: - case 0x16: - default: - break; - } - break; - case 0xF7: - case 0xFD: + case CHAR_NEWLINE: + case EOS: + lineWidths[line] = width; + width = 0; + line++; + break; + case EXT_CTRL_CODE_BEGIN: + temp2 = strLocal[strPos++]; + switch (temp2) + { + case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW: ++strPos; - break; - case 0xFA: - case 0xFB: - break; - case 0xF8: - case 0xF9: + case EXT_CTRL_CODE_PLAY_BGM: + case EXT_CTRL_CODE_PLAY_SE: ++strPos; + case EXT_CTRL_CODE_COLOR: + case EXT_CTRL_CODE_HIGHLIGHT: + case EXT_CTRL_CODE_SHADOW: + case EXT_CTRL_CODE_PALETTE: + case EXT_CTRL_CODE_FONT: + case EXT_CTRL_CODE_PAUSE: + case EXT_CTRL_CODE_ESCAPE: + case EXT_CTRL_CODE_SHIFT_RIGHT: + case EXT_CTRL_CODE_SHIFT_DOWN: + case EXT_CTRL_CODE_CLEAR: + case EXT_CTRL_CODE_SKIP: + case EXT_CTRL_CODE_CLEAR_TO: + case EXT_CTRL_CODE_MIN_LETTER_SPACING: + ++strPos; + break; + case EXT_CTRL_CODE_RESET_FONT: + case EXT_CTRL_CODE_WAIT_BUTTON: + case EXT_CTRL_CODE_WAIT_SE: + case EXT_CTRL_CODE_FILL_WINDOW: + case EXT_CTRL_CODE_JPN: + case EXT_CTRL_CODE_ENG: default: - ++width; break; + } + break; + case CHAR_DYNAMIC_PLACEHOLDER: + case PLACEHOLDER_BEGIN: + ++strPos; + break; + case CHAR_PROMPT_SCROLL: + case CHAR_PROMPT_CLEAR: + break; + case CHAR_KEYPAD_ICON: + case CHAR_EXTRA_EMOJI: + ++strPos; + default: + ++width; + break; } - } while (temp != 0xFF); + } while (temp != EOS); for (width = 0, strPos = 0; strPos < 8; ++strPos) { @@ -1033,109 +1032,36 @@ s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) lineWidth = 0; bufferPointer = NULL; - while (*str != 0xFF) + while (*str != EOS) { switch (*str) { - case 0xFE: - if (lineWidth > width) - width = lineWidth; - lineWidth = 0; - break; - case 0xFD: - switch (*++str) - { - case 0x2: - bufferPointer = gStringVar1; - break; - case 0x3: - bufferPointer = gStringVar2; - break; - case 0x4: - bufferPointer = gStringVar3; - break; - default: - return 0; - } - case 0xF7: - if (bufferPointer == NULL) - bufferPointer = DynamicPlaceholderTextUtil_GetPlaceholderPtr(*++str); - while (*bufferPointer != 0xFF) - { - glyphWidth = func(*bufferPointer++, isJapanese); - if (minGlyphWidth > 0) - { - if (glyphWidth < minGlyphWidth) - glyphWidth = minGlyphWidth; - } - else if (isJapanese) - { - glyphWidth += localLetterSpacing; - } - lineWidth += glyphWidth; - } - bufferPointer = NULL; - break; - case 0xFC: - switch (*++str) - { - case 0x4: - ++str; - case 0xB: - case 0x10: - ++str; - case 0x1: - case 0x2: - case 0x3: - case 0x5: - case 0x8: - case 0xC: - case 0xD: - case 0xE: - ++str; - break; - case 0x6: - func = GetFontWidthFunc(*++str); - if (func == NULL) - return 0; - if (letterSpacing == -1) - localLetterSpacing = GetFontAttribute(*str, 2); - break; - case 0x11: - glyphWidth = *++str; - lineWidth += glyphWidth; - break; - case 0x12: - lineWidth = *++str; - break; - case 0x13: - if (*++str > lineWidth) - lineWidth = *str; - break; - case 0x14: - minGlyphWidth = *++str; - break; - case 0x15: - isJapanese = 1; - break; - case 0x16: - isJapanese = 0; - break; - case 0x7: - case 0x9: - case 0xA: - case 0xF: - default: - break; - } - break; - case 0xF8: - case 0xF9: - if (*str == 0xF9) - glyphWidth = func(*++str | 0x100, isJapanese); - else - glyphWidth = GetKeypadIconWidth(*++str); - + case CHAR_NEWLINE: + if (lineWidth > width) + width = lineWidth; + lineWidth = 0; + break; + case PLACEHOLDER_BEGIN: + switch (*++str) + { + case PLACEHOLDER_ID_STRING_VAR_1: + bufferPointer = gStringVar1; + break; + case PLACEHOLDER_ID_STRING_VAR_2: + bufferPointer = gStringVar2; + break; + case PLACEHOLDER_ID_STRING_VAR_3: + bufferPointer = gStringVar3; + break; + default: + return 0; + } + case CHAR_DYNAMIC_PLACEHOLDER: + if (bufferPointer == NULL) + bufferPointer = DynamicPlaceholderTextUtil_GetPlaceholderPtr(*++str); + while (*bufferPointer != EOS) + { + glyphWidth = func(*bufferPointer++, isJapanese); if (minGlyphWidth > 0) { if (glyphWidth < minGlyphWidth) @@ -1146,27 +1072,100 @@ s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) glyphWidth += localLetterSpacing; } lineWidth += glyphWidth; + } + bufferPointer = NULL; + break; + case EXT_CTRL_CODE_BEGIN: + switch (*++str) + { + case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW: + ++str; + case EXT_CTRL_CODE_PLAY_BGM: + case EXT_CTRL_CODE_PLAY_SE: + ++str; + case EXT_CTRL_CODE_COLOR: + case EXT_CTRL_CODE_HIGHLIGHT: + case EXT_CTRL_CODE_SHADOW: + case EXT_CTRL_CODE_PALETTE: + case EXT_CTRL_CODE_PAUSE: + case EXT_CTRL_CODE_ESCAPE: + case EXT_CTRL_CODE_SHIFT_RIGHT: + case EXT_CTRL_CODE_SHIFT_DOWN: + ++str; + break; + case EXT_CTRL_CODE_FONT: + func = GetFontWidthFunc(*++str); + if (func == NULL) + return 0; + if (letterSpacing == -1) + localLetterSpacing = GetFontAttribute(*str, 2); + break; + case EXT_CTRL_CODE_CLEAR: + glyphWidth = *++str; + lineWidth += glyphWidth; break; - case 0xFA: - case 0xFB: + case EXT_CTRL_CODE_SKIP: + lineWidth = *++str; break; + case EXT_CTRL_CODE_CLEAR_TO: + if (*++str > lineWidth) + lineWidth = *str; + break; + case EXT_CTRL_CODE_MIN_LETTER_SPACING: + minGlyphWidth = *++str; + break; + case EXT_CTRL_CODE_JPN: + isJapanese = 1; + break; + case EXT_CTRL_CODE_ENG: + isJapanese = 0; + break; + case EXT_CTRL_CODE_RESET_FONT: + case EXT_CTRL_CODE_WAIT_BUTTON: + case EXT_CTRL_CODE_WAIT_SE: + case EXT_CTRL_CODE_FILL_WINDOW: default: - glyphWidth = func(*str, isJapanese); - if (minGlyphWidth > 0) - { - if (glyphWidth < minGlyphWidth) - glyphWidth = minGlyphWidth; - lineWidth += glyphWidth; - } - else + break; + } + break; + case CHAR_KEYPAD_ICON: + case CHAR_EXTRA_EMOJI: + if (*str == CHAR_EXTRA_EMOJI) + glyphWidth = func(*++str | 0x100, isJapanese); + else + glyphWidth = GetKeypadIconWidth(*++str); + + if (minGlyphWidth > 0) + { + if (glyphWidth < minGlyphWidth) + glyphWidth = minGlyphWidth; + } + else if (isJapanese) + { + glyphWidth += localLetterSpacing; + } + lineWidth += glyphWidth; + break; + case CHAR_PROMPT_SCROLL: + case CHAR_PROMPT_CLEAR: + break; + default: + glyphWidth = func(*str, isJapanese); + if (minGlyphWidth > 0) + { + if (glyphWidth < minGlyphWidth) + glyphWidth = minGlyphWidth; + lineWidth += glyphWidth; + } + else + { + if (fontId != 6 && isJapanese) { - if (fontId != 6 && isJapanese) - { - glyphWidth += localLetterSpacing; - } - lineWidth += glyphWidth; + glyphWidth += localLetterSpacing; } - break; + lineWidth += glyphWidth; + } + break; } ++str; } @@ -1202,75 +1201,75 @@ u8 RenderTextFont9(u8 *pixels, u8 fontId, u8 *str, int a3, int a4, int a5, int a temp = strLocal[strPos++]; switch (temp) { - case 0xFC: - temp2 = strLocal[strPos++]; - switch (temp2) - { - case 0x4: - fgColor = strLocal[strPos++]; - bgColor = strLocal[strPos++]; - shadowColor = strLocal[strPos++]; - GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); - continue; - case 0x1: - fgColor = strLocal[strPos++]; - GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); - continue; - case 0x2: - bgColor = strLocal[strPos++]; - GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); - continue; - case 0x3: - shadowColor = strLocal[strPos++]; - GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); - continue; - case 0x6: - fontId = strLocal[strPos++]; - break; - case 0xB: - case 0x10: - ++strPos; - case 0x5: - case 0x8: - case 0xC: - case 0xD: - case 0xE: - case 0x11: - case 0x12: - case 0x13: - case 0x14: - ++strPos; - break; - case 0x7: - case 0x9: - case 0xA: - case 0xF: - case 0x15: - case 0x16: - default: - continue; - } + case EXT_CTRL_CODE_BEGIN: + temp2 = strLocal[strPos++]; + switch (temp2) + { + case EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW: + fgColor = strLocal[strPos++]; + bgColor = strLocal[strPos++]; + shadowColor = strLocal[strPos++]; + GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); + continue; + case EXT_CTRL_CODE_COLOR: + fgColor = strLocal[strPos++]; + GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); + continue; + case EXT_CTRL_CODE_HIGHLIGHT: + bgColor = strLocal[strPos++]; + GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); + continue; + case EXT_CTRL_CODE_SHADOW: + shadowColor = strLocal[strPos++]; + GenerateFontHalfRowLookupTable(fgColor, bgColor, shadowColor); + continue; + case EXT_CTRL_CODE_FONT: + fontId = strLocal[strPos++]; break; - case 0xF7: - case 0xF8: - case 0xF9: - case 0xFD: + case EXT_CTRL_CODE_PLAY_BGM: + case EXT_CTRL_CODE_PLAY_SE: + ++strPos; + case EXT_CTRL_CODE_PALETTE: + case EXT_CTRL_CODE_PAUSE: + case EXT_CTRL_CODE_ESCAPE: + case EXT_CTRL_CODE_SHIFT_RIGHT: + case EXT_CTRL_CODE_SHIFT_DOWN: + case EXT_CTRL_CODE_CLEAR: + case EXT_CTRL_CODE_SKIP: + case EXT_CTRL_CODE_CLEAR_TO: + case EXT_CTRL_CODE_MIN_LETTER_SPACING: ++strPos; break; - case 0xFA: - case 0xFB: - case 0xFE: - case 0xFF: - break; + case EXT_CTRL_CODE_RESET_FONT: + case EXT_CTRL_CODE_WAIT_BUTTON: + case EXT_CTRL_CODE_WAIT_SE: + case EXT_CTRL_CODE_FILL_WINDOW: + case EXT_CTRL_CODE_JPN: + case EXT_CTRL_CODE_ENG: default: - DecompressGlyphFont9(temp); - CpuCopy32(gGlyphInfo, pixels, 0x20); - CpuCopy32(gGlyphInfo + 0x40, pixels + 0x20, 0x20); - pixels += 0x40; - break; + continue; + } + break; + case CHAR_DYNAMIC_PLACEHOLDER: + case CHAR_KEYPAD_ICON: + case CHAR_EXTRA_EMOJI: + case PLACEHOLDER_BEGIN: + ++strPos; + break; + case CHAR_PROMPT_SCROLL: + case CHAR_PROMPT_CLEAR: + case CHAR_NEWLINE: + case EOS: + break; + default: + DecompressGlyphFont9(temp); + CpuCopy32(gGlyphInfo.pixels, pixels, 0x20); + CpuCopy32(gGlyphInfo.pixels + 0x40, pixels + 0x20, 0x20); + pixels += 0x40; + break; } } - while (temp != 0xFF); + while (temp != EOS); RestoreTextColors(&colorBackup[0], &colorBackup[1], &colorBackup[2]); return 1; @@ -1317,7 +1316,7 @@ u8 CreateTextCursorSpriteForOakSpeech(u8 sheetId, u16 x, u16 y, u8 priority, u8 return spriteId; } -void sub_8006398(u8 spriteId) +void DestroyTextCursorSprite(u8 spriteId) { DestroySprite(&gSprites[spriteId]); FreeSpriteTilesByTag(0x8000); @@ -1362,18 +1361,18 @@ void DecompressGlyphFont0(u16 glyphId, bool32 isJapanese) if (isJapanese == 1) { glyphs = sFont0JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & 0xF)); - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40)); - gGlyphInfo[0x80] = 8; - gGlyphInfo[0x81] = 12; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); + gGlyphInfo.width = 8; + gGlyphInfo.height = 12; } else { glyphs = sFont0LatinGlyphs + (0x10 * glyphId); - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x40)); - gGlyphInfo[0x80] = sFont0LatinGlyphWidths[glyphId]; - gGlyphInfo[0x81] = 13; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x40)); + gGlyphInfo.width = sFont0LatinGlyphWidths[glyphId]; + gGlyphInfo.height = 13; } } @@ -1393,20 +1392,20 @@ void DecompressGlyphFont1(u16 glyphId, bool32 isJapanese) { int eff; glyphs = sFont1JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & (eff = 0xF))); // shh, no questions, only matching now - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40)); - gGlyphInfo[0x80] = 8; - gGlyphInfo[0x81] = 16; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); + gGlyphInfo.width = 8; + gGlyphInfo.height = 16; } else { glyphs = sFont1LatinGlyphs + (0x20 * glyphId); - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20)); - DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo + 0x40)); - DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo + 0x60)); - gGlyphInfo[0x80] = sFont1LatinGlyphWidths[glyphId]; - gGlyphInfo[0x81] = 14; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = sFont1LatinGlyphWidths[glyphId]; + gGlyphInfo.height = 14; } } @@ -1432,21 +1431,21 @@ void DecompressGlyphFont2(u16 glyphId, bool32 isJapanese) for(i = 0; i < 0x80; i++) { - gGlyphInfo[i] = lastColor | lastColor << 4; + gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // Game Freak, please. writing the same values over and over... - gGlyphInfo[0x80] = 10; - gGlyphInfo[0x81] = 12; + gGlyphInfo.width = 10; + gGlyphInfo.height = 12; } } else { glyphs = sFont2JapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7)); - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20)); - DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40)); - DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo + 0x60)); - gGlyphInfo[0x80] = sFont2JapaneseGlyphWidths[glyphId]; - gGlyphInfo[0x81] = 12; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = sFont2JapaneseGlyphWidths[glyphId]; + gGlyphInfo.height = 12; } } else @@ -1457,21 +1456,21 @@ void DecompressGlyphFont2(u16 glyphId, bool32 isJapanese) for(i = 0; i < 0x80; i++) { - gGlyphInfo[i] = lastColor | lastColor << 4; + gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // but why - gGlyphInfo[0x80] = sFont2LatinGlyphWidths[0]; - gGlyphInfo[0x81] = 14; + gGlyphInfo.width = sFont2LatinGlyphWidths[0]; + gGlyphInfo.height = 14; } } else { glyphs = sFont2LatinGlyphs + (0x20 * glyphId); - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20)); - DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo + 0x40)); - DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo + 0x60)); - gGlyphInfo[0x80] = sFont2LatinGlyphWidths[glyphId]; - gGlyphInfo[0x81] = 14; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = sFont2LatinGlyphWidths[glyphId]; + gGlyphInfo.height = 14; } } } @@ -1505,21 +1504,21 @@ static void DecompressGlyphFont3(u16 glyphId, bool32 isJapanese) for(i = 0; i < 0x80; i++) { - gGlyphInfo[i] = lastColor | lastColor << 4; + gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // Game Freak, please. writing the same values over and over... - gGlyphInfo[0x80] = 10; - gGlyphInfo[0x81] = 12; + gGlyphInfo.width = 10; + gGlyphInfo.height = 12; } } else { glyphs = sFont2JapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7)); - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20)); - DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40)); - DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo + 0x60)); - gGlyphInfo[0x80] = 10; - gGlyphInfo[0x81] = 12; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = 10; + gGlyphInfo.height = 12; } } else @@ -1548,21 +1547,21 @@ static void DecompressGlyphFont4(u16 glyphId, bool32 isJapanese) for(i = 0; i < 0x80; i++) { - gGlyphInfo[i] = lastColor | lastColor << 4; + gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // Game Freak, please. writing the same values over and over... - gGlyphInfo[0x80] = 10; - gGlyphInfo[0x81] = 12; + gGlyphInfo.width = 10; + gGlyphInfo.height = 12; } } else { glyphs = sFont4JapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7)); - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20)); - DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40)); - DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo + 0x60)); - gGlyphInfo[0x80] = sFont4JapaneseGlyphWidths[glyphId]; - gGlyphInfo[0x81] = 12; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = sFont4JapaneseGlyphWidths[glyphId]; + gGlyphInfo.height = 12; } } else @@ -1573,21 +1572,21 @@ static void DecompressGlyphFont4(u16 glyphId, bool32 isJapanese) for(i = 0; i < 0x80; i++) { - gGlyphInfo[i] = lastColor | lastColor << 4; + gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // but why - gGlyphInfo[0x80] = sFont4LatinGlyphWidths[0]; - gGlyphInfo[0x81] = 14; + gGlyphInfo.width = sFont4LatinGlyphWidths[0]; + gGlyphInfo.height = 14; } } else { glyphs = sFont4LatinGlyphs + (0x20 * glyphId); - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20)); - DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo + 0x40)); - DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo + 0x60)); - gGlyphInfo[0x80] = sFont4LatinGlyphWidths[glyphId]; - gGlyphInfo[0x81] = 14; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = sFont4LatinGlyphWidths[glyphId]; + gGlyphInfo.height = 14; } } } @@ -1619,21 +1618,21 @@ void DecompressGlyphFont5(u16 glyphId, bool32 isJapanese) for(i = 0; i < 0x80; i++) { - gGlyphInfo[i] = lastColor | lastColor << 4; + gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // Game Freak, please. writing the same values over and over... - gGlyphInfo[0x80] = 10; - gGlyphInfo[0x81] = 12; + gGlyphInfo.width = 10; + gGlyphInfo.height = 12; } } else { glyphs = sFont5JapaneseGlyphs + (0x100 * (glyphId >> 0x3)) + (0x10 * (glyphId & 0x7)); - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20)); - DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40)); - DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo + 0x60)); - gGlyphInfo[0x80] = sFont5JapaneseGlyphWidths[glyphId]; - gGlyphInfo[0x81] = 12; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x88, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = sFont5JapaneseGlyphWidths[glyphId]; + gGlyphInfo.height = 12; } } else @@ -1644,21 +1643,21 @@ void DecompressGlyphFont5(u16 glyphId, bool32 isJapanese) for(i = 0; i < 0x80; i++) { - gGlyphInfo[i] = lastColor | lastColor << 4; + gGlyphInfo.pixels[i] = lastColor | lastColor << 4; // but why - gGlyphInfo[0x80] = sFont5LatinGlyphWidths[0]; - gGlyphInfo[0x81] = 14; + gGlyphInfo.width = sFont5LatinGlyphWidths[0]; + gGlyphInfo.height = 14; } } else { glyphs = sFont5LatinGlyphs + (0x20 * glyphId); - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo + 0x20)); - DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo + 0x40)); - DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo + 0x60)); - gGlyphInfo[0x80] = sFont5LatinGlyphWidths[glyphId]; - gGlyphInfo[0x81] = 14; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x8, (u16 *)(gGlyphInfo.pixels + 0x20)); + DecompressGlyphTile(glyphs + 0x10, (u16 *)(gGlyphInfo.pixels + 0x40)); + DecompressGlyphTile(glyphs + 0x18, (u16 *)(gGlyphInfo.pixels + 0x60)); + gGlyphInfo.width = sFont5LatinGlyphWidths[glyphId]; + gGlyphInfo.height = 14; } } } @@ -1679,8 +1678,8 @@ s32 GetGlyphWidthFont5(u16 glyphId, bool32 isJapanese) void DecompressGlyphFont9(u16 glyphId) { const u16* glyphs = sFont9JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & 0xF)); - DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo); - DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo + 0x40)); - gGlyphInfo[0x80] = 8; - gGlyphInfo[0x81] = 12; + DecompressGlyphTile(glyphs, (u16 *)gGlyphInfo.pixels); + DecompressGlyphTile(glyphs + 0x80, (u16 *)(gGlyphInfo.pixels + 0x40)); + gGlyphInfo.width = 8; + gGlyphInfo.height = 12; } diff --git a/src/text_printer.c b/src/text_printer.c index c39bc04e3..6f7cf788c 100644 --- a/src/text_printer.c +++ b/src/text_printer.c @@ -1,10 +1,6 @@ #include "global.h" -#include "main.h" -#include "palette.h" -#include "string_util.h" #include "window.h" #include "text.h" -#include "blit.h" static EWRAM_DATA struct TextPrinter sTempTextPrinter = {0}; static EWRAM_DATA struct TextPrinter sTextPrinters[NUM_TEXT_PRINTERS] = {0}; @@ -15,7 +11,7 @@ static u16 sLastTextFgColor; static u16 sLastTextShadowColor; const struct FontInfo *gFonts; -u8 gGlyphInfo[0x90]; +struct GlyphInfo gGlyphInfo; static const u8 sFontHalfRowOffsets[] = { @@ -213,68 +209,68 @@ u8 GetLastTextColor(u8 colorType) } } -#define GLYPH_COPY(widthOffset, heightOffset, width, height, a4, a5, a6, sizeX) \ -{ \ - int xAdd, v1, yAdd, v3, toOrr, bits; \ - u8 * src, * dst; \ - u32 v8; \ - \ - src = gGlyphInfo + (heightOffset / 8 * 0x40) + (widthOffset / 8 * 0x20); \ - for (yAdd = 0, v3 = a6 + heightOffset; yAdd < height; yAdd++, v3++) \ - { \ - v8 = *(u32 *)src; \ - for (xAdd = 0, v1 = a5 + widthOffset; xAdd < width; xAdd++, v1++) \ - { \ - dst = (u8 *)((a4) + ((v1 >> 1) & 3) + ((v1 >> 3) << 5) + (((v3 >> 3) * (sizeX)) << 5) + ((u32)(v3 << 29) >> 27)); \ - toOrr = (v8 >> (xAdd * 4)) & 0xF; \ - if (toOrr != 0) \ - { \ - bits = (v1 & 1) * 4; \ - *dst = (toOrr << bits) | (*dst & (0xF0 >> bits)); \ - } \ - } \ - src += 4; \ - } \ +#define GLYPH_COPY(widthOffset, heightOffset, width, height, tilesDest, left, top, sizeX) \ +{ \ + int xAdd, xpos, yAdd, ypos, toOrr, bits; \ + u8 * src, * dst; \ + u32 _8pixbuf; \ + \ + src = gGlyphInfo.pixels + (heightOffset / 8 * 0x40) + (widthOffset / 8 * 0x20); \ + for (yAdd = 0, ypos = top + heightOffset; yAdd < height; yAdd++, ypos++) \ + { \ + _8pixbuf = *(u32 *)src; \ + for (xAdd = 0, xpos = left + widthOffset; xAdd < width; xAdd++, xpos++) \ + { \ + dst = (u8 *)((tilesDest) + ((xpos >> 1) & 3) + ((xpos >> 3) << 5) + (((ypos >> 3) * (sizeX)) << 5) + ((u32)(ypos << 29) >> 27)); \ + toOrr = (_8pixbuf >> (xAdd * 4)) & 0xF; \ + if (toOrr != 0) \ + { \ + bits = (xpos & 1) * 4; \ + *dst = (toOrr << bits) | (*dst & (0xF0 >> bits)); \ + } \ + } \ + src += 4; \ + } \ } void CopyGlyphToWindow(struct TextPrinter *textPrinter) { - int r0, r1; - u8 r2; + int glyphWidth, glyphHeight; + u8 sizeType; - if (gWindows[textPrinter->printerTemplate.windowId].window.width * 8 - textPrinter->printerTemplate.currentX < gGlyphInfo[0x80]) - r0 = gWindows[textPrinter->printerTemplate.windowId].window.width * 8 - textPrinter->printerTemplate.currentX; + if (gWindows[textPrinter->printerTemplate.windowId].window.width * 8 - textPrinter->printerTemplate.currentX < gGlyphInfo.width) + glyphWidth = gWindows[textPrinter->printerTemplate.windowId].window.width * 8 - textPrinter->printerTemplate.currentX; else - r0 = gGlyphInfo[0x80]; - if (gWindows[textPrinter->printerTemplate.windowId].window.height * 8 - textPrinter->printerTemplate.currentY < gGlyphInfo[0x81]) - r1 = gWindows[textPrinter->printerTemplate.windowId].window.height * 8 - textPrinter->printerTemplate.currentY; + glyphWidth = gGlyphInfo.width; + if (gWindows[textPrinter->printerTemplate.windowId].window.height * 8 - textPrinter->printerTemplate.currentY < gGlyphInfo.height) + glyphHeight = gWindows[textPrinter->printerTemplate.windowId].window.height * 8 - textPrinter->printerTemplate.currentY; else - r1 = gGlyphInfo[0x81]; - - r2 = 0; - if (r0 > 8) - r2 |= 1; - if (r1 > 8) - r2 |= 2; + glyphHeight = gGlyphInfo.height; + + sizeType = 0; + if (glyphWidth > 8) + sizeType |= 1; + if (glyphHeight > 8) + sizeType |= 2; - switch (r2) + switch (sizeType) { - case 0: - GLYPH_COPY(0, 0, r0, r1, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); + case 0: // ≤ 8x8 + GLYPH_COPY(0, 0, glyphWidth, glyphHeight, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); return; - case 1: - GLYPH_COPY(0, 0, 8, r1, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); - GLYPH_COPY(8, 0, r0 - 8, r1, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); + case 1: // ≤ 16x8 + GLYPH_COPY(0, 0, 8, glyphHeight, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); + GLYPH_COPY(8, 0, glyphWidth - 8, glyphHeight, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); return; - case 2: - GLYPH_COPY(0, 0, r0, 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); - GLYPH_COPY(0, 8, r0, r1 - 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); + case 2: // ≤ 8x16 + GLYPH_COPY(0, 0, glyphWidth, 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); + GLYPH_COPY(0, 8, glyphWidth, glyphHeight - 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); return; - case 3: + case 3: // ≤ 16x16 GLYPH_COPY(0, 0, 8, 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); - GLYPH_COPY(8, 0, r0 - 8, 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); - GLYPH_COPY(0, 8, 8, r1 - 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); - GLYPH_COPY(8, 8, r0 - 8, r1 - 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); + GLYPH_COPY(8, 0, glyphWidth - 8, 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); + GLYPH_COPY(0, 8, 8, glyphHeight - 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); + GLYPH_COPY(8, 8, glyphWidth - 8, glyphHeight - 8, gWindows[textPrinter->printerTemplate.windowId].tileData, textPrinter->printerTemplate.currentX, textPrinter->printerTemplate.currentY, ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8 + ((gWindows[textPrinter->printerTemplate.windowId].window.width * 8) & 7)) >> 3)); return; } } @@ -285,14 +281,14 @@ void sub_8003614(void * tileData, u16 currentX, u16 currentY, u16 width, u16 hei u8 r2; u16 r3; - if (width - currentX < gGlyphInfo[0x80]) + if (width - currentX < gGlyphInfo.width) r0 = width - currentX; else - r0 = gGlyphInfo[0x80]; - if (height - currentY < gGlyphInfo[0x81]) + r0 = gGlyphInfo.width; + if (height - currentY < gGlyphInfo.height) r1 = height - currentY; else - r1 = gGlyphInfo[0x81]; + r1 = gGlyphInfo.height; r2 = 0; r3 = (width + (width & 7)) >> 3; diff --git a/src/trade_scene.c b/src/trade_scene.c index b259ba939..f2372a42c 100644 --- a/src/trade_scene.c +++ b/src/trade_scene.c @@ -134,7 +134,7 @@ static void BufferInGameTradeMonName(void); static void GetInGameTradeMail(struct MailStruct * mail, const struct InGameTrade * inGameTrade); static void CB2_RunTradeAnim_LinkTrade(void); static void CB2_WaitAndAckTradeComplete(void); -static void sub_8053E8C(void); +static void CB2_HandleTradeEnded(void); static void LinkTrade_TearDownAssets(void); static void Task_WaitFadeAndStartInGameTradeAnim(u8 taskId); static void CheckPartnersMonForRibbons(void); @@ -144,26 +144,26 @@ static void Task_CloseCenterWhiteColumn(u8 taskId); static const u16 sTradeBallPalette[] = INCBIN_U16("graphics/trade/ball.gbapal"); static const u8 sTradeBallTiles[] = INCBIN_U8("graphics/trade/ball.4bpp"); -static const u8 gUnknown_826267C[] = INCBIN_U8("graphics/trade/pokeball_symbol.8bpp"); -static const u16 gUnknown_826407C[] = INCBIN_U16("graphics/trade/cable_closeup_map.bin"); -static const u16 gUnknown_083307C0[] = INCBIN_U16("graphics/trade/pokeball_symbol_map.bin"); +static const u8 sPokeballSymbolTiles[] = INCBIN_U8("graphics/trade/pokeball_symbol.8bpp"); +static const u16 sCableCloseupMap[] = INCBIN_U16("graphics/trade/cable_closeup_map.bin"); +static const u16 sPokeballSymbolMap[] = INCBIN_U16("graphics/trade/pokeball_symbol_map.bin"); static const u16 sUnref_083308C0[] = INCBIN_U16("graphics/trade/unknown_3308C0.gbapal"); static const u16 sTradeGbaPal[] = 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 sShadowPalette[] = INCBIN_U16("graphics/trade/shadow.gbapal"); +static const u16 sBlackPalette[] = INCBIN_U16("graphics/trade/black.gbapal"); static const u16 sTradeGlowPal[] = INCBIN_U16("graphics/trade/misc.gbapal"); static const u8 sTradeGlow1Tiles[] = INCBIN_U8("graphics/trade/glow1.4bpp"); static const u8 sTradeGlow2Tiles[] = INCBIN_U8("graphics/trade/glow2.4bpp"); static const u8 sTradeCableEndTiles[] = INCBIN_U8("graphics/trade/cable_end.4bpp"); static const u8 sTradeGBAScreenTiles[] = INCBIN_U8("graphics/trade/gba_screen.4bpp"); -const u16 gUnknown_826601C[] = INCBIN_U16("graphics/trade/shadow_map.bin"); -static const u8 gUnknown_826701C[] = INCBIN_U8("graphics/trade/gba_affine.8bpp"); +const u16 gTradeOrHatchMonShadowTilemap[] = INCBIN_U16("graphics/trade/shadow_map.bin"); +static const u8 sGbaAffineTiles[] = INCBIN_U8("graphics/trade/gba_affine.8bpp"); static const u8 sFiller_08335760[64] = {}; -static const u8 gUnknown_826985C[] = INCBIN_U8("graphics/trade/gba_affine_map_cable.bin"); -static const u8 gUnknown_826995C[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin"); -static const u16 gUnknown_8269A5C[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin"); -static const u16 gUnknown_826AA5C[] = INCBIN_U16("graphics/trade/gba_map_cable.bin"); -static const u32 sUnknown_3379A0Bin[] = INCBIN_U32("graphics/trade/unknown_3379A0.bin.lz"); +static const u8 sGbaAffineMapCable[] = INCBIN_U8("graphics/trade/gba_affine_map_cable.bin"); +static const u8 sGbaAffineMapWireless[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin"); +static const u16 sGbaMapWireless[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin"); +static const u16 sGbaMapCable[] = INCBIN_U16("graphics/trade/gba_map_cable.bin"); +static const u32 sWirelessCloseupMap[] = INCBIN_U32("graphics/trade/unknown_3379A0.bin.lz"); static const u16 sWirelessSignalAnimPals_Outbound[] = INCBIN_U16("graphics/trade/wireless_signal_send.gbapal"); static const u16 sWirelessSignalAnimPals_Inbound[] = INCBIN_U16("graphics/trade/wireless_signal_receive.gbapal"); static const u16 sWirelessSignalAnimPals_Off[] = INCBIN_U16("graphics/trade/black.gbapal"); @@ -466,7 +466,7 @@ static const union AffineAnimCmd *const sSpriteAffineAnimTable_PlayerPokePicAlt[ #include "data/ingame_trades.h" -static const struct WindowTemplate gUnknown_826D1BC[] = { +static const struct WindowTemplate sTradeMessageWindowTemplates[] = { { .bg = 0, .tilemapLeft = 2, @@ -488,7 +488,7 @@ const struct WindowTemplate gTradeEvolutionSceneYesNoWindowTemplate = { .baseBlock = 0x0bc }; -static const struct BgTemplate gUnknown_826D1D4[] = { +static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 3, @@ -721,7 +721,7 @@ static void CheckLinkTimeout(void) sTradeData->linkTimeoutCheck2 = sTradeData->linkTimeoutCheck1; } -static u32 GetMultiplayerIdIfLinkTrade(void) +static u32 GetMultiplayerIdOfLinkTrade(void) { if (gReceivedRemoteLinkPlayers) return GetMultiplayerId(); @@ -929,7 +929,7 @@ static void TradeAnimInit_LoadGfx(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetBgsAndClearDma3BusyFlags(FALSE); - InitBgsFromTemplates(0, gUnknown_826D1D4, NELEMS(gUnknown_826D1D4)); + InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE)); @@ -941,7 +941,7 @@ static void TradeAnimInit_LoadGfx(void) LZDecompressWram(gBattleTextboxTilemap, gDecompressionBuffer); CopyToBgTilemapBuffer(0, gDecompressionBuffer, BG_SCREEN_SIZE, 0); LoadCompressedPalette(gBattleTextboxPalette, 0x000, 0x20); - InitWindows(gUnknown_826D1BC); + InitWindows(sTradeMessageWindowTemplates); // ... and doing the same load again DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0); LZDecompressWram(gBattleTextboxTilemap, gDecompressionBuffer); @@ -1123,7 +1123,7 @@ static void SetTradeSequenceBgGpuRegs(u8 state) SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256); LoadPalette(gTradeGba2_Pal, 0x10, 0x60); DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(1), 0x1420, 0x1000); - DmaCopy16Defvars(3, gUnknown_826601C, (void *)BG_SCREEN_ADDR(18), 0x1000); + DmaCopy16Defvars(3, gTradeOrHatchMonShadowTilemap, (void *)BG_SCREEN_ADDR(18), 0x1000); break; case 1: sTradeData->bg1hofs = 0; @@ -1133,11 +1133,11 @@ static void SetTradeSequenceBgGpuRegs(u8 state) SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT256x512); if (sTradeData->isCableTrade) { - DmaCopy16Defvars(3, gUnknown_826AA5C, (void *)BG_SCREEN_ADDR(5), 0x1000); + DmaCopy16Defvars(3, sGbaMapCable, (void *)BG_SCREEN_ADDR(5), 0x1000); } else { - DmaCopy16Defvars(3, gUnknown_8269A5C, (void *)BG_SCREEN_ADDR(5), 0x1000); + DmaCopy16Defvars(3, sGbaMapWireless, (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); @@ -1148,13 +1148,13 @@ static void SetTradeSequenceBgGpuRegs(u8 state) if (!sTradeData->isCableTrade) { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); - LZ77UnCompVram(sUnknown_3379A0Bin, (void *)BG_SCREEN_ADDR(5)); + LZ77UnCompVram(sWirelessCloseupMap, (void *)BG_SCREEN_ADDR(5)); BlendPalettes(0x000000008, 0x10, RGB_BLACK); } else { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); - DmaCopy16Defvars(3, gUnknown_826407C, (void *)BG_SCREEN_ADDR(5), 0x800); + DmaCopy16Defvars(3, sCableCloseupMap, (void *)BG_SCREEN_ADDR(5), 0x800); BlendPalettes(0x00000001, 0x10, RGB_BLACK); } break; @@ -1173,14 +1173,14 @@ static void SetTradeSequenceBgGpuRegs(u8 state) sTradeData->sXY = 0x20; sTradeData->bg2Zoom = 0x400; sTradeData->bg2alpha = 0; - DmaCopyLarge16(3, gUnknown_826701C, (void *)BG_CHAR_ADDR(1), 0x2840, 0x1000); + DmaCopyLarge16(3, sGbaAffineTiles, (void *)BG_CHAR_ADDR(1), 0x2840, 0x1000); if (sTradeData->isCableTrade) { - DmaCopy16Defvars(3, gUnknown_826985C, (void *)BG_SCREEN_ADDR(18), 0x100); + DmaCopy16Defvars(3, sGbaAffineMapCable, (void *)BG_SCREEN_ADDR(18), 0x100); } else { - DmaCopy16Defvars(3, gUnknown_826995C, (void *)BG_SCREEN_ADDR(18), 0x100); + DmaCopy16Defvars(3, sGbaAffineMapWireless, (void *)BG_SCREEN_ADDR(18), 0x100); } break; case 5: @@ -1197,14 +1197,14 @@ static void SetTradeSequenceBgGpuRegs(u8 state) sTradeData->bg2srcX = 0x78; sTradeData->bg2srcY = 0x50; sTradeData->bg2alpha = 0; - DmaCopyLarge16(3, gUnknown_826701C, BG_CHAR_ADDR(1), 0x2840, 0x1000); + DmaCopyLarge16(3, sGbaAffineTiles, BG_CHAR_ADDR(1), 0x2840, 0x1000); if (sTradeData->isCableTrade) { - DmaCopy16Defvars(3, gUnknown_826985C, (void *)BG_SCREEN_ADDR(18), 0x100); + DmaCopy16Defvars(3, sGbaAffineMapCable, (void *)BG_SCREEN_ADDR(18), 0x100); } else { - DmaCopy16Defvars(3, gUnknown_826995C, (void *)BG_SCREEN_ADDR(18), 0x100); + DmaCopy16Defvars(3, sGbaAffineMapWireless, (void *)BG_SCREEN_ADDR(18), 0x100); } break; case 7: @@ -1214,7 +1214,7 @@ static void SetTradeSequenceBgGpuRegs(u8 state) SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256); LoadPalette(gTradeGba2_Pal, 0x10, 0x60); DmaCopyLarge16(3, gTradeGba_Gfx, (void *)BG_CHAR_ADDR(1), 0x1420, 0x1000); - DmaCopy16Defvars(3, gUnknown_826601C, (void *)BG_SCREEN_ADDR(18), 0x1000); + DmaCopy16Defvars(3, gTradeOrHatchMonShadowTilemap, (void *)BG_SCREEN_ADDR(18), 0x1000); break; } } @@ -2279,7 +2279,7 @@ static bool8 DoTradeAnim_Wireless(void) return FALSE; } -static void sub_8053788(void) +static void CB2_TryEvolveAfterTrade(void) { u16 evoSpecies; switch (gMain.state) @@ -2289,12 +2289,12 @@ static void sub_8053788(void) gSoftResetDisabled = TRUE; break; case 4: - gCB2_AfterEvolution = sub_8053E8C; + gCB2_AfterEvolution = CB2_HandleTradeEnded; evoSpecies = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[0]], EVO_MODE_TRADE, 0); if (evoSpecies != SPECIES_NONE) TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[0]], evoSpecies, sTradeData->pokePicSpriteIdxs[1], gSelectedTradeMonPositions[0]); else - SetMainCallback2(sub_8053E8C); + SetMainCallback2(CB2_HandleTradeEnded); gSelectedTradeMonPositions[0] = 0xFF; break; } @@ -2308,12 +2308,12 @@ static void sub_8053788(void) static void HandleLinkDataReceive(void) { u8 recvStatus; - GetMultiplayerIdIfLinkTrade(); + GetMultiplayerIdOfLinkTrade(); recvStatus = GetBlockReceivedStatus(); if (recvStatus & (1 << 0)) { if (gBlockRecvBuffer[0][0] == 0xDCBA) - SetMainCallback2(sub_8053788); + SetMainCallback2(CB2_TryEvolveAfterTrade); if (gBlockRecvBuffer[0][0] == 0xABCD) sTradeData->tradeStatus1 = 1; ResetBlockReceivedFlag(0); @@ -2521,7 +2521,7 @@ static void CB2_RunTradeAnim_LinkTrade(void) static void CB2_WaitAndAckTradeComplete(void) { - u8 mpId = GetMultiplayerIdIfLinkTrade(); + u8 mpId = GetMultiplayerIdOfLinkTrade(); HandleLinkDataReceive(); if (mpId == 0 && sTradeData->tradeStatus1 == 1 && sTradeData->tradeStatus2 == 1) { @@ -2536,7 +2536,7 @@ static void CB2_WaitAndAckTradeComplete(void) UpdatePaletteFade(); } -static void sub_8053E8C(void) +static void CB2_HandleTradeEnded(void) { switch (gMain.state) { @@ -2587,7 +2587,7 @@ static void sub_8053E8C(void) MEvent_RecordIdOfWonderCardSenderByEventType(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId); } SetContinueGameWarpStatusToDynamicWarp(); - sub_80DA3AC(); + SaveGame_AfterLinkTrade(); gMain.state++; sTradeData->timer = 0; break; @@ -2598,7 +2598,7 @@ static void sub_8053E8C(void) } break; case 52: - if (sub_80DA3D8()) + if (AfterLinkTradeSaveFailed()) { ClearContinueGameWarpStatus2(); gMain.state = 4; @@ -2610,7 +2610,7 @@ static void sub_8053E8C(void) } break; case 4: - sub_80DA40C(); + ClearSaveAfterLinkTradeSaveFailure(); gMain.state = 40; sTradeData->timer = 0; break; diff --git a/src/trainer_card.c b/src/trainer_card.c index f1af00254..d3578dfb7 100644 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -1412,7 +1412,7 @@ static void LoadMonIconGfx(void) { u8 i; - CpuSet(gMonIconPalettes, sTrainerCardDataPtr->monIconPals, NELEMS(sTrainerCardDataPtr->monIconPals)); + CpuCopy16(gMonIconPalettes, sTrainerCardDataPtr->monIconPals, 2 * NELEMS(sTrainerCardDataPtr->monIconPals)); switch (sTrainerCardDataPtr->trainerCard.monIconTint) { case MON_ICON_TINT_NORMAL: diff --git a/src/trainer_see.c b/src/trainer_see.c index 644b87c37..cd7e23ac8 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -356,7 +356,7 @@ static bool8 TrainerSeeFunc_PrepareToEngage(u8 taskId, struct Task * task, struc if (ObjectEventIsMovementOverridden(playerObj) && !ObjectEventClearHeldMovementIfFinished(playerObj)) return FALSE; - sub_805C774(); + CancelPlayerForcedMovement(); // Uncomment to have player turn to face their opponent // ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetFaceDirectionMovementAction(GetOppositeDirection(trainerObj->facingDirection))); task->tFuncId++; diff --git a/src/water.c b/src/water.c index 8a1737e58..5f7fa4dc6 100644 --- a/src/water.c +++ b/src/water.c @@ -1058,7 +1058,7 @@ static void AnimTask_WaterSpoutLaunch_Step(u8 taskId) switch (task->data[0]) { case 0: - sub_80765D4(task, task->data[15], 0x100, 0x100, 224, 0x200, 32); + BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x100, 0x100, 224, 0x200, 32); task->data[0]++; case 1: if (++task->data[3] > 1) @@ -1074,7 +1074,7 @@ static void AnimTask_WaterSpoutLaunch_Step(u8 taskId) gSprites[task->data[15]].pos2.x = -3; } } - if (sub_8076640(task) == 0) + if (BattleAnimHelper_RunSpriteSquash(task) == 0) { SetBattlerSpriteYOffsetFromYScale(task->data[15]); gSprites[task->data[15]].pos2.x = 0; @@ -1086,13 +1086,13 @@ static void AnimTask_WaterSpoutLaunch_Step(u8 taskId) case 2: if (++task->data[3] > 4) { - sub_80765D4(task, task->data[15], 224, 0x200, 384, 224, 8); + BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 224, 0x200, 384, 224, 8); task->data[3] = 0; task->data[0]++; } break; case 3: - if (sub_8076640(task) == 0) + if (BattleAnimHelper_RunSpriteSquash(task) == 0) { task->data[3] = 0; task->data[4] = 0; @@ -1112,7 +1112,7 @@ static void AnimTask_WaterSpoutLaunch_Step(u8 taskId) gSprites[task->data[15]].pos2.y -= 2; if (task->data[4] == 10) { - sub_80765D4(task, task->data[15], 384, 224, 0x100, 0x100, 8); + BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 384, 224, 0x100, 0x100, 8); task->data[3] = 0; task->data[4] = 0; task->data[0]++; @@ -1121,7 +1121,7 @@ static void AnimTask_WaterSpoutLaunch_Step(u8 taskId) break; case 6: gSprites[task->data[15]].pos1.y--; - if (sub_8076640(task) == 0) + if (BattleAnimHelper_RunSpriteSquash(task) == 0) { ResetSpriteRotScale(task->data[15]); gSprites[task->data[15]].pos1.y = task->data[5]; diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 4754d9d4f..5c3e59fde 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -354,7 +354,7 @@ static bool8 DoGlobalWildEncounterDiceRoll(void) return TRUE; } -bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavior) +bool8 StandardWildEncounter(u32 currMetatileAttrs, u16 previousMetatileBehavior) { u16 headerId; struct Roamer * roamer; @@ -365,11 +365,11 @@ bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavi headerId = GetCurrentMapWildMonHeaderId(); if (headerId != 0xFFFF) { - if (GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, METATILE_ATTRIBUTE_ENCOUNTER_TYPE) == TILE_ENCOUNTER_LAND) + if (GetMetatileAttributeFromRawMetatileBehavior(currMetatileAttrs, METATILE_ATTRIBUTE_ENCOUNTER_TYPE) == TILE_ENCOUNTER_LAND) { if (gWildMonHeaders[headerId].landMonsInfo == NULL) return FALSE; - else if (previousMetatileBehavior != GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, METATILE_ATTRIBUTE_BEHAVIOR) && !DoGlobalWildEncounterDiceRoll()) + else if (previousMetatileBehavior != GetMetatileAttributeFromRawMetatileBehavior(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR) && !DoGlobalWildEncounterDiceRoll()) return FALSE; if (DoWildEncounterRateTest(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) { @@ -403,12 +403,12 @@ bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavi } } } - else if (GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, METATILE_ATTRIBUTE_ENCOUNTER_TYPE) == TILE_ENCOUNTER_WATER - || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, METATILE_ATTRIBUTE_BEHAVIOR)) == TRUE)) + else if (GetMetatileAttributeFromRawMetatileBehavior(currMetatileAttrs, METATILE_ATTRIBUTE_ENCOUNTER_TYPE) == TILE_ENCOUNTER_WATER + || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(GetMetatileAttributeFromRawMetatileBehavior(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR)) == TRUE)) { if (gWildMonHeaders[headerId].waterMonsInfo == NULL) return FALSE; - else if (previousMetatileBehavior != GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, METATILE_ATTRIBUTE_BEHAVIOR) && !DoGlobalWildEncounterDiceRoll()) + else if (previousMetatileBehavior != GetMetatileAttributeFromRawMetatileBehavior(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR) && !DoGlobalWildEncounterDiceRoll()) return FALSE; else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE) { @@ -707,9 +707,9 @@ void ResetEncounterRateModifiers(void) sWildEncounterData.stepsSinceLastEncounter = 0; } -static bool8 HandleWildEncounterCooldown(u32 currMetatileBehavior) +static bool8 HandleWildEncounterCooldown(u32 currMetatileAttrs) { - u8 encounterType = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, METATILE_ATTRIBUTE_ENCOUNTER_TYPE); + u8 encounterType = GetMetatileAttributeFromRawMetatileBehavior(currMetatileAttrs, METATILE_ATTRIBUTE_ENCOUNTER_TYPE); u32 minSteps; u32 encRate; if (encounterType == TILE_ENCOUNTER_NONE) @@ -757,23 +757,23 @@ static bool8 HandleWildEncounterCooldown(u32 currMetatileBehavior) return FALSE; } -bool8 TryStandardWildEncounter(u32 currMetatileBehavior) +bool8 TryStandardWildEncounter(u32 currMetatileAttrs) { - if (!HandleWildEncounterCooldown(currMetatileBehavior)) + if (!HandleWildEncounterCooldown(currMetatileAttrs)) { - sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, METATILE_ATTRIBUTE_BEHAVIOR); + sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR); return FALSE; } - else if (StandardWildEncounter(currMetatileBehavior, sWildEncounterData.prevMetatileBehavior) == TRUE) + else if (StandardWildEncounter(currMetatileAttrs, sWildEncounterData.prevMetatileBehavior) == TRUE) { sWildEncounterData.encounterRateBuff = 0; sWildEncounterData.stepsSinceLastEncounter = 0; - sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, METATILE_ATTRIBUTE_BEHAVIOR); + sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR); return TRUE; } else { - sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, METATILE_ATTRIBUTE_BEHAVIOR); + sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileAttrs, METATILE_ATTRIBUTE_BEHAVIOR); return FALSE; } } |