Merge pull request #1000 from GriffinRichards/doc-dex

Document pokedex.c
This commit is contained in:
PikalaxALT
2020-03-17 10:43:57 -04:00
committed by GitHub
31 changed files with 3847 additions and 3434 deletions
+1 -1
View File
@@ -1,2 +1,2 @@
gUnusedPokedexU8 gUnusedPokedexU8
gUnknown_030060B4 gPokedexVBlankCB
Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 B

After

Width:  |  Height:  |  Size: 135 B

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

File diff suppressed because it is too large Load Diff
+16 -17
View File
@@ -3282,25 +3282,24 @@ extern const u32 gBattleTerrainPalette_StadiumDrake[];
extern const u32 gBattleTerrainPalette_StadiumWallace[]; extern const u32 gBattleTerrainPalette_StadiumWallace[];
// pokedex // pokedex
extern const u32 gPokedexMenu2_Gfx[]; extern const u32 gPokedexInterface_Gfx[];
extern const u16 gPokedexText_Pal[]; extern const u16 gPokedexBgHoenn_Pal[];
extern const u32 gPokedexMenu_Gfx[]; extern const u32 gPokedexMenu_Gfx[];
extern const u8 gPokedexTilemap_Main[]; extern const u8 gPokedexList_Tilemap[];
extern const u8 gPokedexTilemap_MainUnderlay[]; extern const u8 gPokedexListUnderlay_Tilemap[];
extern const u8 gPokedexTilemap_StartMenu1[]; extern const u8 gPokedexStartMenuMain_Tilemap[];
extern const u8 gPokedexTilemap_StartMenu2[]; extern const u8 gPokedexStartMenuSearchResults_Tilemap[];
extern const u16 gPokedexHoennBg_Pal[]; extern const u16 gPokedexSearchResults_Pal[];
extern const u16 gPokedexText_Pal[]; extern const u16 gPokedexBgNational_Pal[];
extern const u16 gPokedexNationalBg_Pal[]; extern const u8 gPokedexInfoScreen_Tilemap[];
extern const u8 gPokedexTilemap_DescriptionScreen[]; extern const u8 gPokedexCryScreen_Tilemap[];
extern const u8 gPokedexTilemap_CryScreen[]; extern const u8 gPokedexSizeScreen_Tilemap[];
extern const u8 gPokedexTilemap_SizeScreen[]; extern const u8 gPokedexScreenSelectBarMain_Tilemap[];
extern const u8 gPokedexTilemap_ScreenSelectBar1[]; extern const u8 gPokedexScreenSelectBarSubmenu_Tilemap[];
extern const u8 gPokedexTilemap_ScreenSelectBar2[]; extern const u16 gPokedexCaughtScreen_Pal[];
extern const u16 gPokedexCaughtScreenFade_Pal[];
extern const u32 gPokedexSearchMenu_Gfx[]; extern const u32 gPokedexSearchMenu_Gfx[];
extern const u32 gPokedexSearch2_Tilemap[]; extern const u32 gPokedexSearchMenuHoenn_Tilemap[];
extern const u32 gPokedexSearch1_Tilemap[]; extern const u32 gPokedexSearchMenuNational_Tilemap[];
extern const u16 gPokedexSearchMenu_Pal[]; extern const u16 gPokedexSearchMenu_Pal[];
// berry tag screen // berry tag screen
+3 -7
View File
@@ -2,11 +2,7 @@
#define GUARD_POKEDEX_H #define GUARD_POKEDEX_H
extern u8 gUnusedPokedexU8; extern u8 gUnusedPokedexU8;
extern void (*gUnknown_030060B4)(void); extern void (*gPokedexVBlankCB)(void);
#define KANTO_DEX_COUNT 151
#define HOENN_DEX_COUNT 202
#define NATIONAL_DEX_COUNT 386
enum enum
{ {
@@ -39,12 +35,12 @@ void ResetPokedex(void);
u16 GetPokedexHeightWeight(u16 dexNum, u8 data); u16 GetPokedexHeightWeight(u16 dexNum, u8 data);
u16 GetNationalPokedexCount(u8); u16 GetNationalPokedexCount(u8);
u16 GetHoennPokedexCount(u8); u16 GetHoennPokedexCount(u8);
u8 CreateDexDisplayMonDataTask(u16 dexNum, u32 trainerId, u32 personality); u8 DisplayCaughtMonDexPage(u16 dexNum, u32 otId, u32 personality);
s8 GetSetPokedexFlag(u16 nationalNum, u8 caseId); s8 GetSetPokedexFlag(u16 nationalNum, u8 caseId);
u16 CreateMonSpriteFromNationalDexNumber(u16, s16, s16, u16); u16 CreateMonSpriteFromNationalDexNumber(u16, s16, s16, u16);
bool16 HasAllHoennMons(void); bool16 HasAllHoennMons(void);
void ResetPokedexScrollPositions(void); void ResetPokedexScrollPositions(void);
bool16 HasAllMons(void); bool16 HasAllMons(void);
void CB2_Pokedex(void); void CB2_OpenPokedex(void);
#endif // GUARD_POKEDEX_H #endif // GUARD_POKEDEX_H
+8 -8
View File
@@ -1,10 +1,10 @@
#ifndef GUARD_POKEDEX_CRY_SCREEN_H #ifndef GUARD_POKEDEX_CRY_SCREEN_H
#define GUARD_POKEDEX_CRY_SCREEN_H #define GUARD_POKEDEX_CRY_SCREEN_H
struct CryRelatedStruct struct CryScreenWindow
{ {
u16 unk0; u16 unk0; // Assigned to val that's never read
u8 unk2; u8 unk2; // Never read
u8 paletteNo; u8 paletteNo;
u8 xPos; u8 xPos;
u8 yPos; u8 yPos;
@@ -12,10 +12,10 @@ struct CryRelatedStruct
extern u8 gDexCryScreenState; extern u8 gDexCryScreenState;
bool8 sub_8145354(struct CryRelatedStruct*, u8); bool8 LoadCryWaveformWindow(struct CryScreenWindow*, u8);
void sub_814545C(u8); void UpdateCryWaveformWindow(u8);
void sub_8145534(u16); void CryScreenPlayButton(u16);
bool8 sub_8145850(struct CryRelatedStruct*, u8); bool8 LoadCryMeter(struct CryScreenWindow*, u8);
void sub_8145914(void); void FreeCryScreen(void);
#endif #endif
+1 -1
View File
@@ -10263,7 +10263,7 @@ static void Cmd_displaydexinfo(void)
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
FreeAllWindowBuffers(); FreeAllWindowBuffers();
gBattleCommunication[TASK_ID] = CreateDexDisplayMonDataTask(SpeciesToNationalPokedexNum(species), gBattleCommunication[TASK_ID] = DisplayCaughtMonDexPage(SpeciesToNationalPokedexNum(species),
gBattleMons[gBattlerTarget].otId, gBattleMons[gBattlerTarget].otId,
gBattleMons[gBattlerTarget].personality); gBattleMons[gBattlerTarget].personality);
gBattleCommunication[0]++; gBattleCommunication[0]++;
+1
View File
@@ -23,6 +23,7 @@
#include "constants/vars.h" #include "constants/vars.h"
#include "event_data.h" #include "event_data.h"
#include "random.h" #include "random.h"
#include "constants/species.h"
enum enum
{ {
+17 -22
View File
@@ -1257,32 +1257,27 @@ const u16 gFrontierPassMapCursor_Pal[] = INCBIN_U16("graphics/frontier_pass/map_
const u16 gFrontierPassMedalsSilver_Pal[] = INCBIN_U16("graphics/frontier_pass/silver.gbapal"); const u16 gFrontierPassMedalsSilver_Pal[] = INCBIN_U16("graphics/frontier_pass/silver.gbapal");
const u16 gFrontierPassMedalsGold_Pal[] = INCBIN_U16("graphics/frontier_pass/gold.gbapal"); const u16 gFrontierPassMedalsGold_Pal[] = INCBIN_U16("graphics/frontier_pass/gold.gbapal");
const u16 gPokedexText_Pal[] = INCBIN_U16("graphics/pokedex/text.gbapal"); // Pokedex
const u16 gPokedexBgHoenn_Pal[] = INCBIN_U16("graphics/pokedex/bg_hoenn.gbapal");
const u16 gPokedexCaughtScreenFade_Pal[] = INCBIN_U16("graphics/pokedex/fade.gbapal"); const u16 gPokedexCaughtScreen_Pal[] = INCBIN_U16("graphics/pokedex/caught_screen.gbapal");
const u16 gPokedexSearchResults_Pal[] = INCBIN_U16("graphics/pokedex/search_results_bg.gbapal");
const u16 gPokedexHoennBg_Pal[] = INCBIN_U16("graphics/pokedex/hoenn_bg.gbapal"); const u16 gPokedexBgNational_Pal[] = INCBIN_U16("graphics/pokedex/bg_national.gbapal");
const u16 gPokedexNationalBg_Pal[] = INCBIN_U16("graphics/pokedex/national_bg.gbapal");
const u32 gPokedexMenu_Gfx[] = INCBIN_U32("graphics/pokedex/menu.4bpp.lz"); const u32 gPokedexMenu_Gfx[] = INCBIN_U32("graphics/pokedex/menu.4bpp.lz");
const u32 gPokedexMenu2_Gfx[] = INCBIN_U32("graphics/pokedex/menu2.4bpp.lz"); const u32 gPokedexInterface_Gfx[] = INCBIN_U32("graphics/pokedex/interface.4bpp.lz");
const u32 gUnused_PokedexNoBall[] = INCBIN_U32("graphics/pokedex/noball_unused.4bpp.lz"); const u32 gUnused_PokedexNoBall[] = INCBIN_U32("graphics/pokedex/noball_unused.4bpp.lz");
const u32 gPokedexStartMenuMain_Tilemap[] = INCBIN_U32("graphics/pokedex/start_menu_main.bin.lz");
const u32 gPokedexTilemap_StartMenu1[] = INCBIN_U32("graphics/pokedex/tilemap1.bin.lz"); const u32 gPokedexStartMenuSearchResults_Tilemap[] = INCBIN_U32("graphics/pokedex/start_menu_search_results.bin.lz");
const u32 gPokedexTilemap_StartMenu2[] = INCBIN_U32("graphics/pokedex/tilemap2.bin.lz"); const u32 gPokedexList_Tilemap[] = INCBIN_U32("graphics/pokedex/list.bin.lz");
const u32 gPokedexTilemap_Main[] = INCBIN_U32("graphics/pokedex/tilemap3.bin.lz"); const u32 gPokedexListUnderlay_Tilemap[] = INCBIN_U32("graphics/pokedex/list_underlay.bin.lz");
const u32 gPokedexTilemap_MainUnderlay[] = INCBIN_U32("graphics/pokedex/tilemap4.bin.lz"); const u32 gPokedexSizeScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/size_screen.bin.lz");
const u32 gPokedexTilemap_SizeScreen[] = INCBIN_U32("graphics/pokedex/tilemap5.bin.lz"); const u32 gPokedexScreenSelectBarMain_Tilemap[] = INCBIN_U32("graphics/pokedex/screen_select_bar_main.bin.lz");
const u32 gPokedexTilemap_ScreenSelectBar1[] = INCBIN_U32("graphics/pokedex/tilemap6.bin.lz"); const u32 gPokedexScreenSelectBarSubmenu_Tilemap[] = INCBIN_U32("graphics/pokedex/screen_select_bar_submenu.bin.lz");
const u32 gPokedexTilemap_ScreenSelectBar2[] = INCBIN_U32("graphics/pokedex/tilemap7.bin.lz"); const u32 gPokedexInfoScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/info_screen.bin.lz");
const u32 gPokedexTilemap_DescriptionScreen[] = INCBIN_U32("graphics/pokedex/tilemap8.bin.lz"); const u32 gPokedexCryScreen_Tilemap[] = INCBIN_U32("graphics/pokedex/cry_screen.bin.lz");
const u32 gPokedexTilemap_CryScreen[] = INCBIN_U32("graphics/pokedex/tilemap9.bin.lz");
const u16 gPokedexSearchMenu_Pal[] = INCBIN_U16("graphics/pokedex/search_menu.gbapal"); const u16 gPokedexSearchMenu_Pal[] = INCBIN_U16("graphics/pokedex/search_menu.gbapal");
const u32 gPokedexSearchMenu_Gfx[] = INCBIN_U32("graphics/pokedex/search_menu.4bpp.lz"); const u32 gPokedexSearchMenu_Gfx[] = INCBIN_U32("graphics/pokedex/search_menu.4bpp.lz");
const u32 gPokedexSearch1_Tilemap[] = INCBIN_U32("graphics/pokedex/search1.bin.lz"); const u32 gPokedexSearchMenuNational_Tilemap[] = INCBIN_U32("graphics/pokedex/search_menu_national.bin.lz");
const u32 gPokedexSearch2_Tilemap[] = INCBIN_U32("graphics/pokedex/search2.bin.lz"); const u32 gPokedexSearchMenuHoenn_Tilemap[] = INCBIN_U32("graphics/pokedex/search_menu_hoenn.bin.lz");
const u16 gSummaryScreenPowAcc_Tilemap[] = INCBIN_U16("graphics/interface/powacc_tilemap.bin"); const u16 gSummaryScreenPowAcc_Tilemap[] = INCBIN_U16("graphics/interface/powacc_tilemap.bin");
+2680 -2318
View File
File diff suppressed because it is too large Load Diff
+21 -19
View File
@@ -66,7 +66,7 @@ struct PokeDexAreaScreen
/*0x6E0*/ u16 numAreaMarkerSprites; /*0x6E0*/ u16 numAreaMarkerSprites;
/*0x6E2*/ u16 unk6E2; /*0x6E2*/ u16 unk6E2;
/*0x6E4*/ u16 unk6E4; /*0x6E4*/ u16 unk6E4;
/*0x6E8*/ u8 *errno; /*0x6E8*/ u8 *screenSwitchState;
/*0x6EC*/ struct RegionMap regionMap; /*0x6EC*/ struct RegionMap regionMap;
/*0xF70*/ u8 charBuffer[0x40]; /*0xF70*/ u8 charBuffer[0x40];
/*0xFB0*/ struct Sprite * areaUnknownSprites[3]; /*0xFB0*/ struct Sprite * areaUnknownSprites[3];
@@ -83,11 +83,11 @@ static u16 GetRegionMapSectionId(u8, u8);
static bool8 MapHasMon(const struct WildPokemonHeader *, u16); static bool8 MapHasMon(const struct WildPokemonHeader *, u16);
static bool8 MonListHasMon(const struct WildPokemonInfo *, u16, u16); static bool8 MonListHasMon(const struct WildPokemonInfo *, u16, u16);
static void DoAreaGlow(void); static void DoAreaGlow(void);
static void Task_PokedexAreaScreen_0(u8); static void Task_ShowPokedexAreaScreen(u8);
static void CreateAreaMarkerSprites(void); static void CreateAreaMarkerSprites(void);
static void LoadAreaUnknownGraphics(void); static void LoadAreaUnknownGraphics(void);
static void CreateAreaUnknownSprites(void); static void CreateAreaUnknownSprites(void);
static void Task_PokedexAreaScreen_1(u8); static void Task_HandlePokedexAreaScreenInput(u8);
static void sub_813D6B4(void); static void sub_813D6B4(void);
static void DestroyAreaMarkerSprites(void); static void DestroyAreaMarkerSprites(void);
@@ -637,21 +637,23 @@ static void DoAreaGlow(void)
} }
} }
void ShowPokedexAreaScreen(u16 species, u8 *errno) #define tState data[0]
void ShowPokedexAreaScreen(u16 species, u8 *screenSwitchState)
{ {
u8 taskId; u8 taskId;
sPokedexAreaScreen = AllocZeroed(sizeof(*sPokedexAreaScreen)); sPokedexAreaScreen = AllocZeroed(sizeof(*sPokedexAreaScreen));
sPokedexAreaScreen->species = species; sPokedexAreaScreen->species = species;
sPokedexAreaScreen->errno = errno; sPokedexAreaScreen->screenSwitchState = screenSwitchState;
errno[0] = 0; screenSwitchState[0] = 0;
taskId = CreateTask(Task_PokedexAreaScreen_0, 0); taskId = CreateTask(Task_ShowPokedexAreaScreen, 0);
gTasks[taskId].data[0] = 0; gTasks[taskId].tState = 0;
} }
static void Task_PokedexAreaScreen_0(u8 taskId) static void Task_ShowPokedexAreaScreen(u8 taskId)
{ {
switch (gTasks[taskId].data[0]) switch (gTasks[taskId].tState)
{ {
case 0: case 0:
ResetSpriteData(); ResetSpriteData();
@@ -702,21 +704,21 @@ static void Task_PokedexAreaScreen_0(u8 taskId)
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON);
break; break;
case 11: case 11:
gTasks[taskId].func = Task_PokedexAreaScreen_1; gTasks[taskId].func = Task_HandlePokedexAreaScreenInput;
gTasks[taskId].data[0] = 0; gTasks[taskId].tState = 0;
return; return;
} }
gTasks[taskId].data[0]++; gTasks[taskId].tState++;
} }
static void Task_PokedexAreaScreen_1(u8 taskId) static void Task_HandlePokedexAreaScreenInput(u8 taskId)
{ {
DoAreaGlow(); DoAreaGlow();
switch (gTasks[taskId].data[0]) switch (gTasks[taskId].tState)
{ {
default: default:
gTasks[taskId].data[0] = 0; gTasks[taskId].tState = 0;
// fall through // fall through
case 0: case 0:
if (gPaletteFade.active) if (gPaletteFade.active)
@@ -737,13 +739,13 @@ static void Task_PokedexAreaScreen_1(u8 taskId)
return; return;
break; break;
case 2: case 2:
BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 16, RGB(0, 0, 0)); BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 16, RGB_BLACK);
break; break;
case 3: case 3:
if (gPaletteFade.active) if (gPaletteFade.active)
return; return;
DestroyAreaMarkerSprites(); DestroyAreaMarkerSprites();
sPokedexAreaScreen->errno[0] = gTasks[taskId].data[1]; sPokedexAreaScreen->screenSwitchState[0] = gTasks[taskId].data[1];
sub_813D6B4(); sub_813D6B4();
DestroyTask(taskId); DestroyTask(taskId);
FreePokedexAreaMapBgNum(); FreePokedexAreaMapBgNum();
@@ -751,7 +753,7 @@ static void Task_PokedexAreaScreen_1(u8 taskId)
return; return;
} }
gTasks[taskId].data[0]++; gTasks[taskId].tState++;
} }
static void sub_813D6B4(void) static void sub_813D6B4(void)
+265 -216
View File
@@ -9,35 +9,53 @@
#include "trig.h" #include "trig.h"
#include "window.h" #include "window.h"
struct PokedexCryVolumeMeter { // Cry meter needle positions
s8 unk0; //
s8 unk1; // 0
u8 unk2; // 32 . . -32
u16 needleSpriteId; // . .
// 64 . . -64
// . .
// . .
// 96 . . -96
// 127
//
#define MIN_NEEDLE_POS 32
#define MAX_NEEDLE_POS -32
#define NEEDLE_MOVE_INCREMENT 5
#define WAVEFORM_WINDOW_HEIGHT 56
struct PokedexCryMeterNeedle {
s8 rotation;
s8 targetRotation;
u8 moveIncrement;
u16 spriteId;
}; };
struct PokedexCryScreen struct PokedexCryScreen
{ {
u8 unk0[16]; u8 cryWaveformBuffer[16];
u8 unk10; u8 cryState;
u8 unk11; u8 playhead;
u8 unk12; u8 waveformPreviousY;
u16 unk14; u16 unk; // Never read
u8 unk16; u8 playStartPos;
u16 species; u16 species;
u8 unk1A; u8 cryOverrideCountdown;
u8 unk1B; u8 cryRepeatDelay;
}; };
static void sub_8145588(u16); static void PlayCryScreenCry(u16);
static void sub_81455A8(void); static void BufferCryWaveformSegment(void);
static void sub_814560C(void); static void DrawWaveformFlatline(void);
static void sub_8145648(u8); static void AdvancePlayhead(u8);
static void sub_81456A8(u8, u8); static void DrawWaveformSegment(u8, u8);
static void sub_8145814(u8); static void DrawWaveformWindow(u8);
static void sub_8145824(u8, s16, u8); static void ShiftWaveformOver(u8, s16, bool8);
static void sub_814596C(struct Sprite *); static void SpriteCB_CryMeterNeedle(struct Sprite *);
static void sub_8145B24(s8); static void SetCryMeterNeedleTarget(s8);
// IWRAM common // IWRAM common
u8 gDexCryScreenState; u8 gDexCryScreenState;
@@ -45,16 +63,16 @@ u8 gDexCryScreenState;
// EWRAM vars // EWRAM vars
static EWRAM_DATA struct PokedexCryScreen *sDexCryScreen = NULL; static EWRAM_DATA struct PokedexCryScreen *sDexCryScreen = NULL;
static EWRAM_DATA u8 *sCryWaveformWindowTiledata = NULL; static EWRAM_DATA u8 *sCryWaveformWindowTiledata = NULL;
static EWRAM_DATA struct PokedexCryVolumeMeter *sCryVolumeMeter = NULL; static EWRAM_DATA struct PokedexCryMeterNeedle *sCryMeterNeedle = NULL;
const u16 CryMeterNeedlePalette[] = INCBIN_U16("graphics/pokedex/cry_meter_needle.gbapal"); static const u16 sCryMeterNeedle_Pal[] = INCBIN_U16("graphics/pokedex/cry_meter_needle.gbapal");
const u8 CryMeterNeedleTiles[] = INCBIN_U8("graphics/pokedex/cry_meter_needle.4bpp"); static const u8 sCryMeterNeedle_Gfx[] = INCBIN_U8("graphics/pokedex/cry_meter_needle.4bpp");
const u16 gUnknown_085B8378[] = INCBIN_U16("graphics/pokedex/cry_meter_map.bin"); static const u16 sCryMeter_Tilemap[] = INCBIN_U16("graphics/pokedex/cry_meter_map.bin"); // Unused
const u16 gUnknown_085B8418[] = INCBIN_U16("graphics/pokedex/cry_meter.gbapal"); static const u16 sCryMeter_Pal[] = INCBIN_U16("graphics/pokedex/cry_meter.gbapal");
const u8 gUnknown_085B8438[] = INCBIN_U8("graphics/pokedex/cry_meter.4bpp.lz"); static const u8 sCryMeter_Gfx[] = INCBIN_U8("graphics/pokedex/cry_meter.4bpp.lz");
const u16 gUnknown_085B8770[][72] = static const u16 sWaveformOffsets[][72] =
{ {
{ {
0x0000, 0x0004, 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0000, 0x0004, 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C,
@@ -139,33 +157,36 @@ const u16 gUnknown_085B8770[][72] =
} }
}; };
const u16 gUnknown_085B8BF0[] = INCBIN_U16("graphics/pokedex/85B8C10.gbapal"); static const u16 sCryScreenBg_Pal[] = INCBIN_U16("graphics/pokedex/cry_screen_bg.gbapal");
const u8 gUnknown_085B8C10[] = INCBIN_U8("graphics/pokedex/85B8C10.4bpp"); static const u8 sCryScreenBg_Gfx[] = INCBIN_U8("graphics/pokedex/cry_screen_bg.4bpp");
const u8 gUnknown_085B8C30[] = {0xF0, 0x0F}; static const u8 sWaveformTileDataNybbleMasks[] = {0xF0, 0x0F};
const u8 gUnknown_085B8C32[][16] =
// Waveform is blue in the middle (8) grading to white at peaks (15)
// Split into two arrays for the two vertical slice halves
static const u8 sWaveformColor[][16] =
{ {
{ {
0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 15, 14, 13, 12, 11, 10, 9, 8,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 8, 9, 10, 11, 12, 13, 14, 15,
}, { }, {
0xF0, 0xE0, 0xD0, 0xC0, 0xB0, 0xA0, 0x90, 0x80, 15 << 4, 14 << 4, 13 << 4, 12 << 4, 11 << 4, 10 << 4, 9 << 4, 8 << 4,
0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0 8 << 4, 9 << 4, 10 << 4, 11 << 4, 12 << 4, 13 << 4, 14 << 4, 15 << 4,
} }
}; };
const union AnimCmd gSpriteAnim_85B8C54[] = static const union AnimCmd sSpriteAnim_CryMeterNeedle[] =
{ {
ANIMCMD_FRAME(0, 30), ANIMCMD_FRAME(0, 30),
ANIMCMD_END ANIMCMD_END
}; };
const union AnimCmd *const gSpriteAnimTable_85B8C5C[] = static const union AnimCmd *const sSpriteAnimTable_CryMeterNeedle[] =
{ {
gSpriteAnim_85B8C54 sSpriteAnim_CryMeterNeedle
}; };
const struct OamData gOamData_85B8C60 = static const struct OamData sOamData_CryMeterNeedle =
{ {
.y = 160, .y = 160,
.affineMode = ST_OAM_AFFINE_NORMAL, .affineMode = ST_OAM_AFFINE_NORMAL,
@@ -179,33 +200,33 @@ const struct OamData gOamData_85B8C60 =
.paletteNum = 0, .paletteNum = 0,
}; };
const struct SpriteTemplate gUnknown_085B8C68 = static const struct SpriteTemplate sCryMeterNeedleSpriteTemplate =
{ {
0x2000, .tileTag = 0x2000,
0x2000, .paletteTag = 0x2000,
&gOamData_85B8C60, .oam = &sOamData_CryMeterNeedle,
gSpriteAnimTable_85B8C5C, .anims = sSpriteAnimTable_CryMeterNeedle,
NULL, .images = NULL,
gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
sub_814596C .callback = SpriteCB_CryMeterNeedle
}; };
const struct SpriteSheet gCryMeterNeedleSpriteSheets[] = static const struct SpriteSheet sCryMeterNeedleSpriteSheets[] =
{ {
{CryMeterNeedleTiles, 0x800, 0x2000}, {sCryMeterNeedle_Gfx, 0x800, 0x2000},
{} {}
}; };
const struct SpritePalette gCryMeterNeedleSpritePalettes[] = static const struct SpritePalette sCryMeterNeedleSpritePalettes[] =
{ {
{CryMeterNeedlePalette, 0x2000}, {sCryMeterNeedle_Pal, 0x2000},
{} {}
}; };
bool8 sub_8145354(struct CryRelatedStruct *arg0, u8 windowId) bool8 LoadCryWaveformWindow(struct CryScreenWindow *window, u8 windowId)
{ {
u8 i; u8 i;
u8 retVal = FALSE; u8 finished = FALSE;
switch (gDexCryScreenState) switch (gDexCryScreenState)
{ {
@@ -216,112 +237,119 @@ bool8 sub_8145354(struct CryRelatedStruct *arg0, u8 windowId)
sCryWaveformWindowTiledata = (u8*)GetWindowAttribute(windowId, WINDOW_TILE_DATA); sCryWaveformWindowTiledata = (u8*)GetWindowAttribute(windowId, WINDOW_TILE_DATA);
} }
sDexCryScreen->unk14 = arg0->unk0; sDexCryScreen->unk = window->unk0;
sDexCryScreen->unk16 = arg0->yPos; sDexCryScreen->playStartPos = window->yPos;
sDexCryScreen->unk1A = 0; sDexCryScreen->cryOverrideCountdown = 0;
sDexCryScreen->unk1B = 0; sDexCryScreen->cryRepeatDelay = 0;
sDexCryScreen->unk10 = 0; sDexCryScreen->cryState = 0;
sDexCryScreen->unk12 = 28; sDexCryScreen->waveformPreviousY = WAVEFORM_WINDOW_HEIGHT / 2;
sDexCryScreen->unk11 = 0; sDexCryScreen->playhead = 0;
sub_8145824(windowId, -8 * arg0->xPos, 1); ShiftWaveformOver(windowId, -8 * window->xPos, TRUE); // Does nothing
for (i = 0; i < 224; i++) for (i = 0; i < 224; i++)
CopyToWindowPixelBuffer(windowId, gUnknown_085B8C10, TILE_SIZE_4BPP, i); CopyToWindowPixelBuffer(windowId, sCryScreenBg_Gfx, TILE_SIZE_4BPP, i);
gDexCryScreenState++; gDexCryScreenState++;
break; break;
case 1: case 1:
for (i = 0; i < sDexCryScreen->unk16 * 8; i++) for (i = 0; i < sDexCryScreen->playStartPos * 8; i++)
sub_81456A8(i, 0); DrawWaveformSegment(i, 0);
gDexCryScreenState++; gDexCryScreenState++;
break; break;
case 2: case 2:
sub_8145814(windowId); DrawWaveformWindow(windowId);
LoadPalette(gUnknown_085B8BF0, arg0->paletteNo * 16, 32); LoadPalette(sCryScreenBg_Pal, window->paletteNo * 16, 32);
retVal = TRUE; finished = TRUE;
break; break;
} }
return retVal; return finished;
} }
void sub_814545C(u8 windowId) void UpdateCryWaveformWindow(u8 windowId)
{ {
u8 var0; u8 waveformIdx;
sub_8145814(windowId); DrawWaveformWindow(windowId);
sub_8145648(windowId); AdvancePlayhead(windowId);
if (sDexCryScreen->unk1B)
sDexCryScreen->unk1B--;
if (sDexCryScreen->unk1A) // Cry cant be replayed until this counter is done
if (sDexCryScreen->cryRepeatDelay)
sDexCryScreen->cryRepeatDelay--;
// Once a cry replay has started, it waits for this countdown before playing
if (sDexCryScreen->cryOverrideCountdown)
{ {
sDexCryScreen->unk1A--; sDexCryScreen->cryOverrideCountdown--;
if (!sDexCryScreen->unk1A) if (!sDexCryScreen->cryOverrideCountdown)
{ {
sub_8145588(sDexCryScreen->species); PlayCryScreenCry(sDexCryScreen->species);
sub_814560C(); DrawWaveformFlatline();
return; return;
} }
} }
if (sDexCryScreen->unk10 == 0) // No cry playing
if (sDexCryScreen->cryState == 0)
{ {
sub_814560C(); DrawWaveformFlatline();
return; return;
} }
if (sDexCryScreen->unk10 == 1) // Cry playing, buffer waveform
if (sDexCryScreen->cryState == 1)
{ {
sub_81455A8(); BufferCryWaveformSegment();
} }
else if (sDexCryScreen->unk10 > 8) else if (sDexCryScreen->cryState > 8)
{ {
// Buffered waveform exhausted, end or buffer more
if (!IsCryPlaying()) if (!IsCryPlaying())
{ {
sub_814560C(); DrawWaveformFlatline();
sDexCryScreen->unk10 = 0; sDexCryScreen->cryState = 0;
return; return;
} }
sub_81455A8(); BufferCryWaveformSegment();
sDexCryScreen->unk10 = 1; sDexCryScreen->cryState = 1;
} }
var0 = 2 * (sDexCryScreen->unk10 - 1); // Draw cry
sub_81456A8(sDexCryScreen->unk16 * 8 + sDexCryScreen->unk11 - 2, sDexCryScreen->unk0[var0]); waveformIdx = 2 * (sDexCryScreen->cryState - 1);
sub_81456A8(sDexCryScreen->unk16 * 8 + sDexCryScreen->unk11 - 1, sDexCryScreen->unk0[var0 + 1]); DrawWaveformSegment(sDexCryScreen->playStartPos * 8 + sDexCryScreen->playhead - 2, sDexCryScreen->cryWaveformBuffer[waveformIdx]);
sDexCryScreen->unk10++; DrawWaveformSegment(sDexCryScreen->playStartPos * 8 + sDexCryScreen->playhead - 1, sDexCryScreen->cryWaveformBuffer[waveformIdx + 1]);
sDexCryScreen->cryState++;
} }
void sub_8145534(u16 species) void CryScreenPlayButton(u16 species)
{ {
if (gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_PAUSE && !sDexCryScreen->unk1A) if (gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_PAUSE && !sDexCryScreen->cryOverrideCountdown)
{ {
if (!sDexCryScreen->unk1B) if (!sDexCryScreen->cryRepeatDelay)
{ {
sDexCryScreen->unk1B = 4; sDexCryScreen->cryRepeatDelay = 4;
if (IsCryPlaying() == TRUE) if (IsCryPlaying() == TRUE)
{ {
StopCry(); StopCry();
sDexCryScreen->species = species; sDexCryScreen->species = species;
sDexCryScreen->unk1A = 2; sDexCryScreen->cryOverrideCountdown = 2;
} }
else else
{ {
sub_8145588(species); PlayCryScreenCry(species);
} }
} }
} }
} }
static void sub_8145588(u16 species) static void PlayCryScreenCry(u16 species)
{ {
PlayCry2(species, 0, 0x7d, 10); PlayCry2(species, 0, 125, 10);
sDexCryScreen->unk10 = 1; sDexCryScreen->cryState = 1;
} }
static void sub_81455A8(void) static void BufferCryWaveformSegment(void)
{ {
u8 i; u8 i;
s8 *baseBuffer; s8 *baseBuffer;
@@ -333,197 +361,218 @@ static void sub_81455A8(void)
baseBuffer = gSoundInfo.pcmBuffer + (gSoundInfo.pcmDmaPeriod + 1 - gPcmDmaCounter) * gSoundInfo.pcmSamplesPerVBlank; baseBuffer = gSoundInfo.pcmBuffer + (gSoundInfo.pcmDmaPeriod + 1 - gPcmDmaCounter) * gSoundInfo.pcmSamplesPerVBlank;
buffer = baseBuffer + 0x630; buffer = baseBuffer + 0x630;
for (i = 0; i < 16; i++) for (i = 0; i < ARRAY_COUNT(sDexCryScreen->cryWaveformBuffer); i++)
sDexCryScreen->unk0[i] = buffer[i * 2] * 2; sDexCryScreen->cryWaveformBuffer[i] = buffer[i * 2] * 2;
} }
static void sub_814560C(void) static void DrawWaveformFlatline(void)
{ {
sub_81456A8(sDexCryScreen->unk16 * 8 + sDexCryScreen->unk11 - 2, 0); DrawWaveformSegment(sDexCryScreen->playStartPos * 8 + sDexCryScreen->playhead - 2, 0);
sub_81456A8(sDexCryScreen->unk16 * 8 + sDexCryScreen->unk11 - 1, 0); DrawWaveformSegment(sDexCryScreen->playStartPos * 8 + sDexCryScreen->playhead - 1, 0);
} }
static void sub_8145648(u8 windowId) static void AdvancePlayhead(u8 windowId)
{ {
u8 i; u8 i;
u16 offset; u16 offset;
sub_8145824(windowId, sDexCryScreen->unk11, 0); ShiftWaveformOver(windowId, sDexCryScreen->playhead, FALSE);
sDexCryScreen->unk11 += 2; sDexCryScreen->playhead += 2;
offset = (sDexCryScreen->unk11 / 8 + sDexCryScreen->unk16 + 1) % 32; offset = (sDexCryScreen->playhead / 8 + sDexCryScreen->playStartPos + 1) % 32;
for (i = 0; i < 7; i++) for (i = 0; i < 7; i++)
CopyToWindowPixelBuffer(windowId, gUnknown_085B8C10, TILE_SIZE_4BPP, offset + (i * TILE_SIZE_4BPP)); CopyToWindowPixelBuffer(windowId, sCryScreenBg_Gfx, TILE_SIZE_4BPP, offset + (i * TILE_SIZE_4BPP));
} }
static void sub_81456A8(u8 a0, u8 a1) // Waveform segments are drawn in alternate vertical slices
// Note that the waveform isnt put on screen until DrawWaveformWindow
static void DrawWaveformSegment(u8 position, u8 amplitude)
{ {
u8 sp0; // Position is a bitfield containing the play start pos, the playhead pos, and which vertical slice half to draw
u8 r6; #define PLAY_START_POS (position >> 3)
u8 r8; #define PLAYHEAD_POS (position & ((1 << 3) - 1))
u16 offset; #define VERT_SLICE (position & 1)
u16 r1;
u8 i;
r1 = (a1 + 127) * 256; u8 currentPointY;
i = r1 / 1152.0; u8 nybble;
if (i > 55) u16 offset;
i = 55; u16 temp;
sp0 = i; u8 y;
r6 = a0 & 1;
if (i > sDexCryScreen->unk12) temp = (amplitude + 127) * 256;
y = temp / 1152.0;
if (y > WAVEFORM_WINDOW_HEIGHT - 1)
y = WAVEFORM_WINDOW_HEIGHT - 1;
currentPointY = y;
nybble = VERT_SLICE;
if (y > sDexCryScreen->waveformPreviousY)
{ {
// Current point lower than previous point, draw point and draw line up to previous
do do
{ {
offset = gUnknown_085B8770[a0 & 0x7][i] + (a0 / 8) * TILE_SIZE_4BPP; offset = sWaveformOffsets[PLAYHEAD_POS][y] + PLAY_START_POS * TILE_SIZE_4BPP;
sCryWaveformWindowTiledata[offset] &= gUnknown_085B8C30[r6]; sCryWaveformWindowTiledata[offset] &= sWaveformTileDataNybbleMasks[nybble];
sCryWaveformWindowTiledata[offset] |= gUnknown_085B8C32[r6][((i / 3) - 1) & 0x0F]; sCryWaveformWindowTiledata[offset] |= sWaveformColor[nybble][((y / 3) - 1) & 0x0F];
i--; y--;
} while (i > sDexCryScreen->unk12); } while (y > sDexCryScreen->waveformPreviousY);
} }
else else
{ {
// Current point higher than previous point, draw point and draw line down to previous
do do
{ {
offset = gUnknown_085B8770[a0 & 0x7][i] + (a0 / 8) * TILE_SIZE_4BPP; offset = sWaveformOffsets[PLAYHEAD_POS][y] + PLAY_START_POS * TILE_SIZE_4BPP;
sCryWaveformWindowTiledata[offset] &= gUnknown_085B8C30[r6]; sCryWaveformWindowTiledata[offset] &= sWaveformTileDataNybbleMasks[nybble];
sCryWaveformWindowTiledata[offset] |= gUnknown_085B8C32[r6][((i / 3) - 1) & 0x0F]; sCryWaveformWindowTiledata[offset] |= sWaveformColor[nybble][((y / 3) - 1) & 0x0F];
i++; y++;
} while (i < sDexCryScreen->unk12); } while (y < sDexCryScreen->waveformPreviousY);
} }
sDexCryScreen->unk12 = sp0; sDexCryScreen->waveformPreviousY = currentPointY;
} }
static void sub_8145814(u8 windowId) static void DrawWaveformWindow(u8 windowId)
{ {
CopyWindowToVram(windowId, 2); CopyWindowToVram(windowId, 2);
} }
static void sub_8145824(u8 windowId, s16 arg1, u8 arg2) // rsVertical is leftover from a very different version of this function in RS
// In RS, when TRUE it would use VOFS and when FALSE it would use HOFS (only FALSE was used)
// Here when TRUE it does nothing
static void ShiftWaveformOver(u8 windowId, s16 offset, bool8 rsVertical)
{ {
if (!arg2) if (!rsVertical)
{ {
u8 bg = GetWindowAttribute(windowId, WINDOW_BG); u8 bg = GetWindowAttribute(windowId, WINDOW_BG);
ChangeBgX(bg, arg1 << 8, 0); ChangeBgX(bg, offset << 8, 0);
} }
} }
bool8 sub_8145850(struct CryRelatedStruct *arg0, u8 windowId) bool8 LoadCryMeter(struct CryScreenWindow *window, u8 windowId)
{ {
int retVal = FALSE; bool8 finished = FALSE;
switch (gDexCryScreenState) switch (gDexCryScreenState)
{ {
case 0: case 0:
if (!sCryVolumeMeter) if (!sCryMeterNeedle)
sCryVolumeMeter = AllocZeroed(sizeof(*sCryVolumeMeter)); sCryMeterNeedle = AllocZeroed(sizeof(*sCryMeterNeedle));
CopyToWindowPixelBuffer(windowId, gUnknown_085B8438, 0, 0); CopyToWindowPixelBuffer(windowId, sCryMeter_Gfx, 0, 0);
LoadPalette(gUnknown_085B8418, arg0->paletteNo * 16, 32); LoadPalette(sCryMeter_Pal, window->paletteNo * 16, 32);
gDexCryScreenState++; gDexCryScreenState++;
break; break;
case 1: case 1:
LoadSpriteSheets(gCryMeterNeedleSpriteSheets); LoadSpriteSheets(sCryMeterNeedleSpriteSheets);
LoadSpritePalettes(gCryMeterNeedleSpritePalettes); LoadSpritePalettes(sCryMeterNeedleSpritePalettes);
sCryVolumeMeter->needleSpriteId = CreateSprite(&gUnknown_085B8C68, 40 + arg0->xPos * 8, 56 + arg0->yPos * 8, 1); sCryMeterNeedle->spriteId = CreateSprite(&sCryMeterNeedleSpriteTemplate, 40 + window->xPos * 8, 56 + window->yPos * 8, 1);
sCryVolumeMeter->unk0 = 0x20; sCryMeterNeedle->rotation = MIN_NEEDLE_POS;
sCryVolumeMeter->unk1 = 0x20; sCryMeterNeedle->targetRotation = MIN_NEEDLE_POS;
sCryVolumeMeter->unk2 = 0; sCryMeterNeedle->moveIncrement = 0;
retVal = TRUE; finished = TRUE;
break; break;
} }
return retVal; return finished;
} }
void sub_8145914(void) void FreeCryScreen(void)
{ {
FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[sCryVolumeMeter->needleSpriteId].oam.paletteNum)); FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[sCryMeterNeedle->spriteId].oam.paletteNum));
DestroySprite(gSprites + sCryVolumeMeter->needleSpriteId); DestroySprite(gSprites + sCryMeterNeedle->spriteId);
FREE_AND_SET_NULL(sDexCryScreen); FREE_AND_SET_NULL(sDexCryScreen);
FREE_AND_SET_NULL(sCryVolumeMeter); FREE_AND_SET_NULL(sCryMeterNeedle);
} }
static void sub_814596C(struct Sprite *sprite) static void SpriteCB_CryMeterNeedle(struct Sprite *sprite)
{ {
u16 i; u16 i;
s8 r3; s8 peakAmplitude;
s16 x; s16 x;
s16 y; s16 y;
struct ObjAffineSrcData affine; struct ObjAffineSrcData affine;
struct OamMatrix matrix; struct OamMatrix matrix;
u8 *var0; u8 amplitude;
gSprites[sCryVolumeMeter->needleSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[sCryMeterNeedle->spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[sCryVolumeMeter->needleSpriteId].oam.affineParam = 0; gSprites[sCryMeterNeedle->spriteId].oam.affineParam = 0;
switch (sDexCryScreen->unk10)
{
case 0:
sCryVolumeMeter->unk1 = 0x20;
if (sCryVolumeMeter->unk0 > 0)
{
if (sCryVolumeMeter->unk2 != 1)
sCryVolumeMeter->unk2--;
}
else
sCryVolumeMeter->unk2 = 5;
break;
case 2:
r3 = 0;
for (i = 0; i < 16; i++)
{
if (r3 < sDexCryScreen->unk0[i])
r3 = sDexCryScreen->unk0[i];
}
sub_8145B24(r3 * 0xd0 / 0x100);
break;
case 6:
var0 = &sDexCryScreen->unk0[10];
sub_8145B24(*var0 * 0xd0 / 0x100);
break;
}
if (sCryVolumeMeter->unk0 == sCryVolumeMeter->unk1) // While no cry is playing, cryState is 0
// While cry is playing, cryState loops 1-8
switch (sDexCryScreen->cryState)
{ {
// empty block case 0:
} sCryMeterNeedle->targetRotation = MIN_NEEDLE_POS;
else if (sCryVolumeMeter->unk0 < sCryVolumeMeter->unk1) if (sCryMeterNeedle->rotation > 0)
{
sCryVolumeMeter->unk0 += sCryVolumeMeter->unk2;
if (sCryVolumeMeter->unk0 > sCryVolumeMeter->unk1)
{ {
sCryVolumeMeter->unk0 = sCryVolumeMeter->unk1; if (sCryMeterNeedle->moveIncrement != 1)
sCryVolumeMeter->unk1 = 0; sCryMeterNeedle->moveIncrement--;
}
else
{
sCryMeterNeedle->moveIncrement = NEEDLE_MOVE_INCREMENT;
}
break;
case 2:
peakAmplitude = 0;
for (i = 0; i < ARRAY_COUNT(sDexCryScreen->cryWaveformBuffer); i++)
{
if (peakAmplitude < sDexCryScreen->cryWaveformBuffer[i])
peakAmplitude = sDexCryScreen->cryWaveformBuffer[i];
}
SetCryMeterNeedleTarget(peakAmplitude * 208 / 256);
break;
case 6:
// To introduce some randomness, needle jumps to set pos in waveform rather than peak
amplitude = sDexCryScreen->cryWaveformBuffer[10];
SetCryMeterNeedleTarget(amplitude * 208 / 256);
break;
}
if (sCryMeterNeedle->rotation == sCryMeterNeedle->targetRotation)
{
// Empty, needle has reached target
}
else if (sCryMeterNeedle->rotation < sCryMeterNeedle->targetRotation)
{
// Rotate needle left
sCryMeterNeedle->rotation += sCryMeterNeedle->moveIncrement;
if (sCryMeterNeedle->rotation > sCryMeterNeedle->targetRotation)
{
sCryMeterNeedle->rotation = sCryMeterNeedle->targetRotation;
sCryMeterNeedle->targetRotation = 0;
} }
} }
else else
{ {
sCryVolumeMeter->unk0 -= sCryVolumeMeter->unk2; // Rotate needle right
if (sCryVolumeMeter->unk0 < sCryVolumeMeter->unk1) sCryMeterNeedle->rotation -= sCryMeterNeedle->moveIncrement;
if (sCryMeterNeedle->rotation < sCryMeterNeedle->targetRotation)
{ {
sCryVolumeMeter->unk0 = sCryVolumeMeter->unk1; sCryMeterNeedle->rotation = sCryMeterNeedle->targetRotation;
sCryVolumeMeter->unk1 = 0; sCryMeterNeedle->targetRotation = 0;
} }
} }
affine.xScale = 0x100; affine.xScale = 256;
affine.yScale = 0x100; affine.yScale = 256;
affine.rotation = sCryVolumeMeter->unk0 * 256; affine.rotation = sCryMeterNeedle->rotation * 256;
ObjAffineSet(&affine, &matrix, 1, 2); ObjAffineSet(&affine, &matrix, 1, 2);
SetOamMatrix(0, matrix.a, matrix.b, matrix.c, matrix.d); SetOamMatrix(0, matrix.a, matrix.b, matrix.c, matrix.d);
x = gSineTable[((sCryVolumeMeter->unk0 + 0x7F) & 0xFF)]; x = gSineTable[((sCryMeterNeedle->rotation + 0x7F) & 0xFF)];
y = gSineTable[((sCryVolumeMeter->unk0 + 0x7F) & 0xFF) + 0x40]; y = gSineTable[((sCryMeterNeedle->rotation + 0x7F) & 0xFF) + 64];
sprite->pos2.x = x * 24 / 256; sprite->pos2.x = x * 24 / 256;
sprite->pos2.y = y * 24 / 256; sprite->pos2.y = y * 24 / 256;
} }
static void sub_8145B24(s8 a0) static void SetCryMeterNeedleTarget(s8 offset)
{ {
u16 r2 = (0x20 - a0) & 0xff; u16 rotation = (MIN_NEEDLE_POS - offset) & 0xFF;
if (r2 > 0x20 && r2 < 0xe0)
r2 = 0xe0;
sCryVolumeMeter->unk1 = r2; // Min is positive, max is negative. Make sure needle hasnt moved out of bounds
sCryVolumeMeter->unk2 = 5; if (rotation > MIN_NEEDLE_POS && rotation < (u8)MAX_NEEDLE_POS)
rotation = (u8)MAX_NEEDLE_POS;
sCryMeterNeedle->targetRotation = rotation;
sCryMeterNeedle->moveIncrement = NEEDLE_MOVE_INCREMENT;
} }
+1 -1
View File
@@ -603,7 +603,7 @@ static bool8 StartMenuPokedexCallback(void)
PlayRainStoppingSoundEffect(); PlayRainStoppingSoundEffect();
RemoveExtraStartMenuWindows(); RemoveExtraStartMenuWindows();
CleanupOverworldWindowsAndTilemaps(); CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_Pokedex); SetMainCallback2(CB2_OpenPokedex);
return TRUE; return TRUE;
} }