From b1925402a0c7ffa4ca9470ef2ad9afc9a1baaf06 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Sun, 22 Jan 2017 23:22:12 -0600 Subject: start decompiling naming_screen --- src/naming_screen.c | 559 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 559 insertions(+) create mode 100644 src/naming_screen.c (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c new file mode 100644 index 000000000..91860b604 --- /dev/null +++ b/src/naming_screen.c @@ -0,0 +1,559 @@ +#include "global.h" +#include "asm.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h" +#include "text.h" + +struct UnknownStruct2 +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + u8 unk4; + u8 unk5; + u8 unk6; + u8 unk7; + const u8 *title; +}; + +struct UnknownStruct1 +{ + u8 unk0; //state + u8 unk1; + u16 unk2; + u16 unk4; + u16 unk6; + u16 unk8; + u16 unkA; + u8 unkC; + u8 unkD; + u8 unkE; + u8 fillerF[2]; + u8 unk11[0x10]; + u8 filler21[0x13]; + /*0x34*/ const struct UnknownStruct2 *unk34; + /*0x38*/ u8 *nameBuffer; + u16 unk3C; //savedKeyRepeatStartDelay + u16 unk3E; + u16 unk40; + u32 unk44; + /*0x48*/ MainCallback returnCallback; +}; + +extern u16 gKeyRepeatStartDelay; + +extern u8 unk_2000000[]; + +#define EWRAM_000000 (*(struct UnknownStruct1 *)(unk_2000000)) + +extern const struct UnknownStruct2 *const gUnknown_083CE398[]; +extern u8 (*const gUnknown_083CE218[])(struct Task *); +extern u8 (*const gUnknown_083CE240[])(u8); + +void C2_NamingScreen(void); +void sub_80B5AA0(void); +//void AddNamingScreenTask(); +void AddNamingScreenTask(u8, u8 *, u16, u16, u32, MainCallback); +void NamingScreen_TurnOffScreen(void); +void NamingScreen_Init(void); +void NamingScreen_ClearVram(void); +void NamingScreen_ClearOam(void); +void NamingScreen_SetUpVideoRegs(void); +void sub_80B5DC8(void); +void NamingScreen_ResetObjects(void); +void sub_80B5DFC(void); +void sub_80B5E20(void); +void sub_80B5E3C(void); +void sub_80B5C04(void); +void NamingScreenDummyTask(u8); +void sub_80B7558(void); +void sub_80B753C(void); +void sub_80B7680(void); +void sub_80B75C4(void); +void sub_80B7794(void); +void sub_80B78A8(void); +void sub_80B7960(void); +void sub_80B6774(void); +void sub_80B6A80(void); +void sub_80B6CA8(void); +void sub_80B6D04(void); +void sub_80B6E44(void); +void sub_80B61D8(void); +void sub_80B6438(void); +void sub_80B5E50(void); +void sub_80B5E70(u8); +void sub_80B6210(u8); +void sub_80B68D8(); +u8 sub_80B60B8(void); +u8 sub_80B6938(void); +void sub_80B6878(void); +void sub_80B6B14(void); +void sub_80B65F0(void); +void sub_80B6888(); +void sub_80B6460(); +u8 sub_80B6610(void); +void sub_80B7614(void); +void sub_80B6858(); +void sub_80B680C(); +void sub_80B77F8(void); +void sub_80B74B0(void); +void sub_80B74FC(void); +u8 sub_80B6958(void); +u8 sub_80B61C8(void); +void sub_80B6FBC(void); +void sub_80B7090(void); +u8 sub_80B61EC(void); +u8 sub_80B7004(void); +void sub_80B6914(void); +void sub_80B623C(u8); + +void DoNamingScreen(u8 a, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +{ + AddNamingScreenTask(a, nameBuffer, c, d, e, returnCallback); + SetMainCallback2(C2_NamingScreen); +} + +void C2_NamingScreen(void) +{ + switch (gMain.state) + { + case 0: + NamingScreen_TurnOffScreen(); + NamingScreen_Init(); + gMain.state++; + break; + case 1: + NamingScreen_ClearVram(); + gMain.state++; + break; + case 2: + NamingScreen_ClearOam(); + gMain.state++; + break; + case 3: + NamingScreen_SetUpVideoRegs(); + gMain.state++; + break; + case 4: + sub_80B5DC8(); + gMain.state++; + break; + case 5: + NamingScreen_ResetObjects(); + gMain.state++; + break; + case 6: + sub_80B5DFC(); + gMain.state++; + break; + case 7: + sub_80B5E20(); + sub_80B5E3C(); + sub_80B5C04(); + SetMainCallback2(sub_80B5AA0); + break; + } +} + +void sub_80B5AA0(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_80B5AB8(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + REG_BG1VOFS = EWRAM_000000.unk4; + REG_BG2VOFS = EWRAM_000000.unk6; + REG_BG1CNT &= 0xFFFC; + REG_BG1CNT |= EWRAM_000000.unk8; + REG_BG2CNT &= 0xFFFC; + REG_BG2CNT |= EWRAM_000000.unkA; +} + +void AddNamingScreenTask(u8 a, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +{ + struct Task *task; + + task = &gTasks[CreateTask(NamingScreenDummyTask, 0xFF)]; + task->data[0] = a; + task->data[1] = c; + task->data[2] = d; + task->data[3] = e >> 16; + task->data[4] = e; + StoreWordInTwoHalfwords(&task->data[5], (u32)nameBuffer); + StoreWordInTwoHalfwords(&task->data[7], (u32)returnCallback); +} + +void GetNamingScreenParameters(void) +{ + u8 taskId; + struct Task *task; + + taskId = FindTaskIdByFunc(NamingScreenDummyTask); + task = &gTasks[taskId]; + EWRAM_000000.unk1 = task->data[0]; + EWRAM_000000.unk3E = task->data[1]; + EWRAM_000000.unk40 = task->data[2]; + EWRAM_000000.unk44 = (task->data[3] << 16) | (u16)task->data[4]; + LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&EWRAM_000000.nameBuffer); + LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&EWRAM_000000.returnCallback); + DestroyTask(taskId); +} + +void NamingScreenDummyTask(u8 taskId) +{ +} + +void NamingScreen_TurnOffScreen(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + REG_DISPCNT = 0; +} + +void sub_80B5C04(void) +{ + u16 savedIme; + + SetVBlankCallback(sub_80B5AB8); + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; +} + +void NamingScreen_ClearVram(void) +{ + u8 *addr = (void *)VRAM; + u32 size = 0x10000; + + while (1) + { + DmaFill16(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaFill16(3, 0, addr, size); + break; + } + } +} + +void NamingScreen_ClearOam(void) +{ + DmaClear16(3, (void *)OAM, 0x400); +} + +void NamingScreen_SetUpVideoRegs(void) +{ + REG_BG0CNT = 0; + REG_BG1CNT = 0; + REG_BG2CNT = 0; + REG_BG3CNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG0CNT = 0x1F00; + REG_BG1CNT = 0x1C01; + REG_BG2CNT = 0x1D0A; + REG_BG3CNT = 0x1E03; + REG_BLDCNT = 0x640; + REG_BLDALPHA = 0x80C; +} + +void NamingScreen_Init(void) +{ + GetNamingScreenParameters(); + EWRAM_000000.unk0 = 0; + EWRAM_000000.unk4 = 0; + EWRAM_000000.unk6 = 0; + EWRAM_000000.unk8 = 1; + EWRAM_000000.unkA = 2; + EWRAM_000000.unkC = 0; + EWRAM_000000.unkD = 1; + EWRAM_000000.unk34 = gUnknown_083CE398[EWRAM_000000.unk1]; + EWRAM_000000.unkE = EWRAM_000000.unk34->unk4; + EWRAM_000000.unk2 = 14 - EWRAM_000000.unk34->unk1 / 2; + EWRAM_000000.unk3C = gKeyRepeatStartDelay; + memset(EWRAM_000000.unk11, 0xFF, 0x10); + if (EWRAM_000000.unk34->unk0 != 0) + StringCopy(EWRAM_000000.unk11, EWRAM_000000.nameBuffer); + gKeyRepeatStartDelay = 16; +} + +void sub_80B5DC8(void) +{ + SetUpWindowConfig(&gWindowConfig_81E6E88); + InitMenuWindow(&gWindowConfig_81E6E88); +} + +void NamingScreen_ResetObjects(void) +{ + ResetPaletteFade(); + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); +} + +void sub_80B5DFC(void) +{ + sub_80B7558(); + sub_80B753C(); + sub_80B7680(); + sub_80B75C4(); + sub_80B7794(); + sub_80B78A8(); + sub_80B7960(); +} + +void sub_80B5E20(void) +{ + sub_80B6774(); + sub_80B6A80(); + sub_80B6CA8(); + sub_80B6D04(); + sub_80B6E44(); +} + +void sub_80B5E3C(void) +{ + sub_80B61D8(); + sub_80B6438(); + sub_80B5E50(); +} + +void sub_80B5E50(void) +{ + u8 taskId; + + taskId = CreateTask(sub_80B5E70, 2); + sub_80B5E70(taskId); +} + +void sub_80B5E70(u8 taskId) +{ + while (gUnknown_083CE218[EWRAM_000000.unk0](&gTasks[taskId]) != 0) + ; +} + +u8 sub_80B5EA8(struct Task *task) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + EWRAM_000000.unk0++; + return 0; +} + +u8 sub_80B5ED0(struct Task *task) +{ + if (!gPaletteFade.active) + { + sub_80B6210(1); + sub_80B68D8(1); + EWRAM_000000.unk0++; + } + return 0; +} + +u8 sub_80B5F00(struct Task *task) +{ + return sub_80B60B8(); +} + +u8 sub_80B5F10(struct Task *task) +{ + if (sub_80B6938() != 0) + { + sub_80B6210(1); + sub_80B6878(); + EWRAM_000000.unk0 = 2; + } + return 0; +} + +u8 sub_80B5F38(struct Task *task) +{ + sub_80B6210(0); + sub_80B6B14(); + sub_80B65F0(); + sub_80B6888(1); + sub_80B6460(0, 0, 1); + PlaySE(SE_WIN_OPEN); + EWRAM_000000.unk0 = 5; + return 0; +} + +u8 sub_80B5F70(struct Task *task) +{ + s16 var1; + s16 var2; + + if (sub_80B6610() != 0) + { + EWRAM_000000.unk0 = 2; + EWRAM_000000.unkE++; + EWRAM_000000.unkE %= 3; + sub_80B7614(); + sub_80B77F8(); + sub_80B6210(1); + sub_80B6858(&var1, &var2); + if (EWRAM_000000.unkE == 2 && (u16)(var1 - 6) <= 1) + var1 = 5; + sub_80B680C(var1, var2); + sub_80B6888(0); + } + return 0; +} + +u8 pokemon_store(struct Task *task) +{ + sub_80B74B0(); + sub_80B6210(0); + sub_80B68D8(0); + sub_80B6460(3, 0, 1); + gKeyRepeatStartDelay = EWRAM_000000.unk3C; + if (EWRAM_000000.unk1 == 2 && CalculatePlayerPartyCount() > 5) + { + sub_80B74FC(); + EWRAM_000000.unk0 = 7; + return 0; + } + else + { + EWRAM_000000.unk0 = 8; + return 1; + } +} + +u8 sub_80B604C(struct Task *task) +{ + if (MenuUpdateWindowText()) + EWRAM_000000.unk0++; + return 0; +} + +u8 sub_80B606C(struct Task *task) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + EWRAM_000000.unk0++; + return 0; +} + +u8 sub_80B6094(struct Task *task) +{ + if (!gPaletteFade.active) + SetMainCallback2(EWRAM_000000.returnCallback); + return 0; +} + +u8 sub_80B60B8(void) +{ + u8 var = sub_80B61EC(); + u8 r0 = sub_80B6958(); + + if (var == 8) + return sub_80B61C8(); + else if (var == 6) + { + sub_80B6FBC(); + return 0; + } + else if (var == 7) + { + sub_80B7090(); + return 0; + } + return gUnknown_083CE240[r0](var); +} + +u8 sub_80B6108(u8 a) +{ + sub_80B6460(3, 0, 0); + if (a == 5) + { + u8 var = sub_80B7004(); + + sub_80B6914(); + if (var != 0) + { + sub_80B6210(0); + EWRAM_000000.unk0 = 3; + } + } + return 0; +} + +u8 sub_80B6148(u8 a) +{ + sub_80B6460(0, 1, 0); + if (a == 5) + return sub_80B61C8(); + else + return 0; +} + +u8 sub_80B6170(u8 a) +{ + sub_80B6460(1, 1, 0); + if (a == 5) + sub_80B6FBC(); + return 0; +} + +u8 sub_80B6194(u8 a) +{ + sub_80B6460(2, 1, 0); + if (a == 5) + { + PlaySE(SE_SELECT); + EWRAM_000000.unk0 = 6; + return 1; + } + else + return 0; +} + +u8 sub_80B61C8(void) +{ + EWRAM_000000.unk0 = 4; + return 1; +} + +void sub_80B61D8(void) +{ + CreateTask(sub_80B623C, 1); +} + +u8 sub_80B61EC(void) +{ + u8 taskId = FindTaskIdByFunc(sub_80B623C); + + return gTasks[taskId].data[1]; +} + +void sub_80B6210(u8 a) +{ + u8 taskId = FindTaskIdByFunc(sub_80B623C); + + gTasks[taskId].data[0] = a; +} -- cgit v1.2.3 From 9442bdcbf3abf3e44d2829ec72bfe23649c7d8ac Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Tue, 24 Jan 2017 22:31:44 -0600 Subject: decompile more of naming_screen (#216) * decompile more code * incbin graphics data * decompile more code --- src/naming_screen.c | 1115 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 1042 insertions(+), 73 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 91860b604..1c718b3ca 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -9,6 +9,7 @@ #include "string_util.h" #include "task.h" #include "text.h" +#include "trig.h" struct UnknownStruct2 { @@ -16,7 +17,7 @@ struct UnknownStruct2 u8 unk1; u8 unk2; u8 unk3; - u8 unk4; + u8 unk4; //mode? u8 unk5; u8 unk6; u8 unk7; @@ -25,8 +26,8 @@ struct UnknownStruct2 struct UnknownStruct1 { - u8 unk0; //state - u8 unk1; + u8 state; //state + u8 mode; u16 unk2; u16 unk4; u16 unk6; @@ -34,9 +35,10 @@ struct UnknownStruct1 u16 unkA; u8 unkC; u8 unkD; - u8 unkE; - u8 fillerF[2]; - u8 unk11[0x10]; + u8 currentPage; //page? + u8 cursorSpriteId; //spriteId + u8 unk10; + u8 textBuffer[0x10]; u8 filler21[0x13]; /*0x34*/ const struct UnknownStruct2 *unk34; /*0x38*/ u8 *nameBuffer; @@ -47,15 +49,50 @@ struct UnknownStruct1 /*0x48*/ MainCallback returnCallback; }; +enum +{ + NAMING_SCREEN_MODE_PLAYER_NAME, + NAMING_SCREEN_MODE_BOX_NAME, + NAMING_SCREEN_MODE_MON_NAME, +}; + +enum +{ + PAGE_UPPER, + PAGE_LOWER, + PAGE_OTHERS, +}; + extern u16 gKeyRepeatStartDelay; extern u8 unk_2000000[]; #define EWRAM_000000 (*(struct UnknownStruct1 *)(unk_2000000)) +const u32 gSpriteImage_83CE094[] = INCBIN_U32("graphics/naming_screen/pc_icon/0.4bpp"); +const u32 gSpriteImage_83CE154[] = INCBIN_U32("graphics/naming_screen/pc_icon/1.4bpp"); + +//Some unused pointer, perhaps. +asm(".section .rodata\n\ +@ XXX: what is this?\n\ + .align 2\n\ + .4byte 0x2000000\n"); + +extern u16 *const gUnknown_083CE28C[]; extern const struct UnknownStruct2 *const gUnknown_083CE398[]; -extern u8 (*const gUnknown_083CE218[])(struct Task *); -extern u8 (*const gUnknown_083CE240[])(u8); +extern const struct SubspriteTable gSubspriteTables_83CE558[]; +extern const struct SubspriteTable gSubspriteTables_83CE560[]; +extern const struct SubspriteTable gSubspriteTables_83CE578[]; +extern const struct SubspriteTable gSubspriteTables_83CE580[]; +extern const struct SpriteTemplate gSpriteTemplate_83CE5C8; +extern const struct SpriteTemplate gSpriteTemplate_83CE5E0; +extern const struct SpriteTemplate gSpriteTemplate_83CE5F8; +extern const struct SpriteTemplate gSpriteTemplate_83CE610; +extern const struct SpriteTemplate gSpriteTemplate_83CE628; +extern const struct SpriteTemplate gSpriteTemplate_83CE640; +extern const struct SpriteTemplate gSpriteTemplate_83CE658; +extern const struct SpriteTemplate gSpriteTemplate_83CE670; +extern const struct SpriteTemplate gSpriteTemplate_83CE688; void C2_NamingScreen(void); void sub_80B5AA0(void); @@ -85,23 +122,23 @@ void sub_80B6A80(void); void sub_80B6CA8(void); void sub_80B6D04(void); void sub_80B6E44(void); -void sub_80B61D8(void); +void InitInput(void); void sub_80B6438(void); void sub_80B5E50(void); void sub_80B5E70(u8); -void sub_80B6210(u8); -void sub_80B68D8(); +void SetInputState(u8); +void sub_80B68D8(u8); u8 sub_80B60B8(void); -u8 sub_80B6938(void); +bool8 sub_80B6938(void); void sub_80B6878(void); void sub_80B6B14(void); void sub_80B65F0(void); -void sub_80B6888(); -void sub_80B6460(); -u8 sub_80B6610(void); +void sub_80B6888(u8); +void sub_80B6460(u8, u8, u8); +bool8 sub_80B6610(void); void sub_80B7614(void); -void sub_80B6858(); -void sub_80B680C(); +void get_cursor_pos(s16 *, s16 *); +void set_cursor_pos(s16, s16); void sub_80B77F8(void); void sub_80B74B0(void); void sub_80B74FC(void); @@ -109,14 +146,35 @@ u8 sub_80B6958(void); u8 sub_80B61C8(void); void sub_80B6FBC(void); void sub_80B7090(void); -u8 sub_80B61EC(void); +u8 GetInputPressedButton(void); u8 sub_80B7004(void); void sub_80B6914(void); -void sub_80B623C(u8); +void Task_HandleInput(u8); +void HandleDpadMovement(struct Task *); +void sub_80B64D4(u8); +void sub_80B65AC(u8); +void sub_80B65D4(struct Task *, u8, u8); +u16 sub_80B654C(u8); +extern void MultiplyInvertedPaletteRGBComponents(u16, u8, u8, u8); +void sub_80B6630(u8); +void sub_80B6C48(u8, struct Sprite *, struct Sprite *); +u8 sub_80B6F44(void); +extern u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8, u8); +extern u8 CreateMonIcon(); +extern void sub_809D51C(void); +u8 sub_80B7768(s16, s16); +u8 sub_80B7104(void); +u8 sub_80B713C(void); +void sub_80B7174(u8); -void DoNamingScreen(u8 a, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +#define NAMING_SCREEN_A_BUTTON 5 +#define NAMING_SCREEN_B_BUTTON 6 +#define NAMING_SCREEN_SELECT_BUTTON 8 +#define NAMING_SCREEN_START_BUTTON 9 + +void DoNamingScreen(u8 mode, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) { - AddNamingScreenTask(a, nameBuffer, c, d, e, returnCallback); + AddNamingScreenTask(mode, nameBuffer, c, d, e, returnCallback); SetMainCallback2(C2_NamingScreen); } @@ -183,12 +241,12 @@ void sub_80B5AB8(void) REG_BG2CNT |= EWRAM_000000.unkA; } -void AddNamingScreenTask(u8 a, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +void AddNamingScreenTask(u8 mode, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) { struct Task *task; task = &gTasks[CreateTask(NamingScreenDummyTask, 0xFF)]; - task->data[0] = a; + task->data[0] = mode; task->data[1] = c; task->data[2] = d; task->data[3] = e >> 16; @@ -204,7 +262,7 @@ void GetNamingScreenParameters(void) taskId = FindTaskIdByFunc(NamingScreenDummyTask); task = &gTasks[taskId]; - EWRAM_000000.unk1 = task->data[0]; + EWRAM_000000.mode = task->data[0]; EWRAM_000000.unk3E = task->data[1]; EWRAM_000000.unk40 = task->data[2]; EWRAM_000000.unk44 = (task->data[3] << 16) | (u16)task->data[4]; @@ -241,7 +299,7 @@ void NamingScreen_ClearVram(void) { u8 *addr = (void *)VRAM; u32 size = 0x10000; - + while (1) { DmaFill16(3, 0, addr, 0x1000); @@ -285,20 +343,20 @@ void NamingScreen_SetUpVideoRegs(void) void NamingScreen_Init(void) { GetNamingScreenParameters(); - EWRAM_000000.unk0 = 0; + EWRAM_000000.state = 0; EWRAM_000000.unk4 = 0; EWRAM_000000.unk6 = 0; EWRAM_000000.unk8 = 1; EWRAM_000000.unkA = 2; EWRAM_000000.unkC = 0; EWRAM_000000.unkD = 1; - EWRAM_000000.unk34 = gUnknown_083CE398[EWRAM_000000.unk1]; - EWRAM_000000.unkE = EWRAM_000000.unk34->unk4; + EWRAM_000000.unk34 = gUnknown_083CE398[EWRAM_000000.mode]; + EWRAM_000000.currentPage = EWRAM_000000.unk34->unk4; EWRAM_000000.unk2 = 14 - EWRAM_000000.unk34->unk1 / 2; EWRAM_000000.unk3C = gKeyRepeatStartDelay; - memset(EWRAM_000000.unk11, 0xFF, 0x10); + memset(EWRAM_000000.textBuffer, 0xFF, 0x10); if (EWRAM_000000.unk34->unk0 != 0) - StringCopy(EWRAM_000000.unk11, EWRAM_000000.nameBuffer); + StringCopy(EWRAM_000000.textBuffer, EWRAM_000000.nameBuffer); gKeyRepeatStartDelay = 16; } @@ -338,7 +396,7 @@ void sub_80B5E20(void) void sub_80B5E3C(void) { - sub_80B61D8(); + InitInput(); sub_80B6438(); sub_80B5E50(); } @@ -351,16 +409,43 @@ void sub_80B5E50(void) sub_80B5E70(taskId); } +// + +u8 sub_80B5EA8(struct Task *); +u8 sub_80B5ED0(struct Task *); +u8 sub_80B5F00(struct Task *); +u8 sub_80B5F10(struct Task *); +u8 sub_80B5F38(struct Task *); +u8 sub_80B5F70(struct Task *); +u8 pokemon_store(struct Task *); +u8 sub_80B604C(struct Task *); +u8 sub_80B606C(struct Task *); +u8 sub_80B6094(struct Task *); + +static u8 (*const gUnknown_083CE218[])(struct Task *) = +{ + sub_80B5EA8, + sub_80B5ED0, + sub_80B5F00, + sub_80B5F10, + sub_80B5F38, + sub_80B5F70, + pokemon_store, + sub_80B604C, + sub_80B606C, + sub_80B6094, +}; + void sub_80B5E70(u8 taskId) { - while (gUnknown_083CE218[EWRAM_000000.unk0](&gTasks[taskId]) != 0) + while (gUnknown_083CE218[EWRAM_000000.state](&gTasks[taskId]) != 0) ; } u8 sub_80B5EA8(struct Task *task) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - EWRAM_000000.unk0++; + EWRAM_000000.state++; return 0; } @@ -368,9 +453,9 @@ u8 sub_80B5ED0(struct Task *task) { if (!gPaletteFade.active) { - sub_80B6210(1); + SetInputState(1); sub_80B68D8(1); - EWRAM_000000.unk0++; + EWRAM_000000.state++; } return 0; } @@ -384,42 +469,42 @@ u8 sub_80B5F10(struct Task *task) { if (sub_80B6938() != 0) { - sub_80B6210(1); + SetInputState(1); sub_80B6878(); - EWRAM_000000.unk0 = 2; + EWRAM_000000.state = 2; } return 0; } u8 sub_80B5F38(struct Task *task) { - sub_80B6210(0); + SetInputState(0); sub_80B6B14(); sub_80B65F0(); sub_80B6888(1); sub_80B6460(0, 0, 1); PlaySE(SE_WIN_OPEN); - EWRAM_000000.unk0 = 5; + EWRAM_000000.state = 5; return 0; } u8 sub_80B5F70(struct Task *task) { - s16 var1; - s16 var2; + s16 cursorX; + s16 cursorY; - if (sub_80B6610() != 0) + if (sub_80B6610()) { - EWRAM_000000.unk0 = 2; - EWRAM_000000.unkE++; - EWRAM_000000.unkE %= 3; + EWRAM_000000.state = 2; + EWRAM_000000.currentPage++; + EWRAM_000000.currentPage %= 3; sub_80B7614(); sub_80B77F8(); - sub_80B6210(1); - sub_80B6858(&var1, &var2); - if (EWRAM_000000.unkE == 2 && (u16)(var1 - 6) <= 1) - var1 = 5; - sub_80B680C(var1, var2); + SetInputState(1); + get_cursor_pos(&cursorX, &cursorY); + if (EWRAM_000000.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) + cursorX = 5; + set_cursor_pos(cursorX, cursorY); sub_80B6888(0); } return 0; @@ -428,19 +513,20 @@ u8 sub_80B5F70(struct Task *task) u8 pokemon_store(struct Task *task) { sub_80B74B0(); - sub_80B6210(0); + SetInputState(0); sub_80B68D8(0); sub_80B6460(3, 0, 1); gKeyRepeatStartDelay = EWRAM_000000.unk3C; - if (EWRAM_000000.unk1 == 2 && CalculatePlayerPartyCount() > 5) + if (EWRAM_000000.mode == NAMING_SCREEN_MODE_MON_NAME + && CalculatePlayerPartyCount() > 5) { sub_80B74FC(); - EWRAM_000000.unk0 = 7; + EWRAM_000000.state = 7; return 0; } else { - EWRAM_000000.unk0 = 8; + EWRAM_000000.state = 8; return 1; } } @@ -448,14 +534,14 @@ u8 pokemon_store(struct Task *task) u8 sub_80B604C(struct Task *task) { if (MenuUpdateWindowText()) - EWRAM_000000.unk0++; + EWRAM_000000.state++; return 0; } u8 sub_80B606C(struct Task *task) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - EWRAM_000000.unk0++; + EWRAM_000000.state++; return 0; } @@ -466,24 +552,37 @@ u8 sub_80B6094(struct Task *task) return 0; } +u8 sub_80B6108(u8); +u8 sub_80B6148(u8); +u8 sub_80B6170(u8); +u8 sub_80B6194(u8); + +static u8 (*const gUnknown_083CE240[])(u8) = +{ + sub_80B6108, + sub_80B6148, + sub_80B6170, + sub_80B6194, +}; + u8 sub_80B60B8(void) { - u8 var = sub_80B61EC(); + u8 button = GetInputPressedButton(); u8 r0 = sub_80B6958(); - if (var == 8) + if (button == 8) return sub_80B61C8(); - else if (var == 6) + else if (button == 6) { sub_80B6FBC(); return 0; } - else if (var == 7) + else if (button == 7) { sub_80B7090(); return 0; } - return gUnknown_083CE240[r0](var); + return gUnknown_083CE240[r0](button); } u8 sub_80B6108(u8 a) @@ -496,8 +595,8 @@ u8 sub_80B6108(u8 a) sub_80B6914(); if (var != 0) { - sub_80B6210(0); - EWRAM_000000.unk0 = 3; + SetInputState(0); + EWRAM_000000.state = 3; } } return 0; @@ -526,7 +625,7 @@ u8 sub_80B6194(u8 a) if (a == 5) { PlaySE(SE_SELECT); - EWRAM_000000.unk0 = 6; + EWRAM_000000.state = 6; return 1; } else @@ -535,25 +634,895 @@ u8 sub_80B6194(u8 a) u8 sub_80B61C8(void) { - EWRAM_000000.unk0 = 4; + EWRAM_000000.state = 4; return 1; } -void sub_80B61D8(void) +//-------------------------------------------------- +// Input handling +//-------------------------------------------------- + +enum +{ + FNKEY_CASE, + FNKEY_BACK, + FNKEY_OK, +}; + +#define tState data[0] +#define tPressedButton data[1] +#define tKbFunctionKey data[2] + +void InitInput(void) +{ + CreateTask(Task_HandleInput, 1); +} + +u8 GetInputPressedButton(void) +{ + u8 taskId = FindTaskIdByFunc(Task_HandleInput); + + return gTasks[taskId].tPressedButton; +} + +void SetInputState(u8 state) +{ + u8 taskId = FindTaskIdByFunc(Task_HandleInput); + + gTasks[taskId].tState = state; +} + +static void sub_80B626C(struct Task *); +static void sub_80B6274(struct Task *); + +static void (*const sInputStateHandlers[])(struct Task *) = +{ + sub_80B626C, + sub_80B6274, +}; + +void Task_HandleInput(u8 taskId) +{ + sInputStateHandlers[gTasks[taskId].tState](&gTasks[taskId]); +} + +static void sub_80B626C(struct Task *task) +{ + task->tPressedButton = 0; +} + +static void sub_80B6274(struct Task *task) +{ + task->tPressedButton = 0; + if (gMain.newKeys & A_BUTTON) + { + task->tPressedButton = 5; + return; + } + if (gMain.newKeys & B_BUTTON) + { + task->tPressedButton = 6; + return; + } + if (gMain.newKeys & SELECT_BUTTON) + { + task->tPressedButton = 8; + return; + } + if (gMain.newKeys & START_BUTTON) + { + task->tPressedButton = 9; + sub_80B6878(); + return; + } + HandleDpadMovement(task); +} + +static const s16 sDpadDeltaX[] = +{ + 0, //none + 0, //up + 0, //down + -1, //left + 1 //right +}; + +static const s16 sDpadDeltaY[] = +{ + 0, //none + -1, //up + 1, //down + 0, //left + 0 //right +}; + +static const s16 s4RowTo3RowTableY[] = {0, 1, 1, 2}; +static const s16 gUnknown_083CE274[] = {0, 0, 3, 0}; + +void HandleDpadMovement(struct Task *task) +{ + s16 cursorX; + s16 cursorY; + u16 dpadDir; + s16 prevCursorX; + + get_cursor_pos(&cursorX, &cursorY); + dpadDir = 0; + if (gMain.newAndRepeatedKeys & DPAD_UP) + dpadDir = 1; + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + dpadDir = 2; + if (gMain.newAndRepeatedKeys & DPAD_LEFT) + dpadDir = 3; + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + dpadDir = 4; + + //Get new cursor position + prevCursorX = cursorX; + cursorX += sDpadDeltaX[dpadDir]; + cursorY += sDpadDeltaY[dpadDir]; + + //Wrap cursor position in the X direction + if (cursorX < 0) + cursorX = 8; + if (cursorX > 8) + cursorX = 0; + + //Handle cursor movement in X direction + if (sDpadDeltaX[dpadDir] != 0) + { + //The "others" page only has 5 columns + if (EWRAM_000000.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) + { + if (sDpadDeltaX[dpadDir] > 0) + cursorX = 8; + else + cursorX = 5; + } + + if (cursorX == 8) + { + //We are now on the last column + task->tKbFunctionKey = cursorY; + cursorY = s4RowTo3RowTableY[cursorY]; + } + else if (prevCursorX == 8) + { + if (cursorY == 1) + cursorY = task->tKbFunctionKey; + else + cursorY = gUnknown_083CE274[cursorY]; + } + } + + if (cursorX == 8) + { + //There are only 3 keys on the last column, unlike the others, + //so wrap Y accordingly + if (cursorY < 0) + cursorY = 2; + if (cursorY > 2) + cursorY = 0; + if (cursorY == 0) + task->tKbFunctionKey = FNKEY_BACK; + else if (cursorY == 2) + task->tKbFunctionKey = FNKEY_OK; + } + else + { + if (cursorY < 0) + cursorY = 3; + if (cursorY > 3) + cursorY = 0; + } + set_cursor_pos(cursorX, cursorY); +} + +#undef tState +#undef tPressedButton +#undef tKbFunctionKey + +//-------------------------------------------------- + +void sub_80B6438(void) +{ + u8 taskId; + + taskId = CreateTask(sub_80B64D4, 3); + gTasks[taskId].data[0] = 3; +} + +void sub_80B6460(u8 a, u8 b, u8 c) +{ + struct Task *task; + + task = &gTasks[FindTaskIdByFunc(sub_80B64D4)]; + if (a == task->data[0] && c == 0) + { + task->data[1] = b; + task->data[2] = 1; + return; + } + if (a == 3 && task->data[1] == 0 && c == 0) + return; + if (task->data[0] != 3) + sub_80B65AC(task->data[0]); + sub_80B65D4(task, a, b); +} + +void sub_80B64D4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (task->data[0] == 3 || task->data[2] == 0) + return; + MultiplyInvertedPaletteRGBComponents(sub_80B654C(task->data[0]), task->data[3], task->data[3], task->data[3]); + if (task->data[5] != 0) + { + task->data[5]--; + if (task->data[5] != 0) + return; + } + task->data[5] = 2; + task->data[3] += task->data[4]; + if (task->data[3] == 16) + task->data[4] = -task->data[4]; + else if (task->data[3] == 0) + { + task->data[2] = task->data[1]; + task->data[4] = -task->data[4]; + } +} + +u16 sub_80B654C(u8 a) +{ + const u16 arr[] = + { + IndexOfSpritePaletteTag(4) * 16 + 0x10E, + IndexOfSpritePaletteTag(6) * 16 + 0x10C, + IndexOfSpritePaletteTag(6) * 16 + 0x10E, + }; + + return arr[a]; +} + +void sub_80B65AC(u8 a) +{ + u16 index = sub_80B654C(a); + + gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; +} + +void sub_80B65D4(struct Task *task, u8 b, u8 c) +{ + task->data[0] = b; + task->data[1] = c; + task->data[2] = 1; + task->data[3] = 15; + task->data[4] = 1; + task->data[5] = 0; +} + +// + +u8 sub_80B6668(struct Task *); +u8 sub_80B6680(struct Task *); +u8 sub_80B66EC(struct Task *); +u8 sub_80B6758(struct Task *); + +u8 (*const gUnknown_083CE27C[])(struct Task *) = +{ + sub_80B6668, + sub_80B6680, + sub_80B66EC, + sub_80B6758, +}; + +void sub_80B65F0(void) +{ + u8 taskId; + + taskId = CreateTask(sub_80B6630, 0); + sub_80B6630(taskId); +} + +bool8 sub_80B6610(void) { - CreateTask(sub_80B623C, 1); + if (FindTaskIdByFunc(sub_80B6630) == 0xFF) + return TRUE; + else + return FALSE; } -u8 sub_80B61EC(void) +void sub_80B6630(u8 taskId) { - u8 taskId = FindTaskIdByFunc(sub_80B623C); + while (gUnknown_083CE27C[gTasks[taskId].data[0]](&gTasks[taskId]) != 0) + ; +} + +u8 sub_80B6668(struct Task *task) +{ + EWRAM_000000.unk4 = 0; + EWRAM_000000.unk6 = 0; + task->data[0]++; + return 0; +} + +u8 sub_80B6680(struct Task *task) +{ + u16 *const arr[] = {&EWRAM_000000.unk6, &EWRAM_000000.unk4}; - return gTasks[taskId].data[1]; + task->data[1] += 4; + *arr[EWRAM_000000.unkC] = Sin(task->data[1], 0x28); + *arr[EWRAM_000000.unkD] = Sin((task->data[1] + 0x80) & 0xFF, 0x28); + if (task->data[1] > 0x3F) + { + u8 temp = EWRAM_000000.unk8; //Why u8 and not u16? + + EWRAM_000000.unk8 = EWRAM_000000.unkA; + EWRAM_000000.unkA = temp; + task->data[0]++; + } + return 0; } -void sub_80B6210(u8 a) +u8 sub_80B66EC(struct Task *task) { - u8 taskId = FindTaskIdByFunc(sub_80B623C); + u16 *const arr[] = {&EWRAM_000000.unk6, &EWRAM_000000.unk4}; - gTasks[taskId].data[0] = a; + task->data[1] += 4; + *arr[EWRAM_000000.unkC] = Sin(task->data[1], 0x28); + *arr[EWRAM_000000.unkD] = Sin((task->data[1] + 0x80) & 0xFF, 0x28); + if (task->data[1] > 0x7F) + { + u8 temp = EWRAM_000000.unkC; + + EWRAM_000000.unkC = EWRAM_000000.unkD; + EWRAM_000000.unkD = temp; + task->data[0]++; + } + return 0; +} + +u8 sub_80B6758(struct Task *task) +{ + DestroyTask(FindTaskIdByFunc(sub_80B6630)); + return 0; +} + +// + +void sub_80B6774(void) +{ + EWRAM_000000.cursorSpriteId = CreateSprite(&gSpriteTemplate_83CE640, 0, 0, 0); + gSprites[EWRAM_000000.cursorSpriteId].oam.priority = 1; + gSprites[EWRAM_000000.cursorSpriteId].oam.objMode = 1; + gSprites[EWRAM_000000.cursorSpriteId].data6 = 1; + gSprites[EWRAM_000000.cursorSpriteId].data6 = 2; + set_cursor_pos(0, 0); +} + +static const u8 sKeyboardSymbolPositions[][9] = +{ + {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Upper page + {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Lower page + {1, 4, 7, 10, 13, 16, 16, 16, 19}, //Others page +}; + +u8 sub_80B67EC(s16 x) +{ + return sKeyboardSymbolPositions[EWRAM_000000.currentPage][x]; +} + +void set_cursor_pos(s16 x, s16 y) +{ + struct Sprite *sprite = &gSprites[EWRAM_000000.cursorSpriteId]; + + sprite->pos1.x = sub_80B67EC(x) * 8 + 27; + sprite->pos1.y = y * 16 + 80; + sprite->data2 = sprite->data0; + sprite->data3 = sprite->data1; + sprite->data0 = x; + sprite->data1 = y; +} + +void get_cursor_pos(s16 *x, s16 *y) +{ + struct Sprite *sprite = &gSprites[EWRAM_000000.cursorSpriteId]; + + *x = sprite->data0; + *y = sprite->data1; +} + +void sub_80B6878(void) +{ + set_cursor_pos(8, 2); +} + +void sub_80B6888(u8 a) +{ + gSprites[EWRAM_000000.cursorSpriteId].data4 &= -256; + gSprites[EWRAM_000000.cursorSpriteId].data4 |= a; + StartSpriteAnim(&gSprites[EWRAM_000000.cursorSpriteId], 0); +} + +void sub_80B68D8(u8 a) +{ + gSprites[EWRAM_000000.cursorSpriteId].data4 &= 0xFF; + gSprites[EWRAM_000000.cursorSpriteId].data4 |= a << 8; +} + +void sub_80B6914(void) +{ + StartSpriteAnim(&gSprites[EWRAM_000000.cursorSpriteId], 1); +} + +bool8 sub_80B6938(void) +{ + return gSprites[EWRAM_000000.cursorSpriteId].animEnded; +} + +u8 sub_80B6958(void) +{ + const u8 arr[] = {1, 2, 3}; + s16 var1; + s16 var2; + + get_cursor_pos(&var1, &var2); + if (var1 < 8) + return 0; + else + return arr[var2]; +} + +#ifdef NONMATCHING +void sub_80B6998(struct Sprite *sprite) +{ + if (sprite->animEnded) + StartSpriteAnim(sprite, 0); + sprite->invisible = (sprite->data4 & 0xFF); + if (sprite->data0 == 8) + sprite->invisible = TRUE; + if (sprite->invisible || (sprite->data4 & 0xFF00) == 0 + || sprite->data0 != sprite->data2 || sprite->data1 != sprite->data3) + { + sprite->data5 = 0; + sprite->data6 = 1; + sprite->data7 = 2; + } + sprite->data7--; + if (sprite->data7 == 0) + { + sprite->data5 += sprite->data6; + if (sprite->data5 == 16 || sprite->data5 == 0) + sprite->data6 = -sprite->data6; + sprite->data7 = 2; + } + //_080B6A3E + if ((sprite->data4 & 0xFF00) != 0) + { + //Can't get this part to match + u16 var = sprite->data5; + s8 r5 = var; + s16 var2 = var / 2; + s8 r4 = var2; + u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101; + + MultiplyInvertedPaletteRGBComponents(index, r4, r5, r5); + } +} +#else +__attribute__((naked)) +void sub_80B6998(struct Sprite *sprite) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + adds r4, r0, 0\n\ + adds r0, 0x3F\n\ + ldrb r1, [r0]\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080B69B0\n\ + adds r0, r4, 0\n\ + movs r1, 0\n\ + bl StartSpriteAnim\n\ +_080B69B0:\n\ + ldrh r1, [r4, 0x36]\n\ + movs r0, 0xFF\n\ + ands r0, r1\n\ + adds r3, r4, 0\n\ + adds r3, 0x3E\n\ + movs r1, 0x1\n\ + ands r0, r1\n\ + lsls r0, 2\n\ + ldrb r1, [r3]\n\ + movs r2, 0x5\n\ + negs r2, r2\n\ + ands r2, r1\n\ + orrs r2, r0\n\ + strb r2, [r3]\n\ + movs r1, 0x2E\n\ + ldrsh r0, [r4, r1]\n\ + cmp r0, 0x8\n\ + bne _080B69DA\n\ + movs r0, 0x4\n\ + orrs r2, r0\n\ + strb r2, [r3]\n\ +_080B69DA:\n\ + ldrb r1, [r3]\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _080B6A0A\n\ + movs r2, 0x36\n\ + ldrsh r0, [r4, r2]\n\ + movs r1, 0xFF\n\ + lsls r1, 8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080B6A0A\n\ + movs r0, 0x2E\n\ + ldrsh r1, [r4, r0]\n\ + movs r2, 0x32\n\ + ldrsh r0, [r4, r2]\n\ + cmp r1, r0\n\ + bne _080B6A0A\n\ + movs r0, 0x30\n\ + ldrsh r1, [r4, r0]\n\ + movs r2, 0x34\n\ + ldrsh r0, [r4, r2]\n\ + cmp r1, r0\n\ + beq _080B6A16\n\ +_080B6A0A:\n\ + movs r0, 0\n\ + strh r0, [r4, 0x38]\n\ + movs r0, 0x1\n\ + strh r0, [r4, 0x3A]\n\ + movs r0, 0x2\n\ + strh r0, [r4, 0x3C]\n\ +_080B6A16:\n\ + ldrh r0, [r4, 0x3C]\n\ + subs r0, 0x1\n\ + strh r0, [r4, 0x3C]\n\ + lsls r0, 16\n\ + cmp r0, 0\n\ + bne _080B6A3E\n\ + ldrh r1, [r4, 0x3A]\n\ + ldrh r2, [r4, 0x38]\n\ + adds r0, r1, r2\n\ + strh r0, [r4, 0x38]\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x10\n\ + beq _080B6A36\n\ + cmp r0, 0\n\ + bne _080B6A3A\n\ +_080B6A36:\n\ + negs r0, r1\n\ + strh r0, [r4, 0x3A]\n\ +_080B6A3A:\n\ + movs r0, 0x2\n\ + strh r0, [r4, 0x3C]\n\ +_080B6A3E:\n\ + movs r1, 0x36\n\ + ldrsh r0, [r4, r1]\n\ + movs r1, 0xFF\n\ + lsls r1, 8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _080B6A74\n\ + ldrh r4, [r4, 0x38]\n\ + lsls r5, r4, 24\n\ + lsrs r5, 24\n\ + lsls r4, 16\n\ + asrs r4, 17\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + movs r0, 0x5\n\ + bl IndexOfSpritePaletteTag\n\ + lsls r0, 24\n\ + lsrs r0, 4\n\ + ldr r2, _080B6A7C @ =0x01010000\n\ + adds r0, r2\n\ + lsrs r0, 16\n\ + adds r1, r4, 0\n\ + adds r2, r5, 0\n\ + adds r3, r5, 0\n\ + bl MultiplyInvertedPaletteRGBComponents\n\ +_080B6A74:\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B6A7C: .4byte 0x01010000\n\ + .syntax divided\n"); +} +#endif + +void sub_80B6A80(void) +{ + u8 spriteId1; + u8 spriteId2; + u8 spriteId3; + + spriteId1 = CreateSprite(&gSpriteTemplate_83CE5C8, 0xCC, 0x50, 0); + EWRAM_000000.unk10 = spriteId1; + SetSubspriteTables(&gSprites[spriteId1], gSubspriteTables_83CE558); + + spriteId2 = CreateSprite(&gSpriteTemplate_83CE5F8, 0xCC, 0x4C, 1); + gSprites[spriteId1].data6 = spriteId2; + SetSubspriteTables(&gSprites[spriteId2], gSubspriteTables_83CE560); + + spriteId3 = CreateSprite(&gSpriteTemplate_83CE5E0, 0xCC, 0x4B, 2); + gSprites[spriteId3].oam.priority = 1; + gSprites[spriteId1].data7 = spriteId3; +} + +void sub_80B6B14(void) +{ + struct Sprite *sprite = &gSprites[EWRAM_000000.unk10]; + + sprite->data0 = 2; + sprite->data1 = EWRAM_000000.currentPage; +} + +u8 sub_80B6B5C(struct Sprite *); +u8 sub_80B6B98(struct Sprite *); +u8 sub_80B6B9C(struct Sprite *); +u8 sub_80B6C08(struct Sprite *); + +static u8 (*const gUnknown_083CE2B4[])(struct Sprite *) = +{ + sub_80B6B5C, + sub_80B6B98, + sub_80B6B9C, + sub_80B6C08, +}; + +void sub_80B6B34(struct Sprite *sprite) +{ + while (gUnknown_083CE2B4[sprite->data0](sprite) != 0) + ; +} + +u8 sub_80B6B5C(struct Sprite *sprite) +{ + struct Sprite *sprite1 = &gSprites[sprite->data6]; + struct Sprite *sprite2 = &gSprites[sprite->data7]; + + sub_80B6C48(EWRAM_000000.currentPage, sprite1, sprite2); + sprite->data0++; + return 0; +} + +u8 sub_80B6B98(struct Sprite *sprite) +{ + return 0; +} + +u8 sub_80B6B9C(struct Sprite *sprite) +{ + struct Sprite *r4 = &gSprites[sprite->data6]; + struct Sprite *r5 = &gSprites[sprite->data7]; + + r4->pos2.y++; + if (r4->pos2.y > 7) + { + sprite->data0++; + r4->pos2.y = -4; + r4->invisible = TRUE; + sub_80B6C48(((u8)sprite->data1 + 1) % 3, r4, r5); + } + return 0; +} + +u8 sub_80B6C08(struct Sprite *sprite) +{ + struct Sprite *r2 = &gSprites[sprite->data6]; + + r2->invisible = FALSE; + r2->pos2.y++; + if (r2->pos2.y >= 0) + { + r2->pos2.y = 0; + sprite->data0 = 1; + } + return 0; +} + +static const u16 gUnknown_083CE2C4[] = {1, 3, 2}; +static const u16 gUnknown_083CE2CA[] = {4, 6, 5}; + +void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c) +{ + c->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_083CE2C4[a]); + b->sheetTileStart = GetSpriteTileStartByTag(gUnknown_083CE2CA[a]); + b->subspriteTableNum = a; +} + +// + +void sub_80B6CA8(void) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83CE610, 0xCC, 0x6C, 0); + SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); + + spriteId = CreateSprite(&gSpriteTemplate_83CE628, 0xCC, 0x84, 0); + SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); +} + +void sub_80B6D04(void) +{ + u8 spriteId; + s16 r1; + u8 i; + + r1 = (EWRAM_000000.unk2 - 1) * 8 + 4; + spriteId = CreateSprite(&gSpriteTemplate_83CE658, r1, 0x28, 0); + gSprites[spriteId].oam.priority = 3; + r1 = EWRAM_000000.unk2 * 8 + 4; + for (i = 0; i < EWRAM_000000.unk34->unk1; i++, r1 += 8) + { + spriteId = CreateSprite(&gSpriteTemplate_83CE670, r1, 0x2C, 0); + gSprites[spriteId].oam.priority = 3; + gSprites[spriteId].data0 = i; + } +} + +void sub_80B6D9C(struct Sprite *sprite) +{ + const s16 arr[] = {0, -4, -2, -1}; + + if (sprite->data0 == 0 || --sprite->data0 == 0) + { + sprite->data0 = 8; + sprite->data1 = (sprite->data1 + 1) & 3; + } + sprite->pos2.x = arr[sprite->data1]; +} + +void sub_80B6DE8(struct Sprite *sprite) +{ + const s16 arr[] = {2, 3, 2, 1}; + u8 var; + + var = sub_80B6F44(); + if (var != (u8)sprite->data0) + { + sprite->pos2.y = 0; + sprite->data1 = 0; + sprite->data2 = 0; + } + else + { + sprite->pos2.y = arr[sprite->data1]; + sprite->data2++; + if (sprite->data2 > 8) + { + sprite->data1 = (sprite->data1 + 1) & 3; + sprite->data2 = 0; + } + } +} + +// + +void nullsub_40(void); +void sub_80B6E68(void); +void sub_80B6EBC(void); +void sub_80B6EFC(void); + +static void (*const gUnknown_083CE2E0[])(void) = +{ + nullsub_40, + sub_80B6E68, + sub_80B6EBC, + sub_80B6EFC, +}; + +void sub_80B6E44(void) +{ + gUnknown_083CE2E0[EWRAM_000000.unk34->unk2](); +} + +void nullsub_40(void) +{ +} + +void sub_80B6E68(void) +{ + u8 rivalGfxId; + u8 spriteId; + + rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, EWRAM_000000.unk3E); + spriteId = AddPseudoFieldObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x18, 0); + gSprites[spriteId].oam.priority = 3; + StartSpriteAnim(&gSprites[spriteId], 4); +} + +void sub_80B6EBC(void) +{ + u8 spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83CE688, 0x34, 0x18, 0); + SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE580); + gSprites[spriteId].oam.priority = 3; +} + +void sub_80B6EFC(void) +{ + u8 spriteId; + + sub_809D51C(); + spriteId = CreateMonIcon(EWRAM_000000.unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, EWRAM_000000.unk44); + gSprites[spriteId].oam.priority = 3; +} + +u8 sub_80B6F44(void) +{ + u8 i; + + for (i = 0; i < EWRAM_000000.unk34->unk1; i++) + { + if (EWRAM_000000.textBuffer[i] == 0xFF) + return i; + } + return EWRAM_000000.unk34->unk1 - 1; +} + +u8 sub_80B6F84(void) +{ + s8 i; + + for (i = EWRAM_000000.unk34->unk1 - 1; i > 0; i--) + { + if (EWRAM_000000.textBuffer[i] != 0xFF) + return i; + } + return 0; +} + +void sub_80B6FBC(void) +{ + u8 var; + u8 var2; + + var = sub_80B6F84(); + EWRAM_000000.textBuffer[var] = 0; + sub_80B7960(); + EWRAM_000000.textBuffer[var] = 0xFF; + var2 = sub_80B6958(); + if (var2 == 0 || var2 == 2) + sub_80B6460(1, 0, 1); + PlaySE(SE_BOWA); +} + +u8 sub_80B7004(void) +{ + s16 x; + s16 y; + u8 var; + u8 r4; + + get_cursor_pos(&x, &y); + x = sub_80B67EC(x); + var = sub_80B7768(x, y); + r4 = 1; + if (var == 0xFF) + r4 = sub_80B7104(); + else if (var == 0xFE) + r4 = sub_80B713C(); + else + sub_80B7174(var); + sub_80B7960(); + PlaySE(SE_SELECT); + if (r4 != 0) + { + if (sub_80B6F84() == EWRAM_000000.unk34->unk1 - 1) + return 1; + } + return 0; } -- cgit v1.2.3 From 448acff16e53485c5cfb90983a7a1e1b4644c30b Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Thu, 26 Jan 2017 01:07:36 -0500 Subject: finish decompiling naming_screen (#217) * decompile more code * incbin graphics data * decompile more code * decompile more code * finish decompiling * name some functions and variables --- src/naming_screen.c | 1595 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 1142 insertions(+), 453 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 1c718b3ca..784e10f4f 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -11,10 +11,22 @@ #include "text.h" #include "trig.h" -struct UnknownStruct2 +extern u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8, u8); +extern u8 CreateMonIcon(); +extern void sub_809D51C(void); +extern void MultiplyInvertedPaletteRGBComponents(u16, u8, u8, u8); + +enum +{ + NAMING_SCREEN_TEMPLATE_PLAYER_NAME, + NAMING_SCREEN_TEMPLATE_BOX_NAME, + NAMING_SCREEN_TEMPLATE_MON_NAME, +}; + +struct NamingScreenTemplate { u8 unk0; - u8 unk1; + u8 maxChars; u8 unk2; u8 unk3; u8 unk4; //mode? @@ -24,36 +36,29 @@ struct UnknownStruct2 const u8 *title; }; -struct UnknownStruct1 +struct NamingScreenData { - u8 state; //state - u8 mode; + u8 state; + u8 templateNum; u16 unk2; - u16 unk4; - u16 unk6; + u16 bg1vOffset; + u16 bg2vOffset; u16 unk8; u16 unkA; u8 unkC; u8 unkD; - u8 currentPage; //page? - u8 cursorSpriteId; //spriteId + u8 currentPage; + u8 cursorSpriteId; u8 unk10; u8 textBuffer[0x10]; u8 filler21[0x13]; - /*0x34*/ const struct UnknownStruct2 *unk34; - /*0x38*/ u8 *nameBuffer; + const struct NamingScreenTemplate *template; + u8 *destBuffer; u16 unk3C; //savedKeyRepeatStartDelay u16 unk3E; u16 unk40; u32 unk44; - /*0x48*/ MainCallback returnCallback; -}; - -enum -{ - NAMING_SCREEN_MODE_PLAYER_NAME, - NAMING_SCREEN_MODE_BOX_NAME, - NAMING_SCREEN_MODE_MON_NAME, + MainCallback returnCallback; }; enum @@ -67,7 +72,7 @@ extern u16 gKeyRepeatStartDelay; extern u8 unk_2000000[]; -#define EWRAM_000000 (*(struct UnknownStruct1 *)(unk_2000000)) +#define namingScreenData (*(struct NamingScreenData *)(unk_2000000)) const u32 gSpriteImage_83CE094[] = INCBIN_U32("graphics/naming_screen/pc_icon/0.4bpp"); const u32 gSpriteImage_83CE154[] = INCBIN_U32("graphics/naming_screen/pc_icon/1.4bpp"); @@ -79,7 +84,6 @@ asm(".section .rodata\n\ .4byte 0x2000000\n"); extern u16 *const gUnknown_083CE28C[]; -extern const struct UnknownStruct2 *const gUnknown_083CE398[]; extern const struct SubspriteTable gSubspriteTables_83CE558[]; extern const struct SubspriteTable gSubspriteTables_83CE560[]; extern const struct SubspriteTable gSubspriteTables_83CE578[]; @@ -93,92 +97,129 @@ extern const struct SpriteTemplate gSpriteTemplate_83CE640; extern const struct SpriteTemplate gSpriteTemplate_83CE658; extern const struct SpriteTemplate gSpriteTemplate_83CE670; extern const struct SpriteTemplate gSpriteTemplate_83CE688; +extern const struct SpriteSheet gUnknown_083CE6A0[]; +extern const struct SpritePalette gUnknown_083CE708[]; +extern const u8 gOtherText_SentToPC[]; +extern const u8 gNamingScreenMenu_Gfx[]; +extern u16 gMenuMessageBoxContentTileOffset; +extern const u16 gNamingScreenPalettes[]; +extern const u16 gUnknown_083CE748[]; +extern const u16 gUnknown_083CEBF8[]; +extern const u16 gUnknown_083CF0A8[]; +extern const u16 gUnknown_08E86258[]; +extern const u8 gSpeciesNames[][11]; +extern const u8 OtherText_YourName[]; +extern const u8 OtherText_BoxName[]; +extern const u8 OtherText_PokeName[]; + +static void C2_NamingScreen(void); +static void sub_80B5AA0(void); +static void StoreNamingScreenParameters(u8, u8 *, u16, u16, u32, MainCallback); +static void NamingScreen_TurnOffScreen(void); +static void NamingScreen_Init(void); +static void NamingScreen_ClearVram(void); +static void NamingScreen_ClearOam(void); +static void NamingScreen_SetUpVideoRegs(void); +static void NamingScreen_SetUpWindow(void); +static void NamingScreen_ResetObjects(void); +static void sub_80B5DFC(void); +static void sub_80B5E20(void); +static void sub_80B5E3C(void); +static void NamingScreen_InitDisplayMode(void); +static void Task_DoNothing(u8); +static void sub_80B7558(void); +static void sub_80B753C(void); +static void sub_80B7680(void); +static void sub_80B75C4(void); +static void sub_80B7794(void); +static void sub_80B78A8(void); +static void sub_80B7960(void); +static void CursorInit(void); +static void sub_80B6A80(void); +static void sub_80B6CA8(void); +static void sub_80B6D04(void); +static void sub_80B6E44(void); +static void InputInit(void); +static void sub_80B6438(void); +static void sub_80B5E50(void); +static void Task_NamingScreenMain(u8); +static void SetInputState(u8); +static void sub_80B68D8(u8); +static bool8 HandleKeyboardEvent(void); +static bool8 IsCursorAnimFinished(void); +static void MoveCursorToOKButton(void); +static void sub_80B6B14(void); +static void StartPageSwapAnim(void); +static void sub_80B6888(u8); +static void sub_80B6460(u8, u8, u8); +static bool8 IsPageSwapAnimNotInProgress(void); +static void sub_80B7614(void); +static void GetCursorPos(s16 *, s16 *); +static void SetCursorPos(s16, s16); +static void sub_80B77F8(void); +static void sub_80B74B0(void); +static void DisplaySentToPCMessage(void); +static u8 GetKeyRoleAtCursorPos(void); +static u8 sub_80B61C8(void); +static void DeleteTextCharacter(void); +static void sub_80B7090(void); +static u8 GetInputEvent(void); +static bool8 sub_80B7004(void); +static void sub_80B6914(void); +static void Task_HandlePageSwapAnim(u8); +static void sub_80B6C48(u8, struct Sprite *, struct Sprite *); +static u8 GetTextCaretPosition(void); +static u8 GetCharAtKeyboardPos(s16, s16); +static bool8 sub_80B7104(void); +static bool8 sub_80B713C(void); +static void AddTextCharacter(u8); +static bool8 sub_80B7198(u8); +static bool8 sub_80B7264(u8); +static void sub_80B7370(u8, u8); +static void sub_80B73CC(u8, u8); +static bool8 sub_80B71E4(u8); +static void sub_80B7474(u8, u8); +static void sub_80B72A4(u8, u8); +static bool8 sub_80B720C(u8); +static void sub_80B7568(void); +static void sub_80B75B0(void); +static void sub_80B7698(u16 *, const u16 *); +static void sub_80B76E0(); +static void nullsub_20(u8, u8); +static void PrintKeyboardCharacters(u8); -void C2_NamingScreen(void); -void sub_80B5AA0(void); -//void AddNamingScreenTask(); -void AddNamingScreenTask(u8, u8 *, u16, u16, u32, MainCallback); -void NamingScreen_TurnOffScreen(void); -void NamingScreen_Init(void); -void NamingScreen_ClearVram(void); -void NamingScreen_ClearOam(void); -void NamingScreen_SetUpVideoRegs(void); -void sub_80B5DC8(void); -void NamingScreen_ResetObjects(void); -void sub_80B5DFC(void); -void sub_80B5E20(void); -void sub_80B5E3C(void); -void sub_80B5C04(void); -void NamingScreenDummyTask(u8); -void sub_80B7558(void); -void sub_80B753C(void); -void sub_80B7680(void); -void sub_80B75C4(void); -void sub_80B7794(void); -void sub_80B78A8(void); -void sub_80B7960(void); -void sub_80B6774(void); -void sub_80B6A80(void); -void sub_80B6CA8(void); -void sub_80B6D04(void); -void sub_80B6E44(void); -void InitInput(void); -void sub_80B6438(void); -void sub_80B5E50(void); -void sub_80B5E70(u8); -void SetInputState(u8); -void sub_80B68D8(u8); -u8 sub_80B60B8(void); -bool8 sub_80B6938(void); -void sub_80B6878(void); -void sub_80B6B14(void); -void sub_80B65F0(void); -void sub_80B6888(u8); -void sub_80B6460(u8, u8, u8); -bool8 sub_80B6610(void); -void sub_80B7614(void); -void get_cursor_pos(s16 *, s16 *); -void set_cursor_pos(s16, s16); -void sub_80B77F8(void); -void sub_80B74B0(void); -void sub_80B74FC(void); -u8 sub_80B6958(void); -u8 sub_80B61C8(void); -void sub_80B6FBC(void); -void sub_80B7090(void); -u8 GetInputPressedButton(void); -u8 sub_80B7004(void); -void sub_80B6914(void); -void Task_HandleInput(u8); -void HandleDpadMovement(struct Task *); -void sub_80B64D4(u8); -void sub_80B65AC(u8); -void sub_80B65D4(struct Task *, u8, u8); -u16 sub_80B654C(u8); -extern void MultiplyInvertedPaletteRGBComponents(u16, u8, u8, u8); -void sub_80B6630(u8); -void sub_80B6C48(u8, struct Sprite *, struct Sprite *); -u8 sub_80B6F44(void); -extern u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8, u8); -extern u8 CreateMonIcon(); -extern void sub_809D51C(void); -u8 sub_80B7768(s16, s16); -u8 sub_80B7104(void); -u8 sub_80B713C(void); -void sub_80B7174(u8); +enum +{ + MAIN_STATE_BEGIN_FADE_IN, + MAIN_STATE_WAIT_FADE_IN, + MAIN_STATE_HANDLE_INPUT, + MAIN_STATE_MOVE_TO_OK_BUTTON, + MAIN_STATE_START_PAGE_SWAP, + MAIN_STATE_WAIT_PAGE_SWAP, + MAIN_STATE_6, + MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE, + MAIN_STATE_BEGIN_FADE_OUT, +}; -#define NAMING_SCREEN_A_BUTTON 5 -#define NAMING_SCREEN_B_BUTTON 6 -#define NAMING_SCREEN_SELECT_BUTTON 8 -#define NAMING_SCREEN_START_BUTTON 9 +enum +{ + INPUT_STATE_DISABLED, + INPUT_STATE_ENABLED, +}; + +#define KBEVENT_NONE 0 +#define KBEVENT_PRESSED_A 5 +#define KBEVENT_PRESSED_B 6 +#define KBEVENT_PRESSED_SELECT 8 +#define KBEVENT_PRESSED_START 9 -void DoNamingScreen(u8 mode, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) { - AddNamingScreenTask(mode, nameBuffer, c, d, e, returnCallback); + StoreNamingScreenParameters(templateNum, destBuffer, c, d, e, returnCallback); SetMainCallback2(C2_NamingScreen); } -void C2_NamingScreen(void) +static void C2_NamingScreen(void) { switch (gMain.state) { @@ -200,7 +241,7 @@ void C2_NamingScreen(void) gMain.state++; break; case 4: - sub_80B5DC8(); + NamingScreen_SetUpWindow(); gMain.state++; break; case 5: @@ -214,13 +255,13 @@ void C2_NamingScreen(void) case 7: sub_80B5E20(); sub_80B5E3C(); - sub_80B5C04(); + NamingScreen_InitDisplayMode(); SetMainCallback2(sub_80B5AA0); break; } } -void sub_80B5AA0(void) +static void sub_80B5AA0(void) { RunTasks(); AnimateSprites(); @@ -228,65 +269,66 @@ void sub_80B5AA0(void) UpdatePaletteFade(); } -void sub_80B5AB8(void) +static void VBlankCB_NamingScreen(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - REG_BG1VOFS = EWRAM_000000.unk4; - REG_BG2VOFS = EWRAM_000000.unk6; + REG_BG1VOFS = namingScreenData.bg1vOffset; + REG_BG2VOFS = namingScreenData.bg2vOffset; REG_BG1CNT &= 0xFFFC; - REG_BG1CNT |= EWRAM_000000.unk8; + REG_BG1CNT |= namingScreenData.unk8; REG_BG2CNT &= 0xFFFC; - REG_BG2CNT |= EWRAM_000000.unkA; + REG_BG2CNT |= namingScreenData.unkA; } -void AddNamingScreenTask(u8 mode, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +static void StoreNamingScreenParameters(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) { struct Task *task; - task = &gTasks[CreateTask(NamingScreenDummyTask, 0xFF)]; - task->data[0] = mode; + //Create a task that does nothing, and use it as a temporary space to store parameters + task = &gTasks[CreateTask(Task_DoNothing, 0xFF)]; + task->data[0] = templateNum; task->data[1] = c; task->data[2] = d; task->data[3] = e >> 16; task->data[4] = e; - StoreWordInTwoHalfwords(&task->data[5], (u32)nameBuffer); + StoreWordInTwoHalfwords(&task->data[5], (u32)destBuffer); StoreWordInTwoHalfwords(&task->data[7], (u32)returnCallback); } -void GetNamingScreenParameters(void) +static void GetNamingScreenParameters(void) { u8 taskId; struct Task *task; - taskId = FindTaskIdByFunc(NamingScreenDummyTask); + taskId = FindTaskIdByFunc(Task_DoNothing); task = &gTasks[taskId]; - EWRAM_000000.mode = task->data[0]; - EWRAM_000000.unk3E = task->data[1]; - EWRAM_000000.unk40 = task->data[2]; - EWRAM_000000.unk44 = (task->data[3] << 16) | (u16)task->data[4]; - LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&EWRAM_000000.nameBuffer); - LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&EWRAM_000000.returnCallback); + namingScreenData.templateNum = task->data[0]; + namingScreenData.unk3E = task->data[1]; + namingScreenData.unk40 = task->data[2]; + namingScreenData.unk44 = (task->data[3] << 16) | (u16)task->data[4]; + LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&namingScreenData.destBuffer); + LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&namingScreenData.returnCallback); DestroyTask(taskId); } -void NamingScreenDummyTask(u8 taskId) +static void Task_DoNothing(u8 taskId) { } -void NamingScreen_TurnOffScreen(void) +static void NamingScreen_TurnOffScreen(void) { SetVBlankCallback(NULL); SetHBlankCallback(NULL); REG_DISPCNT = 0; } -void sub_80B5C04(void) +static void NamingScreen_InitDisplayMode(void) { u16 savedIme; - SetVBlankCallback(sub_80B5AB8); + SetVBlankCallback(VBlankCB_NamingScreen); savedIme = REG_IME; REG_IME = 0; REG_IE |= INTR_FLAG_VBLANK; @@ -295,7 +337,7 @@ void sub_80B5C04(void) REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; } -void NamingScreen_ClearVram(void) +static void NamingScreen_ClearVram(void) { u8 *addr = (void *)VRAM; u32 size = 0x10000; @@ -313,12 +355,12 @@ void NamingScreen_ClearVram(void) } } -void NamingScreen_ClearOam(void) +static void NamingScreen_ClearOam(void) { DmaClear16(3, (void *)OAM, 0x400); } -void NamingScreen_SetUpVideoRegs(void) +static void NamingScreen_SetUpVideoRegs(void) { REG_BG0CNT = 0; REG_BG1CNT = 0; @@ -340,33 +382,35 @@ void NamingScreen_SetUpVideoRegs(void) REG_BLDALPHA = 0x80C; } -void NamingScreen_Init(void) +static const struct NamingScreenTemplate *const sNamingScreenTemplates[]; //forward declaration + +static void NamingScreen_Init(void) { GetNamingScreenParameters(); - EWRAM_000000.state = 0; - EWRAM_000000.unk4 = 0; - EWRAM_000000.unk6 = 0; - EWRAM_000000.unk8 = 1; - EWRAM_000000.unkA = 2; - EWRAM_000000.unkC = 0; - EWRAM_000000.unkD = 1; - EWRAM_000000.unk34 = gUnknown_083CE398[EWRAM_000000.mode]; - EWRAM_000000.currentPage = EWRAM_000000.unk34->unk4; - EWRAM_000000.unk2 = 14 - EWRAM_000000.unk34->unk1 / 2; - EWRAM_000000.unk3C = gKeyRepeatStartDelay; - memset(EWRAM_000000.textBuffer, 0xFF, 0x10); - if (EWRAM_000000.unk34->unk0 != 0) - StringCopy(EWRAM_000000.textBuffer, EWRAM_000000.nameBuffer); + namingScreenData.state = 0; + namingScreenData.bg1vOffset = 0; + namingScreenData.bg2vOffset = 0; + namingScreenData.unk8 = 1; + namingScreenData.unkA = 2; + namingScreenData.unkC = 0; + namingScreenData.unkD = 1; + namingScreenData.template = sNamingScreenTemplates[namingScreenData.templateNum]; + namingScreenData.currentPage = namingScreenData.template->unk4; + namingScreenData.unk2 = 14 - namingScreenData.template->maxChars / 2; + namingScreenData.unk3C = gKeyRepeatStartDelay; + memset(namingScreenData.textBuffer, 0xFF, 0x10); + if (namingScreenData.template->unk0 != 0) + StringCopy(namingScreenData.textBuffer, namingScreenData.destBuffer); gKeyRepeatStartDelay = 16; } -void sub_80B5DC8(void) +static void NamingScreen_SetUpWindow(void) { SetUpWindowConfig(&gWindowConfig_81E6E88); InitMenuWindow(&gWindowConfig_81E6E88); } -void NamingScreen_ResetObjects(void) +static void NamingScreen_ResetObjects(void) { ResetPaletteFade(); ResetSpriteData(); @@ -374,7 +418,7 @@ void NamingScreen_ResetObjects(void) ResetTasks(); } -void sub_80B5DFC(void) +static void sub_80B5DFC(void) { sub_80B7558(); sub_80B753C(); @@ -385,257 +429,272 @@ void sub_80B5DFC(void) sub_80B7960(); } -void sub_80B5E20(void) +static void sub_80B5E20(void) { - sub_80B6774(); + CursorInit(); sub_80B6A80(); sub_80B6CA8(); sub_80B6D04(); sub_80B6E44(); } -void sub_80B5E3C(void) +static void sub_80B5E3C(void) { - InitInput(); + InputInit(); sub_80B6438(); sub_80B5E50(); } -void sub_80B5E50(void) +//-------------------------------------------------- +// Naming screen main +//-------------------------------------------------- + +static bool8 MainState_BeginFadeIn(struct Task *); +static bool8 MainState_WaitFadeIn(struct Task *); +static bool8 MainState_HandleInput(struct Task *); +static bool8 MainState_MoveToOKButton(struct Task *); +static bool8 MainState_StartPageSwap(struct Task *); +static bool8 MainState_WaitPageSwap(struct Task *); +static bool8 MainState_6(struct Task *); +static bool8 MainState_UpdateSentToPCMessage(struct Task *); +static bool8 MainState_BeginFadeInOut(struct Task *); +static bool8 MainState_WaitFadeOutAndExit(struct Task *); + +static bool8 (*const sMainStateFuncs[])(struct Task *) = +{ + MainState_BeginFadeIn, + MainState_WaitFadeIn, + MainState_HandleInput, + MainState_MoveToOKButton, + MainState_StartPageSwap, + MainState_WaitPageSwap, + MainState_6, + MainState_UpdateSentToPCMessage, + MainState_BeginFadeInOut, + MainState_WaitFadeOutAndExit, +}; + +static void sub_80B5E50(void) { u8 taskId; - taskId = CreateTask(sub_80B5E70, 2); - sub_80B5E70(taskId); + taskId = CreateTask(Task_NamingScreenMain, 2); + Task_NamingScreenMain(taskId); } -// - -u8 sub_80B5EA8(struct Task *); -u8 sub_80B5ED0(struct Task *); -u8 sub_80B5F00(struct Task *); -u8 sub_80B5F10(struct Task *); -u8 sub_80B5F38(struct Task *); -u8 sub_80B5F70(struct Task *); -u8 pokemon_store(struct Task *); -u8 sub_80B604C(struct Task *); -u8 sub_80B606C(struct Task *); -u8 sub_80B6094(struct Task *); - -static u8 (*const gUnknown_083CE218[])(struct Task *) = -{ - sub_80B5EA8, - sub_80B5ED0, - sub_80B5F00, - sub_80B5F10, - sub_80B5F38, - sub_80B5F70, - pokemon_store, - sub_80B604C, - sub_80B606C, - sub_80B6094, -}; - -void sub_80B5E70(u8 taskId) +static void Task_NamingScreenMain(u8 taskId) { - while (gUnknown_083CE218[EWRAM_000000.state](&gTasks[taskId]) != 0) + while (sMainStateFuncs[namingScreenData.state](&gTasks[taskId]) != 0) ; } -u8 sub_80B5EA8(struct Task *task) +static bool8 MainState_BeginFadeIn(struct Task *task) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - EWRAM_000000.state++; + namingScreenData.state++; return 0; } -u8 sub_80B5ED0(struct Task *task) +static bool8 MainState_WaitFadeIn(struct Task *task) { if (!gPaletteFade.active) { - SetInputState(1); + SetInputState(INPUT_STATE_ENABLED); sub_80B68D8(1); - EWRAM_000000.state++; + namingScreenData.state++; } - return 0; + return FALSE; } -u8 sub_80B5F00(struct Task *task) +static bool8 MainState_HandleInput(struct Task *task) { - return sub_80B60B8(); + return HandleKeyboardEvent(); } -u8 sub_80B5F10(struct Task *task) +static bool8 MainState_MoveToOKButton(struct Task *task) { - if (sub_80B6938() != 0) + if (IsCursorAnimFinished()) { - SetInputState(1); - sub_80B6878(); - EWRAM_000000.state = 2; + SetInputState(INPUT_STATE_ENABLED); + MoveCursorToOKButton(); + namingScreenData.state = MAIN_STATE_HANDLE_INPUT; } - return 0; + return FALSE; } -u8 sub_80B5F38(struct Task *task) +static bool8 MainState_StartPageSwap(struct Task *task) { - SetInputState(0); + SetInputState(INPUT_STATE_DISABLED); sub_80B6B14(); - sub_80B65F0(); + StartPageSwapAnim(); sub_80B6888(1); sub_80B6460(0, 0, 1); PlaySE(SE_WIN_OPEN); - EWRAM_000000.state = 5; - return 0; + namingScreenData.state = MAIN_STATE_WAIT_PAGE_SWAP; + return FALSE; } -u8 sub_80B5F70(struct Task *task) +static bool8 MainState_WaitPageSwap(struct Task *task) { s16 cursorX; s16 cursorY; - if (sub_80B6610()) + if (IsPageSwapAnimNotInProgress()) { - EWRAM_000000.state = 2; - EWRAM_000000.currentPage++; - EWRAM_000000.currentPage %= 3; + namingScreenData.state = MAIN_STATE_HANDLE_INPUT; + namingScreenData.currentPage++; + namingScreenData.currentPage %= 3; sub_80B7614(); sub_80B77F8(); - SetInputState(1); - get_cursor_pos(&cursorX, &cursorY); - if (EWRAM_000000.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) + SetInputState(INPUT_STATE_ENABLED); + GetCursorPos(&cursorX, &cursorY); + if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) cursorX = 5; - set_cursor_pos(cursorX, cursorY); + SetCursorPos(cursorX, cursorY); sub_80B6888(0); } - return 0; + return FALSE; } -u8 pokemon_store(struct Task *task) +static bool8 MainState_6(struct Task *task) { sub_80B74B0(); - SetInputState(0); + SetInputState(INPUT_STATE_DISABLED); sub_80B68D8(0); sub_80B6460(3, 0, 1); - gKeyRepeatStartDelay = EWRAM_000000.unk3C; - if (EWRAM_000000.mode == NAMING_SCREEN_MODE_MON_NAME - && CalculatePlayerPartyCount() > 5) + gKeyRepeatStartDelay = namingScreenData.unk3C; + if (namingScreenData.templateNum == NAMING_SCREEN_TEMPLATE_MON_NAME + && CalculatePlayerPartyCount() >= 6) { - sub_80B74FC(); - EWRAM_000000.state = 7; - return 0; + DisplaySentToPCMessage(); + namingScreenData.state = MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE; + return FALSE; } else { - EWRAM_000000.state = 8; - return 1; + namingScreenData.state = MAIN_STATE_BEGIN_FADE_OUT; + return TRUE; //Exit the naming screen } } -u8 sub_80B604C(struct Task *task) +static bool8 MainState_UpdateSentToPCMessage(struct Task *task) { if (MenuUpdateWindowText()) - EWRAM_000000.state++; - return 0; + namingScreenData.state++; + return FALSE; } -u8 sub_80B606C(struct Task *task) +static bool8 MainState_BeginFadeInOut(struct Task *task) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - EWRAM_000000.state++; - return 0; + namingScreenData.state++; + return FALSE; } -u8 sub_80B6094(struct Task *task) +static bool8 MainState_WaitFadeOutAndExit(struct Task *task) { if (!gPaletteFade.active) - SetMainCallback2(EWRAM_000000.returnCallback); - return 0; + SetMainCallback2(namingScreenData.returnCallback); + return FALSE; } -u8 sub_80B6108(u8); -u8 sub_80B6148(u8); -u8 sub_80B6170(u8); -u8 sub_80B6194(u8); +//-------------------------------------------------- +// Keyboard handling +//-------------------------------------------------- + +enum +{ + KEY_ROLE_CHAR, + KEY_ROLE_PAGE, + KEY_ROLE_BACKSPACE, + KEY_ROLE_OK, +}; + + +static bool8 KeyboardKeyHandler_Character(u8); +static bool8 KeyboardKeyHandler_Page(u8); +static bool8 KeyboardKeyHandler_Backspace(u8); +static bool8 KeyboardKeyHandler_OK(u8); -static u8 (*const gUnknown_083CE240[])(u8) = +static bool8 (*const sKeyboardKeyHandlers[])(u8) = { - sub_80B6108, - sub_80B6148, - sub_80B6170, - sub_80B6194, + KeyboardKeyHandler_Character, + KeyboardKeyHandler_Page, + KeyboardKeyHandler_Backspace, + KeyboardKeyHandler_OK, }; -u8 sub_80B60B8(void) +static bool8 HandleKeyboardEvent(void) { - u8 button = GetInputPressedButton(); - u8 r0 = sub_80B6958(); + u8 event = GetInputEvent(); + u8 keyRole = GetKeyRoleAtCursorPos(); - if (button == 8) + if (event == KBEVENT_PRESSED_SELECT) return sub_80B61C8(); - else if (button == 6) + else if (event == KBEVENT_PRESSED_B) { - sub_80B6FBC(); - return 0; + DeleteTextCharacter(); + return FALSE; } - else if (button == 7) + else if (event == 7) { sub_80B7090(); - return 0; + return FALSE; } - return gUnknown_083CE240[r0](button); + return sKeyboardKeyHandlers[keyRole](event); } -u8 sub_80B6108(u8 a) +static bool8 KeyboardKeyHandler_Character(u8 event) { sub_80B6460(3, 0, 0); - if (a == 5) + if (event == KBEVENT_PRESSED_A) { u8 var = sub_80B7004(); sub_80B6914(); - if (var != 0) + if (var) { - SetInputState(0); - EWRAM_000000.state = 3; + SetInputState(INPUT_STATE_DISABLED); + namingScreenData.state = MAIN_STATE_MOVE_TO_OK_BUTTON; } } - return 0; + return FALSE; } -u8 sub_80B6148(u8 a) +static bool8 KeyboardKeyHandler_Page(u8 event) { sub_80B6460(0, 1, 0); - if (a == 5) + if (event == KBEVENT_PRESSED_A) return sub_80B61C8(); else - return 0; + return FALSE; } -u8 sub_80B6170(u8 a) +static bool8 KeyboardKeyHandler_Backspace(u8 event) { sub_80B6460(1, 1, 0); - if (a == 5) - sub_80B6FBC(); - return 0; + if (event == KBEVENT_PRESSED_A) + DeleteTextCharacter(); + return FALSE; } -u8 sub_80B6194(u8 a) +static bool8 KeyboardKeyHandler_OK(u8 event) { sub_80B6460(2, 1, 0); - if (a == 5) + if (event == KBEVENT_PRESSED_A) { PlaySE(SE_SELECT); - EWRAM_000000.state = 6; - return 1; + namingScreenData.state = MAIN_STATE_6; + return TRUE; } else - return 0; + return FALSE; } -u8 sub_80B61C8(void) +static bool8 sub_80B61C8(void) { - EWRAM_000000.state = 4; - return 1; + namingScreenData.state = MAIN_STATE_START_PAGE_SWAP; + return TRUE; } //-------------------------------------------------- @@ -650,69 +709,72 @@ enum }; #define tState data[0] -#define tPressedButton data[1] +#define tKeyboardEvent data[1] #define tKbFunctionKey data[2] -void InitInput(void) +static void InputState_Disabled(struct Task *); +static void InputState_Enabled(struct Task *); + +static void (*const sInputStateFuncs[])(struct Task *) = +{ + InputState_Disabled, + InputState_Enabled, +}; + +static void Task_HandleInput(u8); +static void HandleDpadMovement(struct Task *); + +static void InputInit(void) { CreateTask(Task_HandleInput, 1); } -u8 GetInputPressedButton(void) +static u8 GetInputEvent(void) { u8 taskId = FindTaskIdByFunc(Task_HandleInput); - return gTasks[taskId].tPressedButton; + return gTasks[taskId].tKeyboardEvent; } -void SetInputState(u8 state) +static void SetInputState(u8 state) { u8 taskId = FindTaskIdByFunc(Task_HandleInput); gTasks[taskId].tState = state; } -static void sub_80B626C(struct Task *); -static void sub_80B6274(struct Task *); - -static void (*const sInputStateHandlers[])(struct Task *) = -{ - sub_80B626C, - sub_80B6274, -}; - -void Task_HandleInput(u8 taskId) +static void Task_HandleInput(u8 taskId) { - sInputStateHandlers[gTasks[taskId].tState](&gTasks[taskId]); + sInputStateFuncs[gTasks[taskId].tState](&gTasks[taskId]); } -static void sub_80B626C(struct Task *task) +static void InputState_Disabled(struct Task *task) { - task->tPressedButton = 0; + task->tKeyboardEvent = 0; } -static void sub_80B6274(struct Task *task) +static void InputState_Enabled(struct Task *task) { - task->tPressedButton = 0; + task->tKeyboardEvent = 0; if (gMain.newKeys & A_BUTTON) { - task->tPressedButton = 5; + task->tKeyboardEvent = KBEVENT_PRESSED_A; return; } if (gMain.newKeys & B_BUTTON) { - task->tPressedButton = 6; + task->tKeyboardEvent = KBEVENT_PRESSED_B; return; } if (gMain.newKeys & SELECT_BUTTON) { - task->tPressedButton = 8; + task->tKeyboardEvent = KBEVENT_PRESSED_SELECT; return; } if (gMain.newKeys & START_BUTTON) { - task->tPressedButton = 9; - sub_80B6878(); + task->tKeyboardEvent = KBEVENT_PRESSED_START; + MoveCursorToOKButton(); return; } HandleDpadMovement(task); @@ -739,14 +801,14 @@ static const s16 sDpadDeltaY[] = static const s16 s4RowTo3RowTableY[] = {0, 1, 1, 2}; static const s16 gUnknown_083CE274[] = {0, 0, 3, 0}; -void HandleDpadMovement(struct Task *task) +static void HandleDpadMovement(struct Task *task) { s16 cursorX; s16 cursorY; u16 dpadDir; s16 prevCursorX; - get_cursor_pos(&cursorX, &cursorY); + GetCursorPos(&cursorX, &cursorY); dpadDir = 0; if (gMain.newAndRepeatedKeys & DPAD_UP) dpadDir = 1; @@ -772,7 +834,7 @@ void HandleDpadMovement(struct Task *task) if (sDpadDeltaX[dpadDir] != 0) { //The "others" page only has 5 columns - if (EWRAM_000000.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) + if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) { if (sDpadDeltaX[dpadDir] > 0) cursorX = 8; @@ -815,28 +877,34 @@ void HandleDpadMovement(struct Task *task) if (cursorY > 3) cursorY = 0; } - set_cursor_pos(cursorX, cursorY); + SetCursorPos(cursorX, cursorY); } #undef tState -#undef tPressedButton +#undef tKeyboardEvent #undef tKbFunctionKey //-------------------------------------------------- +// +//-------------------------------------------------- + +static void Task_80B64D4(u8); +static u16 sub_80B654C(u8); +static void sub_80B65AC(u8); +static void sub_80B65D4(struct Task *, u8, u8); -void sub_80B6438(void) +static void sub_80B6438(void) { u8 taskId; - taskId = CreateTask(sub_80B64D4, 3); + taskId = CreateTask(Task_80B64D4, 3); gTasks[taskId].data[0] = 3; } -void sub_80B6460(u8 a, u8 b, u8 c) +static void sub_80B6460(u8 a, u8 b, u8 c) { - struct Task *task; + struct Task *task = &gTasks[FindTaskIdByFunc(Task_80B64D4)]; - task = &gTasks[FindTaskIdByFunc(sub_80B64D4)]; if (a == task->data[0] && c == 0) { task->data[1] = b; @@ -850,7 +918,7 @@ void sub_80B6460(u8 a, u8 b, u8 c) sub_80B65D4(task, a, b); } -void sub_80B64D4(u8 taskId) +static void Task_80B64D4(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -874,7 +942,7 @@ void sub_80B64D4(u8 taskId) } } -u16 sub_80B654C(u8 a) +static u16 sub_80B654C(u8 a) { const u16 arr[] = { @@ -886,14 +954,14 @@ u16 sub_80B654C(u8 a) return arr[a]; } -void sub_80B65AC(u8 a) +static void sub_80B65AC(u8 a) { u16 index = sub_80B654C(a); gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; } -void sub_80B65D4(struct Task *task, u8 b, u8 c) +static void sub_80B65D4(struct Task *task, u8 b, u8 c) { task->data[0] = b; task->data[1] = c; @@ -903,103 +971,117 @@ void sub_80B65D4(struct Task *task, u8 b, u8 c) task->data[5] = 0; } -// +//-------------------------------------------------- +// Page Swap +//-------------------------------------------------- -u8 sub_80B6668(struct Task *); -u8 sub_80B6680(struct Task *); -u8 sub_80B66EC(struct Task *); -u8 sub_80B6758(struct Task *); +#define tState data[0] +#define tFrameCount data[1] -u8 (*const gUnknown_083CE27C[])(struct Task *) = +static bool8 PageSwapAnimState_Init(struct Task *); +static bool8 PageSwapAnimState_1(struct Task *); +static bool8 PageSwapAnimState_2(struct Task *); +static bool8 PageSwapAnimState_Done(struct Task *); + +static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) = { - sub_80B6668, - sub_80B6680, - sub_80B66EC, - sub_80B6758, + PageSwapAnimState_Init, + PageSwapAnimState_1, + PageSwapAnimState_2, + PageSwapAnimState_Done, }; -void sub_80B65F0(void) +static void StartPageSwapAnim(void) { u8 taskId; - taskId = CreateTask(sub_80B6630, 0); - sub_80B6630(taskId); + taskId = CreateTask(Task_HandlePageSwapAnim, 0); + Task_HandlePageSwapAnim(taskId); } -bool8 sub_80B6610(void) +static bool8 IsPageSwapAnimNotInProgress(void) { - if (FindTaskIdByFunc(sub_80B6630) == 0xFF) + if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == 0xFF) return TRUE; else return FALSE; } -void sub_80B6630(u8 taskId) +static void Task_HandlePageSwapAnim(u8 taskId) { - while (gUnknown_083CE27C[gTasks[taskId].data[0]](&gTasks[taskId]) != 0) + while (sPageSwapAnimStateFuncs[gTasks[taskId].tState](&gTasks[taskId]) != 0) ; } -u8 sub_80B6668(struct Task *task) +static bool8 PageSwapAnimState_Init(struct Task *task) { - EWRAM_000000.unk4 = 0; - EWRAM_000000.unk6 = 0; - task->data[0]++; + namingScreenData.bg1vOffset = 0; + namingScreenData.bg2vOffset = 0; + task->tState++; return 0; } -u8 sub_80B6680(struct Task *task) +static bool8 PageSwapAnimState_1(struct Task *task) { - u16 *const arr[] = {&EWRAM_000000.unk6, &EWRAM_000000.unk4}; + u16 *const arr[] = + { + &namingScreenData.bg2vOffset, + &namingScreenData.bg1vOffset + }; - task->data[1] += 4; - *arr[EWRAM_000000.unkC] = Sin(task->data[1], 0x28); - *arr[EWRAM_000000.unkD] = Sin((task->data[1] + 0x80) & 0xFF, 0x28); - if (task->data[1] > 0x3F) + task->tFrameCount += 4; + *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40); + *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); + if (task->tFrameCount >= 64) { - u8 temp = EWRAM_000000.unk8; //Why u8 and not u16? + u8 temp = namingScreenData.unk8; //Why u8 and not u16? - EWRAM_000000.unk8 = EWRAM_000000.unkA; - EWRAM_000000.unkA = temp; - task->data[0]++; + namingScreenData.unk8 = namingScreenData.unkA; + namingScreenData.unkA = temp; + task->tState++; } return 0; } -u8 sub_80B66EC(struct Task *task) +static bool8 PageSwapAnimState_2(struct Task *task) { - u16 *const arr[] = {&EWRAM_000000.unk6, &EWRAM_000000.unk4}; + u16 *const arr[] = {&namingScreenData.bg2vOffset, &namingScreenData.bg1vOffset}; - task->data[1] += 4; - *arr[EWRAM_000000.unkC] = Sin(task->data[1], 0x28); - *arr[EWRAM_000000.unkD] = Sin((task->data[1] + 0x80) & 0xFF, 0x28); - if (task->data[1] > 0x7F) + task->tFrameCount += 4; + *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40); + *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); + if (task->tFrameCount >= 128) { - u8 temp = EWRAM_000000.unkC; + u8 temp = namingScreenData.unkC; - EWRAM_000000.unkC = EWRAM_000000.unkD; - EWRAM_000000.unkD = temp; - task->data[0]++; + namingScreenData.unkC = namingScreenData.unkD; + namingScreenData.unkD = temp; + task->tState++; } return 0; } -u8 sub_80B6758(struct Task *task) +static bool8 PageSwapAnimState_Done(struct Task *task) { - DestroyTask(FindTaskIdByFunc(sub_80B6630)); + DestroyTask(FindTaskIdByFunc(Task_HandlePageSwapAnim)); return 0; } -// +#undef tState +#undef tFrameCount -void sub_80B6774(void) +//-------------------------------------------------- +// Cursor +//-------------------------------------------------- + +static void CursorInit(void) { - EWRAM_000000.cursorSpriteId = CreateSprite(&gSpriteTemplate_83CE640, 0, 0, 0); - gSprites[EWRAM_000000.cursorSpriteId].oam.priority = 1; - gSprites[EWRAM_000000.cursorSpriteId].oam.objMode = 1; - gSprites[EWRAM_000000.cursorSpriteId].data6 = 1; - gSprites[EWRAM_000000.cursorSpriteId].data6 = 2; - set_cursor_pos(0, 0); + namingScreenData.cursorSpriteId = CreateSprite(&gSpriteTemplate_83CE640, 0, 0, 0); + gSprites[namingScreenData.cursorSpriteId].oam.priority = 1; + gSprites[namingScreenData.cursorSpriteId].oam.objMode = 1; + gSprites[namingScreenData.cursorSpriteId].data6 = 1; + gSprites[namingScreenData.cursorSpriteId].data6 = 2; + SetCursorPos(0, 0); } static const u8 sKeyboardSymbolPositions[][9] = @@ -1009,70 +1091,70 @@ static const u8 sKeyboardSymbolPositions[][9] = {1, 4, 7, 10, 13, 16, 16, 16, 19}, //Others page }; -u8 sub_80B67EC(s16 x) +static u8 CursorColToKeyboardCol(s16 x) { - return sKeyboardSymbolPositions[EWRAM_000000.currentPage][x]; + return sKeyboardSymbolPositions[namingScreenData.currentPage][x]; } -void set_cursor_pos(s16 x, s16 y) +static void SetCursorPos(s16 x, s16 y) { - struct Sprite *sprite = &gSprites[EWRAM_000000.cursorSpriteId]; + struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId]; - sprite->pos1.x = sub_80B67EC(x) * 8 + 27; - sprite->pos1.y = y * 16 + 80; - sprite->data2 = sprite->data0; - sprite->data3 = sprite->data1; - sprite->data0 = x; - sprite->data1 = y; + cursorSprite->pos1.x = CursorColToKeyboardCol(x) * 8 + 27; + cursorSprite->pos1.y = y * 16 + 80; + cursorSprite->data2 = cursorSprite->data0; + cursorSprite->data3 = cursorSprite->data1; + cursorSprite->data0 = x; + cursorSprite->data1 = y; } -void get_cursor_pos(s16 *x, s16 *y) +static void GetCursorPos(s16 *x, s16 *y) { - struct Sprite *sprite = &gSprites[EWRAM_000000.cursorSpriteId]; + struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId]; - *x = sprite->data0; - *y = sprite->data1; + *x = cursorSprite->data0; + *y = cursorSprite->data1; } -void sub_80B6878(void) +static void MoveCursorToOKButton(void) { - set_cursor_pos(8, 2); + SetCursorPos(8, 2); } -void sub_80B6888(u8 a) +static void sub_80B6888(u8 a) { - gSprites[EWRAM_000000.cursorSpriteId].data4 &= -256; - gSprites[EWRAM_000000.cursorSpriteId].data4 |= a; - StartSpriteAnim(&gSprites[EWRAM_000000.cursorSpriteId], 0); + gSprites[namingScreenData.cursorSpriteId].data4 &= -256; + gSprites[namingScreenData.cursorSpriteId].data4 |= a; + StartSpriteAnim(&gSprites[namingScreenData.cursorSpriteId], 0); } -void sub_80B68D8(u8 a) +static void sub_80B68D8(u8 a) { - gSprites[EWRAM_000000.cursorSpriteId].data4 &= 0xFF; - gSprites[EWRAM_000000.cursorSpriteId].data4 |= a << 8; + gSprites[namingScreenData.cursorSpriteId].data4 &= 0xFF; + gSprites[namingScreenData.cursorSpriteId].data4 |= a << 8; } -void sub_80B6914(void) +static void sub_80B6914(void) { - StartSpriteAnim(&gSprites[EWRAM_000000.cursorSpriteId], 1); + StartSpriteAnim(&gSprites[namingScreenData.cursorSpriteId], 1); } -bool8 sub_80B6938(void) +static bool8 IsCursorAnimFinished(void) { - return gSprites[EWRAM_000000.cursorSpriteId].animEnded; + return gSprites[namingScreenData.cursorSpriteId].animEnded; } -u8 sub_80B6958(void) +static u8 GetKeyRoleAtCursorPos(void) { - const u8 arr[] = {1, 2, 3}; - s16 var1; - s16 var2; + const u8 keyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK}; + s16 cursorX; + s16 cursorY; - get_cursor_pos(&var1, &var2); - if (var1 < 8) - return 0; + GetCursorPos(&cursorX, &cursorY); + if (cursorX < 8) + return KEY_ROLE_CHAR; else - return arr[var2]; + return keyRoles[cursorY]; } #ifdef NONMATCHING @@ -1240,14 +1322,14 @@ _080B6A7C: .4byte 0x01010000\n\ } #endif -void sub_80B6A80(void) +static void sub_80B6A80(void) { u8 spriteId1; u8 spriteId2; u8 spriteId3; spriteId1 = CreateSprite(&gSpriteTemplate_83CE5C8, 0xCC, 0x50, 0); - EWRAM_000000.unk10 = spriteId1; + namingScreenData.unk10 = spriteId1; SetSubspriteTables(&gSprites[spriteId1], gSubspriteTables_83CE558); spriteId2 = CreateSprite(&gSpriteTemplate_83CE5F8, 0xCC, 0x4C, 1); @@ -1259,18 +1341,18 @@ void sub_80B6A80(void) gSprites[spriteId1].data7 = spriteId3; } -void sub_80B6B14(void) +static void sub_80B6B14(void) { - struct Sprite *sprite = &gSprites[EWRAM_000000.unk10]; + struct Sprite *sprite = &gSprites[namingScreenData.unk10]; sprite->data0 = 2; - sprite->data1 = EWRAM_000000.currentPage; + sprite->data1 = namingScreenData.currentPage; } -u8 sub_80B6B5C(struct Sprite *); -u8 sub_80B6B98(struct Sprite *); -u8 sub_80B6B9C(struct Sprite *); -u8 sub_80B6C08(struct Sprite *); +static u8 sub_80B6B5C(struct Sprite *); +static u8 sub_80B6B98(struct Sprite *); +static u8 sub_80B6B9C(struct Sprite *); +static u8 sub_80B6C08(struct Sprite *); static u8 (*const gUnknown_083CE2B4[])(struct Sprite *) = { @@ -1286,22 +1368,22 @@ void sub_80B6B34(struct Sprite *sprite) ; } -u8 sub_80B6B5C(struct Sprite *sprite) +static u8 sub_80B6B5C(struct Sprite *sprite) { struct Sprite *sprite1 = &gSprites[sprite->data6]; struct Sprite *sprite2 = &gSprites[sprite->data7]; - sub_80B6C48(EWRAM_000000.currentPage, sprite1, sprite2); + sub_80B6C48(namingScreenData.currentPage, sprite1, sprite2); sprite->data0++; return 0; } -u8 sub_80B6B98(struct Sprite *sprite) +static u8 sub_80B6B98(struct Sprite *sprite) { return 0; } -u8 sub_80B6B9C(struct Sprite *sprite) +static u8 sub_80B6B9C(struct Sprite *sprite) { struct Sprite *r4 = &gSprites[sprite->data6]; struct Sprite *r5 = &gSprites[sprite->data7]; @@ -1317,7 +1399,7 @@ u8 sub_80B6B9C(struct Sprite *sprite) return 0; } -u8 sub_80B6C08(struct Sprite *sprite) +static u8 sub_80B6C08(struct Sprite *sprite) { struct Sprite *r2 = &gSprites[sprite->data6]; @@ -1334,7 +1416,7 @@ u8 sub_80B6C08(struct Sprite *sprite) static const u16 gUnknown_083CE2C4[] = {1, 3, 2}; static const u16 gUnknown_083CE2CA[] = {4, 6, 5}; -void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c) +static void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c) { c->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_083CE2C4[a]); b->sheetTileStart = GetSpriteTileStartByTag(gUnknown_083CE2CA[a]); @@ -1343,7 +1425,7 @@ void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c) // -void sub_80B6CA8(void) +static void sub_80B6CA8(void) { u8 spriteId; @@ -1354,17 +1436,17 @@ void sub_80B6CA8(void) SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); } -void sub_80B6D04(void) +static void sub_80B6D04(void) { u8 spriteId; s16 r1; u8 i; - r1 = (EWRAM_000000.unk2 - 1) * 8 + 4; + r1 = (namingScreenData.unk2 - 1) * 8 + 4; spriteId = CreateSprite(&gSpriteTemplate_83CE658, r1, 0x28, 0); gSprites[spriteId].oam.priority = 3; - r1 = EWRAM_000000.unk2 * 8 + 4; - for (i = 0; i < EWRAM_000000.unk34->unk1; i++, r1 += 8) + r1 = namingScreenData.unk2 * 8 + 4; + for (i = 0; i < namingScreenData.template->maxChars; i++, r1 += 8) { spriteId = CreateSprite(&gSpriteTemplate_83CE670, r1, 0x2C, 0); gSprites[spriteId].oam.priority = 3; @@ -1389,7 +1471,7 @@ void sub_80B6DE8(struct Sprite *sprite) const s16 arr[] = {2, 3, 2, 1}; u8 var; - var = sub_80B6F44(); + var = GetTextCaretPosition(); if (var != (u8)sprite->data0) { sprite->pos2.y = 0; @@ -1410,10 +1492,10 @@ void sub_80B6DE8(struct Sprite *sprite) // -void nullsub_40(void); -void sub_80B6E68(void); -void sub_80B6EBC(void); -void sub_80B6EFC(void); +static void nullsub_40(void); +static void sub_80B6E68(void); +static void sub_80B6EBC(void); +static void sub_80B6EFC(void); static void (*const gUnknown_083CE2E0[])(void) = { @@ -1423,27 +1505,27 @@ static void (*const gUnknown_083CE2E0[])(void) = sub_80B6EFC, }; -void sub_80B6E44(void) +static void sub_80B6E44(void) { - gUnknown_083CE2E0[EWRAM_000000.unk34->unk2](); + gUnknown_083CE2E0[namingScreenData.template->unk2](); } -void nullsub_40(void) +static void nullsub_40(void) { } -void sub_80B6E68(void) +static void sub_80B6E68(void) { u8 rivalGfxId; u8 spriteId; - rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, EWRAM_000000.unk3E); + rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, namingScreenData.unk3E); spriteId = AddPseudoFieldObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x18, 0); gSprites[spriteId].oam.priority = 3; StartSpriteAnim(&gSprites[spriteId], 4); } -void sub_80B6EBC(void) +static void sub_80B6EBC(void) { u8 spriteId; @@ -1452,77 +1534,684 @@ void sub_80B6EBC(void) gSprites[spriteId].oam.priority = 3; } -void sub_80B6EFC(void) +static void sub_80B6EFC(void) { u8 spriteId; sub_809D51C(); - spriteId = CreateMonIcon(EWRAM_000000.unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, EWRAM_000000.unk44); + spriteId = CreateMonIcon(namingScreenData.unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, namingScreenData.unk44); gSprites[spriteId].oam.priority = 3; } -u8 sub_80B6F44(void) +static u8 GetTextCaretPosition(void) { u8 i; - for (i = 0; i < EWRAM_000000.unk34->unk1; i++) + for (i = 0; i < namingScreenData.template->maxChars; i++) { - if (EWRAM_000000.textBuffer[i] == 0xFF) + if (namingScreenData.textBuffer[i] == EOS) return i; } - return EWRAM_000000.unk34->unk1 - 1; + return namingScreenData.template->maxChars - 1; } -u8 sub_80B6F84(void) +static u8 GetPreviousTextCaretPosition(void) { s8 i; - for (i = EWRAM_000000.unk34->unk1 - 1; i > 0; i--) + for (i = namingScreenData.template->maxChars - 1; i > 0; i--) { - if (EWRAM_000000.textBuffer[i] != 0xFF) + if (namingScreenData.textBuffer[i] != EOS) return i; } return 0; } -void sub_80B6FBC(void) +static void DeleteTextCharacter(void) { - u8 var; + u8 index; u8 var2; - var = sub_80B6F84(); - EWRAM_000000.textBuffer[var] = 0; + index = GetPreviousTextCaretPosition(); + namingScreenData.textBuffer[index] = 0; sub_80B7960(); - EWRAM_000000.textBuffer[var] = 0xFF; - var2 = sub_80B6958(); + namingScreenData.textBuffer[index] = EOS; + var2 = GetKeyRoleAtCursorPos(); if (var2 == 0 || var2 == 2) sub_80B6460(1, 0, 1); PlaySE(SE_BOWA); } -u8 sub_80B7004(void) +static bool8 sub_80B7004(void) { s16 x; s16 y; - u8 var; - u8 r4; + u8 ch; + bool8 r4; - get_cursor_pos(&x, &y); - x = sub_80B67EC(x); - var = sub_80B7768(x, y); + GetCursorPos(&x, &y); + x = CursorColToKeyboardCol(x); + ch = GetCharAtKeyboardPos(x, y); r4 = 1; - if (var == 0xFF) + if (ch == 0xFF) r4 = sub_80B7104(); - else if (var == 0xFE) + else if (ch == 0xFE) r4 = sub_80B713C(); else - sub_80B7174(var); + AddTextCharacter(ch); sub_80B7960(); PlaySE(SE_SELECT); - if (r4 != 0) + if (r4) { - if (sub_80B6F84() == EWRAM_000000.unk34->unk1 - 1) - return 1; + if (GetPreviousTextCaretPosition() == namingScreenData.template->maxChars - 1) + return TRUE; } - return 0; + return FALSE; +} + +static void sub_80B7090(void) +{ + u8 r5; + u8 r4; + + r5 = GetPreviousTextCaretPosition(); + r4 = namingScreenData.textBuffer[r5]; + if (sub_80B7198(r4)) + { + if (sub_80B7264(r4)) + sub_80B7370(r4, r5); + else + sub_80B73CC(r4, r5); + } + else + { + if (sub_80B71E4(r4)) + sub_80B7474(r4, r5); + else + sub_80B72A4(r4, r5); + } + sub_80B7960(); + PlaySE(SE_SELECT); +} + +static bool8 sub_80B7104(void) +{ + u8 r5; + u8 r4; + + r5 = GetPreviousTextCaretPosition(); + r4 = namingScreenData.textBuffer[r5]; + if (sub_80B720C(r4)) + { + sub_80B72A4(r4, r5); + return TRUE; + } + return FALSE; +} + +static bool8 sub_80B713C(void) +{ + u8 r5; + u8 r4; + + r5 = GetPreviousTextCaretPosition(); + r4 = namingScreenData.textBuffer[r5]; + if (sub_80B7264(r4)) + { + sub_80B7370(r4, r5); + return TRUE; + } + return FALSE; +} + +static void AddTextCharacter(u8 ch) +{ + u8 index = GetTextCaretPosition(); + + namingScreenData.textBuffer[index] = ch; +} + +static bool8 sub_80B7198(u8 a) +{ + if ((a >= 55 && a <= 74) + || (a >= 135 && a <= 139) + || (a >= 140 && a <= 144) + || (a >= 145 && a <= 149) + || (a >= 150 && a <= 154)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80B71E4(u8 a) +{ + if ((a >= 75 && a <= 79) + || (a >= 155 && a <= 159)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80B720C(u8 a) +{ + if ((a >= 6 && a <= 20) + || (a >= 26 && a <= 30) + || (a >= 75 && a <= 79) + || (a >= 86 && a <= 100) + || (a >= 106 && a <= 110) + || (a >= 155 && a <= 159)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80B7264(u8 a) +{ + if ((a >= 26 && a <= 30) + || (a >= 70 && a <= 74) + || (a >= 106 && a <= 110) + || (a >= 150 && a <= 154)) + return TRUE; + else + return FALSE; +} + +static void sub_80B72A4(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 6 && a <= 10) + chr = a + 0x31; + else if (a >= 11 && a <= 15) + chr = a + 0x31; + else if (a >= 16 && a <= 20) + chr = a + 0x31; + else if (a >= 26 && a <= 30) + chr = a + 0x2C; + else if (a >= 75 && a <= 79) + chr = a + 0xFB; + else if (a >= 86 && a <= 90) + chr = a + 0x31; + else if (a >= 91 && a <= 95) + chr = a + 0x31; + else if (a >= 96 && a <= 100) + chr = a + 0x31; + else if (a >= 106 && a <= 110) + chr = a + 0x2C; + else if (a >= 155 && a <= 159) + chr = a + 0xFB; + namingScreenData.textBuffer[b] = chr; +} + +static void sub_80B7370(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 26 && a <= 30) + chr = a + 0x31; + else if (a >= 70 && a <= 74) + chr = a + 5; + else if (a >= 106 && a <= 110) + chr = a + 0x31; + else if (a >= 150 && a <= 154) + chr = a + 5; + namingScreenData.textBuffer[b] = chr; +} + +static void sub_80B73CC(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 55 && a <= 59) + chr = a + 0xCF; + else if (a >= 60 && a <= 64) + chr = a + 0xCF; + else if (a >= 65 && a <= 69) + chr = a + 0xCF; + else if (a >= 70 && a <= 74) + chr = a + 0xD4; + else if (a >= 135 && a <= 139) + chr = a + 0xCF; + else if (a >= 140 && a <= 144) + chr = a + 0xCF; + else if (a >= 145 && a <= 149) + chr = a + 0xCF; + else if (a >= 150 && a <= 154) + chr = a + 0xD4; + namingScreenData.textBuffer[b] = chr; +} + +static void sub_80B7474(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 75 && a <= 79) + chr = a + 0xCF; + else if (a >= 155 && a <= 159) + chr = a + 0xCF; + namingScreenData.textBuffer[b] = chr; +} + +static void sub_80B74B0(void) +{ + u8 i; + + for (i = 0; i < namingScreenData.template->maxChars; i++) + { + if (namingScreenData.textBuffer[i] != 0 && namingScreenData.textBuffer[i] != 0xFF) + { + StringCopyN(namingScreenData.destBuffer, namingScreenData.textBuffer, namingScreenData.template->maxChars + 1); + break; + } + } +} + +static void DisplaySentToPCMessage(void) +{ + StringCopy(gStringVar1, namingScreenData.destBuffer); + StringExpandPlaceholders(gStringVar4, gOtherText_SentToPC); + BasicInitMenuWindow(&gWindowConfig_81E6E88); + MenuDisplayMessageBox(); + sub_8072044(gStringVar4); } + +static void sub_80B753C(void) +{ + LoadSpriteSheets(gUnknown_083CE6A0); + LoadSpritePalettes(gUnknown_083CE708); +} + +static void sub_80B7558(void) +{ + sub_80B7568(); + sub_80B75B0(); +} + +static void sub_80B7568(void) +{ + const void *src; + void *dst; + + src = gNamingScreenMenu_Gfx; + dst = (void *)(VRAM + gMenuMessageBoxContentTileOffset * 32); + DmaCopy16(3, src, dst, 0x800); + + src = gNamingScreenMenu_Gfx; + dst = (void *)(VRAM + 0x8000 + gMenuMessageBoxContentTileOffset * 32); + DmaCopy16(3, src, dst, 0x800); +} + +static void sub_80B75B0(void) +{ + LoadPalette(gNamingScreenPalettes, 0, 0x80); +} + +static void sub_80B7650(u16 *); +static void sub_80B7660(u16 *); +static void sub_80B7670(u16 *); + +static void (*const gUnknown_083CE2F0[][2])(u16 *) = +{ + {sub_80B7660, sub_80B7650}, + {sub_80B7650, sub_80B7670}, + {sub_80B7670, sub_80B7660}, +}; + +static void sub_80B75C4(void) +{ + u16 *const arr[] = + { + (u16 *)(VRAM + 0xE000), + (u16 *)(VRAM + 0xE800), + }; + + gUnknown_083CE2F0[namingScreenData.currentPage][0](arr[namingScreenData.unkC]); + gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]); +} + +static void sub_80B7614(void) +{ + u16 *const arr[] = + { + (u16 *)(VRAM + 0xE000), + (u16 *)(VRAM + 0xE800), + }; + + gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]); +} + +static void sub_80B7650(u16 *vramBuffer) +{ + sub_80B7698(vramBuffer, gUnknown_083CE748); +} + +static void sub_80B7660(u16 *vramBuffer) +{ + sub_80B7698(vramBuffer, gUnknown_083CEBF8); +} + +static void sub_80B7670(u16 *vramBuffer) +{ + sub_80B7698(vramBuffer, gUnknown_083CF0A8); +} + +static void sub_80B7680(void) +{ + sub_80B76E0(VRAM + 0xF000, gUnknown_08E86258); +} + +static void sub_80B7698(u16 *vramBuffer, const u16 *src) +{ + s16 i; + s16 j; + + for (i = 0; i < 20; i++) + { + for (j = 0; j < 30; j++, src++) + { + vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset; + } + } +} + +static void sub_80B76E0(u16 *vramBuffer, const u16 *src) +{ + s16 i; + s16 j; + + for (i = 0; i < 20; i++) + { + for (j = 0; j < 30; j++, src++) + { + vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset; + } + src += 2; + } +} + +static void sub_80B772C(void) +{ + nullsub_20(namingScreenData.currentPage, namingScreenData.unkC); +} + +static void sub_80B7740(void) +{ + nullsub_20((namingScreenData.currentPage + 1) % 3, namingScreenData.unkD); +} + +static void nullsub_20(u8 a, u8 b) +{ +} + +static void sub_80B7838(void); +static void sub_80B7844(void); +static void sub_80B7850(void); + +static void (*const gUnknown_083CE310[][2])(void) = +{ + sub_80B7844, + sub_80B7838, + sub_80B7838, + sub_80B7850, + sub_80B7850, + sub_80B7844, +}; + +static const struct WindowConfig *const gUnknown_083CE328[][2][2] = +{ + { + {&gWindowConfig_81E6EDC, &gWindowConfig_81E6EF8}, + {&gWindowConfig_81E6EA4, &gWindowConfig_81E6EC0}, + }, + { + {&gWindowConfig_81E6EA4, &gWindowConfig_81E6EC0}, + {&gWindowConfig_81E6F14, &gWindowConfig_81E6F30}, + }, + { + {&gWindowConfig_81E6F14, &gWindowConfig_81E6F30}, + {&gWindowConfig_81E6EDC, &gWindowConfig_81E6EF8}, + }, +}; + +static void nullsub_61(void); +static void sub_80B78F8(void); + +static void (*const gUnknown_083CE358[])(void) = +{ + nullsub_61, + nullsub_61, + sub_80B78F8, + sub_80B78F8, +}; + +static void nullsub_62(void); +static void sub_80B7924(void); + +static void (*const gUnknown_083CE368[])(void) = +{ + nullsub_62, + sub_80B7924, +}; + +static const u8 sKeyboardCharacters[][4][20]; //forward declaration + +static u8 GetCharAtKeyboardPos(s16 a, s16 b) +{ + return sKeyboardCharacters[namingScreenData.currentPage][b][a]; +} + +static void sub_80B7794(void) +{ + BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][0][namingScreenData.unkC]); + gUnknown_083CE310[namingScreenData.currentPage][0](); + BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][1][namingScreenData.unkD]); + gUnknown_083CE310[namingScreenData.currentPage][1](); + sub_80B772C(); + sub_80B7740(); +} + +static void sub_80B77F8(void) +{ + BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][1][namingScreenData.unkD]); + gUnknown_083CE310[namingScreenData.currentPage][1](); + sub_80B7740(); +} + +static void sub_80B7838(void) +{ + PrintKeyboardCharacters(1); +} + +static void sub_80B7844(void) +{ + PrintKeyboardCharacters(0); +} + +static void sub_80B7850(void) +{ + PrintKeyboardCharacters(2); +} + +static void PrintKeyboardCharacters(u8 page) //print letters on page +{ + s16 i; + s16 r5; + + for (i = 0, r5 = 9; i < 4; i++, r5 += 2) + MenuPrint(sKeyboardCharacters[page][i], 3, r5); +} + +static void sub_80B78A8(void) +{ + BasicInitMenuWindow(&gWindowConfig_81E6F4C); + gUnknown_083CE358[namingScreenData.templateNum](); + gUnknown_083CE368[namingScreenData.template->unk3](); + MenuPrint(namingScreenData.template->title, 9, 2); +} + +static void nullsub_61(void) +{ +} + +static void sub_80B78F8(void) +{ + StringCopy(gStringVar1, gSpeciesNames[(s16)namingScreenData.unk3E]); +} + +static void nullsub_62(void) +{ +} + +static void sub_80B7924(void) +{ + u8 genderSymbol[2] = _("♂"); + + if ((s16)namingScreenData.unk40 != MON_GENDERLESS) + { + if ((s16)namingScreenData.unk40 == MON_FEMALE) + genderSymbol[0] = 0xB6; //female symbol + MenuPrint(genderSymbol, 0x14, 4); + } +} + +static void sub_80B7960(void) +{ + u8 *string = gStringVar1; + + string[0] = 0xFC; + string[1] = 0x14; + string[2] = 8; + string[3] = 0xFC; + string[4] = 0x11; + string[5] = 1; + string += 6; + StringCopy(string, namingScreenData.textBuffer); + BasicInitMenuWindow(&gWindowConfig_81E6F4C); + MenuPrint(gStringVar1, namingScreenData.unk2, 4); +} + +//-------------------------------------------------- +// Forward-declared variables +//-------------------------------------------------- + +static const struct NamingScreenTemplate playerNamingScreenTemplate = +{ + .unk0 = 0, + .maxChars = 7, + .unk2 = 1, + .unk3 = 0, + .unk4 = 0, + .unk5 = 0, + .unk6 = 0, + .unk7 = 0, + .title = OtherText_YourName, +}; + +static const struct NamingScreenTemplate pcBoxNamingTemplate = +{ + .unk0 = 0, + .maxChars = 8, + .unk2 = 2, + .unk3 = 0, + .unk4 = 0, + .unk5 = 0, + .unk6 = 0, + .unk7 = 0, + .title = OtherText_BoxName, +}; + +static const struct NamingScreenTemplate monNamingScreenTemplate = +{ + .unk0 = 0, + .maxChars = 10, + .unk2 = 3, + .unk3 = 1, + .unk4 = 0, + .unk5 = 0, + .unk6 = 0, + .unk7 = 0, + .title = OtherText_PokeName, +}; + +static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = +{ + &playerNamingScreenTemplate, + &pcBoxNamingTemplate, + &monNamingScreenTemplate, + &monNamingScreenTemplate, +}; + +static const u8 sKeyboardCharacters[][4][20] = +{ + { + _(" A B C D E F . "), + _(" G H I J K L , "), + _(" M N O P Q R S "), + _(" T U V W X Y Z "), + }, + { + _(" a b c d e f . "), + _(" g h i j k l , "), + _(" m n o p q r s "), + _(" t u v w x y z "), + }, + { + _(" 0 1 2 3 4 "), + _(" 5 6 7 8 9 "), + _(" ! ? ♂ ♀ / - "), + _(" … “ ” ‘ ’ "), + }, +}; + +const struct OamData gOamData_83CE498 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const struct OamData gOamData_83CE4A0 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const struct OamData gOamData_83CE4A8 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +//TODO: dump sprite data -- cgit v1.2.3 From 976ae74048a9b3a891f2d269e284bb542afec5fa Mon Sep 17 00:00:00 2001 From: YamaArashi Date: Fri, 27 Jan 2017 11:00:14 -0800 Subject: make sub_80B6998 match --- src/naming_screen.c | 141 ++-------------------------------------------------- 1 file changed, 5 insertions(+), 136 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 784e10f4f..fe3ca010f 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -1157,7 +1157,6 @@ static u8 GetKeyRoleAtCursorPos(void) return keyRoles[cursorY]; } -#ifdef NONMATCHING void sub_80B6998(struct Sprite *sprite) { if (sprite->animEnded) @@ -1180,147 +1179,17 @@ void sub_80B6998(struct Sprite *sprite) sprite->data6 = -sprite->data6; sprite->data7 = 2; } - //_080B6A3E if ((sprite->data4 & 0xFF00) != 0) { - //Can't get this part to match - u16 var = sprite->data5; - s8 r5 = var; - s16 var2 = var / 2; - s8 r4 = var2; + s16 var = sprite->data5; + s8 r4 = var; + s16 var2 = sprite->data5 >> 1; + s8 r5 = var2; u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101; - MultiplyInvertedPaletteRGBComponents(index, r4, r5, r5); + MultiplyInvertedPaletteRGBComponents(index, r5, r4, r4); } } -#else -__attribute__((naked)) -void sub_80B6998(struct Sprite *sprite) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - adds r4, r0, 0\n\ - adds r0, 0x3F\n\ - ldrb r1, [r0]\n\ - movs r0, 0x10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080B69B0\n\ - adds r0, r4, 0\n\ - movs r1, 0\n\ - bl StartSpriteAnim\n\ -_080B69B0:\n\ - ldrh r1, [r4, 0x36]\n\ - movs r0, 0xFF\n\ - ands r0, r1\n\ - adds r3, r4, 0\n\ - adds r3, 0x3E\n\ - movs r1, 0x1\n\ - ands r0, r1\n\ - lsls r0, 2\n\ - ldrb r1, [r3]\n\ - movs r2, 0x5\n\ - negs r2, r2\n\ - ands r2, r1\n\ - orrs r2, r0\n\ - strb r2, [r3]\n\ - movs r1, 0x2E\n\ - ldrsh r0, [r4, r1]\n\ - cmp r0, 0x8\n\ - bne _080B69DA\n\ - movs r0, 0x4\n\ - orrs r2, r0\n\ - strb r2, [r3]\n\ -_080B69DA:\n\ - ldrb r1, [r3]\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080B6A0A\n\ - movs r2, 0x36\n\ - ldrsh r0, [r4, r2]\n\ - movs r1, 0xFF\n\ - lsls r1, 8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080B6A0A\n\ - movs r0, 0x2E\n\ - ldrsh r1, [r4, r0]\n\ - movs r2, 0x32\n\ - ldrsh r0, [r4, r2]\n\ - cmp r1, r0\n\ - bne _080B6A0A\n\ - movs r0, 0x30\n\ - ldrsh r1, [r4, r0]\n\ - movs r2, 0x34\n\ - ldrsh r0, [r4, r2]\n\ - cmp r1, r0\n\ - beq _080B6A16\n\ -_080B6A0A:\n\ - movs r0, 0\n\ - strh r0, [r4, 0x38]\n\ - movs r0, 0x1\n\ - strh r0, [r4, 0x3A]\n\ - movs r0, 0x2\n\ - strh r0, [r4, 0x3C]\n\ -_080B6A16:\n\ - ldrh r0, [r4, 0x3C]\n\ - subs r0, 0x1\n\ - strh r0, [r4, 0x3C]\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - bne _080B6A3E\n\ - ldrh r1, [r4, 0x3A]\n\ - ldrh r2, [r4, 0x38]\n\ - adds r0, r1, r2\n\ - strh r0, [r4, 0x38]\n\ - lsls r0, 16\n\ - asrs r0, 16\n\ - cmp r0, 0x10\n\ - beq _080B6A36\n\ - cmp r0, 0\n\ - bne _080B6A3A\n\ -_080B6A36:\n\ - negs r0, r1\n\ - strh r0, [r4, 0x3A]\n\ -_080B6A3A:\n\ - movs r0, 0x2\n\ - strh r0, [r4, 0x3C]\n\ -_080B6A3E:\n\ - movs r1, 0x36\n\ - ldrsh r0, [r4, r1]\n\ - movs r1, 0xFF\n\ - lsls r1, 8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080B6A74\n\ - ldrh r4, [r4, 0x38]\n\ - lsls r5, r4, 24\n\ - lsrs r5, 24\n\ - lsls r4, 16\n\ - asrs r4, 17\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - movs r0, 0x5\n\ - bl IndexOfSpritePaletteTag\n\ - lsls r0, 24\n\ - lsrs r0, 4\n\ - ldr r2, _080B6A7C @ =0x01010000\n\ - adds r0, r2\n\ - lsrs r0, 16\n\ - adds r1, r4, 0\n\ - adds r2, r5, 0\n\ - adds r3, r5, 0\n\ - bl MultiplyInvertedPaletteRGBComponents\n\ -_080B6A74:\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080B6A7C: .4byte 0x01010000\n\ - .syntax divided\n"); -} -#endif static void sub_80B6A80(void) { -- cgit v1.2.3 From 0de796fad05702592c841b692e91506a94428752 Mon Sep 17 00:00:00 2001 From: YamaArashi Date: Fri, 27 Jan 2017 11:04:17 -0800 Subject: clean up variables in sub_80B6998 --- src/naming_screen.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index fe3ca010f..7e230f8bf 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -1181,13 +1181,11 @@ void sub_80B6998(struct Sprite *sprite) } if ((sprite->data4 & 0xFF00) != 0) { - s16 var = sprite->data5; - s8 r4 = var; - s16 var2 = sprite->data5 >> 1; - s8 r5 = var2; + s8 gb = sprite->data5; + s8 r = sprite->data5 >> 1; u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101; - MultiplyInvertedPaletteRGBComponents(index, r5, r4, r4); + MultiplyInvertedPaletteRGBComponents(index, r, gb, gb); } } -- cgit v1.2.3 From ed8f49d5e1418309cbc4f705a242d073258c8639 Mon Sep 17 00:00:00 2001 From: YamaArashi Date: Sat, 28 Jan 2017 13:51:14 -0800 Subject: tabs to spaces --- src/naming_screen.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 7e230f8bf..568fdf092 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -80,8 +80,8 @@ const u32 gSpriteImage_83CE154[] = INCBIN_U32("graphics/naming_screen/pc_icon/1. //Some unused pointer, perhaps. asm(".section .rodata\n\ @ XXX: what is this?\n\ - .align 2\n\ - .4byte 0x2000000\n"); + .align 2\n\ + .4byte 0x2000000\n"); extern u16 *const gUnknown_083CE28C[]; extern const struct SubspriteTable gSubspriteTables_83CE558[]; -- cgit v1.2.3 From f21587ea9eb1190ac2136d72deb7929c1e1169eb Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 11 Feb 2017 00:38:59 -0500 Subject: misc labels and memcpy/set cleanups (#232) * some labels and enumerate player speeds * clear up speed enums * GetPlayerSpeed * oops * start decompiling mauville_old_man.c * formatting * decompile more of mauville_old_man.c * someone fix this please * formatting * make ROM build again * formatting again * make ROM match again * label, document, reorganize, and clean up battle_ai.c * move stuff to battle.h and get rid of battle_2000000 * various changes * labeling * minor labels and formatting * contest ai labels and misc stuff --- src/naming_screen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 568fdf092..aa8066eb5 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -398,7 +398,7 @@ static void NamingScreen_Init(void) namingScreenData.currentPage = namingScreenData.template->unk4; namingScreenData.unk2 = 14 - namingScreenData.template->maxChars / 2; namingScreenData.unk3C = gKeyRepeatStartDelay; - memset(namingScreenData.textBuffer, 0xFF, 0x10); + memset(namingScreenData.textBuffer, 0xFF, sizeof(namingScreenData.textBuffer)); if (namingScreenData.template->unk0 != 0) StringCopy(namingScreenData.textBuffer, namingScreenData.destBuffer); gKeyRepeatStartDelay = 16; -- cgit v1.2.3 From 6035511c139549a0291b6b3d43b9b080f792b2b6 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 18 Mar 2017 04:00:15 +0100 Subject: reorganize and add new headers for many files --- src/naming_screen.c | 86 ++++------------------------------------------------- 1 file changed, 5 insertions(+), 81 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index aa8066eb5..54a796264 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -10,64 +10,13 @@ #include "task.h" #include "text.h" #include "trig.h" +#include "naming_screen.h" extern u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8, u8); extern u8 CreateMonIcon(); extern void sub_809D51C(void); extern void MultiplyInvertedPaletteRGBComponents(u16, u8, u8, u8); -enum -{ - NAMING_SCREEN_TEMPLATE_PLAYER_NAME, - NAMING_SCREEN_TEMPLATE_BOX_NAME, - NAMING_SCREEN_TEMPLATE_MON_NAME, -}; - -struct NamingScreenTemplate -{ - u8 unk0; - u8 maxChars; - u8 unk2; - u8 unk3; - u8 unk4; //mode? - u8 unk5; - u8 unk6; - u8 unk7; - const u8 *title; -}; - -struct NamingScreenData -{ - u8 state; - u8 templateNum; - u16 unk2; - u16 bg1vOffset; - u16 bg2vOffset; - u16 unk8; - u16 unkA; - u8 unkC; - u8 unkD; - u8 currentPage; - u8 cursorSpriteId; - u8 unk10; - u8 textBuffer[0x10]; - u8 filler21[0x13]; - const struct NamingScreenTemplate *template; - u8 *destBuffer; - u16 unk3C; //savedKeyRepeatStartDelay - u16 unk3E; - u16 unk40; - u32 unk44; - MainCallback returnCallback; -}; - -enum -{ - PAGE_UPPER, - PAGE_LOWER, - PAGE_OTHERS, -}; - extern u16 gKeyRepeatStartDelay; extern u8 unk_2000000[]; @@ -140,7 +89,7 @@ static void sub_80B6CA8(void); static void sub_80B6D04(void); static void sub_80B6E44(void); static void InputInit(void); -static void sub_80B6438(void); +static void sub_80B6438(void); static void sub_80B5E50(void); static void Task_NamingScreenMain(u8); static void SetInputState(u8); @@ -188,31 +137,6 @@ static void sub_80B76E0(); static void nullsub_20(u8, u8); static void PrintKeyboardCharacters(u8); -enum -{ - MAIN_STATE_BEGIN_FADE_IN, - MAIN_STATE_WAIT_FADE_IN, - MAIN_STATE_HANDLE_INPUT, - MAIN_STATE_MOVE_TO_OK_BUTTON, - MAIN_STATE_START_PAGE_SWAP, - MAIN_STATE_WAIT_PAGE_SWAP, - MAIN_STATE_6, - MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE, - MAIN_STATE_BEGIN_FADE_OUT, -}; - -enum -{ - INPUT_STATE_DISABLED, - INPUT_STATE_ENABLED, -}; - -#define KBEVENT_NONE 0 -#define KBEVENT_PRESSED_A 5 -#define KBEVENT_PRESSED_B 6 -#define KBEVENT_PRESSED_SELECT 8 -#define KBEVENT_PRESSED_START 9 - void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) { StoreNamingScreenParameters(templateNum, destBuffer, c, d, e, returnCallback); @@ -307,7 +231,7 @@ static void GetNamingScreenParameters(void) namingScreenData.templateNum = task->data[0]; namingScreenData.unk3E = task->data[1]; namingScreenData.unk40 = task->data[2]; - namingScreenData.unk44 = (task->data[3] << 16) | (u16)task->data[4]; + namingScreenData.unk42 = (task->data[3] << 16) | (u16)task->data[4]; LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&namingScreenData.destBuffer); LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&namingScreenData.returnCallback); DestroyTask(taskId); @@ -1406,7 +1330,7 @@ static void sub_80B6EFC(void) u8 spriteId; sub_809D51C(); - spriteId = CreateMonIcon(namingScreenData.unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, namingScreenData.unk44); + spriteId = CreateMonIcon(namingScreenData.unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, namingScreenData.unk42); gSprites[spriteId].oam.priority = 3; } @@ -1476,7 +1400,7 @@ static bool8 sub_80B7004(void) return FALSE; } -static void sub_80B7090(void) +static void sub_80B7090(void) // DoInput? { u8 r5; u8 r4; -- cgit v1.2.3 From ddc846fa6a0d9a13cfba6f52488a66f6f4562a2d Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Thu, 27 Apr 2017 15:43:31 +0200 Subject: Sort includes --- src/naming_screen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 54a796264..cd108740b 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -1,4 +1,5 @@ #include "global.h" +#include "naming_screen.h" #include "asm.h" #include "main.h" #include "menu.h" @@ -10,7 +11,6 @@ #include "task.h" #include "text.h" #include "trig.h" -#include "naming_screen.h" extern u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8, u8); extern u8 CreateMonIcon(); -- cgit v1.2.3 From c8e8e7dcfc60ab2769c0c1ada5a580ec1c1c4d5d Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Fri, 5 May 2017 16:16:54 +0200 Subject: Remove trailing whitespace --- src/naming_screen.c | 132 ++++++++++++++++++++++++++-------------------------- 1 file changed, 66 insertions(+), 66 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index cd108740b..f00a9bd3e 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -209,7 +209,7 @@ static void VBlankCB_NamingScreen(void) static void StoreNamingScreenParameters(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) { struct Task *task; - + //Create a task that does nothing, and use it as a temporary space to store parameters task = &gTasks[CreateTask(Task_DoNothing, 0xFF)]; task->data[0] = templateNum; @@ -225,7 +225,7 @@ static void GetNamingScreenParameters(void) { u8 taskId; struct Task *task; - + taskId = FindTaskIdByFunc(Task_DoNothing); task = &gTasks[taskId]; namingScreenData.templateNum = task->data[0]; @@ -251,7 +251,7 @@ static void NamingScreen_TurnOffScreen(void) static void NamingScreen_InitDisplayMode(void) { u16 savedIme; - + SetVBlankCallback(VBlankCB_NamingScreen); savedIme = REG_IME; REG_IME = 0; @@ -401,7 +401,7 @@ static bool8 (*const sMainStateFuncs[])(struct Task *) = static void sub_80B5E50(void) { u8 taskId; - + taskId = CreateTask(Task_NamingScreenMain, 2); Task_NamingScreenMain(taskId); } @@ -462,7 +462,7 @@ static bool8 MainState_WaitPageSwap(struct Task *task) { s16 cursorX; s16 cursorY; - + if (IsPageSwapAnimNotInProgress()) { namingScreenData.state = MAIN_STATE_HANDLE_INPUT; @@ -552,7 +552,7 @@ static bool8 HandleKeyboardEvent(void) { u8 event = GetInputEvent(); u8 keyRole = GetKeyRoleAtCursorPos(); - + if (event == KBEVENT_PRESSED_SELECT) return sub_80B61C8(); else if (event == KBEVENT_PRESSED_B) @@ -574,7 +574,7 @@ static bool8 KeyboardKeyHandler_Character(u8 event) if (event == KBEVENT_PRESSED_A) { u8 var = sub_80B7004(); - + sub_80B6914(); if (var) { @@ -656,14 +656,14 @@ static void InputInit(void) static u8 GetInputEvent(void) { u8 taskId = FindTaskIdByFunc(Task_HandleInput); - + return gTasks[taskId].tKeyboardEvent; } static void SetInputState(u8 state) { u8 taskId = FindTaskIdByFunc(Task_HandleInput); - + gTasks[taskId].tState = state; } @@ -731,7 +731,7 @@ static void HandleDpadMovement(struct Task *task) s16 cursorY; u16 dpadDir; s16 prevCursorX; - + GetCursorPos(&cursorX, &cursorY); dpadDir = 0; if (gMain.newAndRepeatedKeys & DPAD_UP) @@ -742,18 +742,18 @@ static void HandleDpadMovement(struct Task *task) dpadDir = 3; if (gMain.newAndRepeatedKeys & DPAD_RIGHT) dpadDir = 4; - + //Get new cursor position prevCursorX = cursorX; cursorX += sDpadDeltaX[dpadDir]; cursorY += sDpadDeltaY[dpadDir]; - + //Wrap cursor position in the X direction if (cursorX < 0) cursorX = 8; if (cursorX > 8) cursorX = 0; - + //Handle cursor movement in X direction if (sDpadDeltaX[dpadDir] != 0) { @@ -765,7 +765,7 @@ static void HandleDpadMovement(struct Task *task) else cursorX = 5; } - + if (cursorX == 8) { //We are now on the last column @@ -780,7 +780,7 @@ static void HandleDpadMovement(struct Task *task) cursorY = gUnknown_083CE274[cursorY]; } } - + if (cursorX == 8) { //There are only 3 keys on the last column, unlike the others, @@ -809,7 +809,7 @@ static void HandleDpadMovement(struct Task *task) #undef tKbFunctionKey //-------------------------------------------------- -// +// //-------------------------------------------------- static void Task_80B64D4(u8); @@ -820,7 +820,7 @@ static void sub_80B65D4(struct Task *, u8, u8); static void sub_80B6438(void) { u8 taskId; - + taskId = CreateTask(Task_80B64D4, 3); gTasks[taskId].data[0] = 3; } @@ -828,7 +828,7 @@ static void sub_80B6438(void) static void sub_80B6460(u8 a, u8 b, u8 c) { struct Task *task = &gTasks[FindTaskIdByFunc(Task_80B64D4)]; - + if (a == task->data[0] && c == 0) { task->data[1] = b; @@ -845,7 +845,7 @@ static void sub_80B6460(u8 a, u8 b, u8 c) static void Task_80B64D4(u8 taskId) { struct Task *task = &gTasks[taskId]; - + if (task->data[0] == 3 || task->data[2] == 0) return; MultiplyInvertedPaletteRGBComponents(sub_80B654C(task->data[0]), task->data[3], task->data[3], task->data[3]); @@ -874,14 +874,14 @@ static u16 sub_80B654C(u8 a) IndexOfSpritePaletteTag(6) * 16 + 0x10C, IndexOfSpritePaletteTag(6) * 16 + 0x10E, }; - + return arr[a]; } static void sub_80B65AC(u8 a) { u16 index = sub_80B654C(a); - + gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; } @@ -918,7 +918,7 @@ static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) = static void StartPageSwapAnim(void) { u8 taskId; - + taskId = CreateTask(Task_HandlePageSwapAnim, 0); Task_HandlePageSwapAnim(taskId); } @@ -952,14 +952,14 @@ static bool8 PageSwapAnimState_1(struct Task *task) &namingScreenData.bg2vOffset, &namingScreenData.bg1vOffset }; - + task->tFrameCount += 4; *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40); *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); if (task->tFrameCount >= 64) { u8 temp = namingScreenData.unk8; //Why u8 and not u16? - + namingScreenData.unk8 = namingScreenData.unkA; namingScreenData.unkA = temp; task->tState++; @@ -970,14 +970,14 @@ static bool8 PageSwapAnimState_1(struct Task *task) static bool8 PageSwapAnimState_2(struct Task *task) { u16 *const arr[] = {&namingScreenData.bg2vOffset, &namingScreenData.bg1vOffset}; - + task->tFrameCount += 4; *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40); *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); if (task->tFrameCount >= 128) { u8 temp = namingScreenData.unkC; - + namingScreenData.unkC = namingScreenData.unkD; namingScreenData.unkD = temp; task->tState++; @@ -1023,7 +1023,7 @@ static u8 CursorColToKeyboardCol(s16 x) static void SetCursorPos(s16 x, s16 y) { struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId]; - + cursorSprite->pos1.x = CursorColToKeyboardCol(x) * 8 + 27; cursorSprite->pos1.y = y * 16 + 80; cursorSprite->data2 = cursorSprite->data0; @@ -1035,7 +1035,7 @@ static void SetCursorPos(s16 x, s16 y) static void GetCursorPos(s16 *x, s16 *y) { struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId]; - + *x = cursorSprite->data0; *y = cursorSprite->data1; } @@ -1073,7 +1073,7 @@ static u8 GetKeyRoleAtCursorPos(void) const u8 keyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK}; s16 cursorX; s16 cursorY; - + GetCursorPos(&cursorX, &cursorY); if (cursorX < 8) return KEY_ROLE_CHAR; @@ -1108,7 +1108,7 @@ void sub_80B6998(struct Sprite *sprite) s8 gb = sprite->data5; s8 r = sprite->data5 >> 1; u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101; - + MultiplyInvertedPaletteRGBComponents(index, r, gb, gb); } } @@ -1118,15 +1118,15 @@ static void sub_80B6A80(void) u8 spriteId1; u8 spriteId2; u8 spriteId3; - + spriteId1 = CreateSprite(&gSpriteTemplate_83CE5C8, 0xCC, 0x50, 0); namingScreenData.unk10 = spriteId1; SetSubspriteTables(&gSprites[spriteId1], gSubspriteTables_83CE558); - + spriteId2 = CreateSprite(&gSpriteTemplate_83CE5F8, 0xCC, 0x4C, 1); gSprites[spriteId1].data6 = spriteId2; SetSubspriteTables(&gSprites[spriteId2], gSubspriteTables_83CE560); - + spriteId3 = CreateSprite(&gSpriteTemplate_83CE5E0, 0xCC, 0x4B, 2); gSprites[spriteId3].oam.priority = 1; gSprites[spriteId1].data7 = spriteId3; @@ -1135,7 +1135,7 @@ static void sub_80B6A80(void) static void sub_80B6B14(void) { struct Sprite *sprite = &gSprites[namingScreenData.unk10]; - + sprite->data0 = 2; sprite->data1 = namingScreenData.currentPage; } @@ -1178,7 +1178,7 @@ static u8 sub_80B6B9C(struct Sprite *sprite) { struct Sprite *r4 = &gSprites[sprite->data6]; struct Sprite *r5 = &gSprites[sprite->data7]; - + r4->pos2.y++; if (r4->pos2.y > 7) { @@ -1193,7 +1193,7 @@ static u8 sub_80B6B9C(struct Sprite *sprite) static u8 sub_80B6C08(struct Sprite *sprite) { struct Sprite *r2 = &gSprites[sprite->data6]; - + r2->invisible = FALSE; r2->pos2.y++; if (r2->pos2.y >= 0) @@ -1219,10 +1219,10 @@ static void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c) static void sub_80B6CA8(void) { u8 spriteId; - + spriteId = CreateSprite(&gSpriteTemplate_83CE610, 0xCC, 0x6C, 0); SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); - + spriteId = CreateSprite(&gSpriteTemplate_83CE628, 0xCC, 0x84, 0); SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); } @@ -1232,7 +1232,7 @@ static void sub_80B6D04(void) u8 spriteId; s16 r1; u8 i; - + r1 = (namingScreenData.unk2 - 1) * 8 + 4; spriteId = CreateSprite(&gSpriteTemplate_83CE658, r1, 0x28, 0); gSprites[spriteId].oam.priority = 3; @@ -1248,7 +1248,7 @@ static void sub_80B6D04(void) void sub_80B6D9C(struct Sprite *sprite) { const s16 arr[] = {0, -4, -2, -1}; - + if (sprite->data0 == 0 || --sprite->data0 == 0) { sprite->data0 = 8; @@ -1261,7 +1261,7 @@ void sub_80B6DE8(struct Sprite *sprite) { const s16 arr[] = {2, 3, 2, 1}; u8 var; - + var = GetTextCaretPosition(); if (var != (u8)sprite->data0) { @@ -1309,7 +1309,7 @@ static void sub_80B6E68(void) { u8 rivalGfxId; u8 spriteId; - + rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, namingScreenData.unk3E); spriteId = AddPseudoFieldObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x18, 0); gSprites[spriteId].oam.priority = 3; @@ -1319,7 +1319,7 @@ static void sub_80B6E68(void) static void sub_80B6EBC(void) { u8 spriteId; - + spriteId = CreateSprite(&gSpriteTemplate_83CE688, 0x34, 0x18, 0); SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE580); gSprites[spriteId].oam.priority = 3; @@ -1328,7 +1328,7 @@ static void sub_80B6EBC(void) static void sub_80B6EFC(void) { u8 spriteId; - + sub_809D51C(); spriteId = CreateMonIcon(namingScreenData.unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, namingScreenData.unk42); gSprites[spriteId].oam.priority = 3; @@ -1337,7 +1337,7 @@ static void sub_80B6EFC(void) static u8 GetTextCaretPosition(void) { u8 i; - + for (i = 0; i < namingScreenData.template->maxChars; i++) { if (namingScreenData.textBuffer[i] == EOS) @@ -1349,7 +1349,7 @@ static u8 GetTextCaretPosition(void) static u8 GetPreviousTextCaretPosition(void) { s8 i; - + for (i = namingScreenData.template->maxChars - 1; i > 0; i--) { if (namingScreenData.textBuffer[i] != EOS) @@ -1362,7 +1362,7 @@ static void DeleteTextCharacter(void) { u8 index; u8 var2; - + index = GetPreviousTextCaretPosition(); namingScreenData.textBuffer[index] = 0; sub_80B7960(); @@ -1379,7 +1379,7 @@ static bool8 sub_80B7004(void) s16 y; u8 ch; bool8 r4; - + GetCursorPos(&x, &y); x = CursorColToKeyboardCol(x); ch = GetCharAtKeyboardPos(x, y); @@ -1404,7 +1404,7 @@ static void sub_80B7090(void) // DoInput? { u8 r5; u8 r4; - + r5 = GetPreviousTextCaretPosition(); r4 = namingScreenData.textBuffer[r5]; if (sub_80B7198(r4)) @@ -1429,7 +1429,7 @@ static bool8 sub_80B7104(void) { u8 r5; u8 r4; - + r5 = GetPreviousTextCaretPosition(); r4 = namingScreenData.textBuffer[r5]; if (sub_80B720C(r4)) @@ -1444,7 +1444,7 @@ static bool8 sub_80B713C(void) { u8 r5; u8 r4; - + r5 = GetPreviousTextCaretPosition(); r4 = namingScreenData.textBuffer[r5]; if (sub_80B7264(r4)) @@ -1458,7 +1458,7 @@ static bool8 sub_80B713C(void) static void AddTextCharacter(u8 ch) { u8 index = GetTextCaretPosition(); - + namingScreenData.textBuffer[index] = ch; } @@ -1510,7 +1510,7 @@ static bool8 sub_80B7264(u8 a) static void sub_80B72A4(u8 a, u8 b) { u8 chr = a; - + if (a >= 6 && a <= 10) chr = a + 0x31; else if (a >= 11 && a <= 15) @@ -1537,7 +1537,7 @@ static void sub_80B72A4(u8 a, u8 b) static void sub_80B7370(u8 a, u8 b) { u8 chr = a; - + if (a >= 26 && a <= 30) chr = a + 0x31; else if (a >= 70 && a <= 74) @@ -1552,7 +1552,7 @@ static void sub_80B7370(u8 a, u8 b) static void sub_80B73CC(u8 a, u8 b) { u8 chr = a; - + if (a >= 55 && a <= 59) chr = a + 0xCF; else if (a >= 60 && a <= 64) @@ -1575,7 +1575,7 @@ static void sub_80B73CC(u8 a, u8 b) static void sub_80B7474(u8 a, u8 b) { u8 chr = a; - + if (a >= 75 && a <= 79) chr = a + 0xCF; else if (a >= 155 && a <= 159) @@ -1586,7 +1586,7 @@ static void sub_80B7474(u8 a, u8 b) static void sub_80B74B0(void) { u8 i; - + for (i = 0; i < namingScreenData.template->maxChars; i++) { if (namingScreenData.textBuffer[i] != 0 && namingScreenData.textBuffer[i] != 0xFF) @@ -1622,11 +1622,11 @@ static void sub_80B7568(void) { const void *src; void *dst; - + src = gNamingScreenMenu_Gfx; dst = (void *)(VRAM + gMenuMessageBoxContentTileOffset * 32); DmaCopy16(3, src, dst, 0x800); - + src = gNamingScreenMenu_Gfx; dst = (void *)(VRAM + 0x8000 + gMenuMessageBoxContentTileOffset * 32); DmaCopy16(3, src, dst, 0x800); @@ -1655,7 +1655,7 @@ static void sub_80B75C4(void) (u16 *)(VRAM + 0xE000), (u16 *)(VRAM + 0xE800), }; - + gUnknown_083CE2F0[namingScreenData.currentPage][0](arr[namingScreenData.unkC]); gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]); } @@ -1667,7 +1667,7 @@ static void sub_80B7614(void) (u16 *)(VRAM + 0xE000), (u16 *)(VRAM + 0xE800), }; - + gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]); } @@ -1695,7 +1695,7 @@ static void sub_80B7698(u16 *vramBuffer, const u16 *src) { s16 i; s16 j; - + for (i = 0; i < 20; i++) { for (j = 0; j < 30; j++, src++) @@ -1709,7 +1709,7 @@ static void sub_80B76E0(u16 *vramBuffer, const u16 *src) { s16 i; s16 j; - + for (i = 0; i < 20; i++) { for (j = 0; j < 30; j++, src++) @@ -1827,7 +1827,7 @@ static void PrintKeyboardCharacters(u8 page) //print letters on page { s16 i; s16 r5; - + for (i = 0, r5 = 9; i < 4; i++, r5 += 2) MenuPrint(sKeyboardCharacters[page][i], 3, r5); } @@ -1856,7 +1856,7 @@ static void nullsub_62(void) static void sub_80B7924(void) { u8 genderSymbol[2] = _("♂"); - + if ((s16)namingScreenData.unk40 != MON_GENDERLESS) { if ((s16)namingScreenData.unk40 == MON_FEMALE) @@ -1868,7 +1868,7 @@ static void sub_80B7924(void) static void sub_80B7960(void) { u8 *string = gStringVar1; - + string[0] = 0xFC; string[1] = 0x14; string[2] = 8; -- cgit v1.2.3 From fbebe08ae94b8e165ba120d71959554765307ce3 Mon Sep 17 00:00:00 2001 From: Cameron Hall Date: Tue, 9 May 2017 12:52:39 -0500 Subject: use macros to set DISPCNT and BG*CNT registers (#286) * use macros to set DISPCNT and BG*CNT registers * add a few more --- src/naming_screen.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index f00a9bd3e..b14c690e2 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -298,10 +298,10 @@ static void NamingScreen_SetUpVideoRegs(void) REG_BG2VOFS = 0; REG_BG3HOFS = 0; REG_BG3VOFS = 0; - REG_BG0CNT = 0x1F00; - REG_BG1CNT = 0x1C01; - REG_BG2CNT = 0x1D0A; - REG_BG3CNT = 0x1E03; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(28) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(29) | BGCNT_16COLOR | BGCNT_TXT256x256; + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(30) | BGCNT_16COLOR | BGCNT_TXT256x256; REG_BLDCNT = 0x640; REG_BLDALPHA = 0x80C; } -- cgit v1.2.3 From d35dc5bd698b8e359669ac0e5bc74b2df0e58bd8 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sun, 21 May 2017 12:46:28 +0200 Subject: Add strings2.h --- src/naming_screen.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index b14c690e2..8c90686ee 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -8,6 +8,7 @@ #include "sound.h" #include "sprite.h" #include "string_util.h" +#include "strings2.h" #include "task.h" #include "text.h" #include "trig.h" @@ -48,7 +49,6 @@ extern const struct SpriteTemplate gSpriteTemplate_83CE670; extern const struct SpriteTemplate gSpriteTemplate_83CE688; extern const struct SpriteSheet gUnknown_083CE6A0[]; extern const struct SpritePalette gUnknown_083CE708[]; -extern const u8 gOtherText_SentToPC[]; extern const u8 gNamingScreenMenu_Gfx[]; extern u16 gMenuMessageBoxContentTileOffset; extern const u16 gNamingScreenPalettes[]; @@ -57,9 +57,6 @@ extern const u16 gUnknown_083CEBF8[]; extern const u16 gUnknown_083CF0A8[]; extern const u16 gUnknown_08E86258[]; extern const u8 gSpeciesNames[][11]; -extern const u8 OtherText_YourName[]; -extern const u8 OtherText_BoxName[]; -extern const u8 OtherText_PokeName[]; static void C2_NamingScreen(void); static void sub_80B5AA0(void); -- cgit v1.2.3 From 6f2cd1e2da53cb0c4a4f4465d8ad72532050174d Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sun, 21 May 2017 13:25:26 +0200 Subject: Add data2 header --- src/naming_screen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 8c90686ee..53ee5ff19 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -1,6 +1,7 @@ #include "global.h" #include "naming_screen.h" #include "asm.h" +#include "data2.h" #include "main.h" #include "menu.h" #include "palette.h" @@ -56,7 +57,6 @@ extern const u16 gUnknown_083CE748[]; extern const u16 gUnknown_083CEBF8[]; extern const u16 gUnknown_083CF0A8[]; extern const u16 gUnknown_08E86258[]; -extern const u8 gSpeciesNames[][11]; static void C2_NamingScreen(void); static void sub_80B5AA0(void); -- cgit v1.2.3 From 4d2b22a899c11dfcacfec6889968ab01655a3fe3 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Fri, 26 May 2017 14:53:51 +0200 Subject: Add headers --- src/naming_screen.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 53ee5ff19..65e55e284 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -1,6 +1,10 @@ +#include "util.h" +#include "field_player_avatar.h" +#include "field_map_obj.h" +#include "pokemon_icon.h" +#include "field_effect.h" #include "global.h" #include "naming_screen.h" -#include "asm.h" #include "data2.h" #include "main.h" #include "menu.h" @@ -14,11 +18,6 @@ #include "text.h" #include "trig.h" -extern u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8, u8); -extern u8 CreateMonIcon(); -extern void sub_809D51C(void); -extern void MultiplyInvertedPaletteRGBComponents(u16, u8, u8, u8); - extern u16 gKeyRepeatStartDelay; extern u8 unk_2000000[]; @@ -51,7 +50,6 @@ extern const struct SpriteTemplate gSpriteTemplate_83CE688; extern const struct SpriteSheet gUnknown_083CE6A0[]; extern const struct SpritePalette gUnknown_083CE708[]; extern const u8 gNamingScreenMenu_Gfx[]; -extern u16 gMenuMessageBoxContentTileOffset; extern const u16 gNamingScreenPalettes[]; extern const u16 gUnknown_083CE748[]; extern const u16 gUnknown_083CEBF8[]; -- cgit v1.2.3 From f26daa3d6954d2db3a7c44b79d319a7a084462c2 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Fri, 26 May 2017 15:01:42 +0200 Subject: Sort includes --- src/naming_screen.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 65e55e284..88059e669 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -1,14 +1,13 @@ -#include "util.h" -#include "field_player_avatar.h" -#include "field_map_obj.h" -#include "pokemon_icon.h" -#include "field_effect.h" #include "global.h" #include "naming_screen.h" #include "data2.h" +#include "field_effect.h" +#include "field_map_obj.h" +#include "field_player_avatar.h" #include "main.h" #include "menu.h" #include "palette.h" +#include "pokemon_icon.h" #include "songs.h" #include "sound.h" #include "sprite.h" @@ -17,6 +16,7 @@ #include "task.h" #include "text.h" #include "trig.h" +#include "util.h" extern u16 gKeyRepeatStartDelay; -- cgit v1.2.3 From fc27155b0e86a37cba5ba597eff4ac350ed4ed19 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sat, 24 Jun 2017 20:00:37 +0200 Subject: wip src --- src/naming_screen.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 88059e669..34c7bebb3 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -1929,6 +1929,7 @@ static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = static const u8 sKeyboardCharacters[][4][20] = { +#if ENGLISH { _(" A B C D E F . "), _(" G H I J K L , "), @@ -1941,6 +1942,20 @@ static const u8 sKeyboardCharacters[][4][20] = _(" m n o p q r s "), _(" t u v w x y z "), }, +#elif GERMAN + { + _(" ABCD EFGH . "), + _(" IJKL MNOP , "), + _(" QRST UVWX "), + _(" YZ ÄÖÜ "), + }, + { + _(" abcd efgh . "), + _(" ijkl mnop , "), + _(" qrst uvwx "), + _(" yz äöü "), + }, +#endif { _(" 0 1 2 3 4 "), _(" 5 6 7 8 9 "), -- cgit v1.2.3 From f92d723e794a41766e3ef9f9eb3d046f1ec1ec79 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sat, 24 Jun 2017 21:26:07 +0200 Subject: wip src --- src/naming_screen.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 34c7bebb3..5ede3b04b 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -18,6 +18,12 @@ #include "trig.h" #include "util.h" +#ifdef ENGLISH +#define COLUMN_COUNT 9 +#elif GERMAN +#define COLUMN_COUNT 10 +#endif + extern u16 gKeyRepeatStartDelay; extern u8 unk_2000000[]; @@ -1003,11 +1009,16 @@ static void CursorInit(void) SetCursorPos(0, 0); } -static const u8 sKeyboardSymbolPositions[][9] = -{ +static const u8 sKeyboardSymbolPositions[][COLUMN_COUNT] = { +#if ENGLISH {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Upper page {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Lower page {1, 4, 7, 10, 13, 16, 16, 16, 19}, //Others page +#elif GERMAN + {2, 3, 4, 5, 9, 10, 11, 12, 16, 19}, //Upper page + {2, 3, 4, 5, 9, 10, 11, 12, 16, 19}, //Lower page + {1, 4, 7, 10, 13, 16, 16, 16, 16, 19}, //Others page +#endif }; static u8 CursorColToKeyboardCol(s16 x) @@ -1070,7 +1081,7 @@ static u8 GetKeyRoleAtCursorPos(void) s16 cursorY; GetCursorPos(&cursorX, &cursorY); - if (cursorX < 8) + if (cursorX < COLUMN_COUNT - 1) return KEY_ROLE_CHAR; else return keyRoles[cursorY]; @@ -1081,7 +1092,7 @@ void sub_80B6998(struct Sprite *sprite) if (sprite->animEnded) StartSpriteAnim(sprite, 0); sprite->invisible = (sprite->data4 & 0xFF); - if (sprite->data0 == 8) + if (sprite->data0 == COLUMN_COUNT - 1) sprite->invisible = TRUE; if (sprite->invisible || (sprite->data4 & 0xFF00) == 0 || sprite->data0 != sprite->data2 || sprite->data1 != sprite->data3) -- cgit v1.2.3 From a27f8d812db532c28699c2ce105f52c2ad8de918 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sat, 24 Jun 2017 21:28:47 +0200 Subject: wip src --- src/naming_screen.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 5ede3b04b..2c6a3e3af 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -751,8 +751,8 @@ static void HandleDpadMovement(struct Task *task) //Wrap cursor position in the X direction if (cursorX < 0) - cursorX = 8; - if (cursorX > 8) + cursorX = COLUMN_COUNT - 1; + if (cursorX > COLUMN_COUNT - 1) cursorX = 0; //Handle cursor movement in X direction @@ -762,18 +762,18 @@ static void HandleDpadMovement(struct Task *task) if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) { if (sDpadDeltaX[dpadDir] > 0) - cursorX = 8; + cursorX = COLUMN_COUNT - 1; else cursorX = 5; } - if (cursorX == 8) + if (cursorX == COLUMN_COUNT - 1) { //We are now on the last column task->tKbFunctionKey = cursorY; cursorY = s4RowTo3RowTableY[cursorY]; } - else if (prevCursorX == 8) + else if (prevCursorX == COLUMN_COUNT - 1) { if (cursorY == 1) cursorY = task->tKbFunctionKey; @@ -782,7 +782,7 @@ static void HandleDpadMovement(struct Task *task) } } - if (cursorX == 8) + if (cursorX == COLUMN_COUNT - 1) { //There are only 3 keys on the last column, unlike the others, //so wrap Y accordingly @@ -1048,7 +1048,7 @@ static void GetCursorPos(s16 *x, s16 *y) static void MoveCursorToOKButton(void) { - SetCursorPos(8, 2); + SetCursorPos(COLUMN_COUNT - 1, 2); } static void sub_80B6888(u8 a) -- cgit v1.2.3 From ce569feb587e8d3cc0dca403de2d8614e8abb9ca Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sat, 24 Jun 2017 22:22:33 +0200 Subject: finish src --- src/naming_screen.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/naming_screen.c') diff --git a/src/naming_screen.c b/src/naming_screen.c index 2c6a3e3af..6c107f022 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -473,8 +473,13 @@ static bool8 MainState_WaitPageSwap(struct Task *task) sub_80B77F8(); SetInputState(INPUT_STATE_ENABLED); GetCursorPos(&cursorX, &cursorY); +#if ENGLISH if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) cursorX = 5; +#elif GERMAN + if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 7 || cursorX == 8)) + cursorX = 6; +#endif SetCursorPos(cursorX, cursorY); sub_80B6888(0); } @@ -759,7 +764,11 @@ static void HandleDpadMovement(struct Task *task) if (sDpadDeltaX[dpadDir] != 0) { //The "others" page only has 5 columns +#if ENGLISH if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) +#elif GERMAN + if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7 || cursorX == 8)) +#endif { if (sDpadDeltaX[dpadDir] > 0) cursorX = COLUMN_COUNT - 1; -- cgit v1.2.3