sm64pc/src/game/behaviors/whirlpool.inc.c

76 lines
2.4 KiB
C

// whirlpool.c.inc
static struct ObjectHitbox sWhirlpoolHitbox = {
/* interactType: */ INTERACT_WHIRLPOOL,
/* downOffset: */ 0,
/* damageOrCoinValue: */ 0,
/* health: */ 0,
/* numLootCoins: */ 0,
/* radius: */ 200,
/* height: */ 500,
/* hurtboxRadius: */ 0,
/* hurtboxHeight: */ 0,
};
void bhv_whirlpool_init(void) {
o->oWhirlpoolInitFacePitch = o->oFaceAnglePitch;
o->oWhirlpoolInitFaceRoll = o->oFaceAngleRoll;
o->oFaceAnglePitch = 0;
o->oFaceAngleRoll = 0;
}
void whirlpool_set_hitbox(void) {
obj_set_hitbox(o, &sWhirlpoolHitbox);
}
void whirpool_orient_graph(void) {
f32 cosPitch = coss(o->oFaceAnglePitch);
f32 sinPitch = sins(o->oFaceAnglePitch);
f32 cosRoll = coss(o->oFaceAngleRoll);
f32 sinRoll = sins(o->oFaceAngleRoll);
f32 normalX = sinRoll * cosPitch;
f32 normalY = cosPitch * cosRoll;
f32 normalZ = sinPitch;
obj_orient_graph(o, normalX, normalY, normalZ);
}
void bhv_whirlpool_loop(void) {
if (o->oDistanceToMario < 5000.0f) {
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
// not sure if actually an array
gEnvFxBubbleConfig[ENVFX_STATE_PARTICLECOUNT] = 60;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_X] = o->oPosX;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_Z] = o->oPosZ;
gEnvFxBubbleConfig[ENVFX_STATE_DEST_X] = o->oPosX;
gEnvFxBubbleConfig[ENVFX_STATE_DEST_Y] = o->oPosY;
gEnvFxBubbleConfig[ENVFX_STATE_DEST_Z] = o->oPosZ;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_Y] = o->oPosY + 800.0f;
gEnvFxBubbleConfig[ENVFX_STATE_PITCH] = o->oWhirlpoolInitFacePitch;
gEnvFxBubbleConfig[ENVFX_STATE_YAW] = o->oWhirlpoolInitFaceRoll;
whirpool_orient_graph();
o->oFaceAngleYaw += 0x1F40;
} else {
o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;
gEnvFxBubbleConfig[ENVFX_STATE_PARTICLECOUNT] = 0;
}
cur_obj_play_sound_1(SOUND_ENV_WATER);
whirlpool_set_hitbox();
}
void bhv_jet_stream_loop(void) {
if (o->oDistanceToMario < 5000.0f) {
gEnvFxBubbleConfig[ENVFX_STATE_PARTICLECOUNT] = 60;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_X] = o->oPosX;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_Y] = o->oPosY;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_Z] = o->oPosZ;
} else
gEnvFxBubbleConfig[ENVFX_STATE_PARTICLECOUNT] = 0;
cur_obj_play_sound_1(SOUND_ENV_WATER);
}