|
|
|
|
package game
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"lcthw.dev/go/ttarpit/config"
|
|
|
|
|
"lcthw.dev/go/ttarpit/data"
|
|
|
|
|
"lcthw.dev/go/ttarpit/builder"
|
|
|
|
|
. "lcthw.dev/go/ttarpit/debug"
|
|
|
|
|
"time"
|
|
|
|
|
"fmt"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type Game struct {
|
|
|
|
|
settings config.Config
|
|
|
|
|
|
|
|
|
|
HP int
|
|
|
|
|
Errors int
|
|
|
|
|
StartTime time.Time
|
|
|
|
|
EndTime time.Time
|
|
|
|
|
ErrorLog []data.ErrInfo
|
|
|
|
|
ErrorsSeen map[string]int
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func New(settings config.Config) *Game {
|
|
|
|
|
game := new(Game)
|
|
|
|
|
|
|
|
|
|
game.settings = settings
|
|
|
|
|
game.HP = settings.StartingHP
|
|
|
|
|
game.StartTime = time.Now()
|
|
|
|
|
time_out, err := time.ParseDuration(settings.Deadline)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
game.EndTime = time.Now().Add(time_out)
|
|
|
|
|
game.ErrorsSeen = make(map[string]int, 10)
|
|
|
|
|
|
|
|
|
|
return game
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (game *Game) ClearLog() {
|
|
|
|
|
clear(game.ErrorsSeen)
|
|
|
|
|
game.ErrorLog = game.ErrorLog[:0]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (game *Game) SeenError(errinfo data.ErrInfo) int {
|
|
|
|
|
key := fmt.Sprintf("%s:%d", errinfo.File, errinfo.Line)
|
|
|
|
|
game.ErrorsSeen[key]++
|
|
|
|
|
return game.ErrorsSeen[key]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (game *Game) TakeHit(build *builder.Builder, errinfo data.ErrInfo) {
|
|
|
|
|
if game.SeenError(errinfo) > 1 && game.settings.OneErrorPerLine {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
game.Errors++
|
|
|
|
|
game.HP--
|
|
|
|
|
|
|
|
|
|
game.ErrorLog = append(game.ErrorLog, errinfo)
|
|
|
|
|
|
|
|
|
|
Log.Println("============== PROCESS EXIT")
|
|
|
|
|
Log.Printf("==== HP: %d Errors: %d =====\n",
|
|
|
|
|
game.HP, game.Errors)
|
|
|
|
|
|
|
|
|
|
if game.HP <= 0 {
|
|
|
|
|
Log.Println("!!!!!! YOU DIED !!!!!!!")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Log.Println("===========================")
|
|
|
|
|
}
|