diff options
author | Cameron Hall <camthesaxman@users.noreply.github.com> | 2017-01-24 22:31:44 -0600 |
---|---|---|
committer | YamaArashi <YamaArashi@users.noreply.github.com> | 2017-01-24 20:31:44 -0800 |
commit | 9442bdcbf3abf3e44d2829ec72bfe23649c7d8ac (patch) | |
tree | f29295a7bb462df130b9269b66857d778fa56aac /src | |
parent | 3f2ea6a1f076575d0c61ca0b71917704e38f6dd7 (diff) |
decompile more of naming_screen (#216)
* decompile more code
* incbin graphics data
* decompile more code
Diffstat (limited to 'src')
-rw-r--r-- | src/field_player_avatar.c | 4 | ||||
-rw-r--r-- | src/menu_cursor.c | 32 | ||||
-rw-r--r-- | src/naming_screen.c | 1115 | ||||
-rw-r--r-- | src/rom4.c | 2 | ||||
-rw-r--r-- | src/sprite.c | 10 |
5 files changed, 1066 insertions, 97 deletions
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 08d9c13d6..bab172152 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -1033,9 +1033,9 @@ void sub_80597F4(void) } } -u8 sub_805983C(u8 a, u8 b) +u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) { - return sRivalAvatarGfxIds[a][b]; + return sRivalAvatarGfxIds[state][gender]; } static u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) diff --git a/src/menu_cursor.c b/src/menu_cursor.c index 8f1a0ac37..fa28332df 100644 --- a/src/menu_cursor.c +++ b/src/menu_cursor.c @@ -3,22 +3,22 @@ #include "palette.h" #include "sprite.h" -extern struct SpriteSheet gUnknown_0842F140[]; -extern struct SpriteSheet gUnknown_0842F1C0[]; -extern struct SpritePalette gUnknown_0842F240; -extern struct SpritePalette gUnknown_0842F248; -extern struct SpriteTemplate gSpriteTemplate_842F250[]; -extern struct SpriteTemplate gSpriteTemplate_842F298[]; - -extern struct Subsprite *gUnknown_0842F5BC[]; - -extern struct SubspriteTable gSubspriteTables_842F5C0[]; -extern struct SubspriteTable gSubspriteTables_842F6C0[]; -extern struct SubspriteTable gUnknown_0842F758[]; - -extern struct Subsprite gUnknown_0842F780; -extern struct Subsprite gUnknown_0842F788; -extern struct Subsprite gUnknown_0842F790; +extern const struct SpriteSheet gUnknown_0842F140[]; +extern const struct SpriteSheet gUnknown_0842F1C0[]; +extern const struct SpritePalette gUnknown_0842F240; +extern const struct SpritePalette gUnknown_0842F248; +extern const struct SpriteTemplate gSpriteTemplate_842F250[]; +extern const struct SpriteTemplate gSpriteTemplate_842F298[]; + +extern struct Subsprite *const gUnknown_0842F5BC[]; + +extern const struct SubspriteTable gSubspriteTables_842F5C0[]; +extern const struct SubspriteTable gSubspriteTables_842F6C0[]; +extern const struct SubspriteTable gUnknown_0842F758[]; + +extern const struct Subsprite gUnknown_0842F780; +extern const struct Subsprite gUnknown_0842F788; +extern const struct Subsprite gUnknown_0842F790; extern u16 gUnknown_0203A360[]; 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; } diff --git a/src/rom4.c b/src/rom4.c index 621dd203b..bc9af5c66 100644 --- a/src/rom4.c +++ b/src/rom4.c @@ -2542,7 +2542,7 @@ void CreateLinkPlayerSprite(u8 linkPlayerId) if (linkPlayerMapObj->active) { - u8 val = sub_805983C(0, mapObj->mapobj_bit_1); + u8 val = GetRivalAvatarGraphicsIdByStateIdAndGender(0, mapObj->mapobj_bit_1); mapObj->spriteId = AddPseudoFieldObject(val, SpriteCB_LinkPlayer, 0, 0, 0); sprite = &gSprites[mapObj->spriteId]; sprite->coordOffsetEnabled = TRUE; diff --git a/src/sprite.c b/src/sprite.c index 0f5b0caf1..fd8a5aaac 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -1513,7 +1513,7 @@ void AllocTilesForSpriteSheets(struct SpriteSheet *sheets) AllocTilesForSpriteSheet(&sheets[i]); } -void LoadTilesForSpriteSheet(struct SpriteSheet *sheet) +void LoadTilesForSpriteSheet(const struct SpriteSheet *sheet) { u8 *data = sheet->data; u16 tileStart = GetSpriteTileStartByTag(sheet->tag); @@ -1599,14 +1599,14 @@ static void AllocSpriteTileRange(u16 tag, u16 start, u16 count) SET_SPRITE_TILE_RANGE(freeIndex, start, count); } -void RequestSpriteSheetCopy(struct SpriteSheet *sheet) +void RequestSpriteSheetCopy(const struct SpriteSheet *sheet) { u8 *data = sheet->data; u16 tileStart = GetSpriteTileStartByTag(sheet->tag); RequestSpriteCopy(data, (u8 *)OBJ_VRAM0 + tileStart * TILE_SIZE_4BPP, sheet->size); } -u16 LoadSpriteSheetDeferred(struct SpriteSheet *sheet) +u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet) { s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); @@ -1700,7 +1700,7 @@ void FreeSpritePaletteByTag(u16 tag) sSpritePaletteTags[index] = 0xFFFF; } -void SetSubspriteTables(struct Sprite *sprite, struct SubspriteTable *subspriteTables) +void SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables) { sprite->subspriteTables = subspriteTables; sprite->subspriteTableNum = 0; @@ -1726,7 +1726,7 @@ bool8 AddSpriteToOamBuffer(struct Sprite *sprite, u8 *oamIndex) bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u8 *oamIndex) { - struct SubspriteTable *subspriteTable; + const struct SubspriteTable *subspriteTable; struct OamData *oam; if (*oamIndex >= gOamLimit) |