You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
3.1 KiB
134 lines
3.1 KiB
package client |
|
|
|
import ( |
|
"fmt" |
|
"log" |
|
"math/rand" |
|
|
|
"hackerbots.us/server" |
|
"hackerbots.us/vector" |
|
) |
|
|
|
// Fraserbot is a bad ass motherfucker, that will fuck SHIT UUUUUP |
|
type Fraserbot struct { |
|
knownObstacles map[string]server.Obstacle |
|
nearestEnemy *server.OtherRobot |
|
fireat *vector.Point2d |
|
moveto *vector.Point2d |
|
name string |
|
botIDs map[string]string |
|
} |
|
|
|
// NewFraserbot simply returns a populated, usable *Fraserbot |
|
func NewFraserbot(name string) *Fraserbot { |
|
return &Fraserbot{ |
|
knownObstacles: make(map[string]server.Obstacle), |
|
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: 100, |
|
Speed: 10, |
|
Acceleration: 10, |
|
ScannerRadius: 10, |
|
TurnSpeed: 10, |
|
FireRate: 30, |
|
WeaponRadius: 20, |
|
WeaponDamage: 30, |
|
WeaponSpeed: 30, |
|
} |
|
|
|
s[fmt.Sprintf("%v_Jr", p.name)] = server.StatsRequest{ |
|
Hp: 10, |
|
Speed: 100, |
|
Acceleration: 10, |
|
ScannerRadius: 60, |
|
TurnSpeed: 48, |
|
FireRate: 1, |
|
WeaponRadius: 10, |
|
WeaponDamage: 10, |
|
WeaponSpeed: 1, |
|
} |
|
|
|
return s |
|
} |
|
|
|
// SetIDs provides the mapping of names to ID's for each bot |
|
func (p *Fraserbot) SetIDs(ids map[string]string) { |
|
p.botIDs = ids |
|
log.Println(ids) |
|
} |
|
|
|
// 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 { |
|
me := bot |
|
|
|
// We're just starting out |
|
if p.moveto == nil { |
|
p.moveto = &me.Position |
|
} |
|
|
|
speed := float64(200) |
|
// If we're close to where we want to go then pick a new |
|
// place to go, we done good |
|
if me.Position.Sub(*p.moveto).Mag() < 30 { |
|
p.moveto = p.randomDirection(me.Position, 400) |
|
} |
|
|
|
if me.ProbeResult != nil && me.ProbeResult.Type == "obstacle" { |
|
speed = -50 |
|
p.moveto = p.randomDirection(me.Position, 600) |
|
} |
|
|
|
if len(me.Scanners) > 0 { |
|
// Find the bots that are not mine |
|
|
|
var index int |
|
found := false |
|
for i, entry := range me.Scanners { |
|
_, ok := p.botIDs[entry.Id] |
|
if !ok { |
|
index = i |
|
found = true |
|
break |
|
} |
|
} |
|
|
|
if found { |
|
// log.Println(me.Scanners[0]) |
|
for _, bot := range bs.OtherRobots { |
|
if bot.Id == me.Scanners[index].Id { |
|
p.fireat = &bot.Position |
|
log.Printf("%v Found Enemy: %v\n", me.Name, bot.Name) |
|
} |
|
} |
|
} |
|
} |
|
|
|
instructions[bot.Id] = server.Instruction{ |
|
MoveTo: p.moveto, |
|
TargetSpeed: &speed, |
|
FireAt: p.fireat, |
|
Probe: p.moveto, |
|
} |
|
} |
|
return instructions |
|
} |
|
|
|
// randomDirection is a spot within 200 of the current position |
|
func (p *Fraserbot) randomDirection(pos vector.Point2d, dist float64) *vector.Point2d { |
|
pt := vector.Vector2d{ |
|
X: (rand.Float64() * dist) - (dist / 2) + pos.X, |
|
Y: (rand.Float64() * dist) - (dist / 2) + pos.Y, |
|
}.ToPoint() |
|
return &pt |
|
}
|
|
|