void HandleMovement() { if (!ReInput.isReady) return; player_controller = ReInput.players.GetPlayer(rewiredPlayerID); if (player_controller == null) return; justKicked = false; float axis = player_controller.GetAxis(RewiredConsts.Action.Run); moveX = (axis == 0) ? 0 : (int)Mathf.Sign(axis); if (moveX != 0) FestivalTimeOutManager.Reset(); if (!canControl || !canMoveHorizontal || Dashing) moveX = 0; // Slippy surface audio if (Slipping) { float velFactor = Mathf.Min(maxVelX, rbody.velocity.x) / maxVelX; velFactor *= velFactor; float slipVol = AudioManager.sfxVol * velFactor * 0.6f; if (_audio.continualSourceIsPlaying && !_audio.continualSourceIsTweening) { _audio.continualSource.volume = slipVol; } if (surface != Surface.None && !_audio.continualSourceIsPlaying) { _audio.EnableContinual(slipVol); } } if ((surface == Surface.None || !Slipping) && _audio.continualSourceIsPlaying) { _audio.DisableContinual(); } if (canControl) { bool can_jump_this_frame = (ledgeBody && !ledgeHead && surface == Surface.None); // Jump logic bool jumpCondition = player_controller.GetButton(RewiredConsts.Action.Jump); if (jumpCondition) { // keep racking up time jumpTime += Time.deltaTime; } if (ledgeCondition && surface == Surface.None && jumpCondition) { ledgeGrabTime = maxLedgeGrabTime; } if (ledgePushAccumulator > 0) ledgePushAccumulator -= Time.deltaTime; bool jumpTimeCondition = (player_controller.GetButtonDown(RewiredConsts.Action.Jump) || jumpTime > maxJumpTime); bool surfaceCondition = (surface != Surface.None || ledgeGrabTime > 0); bool end_of_ledge_grab = !can_jump_this_frame && can_jump_prev_frame; if (jumpCondition && ((jumpTimeCondition && surfaceCondition) || end_of_ledge_grab)) { // Regular jump jc_0 = true; // Quickfeet achievement if (surface == Surface.Player && squishHitbox.last_touched_player != null && squishHitbox.last_touched_player.Dashing) { achievementMgr.GetQuickFeet(); } // allow shunt in direction of ledge if (ledgeGrabTime > 0) ledgePushAccumulator = maxLedgePushTime; jumpTime = 0; Squish(SquishType.JUMP); } can_jump_prev_frame = can_jump_this_frame; // Hopping up ledges autoassist if (ledgePushAccumulator > 0) { ledgePushAccumulator -= Time.deltaTime; jc_1 = true; } // Slowing down to allow variable jump height jumpCondition = player_controller.GetButtonUp(RewiredConsts.Action.Jump); if (jumpCondition && rbody.velocity.y > 0 && !Boosting) { jc_2 = true; // reset jump time jumpTime = 0; } // Slamming bool slamCondition = player_controller.GetButtonDown(RewiredConsts.Action.Kick); if (slamCondition && canSlam) { slamming = true; if (surface == Surface.None) { slammingInAir = true; } // Kicking when on ground if (surface == Surface.Ground) { Kick(); } else { // Add slam speed to whatever downward motion we already have jc_3 = true; } // Allow multiple player slams, but disable constant slamming in the air if (surface != Surface.Player) canSlam = false; // Audiovisual update if (surface == Surface.None) Squish(SquishType.SLAM); //_audio.PlayClipOnce("slam", AudioManager.sfxVol * 0.5f, Random.Range(2.8f, 3f)); } // Dashing bool dashCondition = player_controller.GetButtonDown(RewiredConsts.Action.Dash); if (dashCoroutine == null && !tired && !Dashing && dashCondition && canMoveHorizontal) { dashCoroutine = StartCoroutine("InitDash"); } // Switch direction of sprite with movement if (!Transitioning) { UpdateOrientation(moveX); } } }