mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-08-13 17:03:47 -04:00
39cc86c260
subrepo: subdir: "soh" merged: "ba904bbd0" upstream: origin: "https://github.com/HarbourMasters/soh.git" branch: "master" commit: "ba904bbd0" git-subrepo: version: "0.4.1" origin: "???" commit: "???"
114 lines
3.2 KiB
C
114 lines
3.2 KiB
C
/*
|
|
* File: z_obj_hana.c
|
|
* Overlay: Obj_Hana
|
|
* Description: Grave Flower
|
|
*/
|
|
|
|
#include "z_obj_hana.h"
|
|
#include "objects/gameplay_field_keep/gameplay_field_keep.h"
|
|
|
|
#define FLAGS 0
|
|
|
|
void ObjHana_Init(Actor* thisx, GlobalContext* globalCtx);
|
|
void ObjHana_Destroy(Actor* thisx, GlobalContext* globalCtx);
|
|
void ObjHana_Update(Actor* thisx, GlobalContext* globalCtx);
|
|
void ObjHana_Draw(Actor* thisx, GlobalContext* globalCtx);
|
|
|
|
const ActorInit Obj_Hana_InitVars = {
|
|
ACTOR_OBJ_HANA,
|
|
ACTORCAT_PROP,
|
|
FLAGS,
|
|
OBJECT_GAMEPLAY_FIELD_KEEP,
|
|
sizeof(ObjHana),
|
|
(ActorFunc)ObjHana_Init,
|
|
(ActorFunc)ObjHana_Destroy,
|
|
(ActorFunc)ObjHana_Update,
|
|
(ActorFunc)ObjHana_Draw,
|
|
NULL,
|
|
};
|
|
|
|
static ColliderCylinderInit sCylinderInit = {
|
|
{
|
|
COLTYPE_NONE,
|
|
AT_NONE,
|
|
AC_NONE,
|
|
OC1_ON | OC1_TYPE_ALL,
|
|
OC2_TYPE_2,
|
|
COLSHAPE_CYLINDER,
|
|
},
|
|
{
|
|
ELEMTYPE_UNK0,
|
|
{ 0x00000000, 0x00, 0x00 },
|
|
{ 0x00000000, 0x00, 0x00 },
|
|
TOUCH_NONE,
|
|
BUMP_NONE,
|
|
OCELEM_ON,
|
|
},
|
|
{ 8, 10, 0, { 0, 0, 0 } },
|
|
};
|
|
|
|
static CollisionCheckInfoInit sColChkInfoInit = { 0, 12, 60, MASS_IMMOVABLE };
|
|
|
|
typedef struct {
|
|
/* 0x00 */ Gfx* dList;
|
|
/* 0x04 */ f32 scale;
|
|
/* 0x08 */ f32 yOffset;
|
|
/* 0x0C */ s16 radius;
|
|
/* 0x0E */ s16 height;
|
|
} HanaParams; // size = 0x10
|
|
|
|
static HanaParams sHanaParams[] = {
|
|
{ gHanaDL, 0.01f, 0.0f, -1, 0 },
|
|
{ gFieldKakeraDL, 0.1f, 58.0f, 10, 18 },
|
|
{ gFieldBushDL, 0.4f, 0.0f, 12, 44 },
|
|
};
|
|
|
|
static InitChainEntry sInitChain[] = {
|
|
ICHAIN_VEC3F_DIV1000(scale, 10, ICHAIN_CONTINUE),
|
|
ICHAIN_F32(uncullZoneForward, 900, ICHAIN_CONTINUE),
|
|
ICHAIN_F32(uncullZoneScale, 60, ICHAIN_CONTINUE),
|
|
ICHAIN_F32(uncullZoneDownward, 800, ICHAIN_STOP),
|
|
};
|
|
|
|
void ObjHana_Init(Actor* thisx, GlobalContext* globalCtx) {
|
|
ObjHana* this = (ObjHana*)thisx;
|
|
s16 type = this->actor.params & 3;
|
|
HanaParams* params = &sHanaParams[type];
|
|
|
|
Actor_ProcessInitChain(&this->actor, sInitChain);
|
|
Actor_SetScale(&this->actor, params->scale);
|
|
this->actor.shape.yOffset = params->yOffset;
|
|
if (params->radius >= 0) {
|
|
Collider_InitCylinder(globalCtx, &this->collider);
|
|
Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
|
|
Collider_UpdateCylinder(&this->actor, &this->collider);
|
|
this->collider.dim.radius = params->radius;
|
|
this->collider.dim.height = params->height;
|
|
CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sColChkInfoInit);
|
|
}
|
|
|
|
if (type == 2 && (gSaveContext.eventChkInf[4] & 1)) {
|
|
Actor_Kill(&this->actor);
|
|
}
|
|
}
|
|
|
|
void ObjHana_Destroy(Actor* thisx, GlobalContext* globalCtx) {
|
|
ObjHana* this = (ObjHana*)thisx;
|
|
|
|
if (sHanaParams[this->actor.params & 3].radius >= 0) {
|
|
Collider_DestroyCylinder(globalCtx, &this->collider);
|
|
}
|
|
}
|
|
|
|
void ObjHana_Update(Actor* thisx, GlobalContext* globalCtx) {
|
|
ObjHana* this = (ObjHana*)thisx;
|
|
|
|
if (sHanaParams[this->actor.params & 3].radius >= 0 && this->actor.xzDistToPlayer < 400.0f) {
|
|
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
|
|
}
|
|
}
|
|
|
|
void ObjHana_Draw(Actor* thisx, GlobalContext* globalCtx) {
|
|
Gfx_DrawDListOpa(globalCtx, sHanaParams[thisx->params & 3].dList);
|
|
}
|