예제 #1
0
    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);
            }
        }
    }