mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-10-20 20:22:38 +00:00
204 lines
8 KiB
C
204 lines
8 KiB
C
|
// intro_lakitu.inc.c
|
||
|
|
||
|
void func_8029AB70(struct Object *o, Vec3f b) {
|
||
|
f32 sp2C;
|
||
|
Vec3s sp24;
|
||
|
s16 sp22, sp20;
|
||
|
|
||
|
vec3f_add(b, gCurrLevelCamera->pos);
|
||
|
vec3f_get_dist_and_angle(gCurrLevelCamera->pos, gCurrLevelCamera->focus, &sp2C, &sp24[0], &sp24[1]);
|
||
|
vec3f_get_dist_and_angle(gCurrLevelCamera->pos, b, &sp2C, &sp22, &sp20);
|
||
|
vec3f_set_dist_and_angle(gCurrLevelCamera->pos, b, sp2C, sp24[0] + sp22, sp24[1] + sp20);
|
||
|
vec3f_to_object_pos(o, b);
|
||
|
}
|
||
|
|
||
|
void func_8029AC3C(struct Object *o, Vec3f b) {
|
||
|
UNUSED Vec3f sp3C;
|
||
|
Vec3f sp30;
|
||
|
f32 sp2C;
|
||
|
s16 sp2A, sp28;
|
||
|
UNUSED u32 sp24;
|
||
|
|
||
|
vec3f_set(sp30, 0.f, 0.f, 0.f);
|
||
|
vec3f_get_dist_and_angle(sp30, b, &sp2C, &sp2A, &sp28);
|
||
|
o->oFaceAnglePitch = sp2A;
|
||
|
o->oFaceAngleYaw = sp28;
|
||
|
}
|
||
|
|
||
|
s32 func_8029ACAC(struct Object *o, struct CinematicCameraTable b[], struct CinematicCameraTable c[]) {
|
||
|
Vec3f sp2C, sp20;
|
||
|
s32 sp1C = 0;
|
||
|
s16 sp1A = o->oIntroLakituUnkFC;
|
||
|
|
||
|
if ((func_80287CFC(sp20, b, &sp1A, &(o->oIntroLakituUnkF8)) == 1)
|
||
|
|| (func_80287CFC(sp2C, c, &sp1A, &(o->oIntroLakituUnkF8)) == 1))
|
||
|
sp1C += 1;
|
||
|
|
||
|
o->oIntroLakituUnkFC = sp1A;
|
||
|
func_8029AB70(o, sp2C);
|
||
|
func_8029AC3C(o, sp20);
|
||
|
return sp1C;
|
||
|
}
|
||
|
|
||
|
void bhv_intro_lakitu_loop(void) {
|
||
|
Vec3f sp64, sp58, sp4C;
|
||
|
UNUSED u32 pad[4];
|
||
|
|
||
|
switch (gCurrentObject->oAction) {
|
||
|
case 0:
|
||
|
obj_disable_rendering();
|
||
|
gCurrentObject->oIntroLakituUnkFC = 0.f;
|
||
|
gCurrentObject->oIntroLakituUnkF8 = 0.f;
|
||
|
gCurrentObject->oUnk1AC_VPTR =
|
||
|
spawn_object_relative_with_scale(1, 0, 0, 0, 2.f, gCurrentObject, MODEL_MIST, bhvCloud);
|
||
|
if (gCurrLevelCamera->cutscene == CUTSCENE_END_WAVING)
|
||
|
gCurrentObject->oAction = 100;
|
||
|
else
|
||
|
gCurrentObject->oAction += 1;
|
||
|
break;
|
||
|
|
||
|
case 1:
|
||
|
obj_enable_rendering();
|
||
|
if ((gCutsceneTimer > 350) && (gCutsceneTimer < 458)) {
|
||
|
gCurrentObject->oPosX = gCurrLevelCamera->pos[0];
|
||
|
gCurrentObject->oPosY = gCurrLevelCamera->pos[1] + 500.f;
|
||
|
gCurrentObject->oPosZ = gCurrLevelCamera->pos[2];
|
||
|
}
|
||
|
if (gCutsceneTimer > 52)
|
||
|
PlaySound(SOUND_CH6_LAKITUFLY_HIGHPRIO);
|
||
|
if (func_8029ACAC(gCurrentObject, D_8032E3CC, D_8032E2B4) == 1)
|
||
|
gCurrentObject->oAction += 1;
|
||
|
|
||
|
switch (gCurrentObject->oTimer) {
|
||
|
#ifdef VERSION_US
|
||
|
case 534:
|
||
|
PlaySound2(SOUND_ACTION_UNKNOWN456);
|
||
|
break;
|
||
|
case 581:
|
||
|
PlaySound2(SOUND_ACTION_UNKNOWN45E);
|
||
|
break;
|
||
|
#endif
|
||
|
case 73:
|
||
|
gCurrentObject->oAnimState += 1;
|
||
|
break;
|
||
|
case 74:
|
||
|
gCurrentObject->oAnimState -= 1;
|
||
|
break;
|
||
|
case 82:
|
||
|
gCurrentObject->oAnimState += 1;
|
||
|
break;
|
||
|
case 84:
|
||
|
gCurrentObject->oAnimState -= 1;
|
||
|
break;
|
||
|
}
|
||
|
#ifdef VERSION_EU
|
||
|
if (gCurrentObject->oTimer == 446)
|
||
|
PlaySound2(SOUND_ACTION_UNKNOWN456);
|
||
|
if (gCurrentObject->oTimer == 485)
|
||
|
PlaySound2(SOUND_ACTION_UNKNOWN45E);
|
||
|
#endif
|
||
|
break;
|
||
|
case 2:
|
||
|
if (gCutsceneTimer > 720) {
|
||
|
gCurrentObject->oAction += 1;
|
||
|
gCurrentObject->oIntroLakituUnk100 = 1400.f;
|
||
|
gCurrentObject->oIntroLakituUnk104 = -4096.f;
|
||
|
gCurrentObject->oIntroLakituUnk108 = 2048.f;
|
||
|
gCurrentObject->oIntroLakituUnk10C = -200.f;
|
||
|
gCurrentObject->oMoveAngleYaw = 0x8000;
|
||
|
gCurrentObject->oFaceAngleYaw = gCurrentObject->oMoveAngleYaw + 0x4000;
|
||
|
gCurrentObject->oMoveAnglePitch = 0x800;
|
||
|
}
|
||
|
PlaySound(SOUND_CH6_LAKITUFLY_HIGHPRIO);
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
PlaySound(SOUND_CH6_LAKITUFLY_HIGHPRIO);
|
||
|
vec3f_set(sp58, -1128.f, 560.f, 4664.f);
|
||
|
gCurrentObject->oMoveAngleYaw += 0x200;
|
||
|
gCurrentObject->oIntroLakituUnk100 =
|
||
|
approach_f32_exponential(gCurrentObject->oIntroLakituUnk100, 100.f, 0.03f);
|
||
|
gCurrentObject->oFaceAnglePitch = atan2s(200.f, gCurrentObject->oPosY - 400.f);
|
||
|
gCurrentObject->oFaceAngleYaw = approach_s16_exponential(
|
||
|
gCurrentObject->oFaceAngleYaw, gCurrentObject->oMoveAngleYaw + 0x8000, 4);
|
||
|
vec3f_set_dist_and_angle(sp58, sp4C, gCurrentObject->oIntroLakituUnk100, 0,
|
||
|
gCurrentObject->oMoveAngleYaw);
|
||
|
sp4C[1] += 150.f * coss((s16) gCurrentObject->oIntroLakituUnk104);
|
||
|
gCurrentObject->oIntroLakituUnk104 += gCurrentObject->oIntroLakituUnk108;
|
||
|
gCurrentObject->oIntroLakituUnk108 =
|
||
|
approach_f32_exponential(gCurrentObject->oIntroLakituUnk108, 512.f, 0.05f);
|
||
|
sp4C[0] += gCurrentObject->oIntroLakituUnk10C;
|
||
|
gCurrentObject->oIntroLakituUnk10C =
|
||
|
approach_f32_exponential(gCurrentObject->oIntroLakituUnk10C, 0.f, 0.05f);
|
||
|
vec3f_to_object_pos(gCurrentObject, sp4C);
|
||
|
|
||
|
if (gCurrentObject->oTimer == 31) {
|
||
|
gCurrentObject->oPosY -= 158.f;
|
||
|
func_802ADA94();
|
||
|
gCurrentObject->oPosY += 158.f;
|
||
|
}
|
||
|
#ifdef VERSION_EU
|
||
|
#define TIMER 74
|
||
|
#else
|
||
|
#define TIMER 98
|
||
|
#endif
|
||
|
|
||
|
if (gCurrentObject->oTimer == TIMER) {
|
||
|
mark_object_for_deletion(gCurrentObject);
|
||
|
mark_object_for_deletion(gCurrentObject->oUnk1AC_VPTR);
|
||
|
}
|
||
|
#ifndef VERSION_JP
|
||
|
if (gCurrentObject->oTimer == 14)
|
||
|
PlaySound2(SOUND_ACTION_UNKNOWN45F);
|
||
|
#endif
|
||
|
break;
|
||
|
case 100:
|
||
|
obj_enable_rendering();
|
||
|
vec3f_set(sp64, -100.f, 100.f, 300.f);
|
||
|
set_pos_from_face_angle_and_vec3f(sp4C, gCurrLevelCamera->pos, sp64,
|
||
|
sMarioStatusForCamera->faceAngle);
|
||
|
vec3f_to_object_pos(gCurrentObject, sp4C);
|
||
|
gCurrentObject->oMoveAnglePitch = 0x1000;
|
||
|
gCurrentObject->oMoveAngleYaw = 0x9000;
|
||
|
gCurrentObject->oFaceAnglePitch = gCurrentObject->oMoveAnglePitch / 2;
|
||
|
gCurrentObject->oFaceAngleYaw = gCurrentObject->oMoveAngleYaw;
|
||
|
gCurrentObject->oAction += 1;
|
||
|
break;
|
||
|
|
||
|
case 101:
|
||
|
object_pos_to_vec3f(sp4C, gCurrentObject);
|
||
|
if (gCurrentObject->oTimer > 60) {
|
||
|
gCurrentObject->oForwardVel =
|
||
|
approach_f32_exponential(gCurrentObject->oForwardVel, -10.f, 0.05f);
|
||
|
gCurrentObject->oMoveAngleYaw += 0x78;
|
||
|
gCurrentObject->oMoveAnglePitch += 0x40;
|
||
|
gCurrentObject->oFaceAngleYaw = camera_approach_s16_symmetric(
|
||
|
gCurrentObject->oFaceAngleYaw, (s16) calculate_yaw(sp4C, gCurrLevelCamera->pos),
|
||
|
0x200);
|
||
|
}
|
||
|
if (gCurrentObject->oTimer > 105) {
|
||
|
gCurrentObject->oAction += 1;
|
||
|
gCurrentObject->oMoveAnglePitch = 0xE00;
|
||
|
}
|
||
|
gCurrentObject->oFaceAnglePitch = 0;
|
||
|
func_802A2A38();
|
||
|
break;
|
||
|
|
||
|
case 102:
|
||
|
object_pos_to_vec3f(sp4C, gCurrentObject);
|
||
|
gCurrentObject->oForwardVel =
|
||
|
approach_f32_exponential(gCurrentObject->oForwardVel, 60.f, 0.05f);
|
||
|
gCurrentObject->oFaceAngleYaw = camera_approach_s16_symmetric(
|
||
|
gCurrentObject->oFaceAngleYaw, (s16) calculate_yaw(sp4C, gCurrLevelCamera->pos), 0x200);
|
||
|
if (gCurrentObject->oTimer < 62)
|
||
|
gCurrentObject->oMoveAngleYaw =
|
||
|
approach_s16_exponential(gCurrentObject->oMoveAngleYaw, 0x1800, 0x1E);
|
||
|
gCurrentObject->oMoveAnglePitch =
|
||
|
camera_approach_s16_symmetric(gCurrentObject->oMoveAnglePitch, -0x2000, 0x5A);
|
||
|
gCurrentObject->oFaceAnglePitch = 0;
|
||
|
func_802A2A38();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
#undef TIMER
|