// ToWire converts the board to the wire representation with respect to the // given faction (since the wire factions are us vs. them). func (b *Board) ToWire(out botapi.Board, faction int) error { out.SetWidth(uint16(b.Size.X)) out.SetHeight(uint16(b.Size.Y)) out.SetRound(int32(b.Round)) n := 0 for _, r := range b.cells { if r != nil { n++ } } robots, err := botapi.NewRobot_List(out.Segment(), int32(n)) if err != nil { return err } if err = out.SetRobots(robots); err != nil { return err } n = 0 for i, r := range b.cells { if r == nil { continue } outr := robots.At(n) outr.SetId(uint32(r.ID)) outr.SetX(uint16(i % b.Size.X)) outr.SetY(uint16(i / b.Size.X)) outr.SetHealth(int16(r.Health)) if r.Faction == faction { outr.SetFaction(botapi.Faction_mine) } else { outr.SetFaction(botapi.Faction_opponent) } n++ } return nil }
// boardFromWire converts the wire representation to the board func boardFromWire(wire botapi.Board) (*Board, error) { b := EmptyBoard(int(wire.Width()), int(wire.Height())) b.Round = int(wire.Round()) bots, err := wire.Robots() if err != nil { return b, err } for i := 0; i < bots.Len(); i++ { bot := bots.At(i) loc := Loc{ X: int(bot.X()), Y: int(bot.Y()), } b.cells[b.cellIndex(loc)] = robotFromWire(bot) } return b, nil }
func convertBoard(wire botapi.Board) (b *Board, playerBots []*Robot, err error) { w, h := int(wire.Width()), int(wire.Height()) cells := make([]*Robot, w*h) rows := make([][]*Robot, h) for y := range rows { rows[y] = cells[y*w : (y+1)*w] } robots, err := wire.Robots() if err != nil { return nil, nil, err } playerBots = make([]*Robot, 0, robots.Len()) for i, n := 0, robots.Len(); i < n; i++ { r := robots.At(i) // TODO(light): check for negative (x,y) rr := &Robot{ ID: r.Id(), Loc: Loc{int(r.X()), int(r.Y())}, Health: int(r.Health()), } switch r.Faction() { case botapi.Faction_mine: rr.Faction = MyFaction playerBots = append(playerBots, rr) case botapi.Faction_opponent: fallthrough default: rr.Faction = OpponentFaction } rows[rr.Loc.Y][rr.Loc.X] = rr } return &Board{ Round: int(wire.Round()), Cells: rows, }, playerBots, nil }