124 lines
3.4 KiB
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();
|
||
|
}
|
||
|
}
|