sub_809B028

This commit is contained in:
DizzyEggg 2025-02-12 14:48:57 +01:00
parent 48a8b10c66
commit 061cee7a8e
3 changed files with 101 additions and 241 deletions

View File

@ -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}

View File

@ -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;

View File

@ -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);
}
}