Shipwright/soh/src/overlays/actors/ovl_Bg_Spot09_Obj/z_bg_spot09_obj.c

183 lines
5.4 KiB
C

/*
* File: z_bg_spot09_obj.c
* Overlay: ovl_Bg_Spot09_Obj
* Description:
*/
#include "z_bg_spot09_obj.h"
#include "objects/object_spot09_obj/object_spot09_obj.h"
#define FLAGS 0
void BgSpot09Obj_Init(Actor* thisx, GlobalContext* globalCtx);
void BgSpot09Obj_Destroy(Actor* thisx, GlobalContext* globalCtx);
void BgSpot09Obj_Update(Actor* thisx, GlobalContext* globalCtx);
void BgSpot09Obj_Draw(Actor* thisx, GlobalContext* globalCtx);
s32 func_808B1AE0(BgSpot09Obj* this, GlobalContext* globalCtx);
s32 func_808B1BA0(BgSpot09Obj* this, GlobalContext* globalCtx);
s32 func_808B1BEC(BgSpot09Obj* this, GlobalContext* globalCtx);
const ActorInit Bg_Spot09_Obj_InitVars = {
ACTOR_BG_SPOT09_OBJ,
ACTORCAT_BG,
FLAGS,
OBJECT_SPOT09_OBJ,
sizeof(BgSpot09Obj),
(ActorFunc)BgSpot09Obj_Init,
(ActorFunc)BgSpot09Obj_Destroy,
(ActorFunc)BgSpot09Obj_Update,
(ActorFunc)BgSpot09Obj_Draw,
NULL,
};
static CollisionHeader* D_808B1F90[] = {
NULL, &gValleyObjects1Col, &gValleyObjects2Col, &gValleyObjects3Col, &gValleyObjects4Col,
};
static s32 (*D_808B1FA4[])(BgSpot09Obj* this, GlobalContext* globalCtx) = {
func_808B1BEC,
func_808B1AE0,
func_808B1BA0,
};
static InitChainEntry sInitChain1[] = {
ICHAIN_F32(uncullZoneForward, 7200, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneScale, 3000, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 7200, ICHAIN_STOP),
};
static InitChainEntry sInitChain2[] = {
ICHAIN_F32(uncullZoneForward, 7200, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneScale, 800, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 1500, ICHAIN_STOP),
};
static Gfx* sDLists[] = {
gValleyBridgeSidesDL, gValleyBrokenBridgeDL, gValleyBridgeChildDL, gCarpentersTentDL, gValleyRepairedBridgeDL,
};
s32 func_808B1AE0(BgSpot09Obj* this, GlobalContext* globalCtx) {
s32 carpentersRescued;
if (gSaveContext.sceneSetupIndex >= 4) {
return this->dyna.actor.params == 0;
}
carpentersRescued = (gSaveContext.eventChkInf[9] & 0xF) == 0xF;
if (LINK_AGE_IN_YEARS == YEARS_ADULT) {
switch (this->dyna.actor.params) {
case 0:
return 0;
case 1:
return !carpentersRescued;
case 4:
return carpentersRescued;
case 3:
return 1;
}
} else {
return this->dyna.actor.params == 2;
}
return 0;
}
s32 func_808B1BA0(BgSpot09Obj* this, GlobalContext* globalCtx) {
if (this->dyna.actor.params == 3) {
Actor_SetScale(&this->dyna.actor, 0.1f);
} else {
Actor_SetScale(&this->dyna.actor, 1.0f);
}
return 1;
}
s32 func_808B1BEC(BgSpot09Obj* this, GlobalContext* globalCtx) {
s32 pad;
CollisionHeader* colHeader = NULL;
s32 pad2[2];
if (D_808B1F90[this->dyna.actor.params] != NULL) {
DynaPolyActor_Init(&this->dyna, DPM_UNK);
CollisionHeader_GetVirtual(D_808B1F90[this->dyna.actor.params], &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(globalCtx, &globalCtx->colCtx.dyna, &this->dyna.actor, colHeader);
}
return true;
}
s32 func_808B1C70(BgSpot09Obj* this, GlobalContext* globalCtx) {
s32 i;
for (i = 0; i < ARRAY_COUNT(D_808B1FA4); i++) {
if (!D_808B1FA4[i](this, globalCtx)) {
return false;
}
}
return true;
}
s32 func_808B1CEC(BgSpot09Obj* this, GlobalContext* globalCtx) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain1);
return true;
}
s32 func_808B1D18(BgSpot09Obj* this, GlobalContext* globalCtx) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain2);
return true;
}
s32 func_808B1D44(BgSpot09Obj* this, GlobalContext* globalCtx) {
if (this->dyna.actor.params == 3) {
return func_808B1D18(this, globalCtx);
} else {
return func_808B1CEC(this, globalCtx);
}
}
void BgSpot09Obj_Init(Actor* thisx, GlobalContext* globalCtx) {
BgSpot09Obj* this = (BgSpot09Obj*)thisx;
osSyncPrintf("Spot09 Object [arg_data : 0x%04x](大工救出フラグ 0x%x)\n", this->dyna.actor.params,
gSaveContext.eventChkInf[9] & 0xF);
this->dyna.actor.params &= 0xFF;
if ((this->dyna.actor.params < 0) || (this->dyna.actor.params >= 5)) {
osSyncPrintf("Error : Spot 09 object の arg_data が判別出来ない(%s %d)(arg_data 0x%04x)\n",
__FILE__, __LINE__, this->dyna.actor.params);
}
if (!func_808B1C70(this, globalCtx)) {
Actor_Kill(&this->dyna.actor);
} else if (!func_808B1D44(this, globalCtx)) {
Actor_Kill(&this->dyna.actor);
}
}
void BgSpot09Obj_Destroy(Actor* thisx, GlobalContext* globalCtx) {
DynaCollisionContext* dynaColCtx = &globalCtx->colCtx.dyna;
BgSpot09Obj* this = (BgSpot09Obj*)thisx;
if (this->dyna.actor.params != 0) {
DynaPoly_DeleteBgActor(globalCtx, dynaColCtx, this->dyna.bgId);
}
}
void BgSpot09Obj_Update(Actor* thisx, GlobalContext* globalCtx) {
}
void BgSpot09Obj_Draw(Actor* thisx, GlobalContext* globalCtx) {
Gfx_DrawDListOpa(globalCtx, sDLists[thisx->params]);
if (thisx->params == 3) {
OPEN_DISPS(globalCtx->state.gfxCtx);
func_80093D84(globalCtx->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gCarpentersTentEntranceDL);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
}