sm64pc/src/game/behaviors/grand_star.inc.c
2020-03-01 22:42:52 -05:00

73 lines
2.3 KiB
C

// grand_star.c.inc
s32 arc_to_goal_pos(Vec3f a0, Vec3f a1, f32 yVel, f32 gravity) {
f32 dx = a0[0] - a1[0];
f32 dz = a0[2] - a1[2];
f32 planarDist = sqrtf(dx * dx + dz * dz);
s32 time;
o->oMoveAngleYaw = atan2s(dz, dx);
o->oVelY = yVel;
o->oGravity = gravity;
time = -2.0f / o->oGravity * yVel - 1.0f;
o->oForwardVel = planarDist / time;
return time;
}
void grand_star_zero_velocity(void) {
o->oGravity = 0.0f;
o->oVelY = 0.0f;
o->oForwardVel = 0.0f;
}
void bhv_grand_star_loop(void) {
UNUSED s32 unused;
Vec3f sp28;
sp28[0] = sp28[1] = sp28[2] = 0.0f;
if (o->oAction == 0) {
if (o->oTimer == 0) {
obj_set_angle(o, 0, 0, 0);
o->oAngleVelYaw = 0x400;
cur_obj_play_sound_2(SOUND_GENERAL2_STAR_APPEARS);
}
if (o->oTimer > 70)
o->oAction++;
spawn_sparkle_particles(3, 200, 80, -60);
} else if (o->oAction == 1) {
if (o->oTimer == 0) {
cur_obj_play_sound_2(SOUND_GENERAL_GRAND_STAR);
cutscene_object(CUTSCENE_STAR_SPAWN, o);
o->oGrandStarUnk108 = arc_to_goal_pos(sp28, &o->oPosX, 80.0f, -2.0f);
}
cur_obj_move_using_fvel_and_gravity();
if (o->oSubAction == 0) {
if (o->oPosY < o->oHomeY) {
o->oPosY = o->oHomeY;
o->oVelY = 60.0f;
o->oForwardVel = 0.0f;
o->oSubAction++;
cur_obj_play_sound_2(SOUND_GENERAL_GRAND_STAR_JUMP);
}
} else if (o->oVelY < 0.0f && o->oPosY < o->oHomeY + 200.0f) {
o->oPosY = o->oHomeY + 200.0f;
grand_star_zero_velocity();
gObjCutsceneDone = 1;
set_mario_npc_dialog(0);
o->oAction++;
o->oInteractStatus = 0;
cur_obj_play_sound_2(SOUND_GENERAL_GRAND_STAR_JUMP);
}
spawn_sparkle_particles(3, 200, 80, -60);
} else {
cur_obj_become_tangible();
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
obj_mark_for_deletion(o);
o->oInteractStatus = 0;
}
}
if (o->oAngleVelYaw > 0x400)
o->oAngleVelYaw -= 0x100;
o->oFaceAngleYaw += o->oAngleVelYaw;
cur_obj_scale(2.0f);
o->oGraphYOffset = 110.0f;
}