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

155 lines
4.3 KiB
C

// rolling_log.c.inc
// why are the falling platforms and rolling logs grouped
// together? seems strange, but it also cooresponds to the
// behavior script grouping if the same file is assumed.
// hypothesis is that the object in the middle here used to be
// a rolling log of another variation.
void bhv_ttm_rolling_log_init(void) {
o->oPitouneUnkF8 = 3970.0f;
o->oPitouneUnkFC = 3654.0f;
o->oPitouneUnkF4 = 271037.0f;
o->oMoveAngleYaw = 8810;
o->oForwardVel = 0;
o->oVelX = 0;
o->oVelZ = 0;
o->oFaceAnglePitch = 0;
o->oAngleVelPitch = 0;
}
void rolling_log_roll_log(void) {
f32 sp24;
if (gMarioObject->platform == o) {
sp24 = (gMarioObject->header.gfx.pos[2] - o->oPosZ) * coss(-1*o->oMoveAngleYaw)
- (gMarioObject->header.gfx.pos[0] - o->oPosX) * sins(-1*o->oMoveAngleYaw);
if (sp24 > 0)
o->oAngleVelPitch += 0x10;
else
o->oAngleVelPitch -= 0x10;
if (o->oAngleVelPitch > 0x200)
o->oAngleVelPitch = 0x200;
if (o->oAngleVelPitch < -0x200)
o->oAngleVelPitch = -0x200;
} else {
if (is_point_close_to_object(o, o->oHomeX, o->oHomeY, o->oHomeZ, 100)) {
if (o->oAngleVelPitch != 0) {
if (o->oAngleVelPitch > 0)
o->oAngleVelPitch -= 0x10;
else
o->oAngleVelPitch += 0x10;
if (o->oAngleVelPitch < 0x10 && o->oAngleVelPitch > -0x10)
o->oAngleVelPitch = 0;
}
} else {
if (o->oAngleVelPitch != 0x100) {
if (o->oAngleVelPitch > 0x100)
o->oAngleVelPitch -= 0x10;
else
o->oAngleVelPitch += 0x10;
if (o->oAngleVelPitch < 0x110 && o->oAngleVelPitch > 0xF0)
o->oAngleVelPitch = 0x100;
}
}
}
}
void bhv_rolling_log_loop(void) {
f32 prevX = o->oPosX;
f32 prevZ = o->oPosZ;
rolling_log_roll_log();
o->oForwardVel = o->oAngleVelPitch / 0x40;
o->oVelX = o->oForwardVel * sins(o->oMoveAngleYaw);
o->oVelZ = o->oForwardVel * coss(o->oMoveAngleYaw);
o->oPosX += o->oVelX;
o->oPosZ += o->oVelZ;
if (o->oPitouneUnkF4 < sqr(o->oPosX - o->oPitouneUnkF8) + sqr(o->oPosZ - o->oPitouneUnkFC)) {
o->oForwardVel = 0;
o->oPosX = prevX;
o->oPosZ = prevZ;
o->oVelX = 0;
o->oVelZ = 0;
}
o->oFaceAnglePitch += o->oAngleVelPitch;
if (absf_2(o->oFaceAnglePitch & 0x1FFF) < 528.0f && o->oAngleVelPitch != 0) {
cur_obj_play_sound_2(SOUND_GENERAL_UNKNOWN1_2);
}
}
void volcano_act_1(void) {
o->oRollingLogUnkF4 += 4.0f;
o->oAngleVelPitch += o->oRollingLogUnkF4;
o->oFaceAnglePitch -= o->oAngleVelPitch;
if (o->oFaceAnglePitch < -0x4000) {
o->oFaceAnglePitch = -0x4000;
o->oAngleVelPitch = 0;
o->oRollingLogUnkF4 = 0;
o->oAction = 2;
cur_obj_play_sound_2(SOUND_GENERAL_BIG_POUND);
set_camera_shake_from_point(SHAKE_POS_LARGE, o->oPosX, o->oPosY, o->oPosZ);
}
}
void volcano_act_3(void) {
o->oAngleVelPitch = 0x90;
o->oFaceAnglePitch += o->oAngleVelPitch;
if (o->oFaceAnglePitch > 0)
o->oFaceAnglePitch = 0;
if (o->oTimer == 200)
o->oAction = 0;
}
void bhv_volcano_trap_loop(void) {
switch (o->oAction) {
case 0:
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 1000)) {
o->oAction = 1;
cur_obj_play_sound_2(SOUND_GENERAL_QUIET_POUND2);
}
break;
case 1:
volcano_act_1();
break;
case 2:
if (o->oTimer < 8) {
o->oPosY = o->oHomeY + sins(o->oTimer * 0x1000) * 10.0f;
}
if (o->oTimer == 50) {
cur_obj_play_sound_2(SOUND_GENERAL_UNK45);
o->oAction = 3;
}
break;
case 3:
volcano_act_3();
break;
}
}
void bhv_lll_rolling_log_init(void) {
o->oPitouneUnkF8 = 5120.0f;
o->oPitouneUnkFC = 6016.0f;
o->oPitouneUnkF4 = 1048576.0f;
o->oMoveAngleYaw = 0x3FFF;
o->oForwardVel = 0;
o->oVelX = 0;
o->oVelZ = 0;
o->oFaceAnglePitch = 0;
o->oAngleVelPitch = 0;
}