示例#1
0
        private void ReleaseCurrentTetramino()
        {
            HashSet <int> linesAffected = GetLinesOccupiedByTetramino(currentTetramino);

            currentTetramino = null;
            OnTetraminoReleased?.Invoke(linesAffected);
        }
示例#2
0
        public void Rotate(RotationDirectionEnum rotation)
        {
            if (currentTetramino == null)
            {
                return;
            }

            var  newTetramino     = currentTetramino.Tetramino.GetTetraminoRotated(rotation);
            var  newTetraminoInfo = new TetraminoGridData(newTetramino, Vector2Int.zero);
            var  wallKicks        = WallKicksData.Get(currentTetramino.Tetramino.Type, currentTetramino.Tetramino.CurrentRotationState, rotation);
            int  wallKickIndex    = 0;
            bool valid            = false;

            do
            {
                newTetraminoInfo.Position = currentTetramino.Position + wallKicks[wallKickIndex];
                valid = ValidateTetramino(newTetraminoInfo, MinoInValidPosition);
                wallKickIndex++;
            }while (!valid && wallKickIndex < wallKicks.Count);

            if (valid)
            {
                ApplyNewTetramino(newTetraminoInfo);
            }
        }
示例#3
0
        private HashSet <int> GetLinesOccupiedByTetramino(TetraminoGridData tetramino)
        {
            var result = new HashSet <int>();

            foreach (var minoPosition in tetramino.GetMinosGridPositions())
            {
                result.Add(minoPosition.y);
            }
            return(result);
        }
示例#4
0
 private bool ValidateTetramino(TetraminoGridData tetraminoGridInfo, Func <Vector2Int, bool> correctMinoPredicate)
 {
     foreach (var minoPosition in tetraminoGridInfo.GetMinosGridPositions())
     {
         if (!correctMinoPredicate(minoPosition))
         {
             return(false);
         }
     }
     return(true);
 }
示例#5
0
        private void PutTetraminoInGrid(TetraminoGridData tetraminoGridInfo)
        {
            if (tetraminoGridInfo == null)
            {
                throw new ArgumentNullException("tetraminoGridInfo", "Can't spawn \"null\" tetramino");
            }

            foreach (var minoPosition in tetraminoGridInfo.GetMinosGridPositions())
            {
                var newMino = grid.CreateMino(minoPosition, tetraminoGridInfo.Tetramino.Color);
                tetraminoGridInfo.Minos.Add(newMino);
            }
        }
示例#6
0
        public void Shift(Vector2Int shift)
        {
            if (currentTetramino == null)
            {
                return;
            }

            Vector2Int newTetraminoPosition = currentTetramino.Position + shift;
            var        newTetramino         = new TetraminoGridData(currentTetramino.Tetramino, newTetraminoPosition);

            if (ValidateTetramino(newTetramino, MinoInValidPosition))
            {
                ApplyNewTetramino(newTetramino);
            }
        }
示例#7
0
        private void ApplyNewTetramino(TetraminoGridData newTetramino)
        {
            if (newTetramino == null)
            {
                throw new ArgumentNullException("newTetramino", "New tetramino is null");
            }

            if (newTetramino.Equals(currentTetramino))
            {
                return;
            }

            RemoveTetraminoFromGrid(currentTetramino);
            PutTetraminoInGrid(newTetramino);
            currentTetramino = newTetramino;
        }
示例#8
0
        public void Spawn(Tetramino newTetramino)
        {
            if (currentTetramino != null)
            {
                throw new InvalidOperationException("Attempt to spawn new tetramino while previous one still in active state.");
            }
            Vector2Int startPosition    = GetTetraminoStartPosition(newTetramino);
            var        newTetraminoInfo = new TetraminoGridData(newTetramino, startPosition);

            if (ValidateTetramino(newTetraminoInfo, MinoInValidPosition))
            {
                ApplyNewTetramino(newTetraminoInfo);
            }
            else
            {
                OnSpawnFailed?.Invoke();
            }
        }
示例#9
0
        private void RemoveTetraminoFromGrid(TetraminoGridData tetraminoGridData)
        {
            if (tetraminoGridData == null)
            {
                return;
            }

            foreach (var minoPosition in tetraminoGridData.GetMinosGridPositions())
            {
                tetraminoGridData.Minos.Remove(grid.GetCell(minoPosition));
                grid.DeleteMino(minoPosition);
            }

            if (tetraminoGridData.Minos.Count > 0)
            {
                throw new InvalidOperationException();
            }
        }
示例#10
0
        public void ApplyGravity()
        {
            if (currentTetramino == null)
            {
                return;
            }

            var newTetraminoPosition = currentTetramino.Position + new Vector2Int(0, -1);
            var newTetramino         = new TetraminoGridData(currentTetramino.Tetramino, newTetraminoPosition);

            if (ValidateTetramino(newTetramino, MinoInValidPosition))
            {
                ApplyNewTetramino(newTetramino);
            }
            else
            {
                ReleaseCurrentTetramino();
            }
        }