Shipwright/soh/src/overlays/actors/ovl_Bg_Spot18_Basket/z_bg_spot18_basket.c

458 lines
15 KiB
C
Raw Normal View History

#include "z_bg_spot18_basket.h"
#include "objects/object_spot18_obj/object_spot18_obj.h"
#include "vt.h"
#define FLAGS ACTOR_FLAG_4
void BgSpot18Basket_Init(Actor* thisx, GlobalContext* globalCtx);
void BgSpot18Basket_Destroy(Actor* thisx, GlobalContext* globalCtx);
void BgSpot18Basket_Update(Actor* thisx, GlobalContext* globalCtx);
void BgSpot18Basket_Draw(Actor* thisx, GlobalContext* globalCtx);
void BgSpot18Basket_Reset(void);
void func_808B7BCC(BgSpot18Basket* this, GlobalContext* globalCtx);
void func_808B7AEC(BgSpot18Basket* this);
void func_808B7B58(BgSpot18Basket* this);
void func_808B7BB0(BgSpot18Basket* this);
void func_808B7D38(BgSpot18Basket* this);
void func_808B7F74(BgSpot18Basket* this);
void func_808B818C(BgSpot18Basket* this);
void func_808B7AFC(BgSpot18Basket* this, GlobalContext* globalCtx);
void func_808B7B6C(BgSpot18Basket* this, GlobalContext* globalCtx);
void func_808B7D50(BgSpot18Basket* this, GlobalContext* globalCtx);
void func_808B7FC0(BgSpot18Basket* this, GlobalContext* globalCtx);
void func_808B81A0(BgSpot18Basket* this, GlobalContext* globalCtx);
const ActorInit Bg_Spot18_Basket_InitVars = {
ACTOR_BG_SPOT18_BASKET,
ACTORCAT_PROP,
FLAGS,
OBJECT_SPOT18_OBJ,
sizeof(BgSpot18Basket),
(ActorFunc)BgSpot18Basket_Init,
(ActorFunc)BgSpot18Basket_Destroy,
(ActorFunc)BgSpot18Basket_Update,
(ActorFunc)BgSpot18Basket_Draw,
(ActorResetFunc)BgSpot18Basket_Reset,
};
static ColliderJntSphElementInit sJntSphElementsInit[2] = {
{
{
ELEMTYPE_UNK0,
{ 0x00000000, 0x00, 0x00 },
{ 0x00000000, 0x00, 0x00 },
TOUCH_NONE,
BUMP_NONE,
OCELEM_ON,
},
{ 0, { { 0, 2040, 0 }, 54 }, 100 },
},
{
{
ELEMTYPE_UNK0,
{ 0x00000000, 0x00, 0x00 },
{ 0x00000008, 0x00, 0x00 },
TOUCH_NONE,
BUMP_ON,
OCELEM_NONE,
},
{ 1, { { 0, 1400, 0 }, 13 }, 100 },
},
};
static ColliderJntSphInit sJntSphInit = {
{
COLTYPE_NONE,
AT_NONE,
AC_ON | AC_TYPE_PLAYER,
OC1_ON | OC1_TYPE_PLAYER,
OC2_TYPE_2,
COLSHAPE_JNTSPH,
},
2,
sJntSphElementsInit,
};
static s16 D_808B85C8[] = { 0x8000, 0x2AAA, 0xD555, 0x0000 };
void func_808B7710(Actor* thisx, GlobalContext* globalCtx) {
BgSpot18Basket* this = (BgSpot18Basket*)thisx;
Collider_InitJntSph(globalCtx, &this->colliderJntSph);
Collider_SetJntSph(globalCtx, &this->colliderJntSph, &this->dyna.actor, &sJntSphInit, this->ColliderJntSphElements);
this->dyna.actor.colChkInfo.mass = MASS_IMMOVABLE;
}
2022-05-12 13:28:24 -04:00
s16 D_808B85D0 = 0;
void func_808B7770(BgSpot18Basket* this, GlobalContext* globalCtx, f32 arg2) {
Vec3f acceleration;
Vec3f velocity;
Vec3f position;
f32 cosValue;
s32 i;
f32 randomValue;
f32 sinValue;
s32 count;
for (i = 0, count = 2; i != count; i++) {
if (globalCtx) {}
if (!(arg2 < Rand_ZeroOne())) {
D_808B85D0 += 0x7530;
sinValue = Math_SinS(D_808B85D0);
cosValue = Math_CosS(D_808B85D0);
randomValue = (Rand_ZeroOne() * 35.0f) + 35.0f;
position.x = (randomValue * sinValue) + this->dyna.actor.world.pos.x;
position.y = this->dyna.actor.world.pos.y + 10.0f;
position.z = (randomValue * cosValue) + this->dyna.actor.world.pos.z;
velocity.x = sinValue;
velocity.y = 0.0f;
velocity.z = cosValue;
acceleration.x = 0.0f;
acceleration.y = 0.5f;
acceleration.z = 0.0f;
func_800286CC(globalCtx, &position, &velocity, &acceleration, ((Rand_ZeroOne() * 16) + 80),
((Rand_ZeroOne() * 30) + 80));
}
}
}
static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneForward, 1000, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneScale, 500, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 1000, ICHAIN_STOP),
};
void BgSpot18Basket_Init(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
BgSpot18Basket* this = (BgSpot18Basket*)thisx;
CollisionHeader* colHeader = NULL;
DynaPolyActor_Init(&this->dyna, DPM_UNK3);
func_808B7710(&this->dyna.actor, globalCtx);
CollisionHeader_GetVirtual(&gGoronCityVaseCol, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(globalCtx, &globalCtx->colCtx.dyna, &this->dyna.actor, colHeader);
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
ActorShape_Init(&this->dyna.actor.shape, 0.0f, ActorShadow_DrawCircle, 15.0f);
this->dyna.actor.home.pos.y += 0.01f;
this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y;
if (Flags_GetSwitch(globalCtx, (this->dyna.actor.params >> 8) & 0x3F)) {
func_808B7BB0(this);
return;
}
func_808B7AEC(this);
Actor_SpawnAsChild(&globalCtx->actorCtx, &this->dyna.actor, globalCtx, ACTOR_BG_SPOT18_FUTA,
this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y, this->dyna.actor.world.pos.z,
this->dyna.actor.shape.rot.x, this->dyna.actor.shape.rot.y + 0x1555,
this->dyna.actor.shape.rot.z, -1);
if (this->dyna.actor.child == NULL) {
osSyncPrintf(VT_FGCOL(RED));
osSyncPrintf(" : 変化壷蓋発生失敗(%s %d)\n", __FILE__, __LINE__);
osSyncPrintf(VT_RST);
Actor_Kill(&this->dyna.actor);
}
}
void BgSpot18Basket_Destroy(Actor* thisx, GlobalContext* globalCtx) {
BgSpot18Basket* this = (BgSpot18Basket*)thisx;
DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
Collider_DestroyJntSph(globalCtx, &this->colliderJntSph);
}
void func_808B7AEC(BgSpot18Basket* this) {
this->actionFunc = func_808B7AFC;
}
void func_808B7AFC(BgSpot18Basket* this, GlobalContext* globalCtx) {
if (Flags_GetSwitch(globalCtx, (this->dyna.actor.params >> 8) & 0x3F)) {
OnePointCutscene_Init(globalCtx, 4220, 80, &this->dyna.actor, MAIN_CAM);
func_808B7B58(this);
}
}
void func_808B7B58(BgSpot18Basket* this) {
this->actionFunc = func_808B7B6C;
this->unk_216 = 0;
}
void func_808B7B6C(BgSpot18Basket* this, GlobalContext* globalCtx) {
if (this->unk_216 > 20) {
func_808B7BB0(this);
this->dyna.actor.child->parent = NULL;
this->dyna.actor.child = NULL;
}
}
void func_808B7BB0(BgSpot18Basket* this) {
this->actionFunc = func_808B7BCC;
this->unk_210 = this->unk_20C = 0;
}
void func_808B7BCC(BgSpot18Basket* this, GlobalContext* globalCtx) {
f32 positionDiff;
Actor* colliderBaseAc;
Math_StepToS(&this->unk_210, 0x1F4, 0x1E);
this->dyna.actor.shape.rot.y += this->unk_210;
Math_StepToF(&this->unk_208, 50.0f, 1.5f);
Math_StepToS(&this->unk_20C, 400, 15);
this->unk_20E += this->unk_20C;
this->dyna.actor.world.pos.x = (Math_SinS(this->unk_20E) * this->unk_208) + this->dyna.actor.home.pos.x;
this->dyna.actor.world.pos.z = (Math_CosS(this->unk_20E) * this->unk_208) + this->dyna.actor.home.pos.z;
if (this->colliderJntSph.base.acFlags & AC_HIT) {
colliderBaseAc = this->colliderJntSph.base.ac;
if (colliderBaseAc != NULL) {
positionDiff = colliderBaseAc->world.pos.y - this->dyna.actor.world.pos.y;
if (positionDiff > 120.0f && positionDiff < 200.0f) {
if (Math3D_Dist2DSq(colliderBaseAc->world.pos.z, this->colliderJntSph.base.ac->world.pos.x,
this->dyna.actor.world.pos.z, this->dyna.actor.world.pos.x) < SQ(32.0f)) {
OnePointCutscene_Init(globalCtx, 4210, 240, &this->dyna.actor, MAIN_CAM);
func_808B7D38(this);
func_8003EBF8(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
}
}
}
}
func_8002F974(&this->dyna.actor, NA_SE_EV_ELEVATOR_MOVE - SFX_FLAG);
}
void func_808B7D38(BgSpot18Basket* this) {
this->actionFunc = func_808B7D50;
this->unk_216 = 0;
this->unk_214 = 0;
}
void func_808B7D50(BgSpot18Basket* this, GlobalContext* globalCtx) {
f32 tempValue2;
f32 tempValue;
if (this->unk_216 > 120) {
Math_StepToS(&this->unk_210, 0x3E8, 0x32);
} else {
Math_StepToS(&this->unk_210, 0xBB8, 0x64);
}
this->dyna.actor.shape.rot.y = this->dyna.actor.shape.rot.y + this->unk_210;
if (this->unk_216 < 70) {
Math_StepToF(&this->unk_208, 100.0f, 2.0f);
} else {
Math_StepToF(&this->unk_208, 0.0f, 2.0f);
}
Math_StepToS(&this->unk_20C, 1000, 20);
this->unk_20E += this->unk_20C;
this->dyna.actor.world.pos.x = (Math_SinS(this->unk_20E) * this->unk_208) + this->dyna.actor.home.pos.x;
this->dyna.actor.world.pos.z = (Math_CosS(this->unk_20E) * this->unk_208) + this->dyna.actor.home.pos.z;
this->unk_212 += 0xBB8;
Math_StepToS(&this->unk_214, 0x5DC, 0x1E);
this->dyna.actor.shape.rot.x = Math_CosS(this->unk_212) * this->unk_214;
this->dyna.actor.shape.rot.z = -Math_SinS(this->unk_212) * this->unk_214;
if (this->unk_216 > 140) {
func_808B7F74(this);
}
if (this->unk_216 < 80) {
func_808B7770(this, globalCtx, 1.0f);
} else {
func_808B7770(this, globalCtx, 0.8f);
}
tempValue2 = (this->unk_210 - 500) * 0.0006f;
tempValue = CLAMP(tempValue2, 0.0f, 1.5f);
func_800F436C(&this->dyna.actor.projectedPos, NA_SE_EV_WALL_MOVE_SP - SFX_FLAG, tempValue);
}
void func_808B7F74(BgSpot18Basket* this) {
s16 shapeRotY;
shapeRotY = this->dyna.actor.shape.rot.y;
this->actionFunc = func_808B7FC0;
if ((shapeRotY < -0x2E93) || (shapeRotY >= 0x7C19) || CVar_GetS32("gGoronPot", 0)) {
this->unk_218 = 2;
} else if (shapeRotY < 0x26C2) {
this->unk_218 = 1;
} else {
this->unk_218 = 0;
}
this->unk_216 = 0;
}
void func_808B7FC0(BgSpot18Basket* this, GlobalContext* globalCtx) {
s32 pad;
s32 tempUnk214;
f32 tempUnk210;
s16 arrayValue;
f32 clampedTempUnk210;
this->unk_212 += 0xBB8;
if (this->unk_216 >= 13) {
tempUnk214 = Math_StepToS(&this->unk_214, 0, 55);
} else {
tempUnk214 = 0;
}
this->dyna.actor.shape.rot.x = Math_CosS(this->unk_212) * this->unk_214;
this->dyna.actor.shape.rot.z = -Math_SinS(this->unk_212) * this->unk_214;
Math_StepToS(&this->unk_210, 0x1F4, 0xA);
this->dyna.actor.shape.rot.y += this->unk_210;
if (tempUnk214 != 0) {
arrayValue = D_808B85C8[this->unk_218];
if ((s16)(this->dyna.actor.shape.rot.y - arrayValue) >= 0) {
this->dyna.actor.shape.rot.y = arrayValue;
func_808B818C(this);
func_8003EC50(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
}
}
if (this->unk_216 < 30) {
func_808B7770(this, globalCtx, 0.5f);
} else {
func_808B7770(this, globalCtx, 0.3f);
}
tempUnk210 = (this->unk_210 - 500) * 0.0006f;
clampedTempUnk210 = CLAMP(tempUnk210, 0.0f, 1.5f);
func_800F436C(&this->dyna.actor.projectedPos, NA_SE_EV_WALL_MOVE_SP - SFX_FLAG, clampedTempUnk210);
}
void func_808B818C(BgSpot18Basket* this) {
this->actionFunc = func_808B81A0;
this->unk_216 = 0;
}
static s16 D_808B85E4[] = { -0x0FA0, 0x0320, 0x0FA0 };
void func_808B81A0(BgSpot18Basket* this, GlobalContext* globalCtx) {
s32 i;
Actor* actor = &this->dyna.actor;
Vec3f tempVector;
EnItem00* collectible;
if (this->unk_216 == 1) {
tempVector.x = actor->world.pos.x;
tempVector.y = actor->world.pos.y + 170.0f;
tempVector.z = actor->world.pos.z;
if (this->unk_218 == 0) {
for (i = 0; i < ARRAY_COUNT(D_808B85E4); i++) {
collectible = Item_DropCollectible(globalCtx, &tempVector, ITEM00_BOMBS_A);
if (collectible != NULL) {
collectible->actor.velocity.y = 11.0f;
collectible->actor.world.rot.y = D_808B85E4[i];
}
}
} else if (this->unk_218 == 1) {
for (i = 0; i < ARRAY_COUNT(D_808B85E4); i++) {
collectible = Item_DropCollectible(globalCtx, &tempVector, ITEM00_RUPEE_GREEN);
if (collectible != NULL) {
collectible->actor.velocity.y = 11.0f;
collectible->actor.world.rot.y = D_808B85E4[i];
}
}
} else if (this->unk_218 == 2) {
if ((this->unk_21A != 0) || Flags_GetCollectible(globalCtx, (actor->params & 0x3F))) {
collectible = Item_DropCollectible(globalCtx, &tempVector, ITEM00_RUPEE_PURPLE);
if (collectible != NULL) {
collectible->actor.velocity.y = 11.0f;
collectible->actor.world.rot.y = D_808B85E4[1];
}
} else {
collectible =
Item_DropCollectible(globalCtx, &tempVector, ((actor->params & 0x3F) << 8) | ITEM00_HEART_PIECE);
if (collectible != NULL) {
collectible->actor.velocity.y = 11.0f;
collectible->actor.world.rot.y = D_808B85E4[1];
this->unk_21A = 1;
}
}
collectible = Item_DropCollectible(globalCtx, &tempVector, ITEM00_RUPEE_RED);
if (collectible != NULL) {
collectible->actor.velocity.y = 11.0f;
collectible->actor.world.rot.y = D_808B85E4[0];
}
collectible = Item_DropCollectible(globalCtx, &tempVector, ITEM00_RUPEE_BLUE);
if (collectible != NULL) {
collectible->actor.velocity.y = 11.0f;
collectible->actor.world.rot.y = D_808B85E4[2];
}
}
} else if (this->unk_216 == 2) {
if (this->unk_218 == 2) {
func_80078884(NA_SE_SY_CORRECT_CHIME);
} else {
func_80078884(NA_SE_SY_TRE_BOX_APPEAR);
}
} else if (this->unk_216 == 200) {
func_808B7BB0(this);
}
}
void BgSpot18Basket_Update(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
BgSpot18Basket* this = (BgSpot18Basket*)thisx;
s32 bgId;
this->unk_216++;
this->actionFunc(this, globalCtx);
this->dyna.actor.floorHeight = BgCheck_EntityRaycastFloor4(&globalCtx->colCtx, &this->dyna.actor.floorPoly, &bgId,
&this->dyna.actor, &this->dyna.actor.world.pos);
if (this->actionFunc != func_808B7AFC) {
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->colliderJntSph.base);
if (this->actionFunc != func_808B7B6C) {
this->colliderJntSph.base.acFlags &= ~AC_HIT;
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->colliderJntSph.base);
}
}
}
void BgSpot18Basket_Draw(Actor* thisx, GlobalContext* globalCtx) {
BgSpot18Basket* this = (BgSpot18Basket*)thisx;
Collider_UpdateSpheres(0, &this->colliderJntSph);
Collider_UpdateSpheres(1, &this->colliderJntSph);
Gfx_DrawDListOpa(globalCtx, gGoronCityVaseDL);
}
void BgSpot18Basket_Reset(void) {
D_808B85D0 = 0;
}