97 lines
2.3 KiB
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
|
||
|
}
|