From 05a1d0aec80fffc55b861e401b4ef498c3ab0c7d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 28 Feb 2025 21:56:14 +0100 Subject: [PATCH] Get rid of the fakematch in the Windows struct --- asm/code_805D8C8.s | 534 ------------------------------------- include/structs/str_text.h | 7 +- src/code_805D8C8_1.c | 301 +++++++++++++++++---- src/world_map.c | 13 +- 4 files changed, 257 insertions(+), 598 deletions(-) diff --git a/asm/code_805D8C8.s b/asm/code_805D8C8.s index 706291640..3f204a5c9 100644 --- a/asm/code_805D8C8.s +++ b/asm/code_805D8C8.s @@ -5,540 +5,6 @@ .text - - - - thumb_func_start sub_806285C -sub_806285C: - push {r4-r6,lr} - mov r6, r10 - mov r5, r9 - mov r4, r8 - push {r4-r6} - sub sp, 0xD4 - mov r10, r0 - add r0, sp, 0x10 - mov r8, r0 - add r5, sp, 0x70 - adds r0, r5, 0 - movs r1, 0 - movs r2, 0x60 - bl memset - movs r0, 0x6 - str r0, [sp, 0x74] - add r1, sp, 0x78 - movs r6, 0 - movs r0, 0 - mov r9, r0 - movs r0, 0x2 - strh r0, [r1] - strh r0, [r1, 0x2] - add r1, sp, 0x7C - movs r0, 0x1A - strh r0, [r1] - mov r0, sp - adds r0, 0x7E - movs r1, 0xC - strh r1, [r0] - add r0, sp, 0x80 - strh r1, [r0] - add r0, sp, 0x84 - add r4, sp, 0xD0 - str r4, [r0] - add r0, sp, 0x88 - movs r1, 0x3 - str r1, [r0, 0x4] - add r0, sp, 0xA0 - str r1, [r0, 0x4] - add r0, sp, 0xB8 - str r1, [r0, 0x4] - mov r0, r8 - adds r1, r5, 0 - movs r2, 0x60 - bl memcpy - add r0, sp, 0x4 - bl sub_801317C - movs r0, 0x1 - strb r0, [r4] - strb r6, [r4, 0x1] - movs r0, 0x10 - strb r0, [r4, 0x2] - strb r6, [r4, 0x3] - mov r0, r8 - movs r1, 0x1 - bl sub_803ECB4 - movs r0, 0 - bl sub_80073B8 - mov r0, r10 - bl sub_808E4FC - adds r1, r0, 0 - ldr r0, _0806291C - bl strcpy - ldr r0, _08062920 - ldr r2, [r0] - mov r0, r9 - str r0, [sp] - movs r0, 0x10 - movs r1, 0 - movs r3, 0 - bl PrintFormattedStringOnWindow - mov r0, r10 - bl sub_808E51C - adds r2, r0, 0 - mov r0, r9 - str r0, [sp] - movs r0, 0x8 - movs r1, 0x10 - movs r3, 0 - bl PrintFormattedStringOnWindow - movs r0, 0 - bl sub_80073E0 - add r4, sp, 0x4 - b _08062938 - .align 2, 0 -_0806291C: .4byte gFormatBuffer_Items -_08062920: .4byte gUnknown_80FE964 -_08062924: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08062932 - ldrb r0, [r4, 0x2] - cmp r0, 0 - beq _08062938 -_08062932: - bl sub_8083D30 - b _0806295C -_08062938: - add r0, sp, 0x4 - movs r1, 0 - bl nullsub_34 - movs r0, 0x16 - bl sub_803E46C - ldr r0, _08062974 - ldrh r1, [r0, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08062958 - ldrb r0, [r4, 0x1] - cmp r0, 0 - beq _08062924 -_08062958: - bl sub_8083D08 -_0806295C: - movs r0, 0x4 - movs r1, 0x3E - bl sub_803E708 - add sp, 0xD4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08062974: .4byte gRealInputs - thumb_func_end sub_806285C - - thumb_func_start DrawFieldGiveItemMenu -DrawFieldGiveItemMenu: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x80 - mov r8, r0 - adds r6, r1, 0 - add r4, sp, 0x1C - ldr r1, _080629AC - adds r0, r4, 0 - movs r2, 0x60 - bl memcpy - movs r0, 0 - str r0, [sp, 0x7C] - mov r1, r8 - cmp r1, 0 - beq _080629A2 - subs r0, 0x1 - str r0, [r1] -_080629A2: - cmp r6, 0x1 - bne _080629BA - add r1, sp, 0x4C - ldr r0, _080629B0 - b _080629C2 - .align 2, 0 -_080629AC: .4byte gUnknown_8106C30 -_080629B0: .4byte gUnknown_8106C00 -_080629B4: - bl sub_8083D08 - b _08062AF4 -_080629BA: - cmp r6, 0x2 - bne _080629CA - add r1, sp, 0x4C - ldr r0, _08062A38 -_080629C2: - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} -_080629CA: - add r0, sp, 0x4 - adds r1, r4, 0 - movs r2, 0 - bl DrawFieldTeamMenu - movs r0, 0x1 - bl sub_80073B8 - ldr r0, _08062A3C - ldr r2, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0x4 - movs r1, 0x3 - movs r3, 0x1 - bl PrintStringOnWindow - movs r0, 0x1 - bl sub_80073E0 - ldr r0, _08062A40 - mov r9, r0 - add r7, sp, 0x8 - ldr r1, _08062A44 - mov r10, r1 -_080629FC: - mov r2, r10 - movs r3, 0x18 - ldrsh r0, [r2, r3] - lsls r0, 2 - adds r0, r7, r0 - ldr r5, [r0] - cmp r5, 0 - blt _08062A70 - ldr r0, _08062A48 - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _08062A4C - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _08062A5A - cmp r9, r5 - beq _08062A5A - cmp r6, 0x1 - bne _08062A50 - adds r0, r4, 0 - bl sub_8062B74 - b _08062A5A - .align 2, 0 -_08062A38: .4byte gUnknown_8106C18 -_08062A3C: .4byte gWhichTextPtr2 -_08062A40: .4byte 0xfffffc27 -_08062A44: .4byte gUnknown_202EE10 -_08062A48: .4byte gDungeon -_08062A4C: .4byte 0x0001357c -_08062A50: - cmp r6, 0x2 - bne _08062A5A - adds r0, r4, 0 - bl sub_8062CA8 -_08062A5A: - mov r9, r5 - adds r0, r4, 0 - movs r1, 0 - bl sub_806A2BC - adds r0, r4, 0x4 - movs r1, 0 - movs r2, 0x1 - movs r3, 0x1 - bl sub_804A728 -_08062A70: - ldr r5, _08062B40 - adds r0, r5, 0 - bl AddMenuCursorSprite - movs r0, 0x1B - bl sub_803E46C - ldr r4, _08062B44 - ldrh r1, [r4, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08062A98 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_80136E0 -_08062A98: - ldrh r1, [r4, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08062AB0 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r5, 0 - movs r1, 0x1 - bl sub_8013744 -_08062AB0: - ldrh r1, [r4, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08062AC4 - adds r0, r5, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08062AD8 -_08062AC4: - movs r3, 0x18 - ldrsh r0, [r5, r3] - add r1, sp, 0x18 - adds r1, r0 - ldrb r0, [r1] - cmp r0, 0 - beq _08062AD4 - b _080629B4 -_08062AD4: - bl sub_8083D30 -_08062AD8: - ldr r0, _08062B44 - ldrh r1, [r0, 0x2] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08062AEC - ldr r5, _08062B48 - ldrb r0, [r5] - cmp r0, 0 - beq _080629FC -_08062AEC: - bl sub_8083D30 - movs r0, 0x1 - str r0, [sp, 0x7C] -_08062AF4: - ldr r4, _08062B40 - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x1B - bl sub_803E46C - bl sub_804AA60 - bl GetLeader - movs r1, 0 - bl sub_806A2BC - movs r0, 0 - movs r1, 0 - bl sub_803EAF0 - movs r0, 0x4 - movs r1, 0x3E - bl sub_803E708 - ldr r1, [sp, 0x7C] - cmp r1, 0 - bne _08062B3C - movs r2, 0x18 - ldrsh r0, [r4, r2] - lsls r0, 2 - adds r0, r7, r0 - ldr r5, [r0] - mov r3, r8 - cmp r3, 0 - beq _08062B38 - str r5, [r3] -_08062B38: - cmp r5, 0 - bge _08062B4C -_08062B3C: - movs r0, 0 - b _08062B5A - .align 2, 0 -_08062B40: .4byte gUnknown_202EE10 -_08062B44: .4byte gRealInputs -_08062B48: .4byte gUnknown_202EE3A -_08062B4C: - ldr r0, _08062B6C - ldr r0, [r0] - lsls r1, r5, 2 - ldr r5, _08062B70 - adds r0, r5 - adds r0, r1 - ldr r0, [r0] -_08062B5A: - add sp, 0x80 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08062B6C: .4byte gDungeon -_08062B70: .4byte 0x0001357c - thumb_func_end DrawFieldGiveItemMenu - - thumb_func_start sub_8062B74 -sub_8062B74: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x10 - mov r10, r0 - ldr r0, [r0, 0x70] - mov r9, r0 - movs r0, 0x2 - bl CallPrepareTextbox_8008C54 - movs r0, 0x2 - bl sub_80073B8 - ldr r0, _08062BD0 - mov r1, r10 - movs r2, 0 - bl SubstitutePlaceholderStringTags - ldr r0, _08062BD4 - ldr r2, [r0] - movs r0, 0 - str r0, [sp] - movs r0, 0xC - movs r1, 0 - movs r3, 0x2 - bl PrintFormattedStringOnWindow - movs r1, 0x10 - mov r8, r1 - mov r0, r9 - adds r0, 0xA4 - ldrb r0, [r0] - cmp r0, 0x1 - beq _08062BDE - mov r0, r9 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - beq _08062BCA - cmp r0, 0x47 - bne _08062BD8 -_08062BCA: - movs r0, 0x1 - b _08062BDA - .align 2, 0 -_08062BD0: .4byte gFormatBuffer_Monsters -_08062BD4: .4byte gUnknown_80FE978 -_08062BD8: - movs r0, 0 -_08062BDA: - cmp r0, 0 - beq _08062BF4 -_08062BDE: - ldr r2, _08062BF0 - movs r0, 0 - str r0, [sp] - movs r0, 0xC - mov r1, r8 - movs r3, 0x2 - bl PrintFormattedStringOnWindow - b _08062C8A - .align 2, 0 -_08062BF0: .4byte gUnknown_8106C90 -_08062BF4: - movs r7, 0 - movs r4, 0x8C - lsls r4, 1 - add r4, r9 - adds r5, r4, 0 -_08062BFE: - add r0, sp, 0x4 - movs r1, 0 - movs r2, 0xC - bl memset - movs r0, 0x6A - str r0, [sp, 0x8] - ldrb r1, [r4] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08062C80 - mov r1, r9 - ldrb r0, [r1, 0x7] - cmp r0, 0 - beq _08062C22 - movs r0, 0x2 - b _08062C24 -_08062C22: - movs r0, 0x4 -_08062C24: - str r0, [sp, 0x4] - mov r0, r10 - adds r1, r5, 0 - movs r2, 0x1 - bl CanMonsterUseMove - add r1, sp, 0x4 - movs r2, 0 - lsls r0, 24 - cmp r0, 0 - bne _08062C3C - movs r2, 0x1 -_08062C3C: - strb r2, [r1, 0x8] - ldr r0, _08062CA0 - adds r1, r5, 0 - add r2, sp, 0x4 - bl BufferMoveName - ldrb r1, [r4] - movs r0, 0x2 - ands r0, r1 - movs r6, 0xD - cmp r0, 0 - bne _08062C6C - movs r6, 0x8 - cmp r7, 0 - beq _08062C6C - mov r2, r8 - subs r2, 0x2 - movs r0, 0x7 - str r0, [sp] - movs r0, 0x2 - movs r1, 0xC - movs r3, 0x78 - bl sub_80078A4 -_08062C6C: - movs r0, 0 - str r0, [sp] - adds r0, r6, 0 - mov r1, r8 - ldr r2, _08062CA4 - movs r3, 0x2 - bl PrintFormattedStringOnWindow - movs r0, 0xC - add r8, r0 -_08062C80: - adds r4, 0x8 - adds r5, 0x8 - adds r7, 0x1 - cmp r7, 0x3 - ble _08062BFE -_08062C8A: - movs r0, 0x2 - bl sub_80073E0 - add sp, 0x10 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08062CA0: .4byte gFormatBuffer_Items -_08062CA4: .4byte gUnknown_8106C98 - thumb_func_end sub_8062B74 - thumb_func_start sub_8062CA8 sub_8062CA8: push {r4-r7,lr} diff --git a/include/structs/str_text.h b/include/structs/str_text.h index 873ee8e15..159a82efb 100644 --- a/include/structs/str_text.h +++ b/include/structs/str_text.h @@ -51,7 +51,8 @@ typedef struct Window const WindowHeader *unk14; } Window; -#define WINDOW_DUMMY (Window) {.type = WINDOW_TYPE_NORMAL, .width = 0} +// All fields are zeroed out except for type which is set to WINDOW_TYPE_NORMAL. +#define WINDOW_DUMMY (Window) {.unk0 = 0, .type = WINDOW_TYPE_NORMAL, .width = 0, .pos = {0, 0}, .height = 0, .unk10 = 0, .unk12 = 0, .unk14 = NULL} #define WINDOW_TYPE_0 0 #define WINDOW_TYPE_WITHOUT_BORDER 1 @@ -64,10 +65,6 @@ typedef struct Window typedef struct Windows { Window id[MAX_WINDOWS]; - // Something ugly, so that sub_805FD74 could match weird compiler memcpy/stack initialization - #ifndef NONMATCHING - u8 fakeMatch[0]; - #endif // NONMATCHING } Windows; #endif // GUARD_STR_TEXT_H diff --git a/src/code_805D8C8_1.c b/src/code_805D8C8_1.c index e3405884b..f577d2485 100644 --- a/src/code_805D8C8_1.c +++ b/src/code_805D8C8_1.c @@ -1678,29 +1678,26 @@ extern const u8 gUnknown_8106B50[]; extern void sub_803ECB4(Windows *a0, u8 a1); static void CreateFieldItemMenu(s32 a0, Entity *a1, bool8 a2, bool8 a3, Windows *a4, WindowHeader *a5); -// Inline needed to (fake?)match. -static inline void sub_805FC30_SetUpTxtStruct(Windows *src) -{ - memset(src, 0, sizeof(*src)); - src->id[0].type = WINDOW_TYPE_NORMAL; - src->id[1].type = WINDOW_TYPE_NORMAL; - src->id[1].pos.x = 0x16; - src->id[1].pos.y = 4; - src->id[1].width = 6; - src->id[1].height = 4; - src->id[1].unk10 = 4; - src->id[2].type = WINDOW_TYPE_NORMAL; - src->id[3].type = WINDOW_TYPE_NORMAL; -} - void sub_805FC30(Windows *a0, s32 a1) { s32 i; - Windows sp; + Windows windows = { + .id = { + [0] = WINDOW_DUMMY, + [1] = { + .type = WINDOW_TYPE_NORMAL, + .pos = {22, 4}, + .width = 6, + .height = 4, + .unk10 = 4, + }, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; - sub_805FC30_SetUpTxtStruct(&sp); - sp.id[0] = a0->id[0]; - sp.id[0].unk0 = 0x80; + windows.id[0] = a0->id[0]; + windows.id[0].unk0 = 0x80; gUnknown_202EE10.menuIndex = 0; gUnknown_202EE10.unk1C = gUnknown_202EE6C; @@ -1716,11 +1713,11 @@ void sub_805FC30(Windows *a0, s32 a1) sub_801317C(&gUnknown_202EE10.unk28); - sp.id[1].pos.x = a1; - sp.id[1].width = 28 - a1; - sp.id[1].height = sp.id[1].unk10 = sub_80095E4(gUnknown_202EE10.unk1C, 0); - sub_803ECB4(&sp, 0); - sub_80137B0(&gUnknown_202EE10, sp.id[1].height * 8); + windows.id[1].pos.x = a1; + windows.id[1].width = 28 - a1; + windows.id[1].height = windows.id[1].unk10 = sub_80095E4(gUnknown_202EE10.unk1C, 0); + sub_803ECB4(&windows, 0); + sub_80137B0(&gUnknown_202EE10, windows.id[1].height * 8); sub_80073B8(1); for (i = 0; i < gUnknown_202EE6C; i++) { @@ -1762,7 +1759,7 @@ bool8 sub_8060860(s32 a0); void sub_8060900(Entity *a0); s32 sub_8060800(WindowHeader *a0, s32 a1); void sub_8060CE8(ActionContainer *a0); -extern Entity *DrawFieldGiveItemMenu(u8 *a0, s32 a1); +Entity *DrawFieldGiveItemMenu(s32 *teamId, s32 a1); bool8 sub_805FD74(Entity * a0, struct UnkMenuBitsStruct *a1) { @@ -2010,9 +2007,9 @@ bool8 sub_805FD74(Entity * a0, struct UnkMenuBitsStruct *a1) break; } else if (a0Info->action.action == 0x36) { - u32 var_38; - if (DrawFieldGiveItemMenu((void*)&var_38, 2) != NULL) { - a0Info->action.actionParameters[1].actionUseIndex = var_38; + s32 teamId; + if (DrawFieldGiveItemMenu(&teamId, 2) != NULL) { + a0Info->action.actionParameters[1].actionUseIndex = teamId; sub_803EAF0(0, 0); r9 = 0; break; @@ -2872,32 +2869,30 @@ void sub_8062D68(void); void sub_8062230(void); void sub_8062748(u8 a0); -static inline void SetTxtStruct(Windows *sp) -{ - memset(sp, 0, sizeof(*sp)); - sp->id[0].type = WINDOW_TYPE_WITH_HEADER; - sp->id[0].pos.x = 2; - sp->id[0].pos.y = 2; - sp->id[0].width = 0x12; - sp->id[0].height = 0xE; - sp->id[0].unk10 = 0x12; - sp->id[0].unk12 = 2; - sp->id[0].unk14 = &gUnknown_202F270; - sp->id[1].type = WINDOW_TYPE_NORMAL; - sp->id[2].type = WINDOW_TYPE_NORMAL; - sp->id[3].type = WINDOW_TYPE_NORMAL; -} - void ShowTacticsMenu(ActionContainer *a0) { - Windows sp; + Windows windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 18, + .height = 14, + .unk10 = 18, + .unk12 = 2, + .unk14 = &gUnknown_202F270, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; EntityInfo *monInfo; u8 tacticIds[NUM_TACTICS]; s32 scrollFirstId; s32 menuIndex; Entity *teamMon; - SetTxtStruct(&sp); teamMon = gDungeon->teamPokemon[a0->actionParameters[0].actionUseIndex]; monInfo = GetEntInfo(teamMon); menuIndex = 0; @@ -2911,7 +2906,7 @@ void ShowTacticsMenu(ActionContainer *a0) gUnknown_202F270.f1 = 0; gUnknown_202F270.f2 = 10; gUnknown_202F270.f3 = 0; - sub_803ECB4(&sp, 1); + sub_803ECB4(&windows, 1); PrintMonTactics(scrollFirstId, tacticIds, monInfo, 0); for (i = 0; i < 8; i++) { if (tacticIds[i] == TACTIC_UNUSED) @@ -2992,7 +2987,7 @@ void ShowTacticsMenu(ActionContainer *a0) if (CheckVariousStatuses2(teamMon, TRUE)) { sub_8044FF0(0x2F); } - sub_805FC30(&sp, 0x16); + sub_805FC30(&windows, 0x16); while (1) { changed = FALSE; AddMenuCursorSprite(&gUnknown_202EE10); @@ -3101,7 +3096,7 @@ EWRAM_INIT u8 gUnknown_203B43C[4] = {2, 0, 0xD, 0}; // TODO: Move to a better fi extern void sub_8069844(struct unkStruct_808FF20 *param_1, Entity *target); extern u32 sub_8014140(s32 a0, const void *a1); -extern void sub_806285C(s32 a0); +void sub_806285C(s32 a0); void sub_806262C(u8 iqSkillId); extern const u8 gUnknown_8106B8C[]; @@ -3111,12 +3106,11 @@ void sub_8061A38(ActionContainer *a0, bool8 a1) s32 spArr[6]; struct unkStruct_808FF20 unkMonStruct; struct UnkInfoTabStruct unkInfoTabStruct; - const s32 winX = 2; Windows windows = { .id = { [0] = { .type = WINDOW_TYPE_WITH_HEADER, - .pos = {winX, 2}, + .pos = {2, 2}, .width = 18, .height = 14, .unk10 = 18, @@ -3128,7 +3122,7 @@ void sub_8061A38(ActionContainer *a0, bool8 a1) [3] = WINDOW_DUMMY, } }; - register s32 r8; + s32 r8; Entity *entity; s32 var_3C; s32 var_38; @@ -3664,9 +3658,20 @@ void sub_80625A4(s32 count, struct subStruct_203B240 **strings) } #include "code_8097DD0.h" +#include "move_util.h" +#include "move_util.h" extern const u8 *const gUnknown_80FE95C; extern const u8 *const gUnknown_80FE960; +extern const u8 *const gUnknown_80FE964; +extern const u8 *const gUnknown_80FE978; +extern const u8 gUnknown_8106C90[]; +extern const u8 gUnknown_8106C98[]; +extern const u8 *const gWhichTextPtr2; +extern char* sub_808E4FC(s32 a1); +extern char* sub_808E51C(s32 a1); +extern void sub_8062B74(Entity *entity); +extern void sub_8062CA8(Entity *entity); void sub_806262C(u8 iqSkillId) { @@ -3774,5 +3779,197 @@ void sub_8062748(u8 tacticId) sub_803E708(4, 0x3E); } +void sub_806285C(s32 a0) +{ + const u8 *str; + MenuInputStructSub menuSub; + WindowHeader header; + Windows windows = { + .id = { + [0] = { + .type = WINDOW_TYPE_WITH_HEADER, + .pos = {2, 2}, + .width = 26, + .height = 12, + .unk10 = 12, + .unk12 = 0, + .unk14 = &header, + }, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, + } + }; + + sub_801317C(&menuSub); + header.f0 = 1; + header.f1 = 0; + header.f2 = 16; + header.f3 = 0; + sub_803ECB4(&windows, TRUE); + sub_80073B8(0); + str = sub_808E4FC(a0); + strcpy(gFormatBuffer_Items[0], str); + PrintFormattedStringOnWindow(16, 0, gUnknown_80FE964, 0, '\0'); + PrintFormattedStringOnWindow(8, 16, sub_808E51C(a0), 0, '\0'); + sub_80073E0(0); + + while (1) { + nullsub_34(&menuSub, 0); + sub_803E46C(22); + if ((gRealInputs.pressed & A_BUTTON) || menuSub.a_button) { + sub_8083D08(); + break; + } + if ((gRealInputs.pressed & B_BUTTON) || menuSub.b_button) { + sub_8083D30(); + break; + } + } + + sub_803E708(4, 0x3E); +} + +extern const Windows gUnknown_8106C30; +extern const Window gUnknown_8106C00; +extern const Window gUnknown_8106C18; + +Entity *DrawFieldGiveItemMenu(s32 *teamId, s32 a1) +{ + struct UnkFieldTeamMenuStruct unkStruct; + Windows windows = gUnknown_8106C30; + bool8 bPress = FALSE; + s32 prevId, currId; + + if (teamId != NULL) { + *teamId = -1; + } + + if (a1 == 1) { + windows.id[2] = gUnknown_8106C00; + } + else if (a1 == 2) { + windows.id[2] = gUnknown_8106C18; + } + + DrawFieldTeamMenu(&unkStruct, &windows, FALSE); + sub_80073B8(1); + PrintStringOnWindow(4, 3, gWhichTextPtr2, 1, '\0'); + sub_80073E0(1); + prevId = -985; // Magic number or does it actually mean anything? + + while (1) { + currId = unkStruct.unk4[gUnknown_202EE10.menuIndex]; + + if (currId >= 0) { + Entity *entity = gDungeon->teamPokemon[currId]; + + if (EntityIsValid(entity) && prevId != currId) { + if (a1 == 1) { + sub_8062B74(entity); + } + else if (a1 == 2) { + sub_8062CA8(entity); + } + } + prevId = currId; + sub_806A2BC(entity, 0); + sub_804A728(&entity->pos, 0, 1, 1); + } + + AddMenuCursorSprite(&gUnknown_202EE10); + sub_803E46C(0x1B); + if (gRealInputs.repeated & DPAD_DOWN) { + sub_8083CE0(1); + sub_80136E0(&gUnknown_202EE10, 1); + } + if (gRealInputs.repeated & DPAD_UP) { + sub_8083CE0(1); + sub_8013744(&gUnknown_202EE10, 1); + } + + if ((gRealInputs.pressed & A_BUTTON) || gUnknown_202EE10.unk28.a_button) { + if (unkStruct.unk14[gUnknown_202EE10.menuIndex] != 0) { + sub_8083D08(); + break; + } + sub_8083D30(); + } + if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { + sub_8083D30(); + bPress = TRUE; + break; + } + } + + AddMenuCursorSprite(&gUnknown_202EE10); + sub_803E46C(0x1B); + sub_804AA60(); + sub_806A2BC(GetLeader(), 0); + sub_803EAF0(0, 0); + sub_803E708(4, 0x3E); + if (bPress) { + return NULL; + } + currId = unkStruct.unk4[gUnknown_202EE10.menuIndex]; + if (teamId != NULL) { + *teamId = currId; + } + if (currId >= 0) { + return gDungeon->teamPokemon[currId]; + } + + return NULL; +} + +void sub_8062B74(Entity *entity) +{ + s32 x, y; + EntityInfo *entInfo = GetEntInfo(entity); + + CallPrepareTextbox_8008C54(2); + sub_80073B8(2); + SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], entity, 0); + PrintFormattedStringOnWindow(12, 0, gUnknown_80FE978, 2, '\0'); + y = 16; + + if (entInfo->monsterBehavior == 1 || IsExperienceLocked(entInfo->joinedAt.id)) { + PrintFormattedStringOnWindow(12, y, gUnknown_8106C90, 2, '\0'); + } + else { + s32 i; + + for (i = 0; i < MAX_MON_MOVES; i++) { + unkStruct_80928C0 movStruct = {0, 106, 0, 0}; + Move *move = &entInfo->moves.moves[i]; + + if (MoveFlagExists(move)) { + if (entInfo->isTeamLeader) { + movStruct.unk0 = 2; + } + else { + movStruct.unk0 = 4; + } + + movStruct.unk8 = (CanMonsterUseMove(entity, move, TRUE) == FALSE); + BufferMoveName(gFormatBuffer_Items[0], move, &movStruct); + + if (MoveFlagLinkChain(move)) { + x = 13; + } + else { + x = 8; + if (i != 0) { + sub_80078A4(2, 12, y - 2, 120, 7); + } + } + PrintFormattedStringOnWindow(x, y, gUnknown_8106C98, 2, '\0'); + y += 12; + } + } + } + + sub_80073E0(2); +} // diff --git a/src/world_map.c b/src/world_map.c index e6d57a29c..844299fb0 100644 --- a/src/world_map.c +++ b/src/world_map.c @@ -54,8 +54,8 @@ static EWRAM_INIT Windows sWorldMapWindows = { .height = 3, .unk10 = 3, }, - [2] = { .type = WINDOW_TYPE_NORMAL,}, - [3] = { .type = WINDOW_TYPE_NORMAL,}, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, } }; @@ -483,19 +483,18 @@ static void AnimateSprites(bool8 a0) static void PrintDungeonName(DungeonLocation *dungLocation) { - const s32 x = 12; Windows windows = { .id = { [0] = { .type = WINDOW_TYPE_NORMAL, - .pos = {x, 2}, + .pos = {12, 2}, .width = 16, .height = 2, .unk10 = 2, }, - [1] = {.type = WINDOW_TYPE_NORMAL}, - [2] = {.type = WINDOW_TYPE_NORMAL}, - [3] = {.type = WINDOW_TYPE_NORMAL}, + [1] = WINDOW_DUMMY, + [2] = WINDOW_DUMMY, + [3] = WINDOW_DUMMY, } };