rowboz/game.go

196 lines
3.6 KiB
Go
Raw Normal View History

package main
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)
fmt.Println("\nDebug time: Trash")
for i, t := range game.trash {
fmt.Println("Trash: ", i, t)
}
// Give closure
if game.gameover == 1 {
fmt.Println("\nYou got rekt by a robot")
} else if game.gameover == 2 {
fmt.Println("\nYou took the easy way out")
}
fmt.Println("Score:", game.player.score)
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,
},
2023-12-01 23:08:17 +01:00
score: 0,
moves: 0,
teleports: 0,
},
level: 1,
// robots: []Robot, // I need this maybe
// trash: []Position, // I will need this
gameover: 0,
}
return game, err
}
func (game *Game) gameDirector() {
defer quit(game)
for game.gameover == 0 {
// Clean the screen
game.screen.Clear()
// Draw starter conditions
game.drawBox()
game.drawScore()
game.drawPlayer()
//game.drawCoords()
2023-12-04 01:01:45 +01:00
game.drawDebug()
// Draw robots??
if len(game.robots) == 0 {
game.level++
game.cleanTrash()
game.initRobots()
}
game.drawRobots()
// Draw my ex-wife
game.drawTrash()
// Draw the screen
game.screen.Show()
// Process input
2023-12-01 22:41:35 +01:00
game.movePlayer(game, <-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:
2023-12-01 22:41:35 +01:00
// Keys to bug out
if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
game.gameover = 2
return
2023-12-01 22:41:35 +01:00
// Screen management
} else if ev.Key() == tcell.KeyCtrlL {
game.screen.Sync()
2023-12-01 22:41:35 +01:00
// 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
2023-12-01 22:41:35 +01:00
} else if ev.Key() == tcell.KeyDown || ev.Rune() == 's' || ev.Rune() == 'x' {
game.keypresses <- Down
2023-12-01 22:41:35 +01:00
} 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) {
game.screen.Clear()
maybePanic := recover()
game.screen.Fini()
if maybePanic != nil {
panic(maybePanic)
}
}
func (game *Game) randPos() Position {
2023-12-04 01:01:45 +01:00
//var safe bool = false
var pos Position
2023-12-04 01:01:45 +01:00
// for !safe {
// x := rand.Intn(80)
// y := rand.Intn(24)
2023-12-04 01:01:45 +01:00
// if x == 0 || x == 79 || y == 0 || y == 23 {
// safe = false
// } else {
// pos.x = x
// pos.y = y
// safe = true
// }
// }
x := 1 + rand.Intn(77)
y := 1 + rand.Intn(22)
pos.x = x
pos.y = y
return pos
}