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

256 lines
7.6 KiB
C

// whomp.c.inc
void whomp_play_sfx_from_pound_animation(void) {
UNUSED s32 sp2C = o->header.gfx.unk38.animFrame;
s32 sp28 = 0;
if (o->oForwardVel < 5.0f) {
sp28 = cur_obj_check_anim_frame(0);
sp28 |= cur_obj_check_anim_frame(23);
} else {
sp28 = cur_obj_check_anim_frame_in_range(0, 3);
sp28 |= cur_obj_check_anim_frame_in_range(23, 3);
}
if (sp28)
cur_obj_play_sound_2(SOUND_OBJ_POUNDING1);
}
void whomp_act_0(void) {
cur_obj_init_animation_with_accel_and_sound(0, 1.0f);
cur_obj_set_pos_to_home();
if (o->oBehParams2ndByte != 0) {
gSecondCameraFocus = o;
cur_obj_scale(2.0f);
if (o->oSubAction == 0) {
if (o->oDistanceToMario < 600.0f) {
o->oSubAction++;
func_8031FFB4(SEQ_PLAYER_LEVEL, 60, 40);
} else {
cur_obj_set_pos_to_home();
o->oHealth = 3;
}
} else if (cur_obj_update_dialog_with_cutscene(2, 1, CUTSCENE_DIALOG, DIALOG_114))
o->oAction = 2;
} else if (o->oDistanceToMario < 500.0f)
o->oAction = 1;
whomp_play_sfx_from_pound_animation();
}
void whomp_act_7(void) {
if (o->oSubAction == 0) {
o->oForwardVel = 0.0f;
cur_obj_init_animation_with_accel_and_sound(0, 1.0f);
if (o->oTimer > 31)
o->oSubAction++;
else
o->oMoveAngleYaw += 0x400;
} else {
o->oForwardVel = 3.0f;
if (o->oTimer > 42)
o->oAction = 1;
}
whomp_play_sfx_from_pound_animation();
}
void whomp_act_1(void) {
s16 sp26;
f32 sp20;
f32 sp1C;
sp26 = abs_angle_diff(o->oAngleToMario, o->oMoveAngleYaw);
sp20 = cur_obj_lateral_dist_to_home();
if (gCurrLevelNum == LEVEL_BITS)
sp1C = 200.0f;
else
sp1C = 700.0f;
cur_obj_init_animation_with_accel_and_sound(0, 1.0f);
o->oForwardVel = 3.0f;
if (sp20 > sp1C)
o->oAction = 7;
else if (sp26 < 0x2000) {
if (o->oDistanceToMario < 1500.0f) {
o->oForwardVel = 9.0f;
cur_obj_init_animation_with_accel_and_sound(0, 3.0f);
}
if (o->oDistanceToMario < 300.0f)
o->oAction = 3;
}
whomp_play_sfx_from_pound_animation();
}
void whomp_act_2(void) {
s16 sp1E;
cur_obj_init_animation_with_accel_and_sound(0, 1.0f);
o->oForwardVel = 3.0f;
cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x200);
if (o->oTimer > 30) {
sp1E = abs_angle_diff(o->oAngleToMario, o->oMoveAngleYaw);
if (sp1E < 0x2000) {
if (o->oDistanceToMario < 1500.0f) {
o->oForwardVel = 9.0f;
cur_obj_init_animation_with_accel_and_sound(0, 3.0f);
}
if (o->oDistanceToMario < 300.0f)
o->oAction = 3;
}
}
whomp_play_sfx_from_pound_animation();
if (mario_is_far_below_object(1000.0f)) {
o->oAction = 0;
stop_background_music(SEQUENCE_ARGS(4, SEQ_EVENT_BOSS));
}
}
void whomp_act_3(void) {
o->oForwardVel = 0.0f;
cur_obj_init_animation_with_accel_and_sound(1, 1.0f);
if (cur_obj_check_if_near_animation_end())
o->oAction = 4;
}
void whomp_act_4(void) {
if (o->oTimer == 0)
o->oVelY = 40.0f;
if (o->oTimer < 8) {
} else {
o->oAngleVelPitch += 0x100;
o->oFaceAnglePitch += o->oAngleVelPitch;
if (o->oFaceAnglePitch > 0x4000) {
o->oAngleVelPitch = 0;
o->oFaceAnglePitch = 0x4000;
o->oAction = 5;
}
}
}
void whomp_act_5(void) {
if (o->oSubAction == 0 && o->oMoveFlags & 1) {
cur_obj_play_sound_2(SOUND_OBJ_WHOMP_LOWPRIO);
cur_obj_shake_screen(SHAKE_POS_SMALL);
o->oVelY = 0.0f;
o->oSubAction++;
}
if (o->oMoveFlags & 2)
o->oAction = 6;
}
void king_whomp_on_ground(void) {
Vec3f pos;
if (o->oSubAction == 0) {
if (cur_obj_is_mario_ground_pounding_platform()) {
o->oHealth--;
cur_obj_play_sound_2(SOUND_OBJ2_WHOMP_SOUND_SHORT);
cur_obj_play_sound_2(SOUND_OBJ_KING_WHOMP_DEATH);
if (o->oHealth == 0)
o->oAction = 8;
else {
vec3f_copy_2(pos, &o->oPosX);
vec3f_copy_2(&o->oPosX, &gMarioObject->oPosX);
spawn_mist_particles_variable(0, 0, 100.0f);
spawn_triangle_break_particles(20, 138, 3.0f, 4);
cur_obj_shake_screen(SHAKE_POS_SMALL);
vec3f_copy_2(&o->oPosX, pos);
}
o->oSubAction++;
}
o->oWhompUnkF8 = 0;
} else {
if (o->oWhompUnkF8 < 10) {
if (o->oWhompUnkF8 % 2)
o->oPosY += 8.0f;
else
o->oPosY -= 8.0f;
} else
o->oSubAction = 10;
o->oWhompUnkF8++;
}
}
void whomp_on_ground(void) {
if (o->oSubAction == 0) {
if (gMarioObject->platform == o) {
if (cur_obj_is_mario_ground_pounding_platform()) {
o->oNumLootCoins = 5;
obj_spawn_loot_yellow_coins(o, 5, 20.0f);
o->oAction = 8;
} else {
cur_obj_spawn_loot_coin_at_mario_pos();
o->oSubAction++;
}
}
} else if (!cur_obj_is_mario_on_platform())
o->oSubAction = 0;
}
void whomp_act_6(void) {
if (o->oSubAction != 10) {
o->oForwardVel = 0.0f;
o->oAngleVelPitch = 0;
o->oAngleVelYaw = 0;
o->oAngleVelRoll = 0;
if (o->oBehParams2ndByte != 0)
king_whomp_on_ground();
else
whomp_on_ground();
if (o->oTimer > 100 || (gMarioState->action == ACT_SQUISHED && o->oTimer > 30))
o->oSubAction = 10;
} else {
if (o->oFaceAnglePitch > 0) {
o->oAngleVelPitch = -0x200;
o->oFaceAnglePitch += o->oAngleVelPitch;
} else {
o->oAngleVelPitch = 0;
o->oFaceAnglePitch = 0;
if (o->oBehParams2ndByte != 0)
o->oAction = 2;
else
o->oAction = 1;
}
}
}
void whomp_act_8(void) {
if (o->oBehParams2ndByte != 0) {
if (cur_obj_update_dialog_with_cutscene(2, 2, CUTSCENE_DIALOG, DIALOG_115)) {
obj_set_angle(o, 0, 0, 0);
cur_obj_hide();
cur_obj_become_intangible();
spawn_mist_particles_variable(0, 0, 200.0f);
spawn_triangle_break_particles(20, 138, 3.0f, 4);
cur_obj_shake_screen(SHAKE_POS_SMALL);
o->oPosY += 100.0f;
spawn_default_star(180.0f, 3880.0f, 340.0f);
cur_obj_play_sound_2(SOUND_OBJ_KING_WHOMP_DEATH);
o->oAction = 9;
}
} else {
spawn_mist_particles_variable(0, 0, 100.0f);
spawn_triangle_break_particles(20, 138, 3.0f, 4);
cur_obj_shake_screen(SHAKE_POS_SMALL);
create_sound_spawner(SOUND_OBJ_THWOMP);
obj_mark_for_deletion(o);
}
}
void whomp_act_9(void) {
if (o->oTimer == 60)
stop_background_music(SEQUENCE_ARGS(4, SEQ_EVENT_BOSS));
}
void (*sWhompActions[])(void) = {
whomp_act_0, whomp_act_1, whomp_act_2, whomp_act_3, whomp_act_4,
whomp_act_5, whomp_act_6, whomp_act_7, whomp_act_8, whomp_act_9
};
// MM
void bhv_whomp_loop(void) {
cur_obj_update_floor_and_walls();
cur_obj_call_action_function(sWhompActions);
cur_obj_move_standard(-20);
if (o->oAction != 9) {
if (o->oBehParams2ndByte != 0)
cur_obj_hide_if_mario_far_away_y(2000.0f);
else
cur_obj_hide_if_mario_far_away_y(1000.0f);
load_object_collision_model();
}
}