tmc/src/npc/townMinish.c

854 lines
32 KiB
C

/**
* @file townMinish.c
* @ingroup NPCs
*
* @brief Town Minish NPC
*/
#include "asm.h"
#include "entity.h"
#include "functions.h"
#include "item.h"
#include "npc.h"
#include "tiles.h"
typedef struct {
/*0x00*/ Entity base;
/*0x68*/ u8 fusionOffer;
/*0x69*/ u8 unk_69;
/*0x6a*/ u8 unk_6a;
/*0x6b*/ u8 unused[23];
/*0x82*/ u16 unk_82;
/*0x84*/ ScriptExecutionContext* context;
} TownMinishEntity;
extern u32 sub_080B1AC8(u32, u32, u32);
void sub_0806ACC4(TownMinishEntity*);
void sub_0806ABFC(TownMinishEntity*);
void sub_0806AC3C(TownMinishEntity*);
void sub_0806AEA8(TownMinishEntity*);
void sub_0806AEE4(TownMinishEntity*);
void sub_0806AFE8(Entity*, ScriptExecutionContext*);
void sub_0806B004(Entity*, ScriptExecutionContext*);
void sub_0806B098(Entity*, ScriptExecutionContext*);
void sub_0806B0E0(Entity*, ScriptExecutionContext*);
void sub_0806B064(Entity*, ScriptExecutionContext*);
void sub_0806B134(Entity*, ScriptExecutionContext*);
static const u8 gUnk_081125F4[][0x10][2] = {
{
{ 0x24, 0x1a },
{ 0x25, 0x1a },
{ 0x26, 0x1a },
{ 0x27, 0x9b },
{ 0x28, 0x9b },
{ 0x29, 0x9b },
{ 0x2a, 0x9b },
{ 0x2b, 0x98 },
{ 0x1c, 0x98 },
{ 0x1d, 0x98 },
{ 0x1e, 0x99 },
{ 0x1f, 0x99 },
{ 0x20, 0x99 },
{ 0x21, 0x99 },
{ 0x22, 0x1a },
{ 0x23, 0x1a },
},
{
{ 0x24, 0x9a },
{ 0x25, 0x9a },
{ 0x26, 0x1b },
{ 0x27, 0x1b },
{ 0x28, 0x1b },
{ 0x29, 0x1b },
{ 0x2a, 0x1b },
{ 0x2b, 0x98 },
{ 0x1c, 0x98 },
{ 0x1d, 0x98 },
{ 0x1e, 0x98 },
{ 0x1f, 0x99 },
{ 0x20, 0x99 },
{ 0x21, 0x99 },
{ 0x22, 0x9a },
{ 0x23, 0x9a },
},
{
{ 0x24, 0x9a },
{ 0x25, 0x9a },
{ 0x26, 0x9b },
{ 0x27, 0x9b },
{ 0x28, 0x9b },
{ 0x29, 0x9b },
{ 0x2a, 0x18 },
{ 0x2b, 0x18 },
{ 0x1c, 0x18 },
{ 0x1d, 0x18 },
{ 0x1e, 0x18 },
{ 0x1f, 0x99 },
{ 0x20, 0x99 },
{ 0x21, 0x99 },
{ 0x22, 0x99 },
{ 0x23, 0x9a },
},
{
{ 0x24, 0x9a },
{ 0x25, 0x9a },
{ 0x26, 0x9a },
{ 0x27, 0x9b },
{ 0x28, 0x9b },
{ 0x29, 0x9b },
{ 0x2a, 0x98 },
{ 0x2b, 0x98 },
{ 0x1c, 0x98 },
{ 0x1d, 0x98 },
{ 0x1e, 0x19 },
{ 0x1f, 0x19 },
{ 0x20, 0x19 },
{ 0x21, 0x19 },
{ 0x22, 0x19 },
{ 0x23, 0x9a },
},
};
static const SpriteLoadData gUnk_08112674[][4] = {
{
{ 0xea, 0x1d, 0x4 },
{ 0x20ea, 0x1d, 0x4 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, 0x0 },
},
{
{ 0xea, 0x1d, 0x4 },
{ 0x20ea, 0x1d, 0x4 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, 0x0 },
},
{
{ 0xeb, 0x1d, 0x4 },
{ 0x20eb, 0x1d, 0x4 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, 0x0 },
},
{
{ 0xec, 0x1d, 0x4 },
{ 0x20ec, 0x1d, 0x4 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, 0x0 },
},
{
{ 0xed, 0x1d, 0x4 },
{ 0x20ed, 0x1d, 0x4 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, 0x0 },
},
{
{ 0xee, 0x1d, 0x4 },
{ 0x20ee, 0x1d, 0x4 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, 0x0 },
},
};
static const Rect gUnk_081126D4[4] = {
{ 0, 8, 8, 16 },
{ -8, -2, 16, 8 },
{ 0, 8, 8, 16 },
{ 8, -2, 16, 8 },
};
static const u8 gUnk_081126E4[4] = { 0x0e, 0x0d, 0x0b, 0x07 };
void TownMinish(TownMinishEntity* this) {
static void (*const scriptedActionFuncs[])(TownMinishEntity*) = {
sub_0806ABFC,
sub_0806AC3C,
};
if ((super->flags & ENT_SCRIPTED) == 0) {
scriptedActionFuncs[super->action](this);
sub_0806ED78(super);
} else {
sub_0806ACC4(this);
}
}
void sub_0806ABFC(TownMinishEntity* this) {
const SpriteLoadData* SpriteLoadData = gUnk_08112674[super->type];
if (!LoadExtraSpriteData(super, SpriteLoadData)) {
return;
}
InitializeAnimation(super, 2);
super->action = 1;
this->unk_6a = super->timer;
super->animationState = this->unk_6a << 1;
this->unk_69 = super->animationState * 4;
super->timer = 0;
}
void sub_0806AC3C(TownMinishEntity* this) {
if (super->animIndex <= 3) {
s32 unk;
Entity* link = &gPlayerEntity.base;
if (EntityInRectRadius(super, link, 0x18, 0x18)) {
unk = GetFacingDirection(super, link) & 0x1e;
} else {
unk = super->animationState * 4;
}
if (unk != this->unk_69) {
if (((unk - this->unk_69) & 0x1f) <= 0xf) {
this->unk_69--;
} else {
this->unk_69++;
}
this->unk_69 &= 0x1f;
}
if (!(this->unk_69 & 7)) {
super->animationState = GetAnimationStateForDirection8(this->unk_69);
InitializeAnimation(super, AnimationStateFlip90(super->animationState / 2));
}
}
UpdateAnimationSingleFrame(super);
}
void sub_0806ACC4(TownMinishEntity* this) {
u8 delay;
switch (super->action) {
case 0:
if (!LoadExtraSpriteData(super, gUnk_08112674[super->type]))
return;
super->action = 1;
delay = super->timer;
this->unk_6a = delay;
super->animationState = delay * 2;
super->timer = 0;
this->fusionOffer = GetFusionToOffer(super);
InitScriptForNPC(super);
InitializeAnimation(super, (super->animationState / 2) + 8);
break;
case 1:
if (super->interactType == INTERACTION_FUSE) {
super->action = 3;
super->interactType = INTERACTION_NONE;
InitializeNPCFusion(super);
} else {
ExecuteScriptForEntity(super, NULL);
sub_0806AEA8(this);
if (super->type2 == 10 && super->interactType) {
super->action = 2;
super->interactType = INTERACTION_NONE;
InitializeAnimation(
super, GetAnimationStateForDirection4(GetFacingDirection(super, &gPlayerEntity.base)) + 8);
sub_0806AFE8(super, this->context);
}
if (super->type == 1) {
u8 idx = gPlayerEntity.base.animationState >> 1;
SetInteractableObjectCollision(super, 1, gUnk_081126E4[idx], &gUnk_081126D4[idx]);
}
}
break;
case 2:
if (gMessage.state & MESSAGE_ACTIVE)
break;
super->action = 1;
InitializeAnimation(super, super->animationState / 2 + 4);
break;
case 3:
if (UpdateFuseInteraction(super))
super->action = 1;
break;
}
if (super->frameDuration != 0xff) {
GetNextFrame(super);
}
}
void TownMinish_MakeInteractable(TownMinishEntity* this) {
AddInteractableWhenBigFuser(super, this->fusionOffer);
}
void TownMinish_Head(TownMinishEntity* this) {
u32 frames;
if ((super->flags & ENT_SCRIPTED) == 0) {
frames = this->unk_69 / 2;
if ((super->frameSpriteSettings & 1)) {
SetExtraSpriteFrame(super, 0, frames + 0x1c);
} else {
SetExtraSpriteFrame(super, 0, 0xff);
}
SetExtraSpriteFrame(super, 1, super->frameIndex);
SetSpriteSubEntryOffsetData1(super, 1, 0);
sub_0807000C(super);
} else {
frames = super->frame;
if (frames != 0xff) {
frames &= ~0x80;
}
if ((super->frameSpriteSettings & 1) == 0) {
frames = 0xff;
}
SetExtraSpriteFrame(super, 0, frames);
SetExtraSpriteFrame(super, 1, super->frameIndex);
SetSpriteSubEntryOffsetData1(super, 1, 0);
sub_0807000C(super);
}
}
void sub_0806AEA8(TownMinishEntity* this) {
int old = this->unk_82;
this->unk_82 &= ~0x20;
if (old & 0x20) {
GravityUpdate(super, Q_8_8(64.0));
}
HandleEntity0x82Actions(super);
this->unk_82 = old;
}
void sub_0806AED8(TownMinishEntity* this) {
super->timer = 0;
sub_0806AEE4(this);
}
void sub_0806AEE4(TownMinishEntity* this) {
int index;
const u8* idx3;
u8 tmp1, tmp2;
if (super->timer) {
super->timer--;
} else {
super->timer = 2;
index = GetFacingDirectionInRectRadius(super, 0x20, 0x20);
if (index < 0) {
int state = this->unk_6a;
super->animationState = state * 2;
index = state * 8;
}
idx3 = gUnk_081125F4[super->animationState / 2][index >> 1];
tmp1 = idx3[0];
tmp2 = idx3[1];
if (tmp2 & 0x80) {
super->animationState = GetAnimationStateForDirection8(index);
}
tmp2 &= ~0x80;
super->frame = tmp1;
super->frameIndex = tmp2;
super->frameSpriteSettings = 1;
super->animIndex = 0;
super->frameDuration = 0xff;
}
}
void sub_0806AF60(Entity* this, ScriptExecutionContext* context) {
InitializeAnimation(this, context->intVariable + (this->animationState / 2));
}
void sub_0806AF70(Entity* this, ScriptExecutionContext* context) {
this->zVelocity = Q_16_16(2.25);
}
void sub_0806AF78(Entity* this, ScriptExecutionContext* context) {
GravityUpdate(this, Q_8_8(24.0));
if (0 <= this->z.WORD && this->zVelocity <= 0) {
this->z.WORD = 0;
sub_0806AF70(this, context);
}
}
void sub_0806AFA0(Entity* this) {
if (sub_0806ED78(this)) {
LinearMoveAngle(this, -this->speed, this->direction);
}
}
void sub_0806AFBC(Entity* this, ScriptExecutionContext* context) {
//! @bug sub_0806B004 uses context but ShowNPCDialogue doesn't pass it.
// In fact r1 contains sub_0806B004's address.
static const Dialog dialogs[][8] = {
{ { 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B004 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B004 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B004 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B004 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B004 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B004 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B004 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B004 } } },
{ { 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B064 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B064 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B064 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B064 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B064 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B064 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B064 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B064 } } },
{ { ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x0a), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x04) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x0a), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x04) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x0a), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x04) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x0a), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x04) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x0a), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x04) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x0a), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x04) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x0a), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x04) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x0a), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x04) } } },
{ { ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x07), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x01) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x07), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x01) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x07), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x01) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x07), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x01) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x07), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x01) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x07), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x01) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x07), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x01) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x07), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x01) } } },
{ { ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x08), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x02) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x08), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x02) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x08), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x02) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x08), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x02) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x08), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x02) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x08), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x02) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x08), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x02) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x08), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x02) } } },
{ { 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x5) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x5) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x5) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_HAGEN, 0xa), TEXT_INDEX(TEXT_HAGEN, 0x5) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x5) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x5) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x5) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x5) } } },
{ { 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x6) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x6) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x6) } },
{ ITEM_FLIPPERS,
DIALOG_INVENTORY,
DIALOG_CHECK_FLAG,
1,
{ TEXT_INDEX(TEXT_HAGEN, 0xb), TEXT_INDEX(TEXT_HAGEN, 0x6) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x6) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x6) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x6) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_HAGEN, 0x6) } } },
{ { 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } } },
{ { 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B098 } } },
{ { 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B0E0 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B0E0 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B0E0 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B0E0 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B0E0 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B0E0 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B0E0 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B0E0 } } },
{ { 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B134 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B134 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B134 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B134 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B134 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B134 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B134 } },
{ 0x0, 0x0, DIALOG_CALL_FUNC, 0, { .func = (EntityActionPtr)sub_0806B134 } } },
{ { 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN8, 0x2f) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN8, 0x2f) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN8, 0x2f) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN8, 0x2f) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN8, 0x30) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN8, 0x31) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN8, 0x32) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN8, 0x33) } } },
{ { 0x0,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_CAFE, 0x15), TEXT_INDEX(TEXT_CAFE, 0x14) } },
{ 0x0,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_CAFE, 0x15), TEXT_INDEX(TEXT_CAFE, 0x14) } },
{ 0x0,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_CAFE, 0x15), TEXT_INDEX(TEXT_CAFE, 0x14) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_CAFE, 0x22) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_CAFE, 0x2e) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_CAFE, 0x3a) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_CAFE, 0x3a) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_CAFE, 0x3a) } } },
{ { 0x1,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_CAFE, 0x17), TEXT_INDEX(TEXT_CAFE, 0x16) } },
{ 0x1,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_CAFE, 0x17), TEXT_INDEX(TEXT_CAFE, 0x16) } },
{ 0x1,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_CAFE, 0x17), TEXT_INDEX(TEXT_CAFE, 0x16) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_CAFE, 0x23) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_CAFE, 0x2f) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_CAFE, 0x3b) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_CAFE, 0x3b) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_CAFE, 0x3b) } } },
{ { 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0xd) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0xd) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0xd) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0xd) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x11) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x11) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x15) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x15) } } },
{ { 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0xe) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0xe) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0xe) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0xe) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x12) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x12) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x16) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x16) } } },
{ { 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0xf) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0xf) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0xf) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0xf) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x13) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x13) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x17) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x17) } } },
{ { 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x10) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x10) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x10) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x10) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x14) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x14) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x18) } },
{ 0x0, 0x0, DIALOG_NORMAL, 1, { 0x0, TEXT_INDEX(TEXT_TOWN_MINISH2, 0x18) } } },
{ { 0x0,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x26), TEXT_INDEX(TEXT_TOWN8, 0x25) } },
{ 0x0,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x26), TEXT_INDEX(TEXT_TOWN8, 0x25) } },
{ 0x0,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x26), TEXT_INDEX(TEXT_TOWN8, 0x25) } },
{ 0x0,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x26), TEXT_INDEX(TEXT_TOWN8, 0x25) } },
{ 0x0,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x26), TEXT_INDEX(TEXT_TOWN8, 0x25) } },
{ 0x0,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x26), TEXT_INDEX(TEXT_TOWN8, 0x25) } },
{ 0x0,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x26), TEXT_INDEX(TEXT_TOWN8, 0x25) } },
{ 0x0,
DIALOG_ROOM_FLAG,
DIALOG_TOGGLE_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x26), TEXT_INDEX(TEXT_TOWN8, 0x25) } } },
{ { 0x9c,
DIALOG_LOCAL_FLAG,
DIALOG_SET_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x28), TEXT_INDEX(TEXT_TOWN8, 0x27) } },
{ 0x9c,
DIALOG_LOCAL_FLAG,
DIALOG_SET_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x28), TEXT_INDEX(TEXT_TOWN8, 0x27) } },
{ 0x9c,
DIALOG_LOCAL_FLAG,
DIALOG_SET_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x28), TEXT_INDEX(TEXT_TOWN8, 0x27) } },
{ 0x9c,
DIALOG_LOCAL_FLAG,
DIALOG_SET_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x28), TEXT_INDEX(TEXT_TOWN8, 0x27) } },
{ 0x9c,
DIALOG_LOCAL_FLAG,
DIALOG_SET_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x28), TEXT_INDEX(TEXT_TOWN8, 0x27) } },
{ 0x9c,
DIALOG_LOCAL_FLAG,
DIALOG_SET_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x28), TEXT_INDEX(TEXT_TOWN8, 0x27) } },
{ 0x9c,
DIALOG_LOCAL_FLAG,
DIALOG_SET_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x28), TEXT_INDEX(TEXT_TOWN8, 0x27) } },
{ 0x9c,
DIALOG_LOCAL_FLAG,
DIALOG_SET_FLAG,
1,
{ TEXT_INDEX(TEXT_TOWN8, 0x28), TEXT_INDEX(TEXT_TOWN8, 0x27) } } }
};
int idx = gSave.global_progress - 2;
if (idx < 0)
idx = 0;
ShowNPCDialogue(this, &dialogs[this->type2][idx]);
}
void sub_0806AFE8(Entity* this, ScriptExecutionContext* context) {
static void (*const typeFuncs[])(Entity*, ScriptExecutionContext*) = {
sub_0806B004, sub_0806B064, sub_0806AFBC, sub_0806AFBC, sub_0806AFBC, sub_0806AFBC, sub_0806AFBC,
sub_0806B098, sub_0806B098, sub_0806B0E0, sub_0806B134, sub_0806AFBC, sub_0806AFBC, sub_0806AFBC,
sub_0806AFBC, sub_0806AFBC, sub_0806AFBC, sub_0806AFBC, sub_0806AFBC, sub_0806AFBC,
};
context->condition = 0;
typeFuncs[this->type2](this, context);
}
void sub_0806B004(Entity* this, ScriptExecutionContext* context) {
static const u16 messageIndices[5] = { TEXT_INDEX(TEXT_TOWN_MINISH1, 0x11), TEXT_INDEX(TEXT_TOWN_MINISH1, 0x01),
TEXT_INDEX(TEXT_TOWN_MINISH1, 0x03), TEXT_INDEX(TEXT_TOWN_MINISH1, 0x05),
TEXT_INDEX(TEXT_TOWN_MINISH1, 0x13) };
int idx = 0;
if (CheckGlobalFlag(MIZUKAKI_START)) {
if (CheckLocalFlag(MIZUKAKI_BOOK_ALLBACK)) {
if (GetInventoryValue(ITEM_FLIPPERS) == 0) {
idx = 3;
if (CheckLocalFlag(KHOUSE51_00) == 0) {
idx = 2;
context->condition = 1;
SetLocalFlag(KHOUSE51_00);
}
} else {
idx = 4;
}
} else {
idx = 1;
SetLocalFlag(MIZUKAKI_KOBITO);
}
}
MessageNoOverlap(messageIndices[idx], this);
}
void sub_0806B064(Entity* this, ScriptExecutionContext* context) {
static const u16 messageIndices[3] = {
TEXT_INDEX(TEXT_TOWN_MINISH1, 0x9),
TEXT_INDEX(TEXT_TOWN_MINISH1, 0xb),
TEXT_INDEX(TEXT_TOWN_MINISH1, 0xc),
};
int idx = 0;
if (CheckGlobalFlag(MIZUKAKI_START)) {
idx = 1;
if (CheckLocalFlag(0x73)) {
idx = 2;
}
}
MessageNoOverlap(messageIndices[idx], this);
}
void sub_0806B098(Entity* this, ScriptExecutionContext* context) {
static const u16 messageIndices[][3] = {
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x1f), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x20),
TEXT_INDEX(TEXT_TOWN_MINISH2, 0x21) },
{ TEXT_INDEX(TEXT_TOWN_MINISH2, 0x22), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x23),
TEXT_INDEX(TEXT_TOWN_MINISH2, 0x24) },
};
int idx = 2;
if (GetInventoryValue(ITEM_FLIPPERS) == 0) {
idx = 1;
if (CheckGlobalFlag(MIZUKAKI_START)) {
if (!CheckGlobalFlag(MIZUKAKI_HARIFALL)) {
idx = 0;
}
}
}
MessageNoOverlap(messageIndices[this->type2 - 7][idx], this);
}
void sub_0806B0E0(Entity* this, ScriptExecutionContext* context) {
static const u16 gUnk_08112C5C[2] = { TEXT_INDEX(TEXT_TOWN_MINISH2, 0x25), TEXT_INDEX(TEXT_TOWN_MINISH2, 0x26) };
int idx = 0;
// Checks if the dust is gone at these four tiles.
if (GetActTileAtRoomCoords(56, 184, 1) == ACT_TILE_87 && GetActTileAtRoomCoords(72, 184, 1) == ACT_TILE_87 &&
GetActTileAtRoomCoords(56, 200, 1) == ACT_TILE_87 && GetActTileAtRoomCoords(72, 200, 1) == ACT_TILE_87) {
idx = 1;
}
MessageNoOverlap(gUnk_08112C5C[idx], this);
}
void sub_0806B134(Entity* this, ScriptExecutionContext* context) {
static const u16 gUnk_08112C60[4] = { TEXT_INDEX(TEXT_DR_LEFT, 0xb), TEXT_INDEX(TEXT_DR_LEFT, 0xc),
TEXT_INDEX(TEXT_DR_LEFT, 0xd), TEXT_INDEX(TEXT_DR_LEFT, 0xe) };
int idx;
if (GetInventoryValue(ITEM_POWER_BRACELETS)) {
idx = 2;
if (CheckLocalFlag(KHOUSE42_00) == 0) {
idx = 1;
SetLocalFlag(KHOUSE42_00);
}
} else {
idx = 0;
SetGlobalFlag(POWERGLOVE_HINT);
}
if (5 < gSave.global_progress) {
idx = 3;
}
MessageNoOverlap(gUnk_08112C60[idx], this);
}
void TownMinish_Fusion(Entity* this) {
if (this->action == 0) {
if (LoadExtraSpriteData(this, gUnk_08112674[this->type])) {
this->action++;
this->spriteSettings.draw = 1;
InitializeAnimation(this, 6);
}
} else {
GetNextFrame(this);
}
}