Parent directory

game.go

2165 bytes
  1package game
  2
  3import (
  4	"github.com/gen2brain/raylib-go/raylib"
  5	"github.com/go-errors/errors"
  6
  7	"gitea.theedgeofrage.com/theedgeofrage/yeetris/elements"
  8)
  9
 10var ErrGameOver = errors.New("game over")
 11
 12// Game type
 13type Game struct {
 14	FramesCounter int32
 15	TickRate      int32
 16	GameOver      bool
 17	Pause         bool
 18
 19	Scale rl.Vector2
 20
 21	Board *Board
 22	UI    *UI
 23}
 24
 25// Init - Initialize game
 26func (g *Game) Init() {
 27	g.Scale = rl.NewVector2(40, 40)
 28
 29	g.FramesCounter = 0
 30	g.TickRate = 30
 31	g.GameOver = false
 32	g.Pause = false
 33	g.Board = InitBoard()
 34	g.UI = InitUI(g.Scale)
 35}
 36
 37func (g *Game) Update() {
 38	var err error
 39	if g.GameOver {
 40		if rl.IsKeyPressed(rl.KeyEnter) {
 41			g.Init()
 42			g.GameOver = false
 43		}
 44		return
 45	}
 46	if rl.IsKeyPressed(rl.KeyP) {
 47		g.Pause = !g.Pause
 48	}
 49
 50	if g.Pause {
 51		return
 52	}
 53
 54	if rl.IsKeyPressed(rl.KeyC) {
 55		g.Board.HoldPiece()
 56	}
 57	if rl.IsKeyPressed(rl.KeyI) || rl.IsKeyPressed(rl.KeyRight) {
 58		g.Board.MoveActivePiece(1)
 59	}
 60	if rl.IsKeyPressed(rl.KeyH) || rl.IsKeyPressed(rl.KeyLeft) {
 61		g.Board.MoveActivePiece(-1)
 62	}
 63	if rl.IsKeyPressed(rl.KeyE) || rl.IsKeyPressed(rl.KeyUp) {
 64		g.Board.RotateActivePiece(true)
 65	}
 66	if rl.IsKeyPressed(rl.KeyN) || rl.IsKeyPressed(rl.KeyDown) {
 67		err = g.Board.DescendActivePiece()
 68	}
 69	if rl.IsKeyPressed(rl.KeySpace) {
 70		err = g.Board.DropActivePiece()
 71	}
 72	if g.FramesCounter%g.TickRate == 0 {
 73		err = g.Board.DescendActivePiece()
 74	}
 75	if errors.Is(err, ErrGameOver) {
 76		g.GameOver = true
 77	}
 78
 79	clearedLines := g.Board.ClearLines()
 80	switch clearedLines {
 81	case 1:
 82		g.UI.Score += 40
 83	case 2:
 84		g.UI.Score += 100
 85	case 3:
 86		g.UI.Score += 300
 87	case 4:
 88		g.UI.Score += 1200
 89	}
 90	g.FramesCounter++
 91}
 92
 93func (g *Game) Draw() {
 94	rl.BeginDrawing()
 95	rl.ClearBackground(elements.Black)
 96
 97	g.UI.Draw(g)
 98
 99	if !g.GameOver {
100		g.Board.DrawBoard(g.UI.BoardOffset, g.Scale)
101		g.Board.DrawNextPiece(g.UI.NextPiecePosition, g.Scale)
102		g.Board.DrawHeldPiece(g.UI.HeldPiecePosition, g.Scale)
103	} else {
104		rl.DrawText(
105			"PRESS [ENTER] TO PLAY AGAIN",
106			int32(rl.GetScreenWidth())/2-rl.MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2,
107			int32(rl.GetScreenHeight())/2-50,
108			20,
109			elements.LightGray,
110		)
111	}
112
113	rl.EndDrawing()
114}