Ejemplo n.º 1
0
        public IEnumerator OnTileClicked(Tile tile)
        {
            if (_isMoving)
            {
                yield break;
            }

            if (!IsTileMovable(tile))
            {
                yield break;
            }

            //
            // Move is valid. Change stuff here
            //

            tile.PlaySfx(PlayerRowIndex);

            int amountOfMovement = Mathf.Abs(tile.Index.i - PlayerRowIndex);

            PlayerRowIndex    = tile.Index.i;
            PlayerColumnIndex = tile.Index.j;
            GameUi.SetDepth(PlayerRowIndex, Direction);

            // if (!OnReturnStage)
            // {
            //     Score += (PlayerRowIndex + 1);
            //     GameUi.SetScore(Score, (PlayerRowIndex + 1), ScoreType.Depth);
            // }

            //
            // Tile special effect
            //

            if (tile.Type == TileType.Water)
            {
                // No Effect on water
            }
            else if (tile.Type == TileType.Oxygen)
            {
                Oxygen += 2;
                Oxygen  = Mathf.Clamp(Oxygen, 0, MaxOxygen + 1);
            }
            else if (tile.Type == TileType.Shark)
            {
                Oxygen -= 1;
                Oxygen  = Mathf.Clamp(Oxygen, 0, MaxOxygen + 1);
            }
            else if (tile.Type == TileType.Gem)
            {
                Score += 1;
                GameUi.SetScore(Score, 1, ScoreType.Gem);
            }
            else if (tile.Type == TileType.End)
            {
                Score += 1;
                GameUi.SetScore(Score, 1, ScoreType.Gem);
            }
            else
            {
                Debug.LogError("Tile Type not found");
            }

            //
            // Oxygen decrease due to depth
            //

            Oxygen--;
            GameUi.SetOxygen(Oxygen);
            Player.HandleExclamation(Oxygen, Direction);

            Vector3 playerSrc    = Player.transform.position;
            Vector3 playerTarget = tile.transform.position;

            if (tile.Index.i >= 0 && tile.Index.j >= 0)
            {
                _tiles[tile.Index.i][tile.Index.j] = null;
            }
            Destroy(tile.gameObject);

            //
            // First, move the player to the target tile
            //


            _isMoving = true;
            const float moveDuration = 0.5f;

            // Set bubble particles
            // BubbleTrail.Play();
            // BubbleTrail.simulationSpace = ParticleSystemSimulationSpace.World;
            // ParticleSystem.ShapeModule shape = BubbleTrail.shape;
            // shape.position =
            //
            // CoroutineStarter.RunDelayed(moveDuration, () => BubbleTrail.simulationSpace = ParticleSystemSimulationSpace.Local);

            CoroutineStarter.Run(Player.PlayMoveAnim(moveDuration, Direction));
            yield return(Curve.Tween(MoveCurve,
                                     moveDuration,
                                     t =>
            {
                Player.transform.position = Vector3.Lerp(playerSrc, playerTarget, t);
            }));

            //
            // Then, move these upwards
            // - Tiles
            // - Player
            // - Background
            //

            const float spaceBetweenTiles = 1.5f;
            Vector3     scrollAmount      = (Direction == GameDirection.Up ? Vector3.up : Vector3.down) * spaceBetweenTiles * amountOfMovement;
            Vector3     cameraSrc         = CameraTransform.position;
            Vector3     cameraTarget      = cameraSrc + scrollAmount;

            Curve.Tween(MoveCurve,
                        moveDuration,
                        t =>
            {
                CameraTransform.position = Vector3.Lerp(cameraSrc, cameraTarget, t);
            },
                        () =>
            {
                CameraTransform.position = cameraTarget;
            });

            // Generate new row

            for (int j = 0; j < amountOfMovement; j++)
            {
                var newRow = TileGenerator.GenerateRow(ColumnCount);
                for (int i = 0; i < ColumnCount; i++)
                {
                    newRow[i].Index = (_tiles.Count, i);
                    newRow[i].transform.localPosition = new Vector3(i * OffsetBetweenTiles, _tiles.Count * -1 * OffsetBetweenTiles, 0);
                }

                _tiles.Add(newRow);
            }

            yield return(new WaitForSeconds(moveDuration));

            Player.transform.position = playerTarget;
            _isMoving = false;

            if (PlayerRowIndex > ShowReturnButtonAt && !OnReturnStage)
            {
                GameUi.ShowReturnButton();
            }

            if (PlayerRowIndex < 0 && OnReturnStage)
            {
                _isMoving = true;

                string playerName = PlayerPrefs.GetString("Name");
                dreamloLeaderBoard.GetSceneDreamloLeaderboard().AddScore(playerName, PlayerCurrentDepthRecord * 1000 + Score);

                ResultData.Instance.HasWon = true;
                ResultData.Instance.Score  = Score;
                ResultData.Instance.Depth  = PlayerCurrentDepthRecord;
                GameUi.CloseFlash();
            }
            else if (Oxygen <= 0)
            {
                _isMoving = true;
                ResultData.Instance.HasWon = false;
                Player.transform.DetachChildren();
                Sfx.Instance.Play("Lose2");
                CoroutineStarter.Run(Player.PlayDeadAnim(1.9f, Direction));
                GameUi.CloseFlash();
            }
        }