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) {
|
2020-05-12 07:26:16 +00:00
|
|
|
#ifndef NODRAWINGDISTANCE
|
2020-08-08 03:34:12 +00:00
|
|
|
struct Object* player = nearest_player_to_object(o);
|
|
|
|
int distanceToPlayer = dist_between_objects(o, player);
|
|
|
|
if (distanceToPlayer < 2000.0f) {
|
2020-05-12 07:26:16 +00:00
|
|
|
#endif
|
2019-09-01 19:50:50 +00:00
|
|
|
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;
|
2020-05-12 07:26:16 +00:00
|
|
|
#ifndef NODRAWINGDISTANCE
|
2019-09-01 19:50:50 +00:00
|
|
|
}
|
2020-05-12 07:26:16 +00:00
|
|
|
#endif
|
2019-09-01 19:50:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void water_bomb_cannon_act_1(void) {
|
2020-05-12 07:26:16 +00:00
|
|
|
#ifndef NODRAWINGDISTANCE
|
2020-08-08 03:34:12 +00:00
|
|
|
struct Object* player = nearest_player_to_object(o);
|
|
|
|
int distanceToPlayer = dist_between_objects(o, player);
|
|
|
|
if (distanceToPlayer > 2500.0f) {
|
2019-09-01 19:50:50 +00:00
|
|
|
o->oAction = 2;
|
|
|
|
} else if (o->oBehParams2ndByte == 0) {
|
2020-05-12 07:26:16 +00:00
|
|
|
#else
|
|
|
|
if (o->oBehParams2ndByte == 0) {
|
|
|
|
#endif
|
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;
|
|
|
|
}
|
|
|
|
}
|