First pass of multibot support

This commit is contained in:
Fraser Graham
2013-11-08 21:25:42 -08:00
parent 49ff6af1f3
commit e39a97089e
6 changed files with 350 additions and 278 deletions
+79 -55
View File
@@ -106,30 +106,40 @@ func NewGame(id string, width, height float32) *game {
func (g *game) tick(payload *Boardstate) int {
robots_remaining := 0
players_remaining := 0
payload.Obstacles = g.obstacles
// Update Players
for p := range g.players {
if p.Robot.Health > 0 {
robots_remaining++
p.Tick(g)
}
living_robots := 0
if len(p.Robot.Message) > 0 {
if len(p.Robot.Message) > 100 {
p.Robot.Message = p.Robot.Message[0:99]
for _, r := range p.Robots {
if r.Health > 0 {
living_robots++
p.Tick(g)
}
payload.Messages = append(payload.Messages, p.Robot.Message)
if len(r.Message) > 0 {
if len(r.Message) > 100 {
r.Message = r.Message[0:99]
}
payload.Messages = append(payload.Messages, r.Message)
}
payload.OtherRobots = append(
payload.OtherRobots,
r.GetTruncatedDetails())
payload.AllBots = append(
payload.AllBots,
BotHealth{RobotId: r.Id, Health: r.Health})
}
payload.OtherRobots = append(
payload.OtherRobots,
p.Robot.GetTruncatedDetails())
payload.AllBots = append(
payload.AllBots,
BotHealth{RobotId: p.Robot.Id, Health: p.Robot.Health})
if living_robots > 0 {
players_remaining++
robots_remaining += living_robots
}
}
// Update Projectiles
@@ -151,7 +161,7 @@ func (g *game) tick(payload *Boardstate) int {
payload.Splosions = append(payload.Splosions, *s)
}
return robots_remaining
return players_remaining
}
func (g *game) send_update(payload *Boardstate) {
@@ -160,6 +170,7 @@ func (g *game) send_update(payload *Boardstate) {
sort.Sort(AllRobotSorter{Robots: payload.AllBots})
for p := range g.players {
// Copy the payload but only add the robots in scanner range
player_payload := NewBoardstate()
player_payload.Messages = payload.Messages
@@ -168,53 +179,63 @@ func (g *game) send_update(payload *Boardstate) {
player_payload.AllBots = payload.AllBots
player_payload.Turn = payload.Turn
player_payload.Reset = payload.Reset
player_payload.MyRobots = append(player_payload.MyRobots, p.Robot)
player_payload.OtherRobots = append(
player_payload.OtherRobots,
p.Robot.GetTruncatedDetails())
for _, r := range p.Robots {
player_payload.MyRobots = append(player_payload.MyRobots, r)
player_payload.OtherRobots = append(
player_payload.OtherRobots,
r.GetTruncatedDetails())
}
player_payload.Projectiles = []Projectile{}
player_payload.Obstacles = []Obstacle{}
living_robots := 0
if p.Robot.Health > 0 {
// Filter robots by scanner
for player := range g.players {
for _, scan_entry := range p.Robot.Scanners {
if player.Robot.Id == scan_entry.Id {
player_payload.OtherRobots = append(
player_payload.OtherRobots,
player.Robot.GetTruncatedDetails())
for _, r := range p.Robots {
if r.Health > 0 {
living_robots++
// Filter robots by scanner
for player := range g.players {
for _, scan_entry := range r.Scanners {
for _, r := range player.Robots {
if r.Id == scan_entry.Id {
player_payload.OtherRobots = append(
player_payload.OtherRobots,
r.GetTruncatedDetails())
}
}
}
}
}
// Filter projectiles
for proj := range g.projectiles {
// Filter projectiles
for proj := range g.projectiles {
if proj.Owner == p {
player_payload.Projectiles = append(
player_payload.Projectiles,
*proj)
}
for _, scan_entry := range p.Robot.Scanners {
if proj.Id == scan_entry.Id {
if proj.Owner == &r {
player_payload.Projectiles = append(
player_payload.Projectiles,
*proj)
}
}
}
// Filter objects
for _, ob := range g.obstacles {
if ob.distance_from_point(p.Robot.Position) < float32(p.Robot.Stats.ScannerRadius)+p.Robot.ScanCounter {
player_payload.Obstacles = append(
player_payload.Obstacles,
ob)
for _, scan_entry := range r.Scanners {
if proj.Id == scan_entry.Id {
player_payload.Projectiles = append(
player_payload.Projectiles,
*proj)
}
}
}
// Filter objects
for _, ob := range g.obstacles {
if ob.distance_from_point(r.Position) < float32(r.Stats.ScannerRadius)+r.ScanCounter {
player_payload.Obstacles = append(
player_payload.Obstacles,
ob)
}
}
}
} else {
}
if living_robots == 0 {
player_payload.OtherRobots = payload.OtherRobots
player_payload.Projectiles = payload.Projectiles
player_payload.Obstacles = payload.Obstacles
@@ -266,17 +287,20 @@ func (g *game) run() {
}
// UPDATE GAME STATE
robots_remaining := g.tick(payload)
players_remaining := g.tick(payload)
// Determine end game?
if robots_remaining <= 1 && len(g.players) > 1 {
if players_remaining <= 1 && len(g.players) > 1 {
g.obstacles = GenerateObstacles(5, g.width, g.height)
log.Printf("game %s: game over", g.id)
for p := range g.players {
if p.Robot.Health > 0 {
log.Printf("Robot %v Wins", p.Robot.Id)
log.Printf("game %s: game over", g.id)
for _, r := range p.Robots {
if r.Health > 0 {
log.Printf("Robot %v Survived", r.Id)
}
r.reset(g)
}
p.reset(g)
g.obstacles = GenerateObstacles(5, g.width, g.height)
}
payload.Reset = true
} else {