diff options
author | Cameron Hall <camthesaxman@users.noreply.github.com> | 2016-10-16 19:02:35 -0500 |
---|---|---|
committer | YamaArashi <YamaArashi@users.noreply.github.com> | 2016-10-16 17:02:35 -0700 |
commit | f2fb6f9b830888c649fca285bdfab5657c64ef35 (patch) | |
tree | 42e1ebe4dc161e0948652a2adfe707e76209f931 /src | |
parent | 1125d78ad398411e690b1817624cbeeb5ae48144 (diff) |
decompile option menu and begin decompiling pokedex (#58)
* start decompiling pokedex
* fix up this darn struct
* decompile most of the option menu code
* decompile more code
* finish up with option menu
* minor cleanup
* fix some pokedex functions
* remove disassembly files
* actually remove disassembly files
* more decompilation
* decompile 2 more functions
* minor cleanup
* Update start_menu.c with CB2_InitPokedex
Diffstat (limited to 'src')
-rw-r--r-- | src/option_menu.c | 515 | ||||
-rw-r--r-- | src/pokedex.c | 717 | ||||
-rw-r--r-- | src/start_menu.c | 4 |
3 files changed, 1234 insertions, 2 deletions
diff --git a/src/option_menu.c b/src/option_menu.c new file mode 100644 index 000000000..67a715988 --- /dev/null +++ b/src/option_menu.c @@ -0,0 +1,515 @@ +#include "gba/gba.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "sprite.h" +#include "task.h" + +extern void SetPokemonCryStereo(u32 val); +extern void remove_some_task(void); + +//Task data +enum { + TD_MENUSELECTION, + TD_TEXTSPEED, + TD_BATTLESCENE, + TD_BATTLESTYLE, + TD_SOUND, + TD_BUTTONMODE, + TD_FRAMETYPE, +}; + +//Menu items +enum { + MENUITEM_TEXTSPEED, + MENUITEM_BATTLESCENE, + MENUITEM_BATTLESTYLE, + MENUITEM_SOUND, + MENUITEM_BUTTONMODE, + MENUITEM_FRAMETYPE, + MENUITEM_CANCEL, +}; + +extern u8 gUnknown_0839F63C[]; +extern u8 gUnknown_0839F5FC[]; //palette +extern u8 gSystemText_Normal[]; +extern u8 gSystemText_LR[]; +extern u8 gSystemText_LA[]; +extern u8 gSystemText_Terminator[]; +extern u8 gSystemText_Type[]; +extern u8 gSystemText_Mono[]; +extern u8 gSystemText_Stereo[]; +extern u8 gSystemText_Shift[]; +extern u8 gSystemText_Set[]; +extern u8 gSystemText_On[]; +extern u8 gSystemText_Off[]; +extern u8 gSystemText_Slow[]; +extern u8 gSystemText_Mid[]; +extern u8 gSystemText_Fast[]; +extern u8 gSystemText_OptionMenu[]; +extern u8 gSystemText_TextSpeed[]; +extern u8 gSystemText_BattleScene[]; +extern u8 gSystemText_BattleStyle[]; +extern u8 gSystemText_Sound[]; +extern u8 gSystemText_ButtonMode[]; +extern u8 gSystemText_Frame[]; +extern u8 gSystemText_Cancel[]; + +static void Task_OptionMenuFadeIn(u8 taskId); +static void Task_OptionMenuProcessInput(u8 taskId); +static void Task_OptionMenuSave(u8 taskId); +static void Task_OptionMenuFadeOut(u8 taskId); +static void HighlightOptionMenuItem(u8 selection); +static u8 TextSpeed_ProcessInput(u8 selection); +static void TextSpeed_DrawChoices(u8 selection); +static u8 BattleScene_ProcessInput(u8 selection); +static void BattleScene_DrawChoices(u8 selection); +static u8 BattleStyle_ProcessInput(u8 selection); +static void BattleStyle_DrawChoices(u8 selection); +static u8 Sound_ProcessInput(u8 selection); +static void Sound_DrawChoices(u8 selection); +static u8 FrameType_ProcessInput(u8 selection); +static void FrameType_DrawChoices(u8 selection); +static u8 ButtonMode_ProcessInput(u8 selection); +static void ButtonMode_DrawChoices(u8 selection); + +static void MainCB(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void VBlankCB(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_InitOptionMenu(void) +{ + switch(gMain.state) + { + default: + case 0: + { + u8 *addr; + u32 size; + + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + addr = (u8 *)VRAM; + size = 0x18000; + while(1) + { + DmaFill16(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if(size <= 0x1000) + { + DmaFill16(3, 0, addr, size); + break; + } + } + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + gMain.state++; + break; + } + case 1: + ResetPaletteFade(); + remove_some_task(); + ResetTasks(); + ResetSpriteData(); + gMain.state++; + break; + case 2: + SetUpWindowConfig(&gWindowConfig_81E71B4); + gMain.state++; + break; + case 3: + MultistepInitMenuWindowBegin(&gWindowConfig_81E71B4); + gMain.state++; + break; + case 4: + if(!MultistepInitMenuWindowContinue()) + return; + gMain.state++; + break; + case 5: + LoadPalette(gUnknown_0839F5FC, 0x80, 0x40); + CpuCopy16(gUnknown_0839F63C, (void *)0x0600BEE0, 0x40); + gMain.state++; + break; + case 6: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + gMain.state++; + break; + case 7: + { + u16 savedIme; + + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WIN1H = 0; + REG_WIN1V = 0; + REG_WININ = 0x1111; + REG_WINOUT = 0x31; + REG_BLDCNT = 0xE1; + REG_BLDALPHA = 0; + REG_BLDY = 7; + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(VBlankCB); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON | + DISPCNT_WIN0_ON | DISPCNT_WIN1_ON; + gMain.state++; + break; + } + case 8: + { + u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0); + + gTasks[taskId].data[TD_MENUSELECTION] = 0; + gTasks[taskId].data[TD_TEXTSPEED] = gSaveBlock2.optionsTextSpeed; + gTasks[taskId].data[TD_BATTLESCENE] = gSaveBlock2.optionsBattleSceneOff; + gTasks[taskId].data[TD_BATTLESTYLE] = gSaveBlock2.optionsBattleStyle; + gTasks[taskId].data[TD_SOUND] = gSaveBlock2.optionsSound; + gTasks[taskId].data[TD_BUTTONMODE] = gSaveBlock2.optionsButtonMode; + gTasks[taskId].data[TD_FRAMETYPE] = gSaveBlock2.optionsWindowFrameType; + + MenuDrawTextWindow(2, 0, 27, 3); + MenuDrawTextWindow(2, 4, 27, 19); + + MenuPrint(gSystemText_OptionMenu, 4, 1); + MenuPrint(gSystemText_TextSpeed, 4, 5); + MenuPrint(gSystemText_BattleScene, 4, 7); + MenuPrint(gSystemText_BattleStyle, 4, 9); + MenuPrint(gSystemText_Sound, 4, 11); + MenuPrint(gSystemText_ButtonMode, 4, 13); + MenuPrint(gSystemText_Frame, 4, 15); + MenuPrint(gSystemText_Cancel, 4, 17); + + TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]); + BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]); + BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]); + Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]); + ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]); + FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]); + + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(1, 31); + + HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); + gMain.state++; + break; + } + case 9: + SetMainCallback2(MainCB); + return; + } +} + +static void Task_OptionMenuFadeIn(u8 taskId) +{ + if(!gPaletteFade.active) + { + gTasks[taskId].func = Task_OptionMenuProcessInput; + } +} + +static void Task_OptionMenuProcessInput(u8 taskId) +{ + if(gMain.newKeys & A_BUTTON) + { + if(gTasks[taskId].data[TD_MENUSELECTION] == MENUITEM_CANCEL) + gTasks[taskId].func = Task_OptionMenuSave; + } + else if(gMain.newKeys & B_BUTTON) + { + gTasks[taskId].func = Task_OptionMenuSave; + } + else if(gMain.newKeys & DPAD_UP) + { + if(gTasks[taskId].data[TD_MENUSELECTION] > 0) + gTasks[taskId].data[TD_MENUSELECTION]--; + else + gTasks[taskId].data[TD_MENUSELECTION] = 6; + HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); + } + else if(gMain.newKeys & DPAD_DOWN) + { + if(gTasks[taskId].data[TD_MENUSELECTION] <= 5) + gTasks[taskId].data[TD_MENUSELECTION]++; + else + gTasks[taskId].data[TD_MENUSELECTION] = 0; + HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]); + } + else + { + switch(gTasks[taskId].data[TD_MENUSELECTION]) + { + case MENUITEM_TEXTSPEED: + gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]); + TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]); + break; + case MENUITEM_BATTLESCENE: + gTasks[taskId].data[TD_BATTLESCENE] = BattleScene_ProcessInput(gTasks[taskId].data[TD_BATTLESCENE]); + BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]); + break; + case MENUITEM_BATTLESTYLE: + gTasks[taskId].data[TD_BATTLESTYLE] = BattleStyle_ProcessInput(gTasks[taskId].data[TD_BATTLESTYLE]); + BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]); + break; + case MENUITEM_SOUND: + gTasks[taskId].data[TD_SOUND] = Sound_ProcessInput(gTasks[taskId].data[TD_SOUND]); + Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]); + break; + case MENUITEM_BUTTONMODE: + gTasks[taskId].data[TD_BUTTONMODE] = ButtonMode_ProcessInput(gTasks[taskId].data[TD_BUTTONMODE]); + ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]); + break; + case MENUITEM_FRAMETYPE: + gTasks[taskId].data[TD_FRAMETYPE] = FrameType_ProcessInput(gTasks[taskId].data[TD_FRAMETYPE]); + FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]); + break; + } + } +} + +static void Task_OptionMenuSave(u8 taskId) +{ + gSaveBlock2.optionsTextSpeed = gTasks[taskId].data[TD_TEXTSPEED]; + gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].data[TD_BATTLESCENE]; + gSaveBlock2.optionsBattleStyle = gTasks[taskId].data[TD_BATTLESTYLE]; + gSaveBlock2.optionsSound = gTasks[taskId].data[TD_SOUND]; + gSaveBlock2.optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE]; + gSaveBlock2.optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE]; + + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_OptionMenuFadeOut; +} + +static void Task_OptionMenuFadeOut(u8 taskId) +{ + if(!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(gMain.field_8); + } +} + +//This version uses addition '+' instead of OR '|'. +#define WIN_RANGE_(a, b) (((a) << 8) + (b)) + +static void HighlightOptionMenuItem(u8 index) +{ + REG_WIN1H = WIN_RANGE(24, 215); + REG_WIN1V = WIN_RANGE_(index * 16 + 40, index * 16 + 56); +} + +static void DrawOptionMenuChoice(u8 *text, u8 x, u8 y, u8 style) +{ + u8 dst[16]; + u16 i; + + for(i = 0; *text != EOS && i <= 14; i++) + dst[i] = *(text++); + + dst[2] = style; + dst[i] = EOS; + sub_80729D8(dst, x, y, 1); +} + +static u8 TextSpeed_ProcessInput(u8 selection) +{ + if(gMain.newKeys & DPAD_RIGHT) + { + if(selection <= 1) + selection++; + else + selection = 0; + } + if(gMain.newKeys & DPAD_LEFT) + { + if(selection != 0) + selection--; + else + selection = 2; + } + return selection; +} + +static void TextSpeed_DrawChoices(u8 selection) +{ + u8 styles[3]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[2] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_Slow, 120, 40, styles[0]); + DrawOptionMenuChoice(gSystemText_Mid, 155, 40, styles[1]); + DrawOptionMenuChoice(gSystemText_Fast, 184, 40, styles[2]); +} + +static u8 BattleScene_ProcessInput(u8 selection) +{ + if(gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) + selection ^= 1; + return selection; +} + +static void BattleScene_DrawChoices(u8 selection) +{ + u8 styles[2]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]); + DrawOptionMenuChoice(gSystemText_Off, 190, 56, styles[1]); +} + +static u8 BattleStyle_ProcessInput(u8 selection) +{ + if(gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) + selection ^= 1; + return selection; +} + +static void BattleStyle_DrawChoices(u8 selection) +{ + u8 styles[2]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_Shift, 120, 72, styles[0]); + DrawOptionMenuChoice(gSystemText_Set, 190, 72, styles[1]); +} + +static u8 Sound_ProcessInput(u8 selection) +{ + if(gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) + { + selection ^= 1; + SetPokemonCryStereo(selection); + } + return selection; +} + +static void Sound_DrawChoices(u8 selection) +{ + u8 styles[3]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]); + DrawOptionMenuChoice(gSystemText_Stereo, 172, 88, styles[1]); +} + +static u8 FrameType_ProcessInput(u8 selection) +{ + if(gMain.newKeys & DPAD_RIGHT) + { + if(selection <= 18) + selection++; + else + selection = 0; + MenuLoadTextWindowGraphics_OverrideFrameType(selection); + } + if(gMain.newKeys & DPAD_LEFT) + { + if(selection != 0) + selection--; + else + selection = 19; + MenuLoadTextWindowGraphics_OverrideFrameType(selection); + } + return selection; +} + +#define CHAR_0 0xA1 //Character code of '0' character + +static void FrameType_DrawChoices(u8 selection) +{ + u8 text[8]; + u8 n = selection + 1; + u16 i; + + for(i = 0; gSystemText_Terminator[i] != EOS && i <= 5; i++) + text[i] = gSystemText_Terminator[i]; + + //Convert number to decimal string + if(n / 10 != 0) + { + text[i] = n / 10 + CHAR_0; + i++; + text[i] = n % 10 + CHAR_0; + i++; + } + else + { + text[i] = n % 10 + CHAR_0; + i++; + text[i] = CHAR_SPACE; + i++; + } + + text[i] = EOS; + MenuPrint(gSystemText_Type, 15, 15); + MenuPrint(text, 18, 15); +} + +static u8 ButtonMode_ProcessInput(u8 selection) +{ + if(gMain.newKeys & DPAD_RIGHT) + { + if(selection <= 1) + selection++; + else + selection = 0; + } + if(gMain.newKeys & DPAD_LEFT) + { + if(selection != 0) + selection--; + else + selection = 2; + } + return selection; +} + +static void ButtonMode_DrawChoices(u8 selection) +{ + u8 styles[3]; + + styles[0] = 0xF; + styles[1] = 0xF; + styles[2] = 0xF; + styles[selection] = 0x8; + + DrawOptionMenuChoice(gSystemText_Normal, 120, 104, styles[0]); + DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]); + DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]); +} diff --git a/src/pokedex.c b/src/pokedex.c new file mode 100644 index 000000000..3c7647be7 --- /dev/null +++ b/src/pokedex.c @@ -0,0 +1,717 @@ +#include "gba/gba.h" +#include "main.h" +#include "palette.h" +#include "rng.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "text.h" + +struct PokedexListItem { + u16 a; + u8 seen:1; + u8 owned:1; + u8 c; +}; + +struct PokedexView { + struct PokedexListItem unk0[386]; //data on the 386 different Pokemon + u16 unk608; + u8 unk60A_1:1; + u8 unk60A_2:1; + u8 unk60B; + u16 unk60C; + u16 unk60E; //selected Pokemon (index of unk0) + u16 unk610; + u16 unk612; + u16 unk614; + u16 unk616; //order + u16 unk618; + u16 unk61A; + u16 unk61C; + u16 unk61E[4]; + u16 unk626; //some sprite id + u16 unk628; + u16 unk62A; + u8 unk62C; + u8 unk62D; + u8 unk62E; + u8 unk62F; + u16 unk630; + u16 unk632; + u16 unk634; + u16 unk636; + u16 unk638; + u16 unk63A[4]; + u8 filler642[8]; + u8 unk64A; + u8 unk64B; + u8 unk64C_1:1; + u8 unk64D; + u8 unk64E; + u8 unk64F; + u8 unk650; //menuIsOpen + u8 unk651; + u16 unk652; //Menu cursor position + s16 unk654; //Menu Y position (inverted because we use REG_BG0VOFS for this) + u8 unk656[8]; + u8 unk65E[8]; +}; + +extern struct MusicPlayerInfo gMPlay_BGM; +extern u8 gReservedSpritePaletteCount; +extern struct PokedexView *gUnknown_0202FFB4; +extern u16 gUnknown_0202FFB8; +extern u8 gUnknown_0202FFBA; +extern u8 gUnknown_03005CE8; + +extern void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume); +extern bool8 BeginNormalPaletteFade(u32, s8, u8, u8, u16); +extern void remove_some_task(void); +extern bool32 sub_806912C(void); +extern u16 pokedex_count(u8); +extern u8 sub_8091E3C(void); +extern void sub_80690C8(void); +extern void sub_805469C(void); + +void ClearPokedexView(struct PokedexView *); +void Task_PokedexShowMainScreen(u8 taskId); +void sub_808C0B8(void); +void MainCB(void); +bool8 sub_808D344(u8); +void Task_PokedexMainScreen(u8 taskId); +void sub_808E6BC(void); +void sub_808EDB8(struct Sprite *); +void sub_808CA64(u8 taskId); +void Task_PokedexMainScreenMenu(u8 taskId); +void sub_808CB8C(u8 taskId); +u16 sub_808E48C(u16, u16); +void sub_808C898(u8 taskId); +void Task_ClosePokedex(u8 taskId); +void sub_8091060(u16); +void sub_808CAE4(u8 taskId); +void sub_808D198(u8 taskId); +bool8 sub_808E208(u8, u8, u8); +bool32 sub_808E82C(void); //Not sure about return type +void sub_808E0CC(u16, u16); +u8 sub_808F210(struct PokedexListItem *, u8); +void sub_808F284(struct PokedexListItem *, u8); +bool8 sub_808F250(u8); +bool8 sub_808E71C(void); +void sub_808CCC4(u8 taskId); +u16 sub_8090F68(u8); +void sub_808D690(u8, u8); +void Task_PokedexResultsScreen(u8 taskId); +void sub_808D118(u8 taskId); +void Task_PokedexResultsScreenMenu(u8 taskId); +void Task_PokedexResultsScreenReturnToMainScreen(u8 taskId); +void sub_808CEF8(u8 taskId); +void Task_PokedexResultsScreenExitPokedex(u8 taskId); + +void sub_808C02C(void) +{ + u16 i; + + gUnknown_0202FFB8 = 0; + gUnknown_0202FFBA = 0x40; + gUnknown_03005CE8 = 0; + gSaveBlock2.pokedex.unknown1 = 0; + gSaveBlock2.pokedex.order = 0; + gSaveBlock2.pokedex.nationalMagic = 0; + gSaveBlock2.pokedex.unknown2 = 0; + gSaveBlock2.pokedex.unownPersonality = 0; + gSaveBlock2.pokedex.spindaPersonality = 0; + gSaveBlock2.pokedex.unknown3 = 0; + sub_80690C8(); + for(i = 0; i <= 51; i++) + { + gSaveBlock2.pokedex.owned[i] = 0; + gSaveBlock2.pokedex.seen[i] = 0; + gSaveBlock1.unk938[i] = 0; + gSaveBlock1.unk3A8C[i] = 0; + } +} + +void sub_808C0A0(void) +{ + gUnknown_0202FFB8 = 0; + gUnknown_0202FFBA = 0x40; +} + +void sub_808C0B8(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void ClearPokedexView(struct PokedexView *pokedexView) +{ + u16 i; + struct UnknownStruct3 *p; + + for(i = 0; i <= 385; i++) + { + pokedexView->unk0[i].a |= 0x0000FFFF; + pokedexView->unk0[i].seen = 0; + pokedexView->unk0[i].owned = 0; + } + pokedexView->unk608 = 0; + pokedexView->unk60A_1 = 0; + pokedexView->unk60A_2 = 0; + pokedexView->unk60C = 0; + pokedexView->unk60E = 0; + pokedexView->unk610 = 0; + pokedexView->unk612 = 0; + pokedexView->unk614 = 0; + pokedexView->unk616 = 0; + pokedexView->unk618 = 0; + pokedexView->unk61A = 0; + pokedexView->unk61C = 0; + for(i = 0; i <= 3; i++) + pokedexView->unk61E[i] |= 0xFFFF; + pokedexView->unk628 = 0; + pokedexView->unk62A = 0; + pokedexView->unk62C = 0; + pokedexView->unk62D = 0; + pokedexView->unk62E = 0; + pokedexView->unk62F = 0; + pokedexView->unk630 = 0; + pokedexView->unk632 = 0; + pokedexView->unk634 = 0; + pokedexView->unk636 = 0; + pokedexView->unk638 = 0; + for(i = 0; i <= 3; i++) + pokedexView->unk63A[i] = 0; + pokedexView->unk64A = 0; + pokedexView->unk64B = 0; + pokedexView->unk64C_1 = 0; + pokedexView->unk64D = 0; + pokedexView->unk64F = 0; + pokedexView->unk650 = 0; + pokedexView->unk652 = 0; + pokedexView->unk654 = 0; + for(i = 0; i <= 7; i++) + pokedexView->unk656[i] = 0; + for(i = 0; i <= 7; i++) + pokedexView->unk65E[i] = 0; +} + +void CB2_InitPokedex(void) +{ + switch(gMain.state) + { + case 0: + default: + { + u8 *addr; + u32 size; + + SetVBlankCallback(NULL); + sub_8091060(0); + addr = (u8 *)VRAM; + size = 0x18000; + while(1) + { + DmaFill16(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if(size <= 0x1000) + { + DmaFill16(3, 0, addr, size); + break; + } + } + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + gMain.state = 1; + break; + } + case 1: + remove_some_task(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + SetUpWindowConfig(&gWindowConfig_81E7048); + InitMenuWindow(&gWindowConfig_81E7048); + gMain.state++; + break; + case 2: + switch(Random() & 3) + { + case 0: + default: + gUnknown_0202FFB4 = (struct PokedexView *)0x02018000; + break; + case 1: + gUnknown_0202FFB4 = (struct PokedexView *)0x02018800; + break; + case 2: + gUnknown_0202FFB4 = (struct PokedexView *)0x02019000; + break; + case 3: + gUnknown_0202FFB4 = (struct PokedexView *)0x02019800; + break; + } + ClearPokedexView(gUnknown_0202FFB4); + CreateTask(Task_PokedexShowMainScreen, 0); + gUnknown_0202FFB4->unk612 = gSaveBlock2.pokedex.unknown1; + if(!sub_806912C()) + gUnknown_0202FFB4->unk612 = 0; + gUnknown_0202FFB4->unk616 = gSaveBlock2.pokedex.order; + gUnknown_0202FFB4->unk60E = gUnknown_0202FFB8; + gUnknown_0202FFB4->unk62C = gUnknown_0202FFBA; + gUnknown_0202FFB4->unk64D = 0; + gUnknown_0202FFB4->unk64E = 0; + if(!sub_806912C()) + { + gUnknown_0202FFB4->unk61A = sub_8090F68(0); + gUnknown_0202FFB4->unk61C = sub_8090F68(1); + } + else + { + gUnknown_0202FFB4->unk61A = pokedex_count(0); + gUnknown_0202FFB4->unk61C = pokedex_count(1); + } + gUnknown_0202FFB4->unk62D = 8; + gMain.state++; + break; + case 3: + { + u16 savedIme; + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= 1; + REG_IME = savedIme; + REG_DISPSTAT |= 8; + SetVBlankCallback(sub_808C0B8); + SetMainCallback2(MainCB); + sub_808D690(gUnknown_0202FFB4->unk612, gUnknown_0202FFB4->unk616); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x80); + } + } +} + +u8 unref_sub_808C540(void (*func)(u8)) +{ + u16 savedIme; + u8 taskId; + + SetVBlankCallback(NULL); + sub_8091060(0x200); + remove_some_task(); + ResetTasks(); + ResetPaletteFade(); + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= 1; + REG_IME = savedIme; + REG_DISPSTAT |= 0x8; + SetVBlankCallback(sub_808C0B8); + SetMainCallback2(MainCB); + if(!gUnknown_0202FFB4->unk64B) + taskId = CreateTask(sub_808CAE4, 0); + else + taskId = CreateTask(sub_808D198, 0); + gTasks[taskId].data[0] = CreateTask(func, 0); + return gTasks[taskId].data[0]; +} + +void MainCB(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void Task_PokedexShowMainScreen(u8 taskId) +{ + gUnknown_0202FFB4->unk64C_1 = 0; + if(sub_808D344(0)) + { + gTasks[taskId].func = Task_PokedexMainScreen; + } +} + +//Hide menu and process input on main screen +void Task_PokedexMainScreen(u8 taskId) +{ + REG_BG0VOFS = gUnknown_0202FFB4->unk654; + + //If menu is open, slide it down, off screen + if(gUnknown_0202FFB4->unk654) + gUnknown_0202FFB4->unk654 -= 8; + else + { + if((gMain.newKeys & A_BUTTON) && gUnknown_0202FFB4->unk0[gUnknown_0202FFB4->unk60E].seen) + { + sub_808E6BC(); + BeginNormalPaletteFade( + ~(1 << (gSprites[gUnknown_0202FFB4->unk626].oam.paletteNum + 16)), + 0, 0, 0x10, 0); + gSprites[gUnknown_0202FFB4->unk626].callback = sub_808EDB8; + gTasks[taskId].func = sub_808CA64; + PlaySE(SE_PIN); + } + else if(gMain.newKeys & START_BUTTON) + { + //Open menu + gUnknown_0202FFB4->unk654 = 0; + gUnknown_0202FFB4->unk650 = 1; + gUnknown_0202FFB4->unk652 = 0; + gTasks[taskId].func = Task_PokedexMainScreenMenu; + PlaySE(SE_SELECT); + } + else if(gMain.newKeys & SELECT_BUTTON) + { + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].data[0] = sub_8091E3C(); + gUnknown_0202FFB4->unk64F = 0; + gUnknown_0202FFB4->unk62A = gUnknown_0202FFB4->unk62C; + gUnknown_0202FFB4->unk610 = gUnknown_0202FFB4->unk60E; + gUnknown_0202FFB4->unk614 = gUnknown_0202FFB4->unk612; + gUnknown_0202FFB4->unk618 = gUnknown_0202FFB4->unk616; + gTasks[taskId].func = sub_808CB8C; + PlaySE(SE_PC_LOGON); + } + else if(gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_ClosePokedex; + PlaySE(SE_PC_OFF); + } + else + { + //Handle D-pad + gUnknown_0202FFB4->unk60E = sub_808E48C(gUnknown_0202FFB4->unk60E, 0xE); + if(gUnknown_0202FFB4->unk62E) + gTasks[taskId].func = sub_808C898; + } + } +} + +void sub_808C898(u8 taskId) +{ + if(sub_808E208(gUnknown_0202FFB4->unk62F, gUnknown_0202FFB4->unk634, gUnknown_0202FFB4->unk636)) + { + gTasks[taskId].func = Task_PokedexMainScreen; + } +} + +//Bring up menu and process menu input +void Task_PokedexMainScreenMenu(u8 taskId) +{ + REG_BG0VOFS = gUnknown_0202FFB4->unk654; + + //If menu is not open, slide it up, on screen + if(gUnknown_0202FFB4->unk654 != 80) + gUnknown_0202FFB4->unk654 += 8; + else + { + if(gMain.newKeys & A_BUTTON) + { + switch(gUnknown_0202FFB4->unk652) + { + case 0: //BACK TO LIST + default: + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 1: //LIST TOP + gUnknown_0202FFB4->unk60E = 0; + gUnknown_0202FFB4->unk62C = 0x40; + sub_808E82C(); + sub_808E0CC(gUnknown_0202FFB4->unk60E, 0xE); + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 2: //LIST BOTTOM + gUnknown_0202FFB4->unk60E = gUnknown_0202FFB4->unk60C - 1; + gUnknown_0202FFB4->unk62C = gUnknown_0202FFB4->unk60C * 16 + 0x30; + sub_808E82C(); + sub_808E0CC(gUnknown_0202FFB4->unk60E, 0xE); + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 3: //CLOSE POKEDEX + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_ClosePokedex; + PlaySE(SE_PC_OFF); + break; + } + } + + //Exit menu when Start or B is pressed + if(gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + gUnknown_0202FFB4->unk650 = 0; + gTasks[taskId].func = Task_PokedexMainScreen; + PlaySE(SE_SELECT); + } + else if((gMain.newAndRepeatedKeys & DPAD_UP) && gUnknown_0202FFB4->unk652 != 0) + { + gUnknown_0202FFB4->unk652--; + PlaySE(SE_SELECT); + } + else if((gMain.newAndRepeatedKeys & DPAD_DOWN) && gUnknown_0202FFB4->unk652 <= 2) + { + gUnknown_0202FFB4->unk652++; + PlaySE(SE_SELECT); + } + } +} + +void sub_808CA64(u8 taskId) +{ + if(gSprites[gUnknown_0202FFB4->unk626].pos1.x == 0x30 && + gSprites[gUnknown_0202FFB4->unk626].pos1.y == 0x38) + { + gUnknown_0202FFB4->unk64B = gUnknown_0202FFB4->unk64A; + gTasks[taskId].data[0] = sub_808F210(&gUnknown_0202FFB4->unk0[gUnknown_0202FFB4->unk60E], gUnknown_0202FFB4->unk626); + gTasks[taskId].func = sub_808CAE4; + } +} + +void sub_808CAE4(u8 taskId) +{ + if(gTasks[gTasks[taskId].data[0]].isActive) + { + if(gUnknown_0202FFB4->unk64A == 1 && + !sub_808F250(gTasks[taskId].data[0]) && + sub_808E71C()) + { + sub_808F284(&gUnknown_0202FFB4->unk0[gUnknown_0202FFB4->unk60E], gTasks[taskId].data[0]); + } + } + else + { + gUnknown_0202FFB8 = gUnknown_0202FFB4->unk60E; + gUnknown_0202FFBA = gUnknown_0202FFB4->unk62C; + gTasks[taskId].func = Task_PokedexShowMainScreen; + } +} + +void sub_808CB8C(u8 taskId) +{ + bool8 isActive = gTasks[gTasks[taskId].data[0]].isActive; + + if(!isActive) + { + if(gUnknown_0202FFB4->unk64F) + { + gUnknown_0202FFB4->unk60E = isActive; + gUnknown_0202FFB4->unk62C = 0x40; + gTasks[taskId].func = sub_808CCC4; + } + else + { + gUnknown_0202FFB4->unk62C = gUnknown_0202FFB4->unk62A; + gUnknown_0202FFB4->unk60E = gUnknown_0202FFB4->unk610; + gUnknown_0202FFB4->unk612 = gUnknown_0202FFB4->unk614; + if(!sub_806912C()) + gUnknown_0202FFB4->unk612 = 0; + gUnknown_0202FFB4->unk616 = gUnknown_0202FFB4->unk618; + gTasks[taskId].func = Task_PokedexShowMainScreen; + } + } +} + +void Task_ClosePokedex(u8 taskId) +{ + if(!gPaletteFade.active) + { + gSaveBlock2.pokedex.unknown1 = gUnknown_0202FFB4->unk612; + if(!sub_806912C()) + gSaveBlock2.pokedex.unknown1 = 0; + gSaveBlock2.pokedex.order = gUnknown_0202FFB4->unk616; + DestroyTask(taskId); + SetMainCallback2(sub_805469C); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); + } +} + +void sub_808CCC4(u8 taskId) +{ + gUnknown_0202FFB4->unk64C_1 = 1; + if(sub_808D344(3)) + gTasks[taskId].func = Task_PokedexResultsScreen; +} + +void Task_PokedexResultsScreen(u8 taskId) +{ + REG_BG0VOFS = gUnknown_0202FFB4->unk654; + + if(gUnknown_0202FFB4->unk654) + gUnknown_0202FFB4->unk654 -= 8; + else + { + if((gMain.newKeys & A_BUTTON) && gUnknown_0202FFB4->unk0[gUnknown_0202FFB4->unk60E].seen) + { + u32 a; + + sub_808E6BC(); + a = (1 << (gSprites[gUnknown_0202FFB4->unk626].oam.paletteNum + 16)); + gSprites[gUnknown_0202FFB4->unk626].callback = sub_808EDB8; + BeginNormalPaletteFade(~a, 0, 0, 0x10, 0); + gTasks[taskId].func = sub_808D118; + PlaySE(SE_PIN); + } + else if(gMain.newKeys & START_BUTTON) + { + gUnknown_0202FFB4->unk654 = 0; + gUnknown_0202FFB4->unk650 = 1; + gUnknown_0202FFB4->unk652 = 0; + gTasks[taskId].func = Task_PokedexResultsScreenMenu; + PlaySE(SE_SELECT); + } + else if(gMain.newKeys & SELECT_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].data[0] = sub_8091E3C(); + gUnknown_0202FFB4->unk64F = 0; + gTasks[taskId].func = sub_808CB8C; + PlaySE(SE_PC_LOGON); + } + else if(gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen; + PlaySE(SE_PC_OFF); + } + else + { + //Handle D-pad + gUnknown_0202FFB4->unk60E = sub_808E48C(gUnknown_0202FFB4->unk60E, 0xE); + if(gUnknown_0202FFB4->unk62E) + gTasks[taskId].func = sub_808CEF8; + } + } +} + +void sub_808CEF8(u8 taskId) +{ + if(sub_808E208(gUnknown_0202FFB4->unk62F, gUnknown_0202FFB4->unk634, gUnknown_0202FFB4->unk636)) + gTasks[taskId].func = Task_PokedexResultsScreen; +} + +void Task_PokedexResultsScreenMenu(u8 taskId) +{ + REG_BG0VOFS = gUnknown_0202FFB4->unk654; + + if(gUnknown_0202FFB4->unk654 != 0x60) + gUnknown_0202FFB4->unk654 += 8; + else + { + if(gMain.newKeys & A_BUTTON) + { + switch(gUnknown_0202FFB4->unk652) + { + case 0: //BACK TO LIST + default: + gMain.newKeys |= START_BUTTON; + break; + case 1: //LIST TOP + gUnknown_0202FFB4->unk60E = 0; + gUnknown_0202FFB4->unk62C = 0x40; + sub_808E82C(); + sub_808E0CC(gUnknown_0202FFB4->unk60E, 0xE); + gMain.newKeys |= START_BUTTON; + break; + case 2: //LIST BOTTOM + gUnknown_0202FFB4->unk60E = gUnknown_0202FFB4->unk60C - 1; + gUnknown_0202FFB4->unk62C = gUnknown_0202FFB4->unk60C * 16 + 0x30; + sub_808E82C(); + sub_808E0CC(gUnknown_0202FFB4->unk60E, 0xE); + gMain.newKeys |= START_BUTTON; + break; + case 3: //BACK TO POKEDEX + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen; + PlaySE(SE_TRACK_DOOR); + break; + case 4: //CLOSE POKEDEX + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_PokedexResultsScreenExitPokedex; + PlaySE(SE_PC_OFF); + break; + } + } + + //Exit menu when Start or B is pressed + if(gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + gUnknown_0202FFB4->unk650 = 0; + gTasks[taskId].func = Task_PokedexResultsScreen; + PlaySE(SE_SELECT); + } + else if((gMain.newAndRepeatedKeys & DPAD_UP) && gUnknown_0202FFB4->unk652) + { + gUnknown_0202FFB4->unk652--; + PlaySE(SE_SELECT); + } + else if((gMain.newAndRepeatedKeys & DPAD_DOWN) && gUnknown_0202FFB4->unk652 <= 3) + { + gUnknown_0202FFB4->unk652++; + PlaySE(SE_SELECT); + } + } +} + +void sub_808D118(u8 taskId) +{ + if(gSprites[gUnknown_0202FFB4->unk626].pos1.x == 0x30 && + gSprites[gUnknown_0202FFB4->unk626].pos1.y == 0x38) + { + gUnknown_0202FFB4->unk64B = gUnknown_0202FFB4->unk64A; + gTasks[taskId].data[0] = sub_808F210(&gUnknown_0202FFB4->unk0[gUnknown_0202FFB4->unk60E], gUnknown_0202FFB4->unk626); + gTasks[taskId].func = sub_808D198; + } +} + +void sub_808D198(u8 taskId) +{ + if(gTasks[gTasks[taskId].data[0]].isActive) + { + if(gUnknown_0202FFB4->unk64A == 1 && + !sub_808F250(gTasks[taskId].data[0]) && + sub_808E71C()) + { + sub_808F284(&gUnknown_0202FFB4->unk0[gUnknown_0202FFB4->unk60E], gTasks[taskId].data[0]); + } + } + else + { + gTasks[taskId].func = sub_808CCC4; + } +} + +void Task_PokedexResultsScreenReturnToMainScreen(u8 taskId) +{ + if(!gPaletteFade.active) + { + gUnknown_0202FFB4->unk62C = gUnknown_0202FFB4->unk62A; + gUnknown_0202FFB4->unk60E = gUnknown_0202FFB4->unk610; + gUnknown_0202FFB4->unk612 = gUnknown_0202FFB4->unk614; + if(!sub_806912C()) + gUnknown_0202FFB4->unk612 = 0; + gUnknown_0202FFB4->unk616 = gUnknown_0202FFB4->unk618; + gTasks[taskId].func = Task_PokedexShowMainScreen; + } +} + +void Task_PokedexResultsScreenExitPokedex(u8 taskId) +{ + if(!gPaletteFade.active) + { + gUnknown_0202FFB4->unk62C = gUnknown_0202FFB4->unk62A; + gUnknown_0202FFB4->unk60E = gUnknown_0202FFB4->unk610; + gUnknown_0202FFB4->unk612 = gUnknown_0202FFB4->unk614; + if(!sub_806912C()) + gUnknown_0202FFB4->unk612 = 0; + gUnknown_0202FFB4->unk616 = gUnknown_0202FFB4->unk618; + gTasks[taskId].func = Task_ClosePokedex; + } +} diff --git a/src/start_menu.c b/src/start_menu.c index a08930a19..c538c20c2 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -32,7 +32,7 @@ extern void sub_8093110(void (*)(void)); extern void sub_80EBA5C(void); extern void sub_80A53F8(void); extern void sub_8089A70(void); -extern void sub_808C27C(void); +extern void CB2_InitPokedex(void); extern u16 pokedex_count(u8); extern void fade_screen(u8, u8); extern bool32 is_c1_link_related_active(); @@ -371,7 +371,7 @@ u8 StartMenu_PokedexCallback(void) { sav12_xor_increment(0x29); play_some_sound(); - SetMainCallback2(sub_808C27C); + SetMainCallback2(CB2_InitPokedex); return 1; } return 0; |