2022-03-21 21:51:23 -04:00
|
|
|
/*
|
|
|
|
* File: z_bg_spot01_idohashira.c
|
|
|
|
* Overlay: Bg_Spot01_Idohashira
|
|
|
|
* Description: Wooden beam above well in Kakariko Village
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "z_bg_spot01_idohashira.h"
|
|
|
|
#include "objects/object_spot01_objects/object_spot01_objects.h"
|
|
|
|
#include "vt.h"
|
|
|
|
|
|
|
|
#define FLAGS ACTOR_FLAG_4
|
|
|
|
|
|
|
|
void BgSpot01Idohashira_Init(Actor* thisx, GlobalContext* globalCtx);
|
|
|
|
void BgSpot01Idohashira_Destroy(Actor* thisx, GlobalContext* globalCtx);
|
|
|
|
void BgSpot01Idohashira_Update(Actor* thisx, GlobalContext* globalCtx);
|
|
|
|
void BgSpot01Idohashira_Draw(Actor* thisx, GlobalContext* globalCtx);
|
|
|
|
|
|
|
|
void func_808AB504(BgSpot01Idohashira* this, GlobalContext* globalCtx);
|
|
|
|
void func_808AB510(BgSpot01Idohashira* this, GlobalContext* globalCtx);
|
|
|
|
void func_808AB530(BgSpot01Idohashira* this, GlobalContext* globalCtx);
|
|
|
|
void func_808AB570(BgSpot01Idohashira* this, GlobalContext* globalCtx);
|
|
|
|
void func_808AB700(BgSpot01Idohashira* this, GlobalContext* globalCtx);
|
|
|
|
|
|
|
|
static BgSpot01IdohashiraActionFunc sActionFuncs[] = {
|
|
|
|
func_808AB504,
|
|
|
|
func_808AB510,
|
|
|
|
func_808AB530,
|
|
|
|
func_808AB570,
|
|
|
|
};
|
|
|
|
|
|
|
|
static InitChainEntry sInitChain[] = {
|
|
|
|
ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
|
|
|
|
};
|
|
|
|
|
|
|
|
static BgSpot01IdohashiraDrawFunc sDrawFuncs[] = {
|
|
|
|
func_808AB700,
|
|
|
|
};
|
|
|
|
|
|
|
|
const ActorInit Bg_Spot01_Idohashira_InitVars = {
|
|
|
|
ACTOR_BG_SPOT01_IDOHASHIRA,
|
|
|
|
ACTORCAT_PROP,
|
|
|
|
FLAGS,
|
|
|
|
OBJECT_SPOT01_OBJECTS,
|
|
|
|
sizeof(BgSpot01Idohashira),
|
|
|
|
(ActorFunc)BgSpot01Idohashira_Init,
|
|
|
|
(ActorFunc)BgSpot01Idohashira_Destroy,
|
|
|
|
(ActorFunc)BgSpot01Idohashira_Update,
|
|
|
|
(ActorFunc)BgSpot01Idohashira_Draw,
|
|
|
|
NULL,
|
|
|
|
};
|
|
|
|
|
|
|
|
void BgSpot01Idohashira_PlayBreakSfx1(BgSpot01Idohashira* this) {
|
|
|
|
func_80078914(&this->dyna.actor.projectedPos, NA_SE_EV_BOX_BREAK);
|
|
|
|
}
|
|
|
|
|
|
|
|
void BgSpot01Idohashira_PlayBreakSfx2(BgSpot01Idohashira* this, GlobalContext* globalCtx) {
|
|
|
|
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->dyna.actor.world.pos, 60, NA_SE_EV_WOODBOX_BREAK);
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AAD3C(GlobalContext* globalCtx, Vec3f* vec, u32 arg2) {
|
|
|
|
EffectSparkInit effect;
|
|
|
|
s32 sp24;
|
|
|
|
|
|
|
|
effect.position.x = vec->x;
|
|
|
|
effect.position.y = vec->y;
|
|
|
|
effect.position.z = vec->z;
|
|
|
|
effect.speed = 8.0f;
|
|
|
|
effect.gravity = -1.0f;
|
|
|
|
effect.uDiv = arg2;
|
|
|
|
effect.vDiv = arg2;
|
|
|
|
effect.colorStart[0].r = 0;
|
|
|
|
effect.colorStart[0].g = 0;
|
|
|
|
effect.colorStart[0].b = 0;
|
|
|
|
effect.colorStart[0].a = 255;
|
|
|
|
effect.colorStart[1].r = 0;
|
|
|
|
effect.colorStart[1].g = 0;
|
|
|
|
effect.colorStart[1].b = 0;
|
|
|
|
effect.colorStart[1].a = 255;
|
|
|
|
effect.colorStart[2].r = 0;
|
|
|
|
effect.colorStart[2].g = 0;
|
|
|
|
effect.colorStart[2].b = 0;
|
|
|
|
effect.colorStart[2].a = 255;
|
|
|
|
effect.colorStart[3].r = 0;
|
|
|
|
effect.colorStart[3].g = 0;
|
|
|
|
effect.colorStart[3].b = 0;
|
|
|
|
effect.colorStart[3].a = 255;
|
|
|
|
effect.colorEnd[0].r = 0;
|
|
|
|
effect.colorEnd[0].g = 0;
|
|
|
|
effect.colorEnd[0].b = 0;
|
|
|
|
effect.colorEnd[0].a = 0;
|
|
|
|
effect.colorEnd[1].r = 0;
|
|
|
|
effect.colorEnd[1].g = 0;
|
|
|
|
effect.colorEnd[1].b = 0;
|
|
|
|
effect.colorEnd[1].a = 0;
|
|
|
|
effect.colorEnd[2].r = 0;
|
|
|
|
effect.colorEnd[2].g = 0;
|
|
|
|
effect.colorEnd[2].b = 0;
|
|
|
|
effect.colorEnd[2].a = 0;
|
|
|
|
effect.colorEnd[3].r = 0;
|
|
|
|
effect.colorEnd[3].g = 0;
|
|
|
|
effect.colorEnd[3].b = 0;
|
|
|
|
effect.colorEnd[3].a = 0;
|
|
|
|
effect.timer = 0;
|
|
|
|
effect.duration = 32;
|
|
|
|
|
|
|
|
Effect_Add(globalCtx, &sp24, EFFECT_SPARK, 0, 1, &effect);
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AAE6C(BgSpot01Idohashira* this, GlobalContext* globalCtx) {
|
|
|
|
s32 pad;
|
|
|
|
Vec3f sp30 = this->dyna.actor.world.pos;
|
|
|
|
|
|
|
|
sp30.y += kREG(15);
|
|
|
|
func_80033480(globalCtx, &sp30, kREG(11) + 350.0f, kREG(12) + 5, kREG(13) + 0x7D0, kREG(14) + 0x320, 0);
|
|
|
|
func_808AAD3C(globalCtx, &sp30, 5);
|
|
|
|
BgSpot01Idohashira_PlayBreakSfx2(this, globalCtx);
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AAF34(BgSpot01Idohashira* this, GlobalContext* globalCtx) {
|
|
|
|
s32 pad[2];
|
|
|
|
Vec3f dest;
|
|
|
|
Vec3f src;
|
|
|
|
|
|
|
|
if (this->unk_170 != 0) {
|
|
|
|
src.x = kREG(20) + 1300.0f;
|
|
|
|
src.y = kREG(21) + 200.0f;
|
|
|
|
src.z = 0.0f;
|
|
|
|
Matrix_MultVec3f(&src, &dest);
|
|
|
|
func_80033480(globalCtx, &dest, kREG(16) + 80.0f, kREG(17) + 10, kREG(18) + 1000, kREG(19), 0);
|
|
|
|
func_808AAD3C(globalCtx, &dest, 3);
|
|
|
|
src.x = -(kREG(20) + 1300.0f);
|
|
|
|
src.y = kREG(21) + 200.0f;
|
|
|
|
src.z = 0.0f;
|
|
|
|
Matrix_MultVec3f(&src, &dest);
|
|
|
|
func_80033480(globalCtx, &dest, kREG(16) + 80.0f, kREG(17) + 10, kREG(18) + 1000, kREG(19), 0);
|
|
|
|
func_808AAD3C(globalCtx, &dest, 3);
|
|
|
|
this->unk_170 = 0;
|
|
|
|
BgSpot01Idohashira_PlayBreakSfx1(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void BgSpot01Idohashira_Destroy(Actor* thisx, GlobalContext* globalCtx) {
|
|
|
|
BgSpot01Idohashira* this = (BgSpot01Idohashira*)thisx;
|
|
|
|
|
|
|
|
DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
|
|
|
|
}
|
|
|
|
|
|
|
|
s32 BgSpot01Idohashira_NotInCsMode(GlobalContext* globalCtx) {
|
|
|
|
if (globalCtx->csCtx.state == CS_STATE_IDLE) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
CsCmdActorAction* BgSpot01Idohashira_GetNpcAction(GlobalContext* globalCtx, s32 actionIdx) {
|
|
|
|
s32 pad[2];
|
|
|
|
CsCmdActorAction* npcAction = NULL;
|
|
|
|
|
|
|
|
if (!BgSpot01Idohashira_NotInCsMode(globalCtx)) {
|
|
|
|
npcAction = globalCtx->csCtx.npcActions[actionIdx];
|
|
|
|
}
|
|
|
|
return npcAction;
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AB18C(BgSpot01Idohashira* this) {
|
|
|
|
this->dyna.actor.shape.rot.x += kREG(6);
|
|
|
|
this->dyna.actor.shape.rot.y += (s16)(kREG(7) + 0x3E8);
|
|
|
|
this->dyna.actor.shape.rot.z += (s16)(kREG(8) + 0x7D0);
|
|
|
|
}
|
|
|
|
|
|
|
|
f32 func_808AB1DC(f32 arg0, f32 arg1, u16 arg2, u16 arg3, u16 arg4) {
|
|
|
|
f32 temp_f12;
|
|
|
|
f32 regFloat;
|
|
|
|
f32 diff23;
|
|
|
|
f32 diff43;
|
|
|
|
|
|
|
|
diff23 = arg2 - arg3;
|
|
|
|
if (diff23 != 0.0f) {
|
|
|
|
regFloat = kREG(9) + 30.0f;
|
|
|
|
diff43 = arg4 - arg3;
|
|
|
|
temp_f12 = regFloat * diff43;
|
|
|
|
return (((((arg1 - arg0) - temp_f12) / SQ(diff23)) * diff43) * diff43) + temp_f12;
|
|
|
|
}
|
|
|
|
osSyncPrintf(VT_FGCOL(RED) "Bg_Spot01_Idohashira_Get_FreeFallで割り算出来ない!!!!!!!!!!!!!!\n" VT_RST);
|
|
|
|
return 0.0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
s32 func_808AB29C(BgSpot01Idohashira* this, GlobalContext* globalCtx) {
|
|
|
|
CsCmdActorAction* npcAction;
|
|
|
|
Vec3f* thisPos;
|
|
|
|
f32 endX;
|
|
|
|
f32 temp_f0;
|
|
|
|
s32 pad2;
|
|
|
|
Vec3f initPos;
|
|
|
|
f32 endZ;
|
|
|
|
f32 tempY;
|
|
|
|
f32 tempZ;
|
|
|
|
|
|
|
|
npcAction = BgSpot01Idohashira_GetNpcAction(globalCtx, 2);
|
|
|
|
if (npcAction != NULL) {
|
|
|
|
temp_f0 = Environment_LerpWeight(npcAction->endFrame, npcAction->startFrame, globalCtx->csCtx.frames);
|
|
|
|
initPos = this->dyna.actor.home.pos;
|
|
|
|
endX = npcAction->endPos.x;
|
|
|
|
tempY = ((kREG(10) + 1100.0f) / 10.0f) + npcAction->endPos.y;
|
|
|
|
endZ = npcAction->endPos.z;
|
|
|
|
thisPos = &this->dyna.actor.world.pos;
|
|
|
|
thisPos->x = ((endX - initPos.x) * temp_f0) + initPos.x;
|
|
|
|
thisPos->y =
|
|
|
|
func_808AB1DC(initPos.y, tempY, npcAction->endFrame, npcAction->startFrame, globalCtx->csCtx.frames) +
|
|
|
|
initPos.y;
|
|
|
|
thisPos->z = ((endZ - initPos.z) * temp_f0) + initPos.z;
|
|
|
|
|
|
|
|
if (temp_f0 >= 1.0f) {
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AB3E8(BgSpot01Idohashira* this) {
|
|
|
|
this->action = 1;
|
|
|
|
this->drawConfig = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AB3F8(BgSpot01Idohashira* this, GlobalContext* globalCtx) {
|
|
|
|
this->action = 2;
|
|
|
|
this->drawConfig = 0;
|
|
|
|
this->unk_170 = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AB414(BgSpot01Idohashira* this, GlobalContext* globalCtx) {
|
|
|
|
func_808AAE6C(this, globalCtx);
|
|
|
|
this->action = 3;
|
|
|
|
this->drawConfig = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AB444(BgSpot01Idohashira* this, GlobalContext* globalCtx) {
|
|
|
|
CsCmdActorAction* npcAction = BgSpot01Idohashira_GetNpcAction(globalCtx, 2);
|
|
|
|
u32 action;
|
|
|
|
u32 currentNpcAction;
|
|
|
|
|
|
|
|
if (npcAction != NULL) {
|
|
|
|
action = npcAction->action;
|
|
|
|
currentNpcAction = this->npcAction;
|
|
|
|
if (action != currentNpcAction) {
|
|
|
|
switch (action) {
|
|
|
|
case 1:
|
|
|
|
func_808AB3E8(this);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
func_808AB3F8(this, globalCtx);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
Actor_Kill(&this->dyna.actor);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
osSyncPrintf("Bg_Spot01_Idohashira_Check_DemoMode:そんな動作は無い!!!!!!!!\n");
|
|
|
|
}
|
|
|
|
this->npcAction = action;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AB504(BgSpot01Idohashira* this, GlobalContext* globalCtx) {
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AB510(BgSpot01Idohashira* this, GlobalContext* globalCtx) {
|
|
|
|
func_808AB444(this, globalCtx);
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AB530(BgSpot01Idohashira* this, GlobalContext* globalCtx) {
|
|
|
|
func_808AB18C(this);
|
|
|
|
if (func_808AB29C(this, globalCtx)) {
|
|
|
|
func_808AB414(this, globalCtx);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AB570(BgSpot01Idohashira* this, GlobalContext* globalCtx) {
|
|
|
|
func_808AB444(this, globalCtx);
|
|
|
|
}
|
|
|
|
|
|
|
|
void BgSpot01Idohashira_Update(Actor* thisx, GlobalContext* globalCtx) {
|
|
|
|
BgSpot01Idohashira* this = (BgSpot01Idohashira*)thisx;
|
|
|
|
|
|
|
|
if (this->action < 0 || this->action >= 4 || sActionFuncs[this->action] == NULL) {
|
|
|
|
osSyncPrintf(VT_FGCOL(RED) "メインモードがおかしい!!!!!!!!!!!!!!!!!!!!!!!!!\n" VT_RST);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
sActionFuncs[this->action](this, globalCtx);
|
|
|
|
}
|
|
|
|
|
|
|
|
void BgSpot01Idohashira_Init(Actor* thisx, GlobalContext* globalCtx) {
|
|
|
|
s32 pad[2];
|
|
|
|
BgSpot01Idohashira* this = (BgSpot01Idohashira*)thisx;
|
|
|
|
CollisionHeader* colHeader;
|
|
|
|
|
|
|
|
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
|
|
|
|
DynaPolyActor_Init(&this->dyna, DPM_UNK);
|
|
|
|
colHeader = NULL;
|
|
|
|
CollisionHeader_GetVirtual(&gKakarikoWellArchCol, &colHeader);
|
|
|
|
this->dyna.bgId = DynaPoly_SetBgActor(globalCtx, &globalCtx->colCtx.dyna, &this->dyna.actor, colHeader);
|
|
|
|
|
|
|
|
if (gSaveContext.sceneSetupIndex < 4) {
|
|
|
|
if ((gSaveContext.eventChkInf[5] & 0x10) && LINK_IS_ADULT) {
|
|
|
|
Actor_Kill(&this->dyna.actor);
|
|
|
|
} else {
|
|
|
|
this->action = 0;
|
|
|
|
}
|
|
|
|
} else if (gSaveContext.sceneSetupIndex == 4) {
|
|
|
|
this->action = 1;
|
|
|
|
this->dyna.actor.shape.yOffset = -(kREG(10) + 1100.0f);
|
|
|
|
} else if (gSaveContext.sceneSetupIndex == 6) {
|
|
|
|
this->action = 0;
|
|
|
|
} else {
|
|
|
|
Actor_Kill(&this->dyna.actor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_808AB700(BgSpot01Idohashira* this, GlobalContext* globalCtx) {
|
|
|
|
GraphicsContext* localGfxCtx = globalCtx->state.gfxCtx;
|
|
|
|
|
2022-07-05 19:29:34 -04:00
|
|
|
OPEN_DISPS(localGfxCtx);
|
2022-03-21 21:51:23 -04:00
|
|
|
|
|
|
|
func_80093D18(localGfxCtx);
|
|
|
|
|
2022-07-05 19:29:34 -04:00
|
|
|
gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(localGfxCtx),
|
2022-03-21 21:51:23 -04:00
|
|
|
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
|
|
func_808AAF34(this, globalCtx);
|
|
|
|
gSPDisplayList(POLY_OPA_DISP++, gKakarikoWellArchDL);
|
|
|
|
|
2022-07-05 19:29:34 -04:00
|
|
|
CLOSE_DISPS(localGfxCtx);
|
2022-03-21 21:51:23 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void BgSpot01Idohashira_Draw(Actor* thisx, GlobalContext* globalCtx) {
|
|
|
|
BgSpot01Idohashira* this = (BgSpot01Idohashira*)thisx;
|
|
|
|
|
|
|
|
if (this->drawConfig < 0 || this->drawConfig > 0 || sDrawFuncs[this->drawConfig] == NULL) {
|
|
|
|
osSyncPrintf(VT_FGCOL(RED) "描画モードがおかしい!!!!!!!!!!!!!!!!!!!!!!!!!\n" VT_RST);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
sDrawFuncs[this->drawConfig](this, globalCtx);
|
|
|
|
}
|