73 lines
2.3 KiB
C
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;
|
|
}
|