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

124 lines
3.4 KiB
C

// coffin.inc.c
struct Struct80331C00 {
s16 unk00;
s16 unk02;
};
struct Struct80331C00 D_80331C00[] = {
{ 0x019C, 0xFF6A }, { 0x02FA, 0xFF6A }, { 0x0458, 0xFF6A },
{ 0x019C, 0x0096 }, { 0x02FA, 0x0096 }, { 0x0458, 0x0096 },
};
void bhv_coffin_manager_loop(void) {
struct Object *val0C;
s32 val08;
s16 val06;
if (o->oAction == 0) {
if (!(o->activeFlags & 0x0008)) {
for (val08 = 0; val08 < 6; val08++) {
val06 = D_80331C00[val08].unk02;
val0C = spawn_object_relative(val08 & 0x00000001, D_80331C00[val08].unk00, 0, val06, o,
MODEL_BBH_WOODEN_TOMB, bhvCoffin);
if (val0C != NULL) {
if (val06 > 0) {
val0C->oFaceAngleYaw = 0x8000;
}
}
}
o->oAction += 1;
}
} else if (o->activeFlags & 0x0008) {
o->oAction = 0;
}
}
void coffin_act_0(void) {
f32 val14;
f32 val10;
f32 val0C;
f32 val08;
f32 val04;
f32 val00;
if (o->oBehParams2ndByte != 0) {
if (o->oFaceAnglePitch != 0) {
o->oAngleVelPitch = approach_s16_symmetric(o->oAngleVelPitch, -2000, 200);
if (obj_face_pitch_approach(0, -o->oAngleVelPitch)) {
PlaySound2(SOUND_GENERAL_ELEVATORMOVE_2);
obj_perform_position_op(0);
o->oMoveAngleYaw = o->oFaceAngleYaw - 0x4000;
obj_set_dist_from_home(200.0f);
func_802ADA94();
obj_perform_position_op(2);
}
o->oTimer = 0;
} else {
val14 = coss(o->oFaceAngleYaw);
val10 = sins(o->oFaceAngleYaw);
val0C = gMarioObject->oPosX - o->oPosX;
val08 = gMarioObject->oPosZ - o->oPosZ;
val04 = val0C * val14 + val08 * val10;
val00 = val08 * val14 - val0C * val10;
if (o->oTimer > 60
&& (o->oDistanceToMario > 100.0f || gMarioState->action == ACT_SQUISHED)) {
if (gMarioObject->oPosY - o->oPosY < 200.0f && absf(val04) < 140.0f) {
if (val00 < 150.0f && val00 > -450.0f) {
PlaySound2(SOUND_GENERAL_BUTTONPRESS_2_LOWPRIO);
o->oAction = 1;
}
}
}
o->oAngleVelPitch = 0;
}
}
}
void coffin_act_1(void) {
if (o->oFaceAnglePitch != 0x4000) {
o->oAngleVelPitch = approach_s16_symmetric(o->oAngleVelPitch, 1000, 200);
obj_face_pitch_approach(0x4000, o->oAngleVelPitch);
} else {
if (o->oTimer > 60) {
o->oAction = 0;
o->oFaceAngleRoll = 0;
} else if (o->oTimer > 30) {
if (gGlobalTimer % 4 == 0) {
PlaySound2(SOUND_GENERAL_ELEVATORMOVE_2);
}
o->oFaceAngleRoll = 400 * (gGlobalTimer % 2) - 200;
}
o->oAngleVelPitch = 0;
}
}
void bhv_coffin_loop(void) {
if (o->parentObj->oAction == 0) {
mark_object_for_deletion(o);
} else {
o->header.gfx.scale[1] = 1.1f;
switch (o->oAction) {
case 0:
coffin_act_0();
break;
case 1:
coffin_act_1();
break;
}
load_object_collision_model();
}
}