Merge pull request #1000 from GriffinRichards/doc-dex
Document pokedex.c
This commit is contained in:
31 files changed
+3847
-3434
No files matched your search
@@ -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.
+833
-824
File diff suppressed because it is too large.
Load diff
+16
-17
@@ -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
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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]++;
|
||||||
|
|||||||
@@ -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
@@ -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
File diff suppressed because it is too large.
Load diff
+21
-19
@@ -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
@@ -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
@@ -603,7 +603,7 @@ static bool8 StartMenuPokedexCallback(void)
|
|||||||
PlayRainStoppingSoundEffect();
|
PlayRainStoppingSoundEffect();
|
||||||
RemoveExtraStartMenuWindows();
|
RemoveExtraStartMenuWindows();
|
||||||
CleanupOverworldWindowsAndTilemaps();
|
CleanupOverworldWindowsAndTilemaps();
|
||||||
SetMainCallback2(CB2_Pokedex);
|
SetMainCallback2(CB2_OpenPokedex);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user