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

215 lines
7.3 KiB
C
Raw Normal View History

2019-08-25 04:46:40 +00:00
// cannon.c.inc
void bhv_cannon_base_unused_loop(void) {
o->oPosY += o->oVelY;
}
2020-03-02 03:42:52 +00:00
void opened_cannon_act_0(void) {
2019-08-25 04:46:40 +00:00
if (o->oTimer == 0) {
o->oInteractStatus = 0;
o->oPosX = o->oHomeX;
o->oPosY = o->oHomeY;
o->oPosZ = o->oHomeZ;
o->oMoveAnglePitch = 0;
o->oMoveAngleYaw = (s16)(o->oBehParams2ndByte << 8);
2019-10-05 19:08:05 +00:00
o->oCannonUnkF4 = 0;
o->oCannonUnk10C = 0;
2020-03-02 03:42:52 +00:00
cur_obj_enable_rendering();
cur_obj_become_tangible();
2019-08-25 04:46:40 +00:00
}
cur_obj_become_tangible();
cur_obj_enable_rendering();
2020-08-09 14:42:44 +00:00
struct Object* player = nearest_player_to_object(o);
int distanceToPlayer = dist_between_objects(o, player);
if (distanceToPlayer < 500.0f) {
//cur_obj_become_tangible();
//cur_obj_enable_rendering();
if (player == gMarioStates[0].marioObj) {
2020-08-09 14:42:44 +00:00
if (o->oInteractStatus & INT_STATUS_INTERACTED && (!(o->oInteractStatus & INT_STATUS_TOUCHED_BOB_OMB))) { // bob-omb explodes when it gets into a cannon
o->oAction = 4;
o->oCannonUnk10C = 1;
o->oCannonUnkF8 = 1;
o->oCannonIsLocal = TRUE;
network_send_object(o);
} else {
o->oInteractStatus = 0;
}
}
2019-08-25 04:46:40 +00:00
} else {
//cur_obj_become_intangible();
//cur_obj_disable_rendering();
2019-10-05 19:08:05 +00:00
o->oCannonUnk10C = 0;
2019-08-25 04:46:40 +00:00
}
}
2020-03-02 03:42:52 +00:00
void opened_cannon_act_4(void) {
2019-08-25 04:46:40 +00:00
if (o->oTimer == 0)
2020-03-02 03:42:52 +00:00
cur_obj_play_sound_2(SOUND_OBJ_CANNON1);
2019-08-25 04:46:40 +00:00
o->oPosY += 5.0f;
o->oPosX += (f32)((o->oTimer / 2 & 1) - 0.5) * 2;
o->oPosZ += (f32)((o->oTimer / 2 & 1) - 0.5) * 2;
if (o->oTimer > 67) {
o->oPosX += (f32)((o->oTimer / 2 & 1) - 0.5) * 4;
o->oPosZ += (f32)((o->oTimer / 2 & 1) - 0.5) * 4;
o->oAction = 6;
}
2020-08-09 14:42:44 +00:00
if (!o->oCannonIsLocal) {
// two-player hack
gMarioStates[1].marioObj->oMarioCannonObjectYaw = o->oMoveAngleYaw;
gMarioStates[1].marioObj->oMarioCannonInputYaw = 0;
}
2019-08-25 04:46:40 +00:00
}
2020-03-02 03:42:52 +00:00
void opened_cannon_act_6(void) {
2019-08-25 04:46:40 +00:00
if (o->oTimer == 0)
2020-03-02 03:42:52 +00:00
cur_obj_play_sound_2(SOUND_OBJ_CANNON2);
2019-08-25 04:46:40 +00:00
if (o->oTimer < 4) {
o->oPosX += (f32)((o->oTimer / 2 & 1) - 0.5) * 4.0f;
o->oPosZ += (f32)((o->oTimer / 2 & 1) - 0.5) * 4.0f;
} else {
if (o->oTimer < 6) {
} else {
if (o->oTimer < 22) {
2020-08-09 14:42:44 +00:00
o->oMoveAngleYaw = sins(o->oCannonUnkF4) * 0x4000 + ((s16)(o->oBehParams2ndByte << 8));
2019-10-05 19:08:05 +00:00
o->oCannonUnkF4 += 0x400;
2019-08-25 04:46:40 +00:00
} else if (o->oTimer < 26) {
} else {
2020-08-09 14:42:44 +00:00
if (o->oCannonIsLocal) {
gMarioStates[0].marioObj->oMarioCannonObjectYaw = o->oMoveAngleYaw;
gMarioStates[0].marioObj->oMarioCannonInputYaw = 0;
gMarioStates[0].faceAngle[0] = 8192;
} else {
// two-player hack
gMarioStates[1].marioObj->oMarioCannonObjectYaw = o->oMoveAngleYaw;
gMarioStates[1].marioObj->oMarioCannonInputYaw = 0;
gMarioStates[1].faceAngle[0] = 8192;
}
2019-10-05 19:08:05 +00:00
o->oCannonUnkF4 = 0;
2019-08-25 04:46:40 +00:00
o->oAction = 5;
}
}
}
}
2020-03-02 03:42:52 +00:00
void opened_cannon_act_5(void) {
2019-08-25 04:46:40 +00:00
if (o->oTimer == 0)
2020-03-02 03:42:52 +00:00
cur_obj_play_sound_2(SOUND_OBJ_CANNON3);
2019-08-25 04:46:40 +00:00
if (o->oTimer < 4) {
} else {
if (o->oTimer < 20) {
2019-10-05 19:08:05 +00:00
o->oCannonUnkF4 += 0x400;
o->oMoveAnglePitch = sins(o->oCannonUnkF4) * 0x2000;
2019-08-25 04:46:40 +00:00
} else if (o->oTimer < 25) {
2020-08-09 14:42:44 +00:00
} else {
2019-08-25 04:46:40 +00:00
o->oAction = 1;
2020-08-09 14:42:44 +00:00
}
2019-08-25 04:46:40 +00:00
}
}
2020-03-02 03:42:52 +00:00
void opened_cannon_act_1(void) {
2019-08-25 04:46:40 +00:00
UNUSED s32 unused;
2020-08-09 14:42:44 +00:00
if (o->oCannonIsLocal) { // two-player hack
cur_obj_become_intangible();
cur_obj_disable_rendering();
} else {
struct MarioState* marioState = &gMarioStates[1]; // two-player hack
o->oMoveAnglePitch = 14563 + marioState->faceAngle[0] * -0.5f;
o->oMoveAngleYaw = marioState->marioObj->oMarioCannonObjectYaw + marioState->marioObj->oMarioCannonInputYaw;
}
2019-10-05 19:08:05 +00:00
o->oCannonUnk10C = 0;
if (o->oCannonIsLocal) {
gMarioShotFromCannon = 1;
}
2019-08-25 04:46:40 +00:00
}
2020-03-02 03:42:52 +00:00
void opened_cannon_act_2(void) {
2019-08-25 04:46:40 +00:00
o->oAction = 3;
}
2020-03-02 03:42:52 +00:00
void opened_cannon_act_3(void) {
2019-08-25 04:46:40 +00:00
UNUSED s32 unused;
2020-08-09 14:42:44 +00:00
if (o->oTimer > 3) {
2019-08-25 04:46:40 +00:00
o->oAction = 0;
2020-08-09 14:42:44 +00:00
o->oCannonIsLocal = FALSE;
if (o->heldByPlayerIndex == 0) { network_send_object(o); }
}
2019-08-25 04:46:40 +00:00
}
2020-03-02 03:42:52 +00:00
void (*sOpenedCannonActions[])(void) = { opened_cannon_act_0, opened_cannon_act_1, opened_cannon_act_2,
opened_cannon_act_3, opened_cannon_act_4, opened_cannon_act_5,
opened_cannon_act_6 };
2019-08-25 04:46:40 +00:00
u8 unused0EA1FC[] = { 2, 0, 0, 0, 0, 0, 0, 0, 63, 128, 0, 0, 2, 0, 0, 0, 65, 32, 0, 0,
63, 128, 0, 0, 2, 0, 0, 0, 65, 160, 0, 0, 63, 128, 0, 0, 2, 0, 0, 0,
65, 160, 0, 0, 63, 128, 0, 0, 8, 0, 0, 0, 65, 32, 0, 0, 63, 128, 0, 0 };
u8 cannon_ignore_remote_updates(void) {
// two-player hack
return ((gNetworkType == NT_SERVER) && o->oCannonIsLocal);
}
static void cannon_on_received(void) {
// check if we're on in the cannon too
struct MarioState* m = &gMarioStates[0];
if (m->action != ACT_IN_CANNON) { return; }
if (m->interactObj != o) { return; }
// two-player hack
if (gNetworkType == NT_SERVER) { return; }
// eject the player by shooting out of the cannon weakly
m->forwardVel = 10.0f * coss(m->faceAngle[0]);
m->vel[1] = 10.0f * sins(m->faceAngle[0]);
m->pos[0] += 120.0f * coss(m->faceAngle[0]) * sins(m->faceAngle[1]);
m->pos[1] += 120.0f * sins(m->faceAngle[0]);
m->pos[2] += 120.0f * coss(m->faceAngle[0]) * coss(m->faceAngle[1]);
set_mario_action(m, ACT_SHOT_FROM_CANNON, 0);
// reset things that got messed up
m->marioObj->header.gfx.node.flags |= GRAPH_RENDER_ACTIVE;
reset_camera(gCamera);
o->oCannonIsLocal = FALSE;
cur_obj_become_tangible();
cur_obj_enable_rendering();
}
2020-08-09 14:42:44 +00:00
2019-08-25 04:46:40 +00:00
void bhv_cannon_base_loop(void) {
if (!network_sync_object_initialized(o)) {
struct SyncObject* so = network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS);
so->ignore_if_true = &cannon_ignore_remote_updates;
so->on_received = &cannon_on_received;
2020-08-09 14:42:44 +00:00
network_init_object_field(o, &o->oAction);
network_init_object_field(o, &o->oPrevAction);
2020-08-09 14:42:44 +00:00
network_init_object_field(o, &o->oTimer);
network_init_object_field(o, &o->oPosX);
network_init_object_field(o, &o->oPosY);
network_init_object_field(o, &o->oPosZ);
network_init_object_field(o, &o->oCannonUnk10C);
2020-08-09 14:42:44 +00:00
network_init_object_field(o, &o->oCannonUnk10C);
network_init_object_field(o, &o->oCannonUnkF8);
network_init_object_field(o, &o->oCannonUnkF4);
}
if (o->oAction != 0 && !o->oCannonIsLocal) {
cur_obj_push_mario_away_from_cylinder(220, 300);
}
2020-03-02 03:42:52 +00:00
cur_obj_call_action_function(sOpenedCannonActions);
2019-10-05 19:08:05 +00:00
if (o->oCannonUnkF8)
o->oCannonUnkF8++;
2019-08-25 04:46:40 +00:00
o->oInteractStatus = 0;
}
void bhv_cannon_barrel_loop(void) {
struct Object *parent = o->parentObj;
if (parent->header.gfx.node.flags & GRAPH_RENDER_ACTIVE) {
2020-03-02 03:42:52 +00:00
cur_obj_enable_rendering();
obj_copy_pos(o, o->parentObj);
2019-08-25 04:46:40 +00:00
o->oMoveAngleYaw = o->parentObj->oMoveAngleYaw;
o->oFaceAnglePitch = o->parentObj->oMoveAnglePitch;
} else
2020-03-02 03:42:52 +00:00
cur_obj_disable_rendering();
2019-08-25 04:46:40 +00:00
}