mirror of https://github.com/sm64pc/sm64pc.git
155 lines
4.3 KiB
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;
|
|
}
|