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}