Merge pull request #1000 from GriffinRichards/doc-dex

Document pokedex.c
This commit is contained in:
PikalaxALT authored and GitHub committed 2020-03-17 10:43:57 -04:00
commit 39da49495d
31 files changed
+3847 -3434

No files matched your search

+1 -1
View File
@@ -1,2 +1,2 @@
gUnusedPokedexU8 gUnusedPokedexU8
gUnknown_030060B4 gPokedexVBlankCB
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Binary file not shown.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
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;
} }