mirror of https://github.com/zeldaret/tmc.git
209 lines
5.9 KiB
C
209 lines
5.9 KiB
C
#define NENT_DEPRECATED
|
|
#include "entity.h"
|
|
#include "script.h"
|
|
#include "save.h"
|
|
#include "flags.h"
|
|
#include "message.h"
|
|
#include "npc.h"
|
|
#include "manager.h"
|
|
#include "functions.h"
|
|
|
|
typedef struct {
|
|
Entity base;
|
|
void (*dialogFunc)();
|
|
u16 field_0x6c;
|
|
u16 field_0x6e;
|
|
} CastleMaidEntity;
|
|
|
|
void sub_08064570(CastleMaidEntity* this);
|
|
|
|
void Maid(Entity* this) {
|
|
if ((this->flags & ENT_SCRIPTED) != 0) {
|
|
sub_08064570((CastleMaidEntity*)this);
|
|
} else {
|
|
DeleteThisEntity();
|
|
}
|
|
}
|
|
|
|
void Maid_Head(Entity* this) {
|
|
u32 uVar2;
|
|
u32 uVar3;
|
|
|
|
uVar2 = this->frame & 0x7f;
|
|
uVar3 = this->frameIndex;
|
|
if (this->id == 0x16) {
|
|
if ((this->frame & 0x7f) != 0) {
|
|
uVar2 += 10;
|
|
}
|
|
} else {
|
|
if ((this->frame & 0x7f) != 0) {
|
|
uVar2 += 0x1a;
|
|
}
|
|
uVar3 += 0x10;
|
|
}
|
|
SetExtraSpriteFrame(this, 0, uVar2 - 1);
|
|
SetExtraSpriteFrame(this, 1, uVar3);
|
|
SetSpriteSubEntryOffsetData1(this, 1, 0);
|
|
sub_0807000C(this);
|
|
}
|
|
|
|
void sub_08064570(CastleMaidEntity* this) {
|
|
static const SpriteLoadData gUnk_0810F874[] = {
|
|
{ 0x46, 0x2f, 0x4 }, { 0x2046, 0x2f, 0x4 }, { 0, 0, 0 }, { 0, 0x2f, 0x4 }, { 0x4000, 0x2f, 0x4 }, { 0, 0, 0 },
|
|
};
|
|
u32 tmp;
|
|
u32 tmp2;
|
|
u32 tmp3;
|
|
const SpriteLoadData* data;
|
|
|
|
switch (super->action) {
|
|
case 0:
|
|
tmp = super->id;
|
|
tmp ^= 0x16;
|
|
if (tmp) {
|
|
tmp3 = 1;
|
|
} else {
|
|
tmp3 = 0;
|
|
}
|
|
data = &gUnk_0810F874[tmp3 * 3];
|
|
if (LoadExtraSpriteData(super, data) == 0) {
|
|
return;
|
|
}
|
|
super->action++;
|
|
super->timer = 0;
|
|
tmp2 = sub_0805ACC0(super);
|
|
if (tmp2 == 0) {
|
|
this->field_0x6c = super->x.HALF.HI;
|
|
this->field_0x6e = super->y.HALF.HI;
|
|
} else {
|
|
this->field_0x6c = tmp2 >> 0x10;
|
|
this->field_0x6e = tmp2;
|
|
}
|
|
this->dialogFunc = NULL;
|
|
sub_0807DD50(super);
|
|
case 1:
|
|
sub_0807DD94(super, NULL);
|
|
if (super->interactType != 0) {
|
|
super->action++;
|
|
super->interactType = 0;
|
|
InitializeAnimation(super, sub_0806F5A4(GetFacingDirection(super, &gPlayerEntity)));
|
|
if (this->dialogFunc != NULL) {
|
|
this->dialogFunc();
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
if ((gMessage.doTextBox & 0x7f) != 0) {
|
|
return;
|
|
}
|
|
super->action = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CastleMaid_SetDialogFunc(CastleMaidEntity* this, ScriptExecutionContext* context) {
|
|
this->dialogFunc = (void*)context->intVariable;
|
|
}
|
|
|
|
void sub_0806464C(Entity* this) {
|
|
static const u16 messageIndices[] = {
|
|
TEXT_INDEX(TEXT_PROLOGUE, 0X5f),
|
|
TEXT_INDEX(TEXT_PROLOGUE, 0X60),
|
|
TEXT_INDEX(TEXT_PROLOGUE, 0X61),
|
|
0,
|
|
};
|
|
s32 tmp;
|
|
if (CheckGlobalFlag(TABIDACHI) != 0) {
|
|
tmp = 2;
|
|
} else if (CheckLocalFlag(CASTLE_04_MAID_TALK) == 0) {
|
|
tmp = 0;
|
|
SetLocalFlag(CASTLE_04_MAID_TALK);
|
|
} else {
|
|
tmp = 1;
|
|
}
|
|
MessageNoOverlap(messageIndices[tmp], this);
|
|
}
|
|
|
|
void sub_08064688(Entity* this) {
|
|
static const Dialog gUnk_0810F894[] = {
|
|
{ 7, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x26), TEXT_INDEX(TEXT_TOWN, 0x25) } },
|
|
{ 7, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x26), TEXT_INDEX(TEXT_TOWN, 0x25) } },
|
|
{ 7, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x26), TEXT_INDEX(TEXT_TOWN, 0x25) } },
|
|
{ 7, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_TOWN, 0x26), TEXT_INDEX(TEXT_TOWN, 0x25) } },
|
|
{ 7, DIALOG_ROOM_FLAG, DIALOG_TOGGLE_FLAG, 1, { TEXT_INDEX(TEXT_TOWN2, 0x21), TEXT_INDEX(TEXT_TOWN2, 0x20) } },
|
|
{ 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN3, 0x1f) } },
|
|
{ 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN4, 0x20) } },
|
|
{ 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x20) } },
|
|
{ 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x20) } },
|
|
{ 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TOWN5, 0x20) } },
|
|
};
|
|
ShowNPCDialogue(this, &gUnk_0810F894[gSave.global_progress]);
|
|
}
|
|
|
|
void sub_080646A4(CastleMaidEntity* this, ScriptExecutionContext* context) {
|
|
u8 dir;
|
|
s32 x, y;
|
|
s32 diff;
|
|
if (context->unk_18 == 0) {
|
|
context->unk_18++;
|
|
context->unk_12 = (Random() & 0x3f) + 0x20;
|
|
dir = Random() & 0x18;
|
|
|
|
switch (super->direction) {
|
|
case 0:
|
|
if (dir == 0x10) {
|
|
dir = 0x8;
|
|
}
|
|
break;
|
|
case 0x8:
|
|
if (dir == 0x18) {
|
|
dir = 0x10;
|
|
}
|
|
break;
|
|
case 0x10:
|
|
if (dir == 0) {
|
|
dir = 0x18;
|
|
}
|
|
break;
|
|
case 0x18:
|
|
if (dir == 0x8) {
|
|
dir = 0;
|
|
}
|
|
break;
|
|
}
|
|
super->direction = dir;
|
|
super->animationState = sub_0806F5B0(dir);
|
|
super->speed = 0x80;
|
|
}
|
|
|
|
context->postScriptActions |= 0x2;
|
|
ProcessMovement0(super);
|
|
x = super->x.HALF.HI;
|
|
diff = x - (s16)this->field_0x6c;
|
|
if (diff > 0x10) {
|
|
super->x.HALF.HI = this->field_0x6c + 0x10;
|
|
context->unk_12 = 1;
|
|
}
|
|
|
|
if (diff < -0x10) {
|
|
super->x.HALF.HI = this->field_0x6c - 0x10;
|
|
context->unk_12 = 1;
|
|
}
|
|
|
|
y = super->y.HALF.HI;
|
|
diff = y - (s16)this->field_0x6e;
|
|
if (diff > 0x10) {
|
|
super->y.HALF.HI = this->field_0x6e + 0x10;
|
|
context->unk_12 = 1;
|
|
}
|
|
|
|
if (diff < -0x10) {
|
|
super->y.HALF.HI = this->field_0x6e - 0x10;
|
|
context->unk_12 = 1;
|
|
}
|
|
|
|
if (--context->unk_12) {
|
|
gActiveScriptInfo.commandSize = 0;
|
|
}
|
|
}
|