diff --git a/player.go b/player.go index a8dfc29..f11a6ce 100644 --- a/player.go +++ b/player.go @@ -69,6 +69,9 @@ func (p *player) recv() { if msg.MoveTo != nil { r.MoveTo = msg.MoveTo } + if msg.Heading != nil { + r.DesiredHeading = msg.Heading + } if msg.FireAt != nil { r.FireAt = msg.FireAt } diff --git a/protocol.go b/protocol.go index c19ae7e..036906f 100644 --- a/protocol.go +++ b/protocol.go @@ -1,6 +1,7 @@ package main import ( + v "bitbucket.org/hackerbots/vector" "code.google.com/p/go.net/websocket" "log" ) @@ -203,6 +204,7 @@ func addPlayer(ws *websocket.Conn) { Id: idg.Hash(), Name: name, Health: 10, + Heading: v.Vector2d{1, 0}, Scanners: make([]Scanner, 0)} r.Health = r.Stats.Hp log.Printf("Adding Robot: %v", r) diff --git a/robot.go b/robot.go index 465bd97..189222a 100644 --- a/robot.go +++ b/robot.go @@ -8,26 +8,27 @@ import ( ) type Robot struct { - Id string `json:"id"` - Name string `json:"name"` - Message string `json:"-"` - Stats Stats `json:"-"` - TargetSpeed float32 `json:"-"` - Speed float32 `json:"speed"` - Health int `json:"health"` - RepairCounter float32 `json:"repair"` - ScanCounter float32 `json:"scan_bonus"` - ActiveScan bool `json:"-"` - Position v.Point2d `json:"position"` - Heading v.Vector2d `json:"heading"` - MoveTo *v.Point2d `json:"-"` - FireAt *v.Point2d `json:"-"` - Scanners []Scanner `json:"scanners"` - LastFired int `json:"-"` - Collision bool `json:"collision"` - Hit bool `json:"hit"` - Probe *v.Point2d `json:"probe"` - ProbeResult *v.Point2d `json:"probe_result"` + Id string `json:"id"` + Name string `json:"name"` + Message string `json:"-"` + Stats Stats `json:"-"` + TargetSpeed float32 `json:"-"` + Speed float32 `json:"speed"` + Health int `json:"health"` + RepairCounter float32 `json:"repair"` + ScanCounter float32 `json:"scan_bonus"` + ActiveScan bool `json:"-"` + Position v.Point2d `json:"position"` + Heading v.Vector2d `json:"heading"` + DesiredHeading *v.Vector2d `json:"-"` + MoveTo *v.Point2d `json:"-"` + FireAt *v.Point2d `json:"-"` + Scanners []Scanner `json:"scanners"` + LastFired int `json:"-"` + Collision bool `json:"collision"` + Hit bool `json:"hit"` + Probe *v.Point2d `json:"probe"` + ProbeResult *v.Point2d `json:"probe_result"` } // This is the subset of data we send to players about robots @@ -153,13 +154,14 @@ func DeriveStats(request StatsRequest) Stats { } type Instruction struct { - Message *string `json:"message,omitempty"` - MoveTo *v.Point2d `json:"move_to,omitempty"` - FireAt *v.Point2d `json:"fire_at,omitempty"` - Probe *v.Point2d `json:"probe,omitempty"` - TargetSpeed *float32 `json:"target_speed,omitempty"` - Repair *bool `json:"repair,omitempty"` - Scan *bool `json:"scan,omitempty"` + Message *string `json:"message,omitempty"` + MoveTo *v.Point2d `json:"move_to,omitempty"` + Heading *v.Vector2d `json:"heading,omitempty"` + FireAt *v.Point2d `json:"fire_at,omitempty"` + Probe *v.Point2d `json:"probe,omitempty"` + TargetSpeed *float32 `json:"target_speed,omitempty"` + Repair *bool `json:"repair,omitempty"` + Scan *bool `json:"scan,omitempty"` } func (r *Robot) checkCollisions(g *game, move_vector v.Vector2d) (bool, v.Point2d, *Robot) { @@ -229,6 +231,11 @@ func (r *Robot) Tick(g *game) { new_heading = r.MoveTo.Sub(r.Position).Normalize() } + if r.DesiredHeading != nil { + // Where do we WANT to be heading? + new_heading = r.DesiredHeading.Normalize() + } + if new_heading.Mag() > 0 { // Is our direction change too much? Hard coding to 5 degrees/s for now angle := v.Angle(current_heading, new_heading) * v.Rad2deg