rowboz/robots/game.go

181 lines
3.3 KiB
Go

package robots
import (
"fmt"
"log"
"math/rand"
"github.com/gdamore/tcell/v2"
)
func GameInit() {
game, err := initialize()
if err != nil {
log.Fatalln("Initilization error: ", err)
}
go game.gameDirector()
game.keyboardProcessor()
// Quit the screen
quit(&game)
// Give closure
if game.gameover == 1 {
fmt.Println("You got rekt by a robot")
} else if game.gameover == 2 {
fmt.Println("You took the easy way out")
}
fmt.Println("Score:", game.player.score)
fmt.Println("Level: ", game.level)
fmt.Println("Moves:", game.player.moves)
fmt.Println("Teleports:", game.player.teleports)
}
func initialize() (Game, error) {
var err error
screen, err := tcell.NewScreen()
if err != nil {
log.Println("Error creating screen: ", err)
}
err = screen.Init()
if err != nil {
log.Fatalln("Error initializing screen: ", err)
}
style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset)
game := Game{
screen: screen,
style: style,
keypresses: make(chan int),
player: Player{
position: Position{
x: 40,
y: 12,
},
score: 0,
moves: 0,
teleports: 0,
},
level: 1,
gameover: 0,
}
game.initRobots()
return game, err
}
func (game *Game) gameDirector() {
defer quit(game)
for game.gameover == 0 {
// Clean the screen
game.screen.Clear()
// Draw robots??
if len(game.robots) == 0 {
game.level++
game.cleanTrash()
game.resetPlayer()
game.initRobots()
}
// Draw starter conditions
game.drawBox()
game.drawPlayer()
//game.drawCoords()
game.drawRobots()
// Draw my ex-wife
game.drawTrash()
// Draw stuff last
game.drawScore()
game.drawDebug()
// Draw the screen
game.screen.Show()
// Process input
game.movePlayer(<-game.keypresses)
// Move robots
game.moveRobots()
}
}
func (game *Game) keyboardProcessor() {
defer close(game.keypresses)
for game.gameover == 0 {
// Poll for an event
ev := game.screen.PollEvent()
// Fetch the type, and check if any other actions are required.
switch ev := ev.(type) {
case *tcell.EventKey:
// Keys to bug out
if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
game.gameover = 2
return
// Screen management
} else if ev.Key() == tcell.KeyCtrlL {
game.screen.Sync()
// Player Movement
} else if ev.Rune() == 'q' {
game.keypresses <- upleft
} else if ev.Rune() == 'e' {
game.keypresses <- upright
} else if ev.Rune() == 'z' {
game.keypresses <- downleft
} else if ev.Rune() == 'c' {
game.keypresses <- downright
} else if ev.Key() == tcell.KeyUp || ev.Rune() == 'w' {
game.keypresses <- Up
} else if ev.Key() == tcell.KeyRight || ev.Rune() == 'd' {
game.keypresses <- Right
} else if ev.Key() == tcell.KeyDown || ev.Rune() == 's' || ev.Rune() == 'x' {
game.keypresses <- Down
} else if ev.Key() == tcell.KeyLeft || ev.Rune() == 'a' {
game.keypresses <- Left
// Teleport the player
} else if ev.Rune() == 't' {
game.keypresses <- teleport
}
}
}
}
func quit(game *Game) {
maybePanic := recover()
game.screen.Fini()
if maybePanic != nil {
panic(maybePanic)
}
}
func (game *Game) randPos() Position {
var pos Position
x := 1 + rand.Intn(77)
y := 1 + rand.Intn(22)
pos.x = x
pos.y = y
return pos
}