Пример #1
0
// 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
}
Пример #2
0
// 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
}
Пример #3
0
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
}