func_801A910 Duplicates + Custom SEL version (#527)

This commit is contained in:
Alejandro Asenjo Nitti 2023-08-30 17:20:02 -03:00 committed by GitHub
parent 4adf1da469
commit a1e8176a36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 227 additions and 110 deletions

View File

@ -61,4 +61,5 @@ EntityUnkId08 = 0x8019BAB8;
BottomCornerText = 0x8019BBA4;
UnkPolyFunc0 = 0x8019C674;
UnkLoopFunc = 0x8019C6A0;
g_Dialogue = 0x8019D378;
g_ItemIconSlots = 0x8019D42C;

View File

@ -82,4 +82,5 @@ UnkPolyFunc0 = 0x801A27B8;
UnkLoopFunc = 0x801A27E4;
EntityUnkId17 = 0x801A2E20;
Entity3DBackgroundHouse = 0x801A2F10;
g_Dialogue = 0x801A3ED8;
g_ItemIconSlots = 0x801A3F8C;

View File

@ -137,4 +137,5 @@ EntityStageNamePopup = 0x801C8CAC;
UnkPolyFunc0 = 0x801CA0D0;
UnkLoopFunc = 0x801CA0FC;
EntityLifeUpSpawn = 0x801CA160;
g_Dialogue = 0x801CB688;
g_ItemIconSlots = 0x801CB740;

View File

@ -1690,7 +1690,8 @@ func_801BABA4 = 0x801BABA4;
g_memCardRStep = 0x801BAFEC;
g_memCardRStepSub = 0x801BAFF0;
g_memCardRetryCount = 0x801BAFF8;
g_Dialogue = 0x801BC354;
g_MemCardSelectorX = 0x801BC3D8;
g_MemCardSelectorY = 0x801BC3DC;
g_InputCursorPos = 0x801D6B08;
g_InputSaveName = 0x801D6B14;
g_InputSaveName = 0x801D6B14;

View File

@ -988,6 +988,26 @@ typedef struct {
/* 0x0E */ u16 unk0E;
} RelicOrb; /* size=0x10 */
typedef struct {
/* 0x00 */ const char* nextCharDialogue; // ptr to dialogue next character
/* 0x04 */ u16 startX; // starting x coord
/* 0x06 */ u16 nextLineY; // next line y coord
/* 0x08 */ u16 startY; // starting y coord
/* 0x0A */ u16 nextCharX; // next char x coord
/* 0x0C */ u16 nextLineX; // next line x coord
/* 0x0E */ s16 nextCharY; // next char y coord
/* 0x10 */ u16 portraitAnimTimer; // portrait animation timer
/* 0x12 */ u16 unk12; // unknown
/* 0x14 */ u16 clutIndex; // CLUT index
/* 0x16 */ u8 nextCharTimer; // timer to next character
/* 0x17 */ u8 unk17; // unknown
/* 0x18 */ Primitive* prim[6]; // for dialogue graphics rendering
/* 0x30 */ s32 primIndex[3]; // primIndices: unk, actorName, unk
/* 0x3C */ u16 unk3C; // unknown
/* 0x3E */ u16 timer; // global timer
/* 0x40 */ const char* unk40; // dialogue settings, maybe?
} Dialogue; // size = 0x44
typedef struct {
/* 8003C774 */ Overlay o;
/* 8003C7B4 */ void (*FreePrimitives)(s32);

View File

@ -245,7 +245,34 @@ void func_8018E3BC(s32 arg0) {
INCLUDE_ASM("asm/us/st/cen/nonmatchings/D600", func_8018E3E8);
INCLUDE_ASM("asm/us/st/cen/nonmatchings/D600", func_8018E6C4);
// Animates the portrait size of the actor by enlarging or shrinking it
void func_8018E6C4(u8 ySteps) {
Primitive* prim;
s32 primIndex;
s32 i;
primIndex = g_Dialogue.nextCharY + 1;
while (primIndex >= 5) {
primIndex -= 5;
}
if (g_CurrentEntity->step_s == 0) {
prim = g_Dialogue.prim[primIndex];
prim->v1 -= ySteps;
prim->v0 += ySteps;
if (prim->v1 == 0) {
g_CurrentEntity->step_s++;
prim->blendMode = BLEND_VISIBLE;
}
}
for (i = 0; i < 5; i++) {
if (i != primIndex) {
prim = g_Dialogue.prim[i];
prim->y0 -= ySteps;
}
}
g_Dialogue.portraitAnimTimer++;
}
INCLUDE_ASM("asm/us/st/cen/nonmatchings/D600", EntityUnkId16);

View File

@ -95,4 +95,6 @@ extern u16 g_ItemIconSlots[0x20];
extern u16 UNK_Invincibility0[];
extern u16 g_InitializeEntityData0[];
extern Dialogue g_Dialogue;
#endif

View File

@ -10,57 +10,57 @@ void func_80194774(void) {
D_801A3EDE = D_801A3EE0 + 20;
}
s32 func_801947C8(s32 arg0) {
s32 func_801947C8(s32 textDialogue) {
Primitive* prim;
s16 firstPrimIndex;
firstPrimIndex = g_api.AllocPrimitives(PRIM_SPRT, 7);
D_801A3F10[0] = firstPrimIndex;
g_Dialogue.primIndex[2] = firstPrimIndex;
if (firstPrimIndex == -1) {
D_801A3F10[0] = 0;
g_Dialogue.primIndex[2] = 0;
return 0;
}
D_801A3ED8 = arg0;
D_801A3F14 = 0;
D_801A3F0C = -1;
D_801A3F08 = -1;
g_Dialogue.nextCharDialogue = textDialogue;
g_Dialogue.unk3C = 0;
g_Dialogue.primIndex[1] = -1;
g_Dialogue.primIndex[0] = -1;
func_80194774();
if (prim && prim) { // !FAKE
}
prim = D_801A3EF0[0] = &g_PrimBuf[D_801A3F10[0]];
prim = g_Dialogue.prim[0] = &g_PrimBuf[g_Dialogue.primIndex[2]];
prim->blendMode = BLEND_VISIBLE;
prim = D_801A3EF0[1] = prim->next;
prim = g_Dialogue.prim[1] = prim->next;
prim->blendMode = BLEND_VISIBLE;
prim = D_801A3EF0[2] = prim->next;
prim = g_Dialogue.prim[2] = prim->next;
prim->blendMode = BLEND_VISIBLE;
prim = D_801A3EF0[3] = prim->next;
prim = g_Dialogue.prim[3] = prim->next;
prim->blendMode = BLEND_VISIBLE;
prim = D_801A3EF0[4] = prim->next;
prim = g_Dialogue.prim[4] = prim->next;
prim->blendMode = BLEND_VISIBLE;
prim = D_801A3EF0[5] = prim->next;
prim = g_Dialogue.prim[5] = prim->next;
prim->type = 4;
prim->blendMode = BLEND_VISIBLE;
prim = prim->next;
prim->type = PRIM_G4;
prim->type = 3;
prim->r0 = prim->r1 = prim->r2 = prim->r3 = 0xFF;
prim->b0 = prim->b1 = prim->b2 = prim->b3 = prim->g0 = prim->g1 = prim->g2 =
prim->g3 = 0;
prim->g0 = prim->g1 = prim->g2 = prim->g3 = 0;
prim->b0 = prim->b1 = prim->b2 = prim->b3 = 0;
prim->x0 = prim->x2 = 4;
prim->x1 = prim->x3 = 0xF8;
prim->priority = 0x1FD;
prim->blendMode = BLEND_VISIBLE;
prim = prim->next;
prim->type = PRIM_TILE;
prim->type = 1;
prim->x0 = 3;
prim->y0 = 0x2F;
prim->v0 = 0x4A;
@ -120,7 +120,33 @@ void func_80194F14(Entity* self) {
}
}
INCLUDE_ASM("asm/us/st/dre/nonmatchings/14774", func_80194FF4);
void func_80194FF4(u8 ySteps) {
Primitive* prim;
s32 primIndex;
s32 i;
primIndex = g_Dialogue.nextCharY + 1;
while (primIndex >= 5) {
primIndex -= 5;
}
if (g_CurrentEntity->step_s == 0) {
prim = g_Dialogue.prim[primIndex];
prim->v1 -= ySteps;
prim->v0 += ySteps;
if (prim->v1 == 0) {
g_CurrentEntity->step_s++;
prim->blendMode = BLEND_VISIBLE;
}
}
for (i = 0; i < 5; i++) {
if (i != primIndex) {
prim = g_Dialogue.prim[i];
prim->y0 -= ySteps;
}
}
g_Dialogue.portraitAnimTimer++;
}
// dialogue with mother opens as alucard walks right ID 20
INCLUDE_ASM("asm/us/st/dre/nonmatchings/14774", EntitySuccubusCutscene);

View File

@ -152,3 +152,5 @@ extern s16 D_801A3F14;
extern s16 D_801A3F16;
extern s32 D_801A3F18;
extern u16 g_ItemIconSlots[0x20];
extern Dialogue g_Dialogue;

View File

@ -228,41 +228,41 @@ void func_801B74CC(void) {
}
// called from EntityMariaCutscene
s32 func_801B7520(s32 arg0) {
s32 func_801B7520(s32 textDialogue) {
Primitive* prim;
s16 firstPrimIndex;
firstPrimIndex = g_api.AllocPrimitives(PRIM_SPRT, 7);
D_801CB6C0[0] = firstPrimIndex;
g_Dialogue.primIndex[2] = firstPrimIndex;
if (firstPrimIndex == -1) {
D_801CB6C0[0] = 0;
g_Dialogue.primIndex[2] = 0;
return 0;
}
D_801CB688 = arg0;
D_801CB6C4 = 0;
D_801CB6BC = -1;
D_801CB6B8 = -1;
g_Dialogue.nextCharDialogue = textDialogue;
g_Dialogue.unk3C = 0;
g_Dialogue.primIndex[1] = -1;
g_Dialogue.primIndex[0] = -1;
func_801B74CC();
if (prim && prim) { // !FAKE
}
prim = D_801CB6A0[0] = &g_PrimBuf[D_801CB6C0[0]];
prim = g_Dialogue.prim[0] = &g_PrimBuf[g_Dialogue.primIndex[2]];
prim->blendMode = BLEND_VISIBLE;
prim = D_801CB6A0[1] = prim->next;
prim = g_Dialogue.prim[1] = prim->next;
prim->blendMode = BLEND_VISIBLE;
prim = D_801CB6A0[2] = prim->next;
prim = g_Dialogue.prim[2] = prim->next;
prim->blendMode = BLEND_VISIBLE;
prim = D_801CB6A0[3] = prim->next;
prim = g_Dialogue.prim[3] = prim->next;
prim->blendMode = BLEND_VISIBLE;
prim = D_801CB6A0[4] = prim->next;
prim = g_Dialogue.prim[4] = prim->next;
prim->blendMode = BLEND_VISIBLE;
prim = D_801CB6A0[5] = prim->next;
prim = g_Dialogue.prim[5] = prim->next;
prim->type = 4;
prim->blendMode = BLEND_VISIBLE;
@ -270,8 +270,8 @@ s32 func_801B7520(s32 arg0) {
prim = prim->next;
prim->type = 3;
prim->r0 = prim->r1 = prim->r2 = prim->r3 = 0xFF;
prim->b0 = prim->b1 = prim->b2 = prim->b3 = prim->g0 = prim->g1 = prim->g2 =
prim->g3 = 0;
prim->g0 = prim->g1 = prim->g2 = prim->g3 = 0;
prim->b0 = prim->b1 = prim->b2 = prim->b3 = 0;
prim->x0 = prim->x2 = 4;
prim->x1 = prim->x3 = 0xF8;
prim->priority = 0x1FD;
@ -310,7 +310,34 @@ void func_801B797C(s32 arg0) {
INCLUDE_ASM("asm/us/st/nz0/nonmatchings/36DE4", func_801B79A8);
INCLUDE_ASM("asm/us/st/nz0/nonmatchings/36DE4", func_801B7C54);
// Animates the portrait size of the actor by enlarging or shrinking it
void func_801B7C54(u8 ySteps) {
Primitive* prim;
s32 primIndex;
s32 i;
primIndex = g_Dialogue.nextCharY + 1;
while (primIndex >= 5) {
primIndex -= 5;
}
if (g_CurrentEntity->step_s == 0) {
prim = g_Dialogue.prim[primIndex];
prim->v1 -= ySteps;
prim->v0 += ySteps;
if (prim->v1 == 0) {
g_CurrentEntity->step_s++;
prim->blendMode = BLEND_VISIBLE;
}
}
for (i = 0; i < 5; i++) {
if (i != primIndex) {
prim = g_Dialogue.prim[i];
prim->y0 -= ySteps;
}
}
g_Dialogue.portraitAnimTimer++;
}
// cutscene where alucard and maria discuss castle changing
INCLUDE_ASM("asm/us/st/nz0/nonmatchings/36DE4", EntityMariaCutscene);

View File

@ -347,7 +347,6 @@ extern s32 D_801823A4;
extern const char D_801B058C[]; // "charal %x\n"
extern const char D_801B0598[]; // "charal %x\n"
extern const char D_801B08C8[]; // "charal %x\n"
extern s32 D_801CB688;
extern s16 D_801CB68E;
extern u16 D_801CB690;
extern s16 D_801CB692;
@ -374,3 +373,5 @@ extern u16 D_80181F90[]; // NOTE(sestren): Animation frame properties?
extern u8 D_80181FF0;
// *** EntitySoulStealOrb properties END ***
extern Dialogue g_Dialogue;

View File

@ -32,7 +32,33 @@ void func_801B68E0(s32 arg0) {
D_801BC390 = 1;
}
INCLUDE_ASM("asm/us/st/sel/nonmatchings/3642C", func_801B690C);
void func_801B690C(u8 ySteps, Entity* self) {
s32 primIndex = g_Dialogue.nextCharY + 1;
Primitive* prim;
s32 i;
while (primIndex >= 5) {
primIndex -= 5;
}
if (self->step_s == 0) {
prim = g_Dialogue.prim[primIndex];
prim->v1 -= ySteps;
prim->v0 = ySteps + prim->v0;
if (prim->v1 == 0) {
self->step_s++;
prim->blendMode = 8;
}
}
for (i = 0; i < 5; i++) {
if (i != primIndex) {
prim = g_Dialogue.prim[i];
prim->y0 -= ySteps;
}
}
g_Dialogue.portraitAnimTimer++;
}
INCLUDE_ASM("asm/us/st/sel/nonmatchings/3642C", func_801B69F8);

View File

@ -217,6 +217,8 @@ extern s32 D_801D6B0C;
extern s32 D_801D6B20;
extern s32 D_801D6B24;
extern Dialogue g_Dialogue;
void func_801B1ED0();
void func_801B3A54(s32, s32);
s32 func_801B3A94(s32);

View File

@ -378,13 +378,13 @@ void func_801A8620(Entity* entity) {
}
void func_801A8984(void) {
g_Dialogue.D_801C24D8 = 2;
g_Dialogue.D_801C24D6 = 2;
g_Dialogue.D_801C24DA = 0;
g_Dialogue.D_801C24DE = 0;
g_Dialogue.D_801C24E2 = 0;
g_Dialogue.D_801C24E3 = 8;
g_Dialogue.D_801C24D2 = g_Dialogue.D_801C24D4 + 0x14;
g_Dialogue.nextLineX = 2;
g_Dialogue.nextCharX = 2;
g_Dialogue.nextCharY = 0;
g_Dialogue.unk12 = 0;
g_Dialogue.nextCharTimer = 0;
g_Dialogue.unk17 = 8;
g_Dialogue.nextLineY = g_Dialogue.startY + 0x14;
}
s32 func_801A89D8(const char* textDialogue) {
@ -392,36 +392,36 @@ s32 func_801A89D8(const char* textDialogue) {
s16 firstPrimIndex;
firstPrimIndex = g_api.AllocPrimitives(PRIM_SPRT, 8);
g_Dialogue.D_801C24FC[2] = firstPrimIndex;
g_Dialogue.primIndex[2] = firstPrimIndex;
if (firstPrimIndex == -1) {
g_Dialogue.D_801C24FC[2] = 0;
g_Dialogue.primIndex[2] = 0;
return 0;
}
g_Dialogue.D_801C24CC = textDialogue;
g_Dialogue.D_801C2508 = 0;
g_Dialogue.D_801C24FC[1] = -1;
g_Dialogue.D_801C24FC[0] = -1;
g_Dialogue.nextCharDialogue = textDialogue;
g_Dialogue.unk3C = 0;
g_Dialogue.primIndex[1] = -1;
g_Dialogue.primIndex[0] = -1;
func_801A8984();
if (prim && prim) { // !FAKE
}
prim = g_Dialogue.D_801C24E4[0] = &g_PrimBuf[g_Dialogue.D_801C24FC[2]];
prim = g_Dialogue.prim[0] = &g_PrimBuf[g_Dialogue.primIndex[2]];
prim->blendMode = BLEND_VISIBLE;
prim = g_Dialogue.D_801C24E4[1] = prim->next;
prim = g_Dialogue.prim[1] = prim->next;
prim->blendMode = BLEND_VISIBLE;
prim = g_Dialogue.D_801C24E4[2] = prim->next;
prim = g_Dialogue.prim[2] = prim->next;
prim->blendMode = BLEND_VISIBLE;
prim = g_Dialogue.D_801C24E4[3] = prim->next;
prim = g_Dialogue.prim[3] = prim->next;
prim->blendMode = BLEND_VISIBLE;
prim = g_Dialogue.D_801C24E4[4] = prim->next;
prim = g_Dialogue.prim[4] = prim->next;
prim->blendMode = BLEND_VISIBLE;
prim = g_Dialogue.D_801C24E4[5] = prim->next;
prim = g_Dialogue.prim[5] = prim->next;
prim->type = 4;
prim->blendMode = BLEND_VISIBLE;

View File

@ -8,15 +8,15 @@
void func_801A8BF8(void) {
Primitive* prim;
func_801A8B9C(g_Dialogue.D_801C24DA);
prim = g_Dialogue.D_801C24E4[g_Dialogue.D_801C24DA];
func_801A8B9C(g_Dialogue.nextCharY);
prim = g_Dialogue.prim[g_Dialogue.nextCharY];
prim->tpage = 0x10;
prim->clut = g_Dialogue.D_801C24E0;
prim->y0 = g_Dialogue.D_801C24D2;
prim->clut = g_Dialogue.clutIndex;
prim->y0 = g_Dialogue.nextLineY;
prim->u0 = 0;
prim->x0 = g_Dialogue.D_801C24D0;
prim->x0 = g_Dialogue.startX;
prim->x0 = prim->x0 + 4;
prim->v0 = g_Dialogue.D_801C24DA * 0xC - 0x80;
prim->v0 = g_Dialogue.nextCharY * 0xC - 0x80;
prim->u1 = 0xC0;
prim->v1 = 0xC;
prim->priority = 0x1FF;
@ -57,7 +57,7 @@ void func_801A8CB0(u16 actorIndex, Entity* self) {
// Fill prims to render the actor name on screen
prim = &g_PrimBuf[primIndex];
g_Dialogue.D_801C24FC[1] = primIndex;
g_Dialogue.primIndex[1] = primIndex;
actorName = D_80180828[actorIndex];
x = 0x38;
while (prim != NULL) {
@ -75,7 +75,7 @@ void func_801A8CB0(u16 actorIndex, Entity* self) {
prim->priority = 0x1FF;
prim->blendMode = BLEND_VISIBLE;
prim->x0 = x;
prim->y0 = g_Dialogue.D_801C24D4 + 6;
prim->y0 = g_Dialogue.startY + 6;
prim = prim->next;
x += FONT_GAP;
}
@ -83,9 +83,9 @@ void func_801A8CB0(u16 actorIndex, Entity* self) {
}
void func_801A8E34(s32 arg0) {
g_Dialogue.D_801C250C = arg0 + 0x100000;
g_Dialogue.D_801C250A = 0;
g_Dialogue.D_801C2508 = 1;
g_Dialogue.unk40 = arg0 + 0x100000;
g_Dialogue.timer = 0;
g_Dialogue.unk3C = 1;
}
void func_801A8E60(void) {
@ -93,49 +93,49 @@ void func_801A8E60(void) {
u16 startTimer;
u8 entityIndex;
g_Dialogue.D_801C250A++;
g_Dialogue.timer++;
// protect from overflows
if (g_Dialogue.D_801C250A > 0xFFFE) {
g_Dialogue.D_801C2508 = 0;
if (g_Dialogue.timer > 0xFFFE) {
g_Dialogue.unk3C = 0;
return;
}
while (true) {
// Start the dialogue script only if the start timer has passed
startTimer = (*g_Dialogue.D_801C250C++ << 8) | *g_Dialogue.D_801C250C++;
if (g_Dialogue.D_801C250A < startTimer) {
startTimer = (*g_Dialogue.unk40++ << 8) | *g_Dialogue.unk40++;
if (g_Dialogue.timer < startTimer) {
// Re-evaluate the condition at the next frame
g_Dialogue.D_801C250C -= 2;
g_Dialogue.unk40 -= 2;
return;
}
switch (*g_Dialogue.D_801C250C++) {
switch (*g_Dialogue.unk40++) {
case 0:
entityIndex = *g_Dialogue.D_801C250C++;
entityIndex = *g_Dialogue.unk40++;
entity = &g_Entities[STAGE_ENTITY_START + entityIndex];
DestroyEntity(entity);
entity->entityId = *g_Dialogue.D_801C250C++;
entity->entityId = *g_Dialogue.unk40++;
entity->pfnUpdate = PfnEntityUpdates[entity->entityId - 1];
entity->posX.i.hi = *g_Dialogue.D_801C250C++ * 0x10;
entity->posX.i.hi = *g_Dialogue.D_801C250C++ | entity->posX.i.hi;
entity->posY.i.hi = *g_Dialogue.D_801C250C++ * 0x10;
entity->posY.i.hi = *g_Dialogue.D_801C250C++ | entity->posY.i.hi;
entity->posX.i.hi = *g_Dialogue.unk40++ * 0x10;
entity->posX.i.hi = *g_Dialogue.unk40++ | entity->posX.i.hi;
entity->posY.i.hi = *g_Dialogue.unk40++ * 0x10;
entity->posY.i.hi = *g_Dialogue.unk40++ | entity->posY.i.hi;
break;
case 1:
entityIndex = *g_Dialogue.D_801C250C++;
entityIndex = *g_Dialogue.unk40++;
entity = &g_Entities[STAGE_ENTITY_START + entityIndex];
DestroyEntity(entity);
break;
case 2:
if (!((D_801C257C >> *g_Dialogue.D_801C250C) & 1)) {
g_Dialogue.D_801C250C--;
if (!((D_801C257C >> *g_Dialogue.unk40) & 1)) {
g_Dialogue.unk40--;
return;
}
D_801C257C &= ~(1 << *g_Dialogue.D_801C250C++);
D_801C257C &= ~(1 << *g_Dialogue.unk40++);
break;
case 3:
D_801C257C |= 1 << *g_Dialogue.D_801C250C++;
D_801C257C |= 1 << *g_Dialogue.unk40++;
break;
}
}
@ -147,12 +147,12 @@ void func_801A910C(u8 ySteps) {
s32 primIndex;
s32 i;
primIndex = g_Dialogue.D_801C24DA + 1;
primIndex = g_Dialogue.nextCharY + 1;
while (primIndex >= 5) {
primIndex -= 5;
}
if (g_CurrentEntity->step_s == 0) {
prim = g_Dialogue.D_801C24E4[primIndex];
prim = g_Dialogue.prim[primIndex];
prim->v1 -= ySteps;
prim->v0 += ySteps;
if (prim->v1 == 0) {
@ -163,11 +163,11 @@ void func_801A910C(u8 ySteps) {
for (i = 0; i < 5; i++) {
if (i != primIndex) {
prim = g_Dialogue.D_801C24E4[i];
prim = g_Dialogue.prim[i];
prim->y0 -= ySteps;
}
}
g_Dialogue.D_801C24DC++;
g_Dialogue.portraitAnimTimer++;
}
INCLUDE_ASM("asm/us/st/st0/nonmatchings/28BF8", EntityDialogue);

View File

@ -32,26 +32,6 @@ typedef enum {
E_SECRET_STAIRS = 0x29,
} EntityIDs;
typedef struct {
const char* D_801C24CC; // pointer to dialogue next character
u16 D_801C24D0; // starting x coord
u16 D_801C24D2; // next line y coord
u16 D_801C24D4; // starting y coord
u16 D_801C24D6; // next char x coord
u16 D_801C24D8; // next line x coord
s16 D_801C24DA; // next char y coord
u16 D_801C24DC; // portrait anim timer
u16 D_801C24DE; // unknown
u16 D_801C24E0; // CLUT index
u8 D_801C24E2; // timer to next character
u8 D_801C24E3; // unknown
Primitive* D_801C24E4[6]; // necessary for the dialogue graphics rendering
s32 D_801C24FC[3]; // primIndices: unk, actorName, unk
u16 D_801C2508; // unknown
u16 D_801C250A; // global timer
const char* D_801C250C; // dialogue settings, maybe?
} Dialogue;
void CreateEntityFromEntity(u16 entityId, Entity* source, Entity* entity);
s16 GetSideToPlayer();
void MoveEntity();