public void ResetGame() { Tetromino.ResetStats(); Board = new Board(new Vector2(180, 32)); Score = 0; LinesCleared = 0; Level = 0; GameSpeed = CalculateGameSpeed(Level); StatPieces = Tetromino.PieceList(); Piece = Tetromino.NextPiece(); GhostPiece = Piece.Tracer(); PreviewPiece = Tetromino.NextPiece(); HeldPiece = null; TempPiece = null; CanSwapHeldPiece = true; State = GameState.Paused; }
/* Create a tracer tetromino that only has the current rotation state copied into it */ public Tetromino Tracer() { List<List<GridPosition>> BlockList = new List<List<GridPosition>>(); List<GridPosition> Blocks = new List<GridPosition>(); // Clone foreach(GridPosition Block in this.BlockPositions[this.RotationState]) { Blocks.Add(new GridPosition(Block.X, Block.Y, Color.White * 0.25f)); } BlockList.Add(Blocks); Tetromino Ghost = new Tetromino(BlockList); Ghost.Position(this.BoardPosition); return Ghost; }
private void SwapHeldPiece() { TempPiece = Piece; if (HeldPiece != null) { Piece = HeldPiece; } else { Piece = PreviewPiece; PreviewPiece = Tetromino.NextPiece(); } HeldPiece = TempPiece; HeldPiece.ResetPiece(); }
private void StepGameLogic() { bool FastFall = Piece.FastFalling(); Ticks++; // Gravity only happens some of the time if (Ticks % GameSpeed == 0 || FastFall) { Piece.March(); Ticks = 0; // Reward dropping based on position if (FastFall) { Score++; } } // If piece collides with the board if (Board.Collides(Piece.Blocks())) { Piece.Retreat(); Board.Consume(Piece.Blocks()); BlockLock.Play(); Piece = PreviewPiece; PreviewPiece = Tetromino.NextPiece(); CanSwapHeldPiece = true; switch (Board.RemoveCompletedLines()) { case 4: Score += 1200 * (Level + 1); LinesCleared += 4; LineRemoval.Play(); break; case 3: Score += 300 * (Level + 1); LinesCleared += 3; LineRemoval.Play(); break; case 2: Score += 100 * (Level + 1); LinesCleared += 2; LineRemoval.Play(); break; case 1: Score += 40 * (Level + 1); LinesCleared += 1; LineRemoval.Play(); break; default: case 0: break; } } // Look for change in level if (Math.Floor((decimal)(LinesCleared / 10)) != Level) { Level++; GameSpeed = CalculateGameSpeed(Level); } // Update the ghost piece GhostPiece = Piece.Tracer(); while(!Board.Collides(GhostPiece.Blocks())) { GhostPiece.March(); } GhostPiece.Retreat(); }