Пример #1
0
        public void OnReturnToDivergencePointRequest()
        {
            algorithmRespect.ErrorCount += 1;

            Tile[] tiles = algorithmRespect.WrongColorTilesWhenDiverging.ToArray();

            Vector2Int lpos =
                new Vector2Int(
                    playerSteps[playerSteps.Count - 1].x,
                    playerSteps[playerSteps.Count - 1].y);

            Vector3 position = Client.Instance.Labyrinth.Value.GetLabyrinthPositionInWorldPosition(
                lpos.x,
                lpos.y) +
                               new Vector3(0, avatar.RootTransform.position.y, 0);

            controls.PositionRotationAndTiles.Value =
                new PositionRotationAndTile
            {
                Position = position,
                Rotation = rotationAtDivergence,
                Tiles    = tiles
            };

            algorithmRespect.Respect =
                RespectValueComputation(
                    (new Vector2Int(
                         playerSteps[playerSteps.Count - 1].x,
                         playerSteps[playerSteps.Count - 1].y) - lpos).magnitude + algorithmRespect.WrongColorTilesWhenDiverging.Count);

            gameAction.SetAction(
                GameAction.ReturnToDivergencePoint,
                lpos,
                rotationAtDivergence,
                tiles,
                playerSteps.ToArray());
        }
        private void FixedUpdate()
        {
            controls.CameraRotation.Value = cameraRig.CameraRotation;

            if (controls.IsControlsEnabled.Value && controls.IsPlayerControlsEnabled.Value)
            {
                // MOVING
                if (isMoving)
                {
                    controls.Animation.Value = Characters.AvatarAnimation.Jumping;

                    float xi = ((moveSpeed * moveSpeed) / (-2 * Utils.MovementAcceleration)) + 1;

                    if (isChainingMovement)
                    {
                        xi += 1;
                    }

                    moveSpeed =
                        xi < lerpValue ?
                        moveSpeed - (Time.deltaTime * Utils.MovementAcceleration) :
                        moveSpeed + (Time.deltaTime * Utils.MovementAcceleration);

                    lerpValue += Time.deltaTime * moveSpeed * Utils.MovementSpeed;

                    if (lerpValue >= 1)
                    {
                        if (isChainingMovement)
                        {
                            MovementInDirectionAction(controls.ForwardDirection.Value);

                            isChainingMovement = false;
                            lerpValue          = lerpValue - 1;

                            RequestMoveForward();

                            Transform.position = Vector3.Lerp(fromPosition, targetPosition, lerpValue);
                        }
                        else
                        {
                            MovementInDirectionAction(controls.ForwardDirection.Value);

                            Transform.position = targetPosition;
                            moveSpeed          = 0;
                            lerpValue          = 0;
                            isMoving           = false;
                        }

                        if (controls.PaintingColor.Value != TileColor.Red)
                        {
                            PaintCurrentPositionTile(true);
                        }
                    }
                    else
                    {
                        Transform.position = Vector3.Lerp(fromPosition, targetPosition, lerpValue);
                    }
                }
                // TURNING
                else if (isTurningLeft || isTurningRight)
                {
                    controls.Animation.Value = Characters.AvatarAnimation.Jumping;

                    float xi = ((turnSpeed * turnSpeed) / (-2 * Utils.TurningAcceleration)) + 1;

                    if (isChainingMovement)
                    {
                        xi++;
                    }

                    turnSpeed  = xi < lerpValue ? turnSpeed - (Time.deltaTime * Utils.TurningAcceleration) : turnSpeed + (Time.deltaTime * Utils.TurningAcceleration);
                    lerpValue += Time.deltaTime * turnSpeed;

                    if (lerpValue >= 1)
                    {
                        if (isChainingMovement)
                        {
                            isChainingMovement = false;
                            lerpValue          = lerpValue - 1;

                            if (isTurningLeft)
                            {
                                Quaternion trajectory = new Quaternion();
                                trajectory.eulerAngles += new Vector3(0, -90, 0);
                                fromRotation            = targetRotation;
                                targetRotation          = targetRotation * trajectory;

                                controls.ForwardDirection.Value = (controls.ForwardDirection.Value - 1) < 0 ? 3 : (controls.ForwardDirection.Value - 1);
                                gameAction.SetAction(GameAction.TurnLeft);
                            }
                            else if (isTurningRight)
                            {
                                Quaternion trajectory = new Quaternion();
                                trajectory.eulerAngles += new Vector3(0, 90, 0);
                                fromRotation            = targetRotation;
                                targetRotation          = targetRotation * trajectory;

                                controls.ForwardDirection.Value = (controls.ForwardDirection.Value + 1) % 4;
                                gameAction.SetAction(GameAction.TurnRight);
                            }

                            DoTurn();
                        }
                        else
                        {
                            // TODO Fix this crap
                            if (isAvatarTurn)
                            {
                                character.RootTransform.rotation = targetRotation;
                                DirectionArrowTransform.rotation = Quaternion.LookRotation(Utils.GetDirectionVector((Direction)controls.ForwardDirection.Value));
                            }
                            else
                            {
                                DirectionArrowTransform.rotation = targetRotation;
                            }

                            turnSpeed      = 0;
                            lerpValue      = 0;
                            isTurningLeft  = false;
                            isTurningRight = false;
                        }
                    }
                    else
                    {
                        DoTurn();
                    }
                }
                // IDLE
                else
                {
                    controls.Animation.Value = Characters.AvatarAnimation.Idle;
                }

                Vector2Int labyrinthPosition =
                    Client.Instance.Labyrinth.Value == null ?
                    Vector2Int.zero :
                    Client.Instance.Labyrinth.Value.GetWorldPositionInLabyrinthPosition(
                        Transform.position.x,
                        Transform.position.z);

                if (labyrinthPosition != this.labyrinthPosition)
                {
                    if (controls.PaintingColor.Value == TileColor.Red)
                    {
                        PaintTile(this.labyrinthPosition, TileColor.Red, true);
                    }

                    this.lastLabyrinthPosition = this.labyrinthPosition;
                    this.labyrinthPosition     = labyrinthPosition;

                    controls.OnLabyrinthPositionChangedHandler?.Invoke();
                }

                if (character.RootTransform.position != lastPosition)
                {
                    controls.PlayerPosition.Value = Transform.position;
                    lastPosition = character.RootTransform.position;
                }

                if (directionTransform.rotation != lastRotation)
                {
                    controls.BroadcastPlayerRotation.Value = directionTransform.rotation;//.CameraRotation;
                    lastRotation = cameraRig.CameraRotation;
                }
            }
        }