2019-08-25 04:46:40 +00:00
|
|
|
// chuckya.c.inc
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
void common_anchor_mario_behavior(f32 sp28, f32 sp2C, s32 sp30) {
|
2019-10-05 19:08:05 +00:00
|
|
|
switch (o->parentObj->oChuckyaUnk88) {
|
2019-08-25 04:46:40 +00:00
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
case 1:
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_set_gfx_pos_at_obj_pos(gMarioObject, o);
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
gMarioObject->oInteractStatus |= (sp30 + INT_STATUS_MARIO_UNK2);
|
|
|
|
gMarioStates->forwardVel = sp28;
|
|
|
|
gMarioStates->vel[1] = sp2C;
|
2019-10-05 19:08:05 +00:00
|
|
|
o->parentObj->oChuckyaUnk88 = 0;
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
gMarioObject->oInteractStatus |=
|
|
|
|
(INT_STATUS_MARIO_UNK2 + INT_STATUS_MARIO_UNK6); // loads 2 interactions at once?
|
|
|
|
gMarioStates->forwardVel = 10.0f;
|
|
|
|
gMarioStates->vel[1] = 10.0f;
|
2019-10-05 19:08:05 +00:00
|
|
|
o->parentObj->oChuckyaUnk88 = 0;
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
o->oMoveAngleYaw = o->parentObj->oMoveAngleYaw;
|
|
|
|
if (!o->parentObj->activeFlags)
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_mark_for_deletion(o);
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void bhv_chuckya_anchor_mario_loop(void) {
|
2020-03-02 03:42:52 +00:00
|
|
|
common_anchor_mario_behavior(40.0f, 40.0f, 64);
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
s32 unknown_chuckya_function(s32 sp20, f32 sp24, f32 sp28, s32 sp2C) {
|
2019-08-25 04:46:40 +00:00
|
|
|
s32 sp1C = 0;
|
2019-10-05 19:08:05 +00:00
|
|
|
if (o->oChuckyaUnkF8 != 4) {
|
2020-03-02 03:42:52 +00:00
|
|
|
if (sp24 < cur_obj_lateral_dist_from_mario_to_home()) {
|
|
|
|
if (cur_obj_lateral_dist_to_home() < 200.0f)
|
2019-08-25 04:46:40 +00:00
|
|
|
sp1C = 0;
|
|
|
|
else {
|
|
|
|
sp1C = 1;
|
2020-03-02 03:42:52 +00:00
|
|
|
o->oAngleToMario = cur_obj_angle_to_home();
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
} else if (o->oDistanceToMario > sp28) {
|
|
|
|
if (gGlobalTimer % (s16) sp2C == 0)
|
2020-03-02 03:42:52 +00:00
|
|
|
o->oAngleToMario = obj_angle_to_object(o, gMarioObject);
|
2019-08-25 04:46:40 +00:00
|
|
|
sp1C = 2;
|
|
|
|
} else
|
|
|
|
sp1C = 3;
|
2020-03-02 03:42:52 +00:00
|
|
|
if (sp20 && update_angle_from_move_flags(&o->oAngleToMario)) {
|
2019-08-25 04:46:40 +00:00
|
|
|
sp1C = 4;
|
2019-10-05 19:08:05 +00:00
|
|
|
o->oChuckyaUnkF8 = 4;
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
} else
|
|
|
|
sp1C = 4;
|
|
|
|
return sp1C;
|
|
|
|
}
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
s32 approach_forward_vel(f32 *arr, f32 spC, f32 sp10) {
|
2019-08-25 04:46:40 +00:00
|
|
|
s32 sp4 = 0;
|
|
|
|
if (arr[0] > spC) {
|
|
|
|
arr[0] -= sp10;
|
|
|
|
if (arr[0] < spC)
|
|
|
|
arr[0] = spC;
|
|
|
|
} else if (arr[0] < spC) {
|
|
|
|
arr[0] += sp10;
|
|
|
|
if (arr[0] > spC)
|
|
|
|
arr[0] = spC;
|
|
|
|
} else
|
|
|
|
sp4 = 1;
|
|
|
|
return sp4;
|
|
|
|
}
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
void chuckya_act_0(void) {
|
2019-08-25 04:46:40 +00:00
|
|
|
s32 sp3C;
|
|
|
|
UNUSED u8 pad[16];
|
|
|
|
s32 sp28;
|
|
|
|
if (o->oTimer == 0)
|
2019-10-05 19:08:05 +00:00
|
|
|
o->oChuckyaUnkFC = 0;
|
2020-03-02 03:42:52 +00:00
|
|
|
o->oAngleToMario = obj_angle_to_object(o, gMarioObject);
|
2019-08-25 04:46:40 +00:00
|
|
|
switch (sp28 = o->oSubAction) {
|
|
|
|
case 0:
|
|
|
|
o->oForwardVel = 0;
|
2020-03-02 03:42:52 +00:00
|
|
|
if (cur_obj_lateral_dist_from_mario_to_home() < 2000.0f) {
|
|
|
|
cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x400);
|
2019-10-05 19:08:05 +00:00
|
|
|
if (o->oChuckyaUnkFC > 40
|
2019-08-25 04:46:40 +00:00
|
|
|
|| abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) < 0x1000)
|
|
|
|
o->oSubAction = 1;
|
|
|
|
} else
|
|
|
|
o->oSubAction = 3;
|
|
|
|
break;
|
|
|
|
case 1:
|
2020-03-02 03:42:52 +00:00
|
|
|
approach_forward_vel(&o->oForwardVel, 30.0f, 4.0f);
|
2019-08-25 04:46:40 +00:00
|
|
|
if (abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) > 0x4000)
|
|
|
|
o->oSubAction = 2;
|
2020-03-02 03:42:52 +00:00
|
|
|
if (cur_obj_lateral_dist_from_mario_to_home() > 2000.0f)
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oSubAction = 3;
|
|
|
|
break;
|
|
|
|
case 2:
|
2020-03-02 03:42:52 +00:00
|
|
|
approach_forward_vel(&o->oForwardVel, 0, 4.0f);
|
2019-10-05 19:08:05 +00:00
|
|
|
if (o->oChuckyaUnkFC > 48)
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oSubAction = 0;
|
|
|
|
break;
|
|
|
|
case 3:
|
2020-03-02 03:42:52 +00:00
|
|
|
if (cur_obj_lateral_dist_to_home() < 500.0f)
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oForwardVel = 0;
|
|
|
|
else {
|
2020-03-02 03:42:52 +00:00
|
|
|
approach_forward_vel(&o->oForwardVel, 10.0f, 4.0f);
|
|
|
|
o->oAngleToMario = cur_obj_angle_to_home();
|
|
|
|
cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x800);
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
2020-03-02 03:42:52 +00:00
|
|
|
if (cur_obj_lateral_dist_from_mario_to_home() < 1900.0f)
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oSubAction = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (o->oSubAction != sp28)
|
2019-10-05 19:08:05 +00:00
|
|
|
o->oChuckyaUnkFC = 0;
|
2019-08-25 04:46:40 +00:00
|
|
|
else
|
2019-10-05 19:08:05 +00:00
|
|
|
o->oChuckyaUnkFC++;
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_init_animation_with_sound(4);
|
2019-08-25 04:46:40 +00:00
|
|
|
if (o->oForwardVel > 1.0f)
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_play_sound_1(SOUND_AIR_CHUCKYA_MOVE);
|
2019-08-25 04:46:40 +00:00
|
|
|
print_debug_bottom_up("fg %d", sp3C);
|
|
|
|
print_debug_bottom_up("sp %d", o->oForwardVel);
|
|
|
|
}
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
void chuckya_act_1(void) {
|
2019-08-25 04:46:40 +00:00
|
|
|
if (o->oSubAction == 0) {
|
2020-03-02 03:42:52 +00:00
|
|
|
if (cur_obj_init_animation_and_check_if_near_end(0))
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oSubAction++;
|
2020-04-03 18:57:26 +00:00
|
|
|
o->oChuckyaUnkFC = random_float() * 30.0f + 10.0f;
|
2019-10-05 19:08:05 +00:00
|
|
|
o->oChuckyaUnk100 = 0;
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oForwardVel = 0.0f;
|
|
|
|
} else {
|
|
|
|
if (o->oSubAction == 1) {
|
2019-10-05 19:08:05 +00:00
|
|
|
o->oChuckyaUnk100 += player_performed_grab_escape_action();
|
|
|
|
print_debug_bottom_up("%d", o->oChuckyaUnk100);
|
|
|
|
if (o->oChuckyaUnk100 > 10) {
|
|
|
|
o->oChuckyaUnk88 = 3;
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oAction = 3;
|
|
|
|
o->oInteractStatus &= ~(INT_STATUS_GRABBED_MARIO);
|
|
|
|
} else {
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_init_animation_with_sound(1);
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oMoveAngleYaw += INT_STATUS_GRABBED_MARIO;
|
2019-10-05 19:08:05 +00:00
|
|
|
if (o->oChuckyaUnkFC-- < 0)
|
2020-03-02 03:42:52 +00:00
|
|
|
if (check_if_moving_over_floor(50.0f, 150.0f) || o->oChuckyaUnkFC < -16) {
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oSubAction++;
|
|
|
|
;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_init_animation_with_sound(3);
|
|
|
|
if (cur_obj_check_anim_frame(18)) {
|
|
|
|
cur_obj_play_sound_2(SOUND_OBJ_UNKNOWN4);
|
2019-10-05 19:08:05 +00:00
|
|
|
o->oChuckyaUnk88 = 2;
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oAction = 3;
|
|
|
|
o->oInteractStatus &= ~(INT_STATUS_GRABBED_MARIO);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
void chuckya_act_3(void) {
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oForwardVel = 0;
|
|
|
|
o->oVelY = 0;
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_init_animation_with_sound(4);
|
2019-08-25 04:46:40 +00:00
|
|
|
if (o->oTimer > 100)
|
|
|
|
o->oAction = 0;
|
|
|
|
}
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
void chuckya_act_2(void) {
|
2019-08-25 04:46:40 +00:00
|
|
|
if (o->oMoveFlags & (0x200 | 0x40 | 0x20 | 0x10 | 0x8 | 0x1)) {
|
2020-03-02 03:42:52 +00:00
|
|
|
obj_mark_for_deletion(o);
|
|
|
|
obj_spawn_loot_yellow_coins(o, 5, 20.0f);
|
|
|
|
spawn_mist_particles_with_sound(SOUND_OBJ_CHUCKYA_DEATH);
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
void (*sChuckyaActions[])(void) = { chuckya_act_0, chuckya_act_1, chuckya_act_2, chuckya_act_3 };
|
2019-08-25 04:46:40 +00:00
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
void chuckya_move(void) {
|
|
|
|
cur_obj_update_floor_and_walls();
|
|
|
|
cur_obj_call_action_function(sChuckyaActions);
|
|
|
|
cur_obj_move_standard(-30);
|
2019-08-25 04:46:40 +00:00
|
|
|
if (o->oInteractStatus & INT_STATUS_GRABBED_MARIO) {
|
|
|
|
o->oAction = 1;
|
2019-10-05 19:08:05 +00:00
|
|
|
o->oChuckyaUnk88 = 1;
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_play_sound_2(SOUND_OBJ_UNKNOWN3);
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void bhv_chuckya_loop(void) {
|
|
|
|
f32 sp2C = 20.0f;
|
|
|
|
f32 sp28 = 50.0f;
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_scale(2.0f);
|
2019-09-01 19:50:50 +00:00
|
|
|
o->oInteractionSubtype |= INT_SUBTYPE_GRABS_MARIO;
|
2019-08-25 04:46:40 +00:00
|
|
|
switch (o->oHeldState) {
|
|
|
|
case HELD_FREE:
|
2020-03-02 03:42:52 +00:00
|
|
|
chuckya_move();
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
case HELD_HELD:
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_unrender_and_reset_state(2, 0);
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
case HELD_THROWN:
|
|
|
|
case HELD_DROPPED:
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_get_thrown_or_placed(sp2C, sp28, 2);
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
o->oInteractStatus = 0;
|
|
|
|
print_debug_bottom_up("md %d", o->oAction);
|
|
|
|
}
|