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

211 lines
6.5 KiB
C

// chuckya.c.inc
void func_802A8D18(f32 sp28, f32 sp2C, s32 sp30) {
switch (o->parentObj->oUnknownUnk88) {
case 0:
break;
case 1:
func_802A2008(gMarioObject, o);
break;
case 2:
gMarioObject->oInteractStatus |= (sp30 + INT_STATUS_MARIO_UNK2);
gMarioStates->forwardVel = sp28;
gMarioStates->vel[1] = sp2C;
o->parentObj->oUnknownUnk88 = 0;
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;
o->parentObj->oUnknownUnk88 = 0;
break;
}
o->oMoveAngleYaw = o->parentObj->oMoveAngleYaw;
if (!o->parentObj->activeFlags)
mark_object_for_deletion(o);
}
void bhv_chuckya_anchor_mario_loop(void) {
func_802A8D18(40.0f, 40.0f, 64);
}
s32 Unknown802A8EC8(s32 sp20, f32 sp24, f32 sp28, s32 sp2C) {
s32 sp1C = 0;
if (o->OBJECT_FIELD_S32(0x1C) != 4) {
if (sp24 < obj_lateral_dist_from_mario_to_home()) {
if (obj_lateral_dist_to_home() < 200.0f)
sp1C = 0;
else {
sp1C = 1;
o->oAngleToMario = obj_angle_to_home();
}
} else if (o->oDistanceToMario > sp28) {
if (gGlobalTimer % (s16) sp2C == 0)
o->oAngleToMario = angle_to_object(o, gMarioObject);
sp1C = 2;
} else
sp1C = 3;
if (sp20 && func_802C5A64(&o->oAngleToMario)) {
sp1C = 4;
o->OBJECT_FIELD_S32(0x1C) = 4;
}
} else
sp1C = 4;
return sp1C;
}
s32 func_802A9050(f32 *arr, f32 spC, f32 sp10) {
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;
}
void ActionChuckya0(void) {
s32 sp3C;
UNUSED u8 pad[16];
s32 sp28;
if (o->oTimer == 0)
o->OBJECT_FIELD_S32(0x1D) = 0;
o->oAngleToMario = angle_to_object(o, gMarioObject);
switch (sp28 = o->oSubAction) {
case 0:
o->oForwardVel = 0;
if (obj_lateral_dist_from_mario_to_home() < 2000.0f) {
obj_rotate_yaw_toward(o->oAngleToMario, 0x400);
if (o->OBJECT_FIELD_S32(0x1D) > 40
|| abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) < 0x1000)
o->oSubAction = 1;
} else
o->oSubAction = 3;
break;
case 1:
func_802A9050(&o->oForwardVel, 30.0f, 4.0f);
if (abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) > 0x4000)
o->oSubAction = 2;
if (obj_lateral_dist_from_mario_to_home() > 2000.0f)
o->oSubAction = 3;
break;
case 2:
func_802A9050(&o->oForwardVel, 0, 4.0f);
if (o->OBJECT_FIELD_S32(0x1D) > 48)
o->oSubAction = 0;
break;
case 3:
if (obj_lateral_dist_to_home() < 500.0f)
o->oForwardVel = 0;
else {
func_802A9050(&o->oForwardVel, 10.0f, 4.0f);
o->oAngleToMario = obj_angle_to_home();
obj_rotate_yaw_toward(o->oAngleToMario, 0x800);
}
if (obj_lateral_dist_from_mario_to_home() < 1900.0f)
o->oSubAction = 0;
break;
}
if (o->oSubAction != sp28)
o->OBJECT_FIELD_S32(0x1D) = 0;
else
o->OBJECT_FIELD_S32(0x1D)++;
set_obj_animation_and_sound_state(4);
if (o->oForwardVel > 1.0f)
PlaySound(SOUND_CH6_CHUCKYAMOVE);
print_debug_bottom_up("fg %d", sp3C);
print_debug_bottom_up("sp %d", o->oForwardVel);
}
void ActionChuckya1(void) {
if (o->oSubAction == 0) {
if (func_802A4AB0(0))
o->oSubAction++;
o->OBJECT_FIELD_S32(0x1D) = RandomFloat() * 30.0f + 10.0f;
o->OBJECT_FIELD_S32(0x1E) = 0;
o->oForwardVel = 0.0f;
} else {
if (o->oSubAction == 1) {
o->OBJECT_FIELD_S32(0x1E) += player_performed_grab_escape_action();
print_debug_bottom_up("%d", o->OBJECT_FIELD_S32(0x1E));
if (o->OBJECT_FIELD_S32(0x1E) > 10) {
o->oUnknownUnk88 = 3;
o->oAction = 3;
o->oInteractStatus &= ~(INT_STATUS_GRABBED_MARIO);
} else {
set_obj_animation_and_sound_state(1);
o->oMoveAngleYaw += INT_STATUS_GRABBED_MARIO;
if (o->OBJECT_FIELD_S32(0x1D)-- < 0)
if (func_802B0C54(50.0f, 150.0f) || o->OBJECT_FIELD_S32(0x1D) < -16) {
o->oSubAction++;
;
}
}
} else {
set_obj_animation_and_sound_state(3);
if (obj_check_anim_frame(18)) {
PlaySound2(SOUND_OBJECT_UNKNOWN4);
o->oUnknownUnk88 = 2;
o->oAction = 3;
o->oInteractStatus &= ~(INT_STATUS_GRABBED_MARIO);
}
}
}
}
void ActionChuckya3(void) {
o->oForwardVel = 0;
o->oVelY = 0;
set_obj_animation_and_sound_state(4);
if (o->oTimer > 100)
o->oAction = 0;
}
void ActionChuckya2(void) {
if (o->oMoveFlags & (0x200 | 0x40 | 0x20 | 0x10 | 0x8 | 0x1)) {
mark_object_for_deletion(o);
spawn_object_loot_yellow_coins(o, 5, 20.0f);
func_802A3034(SOUND_OBJECT_CHUCKYADEATH);
}
}
void (*sChuckyaActions[])(void) = { ActionChuckya0, ActionChuckya1, ActionChuckya2, ActionChuckya3 };
void func_802A97B8(void) {
obj_update_floor_and_walls();
obj_call_action_function(sChuckyaActions);
obj_move_standard(-30);
if (o->oInteractStatus & INT_STATUS_GRABBED_MARIO) {
o->oAction = 1;
o->oUnknownUnk88 = 1;
PlaySound2(SOUND_OBJECT_UNKNOWN3);
}
}
void bhv_chuckya_loop(void) {
f32 sp2C = 20.0f;
f32 sp28 = 50.0f;
obj_scale(2.0f);
o->oInteractionSubtype |= INT_SUBTYPE_GRABS_MARIO;
switch (o->oHeldState) {
case HELD_FREE:
func_802A97B8();
break;
case HELD_HELD:
func_8029FA5C(2, 0);
break;
case HELD_THROWN:
case HELD_DROPPED:
obj_get_thrown_or_placed(sp2C, sp28, 2);
break;
}
o->oInteractStatus = 0;
print_debug_bottom_up("md %d", o->oAction);
}