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

95 lines
2.9 KiB
C
Raw Permalink Normal View History

2019-09-01 19:50:50 +00:00
// water_bomb_cannon.inc.c
void bhv_bubble_cannon_barrel_loop(void) {
struct Object *val04;
if (o->parentObj->oAction == 2) {
2020-03-02 03:42:52 +00:00
obj_mark_for_deletion(o);
2019-09-01 19:50:50 +00:00
} else {
o->oMoveAngleYaw = o->parentObj->oFaceAngleYaw;
o->oMoveAnglePitch = o->parentObj->oMoveAnglePitch + 0x4000;
o->oFaceAnglePitch = o->parentObj->oMoveAnglePitch;
if ((o->oCannonBarrelBubblesUnkF4 += o->oForwardVel) > 0.0f) {
2020-03-02 03:42:52 +00:00
cur_obj_set_pos_via_transform();
2019-09-01 19:50:50 +00:00
obj_forward_vel_approach(-5.0f, 18.0f);
} else {
o->oCannonBarrelBubblesUnkF4 = 0.0f;
2020-03-02 03:42:52 +00:00
obj_copy_pos(o, o->parentObj);
2019-09-01 19:50:50 +00:00
// check this
2019-10-05 19:08:05 +00:00
if (o->parentObj->oWaterCannonUnkF4 != 0) {
2019-09-01 19:50:50 +00:00
if (o->oForwardVel == 0.0f) {
o->oForwardVel = 35.0f;
val04 = spawn_object(o, MODEL_WATER_BOMB, bhvWaterBomb);
if (val04 != NULL) {
val04->oForwardVel = -100.0f;
val04->header.gfx.scale[1] = 1.7f;
}
2020-01-03 15:38:57 +00:00
set_camera_shake_from_point(SHAKE_POS_MEDIUM, o->oPosX, o->oPosY, o->oPosZ);
2019-09-01 19:50:50 +00:00
}
} else {
o->oForwardVel = 0.0f;
}
}
}
}
void water_bomb_cannon_act_0(void) {
if (o->oDistanceToMario < 2000.0f) {
spawn_object(o, MODEL_CANNON_BARREL, bhvCannonBarrelBubbles);
2020-03-02 03:42:52 +00:00
cur_obj_unhide();
2019-09-01 19:50:50 +00:00
o->oAction = 1;
2019-10-05 19:08:05 +00:00
o->oMoveAnglePitch = o->oWaterCannonUnkFC = 0x1C00;
2019-09-01 19:50:50 +00:00
}
}
void water_bomb_cannon_act_1(void) {
if (o->oDistanceToMario > 2500.0f) {
o->oAction = 2;
} else if (o->oBehParams2ndByte == 0) {
2019-10-05 19:08:05 +00:00
if (o->oWaterCannonUnkF4 != 0) {
o->oWaterCannonUnkF4 -= 1;
2019-09-01 19:50:50 +00:00
} else {
2019-10-05 19:08:05 +00:00
obj_move_pitch_approach(o->oWaterCannonUnkFC, 0x80);
obj_face_yaw_approach(o->oWaterCannonUnk100, 0x100);
2019-09-01 19:50:50 +00:00
2019-10-05 19:08:05 +00:00
if ((s16) o->oFaceAngleYaw == (s16) o->oWaterCannonUnk100) {
if (o->oWaterCannonUnkF8 != 0) {
o->oWaterCannonUnkF8 -= 1;
2019-09-01 19:50:50 +00:00
} else {
2020-03-02 03:42:52 +00:00
cur_obj_play_sound_2(SOUND_OBJ_CANNON4);
2019-10-05 19:08:05 +00:00
o->oWaterCannonUnkF4 = 70;
2020-04-03 18:57:26 +00:00
o->oWaterCannonUnkFC = 0x1000 + 0x400 * (random_u16() & 0x3);
o->oWaterCannonUnk100 = -0x2000 + o->oMoveAngleYaw + 0x1000 * (random_u16() % 5);
2019-10-05 19:08:05 +00:00
o->oWaterCannonUnkF8 = 60;
2019-09-01 19:50:50 +00:00
}
}
}
}
}
void water_bomb_cannon_act_2(void) {
2020-03-02 03:42:52 +00:00
cur_obj_hide();
2019-09-01 19:50:50 +00:00
o->oAction = 0;
}
void bhv_water_bomb_cannon_loop(void) {
2020-03-02 03:42:52 +00:00
cur_obj_push_mario_away_from_cylinder(220.0f, 300.0f);
2019-09-01 19:50:50 +00:00
switch (o->oAction) {
case 0:
water_bomb_cannon_act_0();
break;
case 1:
water_bomb_cannon_act_1();
break;
case 2:
water_bomb_cannon_act_2();
break;
}
}