tmc/src/textbox.c

230 lines
5.2 KiB
C

#include "global.h"
#include "room.h"
#include "entity.h"
#include "functions.h"
#include "textbox.h"
#include "structures.h"
#include "save.h"
u32 sub_080564DC(void);
u32 sub_080564EC(void);
u32 sub_08056654(void);
u32 sub_080565B4(void);
u32 sub_080565F8(void);
u32 sub_08056640(void);
u32 (*const gUnk_08107BC8[])(void) = { sub_080564DC, sub_080564EC, sub_08056654,
sub_080565B4, sub_080565F8, sub_08056640 };
extern u8 gUnk_020227DC, gUnk_020227E8, gUnk_020227F0, gUnk_020227F8, gUnk_02022800;
u8* const gUnk_08107BE0[] = { &gUnk_020227DC, &gUnk_020227E8, &gUnk_020227F0, &gUnk_020227F8, &gUnk_02022800 };
void sub_08056684(struct_02022780*);
void sub_080566B8(struct_02022780*);
void sub_08056BA0(struct_02022780*);
void sub_08056B1C(struct_02022780*);
void sub_08056B7C(struct_02022780*);
void sub_080569D4(struct_02022780*);
void (*const gUnk_08107BF4[])(struct_02022780*) = { sub_08056684, sub_080566B8, sub_08056BA0,
sub_08056B1C, sub_08056B7C, sub_080569D4 };
extern u32 gUnk_02036A40;
extern u32 gUnk_02036A38;
extern u8 gUnk_02024030;
extern u8 gUnk_020227A0;
extern u8 gUnk_02000D00;
s32 sub_08056338(void) {
s32 result;
result = -1;
if (((gTextBox.doTextBox & 0x7f) == 0) && (gUnk_02000040.unk_00 == 3))
result = gUnk_02000040.unk_01;
return result;
}
void sub_08056360(void) {
if ((gTextBox.doTextBox & 0x7f) != 0) {
gTextBox.doTextBox = 0x80 | 0x8;
}
}
void TextboxNoOverlapFollow(u32 index) {
if (gRoomControls.cameraTarget != NULL) {
TextboxNoOverlap(index, gRoomControls.cameraTarget);
} else {
ShowTextbox(index);
}
}
void TextboxNoOverlap(u32 index, Entity* ent) {
s16 y;
s16 h;
ShowTextbox(index);
y = ent->y.HALF.HI;
h = ent->height.HALF.HI;
if (((y + h) - gRoomControls.roomScrollY) > 0x58) {
gTextBox.textWindowPosY = 1;
}
}
void sub_080563C8(u32 param_1, u32 param_2) {
TextboxAtPosition(param_1, 1, param_2);
}
void TextboxAtPosition(u32 index, u32 x, u32 y) {
ShowTextbox(index);
gTextBox.textWindowPosX = x;
gTextBox.textWindowPosY = y;
}
void ShowTextbox(u32 index) {
_DmaZero(&gTextBox, 32);
gTextBox.textIndex = index;
gTextBox.textSpeed = 99;
gTextBox.textWindowWidth = 26;
gTextBox.textWindowHeight = 4;
gTextBox.textWindowPosX = 1;
gTextBox.textWindowPosY = 12;
gTextBox.doTextBox = 1;
}
void sub_08056418(void) {
_DmaZero(&gTextBox, 32);
_DmaZero(&gUnk_02022780, 168);
_DmaZero(&gUnk_02036A40, 8);
_DmaZero(&gUnk_02036A38, 8);
_DmaZero(&gUnk_02000040, 4);
}
void sub_08056458(void) {
int iVar1;
if (gTextBox.doTextBox == 1) {
_DmaZero((u32*)&gUnk_02022780, sizeof(gUnk_02022780));
sub_080564C8(1);
}
if (gUnk_02022780._8a != 0) {
gUnk_02022780._8a--;
} else {
do {
iVar1 = gUnk_08107BC8[gUnk_02022780._88]();
} while (iVar1 != 0);
}
if (gUnk_02022780._9d != 0) {
gUnk_02022780._9d = 0;
sub_08056F70();
}
sub_08056C68();
sub_08056D70();
}
void sub_080564C8(u32 a1) {
gUnk_02022780._88 = a1;
gUnk_02022780._89 = 0;
}
u32 sub_080564DC(void) {
gUnk_02022780._99 = 0;
return 0;
}
// regalloc in loop
NONMATCH("asm/non_matching/textbox/sub_080564EC.inc", u32 sub_080564EC(void)) {
u32 uVar1;
char* dest;
u32 i;
char c;
_DmaZero((void*)&gUnk_02036A40, 8);
_DmaZero((void*)&gUnk_02024030, 0x18);
_DmaZero((void*)&gUnk_02022780, 0xa8);
_DmaCopy(&gTextBox, &gUnk_02022780, 32);
if (gUnk_02022780._2 == 0x63) {
gUnk_02022780._2 = gUnk_02000000->messageSpeed;
}
gUnk_02022780._9c = 0xff;
sub_0805EEB4(&gUnk_02022780._20, gUnk_02022780._8, 32);
gUnk_02022780._5c = 2;
gUnk_02022780._5d = 0xe;
dest = gUnk_02022780._5e;
for (i = 0; i < 6; ++i) {
c = gSave.playerName[i];
if (c == '\0')
break;
dest[i] = c;
}
dest[0] = 2;
dest[1] = 15;
dest[2] = 0;
sub_08056FBC(&gUnk_02022780);
gUnk_02022780._2c = &gUnk_08107BE0;
gUnk_02022780._58 = &gUnk_02000D00;
gUnk_02022780._54 = 0xd0;
sub_08056C54(2);
sub_08056BDC(0);
sub_080564C8(2);
return 1;
}
END_NONMATCH
u32 sub_080565B4(void) {
if (gUnk_02022780._89 == 0) {
gUnk_02022780._89 = 1;
gUnk_02022780._99 = 1;
sub_08056F88(gUnk_02022780._3[0], gUnk_02022780._53);
PlaySFX(0x65);
}
if (sub_08056CC0(1)) {
gUnk_02022780._99 = 2;
sub_080564C8(2);
}
return 0;
}
u32 sub_080565F8(void) {
if (gUnk_02022780._89 == 0) {
gUnk_02022780._89 = 1;
gUnk_02022780._99 = 3;
sub_08056BDC(0);
PlaySFX(0x66);
}
if (sub_08056CC0(-1)) {
gUnk_02022780._99 = 0;
sub_080564C8(2);
}
return 0;
}
u32 sub_08056640() {
sub_08056C54(0);
sub_080564C8(0);
return 0;
}
u32 sub_08056654(void) {
sub_08056C54(4);
gUnk_08107BF4[gUnk_02022780._89](&gUnk_02022780);
sub_08056CC0(0);
return 0;
}
void sub_08056684(struct_02022780* this) {
if ((gUnk_02022780._20 & 1) == 0) {
if (gUnk_02022780._99 == '\0') {
sub_080564C8(5);
}
} else {
this->_89 = 1;
}
}