From 061cee7a8eccbefae904f2afb1514cdd7bbeb5fb Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 12 Feb 2025 14:48:57 +0100 Subject: [PATCH] sub_809B028 --- asm/code_809A560.s | 171 ---------------------------------- include/structs/str_3001B64.h | 12 +-- src/code_809A560.c | 159 +++++++++++++++++++------------ 3 files changed, 101 insertions(+), 241 deletions(-) diff --git a/asm/code_809A560.s b/asm/code_809A560.s index 89ebffef8..c448c86de 100644 --- a/asm/code_809A560.s +++ b/asm/code_809A560.s @@ -6,177 +6,6 @@ .text - - thumb_func_start sub_809B028 -sub_809B028: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x14 - mov r8, r0 - adds r7, r2, 0 - adds r6, r3, 0 - ldr r0, [sp, 0x2C] - lsls r1, 24 - lsrs r5, r1, 24 - lsls r0, 16 - asrs r4, r0, 16 - ldr r1, _0809B084 - lsls r0, r6, 2 - adds r0, r1 - ldr r0, [r0] - movs r1, 0 - bl xxx_script_textboxes_809A680 - ldr r0, _0809B088 - ldr r1, [r0] - ldr r0, _0809B08C - adds r2, r1, r0 - movs r0, 0x1 - str r0, [r2] - movs r0, 0x83 - lsls r0, 3 - adds r2, r1, r0 - movs r0, 0 - str r0, [r2] - ldr r2, _0809B090 - adds r0, r1, r2 - mov r2, r8 - str r2, [r0] - movs r2, 0x84 - lsls r2, 3 - adds r0, r1, r2 - movs r2, 0x2 - str r2, [r0] - ldr r0, _0809B094 - adds r1, r0 - cmp r5, 0 - beq _0809B098 - str r2, [r1] - b _0809B09A - .align 2, 0 -_0809B084: .4byte gUnknown_8116134 -_0809B088: .4byte gUnknown_3001B64 -_0809B08C: .4byte 0x00000414 -_0809B090: .4byte 0x0000041c -_0809B094: .4byte 0x00000424 -_0809B098: - str r5, [r1] -_0809B09A: - ldr r0, _0809B0D4 - ldr r0, [r0] - movs r1, 0x85 - lsls r1, 3 - adds r2, r0, r1 - movs r1, 0 - str r1, [r2] - movs r2, 0x86 - lsls r2, 3 - adds r0, r2 - str r7, [r0] - ldr r0, _0809B0D8 - lsls r2, r6, 1 - adds r0, r2, r0 - ldrh r1, [r0] - movs r0, 0x80 - lsls r0, 1 - ands r0, r1 - adds r5, r2, 0 - cmp r0, 0 - beq _0809B0F6 - cmp r4, 0 - bge _0809B0E4 - ldr r0, _0809B0DC - ldr r1, _0809B0E0 - bl strcpy - b _0809B0F6 - .align 2, 0 -_0809B0D4: .4byte gUnknown_3001B64 -_0809B0D8: .4byte gUnknown_8116148 -_0809B0DC: .4byte gSpeakerNameBuffer -_0809B0E0: .4byte gFormattedSpeechBubble -_0809B0E4: - ldr r0, _0809B134 - ldr r1, _0809B138 - lsls r2, r4, 2 - adds r2, r4 - lsls r2, 4 - ldr r3, _0809B13C - adds r2, r3 - bl sprintfStatic -_0809B0F6: - adds r0, r4, 0 - bl sub_809AE3C - ldr r4, _0809B140 - movs r1, 0 - str r1, [sp] - movs r3, 0x4 - str r3, [sp, 0x4] - str r1, [sp, 0x8] - str r0, [sp, 0xC] - ldr r0, _0809B144 - adds r0, r5, r0 - ldrh r2, [r0] - movs r0, 0x80 - lsls r0, 1 - ands r0, r2 - cmp r0, 0 - beq _0809B11C - movs r1, 0xC -_0809B11C: - movs r0, 0x80 - lsls r0, 2 - ands r0, r2 - cmp r0, 0 - beq _0809B128 - orrs r1, r3 -_0809B128: - movs r0, 0x20 - ands r0, r2 - cmp r0, 0 - beq _0809B148 - movs r0, 0x21 - b _0809B14A - .align 2, 0 -_0809B134: .4byte gSpeakerNameBuffer -_0809B138: .4byte gUnknown_8116188 -_0809B13C: .4byte gFormatBuffer_Names -_0809B140: .4byte sub_809B428 -_0809B144: .4byte gUnknown_8116148 -_0809B148: - movs r0, 0x1 -_0809B14A: - orrs r0, r1 - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0x10] - ldr r0, [sp, 0x30] - adds r1, r4, 0 - adds r2, r7, 0 - mov r3, r8 - bl CreateMenuDialogueBoxAndPortrait - ldr r0, _0809B184 - ldr r0, [r0] - ldr r1, _0809B188 - adds r0, r1 - ldr r0, [r0] - movs r1, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0809B176 - movs r0, 0x1 - bl sub_809A6E4 -_0809B176: - add sp, 0x14 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0809B184: .4byte gUnknown_3001B64 -_0809B188: .4byte 0x00000424 - thumb_func_end sub_809B028 - thumb_func_start sub_809B18C sub_809B18C: push {lr} diff --git a/include/structs/str_3001B64.h b/include/structs/str_3001B64.h index a0e1b2684..c20d61010 100644 --- a/include/structs/str_3001B64.h +++ b/include/structs/str_3001B64.h @@ -2,6 +2,8 @@ #define GUARD_STR_3001B64_H #include "file_system.h" +#include "structs/menu.h" +#include "string_format.h" // Maybe Position32? struct unkStruct_3001B64_sub_sub @@ -20,13 +22,7 @@ struct unkStruct_3001B64_sub s8 unk6; u8 unk7; struct unkStruct_3001B64_sub_sub unk8; - OpenedFile *unk10; - /* 0x14 */ u8 *faceData; - u16 unk18; - u16 unk1A; - u8 unk1C; - u8 unk1D; - u8 unk1E; + struct MonPortraitMsg monPortrait; /* 0x20 */ OpenedFile *faceFile; }; @@ -40,7 +36,7 @@ struct unkStruct_3001B64 u8 fill10[0x414 - 0x10]; u32 unk414; u32 unk418; - u32 unk41C; + const MenuItem *unk41C; u32 unk420; u32 unk424; u32 unk428; diff --git a/src/code_809A560.c b/src/code_809A560.c index a325b0b55..b267a83f1 100644 --- a/src/code_809A560.c +++ b/src/code_809A560.c @@ -2,6 +2,7 @@ #include "text.h" #include "memory.h" #include "pokemon.h" +#include "code_800D090.h" #include "pokemon_mid.h" #include "string_format.h" #include "structs/str_3001B64.h" @@ -191,9 +192,9 @@ void sub_809A7EC(void) temp->unk7 = 0; temp->unk8.a0 = 0; temp->unk8.a4 = 0; - temp->unk10 = 0; - temp->faceData = 0; - temp->unk1C = 0; + temp->monPortrait.faceFile = NULL; + temp->monPortrait.faceData = NULL; + temp->monPortrait.spriteId = 0; temp->faceFile = NULL; } } @@ -211,9 +212,9 @@ void sub_809A83C(s16 param_1) temp->unk7 = 0; temp->unk8.a0 = 0; temp->unk8.a4 = 0; - temp->unk10 = 0; - temp->faceData = NULL; - temp->unk1C = 0; + temp->monPortrait.faceFile = NULL; + temp->monPortrait.faceData = NULL; + temp->monPortrait.spriteId = 0; strcpy(gFormatBuffer_Monsters[param_1], gInvalidityText); strcpy(gFormatBuffer_Names[param_1], gInvalidityText); if(temp->faceFile) @@ -237,13 +238,13 @@ bool8 sub_809A8B8(s32 param_1, s32 param_2) s16 local_26; s32 iVar5 = (s16) param_1; s16 local_28 = (s16) param_2; - struct unkStruct_3001B64_sub *puVar8 = &gUnknown_3001B64->unk43C[iVar5]; + struct unkStruct_3001B64_sub *unkPtr = &gUnknown_3001B64->unk43C[iVar5]; u8 uVar9 = 1; u8 byte1 = 0; - if (puVar8->faceFile != NULL) { - CloseFile(puVar8->faceFile); - puVar8->faceFile = NULL; + if (unkPtr->faceFile != NULL) { + CloseFile(unkPtr->faceFile); + unkPtr->faceFile = NULL; } sub_80A7DDC(&local_28,&local_26); @@ -319,35 +320,35 @@ bool8 sub_809A8B8(s32 param_1, s32 param_2) if (local_28 != -1) { s32 sVar3 = sub_80A7AE8(local_28); if (sVar3 >= 0) { - puVar8->unk0 = local_28; - puVar8->speciesID = sub_80A8BFC(sVar3); + unkPtr->unk0 = local_28; + unkPtr->speciesID = sub_80A8BFC(sVar3); strcpy(gFormatBuffer_Monsters[iVar5], gUndefineText); strcpy(gFormatBuffer_Names[iVar5], gUndefineText); - puVar8->unk4 = uVar9; - puVar8->unk5 = byte1; - puVar8->unk6 = 0xff; - puVar8->unk7 = 0; - puVar8->unk8.a0 = 0; - puVar8->unk8.a4 = 0; - puVar8->unk10 = 0; - puVar8->faceData = NULL; - puVar8->unk1C = 0; + unkPtr->unk4 = uVar9; + unkPtr->unk5 = byte1; + unkPtr->unk6 = 0xff; + unkPtr->unk7 = 0; + unkPtr->unk8.a0 = 0; + unkPtr->unk8.a4 = 0; + unkPtr->monPortrait.faceFile = NULL; + unkPtr->monPortrait.faceData = NULL; + unkPtr->monPortrait.spriteId = 0; ret = TRUE; } else if (local_26 != 0) { - puVar8->unk0 = local_28; - puVar8->speciesID = local_26; + unkPtr->unk0 = local_28; + unkPtr->speciesID = local_26; strcpy(gFormatBuffer_Monsters[iVar5], gUndefineText); strcpy(gFormatBuffer_Names[iVar5], gUndefineText); - puVar8->unk4 = uVar9; - puVar8->unk5 = byte1; - puVar8->unk6 = 0xff; - puVar8->unk7 = 0; - puVar8->unk8.a0 = 0; - puVar8->unk8.a4 = 0; - puVar8->unk10 = 0; - puVar8->faceData = NULL; - puVar8->unk1C = 0; + unkPtr->unk4 = uVar9; + unkPtr->unk5 = byte1; + unkPtr->unk6 = 0xff; + unkPtr->unk7 = 0; + unkPtr->unk8.a0 = 0; + unkPtr->unk8.a4 = 0; + unkPtr->monPortrait.faceFile = NULL; + unkPtr->monPortrait.faceData = NULL; + unkPtr->monPortrait.spriteId = 0; ret = TRUE; } else { @@ -415,9 +416,9 @@ bool8 sub_809AC18(s32 a0_, s32 a1_) struct Unk8116040Struct { - u16 unk0; - u16 unk2; - u8 unk4; + u16 x; + u16 y; + bool8 flip; }; extern const struct Unk8116040Struct gUnknown_8116040[]; @@ -440,15 +441,15 @@ bool8 sub_809AC7C(s32 a0_, s32 a1_, s32 a2_) unkPtr->unk8.a0 = 0; unkPtr->unk8.a4 = 0; } - unkPtr->unk18 = gUnknown_8116040[unkPtr->unk7].unk0 + unkPtr->unk8.a0; - unkPtr->unk1A = gUnknown_8116040[unkPtr->unk7].unk2 + unkPtr->unk8.a4; - unkPtr->unk1D = gUnknown_8116040[unkPtr->unk7].unk4; - unkPtr->unk1E = 0; + unkPtr->monPortrait.pos.x = gUnknown_8116040[unkPtr->unk7].x + unkPtr->unk8.a0; + unkPtr->monPortrait.pos.y = gUnknown_8116040[unkPtr->unk7].y + unkPtr->unk8.a4; + unkPtr->monPortrait.flip = gUnknown_8116040[unkPtr->unk7].flip; + unkPtr->monPortrait.unkE = 0; if (r5 == -2) { unkPtr->unk6 = r5; - unkPtr->unk10 = 0; - unkPtr->faceData = NULL; - unkPtr->unk1C = 0; + unkPtr->monPortrait.faceFile = NULL; + unkPtr->monPortrait.faceData = NULL; + unkPtr->monPortrait.spriteId = 0; return FALSE; } @@ -456,7 +457,7 @@ bool8 sub_809AC7C(s32 a0_, s32 a1_, s32 a2_) unkPtr->faceFile = OpenPokemonDialogueSpriteFile(unkPtr->speciesID); if (unkPtr->faceFile != NULL) { unkPtr->unk6 = r5; - unkPtr->unk10 = unkPtr->faceFile; + unkPtr->monPortrait.faceFile = unkPtr->faceFile; GetFileDataPtr(unkPtr->faceFile, 0); switch (unkPtr->unk0) { case 0x47: @@ -466,35 +467,35 @@ bool8 sub_809AC7C(s32 a0_, s32 a1_, s32 a2_) } break; case 0x4D: - if (unkPtr->unk1D != 0 && (r5 & 0xF) < 4) { - unkPtr->unk1D = 0; + if (unkPtr->monPortrait.flip && (r5 & 0xF) < 4) { + unkPtr->monPortrait.flip = FALSE; r5 = (s8) (r5 + 4); r5 = (s8) (r5 | 0x40); } break; case 0x53: - if (unkPtr->unk1D != 0 && (r5 & 0xF) < 1) { - unkPtr->unk1D = 0; + if (unkPtr->monPortrait.flip && (r5 & 0xF) < 1) { + unkPtr->monPortrait.flip = FALSE; r5 = (s8) (r5 + 1); r5 = (s8) (r5 | 0x40); } break; case 0x73: - if (unkPtr->unk1D != 0 && (r5 & 0xF) < 2) { - unkPtr->unk1D = 0; + if (unkPtr->monPortrait.flip && (r5 & 0xF) < 2) { + unkPtr->monPortrait.flip = FALSE; r5 = (s8) (r5 + 2); r5 = (s8) (r5 | 0x40); } break; } - unkPtr->faceData = unkPtr->faceFile->data; - unkPtr->unk1C = r5 & 0xF; + unkPtr->monPortrait.faceData = (void *) unkPtr->faceFile->data; + unkPtr->monPortrait.spriteId = r5 & 0xF; } else { - unkPtr->unk10 = 0; - unkPtr->faceData = NULL; - unkPtr->unk1C = 0; + unkPtr->monPortrait.faceFile = NULL; + unkPtr->monPortrait.faceData = NULL; + unkPtr->monPortrait.spriteId = 0; } return TRUE; } @@ -504,9 +505,9 @@ bool8 sub_809AC7C(s32 a0_, s32 a1_, s32 a2_) unkPtr->unk7 = 0; unkPtr->unk8.a0 = 0; unkPtr->unk8.a4 = 0; - unkPtr->unk10 = 0; - unkPtr->faceData = NULL; - unkPtr->unk1C = 0; + unkPtr->monPortrait.faceFile = NULL; + unkPtr->monPortrait.faceData = NULL; + unkPtr->monPortrait.spriteId = 0; return FALSE; } @@ -521,12 +522,12 @@ bool8 sub_809ADD8(s32 a0_, struct unkStruct_3001B64_sub_sub *a1) return FALSE; unkPtr->unk8 = *a1; - unkPtr->unk18 = gUnknown_8116040[unkPtr->unk7].unk0 + unkPtr->unk8.a0; - unkPtr->unk1A = gUnknown_8116040[unkPtr->unk7].unk2 + unkPtr->unk8.a4; + unkPtr->monPortrait.pos.x = gUnknown_8116040[unkPtr->unk7].x + unkPtr->unk8.a0; + unkPtr->monPortrait.pos.y = gUnknown_8116040[unkPtr->unk7].y + unkPtr->unk8.a4; return TRUE; } -OpenedFile **sub_809AE3C(s32 a0_) +struct MonPortraitMsg *sub_809AE3C(s32 a0_) { s32 a0 = (s16) a0_; @@ -535,8 +536,8 @@ OpenedFile **sub_809AE3C(s32 a0_) if (unkPtr->speciesID != MONSTER_NONE && unkPtr->unk6 == -1) { sub_809AC7C(a0, 0, 0); } - if (unkPtr->unk10 != NULL) { - return &unkPtr->unk10; + if (unkPtr->monPortrait.faceFile != NULL) { + return &unkPtr->monPortrait; } } @@ -631,3 +632,37 @@ u8 sub_809AFFC(u8 *a0) } return ret; } + +extern const char gUnknown_8116188[]; +extern const char gFormattedSpeechBubble[]; + +bool8 sub_809B428(u8 *a0, s32 a1, u8 *a2); + +void sub_809B028(const MenuItem * menuItems, s32 a1_, s32 a2, s32 a3, s32 a4_, const char *text) +{ + s32 a1 = (u8) a1_; + s32 a4 = (s16) a4_; + + xxx_script_textboxes_809A680(gUnknown_8116134[a3], 0); + gUnknown_3001B64->unk414 = 1; + gUnknown_3001B64->unk418 = 0; + gUnknown_3001B64->unk41C = menuItems; + gUnknown_3001B64->unk420 = 2; + gUnknown_3001B64->unk424 = (a1 != 0) ? 2 : 0; + gUnknown_3001B64->unk428 = 0; + gUnknown_3001B64->unk430 = a2; + if (gUnknown_8116148[a3] & 0x100) { + if (a4 < 0) { + strcpy(gSpeakerNameBuffer, gFormattedSpeechBubble); + } + else { + sprintfStatic(gSpeakerNameBuffer, gUnknown_8116188, gFormatBuffer_Names[a4]); + } + } + + CreateMenuDialogueBoxAndPortrait(text, sub_809B428, a2, menuItems, 0, 4, 0, sub_809AE3C(a4), + ((gUnknown_8116148[a3] & 0x100) ? 0xC : 0) | ((gUnknown_8116148[a3] & 0x200) ? 0x4 : 0) | ((gUnknown_8116148[a3] & 0x20) ? 0x21 : 1)); // What an ugly way to get flags lol + if (gUnknown_3001B64->unk424 & 2) { + sub_809A6E4(1); + } +}