2019-08-25 04:46:40 +00:00
|
|
|
// fish.c.inc
|
|
|
|
|
|
|
|
void ActionFish0(void) {
|
|
|
|
s32 i;
|
|
|
|
s32 sp38;
|
|
|
|
s16 model;
|
|
|
|
f32 sp30;
|
2019-10-05 19:08:05 +00:00
|
|
|
struct Animation **sp2C;
|
2019-08-25 04:46:40 +00:00
|
|
|
struct Object *sp28;
|
|
|
|
switch (o->oBehParams2ndByte) {
|
|
|
|
case 0:
|
2020-02-03 05:51:26 +00:00
|
|
|
model = MODEL_FISH; sp38 = 20; sp30 = 1500.0f; sp2C = blue_fish_seg3_anims_0301C2B0;
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2020-02-03 05:51:26 +00:00
|
|
|
model = MODEL_FISH; sp38 = 5; sp30 = 1500.0f; sp2C = blue_fish_seg3_anims_0301C2B0;
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
2020-02-03 05:51:26 +00:00
|
|
|
model = MODEL_CYAN_FISH; sp38 = 20; sp30 = 1500.0f; sp2C = cyan_fish_seg6_anims_0600E264;
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
case 3:
|
2020-02-03 05:51:26 +00:00
|
|
|
model = MODEL_CYAN_FISH; sp38 = 5; sp30 = 1500.0f; sp2C = cyan_fish_seg6_anims_0600E264;
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (o->oDistanceToMario < sp30 || gCurrLevelNum == LEVEL_SA) {
|
|
|
|
for (i = 0; i < sp38; i++) {
|
|
|
|
sp28 = spawn_object(o, model, bhvFishGroup2);
|
|
|
|
sp28->oBehParams2ndByte = o->oBehParams2ndByte;
|
|
|
|
func_8029EE20(sp28, sp2C, 0);
|
|
|
|
translate_object_xyz_random(sp28, 700.0f);
|
|
|
|
}
|
|
|
|
o->oAction = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ActionFish1(void) {
|
|
|
|
if (gCurrLevelNum != LEVEL_SA)
|
|
|
|
if (gMarioObject->oPosY - o->oPosY > 2000.0f)
|
|
|
|
o->oAction = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ActionFish2(void) {
|
|
|
|
o->oAction = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void (*sFishActions[])(void) = { ActionFish0, ActionFish1, ActionFish2 };
|
|
|
|
|
|
|
|
void bhv_fish_loop(void) {
|
|
|
|
obj_call_action_function(sFishActions);
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_802BF59C(s32 a0) {
|
|
|
|
f32 sp1C = o->parentObj->oPosY;
|
|
|
|
if (gCurrLevelNum == LEVEL_SA) {
|
|
|
|
if (500.0f < absf(o->oPosY - o->oFishGroupUnkF8))
|
|
|
|
a0 = 10;
|
|
|
|
o->oPosY = approach_f32_symmetric(o->oPosY, o->oFishGroupUnkF8, a0);
|
|
|
|
} else if (sp1C - 100.0f - o->oFishGroupUnk10C < o->oPosY
|
|
|
|
&& o->oPosY < sp1C + 1000.0f + o->oFishGroupUnk10C)
|
|
|
|
o->oPosY = approach_f32_symmetric(o->oPosY, o->oFishGroupUnkF8, a0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ActionFishGroup1(void) {
|
|
|
|
f32 sp1C = o->oPosY - gMarioObject->oPosY;
|
|
|
|
if (o->oTimer < 10)
|
|
|
|
func_8029ED98(0, 2.0f);
|
|
|
|
else
|
|
|
|
func_8029ED98(0, 1.0f);
|
|
|
|
if (o->oTimer == 0) {
|
|
|
|
o->oForwardVel = RandomFloat() * 2 + 3.0f;
|
|
|
|
if (gCurrLevelNum == LEVEL_SA)
|
|
|
|
o->oFishGroupUnkFC = RandomFloat() * 700.0f;
|
|
|
|
else
|
|
|
|
o->oFishGroupUnkFC = RandomFloat() * 100.0f;
|
|
|
|
o->oFishGroupUnk104 = RandomFloat() * 500 + 200.0f;
|
|
|
|
}
|
|
|
|
o->oFishGroupUnkF8 = gMarioObject->oPosY + o->oFishGroupUnkFC;
|
|
|
|
obj_rotate_yaw_toward(o->oAngleToMario, 0x400);
|
|
|
|
if (o->oPosY < o->oFishGroupUnkF4 - 50.0f) {
|
|
|
|
if (sp1C < 0.0f)
|
|
|
|
sp1C = 0.0f - sp1C;
|
|
|
|
if (sp1C < 500.0f)
|
|
|
|
func_802BF59C(2);
|
|
|
|
else
|
|
|
|
func_802BF59C(4);
|
|
|
|
} else {
|
|
|
|
o->oPosY = o->oFishGroupUnkF4 - 50.0f;
|
|
|
|
if (sp1C > 300.0f)
|
|
|
|
o->oPosY = o->oPosY - 1.0f;
|
|
|
|
}
|
|
|
|
if (o->oDistanceToMario < o->oFishGroupUnk104 + 150.0f)
|
|
|
|
o->oAction = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ActionFishGroup2(void) {
|
|
|
|
f32 sp1C = o->oPosY - gMarioObject->oPosY;
|
|
|
|
s32 sp18;
|
|
|
|
o->oFishGroupUnkF8 = gMarioObject->oPosY + o->oFishGroupUnkFC;
|
|
|
|
if (o->oTimer == 0) {
|
|
|
|
o->oFishGroupUnk110 = RandomFloat() * 300.0f;
|
|
|
|
o->oFishGroupUnk100 = RandomFloat() * 1024.0f + 1024.0f;
|
|
|
|
o->oFishGroupUnk108 = RandomFloat() * 4.0f + 8.0f + 5.0f;
|
|
|
|
if (o->oDistanceToMario < 600.0f)
|
|
|
|
sp18 = 1;
|
|
|
|
else
|
|
|
|
sp18 = (s32)(1.0 / (o->oDistanceToMario / 600.0));
|
|
|
|
sp18 *= 127;
|
2019-10-05 19:08:05 +00:00
|
|
|
PlaySound2(SOUND_GENERAL_MOVING_WATER);
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
if (o->oTimer < LEVEL_SA)
|
|
|
|
func_8029ED98(0, 4.0f);
|
|
|
|
else
|
|
|
|
func_8029ED98(0, 1.0f);
|
|
|
|
if (o->oForwardVel < o->oFishGroupUnk108)
|
|
|
|
o->oForwardVel = o->oForwardVel + 0.5;
|
|
|
|
o->oFishGroupUnkF8 = gMarioObject->oPosY + o->oFishGroupUnkFC;
|
|
|
|
obj_rotate_yaw_toward(o->oAngleToMario + 0x8000, o->oFishGroupUnk100);
|
|
|
|
if (o->oPosY < o->oFishGroupUnkF4 - 50.0f) {
|
|
|
|
if (sp1C < 0.0f)
|
|
|
|
sp1C = 0.0f - sp1C;
|
|
|
|
if (sp1C < 500.0f)
|
|
|
|
func_802BF59C(2);
|
|
|
|
else
|
|
|
|
func_802BF59C(4);
|
|
|
|
} else {
|
|
|
|
o->oPosY = o->oFishGroupUnkF4 - 50.0f;
|
|
|
|
if (sp1C > 300.0f)
|
|
|
|
o->oPosY -= 1.0f;
|
|
|
|
}
|
|
|
|
if (o->oDistanceToMario > o->oFishGroupUnk110 + 500.0f)
|
|
|
|
o->oAction = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ActionFishGroup0(void) {
|
|
|
|
func_8029ED98(0, 1.0f);
|
|
|
|
o->header.gfx.unk38.animFrame = (s16)(RandomFloat() * 28.0f);
|
|
|
|
o->oFishGroupUnk10C = RandomFloat() * 300.0f;
|
|
|
|
obj_scale(RandomFloat() * 0.4 + 0.8);
|
|
|
|
o->oAction = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void (*sFishGroupActions[])(void) = { ActionFishGroup0, ActionFishGroup1, ActionFishGroup2 };
|
|
|
|
|
|
|
|
void bhv_fish_group_2_loop(void) // TODO rename
|
|
|
|
{
|
|
|
|
UNUSED s32 unused[4];
|
|
|
|
obj_scale(1.0f);
|
|
|
|
o->oFishGroupUnkF4 = find_water_level(o->oPosX, o->oPosZ);
|
|
|
|
if (gCurrLevelNum == LEVEL_SA)
|
|
|
|
o->oFishGroupUnkF4 = 0.0f;
|
|
|
|
o->oWallHitboxRadius = 30.0f;
|
|
|
|
obj_resolve_wall_collisions();
|
|
|
|
if (gCurrLevelNum != LEVEL_UNKNOWN_32) {
|
|
|
|
if (o->oFishGroupUnkF4 < -10000.0f) {
|
|
|
|
mark_object_for_deletion(o);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
o->oFishGroupUnkF4 = 1000.0f;
|
|
|
|
obj_call_action_function(sFishGroupActions);
|
|
|
|
obj_move_using_fvel_and_gravity();
|
|
|
|
if (o->parentObj->oAction == 2)
|
|
|
|
mark_object_for_deletion(o);
|
|
|
|
}
|