From 92398f3ca1907c704c5de4c48c00981b306819af Mon Sep 17 00:00:00 2001 From: MysterD Date: Thu, 13 Aug 2020 18:49:24 -0700 Subject: [PATCH] Made rumble only happen for local events --- src/game/behaviors/capswitch.inc.c | 2 +- src/game/behaviors/exclamation_box.inc.c | 2 +- src/game/behaviors/purple_switch.inc.c | 2 +- src/game/behaviors/star_door.inc.c | 4 +- src/game/behaviors/water_pillar.inc.c | 2 +- src/game/behaviors/wdw_water_level.inc.c | 2 +- src/game/interaction.c | 32 +++++++-------- src/game/mario.c | 10 ++--- src/game/mario_actions_airborne.c | 46 +++++++++++----------- src/game/mario_actions_automatic.c | 14 +++---- src/game/mario_actions_cutscene.c | 16 ++++---- src/game/mario_actions_moving.c | 12 +++--- src/game/mario_actions_object.c | 14 +++---- src/game/mario_actions_stationary.c | 4 +- src/game/mario_actions_submerged.c | 8 ++-- src/game/spawn_sound.c | 6 +-- src/game/thread6.c | 22 ++++++++++- src/game/thread6.h | 6 ++- src/pc/controller/controller_entry_point.c | 2 + 19 files changed, 114 insertions(+), 92 deletions(-) diff --git a/src/game/behaviors/capswitch.inc.c b/src/game/behaviors/capswitch.inc.c index 65a221d81..4ed61821d 100644 --- a/src/game/behaviors/capswitch.inc.c +++ b/src/game/behaviors/capswitch.inc.c @@ -39,7 +39,7 @@ void cap_switch_act_2(void) { cur_obj_shake_screen(SHAKE_POS_SMALL); spawn_mist_particles(); spawn_triangle_break_particles(60, 139, 0.3f, o->oBehParams2ndByte); - queue_rumble_data(5, 80); + queue_rumble_data_object(o, 5, 80); } } else { struct MarioState* marioState = nearest_mario_state_to_object(o); diff --git a/src/game/behaviors/exclamation_box.inc.c b/src/game/behaviors/exclamation_box.inc.c index a885a4063..fd304e813 100644 --- a/src/game/behaviors/exclamation_box.inc.c +++ b/src/game/behaviors/exclamation_box.inc.c @@ -79,7 +79,7 @@ void exclamation_box_act_2(void) { o->oGravity = -8.0f; o->oFloorHeight = o->oPosY; o->oAction = 3; - queue_rumble_data(5, 80); + queue_rumble_data_object(o, 5, 80); } } load_object_collision_model(); diff --git a/src/game/behaviors/purple_switch.inc.c b/src/game/behaviors/purple_switch.inc.c index 12ef883e7..dcc4b6be7 100644 --- a/src/game/behaviors/purple_switch.inc.c +++ b/src/game/behaviors/purple_switch.inc.c @@ -47,7 +47,7 @@ void bhv_purple_switch_loop(void) { cur_obj_play_sound_2(SOUND_GENERAL2_PURPLE_SWITCH); o->oAction = PURPLE_SWITCH_TICKING; cur_obj_shake_screen(SHAKE_POS_SMALL); - queue_rumble_data(5, 80); + queue_rumble_data_object(o, 5, 80); } break; /** diff --git a/src/game/behaviors/star_door.inc.c b/src/game/behaviors/star_door.inc.c index 4390efcbb..bcdc77cb1 100644 --- a/src/game/behaviors/star_door.inc.c +++ b/src/game/behaviors/star_door.inc.c @@ -22,7 +22,7 @@ void bhv_star_door_loop(void) { case 1: if (o->oTimer == 0 && (s16)(o->oMoveAngleYaw) >= 0) { cur_obj_play_sound_2(SOUND_GENERAL_STAR_DOOR_OPEN); - queue_rumble_data(35, 30); + queue_rumble_data_object(o, 35, 30); } cur_obj_become_intangible(); o->oUnkBC = -8.0f; @@ -37,7 +37,7 @@ void bhv_star_door_loop(void) { case 3: if (o->oTimer == 0 && (s16)(o->oMoveAngleYaw) >= 0) { cur_obj_play_sound_2(SOUND_GENERAL_STAR_DOOR_CLOSE); - queue_rumble_data(35, 30); + queue_rumble_data_object(o, 35, 30); } o->oUnkBC = 8.0f; star_door_update_pos(); diff --git a/src/game/behaviors/water_pillar.inc.c b/src/game/behaviors/water_pillar.inc.c index 498e9bd09..0ea6d51a6 100644 --- a/src/game/behaviors/water_pillar.inc.c +++ b/src/game/behaviors/water_pillar.inc.c @@ -40,7 +40,7 @@ void water_level_pillar_undrained(void) { (s32) approach_f32_symmetric(gEnvironmentLevels[2], -2450.0f, 5.0f); gEnvironmentLevels[0] = (s32) approach_f32_symmetric(gEnvironmentLevels[0], -2450.0f, 5.0f); - reset_rumble_timers_2(2); + reset_rumble_timers_2(&gMarioStates[0], 2); } else o->oAction++; break; diff --git a/src/game/behaviors/wdw_water_level.inc.c b/src/game/behaviors/wdw_water_level.inc.c index 63d58fc76..b86465a26 100644 --- a/src/game/behaviors/wdw_water_level.inc.c +++ b/src/game/behaviors/wdw_water_level.inc.c @@ -49,7 +49,7 @@ void bhv_water_level_diamond_loop(void) { cur_obj_play_sound_1(SOUND_ENV_WATER_DRAIN); // same as above } o->oAngleVelYaw = 0x800; - reset_rumble_timers_2(2); + reset_rumble_timers_2(&gMarioStates[0], 2); } break; case WATER_LEVEL_DIAMOND_ACT_IDLE_SPINNING: diff --git a/src/game/interaction.c b/src/game/interaction.c index 63193f808..50f5f06b8 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -704,7 +704,7 @@ u32 take_damage_from_interact_object(struct MarioState *m) { m->hurtCounter += 4 * damage; - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); set_camera_shake_from_hit(shake); return damage; } @@ -766,7 +766,7 @@ u32 interact_coin(struct MarioState *m, UNUSED u32 interactType, struct Object * } if (o->oDamageOrCoinValue >= 2) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); } network_send_collect_coin(o); @@ -791,7 +791,7 @@ u32 interact_star_or_key(struct MarioState *m, UNUSED u32 interactType, struct O if (m->health >= 0x100) { mario_stop_riding_and_holding(m); - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); if (!noExit) { m->hurtCounter = 0; @@ -907,10 +907,10 @@ u32 interact_warp(struct MarioState *m, UNUSED u32 interactType, struct Object * if (o->collisionData == segmented_to_virtual(warp_pipe_seg3_collision_03009AC8)) { play_sound(SOUND_MENU_ENTER_PIPE, m->marioObj->header.gfx.cameraToObject); - queue_rumble_data(15, 80); + queue_rumble_data_mario(m, 15, 80); } else { play_sound(SOUND_MENU_ENTER_HOLE, m->marioObj->header.gfx.cameraToObject); - queue_rumble_data(12, 80); + queue_rumble_data_mario(m, 12, 80); } mario_stop_riding_object(m); @@ -1133,7 +1133,7 @@ u32 interact_tornado(struct MarioState *m, UNUSED u32 interactType, struct Objec marioObj->oMarioTornadoPosY = m->pos[1] - o->oPosY; play_sound(SOUND_MARIO_WAAAOOOW, m->marioObj->header.gfx.cameraToObject); - queue_rumble_data(30, 60); + queue_rumble_data_mario(m, 30, 60); return set_mario_action(m, ACT_TORNADO_TWIRLING, m->action == ACT_TWIRLING); } @@ -1155,7 +1155,7 @@ u32 interact_whirlpool(struct MarioState *m, UNUSED u32 interactType, struct Obj marioObj->oMarioWhirlpoolPosY = m->pos[1] - o->oPosY; play_sound(SOUND_MARIO_WAAAOOOW, m->marioObj->header.gfx.cameraToObject); - queue_rumble_data(30, 60); + queue_rumble_data_mario(m, 30, 60); return set_mario_action(m, ACT_CAUGHT_IN_WHIRLPOOL, 0); } @@ -1190,7 +1190,7 @@ u32 interact_flame(struct MarioState *m, UNUSED u32 interactType, struct Object if (!sInvulnerable && !(m->flags & MARIO_METAL_CAP) && !(m->flags & MARIO_VANISH_CAP) && !(o->oInteractionSubtype & get_invincibility_flag(m))) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); o->oInteractStatus = INT_STATUS_INTERACTED; m->interactObj = o; @@ -1267,7 +1267,7 @@ u32 interact_bully(struct MarioState *m, UNUSED u32 interactType, struct Object m->interactObj = o; if (interaction & INT_ATTACK_NOT_FROM_BELOW) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); push_mario_out_of_object(m, o, 5.0f); m->forwardVel = -16.0f; @@ -1290,7 +1290,7 @@ u32 interact_bully(struct MarioState *m, UNUSED u32 interactType, struct Object push_mario_out_of_object(m, o, 5.0f); drop_and_set_mario_action(m, bully_knock_back_mario(m), 0); - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); return TRUE; } @@ -1308,7 +1308,7 @@ u32 interact_shock(struct MarioState *m, UNUSED u32 interactType, struct Object take_damage_from_interact_object(m); play_sound(SOUND_MARIO_ATTACKED, m->marioObj->header.gfx.cameraToObject); - queue_rumble_data(70, 60); + queue_rumble_data_mario(m, 70, 60); if (m->action & (ACT_FLAG_SWIMMING | ACT_FLAG_METAL_WATER)) { return drop_and_set_mario_action(m, ACT_WATER_SHOCKED, 0); @@ -1354,7 +1354,7 @@ u32 interact_hit_from_below(struct MarioState *m, UNUSED u32 interactType, struc } if (interaction & INT_ANY_ATTACK) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); attack_object(o, interaction); bounce_back_from_attack(m, interaction); @@ -1393,7 +1393,7 @@ u32 interact_bounce_top(struct MarioState *m, UNUSED u32 interactType, struct Ob } if (interaction & INT_ATTACK_NOT_FROM_BELOW) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); attack_object(o, interaction); bounce_back_from_attack(m, interaction); @@ -1510,7 +1510,7 @@ u32 check_object_grab_mario(struct MarioState *m, UNUSED u32 interactType, struc update_mario_sound_and_camera(m); play_sound(SOUND_MARIO_OOOF, m->marioObj->header.gfx.cameraToObject); - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); return set_mario_action(m, ACT_GRABBED, 0); } } @@ -1559,7 +1559,7 @@ u32 interact_pole(struct MarioState *m, UNUSED u32 interactType, struct Object * marioObj->oMarioPoleYawVel = (s32)(m->forwardVel * 0x100 + 0x1000); #endif reset_mario_pitch(m); - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); return set_mario_action(m, ACT_GRAB_POLE_FAST, 0); } } @@ -1582,7 +1582,7 @@ u32 interact_hoot(struct MarioState *m, UNUSED u32 interactType, struct Object * m->usedObj = o; o->heldByPlayerIndex = 0; - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); update_mario_sound_and_camera(m); return set_mario_action(m, ACT_RIDING_HOOT, 0); } diff --git a/src/game/mario.c b/src/game/mario.c index 487c2eefc..3c50ddaba 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -1556,7 +1556,7 @@ void update_mario_health(struct MarioState *m) { if (!gRumblePakTimer) { gRumblePakTimer = 36; if (is_rumble_finished_and_queue_empty()) { - queue_rumble_data(3, 30); + queue_rumble_data_mario(m, 3, 30); } } } else { @@ -1739,14 +1739,14 @@ static void debug_update_mario_cap(u16 button, s32 flags, u16 capTimer, u16 capM void func_sh_8025574C(void) { if (gMarioState->particleFlags & PARTICLE_HORIZONTAL_STAR) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(gMarioState, 5, 80); } else if (gMarioState->particleFlags & PARTICLE_VERTICAL_STAR) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(gMarioState, 5, 80); } else if (gMarioState->particleFlags & PARTICLE_TRIANGLE) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(gMarioState, 5, 80); } if(gMarioState->heldObj && gMarioState->heldObj->behavior == segmented_to_virtual(bhvBobomb)) { - reset_rumble_timers(); + reset_rumble_timers(gMarioState); } } diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index 7fe2c1c86..1d9f31629 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -85,7 +85,7 @@ s32 check_fall_damage(struct MarioState *m, u32 hardFallAction) { if (m->vel[1] < -55.0f) { if (fallHeight > 3000.0f) { m->hurtCounter += (m->flags & MARIO_CAP_ON_HEAD) ? 16 : 24; - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); set_camera_shake_from_hit(SHAKE_FALL_DAMAGE); play_sound(SOUND_MARIO_ATTACKED, m->marioObj->header.gfx.cameraToObject); return drop_and_set_mario_action(m, hardFallAction, 4); @@ -93,7 +93,7 @@ s32 check_fall_damage(struct MarioState *m, u32 hardFallAction) { m->hurtCounter += (m->flags & MARIO_CAP_ON_HEAD) ? 8 : 12; m->squishTimer = 30; - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); set_camera_shake_from_hit(SHAKE_FALL_DAMAGE); play_sound(SOUND_MARIO_ATTACKED, m->marioObj->header.gfx.cameraToObject); } @@ -136,7 +136,7 @@ s32 check_fall_damage_or_get_stuck(struct MarioState *m, u32 hardFallAction) { m->particleFlags |= PARTICLE_MIST_CIRCLE; drop_and_set_mario_action(m, ACT_FEET_STUCK_IN_GROUND, 0); - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); return TRUE; } @@ -386,7 +386,7 @@ u32 common_air_action_step(struct MarioState *m, u32 landAction, s32 animation, set_mario_animation(m, animation); if (m->forwardVel > 16.0f) { - queue_rumble_data(5, 40); + queue_rumble_data_mario(m, 5, 40); mario_bonk_reflection(m, FALSE); m->faceAngle[1] += 0x8000; @@ -493,7 +493,7 @@ s32 act_triple_jump(struct MarioState *m) { common_air_action_step(m, ACT_TRIPLE_JUMP_LAND, MARIO_ANIM_TRIPLE_JUMP, 0); if (m->action == ACT_TRIPLE_JUMP_LAND) { - queue_rumble_data(5, 40); + queue_rumble_data_mario(m, 5, 40); } play_flip_sounds(m, 2, 8, 20); return FALSE; @@ -508,7 +508,7 @@ s32 act_backflip(struct MarioState *m) { common_air_action_step(m, ACT_BACKFLIP_LAND, MARIO_ANIM_BACKFLIP, 0); if (m->action == ACT_BACKFLIP_LAND) { - queue_rumble_data(5, 40); + queue_rumble_data_mario(m, 5, 40); } play_flip_sounds(m, 2, 3, 17); return FALSE; @@ -639,7 +639,7 @@ s32 act_long_jump(struct MarioState *m) { common_air_action_step(m, ACT_LONG_JUMP_LAND, animation, AIR_STEP_CHECK_LEDGE_GRAB); if (m->action == ACT_LONG_JUMP_LAND) { - queue_rumble_data(5, 40); + queue_rumble_data_mario(m, 5, 40); } return FALSE; } @@ -743,7 +743,7 @@ s32 act_dive(struct MarioState *m) { case AIR_STEP_LANDED: if (should_get_stuck_in_ground(m) && m->faceAngle[0] == -0x2AAA) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); #ifdef VERSION_JP play_sound(SOUND_MARIO_OOOF, m->marioObj->header.gfx.cameraToObject); #else @@ -939,7 +939,7 @@ s32 act_ground_pound(struct MarioState *m) { stepResult = perform_air_step(m, 0); if (stepResult == AIR_STEP_LANDED) { if (should_get_stuck_in_ground(m)) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); #ifdef VERSION_JP play_sound(SOUND_MARIO_OOOF, m->marioObj->header.gfx.cameraToObject); #else @@ -994,7 +994,7 @@ s32 act_burning_jump(struct MarioState *m) { } } - reset_rumble_timers(); + reset_rumble_timers(m); return FALSE; } @@ -1020,7 +1020,7 @@ s32 act_burning_fall(struct MarioState *m) { } } - reset_rumble_timers(); + reset_rumble_timers(m); return FALSE; } @@ -1069,7 +1069,7 @@ s32 act_crazy_box_bounce(struct MarioState *m) { m->heldObj = NULL; set_mario_action(m, ACT_STOMACH_SLIDE, 0); } - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); m->particleFlags |= PARTICLE_MIST_CIRCLE; break; @@ -1100,7 +1100,7 @@ u32 common_air_knockback_step(struct MarioState *m, u32 landAction, u32 hardFall case AIR_STEP_LANDED: if (m->action == ACT_SOFT_BONK) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); } if (!check_fall_damage_or_get_stuck(m, hardFallAction)) { #ifndef VERSION_JP @@ -1502,7 +1502,7 @@ s32 act_hold_butt_slide_air(struct MarioState *m) { s32 act_lava_boost(struct MarioState *m) { if (!(m->flags & MARIO_MARIO_SOUND_PLAYED)) { play_sound_if_no_flag(m, SOUND_MARIO_ON_FIRE, MARIO_MARIO_SOUND_PLAYED); - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); } play_sound_if_no_flag(m, SOUND_MARIO_ON_FIRE, MARIO_MARIO_SOUND_PLAYED); @@ -1521,7 +1521,7 @@ s32 act_lava_boost(struct MarioState *m) { } m->vel[1] = 84.0f; play_sound(SOUND_MARIO_ON_FIRE, m->marioObj->header.gfx.cameraToObject); - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); } else { play_mario_heavy_landing_sound(m, SOUND_ACTION_TERRAIN_BODY_HIT_GROUND); if (m->actionState < 2 && m->vel[1] < 0.0f) { @@ -1558,7 +1558,7 @@ s32 act_lava_boost(struct MarioState *m) { m->marioBodyState->eyeState = MARIO_EYES_DEAD; - reset_rumble_timers(); + reset_rumble_timers(m); return FALSE; } @@ -1683,7 +1683,7 @@ s32 act_shot_from_cannon(struct MarioState *m) { } } #endif - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); break; case AIR_STEP_HIT_WALL: @@ -1728,7 +1728,7 @@ s32 act_shot_from_cannon(struct MarioState *m) { m->particleFlags |= PARTICLE_DUST; } - reset_rumble_timers(); + reset_rumble_timers(m); return FALSE; } @@ -1831,7 +1831,7 @@ s32 act_flying(struct MarioState *m) { gLakituState.mode = CAMERA_MODE_NEWCAM; } #endif - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); break; case AIR_STEP_HIT_WALL: @@ -1894,7 +1894,7 @@ s32 act_flying(struct MarioState *m) { play_sound(SOUND_MARIO_YAHOO_WAHA_YIPPEE + ((gAudioRandom % 5) << 16), m->marioObj->header.gfx.cameraToObject); #endif - queue_rumble_data(50, 40); + queue_rumble_data_mario(m, 50, 40); } play_sound(SOUND_MOVING_FLYING, m->marioObj->header.gfx.cameraToObject); @@ -1916,7 +1916,7 @@ s32 act_riding_hoot(struct MarioState *m) { m->usedObj->oHootMarioReleaseTime = gGlobalTimer; play_sound_if_no_flag(m, SOUND_MARIO_UH, MARIO_MARIO_SOUND_PLAYED); - queue_rumble_data(4, 40); + queue_rumble_data_mario(m, 4, 40); return set_mario_action(m, ACT_FREEFALL, 0); } @@ -1982,7 +1982,7 @@ s32 act_flying_triple_jump(struct MarioState *m) { if (is_anim_past_end(m)) { set_mario_animation(m, MARIO_ANIM_FORWARD_SPINNING); - queue_rumble_data(8, 80); + queue_rumble_data_mario(m, 8, 80); m->actionState = 1; } } @@ -2055,7 +2055,7 @@ s32 act_vertical_wind(struct MarioState *m) { set_mario_animation(m, MARIO_ANIM_FORWARD_SPINNING_FLIP); if (m->marioObj->header.gfx.unk38.animFrame == 1) { play_sound(SOUND_ACTION_SPIN, m->marioObj->header.gfx.cameraToObject); - queue_rumble_data(8, 80); + queue_rumble_data_mario(m, 8, 80); } if (is_anim_past_end(m)) { diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index 5b061c915..2afbd16dc 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -174,7 +174,7 @@ s32 act_holding_pole(struct MarioState *m) { } } play_climbing_sounds(m, 2); - reset_rumble_timers(); + reset_rumble_timers(m); func_80320A4C(1, marioObj->oMarioPoleYawVel / 0x100 * 2); } else { marioObj->oMarioPoleYawVel = 0; @@ -392,7 +392,7 @@ void update_hang_stationary(struct MarioState *m) { s32 act_start_hanging(struct MarioState *m) { if (m->actionTimer++ == 0) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); } if ((m->input & INPUT_NONZERO_ANALOG) && m->actionTimer >= 31) { @@ -472,7 +472,7 @@ s32 act_hang_moving(struct MarioState *m) { if (m->marioObj->header.gfx.unk38.animFrame == 12) { play_sound(SOUND_ACTION_HANGING_STEP, m->marioObj->header.gfx.cameraToObject); - queue_rumble_data(5, 30); + queue_rumble_data_mario(m, 5, 30); } if (is_anim_past_end(m)) { @@ -665,7 +665,7 @@ s32 act_grabbed(struct MarioState *m) { } vec3f_copy(m->pos, m->marioObj->header.gfx.pos); - queue_rumble_data(5, 60); + queue_rumble_data_mario(m, 5, 60); m->heldByObj = NULL; return set_mario_action(m, (m->forwardVel >= 0.0f) ? ACT_THROWN_FORWARD : ACT_THROWN_BACKWARD, @@ -749,13 +749,13 @@ s32 act_in_cannon(struct MarioState *m) { m->marioObj->header.gfx.node.flags |= GRAPH_RENDER_ACTIVE; set_mario_action(m, ACT_SHOT_FROM_CANNON, 0); - queue_rumble_data(60, 70); + queue_rumble_data_mario(m, 60, 70); m->usedObj->oAction = 2; return FALSE; } else { if (m->faceAngle[0] != startFacePitch || m->faceAngle[1] != startFaceYaw) { play_sound(SOUND_MOVING_AIM_CANNON, m->marioObj->header.gfx.cameraToObject); - reset_rumble_timers_2(0); + reset_rumble_timers_2(m, 0); } } } @@ -844,7 +844,7 @@ s32 act_tornado_twirling(struct MarioState *m) { vec3f_copy(m->marioObj->header.gfx.pos, m->pos); vec3s_set(m->marioObj->header.gfx.angle, 0, m->faceAngle[1] + m->twirlYaw, 0); - reset_rumble_timers(); + reset_rumble_timers(m); return FALSE; } diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 54317d409..c5d4cf756 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -1200,7 +1200,7 @@ s32 act_death_exit(struct MarioState *m) { #else play_sound(SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); #endif - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); m->numLives--; // restore 7.75 units of health m->healCounter = 31; @@ -1233,7 +1233,7 @@ s32 act_falling_death_exit(struct MarioState *m) { #else play_sound(SOUND_MARIO_OOOF2, m->marioObj->header.gfx.cameraToObject); #endif - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); m->numLives--; // restore 7.75 units of health m->healCounter = 31; @@ -1278,7 +1278,7 @@ s32 act_special_death_exit(struct MarioState *m) { } if (launch_mario_until_land(m, ACT_HARD_BACKWARD_GROUND_KB, MARIO_ANIM_BACKWARD_AIR_KB, -24.0f)) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); m->numLives--; m->healCounter = 31; } @@ -1362,7 +1362,7 @@ s32 act_bbh_enter_spin(struct MarioState *m) { m->flags &= ~MARIO_UNKNOWN_08; if (perform_air_step(m, 0) == AIR_STEP_LANDED) { level_trigger_warp(m, WARP_OP_UNKNOWN_02); - queue_rumble_data(15, 80); + queue_rumble_data_mario(m, 15, 80); m->actionState = 4; } if (m->actionState == 2) { @@ -1429,7 +1429,7 @@ s32 act_teleport_fade_out(struct MarioState *m) { : MARIO_ANIM_FIRST_PERSON); if (m->actionTimer == 0) { - queue_rumble_data(30, 70); + queue_rumble_data_mario(m, 30, 70); func_sh_8024C89C(2); } @@ -1456,7 +1456,7 @@ s32 act_teleport_fade_in(struct MarioState *m) { set_mario_animation(m, MARIO_ANIM_FIRST_PERSON); if (m->actionTimer == 0) { - queue_rumble_data(30, 70); + queue_rumble_data_mario(m, 30, 70); func_sh_8024C89C(2); } @@ -1553,7 +1553,7 @@ s32 act_squished(struct MarioState *m) { // Both of the 1.8's are really floats, but one of them has to // be written as a double for this to match on EU. vec3f_set(m->marioObj->header.gfx.scale, 1.8, 0.05f, 1.8f); - queue_rumble_data(10, 80); + queue_rumble_data_mario(m, 10, 80); m->actionState = 1; } break; @@ -1661,7 +1661,7 @@ void stuck_in_ground_handler(struct MarioState *m, s32 animation, s32 unstuckFra if (animFrame == -1) { play_sound_and_spawn_particles(m, SOUND_ACTION_TERRAIN_STUCK_IN_GROUND, 1); } else if (animFrame == unstuckFrame) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); play_sound_and_spawn_particles(m, SOUND_ACTION_UNSTUCK_FROM_GROUND, 1); } else if (animFrame == target2 || animFrame == target3) { play_mario_landing_sound(m, SOUND_ACTION_TERRAIN_LANDING); diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index e02441464..d3ec912a7 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -1253,7 +1253,7 @@ s32 act_riding_shell_ground(struct MarioState *m) { adjust_sound_for_speed(m); - reset_rumble_timers(); + reset_rumble_timers(m); return FALSE; } @@ -1362,7 +1362,7 @@ s32 act_burning_ground(struct MarioState *m) { m->marioBodyState->eyeState = MARIO_EYES_DEAD; - reset_rumble_timers(); + reset_rumble_timers(m); return FALSE; } @@ -1378,7 +1378,7 @@ void common_slide_action(struct MarioState *m, u32 endAction, u32 airAction, s32 vec3f_copy(val14, m->pos); play_sound(SOUND_MOVING_TERRAIN_SLIDE + m->terrainSoundAddend, m->marioObj->header.gfx.cameraToObject); - reset_rumble_timers(); + reset_rumble_timers(m); adjust_sound_for_speed(m); @@ -1502,7 +1502,7 @@ s32 act_crouch_slide(struct MarioState *m) { s32 act_slide_kick_slide(struct MarioState *m) { if (m->input & INPUT_A_PRESSED) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); return set_jumping_action(m, ACT_FORWARD_ROLLOUT, 0); } @@ -1532,7 +1532,7 @@ s32 act_slide_kick_slide(struct MarioState *m) { s32 stomach_slide_action(struct MarioState *m, u32 stopAction, u32 airAction, s32 animation) { if (m->actionTimer == 5) { if (!(m->input & INPUT_ABOVE_SLIDE) && (m->input & (INPUT_A_PRESSED | INPUT_B_PRESSED))) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); return drop_and_set_mario_action( m, m->forwardVel >= 0.0f ? ACT_FORWARD_ROLLOUT : ACT_BACKWARD_ROLLOUT, 0); } @@ -1566,7 +1566,7 @@ s32 act_hold_stomach_slide(struct MarioState *m) { s32 act_dive_slide(struct MarioState *m) { if (!(m->input & INPUT_ABOVE_SLIDE) && (m->input & (INPUT_A_PRESSED | INPUT_B_PRESSED))) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); return set_mario_action(m, m->forwardVel > 0.0f ? ACT_FORWARD_ROLLOUT : ACT_BACKWARD_ROLLOUT, 0); } diff --git a/src/game/mario_actions_object.c b/src/game/mario_actions_object.c index 5f2789992..87453ed6a 100644 --- a/src/game/mario_actions_object.c +++ b/src/game/mario_actions_object.c @@ -267,7 +267,7 @@ s32 act_throwing(struct MarioState *m) { mario_throw_held_object(m); play_sound_if_no_flag(m, SOUND_MARIO_WAH2, MARIO_MARIO_SOUND_PLAYED); play_sound_if_no_flag(m, SOUND_ACTION_THROW, MARIO_ACTION_SOUND_PLAYED); - queue_rumble_data(3, 50); + queue_rumble_data_mario(m, 3, 50); } animated_stationary_ground_step(m, MARIO_ANIM_GROUND_THROW, ACT_IDLE); @@ -287,7 +287,7 @@ s32 act_heavy_throw(struct MarioState *m) { mario_drop_held_object(m); play_sound_if_no_flag(m, SOUND_MARIO_WAH2, MARIO_MARIO_SOUND_PLAYED); play_sound_if_no_flag(m, SOUND_ACTION_THROW, MARIO_ACTION_SOUND_PLAYED); - queue_rumble_data(3, 50); + queue_rumble_data_mario(m, 3, 50); } animated_stationary_ground_step(m, MARIO_ANIM_HEAVY_THROW, ACT_IDLE); @@ -318,7 +318,7 @@ s32 act_picking_up_bowser(struct MarioState *m) { m->marioBodyState->grabPos = GRAB_POS_BOWSER; mario_grab_used_object(m); if (m->heldObj != NULL) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); play_sound(SOUND_MARIO_HRMM, m->marioObj->header.gfx.cameraToObject); } } @@ -395,11 +395,11 @@ s32 act_holding_bowser(struct MarioState *m) { // play sound on overflow if (m->angleVel[1] <= -0x100 && spin < m->faceAngle[1]) { - queue_rumble_data(4, 20); + queue_rumble_data_mario(m, 4, 20); play_sound(SOUND_OBJ_BOWSER_SPINNING, m->marioObj->header.gfx.cameraToObject); } if (m->angleVel[1] >= 0x100 && spin > m->faceAngle[1]) { - queue_rumble_data(4, 20); + queue_rumble_data_mario(m, 4, 20); play_sound(SOUND_OBJ_BOWSER_SPINNING, m->marioObj->header.gfx.cameraToObject); } @@ -416,10 +416,10 @@ s32 act_holding_bowser(struct MarioState *m) { s32 act_releasing_bowser(struct MarioState *m) { if (++m->actionTimer == 1) { if (m->actionArg == 0) { - queue_rumble_data(4, 50); + queue_rumble_data_mario(m, 4, 50); mario_throw_held_object(m); } else { - queue_rumble_data(4, 50); + queue_rumble_data_mario(m, 4, 50); mario_drop_held_object(m); } } diff --git a/src/game/mario_actions_stationary.c b/src/game/mario_actions_stationary.c index 440610f85..6b16aa134 100644 --- a/src/game/mario_actions_stationary.c +++ b/src/game/mario_actions_stationary.c @@ -799,12 +799,12 @@ s32 act_shockwave_bounce(struct MarioState *m) { f32 sp18; if (m->marioObj->oInteractStatus & 0x10) { - queue_rumble_data(70, 40); + queue_rumble_data_mario(m, 70, 40); return hurt_and_set_mario_action(m, ACT_SHOCKED, 0, 4); } if (m->actionTimer == 0) { - queue_rumble_data(70, 40); + queue_rumble_data_mario(m, 70, 40); if (m->marioObj->oInteractStatus & INT_STATUS_MARIO_UNK1) { return hurt_and_set_mario_action(m, ACT_BACKWARD_GROUND_KB, 0, 0xc); } diff --git a/src/game/mario_actions_submerged.c b/src/game/mario_actions_submerged.c index e6cbdf24b..0fd2b8ae2 100644 --- a/src/game/mario_actions_submerged.c +++ b/src/game/mario_actions_submerged.c @@ -802,7 +802,7 @@ static s32 act_water_throw(struct MarioState *m) { if (m->actionTimer++ == 5) { mario_throw_held_object(m); - queue_rumble_data(3, 50); + queue_rumble_data_mario(m, 3, 50); } if (is_anim_at_end(m)) { @@ -977,7 +977,7 @@ static s32 act_water_plunge(struct MarioState *m) { m->particleFlags |= PARTICLE_WATER_SPLASH; m->actionState = 1; if (m->prevAction & ACT_FLAG_AIR) { - queue_rumble_data(5, 80); + queue_rumble_data_mario(m, 5, 80); } } @@ -1083,8 +1083,8 @@ static s32 act_caught_in_whirlpool(struct MarioState *m) { set_mario_animation(m, MARIO_ANIM_GENERAL_FALL); vec3f_copy(m->marioObj->header.gfx.pos, m->pos); vec3s_set(m->marioObj->header.gfx.angle, 0, m->faceAngle[1], 0); - - reset_rumble_timers(); + + reset_rumble_timers(m); return FALSE; } diff --git a/src/game/spawn_sound.c b/src/game/spawn_sound.c index b94dd82d2..6bf6c457b 100644 --- a/src/game/spawn_sound.c +++ b/src/game/spawn_sound.c @@ -68,15 +68,15 @@ void cur_obj_play_sound_1(s32 soundMagic) { void cur_obj_play_sound_2(s32 soundMagic) { if (gCurrentObject->header.gfx.node.flags & GRAPH_RENDER_ACTIVE) { play_sound(soundMagic, gCurrentObject->header.gfx.cameraToObject); - + if (soundMagic == SOUND_OBJ_BOWSER_WALK) { queue_rumble_data(3, 60); } if (soundMagic == SOUND_OBJ_POUNDING_LOUD) { - queue_rumble_data(3, 60); + queue_rumble_data_object(gCurrentObject, 3, 60); } if (soundMagic == SOUND_OBJ_WHOMP_LOWPRIO) { - queue_rumble_data(5, 80); + queue_rumble_data_object(gCurrentObject, 5, 80); } } } diff --git a/src/game/thread6.c b/src/game/thread6.c index 6cb7a8348..c78a807f0 100644 --- a/src/game/thread6.c +++ b/src/game/thread6.c @@ -141,6 +141,20 @@ void queue_rumble_data(s16 a0, s16 a1) { gRumbleDataQueue[2].unk04 = 0; } +void queue_rumble_data_object(struct Object* object, s16 a0, s16 a1) { + extern struct MarioState gMarioStates[]; + f32 dist = dist_between_objects(object, gMarioStates[0].marioObj); + if (dist > 5000) { return; } + a0 = a0 * (1.0f - (dist / 5000.0f)); + a1 = a1 * (1.0f - (dist / 5000.0f)); + queue_rumble_data(a0, a1); +} + +void queue_rumble_data_mario(struct MarioState* m, s16 a0, s16 a1) { + if (m->playerIndex != 0) { return; } + queue_rumble_data(a0, a1); +} + void func_sh_8024C89C(s16 a0) { gRumbleDataQueue[2].unk04 = a0; } @@ -165,7 +179,9 @@ u8 is_rumble_finished_and_queue_empty(void) { return TRUE; } -void reset_rumble_timers(void) { +void reset_rumble_timers(struct MarioState* m) { + if (m->playerIndex != 0) { return; } + if (sUnusedDisableRumble) { return; } @@ -181,7 +197,9 @@ void reset_rumble_timers(void) { gCurrRumbleSettings.unk0C = 7; } -void reset_rumble_timers_2(s32 a0) { +void reset_rumble_timers_2(struct MarioState* m, s32 a0) { + if (m->playerIndex != 0) { return; } + if (sUnusedDisableRumble) { return; } diff --git a/src/game/thread6.h b/src/game/thread6.h index a19f67466..8afce716a 100644 --- a/src/game/thread6.h +++ b/src/game/thread6.h @@ -7,10 +7,12 @@ void init_rumble_pak_scheduler_queue(void); void block_until_rumble_pak_free(void); void release_rumble_pak_control(void); void queue_rumble_data(s16 a0, s16 a1); +void queue_rumble_data_object(struct Object* object, s16 a0, s16 a1); +void queue_rumble_data_mario(struct MarioState* m, s16 a0, s16 a1); void func_sh_8024C89C(s16 a0); u8 is_rumble_finished_and_queue_empty(void); -void reset_rumble_timers(void); -void reset_rumble_timers_2(s32 a0); +void reset_rumble_timers(struct MarioState* m); +void reset_rumble_timers_2(struct MarioState* m, s32 a0); void func_sh_8024CA04(void); void cancel_rumble(void); void create_thread_6(void); diff --git a/src/pc/controller/controller_entry_point.c b/src/pc/controller/controller_entry_point.c index c2e5207ab..3bf5ec8f0 100644 --- a/src/pc/controller/controller_entry_point.c +++ b/src/pc/controller/controller_entry_point.c @@ -28,11 +28,13 @@ s32 osContInit(UNUSED OSMesgQueue *mq, u8 *controllerBits, UNUSED OSContStatus * s32 osMotorStart(UNUSED void *pfs) { // Since rumble stops by osMotorStop, its duration is not nessecary. // Set it to 5 seconds and hope osMotorStop() is called in time. + if (configRumbleStrength == 0) { return; } controller_rumble_play(configRumbleStrength / 100.0f, 5.0f); return 0; } s32 osMotorStop(UNUSED void *pfs) { + if (configRumbleStrength == 0) { return; } controller_rumble_stop(); return 0; }