mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-10-20 04:02:39 +00:00
8c650a5b7d
This allows clients to spawn a new sync object after the level loads and synchronize it. Changed how un-initialized sync objects are detected Koopa shells are the first thing to use this new system Removed network_object_settings() command, instead explicitly setting the sync object parameters
96 lines
3.7 KiB
C
96 lines
3.7 KiB
C
// kickable_board.c.inc
|
|
|
|
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)
|
|
return 1;
|
|
if (marioState->action == ACT_PUNCHING)
|
|
return 1;
|
|
if (marioState->action == ACT_MOVE_PUNCHING)
|
|
return 1;
|
|
if (marioState->action == ACT_SLIDE_KICK_SLIDE)
|
|
return 1;
|
|
if (marioState->action == ACT_JUMP_KICK)
|
|
return 2;
|
|
if (marioState->action == ACT_WALL_KICK_AIR)
|
|
return 2;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void init_kickable_board_rock(void) {
|
|
o->oKickableBoardF8 = 1600;
|
|
o->oKickableBoardF4 = 0;
|
|
}
|
|
|
|
void bhv_kickable_board_loop(void) {
|
|
struct MarioState* marioState = nearest_mario_state_to_object(o);
|
|
if (!network_sync_object_initialized(o)) {
|
|
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);
|
|
}
|
|
s32 sp24;
|
|
switch (o->oAction) {
|
|
case 0:
|
|
o->oFaceAnglePitch = 0;
|
|
if (check_mario_attacking(marioState)) {
|
|
init_kickable_board_rock();
|
|
o->oAction++;
|
|
if (network_owns_object(o)) { network_send_object(o); }
|
|
}
|
|
load_object_collision_model();
|
|
break;
|
|
case 1:
|
|
o->oFaceAnglePitch = 0;
|
|
load_object_collision_model();
|
|
o->oFaceAnglePitch = -sins(o->oKickableBoardF4) * o->oKickableBoardF8;
|
|
if (o->oTimer > 30 && (sp24 = check_mario_attacking(marioState))) {
|
|
if (marioState->marioObj->oPosY > o->oPosY + 160.0f && sp24 == 2) {
|
|
o->oAction++;
|
|
cur_obj_play_sound_2(SOUND_GENERAL_BUTTON_PRESS_2);
|
|
if (network_owns_object(o)) { network_send_object(o); }
|
|
} else
|
|
o->oTimer = 0;
|
|
}
|
|
if (o->oTimer != 0) {
|
|
o->oKickableBoardF8 -= 8;
|
|
if (o->oKickableBoardF8 < 0) {
|
|
o->oAction = 0;
|
|
if (network_owns_object(o)) { network_send_object(o); }
|
|
}
|
|
} else
|
|
init_kickable_board_rock();
|
|
if (!(o->oKickableBoardF4 & 0x7FFF))
|
|
cur_obj_play_sound_2(SOUND_GENERAL_BUTTON_PRESS_2);
|
|
o->oKickableBoardF4 += 0x400;
|
|
break;
|
|
case 2:
|
|
cur_obj_become_intangible();
|
|
cur_obj_set_model(MODEL_WF_KICKABLE_BOARD_FELLED);
|
|
o->oAngleVelPitch -= 0x80;
|
|
o->oFaceAnglePitch += o->oAngleVelPitch;
|
|
if (o->oFaceAnglePitch < -0x4000) {
|
|
o->oFaceAnglePitch = -0x4000;
|
|
o->oAngleVelPitch = 0;
|
|
o->oAction++;
|
|
cur_obj_shake_screen(SHAKE_POS_SMALL);
|
|
cur_obj_play_sound_2(SOUND_GENERAL_UNKNOWN4);
|
|
if (network_owns_object(o)) { network_send_object(o); }
|
|
}
|
|
load_object_collision_model();
|
|
break;
|
|
case 3:
|
|
load_object_collision_model();
|
|
break;
|
|
}
|
|
o->header.gfx.throwMatrix = NULL;
|
|
}
|