mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
Synchronized hoot
This commit is contained in:
parent
697670b519
commit
d5b087acd8
3 changed files with 43 additions and 8 deletions
|
|
@ -1,5 +1,7 @@
|
||||||
// hoot.c.inc
|
// hoot.c.inc
|
||||||
|
|
||||||
|
static u8 localTalkToHoot = 0;
|
||||||
|
|
||||||
void bhv_hoot_init(void) {
|
void bhv_hoot_init(void) {
|
||||||
cur_obj_init_animation(0);
|
cur_obj_init_animation(0);
|
||||||
|
|
||||||
|
|
@ -9,6 +11,11 @@ void bhv_hoot_init(void) {
|
||||||
o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;
|
o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;
|
||||||
|
|
||||||
cur_obj_become_intangible();
|
cur_obj_become_intangible();
|
||||||
|
localTalkToHoot = 0;
|
||||||
|
|
||||||
|
network_init_object(o, 4000.0f);
|
||||||
|
network_init_object_field(o, &o->oHootAvailability);
|
||||||
|
network_init_object_field(o, &o->oMoveAnglePitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// sp28 = arg0
|
// sp28 = arg0
|
||||||
|
|
@ -77,8 +84,9 @@ void hoot_free_step(s16 fastOscY, s32 speed) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void hoot_player_set_yaw(void) {
|
void hoot_player_set_yaw(void) {
|
||||||
s16 stickX = gPlayer3Controller->rawStickX;
|
struct MarioState* marioState = &gMarioStates[o->heldByPlayerIndex];
|
||||||
s16 stickY = gPlayer3Controller->rawStickY;
|
s16 stickX = marioState->controller->rawStickX;
|
||||||
|
s16 stickY = marioState->controller->rawStickY;
|
||||||
UNUSED s16 pitch = o->oMoveAnglePitch;
|
UNUSED s16 pitch = o->oMoveAnglePitch;
|
||||||
if (stickX < 10 && stickX >= -9)
|
if (stickX < 10 && stickX >= -9)
|
||||||
stickX = 0;
|
stickX = 0;
|
||||||
|
|
@ -130,7 +138,8 @@ void hoot_surface_collision(f32 xPrev, UNUSED f32 yPrev, f32 zPrev) {
|
||||||
o->oPosX = hitbox.x;
|
o->oPosX = hitbox.x;
|
||||||
o->oPosY = hitbox.y;
|
o->oPosY = hitbox.y;
|
||||||
o->oPosZ = hitbox.z;
|
o->oPosZ = hitbox.z;
|
||||||
gMarioObject->oInteractStatus |= INT_STATUS_MARIO_UNK7; /* bit 7 */
|
|
||||||
|
gMarioStates[o->heldByPlayerIndex].marioObj->oInteractStatus |= INT_STATUS_MARIO_UNK7; /* bit 7 */
|
||||||
}
|
}
|
||||||
|
|
||||||
floorY = find_floor_height_and_data(o->oPosX, o->oPosY, o->oPosZ, &sp44);
|
floorY = find_floor_height_and_data(o->oPosX, o->oPosY, o->oPosZ, &sp44);
|
||||||
|
|
@ -171,6 +180,7 @@ void hoot_act_ascent(f32 xPrev, f32 zPrev) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void hoot_action_loop(void) {
|
void hoot_action_loop(void) {
|
||||||
|
struct MarioState* marioState = nearest_mario_state_to_object(o);
|
||||||
f32 xPrev = o->oPosX;
|
f32 xPrev = o->oPosX;
|
||||||
f32 yPrev = o->oPosY;
|
f32 yPrev = o->oPosY;
|
||||||
f32 zPrev = o->oPosZ;
|
f32 zPrev = o->oPosZ;
|
||||||
|
|
@ -188,7 +198,7 @@ void hoot_action_loop(void) {
|
||||||
if (o->oPosY < 2700.0f) {
|
if (o->oPosY < 2700.0f) {
|
||||||
//set_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS);
|
//set_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS);
|
||||||
|
|
||||||
if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_045)) {
|
if (marioState == &gMarioState[0] && cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_045)) {
|
||||||
clear_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS);
|
clear_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS);
|
||||||
|
|
||||||
o->oAction = HOOT_ACT_TIRED;
|
o->oAction = HOOT_ACT_TIRED;
|
||||||
|
|
@ -206,7 +216,7 @@ void hoot_action_loop(void) {
|
||||||
hoot_carry_step(20, xPrev, zPrev);
|
hoot_carry_step(20, xPrev, zPrev);
|
||||||
|
|
||||||
if (o->oTimer >= 61)
|
if (o->oTimer >= 61)
|
||||||
gMarioObject->oInteractStatus |= INT_STATUS_MARIO_UNK7; /* bit 7 */
|
gMarioStates[o->heldByPlayerIndex].marioObj->oInteractStatus |= INT_STATUS_MARIO_UNK7; /* bit 7 */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -243,8 +253,12 @@ void hoot_awake_loop(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void bhv_hoot_loop(void) {
|
void bhv_hoot_loop(void) {
|
||||||
|
struct MarioState* marioState = nearest_mario_state_to_object(o);
|
||||||
|
static u8 forceFlySanity = TRUE;
|
||||||
|
|
||||||
switch (o->oHootAvailability) {
|
switch (o->oHootAvailability) {
|
||||||
case HOOT_AVAIL_ASLEEP_IN_TREE:
|
case HOOT_AVAIL_ASLEEP_IN_TREE:
|
||||||
|
forceFlySanity = TRUE;
|
||||||
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 50)) {
|
if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 50)) {
|
||||||
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
|
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
|
||||||
o->oHootAvailability = HOOT_AVAIL_WANTS_TO_TALK;
|
o->oHootAvailability = HOOT_AVAIL_WANTS_TO_TALK;
|
||||||
|
|
@ -254,16 +268,25 @@ void bhv_hoot_loop(void) {
|
||||||
case HOOT_AVAIL_WANTS_TO_TALK:
|
case HOOT_AVAIL_WANTS_TO_TALK:
|
||||||
hoot_awake_loop();
|
hoot_awake_loop();
|
||||||
|
|
||||||
if (set_mario_npc_dialog(&gMarioState[0], 2) == 2 && cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_044)) {
|
if (marioState == &gMarioState[0] && localTalkToHoot == 0) {
|
||||||
|
localTalkToHoot = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (localTalkToHoot == 1 && set_mario_npc_dialog(&gMarioState[0], 2) == 2 && cutscene_object_with_dialog(CUTSCENE_DIALOG, o, DIALOG_044)) {
|
||||||
|
localTalkToHoot = 2;
|
||||||
set_mario_npc_dialog(&gMarioState[0], 0);
|
set_mario_npc_dialog(&gMarioState[0], 0);
|
||||||
|
|
||||||
cur_obj_become_tangible();
|
cur_obj_become_tangible();
|
||||||
|
|
||||||
o->oHootAvailability = HOOT_AVAIL_READY_TO_FLY;
|
o->oHootAvailability = HOOT_AVAIL_READY_TO_FLY;
|
||||||
|
network_send_object(o);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HOOT_AVAIL_READY_TO_FLY:
|
case HOOT_AVAIL_READY_TO_FLY:
|
||||||
|
if (forceFlySanity) {
|
||||||
|
set_mario_npc_dialog(&gMarioState[0], 0);
|
||||||
|
cur_obj_become_tangible();
|
||||||
|
forceFlySanity = FALSE;
|
||||||
|
}
|
||||||
hoot_awake_loop();
|
hoot_awake_loop();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1568,6 +1568,8 @@ u32 interact_pole(struct MarioState *m, UNUSED u32 interactType, struct Object *
|
||||||
u32 interact_hoot(struct MarioState *m, UNUSED u32 interactType, struct Object *o) {
|
u32 interact_hoot(struct MarioState *m, UNUSED u32 interactType, struct Object *o) {
|
||||||
s32 actionId = m->action & ACT_ID_MASK;
|
s32 actionId = m->action & ACT_ID_MASK;
|
||||||
|
|
||||||
|
if (m != &gMarioStates[0]) { return; }
|
||||||
|
|
||||||
//! Can pause to advance the global timer without falling too far, allowing
|
//! Can pause to advance the global timer without falling too far, allowing
|
||||||
// you to regrab after letting go.
|
// you to regrab after letting go.
|
||||||
if (actionId >= 0x080 && actionId < 0x098
|
if (actionId >= 0x080 && actionId < 0x098
|
||||||
|
|
@ -1576,6 +1578,7 @@ u32 interact_hoot(struct MarioState *m, UNUSED u32 interactType, struct Object *
|
||||||
o->oInteractStatus = INT_STATUS_HOOT_GRABBED_BY_MARIO;
|
o->oInteractStatus = INT_STATUS_HOOT_GRABBED_BY_MARIO;
|
||||||
m->interactObj = o;
|
m->interactObj = o;
|
||||||
m->usedObj = o;
|
m->usedObj = o;
|
||||||
|
o->heldByPlayerIndex = 0;
|
||||||
|
|
||||||
queue_rumble_data(5, 80);
|
queue_rumble_data(5, 80);
|
||||||
update_mario_sound_and_camera(m);
|
update_mario_sound_and_camera(m);
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
#ifdef BETTERCAMERA
|
#ifdef BETTERCAMERA
|
||||||
#include "bettercamera.h"
|
#include "bettercamera.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "behavior_table.h"
|
||||||
|
|
||||||
void play_flip_sounds(struct MarioState *m, s16 frame1, s16 frame2, s16 frame3) {
|
void play_flip_sounds(struct MarioState *m, s16 frame1, s16 frame2, s16 frame3) {
|
||||||
s32 animFrame = m->marioObj->header.gfx.unk38.animFrame;
|
s32 animFrame = m->marioObj->header.gfx.unk38.animFrame;
|
||||||
|
|
@ -1902,6 +1903,14 @@ s32 act_flying(struct MarioState *m) {
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 act_riding_hoot(struct MarioState *m) {
|
s32 act_riding_hoot(struct MarioState *m) {
|
||||||
|
if (m->usedObj == NULL || m->usedObj->behavior != bhvHoot) {
|
||||||
|
m->usedObj = cur_obj_nearest_object_with_behavior(bhvHoot);
|
||||||
|
for (int i = 0; i < MAX_PLAYERS; i++) {
|
||||||
|
if (m != &gMarioStates[i]) { continue; }
|
||||||
|
m->usedObj->heldByPlayerIndex = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!(m->input & INPUT_A_DOWN) || (m->marioObj->oInteractStatus & INT_STATUS_MARIO_UNK7)) {
|
if (!(m->input & INPUT_A_DOWN) || (m->marioObj->oInteractStatus & INT_STATUS_MARIO_UNK7)) {
|
||||||
m->usedObj->oInteractStatus = 0;
|
m->usedObj->oInteractStatus = 0;
|
||||||
m->usedObj->oHootMarioReleaseTime = gGlobalTimer;
|
m->usedObj->oHootMarioReleaseTime = gGlobalTimer;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue