2013-08-19 20:43:26 -07:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
v "bitbucket.org/hackerbots/vector"
|
|
|
|
"log"
|
|
|
|
)
|
|
|
|
|
|
|
|
type weapon struct {
|
|
|
|
Strength float64 `json:"strength"`
|
|
|
|
Radius float64 `json:"radius"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type stats struct {
|
|
|
|
Hp int `json:"hp"`
|
2013-08-19 21:42:43 -07:00
|
|
|
Speed float64 `json:"speed"`
|
2013-08-19 20:43:26 -07:00
|
|
|
WeaponRadius int `json:"weapon_radius"`
|
|
|
|
ScannerRadius int `json:"scanner_radius"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s stats) valid() bool {
|
|
|
|
total := int(s.Speed) + s.Hp + s.WeaponRadius + s.ScannerRadius
|
|
|
|
log.Printf("total: %d", total)
|
|
|
|
if total > 500 {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
type scanner struct {
|
|
|
|
Position v.Point2d `json:"position"`
|
|
|
|
Stats stats `json:"stats"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type robot struct {
|
|
|
|
Id string `json:"id"`
|
|
|
|
Stats stats `json:"stats"`
|
|
|
|
Health int `json:"health"`
|
|
|
|
Position v.Point2d `json:"position"`
|
|
|
|
MoveTo v.Point2d `json:"move_to"`
|
|
|
|
FireAt v.Point2d `json:"fire_at"`
|
|
|
|
Scanners []scanner `json:"scanners"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type robotSorter struct {
|
|
|
|
robots []robot
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s robotSorter) Len() int {
|
|
|
|
return len(s.robots)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s robotSorter) Swap(i, j int) {
|
|
|
|
s.robots[i], s.robots[j] = s.robots[j], s.robots[i]
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s robotSorter) Less(i, j int) bool {
|
|
|
|
return s.robots[i].Id < s.robots[j].Id
|
|
|
|
}
|
|
|
|
|
|
|
|
type projectile struct {
|
|
|
|
Id string `json:"id"`
|
|
|
|
Position v.Point2d `json:"position"`
|
|
|
|
MoveTo v.Point2d `json:"move_to"`
|
|
|
|
Radius int `json:"radius"`
|
|
|
|
Speed float64 `json:"speed"`
|
|
|
|
Damage int `json:"damage"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *projectile) nudge() {
|
|
|
|
newPos := move(p.Position, p.MoveTo, float64(p.Speed), delta)
|
|
|
|
|
|
|
|
hit_player := false
|
|
|
|
for player := range g.players {
|
|
|
|
if player.Robot.Id == p.Id {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
dist := distance(player.Robot.Position, p.Position)
|
|
|
|
if dist < 5.0 {
|
|
|
|
hit_player = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if distance(p.Position, p.MoveTo) < 5 || hit_player {
|
|
|
|
delete(g.projectiles, p)
|
|
|
|
|
|
|
|
// Spawn a splosion
|
|
|
|
splo := &splosion{
|
|
|
|
Id: p.Id,
|
|
|
|
Position: p.Position,
|
|
|
|
Radius: p.Radius,
|
|
|
|
MaxDamage: 10,
|
|
|
|
MinDamage: 5,
|
|
|
|
Lifespan: 8,
|
|
|
|
}
|
|
|
|
g.splosions[splo] = true
|
|
|
|
|
|
|
|
for player := range g.players {
|
|
|
|
dist := distance(player.Robot.Position, p.Position)
|
|
|
|
if dist < float64(p.Radius) {
|
|
|
|
|
|
|
|
// TODO map damage Max to Min based on distance from explosion
|
|
|
|
if player.Robot.Health > 0 {
|
|
|
|
player.Robot.Health -= p.Damage
|
|
|
|
// log.Printf("Robot %+v is injured", player.Robot)
|
|
|
|
if player.Robot.Health <= 0 {
|
|
|
|
// log.Printf("Robot %+v is dead", player.Robot)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
p.Position.X = newPos.X
|
|
|
|
p.Position.Y = newPos.Y
|
|
|
|
}
|
|
|
|
|
|
|
|
type splosion struct {
|
|
|
|
Id string `json:"id"`
|
|
|
|
Position v.Point2d `json:"position"`
|
|
|
|
Radius int `json:"radius"`
|
|
|
|
MaxDamage int `json:"damage"`
|
|
|
|
MinDamage int `json:"damage"`
|
|
|
|
Lifespan int `json:"lifespan"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *splosion) tick() {
|
|
|
|
s.Lifespan--
|
|
|
|
if s.Lifespan <= 0 {
|
|
|
|
delete(g.splosions, s)
|
|
|
|
}
|
|
|
|
}
|