private void ReleaseCurrentTetramino() { HashSet <int> linesAffected = GetLinesOccupiedByTetramino(currentTetramino); currentTetramino = null; OnTetraminoReleased?.Invoke(linesAffected); }
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); } }
private HashSet <int> GetLinesOccupiedByTetramino(TetraminoGridData tetramino) { var result = new HashSet <int>(); foreach (var minoPosition in tetramino.GetMinosGridPositions()) { result.Add(minoPosition.y); } return(result); }
private bool ValidateTetramino(TetraminoGridData tetraminoGridInfo, Func <Vector2Int, bool> correctMinoPredicate) { foreach (var minoPosition in tetraminoGridInfo.GetMinosGridPositions()) { if (!correctMinoPredicate(minoPosition)) { return(false); } } return(true); }
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); } }
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); } }
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; }
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(); } }
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(); } }
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(); } }