sm64coopdx/src/game/behaviors/kickable_board.inc.c

97 lines
3.7 KiB
C
Raw Normal View History

2019-08-25 04:46:40 +00:00
// kickable_board.c.inc
2020-08-12 06:02:03 +00:00
s32 check_mario_attacking(struct MarioState* marioState) {
if (obj_check_if_collided_with_object(o, marioState->marioObj)) {
if (abs_angle_diff(o->oMoveAngleYaw, marioState->marioObj->oMoveAngleYaw) > 0x6000) {
if (marioState->action == ACT_SLIDE_KICK)
2019-08-25 04:46:40 +00:00
return 1;
2020-08-12 06:02:03 +00:00
if (marioState->action == ACT_PUNCHING)
2019-08-25 04:46:40 +00:00
return 1;
2020-08-12 06:02:03 +00:00
if (marioState->action == ACT_MOVE_PUNCHING)
2019-08-25 04:46:40 +00:00
return 1;
2020-08-12 06:02:03 +00:00
if (marioState->action == ACT_SLIDE_KICK_SLIDE)
2019-08-25 04:46:40 +00:00
return 1;
2020-08-12 06:02:03 +00:00
if (marioState->action == ACT_JUMP_KICK)
2019-08-25 04:46:40 +00:00
return 2;
2020-08-12 06:02:03 +00:00
if (marioState->action == ACT_WALL_KICK_AIR)
2019-08-25 04:46:40 +00:00
return 2;
}
}
return 0;
}
2020-03-02 03:42:52 +00:00
void init_kickable_board_rock(void) {
2019-10-05 19:08:05 +00:00
o->oKickableBoardF8 = 1600;
o->oKickableBoardF4 = 0;
2019-08-25 04:46:40 +00:00
}
void bhv_kickable_board_loop(void) {
2020-08-12 06:02:03 +00:00
struct MarioState* marioState = nearest_mario_state_to_object(o);
if (!network_sync_object_initialized(o)) {
2020-08-12 06:02:03 +00:00
network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS);
network_init_object_field(o, &o->oAction);
network_init_object_field(o, &o->oAngleVelPitch);
network_init_object_field(o, &o->oFaceAnglePitch);
network_init_object_field(o, &o->oKickableBoardF4);
network_init_object_field(o, &o->oKickableBoardF8);
network_init_object_field(o, &o->oMoveAngleYaw);
network_init_object_field(o, &o->oPosY);
network_init_object_field(o, &o->oTimer);
}
2019-08-25 04:46:40 +00:00
s32 sp24;
switch (o->oAction) {
case 0:
o->oFaceAnglePitch = 0;
2020-08-12 06:02:03 +00:00
if (check_mario_attacking(marioState)) {
2020-03-02 03:42:52 +00:00
init_kickable_board_rock();
2019-08-25 04:46:40 +00:00
o->oAction++;
2020-08-12 06:02:03 +00:00
if (network_owns_object(o)) { network_send_object(o); }
2019-08-25 04:46:40 +00:00
}
load_object_collision_model();
break;
case 1:
o->oFaceAnglePitch = 0;
load_object_collision_model();
2019-10-05 19:08:05 +00:00
o->oFaceAnglePitch = -sins(o->oKickableBoardF4) * o->oKickableBoardF8;
2020-08-12 06:02:03 +00:00
if (o->oTimer > 30 && (sp24 = check_mario_attacking(marioState))) {
if (marioState->marioObj->oPosY > o->oPosY + 160.0f && sp24 == 2) {
2019-08-25 04:46:40 +00:00
o->oAction++;
2020-03-02 03:42:52 +00:00
cur_obj_play_sound_2(SOUND_GENERAL_BUTTON_PRESS_2);
2020-08-12 06:02:03 +00:00
if (network_owns_object(o)) { network_send_object(o); }
2019-08-25 04:46:40 +00:00
} else
o->oTimer = 0;
}
if (o->oTimer != 0) {
2019-10-05 19:08:05 +00:00
o->oKickableBoardF8 -= 8;
2020-08-12 06:02:03 +00:00
if (o->oKickableBoardF8 < 0) {
2019-08-25 04:46:40 +00:00
o->oAction = 0;
2020-08-12 06:02:03 +00:00
if (network_owns_object(o)) { network_send_object(o); }
}
2019-08-25 04:46:40 +00:00
} else
2020-03-02 03:42:52 +00:00
init_kickable_board_rock();
2019-10-05 19:08:05 +00:00
if (!(o->oKickableBoardF4 & 0x7FFF))
2020-03-02 03:42:52 +00:00
cur_obj_play_sound_2(SOUND_GENERAL_BUTTON_PRESS_2);
2019-10-05 19:08:05 +00:00
o->oKickableBoardF4 += 0x400;
2019-08-25 04:46:40 +00:00
break;
case 2:
2020-03-02 03:42:52 +00:00
cur_obj_become_intangible();
cur_obj_set_model(MODEL_WF_KICKABLE_BOARD_FELLED);
2019-08-25 04:46:40 +00:00
o->oAngleVelPitch -= 0x80;
o->oFaceAnglePitch += o->oAngleVelPitch;
if (o->oFaceAnglePitch < -0x4000) {
o->oFaceAnglePitch = -0x4000;
o->oAngleVelPitch = 0;
o->oAction++;
2020-03-02 03:42:52 +00:00
cur_obj_shake_screen(SHAKE_POS_SMALL);
cur_obj_play_sound_2(SOUND_GENERAL_UNKNOWN4);
2020-08-12 06:02:03 +00:00
if (network_owns_object(o)) { network_send_object(o); }
2019-08-25 04:46:40 +00:00
}
load_object_collision_model();
break;
case 3:
load_object_collision_model();
break;
}
o->header.gfx.throwMatrix = NULL;
}