mirror of
https://github.com/zeldaret/tmc
synced 2026-06-11 05:08:41 -04:00
176 lines
4.6 KiB
C
176 lines
4.6 KiB
C
#include "effects.h"
|
|
#include "entity.h"
|
|
#include "functions.h"
|
|
#include "kinstone.h"
|
|
#include "message.h"
|
|
#include "npc.h"
|
|
|
|
void sub_08069310(Entity*);
|
|
void sub_08069328(Entity*);
|
|
void sub_08069390(Entity*);
|
|
void sub_080693C4(Entity*);
|
|
void sub_080693D0(Entity*);
|
|
|
|
void Goron(Entity* this) {
|
|
static void (*const actionFuncs[])(Entity*) = {
|
|
sub_08069310,
|
|
sub_08069328,
|
|
sub_08069390,
|
|
};
|
|
static void (*const scriptedActionFuncs[])(Entity*) = {
|
|
sub_080693C4,
|
|
sub_080693D0,
|
|
};
|
|
if (this->flags & ENT_SCRIPTED) {
|
|
scriptedActionFuncs[this->action](this);
|
|
} else {
|
|
actionFuncs[this->action](this);
|
|
sub_0806ED78(this);
|
|
}
|
|
}
|
|
|
|
void sub_08069310(Entity* this) {
|
|
AddInteractableWhenBigObject(this);
|
|
this->action = 1;
|
|
InitAnimationForceUpdate(this, 2);
|
|
}
|
|
|
|
void sub_08069328(Entity* this) {
|
|
if (++this->subtimer > 16) {
|
|
int action;
|
|
|
|
this->subtimer = 0;
|
|
action = GetAnimationStateInRectRadius(this, 40, 40);
|
|
if (action >= 0) {
|
|
this->animationState = action;
|
|
}
|
|
}
|
|
if (this->animIndex != this->animationState) {
|
|
InitAnimationForceUpdate(this, this->animationState);
|
|
}
|
|
if (this->interactType != 0) {
|
|
this->action = 2;
|
|
RequestPriority(this);
|
|
InitAnimationForceUpdate(this, 8);
|
|
MessageFromTarget(this->timer + TEXT_INDEX(TEXT_MINISH2, 0x0));
|
|
}
|
|
}
|
|
|
|
void sub_08069390(Entity* this) {
|
|
UpdateAnimationSingleFrame(this);
|
|
if ((gMessage.doTextBox & 0x7F) == 0) {
|
|
this->action = 1;
|
|
this->interactType = 0;
|
|
RevokePriority(this);
|
|
InitAnimationForceUpdate(this, this->animationState);
|
|
}
|
|
}
|
|
|
|
void sub_080693C4(Entity* this) {
|
|
this->action = 1;
|
|
sub_0807DD50(this);
|
|
}
|
|
|
|
void sub_08069428(Entity* this, s32 offsetX, bool32 createFx65);
|
|
|
|
void sub_080693D0(Entity* this) {
|
|
sub_0807DD94(this, NULL);
|
|
if (this->animIndex == 8) {
|
|
bool32 createFx65 = (this->field_0x82.HWORD & 0xF) != 0;
|
|
|
|
if (this->frame == 1) {
|
|
this->frame = 0;
|
|
sub_08069428(this, Q_16_16(-8.0), createFx65);
|
|
}
|
|
if (this->frame == 2) {
|
|
this->frame = 0;
|
|
sub_08069428(this, Q_16_16(8.0), createFx65);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_08069428(Entity* this, s32 offsetX, bool32 createFx65) {
|
|
Entity* fx = CreateFx(this, FX_ROCK, 0);
|
|
if (fx) {
|
|
PositionRelative(this, fx, offsetX, Q_16_16(-16.0));
|
|
SortEntityAbove(this, fx);
|
|
}
|
|
if (createFx65 != 0) {
|
|
fx = CreateFx(this, FX_REFLECT4, 0);
|
|
if (fx) {
|
|
PositionRelative(this, fx, offsetX, Q_16_16(-16.0));
|
|
SortEntityAbove(this, fx);
|
|
}
|
|
}
|
|
}
|
|
|
|
u32 sub_08069480(Entity* this) {
|
|
return (u8)GetFusionToOffer(this);
|
|
}
|
|
|
|
void sub_0806948C(Entity* this, ScriptExecutionContext* context) {
|
|
context->condition = CheckKinstoneFused((u8)sub_08069480(this));
|
|
gActiveScriptInfo.flags |= 1;
|
|
}
|
|
|
|
void Goron_MakeInteractable(Entity* this) {
|
|
u32 kinstone = (u8)sub_08069480(this);
|
|
if (CheckKinstoneFused(kinstone)) {
|
|
AddInteractableWhenBigObject(this);
|
|
} else {
|
|
AddInteractableWhenBigFuser(this, kinstone);
|
|
}
|
|
}
|
|
|
|
void sub_080694D8(Entity* this) {
|
|
static const Dialog gUnk_08111A94[] = {
|
|
{ 0x2f,
|
|
DIALOG_KINSTONE,
|
|
DIALOG_CHECK_FLAG,
|
|
1,
|
|
{ TEXT_INDEX(TEXT_TINGLE, 0x13), TEXT_INDEX(TEXT_TINGLE, 0x0e) } },
|
|
{ 0x2f,
|
|
DIALOG_KINSTONE,
|
|
DIALOG_CHECK_FLAG,
|
|
1,
|
|
{ TEXT_INDEX(TEXT_TINGLE, 0x14), TEXT_INDEX(TEXT_TINGLE, 0x0f) } },
|
|
{ 0x2f,
|
|
DIALOG_KINSTONE,
|
|
DIALOG_CHECK_FLAG,
|
|
1,
|
|
{ TEXT_INDEX(TEXT_TINGLE, 0x15), TEXT_INDEX(TEXT_TINGLE, 0x10) } },
|
|
{ 0x2f,
|
|
DIALOG_KINSTONE,
|
|
DIALOG_CHECK_FLAG,
|
|
1,
|
|
{ TEXT_INDEX(TEXT_TINGLE, 0x16), TEXT_INDEX(TEXT_TINGLE, 0x11) } },
|
|
{ 0x2f,
|
|
DIALOG_KINSTONE,
|
|
DIALOG_CHECK_FLAG,
|
|
1,
|
|
{ TEXT_INDEX(TEXT_TINGLE, 0x17), TEXT_INDEX(TEXT_TINGLE, 0x12) } },
|
|
{ 0, 0, DIALOG_NORMAL, 1, { 0, TEXT_INDEX(TEXT_TINGLE, 0x18) } },
|
|
};
|
|
ShowNPCDialogue(this, &gUnk_08111A94[this->type]);
|
|
}
|
|
|
|
void sub_080694EC(Entity* this) {
|
|
u32 anim;
|
|
this->animationState = 4;
|
|
anim = 2;
|
|
if (!CheckKinstoneFused(KINSTONE_2F))
|
|
anim = 8;
|
|
InitAnimationForceUpdate(this, anim);
|
|
this->field_0x80.HWORD = anim;
|
|
}
|
|
|
|
void Goron_Fusion(Entity* this) {
|
|
if (this->action == 0) {
|
|
this->action++;
|
|
this->spriteSettings.draw = 1;
|
|
InitAnimationForceUpdate(this, 2);
|
|
} else {
|
|
UpdateAnimationSingleFrame(this);
|
|
}
|
|
}
|