client/fraserbot.go

97 lines
2.3 KiB
Go

package client
import (
"fmt"
"math/rand"
"hackerbots.us/server"
"hackerbots.us/vector"
)
// Fraserbot is a bad ass motherfucker, that will fuck SHIT UUUUUP
type Fraserbot struct {
me server.Robot
knownObstacles map[string]server.Obstacle
nearestEnemy *server.OtherRobot
fireat *vector.Point2d
moveto *vector.Point2d
speed float64
stats server.StatsRequest
name string
}
// NewFraserbot simply returns a populated, usable *Fraserbot
func NewFraserbot(name string, stats server.StatsRequest) *Fraserbot {
return &Fraserbot{
knownObstacles: make(map[string]server.Obstacle),
stats: stats,
name: name,
}
}
// GetStats returns a map with an entry for each robot the player will control
// containing the desired stats for that robot
func (p *Fraserbot) GetStats() map[string]server.StatsRequest {
s := make(map[string]server.StatsRequest)
s[fmt.Sprintf("%v_MAIN", p.name)] = server.StatsRequest{
Hp: 10,
Speed: 10,
Acceleration: 10,
ScannerRadius: 10,
TurnSpeed: 10,
FireRate: 10,
WeaponRadius: 10,
WeaponDamage: 10,
WeaponSpeed: 10,
}
s[fmt.Sprintf("%v_Jr", p.name)] = server.StatsRequest{
Hp: 10,
Speed: 10,
Acceleration: 10,
ScannerRadius: 10,
TurnSpeed: 10,
FireRate: 10,
WeaponRadius: 10,
WeaponDamage: 10,
WeaponSpeed: 10,
}
return s
}
// Update is our implementation of recieving and processing a server.Boardstate
// from the server
func (p *Fraserbot) Update(bs *server.Boardstate) map[string]server.Instruction {
instructions := make(map[string]server.Instruction)
for _, bot := range bs.MyRobots {
p.me = bot
p.speed = 1000
if p.moveto == nil {
p.moveto = &p.me.Position
}
if p.me.Position.Sub(*p.moveto).Mag() < 30 {
p.moveto = p.randomDirection()
}
instructions[bot.Id] = server.Instruction{
MoveTo: p.moveto,
TargetSpeed: &p.speed,
FireAt: p.fireat,
}
}
return instructions
}
// randomDirection is a spot within 200 of the current position
func (p *Fraserbot) randomDirection() *vector.Point2d {
pt := vector.Vector2d{
X: (rand.Float64() * 400) - 200 + p.me.Position.X,
Y: (rand.Float64() * 400) - 200 + p.me.Position.Y,
}.ToPoint()
return &pt
}