diff --git a/asm/code_809A560.s b/asm/code_809A560.s index c448c86de..a43917c7c 100644 --- a/asm/code_809A560.s +++ b/asm/code_809A560.s @@ -6,367 +6,6 @@ .text - thumb_func_start sub_809B18C -sub_809B18C: - push {lr} - adds r1, r0, 0 - ldr r2, _0809B1BC - cmp r1, 0 - beq _0809B1A2 - ldr r0, [r2] - movs r3, 0x86 - lsls r3, 3 - adds r0, r3 - ldr r0, [r0] - str r0, [r1] -_0809B1A2: - movs r1, 0 - ldr r0, [r2] - movs r2, 0x84 - lsls r2, 3 - adds r0, r2 - ldr r0, [r0] - cmp r0, 0x3 - bne _0809B1B4 - movs r1, 0x1 -_0809B1B4: - adds r0, r1, 0 - pop {r1} - bx r1 - .align 2, 0 -_0809B1BC: .4byte gUnknown_3001B64 - thumb_func_end sub_809B18C - - thumb_func_start sub_809B1C0 -sub_809B1C0: - push {lr} - adds r3, r2, 0 - movs r2, 0 - bl sub_809B1D4 - lsls r0, 24 - lsrs r0, 24 - pop {r1} - bx r1 - thumb_func_end sub_809B1C0 - - thumb_func_start sub_809B1D4 -sub_809B1D4: - push {r4-r7,lr} - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - adds r7, r3, 0 - cmp r4, 0xB - beq _0809B1E8 - cmp r4, 0xC - beq _0809B1F0 - b _0809B202 -_0809B1E8: - adds r0, r5, 0 - bl sub_8021700 - b _0809B1F8 -_0809B1F0: - bl sub_8001D88 - bl sub_802FCF0 -_0809B1F8: - lsls r0, 24 - cmp r0, 0 - beq _0809B202 - movs r0, 0 - b _0809B24C -_0809B202: - movs r0, 0x4 - movs r1, 0 - bl xxx_script_textboxes_809A680 - ldr r0, _0809B254 - ldr r1, [r0] - ldr r2, _0809B258 - adds r0, r1, r2 - str r4, [r0] - movs r3, 0x83 - lsls r3, 3 - adds r0, r1, r3 - movs r2, 0 - str r2, [r0] - adds r3, 0x4 - adds r0, r1, r3 - str r2, [r0] - movs r0, 0x84 - lsls r0, 3 - adds r2, r1, r0 - movs r0, 0x1 - str r0, [r2] - ldr r2, _0809B25C - adds r0, r1, r2 - str r5, [r0] - adds r3, 0xC - adds r0, r1, r3 - str r6, [r0] - adds r2, 0x8 - adds r0, r1, r2 - str r7, [r0] - adds r3, 0x8 - adds r1, r3 - movs r0, 0x1 - negs r0, r0 - str r0, [r1] - movs r0, 0x1 -_0809B24C: - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0809B254: .4byte gUnknown_3001B64 -_0809B258: .4byte 0x00000414 -_0809B25C: .4byte 0x00000424 - thumb_func_end sub_809B1D4 - - thumb_func_start sub_809B260 -sub_809B260: - push {lr} - adds r1, r0, 0 - ldr r2, _0809B290 - cmp r1, 0 - beq _0809B276 - ldr r0, [r2] - movs r3, 0x86 - lsls r3, 3 - adds r0, r3 - ldr r0, [r0] - str r0, [r1] -_0809B276: - movs r1, 0 - ldr r0, [r2] - movs r2, 0x84 - lsls r2, 3 - adds r0, r2 - ldr r0, [r0] - cmp r0, 0x3 - bne _0809B288 - movs r1, 0x1 -_0809B288: - adds r0, r1, 0 - pop {r1} - bx r1 - .align 2, 0 -_0809B290: .4byte gUnknown_3001B64 - thumb_func_end sub_809B260 - - thumb_func_start ResetTextbox_809B294 -ResetTextbox_809B294: - push {lr} - movs r0, 0x3 - bl SetCharacterMask - ldr r0, _0809B2B4 - ldr r0, [r0] - adds r0, 0xC - movs r2, 0x1 - negs r2, r2 - movs r1, 0 - movs r3, 0 - bl ScriptPrintText_809B2B8 - pop {r0} - bx r0 - .align 2, 0 -_0809B2B4: .4byte gUnknown_3001B64 - thumb_func_end ResetTextbox_809B294 - - thumb_func_start ScriptPrintText_809B2B8 -ScriptPrintText_809B2B8: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x14 - adds r4, r0, 0 - adds r7, r3, 0 - lsls r1, 16 - lsrs r5, r1, 16 - lsls r2, 16 - asrs r6, r2, 16 - strh r5, [r4] - cmp r7, 0 - bne _0809B2F6 - cmp r5, 0 - bne _0809B2DE - str r7, [r4, 0x4] - movs r0, 0 - b _0809B3FC -_0809B2DE: - movs r0, 0x4 - ands r0, r5 - cmp r0, 0 - bne _0809B2E8 - b _0809B3FA -_0809B2E8: - bl sub_8014490 - movs r0, 0 - movs r1, 0x1 - bl xxx_script_textboxes_809A680 - b _0809B3FA -_0809B2F6: - movs r0, 0x1 - str r0, [r4, 0x4] - adds r0, 0xFF - ands r0, r5 - cmp r0, 0 - beq _0809B32A - cmp r6, 0 - bge _0809B318 - ldr r0, _0809B310 - ldr r1, _0809B314 - bl strcpy - b _0809B32A - .align 2, 0 -_0809B310: .4byte gSpeakerNameBuffer -_0809B314: .4byte gFormattedSpeechBubble -_0809B318: - ldr r0, _0809B3D0 - ldr r1, _0809B3D4 - lsls r2, r6, 2 - adds r2, r6 - lsls r2, 4 - ldr r3, _0809B3D8 - adds r2, r3 - bl sprintfStatic -_0809B32A: - ldr r0, _0809B3DC - mov r8, r0 - ldr r0, [r0] - ldr r0, [r0] - cmp r0, 0x3 - bne _0809B344 - adds r4, 0x8 - ldr r1, _0809B3E0 - adds r0, r4, 0 - adds r2, r7, 0 - bl sprintfStatic - adds r7, r4, 0 -_0809B344: - adds r0, r6, 0 - bl sub_809AE3C - ldr r1, _0809B3E4 - mov r9, r1 - movs r1, 0x1 - negs r1, r1 - mov r12, r1 - movs r2, 0 - str r2, [sp] - movs r1, 0x3 - str r1, [sp, 0x4] - str r2, [sp, 0x8] - str r0, [sp, 0xC] - movs r6, 0x80 - lsls r6, 1 - adds r0, r5, 0 - ands r0, r6 - movs r1, 0 - cmp r0, 0 - beq _0809B370 - movs r1, 0xC -_0809B370: - movs r4, 0x80 - lsls r4, 2 - adds r0, r5, 0 - ands r0, r4 - cmp r0, 0 - beq _0809B380 - movs r0, 0x4 - orrs r1, r0 -_0809B380: - mov r0, r8 - ldr r3, [r0] - ldr r2, [r3] - cmp r2, 0x3 - bne _0809B38E - movs r0, 0x10 - orrs r1, r0 -_0809B38E: - cmp r2, 0x2 - bne _0809B396 - movs r0, 0x10 - orrs r1, r0 -_0809B396: - adds r2, r1, 0 - movs r1, 0x20 - adds r0, r5, 0 - ands r0, r1 - cmp r0, 0 - beq _0809B3A4 - orrs r2, r1 -_0809B3A4: - lsrs r1, r5, 6 - movs r0, 0x1 - ands r1, r0 - orrs r1, r2 - movs r0, 0x80 - ands r0, r5 - cmp r0, 0 - beq _0809B3B6 - orrs r1, r6 -_0809B3B6: - movs r0, 0x4 - ands r0, r5 - cmp r0, 0 - beq _0809B3C0 - orrs r1, r4 -_0809B3C0: - ldr r0, [r3, 0x4] - cmp r0, r12 - beq _0809B3E8 - movs r0, 0x2 - orrs r0, r1 - lsls r0, 16 - b _0809B3EA - .align 2, 0 -_0809B3D0: .4byte gSpeakerNameBuffer -_0809B3D4: .4byte gUnknown_8116188 -_0809B3D8: .4byte gFormatBuffer_Names -_0809B3DC: .4byte gUnknown_3001B64 -_0809B3E0: .4byte gUnknown_8116190 -_0809B3E4: .4byte sub_809B428 -_0809B3E8: - lsls r0, r1, 16 -_0809B3EA: - lsrs r0, 16 - str r0, [sp, 0x10] - adds r0, r7, 0 - mov r1, r9 - mov r2, r12 - movs r3, 0 - bl CreateMenuDialogueBoxAndPortrait -_0809B3FA: - movs r0, 0x1 -_0809B3FC: - add sp, 0x14 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end ScriptPrintText_809B2B8 - - thumb_func_start IsTextboxOpen_809B40C -IsTextboxOpen_809B40C: - push {lr} - ldr r0, [r0, 0x4] - cmp r0, 0 - beq _0809B41C - cmp r0, 0x3 - bhi _0809B420 - cmp r0, 0x2 - bcc _0809B420 -_0809B41C: - movs r0, 0 - b _0809B422 -_0809B420: - movs r0, 0x1 -_0809B422: - pop {r1} - bx r1 - thumb_func_end IsTextboxOpen_809B40C - thumb_func_start sub_809B428 sub_809B428: push {r4,r5,lr} diff --git a/include/structs/str_3001B64.h b/include/structs/str_3001B64.h index c20d61010..e9c9aa00c 100644 --- a/include/structs/str_3001B64.h +++ b/include/structs/str_3001B64.h @@ -26,14 +26,20 @@ struct unkStruct_3001B64_sub /* 0x20 */ OpenedFile *faceFile; }; +struct unkStruct_3001B64_unkC +{ + u16 unk0; + u32 unk4; + u8 buffer[0x400]; +}; + struct unkStruct_3001B64 { // size: 0x5A8 u32 unk0; u32 unk4; u32 unk8; - u32 unkC; - u8 fill10[0x414 - 0x10]; + struct unkStruct_3001B64_unkC unkC; u32 unk414; u32 unk418; const MenuItem *unk41C; diff --git a/src/code_809A560.c b/src/code_809A560.c index b267a83f1..c090903dc 100644 --- a/src/code_809A560.c +++ b/src/code_809A560.c @@ -7,6 +7,8 @@ #include "string_format.h" #include "structs/str_3001B64.h" #include "constants/dungeon.h" +#include "wigglytuff_shop1.h" +#include "event_flag.h" IWRAM_INIT struct unkStruct_3001B64 *gUnknown_3001B64 = {NULL}; @@ -16,8 +18,9 @@ extern u8 gInvalidityText[]; extern u8 gUndefineText[]; extern const u8 gSpeechBubbleChar[]; -extern u8 ScriptPrintText_809B2B8(u32 *, u32, u32, const u8 *); -extern u32 IsTextboxOpen_809B40C(u32 *); +extern bool8 sub_802FCF0(void); +u8 ScriptPrintText_809B2B8(struct unkStruct_3001B64_unkC *, s32, s32, const char *); +bool8 IsTextboxOpen_809B40C(struct unkStruct_3001B64_unkC *); extern void sub_801416C(s32, s32); extern void ResetTextbox_809B294(void); extern void sub_8014144(void); @@ -612,7 +615,7 @@ bool8 sub_809AFAC(void) extern const MenuItem gUnknown_81160E8[]; void sub_809B028(const MenuItem *, s32 a1_, s32 a2, s32 a3, s32 a4_, const char *text); -u8 sub_809B18C(s32 *sp); +bool8 sub_809B18C(s32 *sp); void sub_809AFC8(s32 a0_, s32 a1, s32 a2_, const char *text) { @@ -622,10 +625,10 @@ void sub_809AFC8(s32 a0_, s32 a1, s32 a2_, const char *text) sub_809B028(gUnknown_81160E8, 0, (a0 != 0), a1, a2, text); } -u8 sub_809AFFC(u8 *a0) +bool8 sub_809AFFC(u8 *a0) { s32 sp; - u8 ret = sub_809B18C(&sp); + bool8 ret = sub_809B18C(&sp); if (a0 != NULL) { *a0 = (sp == 1); @@ -634,6 +637,7 @@ u8 sub_809AFFC(u8 *a0) } extern const char gUnknown_8116188[]; +extern const char gUnknown_8116190[]; extern const char gFormattedSpeechBubble[]; bool8 sub_809B428(u8 *a0, s32 a1, u8 *a2); @@ -666,3 +670,123 @@ void sub_809B028(const MenuItem * menuItems, s32 a1_, s32 a2, s32 a3, s32 a4_, c sub_809A6E4(1); } } + +bool8 sub_809B18C(s32 *sp) +{ + if (sp != NULL) { + *sp = gUnknown_3001B64->unk430; + } + + return (gUnknown_3001B64->unk420 == 3); +} + +bool8 sub_809B1D4(s32 a0, u32 kind, s32 a2, s32 r3); + +bool8 sub_809B1C0(s32 a0, u32 kind, s32 a2) +{ + return sub_809B1D4(a0, kind, 0, a2); +} + +bool8 sub_809B1D4(s32 a0, u32 kind, s32 a2, s32 a3) +{ + switch (a0) { + case 0xB: + if (sub_8021700(kind)) { + return FALSE; + } + break; + case 0xC: + sub_8001D88(); + if (sub_802FCF0()) { + return FALSE; + } + break; + } + + xxx_script_textboxes_809A680(4, 0); + gUnknown_3001B64->unk414 = a0; + gUnknown_3001B64->unk418 = 0; + gUnknown_3001B64->unk41C = NULL; + gUnknown_3001B64->unk420 = 1; + gUnknown_3001B64->unk424 = kind; + gUnknown_3001B64->unk428 = a2; + gUnknown_3001B64->unk42C = a3; + gUnknown_3001B64->unk430 = -1; + return TRUE; +} + +// The same as sub_809B18C +bool8 sub_809B260(s32 *a0) +{ + if (a0 != NULL) { + *a0 = gUnknown_3001B64->unk430; + } + + return (gUnknown_3001B64->unk420 == 3); +} + +void ResetTextbox_809B294(void) +{ + SetCharacterMask(3); + ScriptPrintText_809B2B8(&gUnknown_3001B64->unkC, 0, -1, NULL); +} + +u8 ScriptPrintText_809B2B8(struct unkStruct_3001B64_unkC *ptr, s32 a1_, s32 a2_, const char *text) +{ + u16 a1 = (u16) a1_; + s32 a2 = (s16) a2_; + + ptr->unk0 = a1; + if (text == NULL) { + if (a1 == 0) { + ptr->unk4 = 0; + return FALSE; + } + + if (a1 & 4) { + sub_8014490(); + xxx_script_textboxes_809A680(0, 1); + } + return TRUE; + } + + ptr->unk4 = 1; + if (a1 & 0x100) { + if (a2 < 0) { + strcpy(gSpeakerNameBuffer, gFormattedSpeechBubble); + } + else { + sprintfStatic(gSpeakerNameBuffer, gUnknown_8116188, gFormatBuffer_Names[a2]); + } + } + + if (gUnknown_3001B64->unk0 == 3) { + sprintfStatic(ptr->buffer, gUnknown_8116190, text); + text = ptr->buffer; + } + + CreateMenuDialogueBoxAndPortrait(text, sub_809B428, -1, NULL, 0, 3, 0, sub_809AE3C(a2), + ((a1 & 0x100) ? 0xC : 0) + | ((a1 & 0x200) ? 0x4 : 0) + | ((gUnknown_3001B64->unk0 == 3) ? 0x10 : 0) + | ((gUnknown_3001B64->unk0 == 2) ? 0x10 : 0) + | ((a1 & 0x20) ? 0x20 : 0) + | ((a1 & 0x40) ? 0x1 : 0) + | ((a1 & 0x80) ? 0x100 : 0) + | ((a1 & 0x4) ? 0x200 : 0) + | ((gUnknown_3001B64->unk4 != -1) ? 0x2 : 0) + ); + + return TRUE; +} + +bool8 IsTextboxOpen_809B40C(struct unkStruct_3001B64_unkC *a0) +{ + switch (a0->unk4) { + case 0: + case 2: + case 3: + return FALSE; + } + return TRUE; +}