package main import ( "bitbucket.org/hackerbots/bot" "bitbucket.org/hackerbots/vector" "code.google.com/p/go.net/websocket" "encoding/json" "errors" "flag" "fmt" "log" "math/rand" "net/http" ) var hp = flag.Int("hp", 150, "") var speed = flag.Float64("speed", 150, "") var weaponRadius = flag.Int("wrad", 100, "weapon radius") var scannerRadius = flag.Int("srad", 100, "scanner radius") var server = flag.String("server", "localhost", "server hostname") var port = flag.Int("port", 8666, "server port") var botname = flag.String("name", "gobot", "the name that other players will see") type infos struct { id string width, height float64 } func connect() (*websocket.Conn, error) { origin := "http://localhost/" url := fmt.Sprintf("ws://%s:%d/ws/", *server, *port) return websocket.Dial(url, "", origin) } func createGame() (string, error) { resp, err := http.Get("http://localhost:8666/game/start/") if err != nil { return "", err } defer resp.Body.Close() var g struct { Id string `json:"id"` } if err := json.NewDecoder(resp.Body).Decode(&g); err != nil { return "", err } return g.Id, err } func negociate(ws *websocket.Conn, gameid string) (i *infos, err error) { log.Printf("trying to connect to game %s", gameid) err = websocket.JSON.Send(ws, bot.GameID{ gameid, }) if err != nil { return nil, err } var idreq bot.IdRequest err = websocket.JSON.Receive(ws, &idreq) if err != nil || idreq.Type == "failure" { return nil, errors.New(fmt.Sprintf("failure: %+v", idreq)) } log.Printf("%+v", idreq) err = websocket.JSON.Send(ws, bot.ClientID{ Name: *botname, Useragent: "gobot", Type: "robot", }) if err != nil { return nil, err } var gameparam bot.GameParam err = websocket.JSON.Receive(ws, &gameparam) log.Printf("gameparam: %+v", gameparam) if gameparam.Type != "gameparam" { return nil, errors.New("didn't receive a good gameparam") } log.Printf("%+v", gameparam) err = websocket.JSON.Send(ws, &bot.Config{ ID: gameid, Name: *botname, Stats: bot.Stats{ Hp: *hp, Speed: *speed, WeaponRadius: *weaponRadius, ScannerRadius: *scannerRadius, }, }) var handshake bot.Handshake websocket.JSON.Receive(ws, &handshake) if !handshake.Success { return nil, errors.New("failed to validate correct stats request") } log.Printf("%+v", handshake) return &infos{ id: idreq.AssignedID, width: gameparam.BoardSize.Width, height: gameparam.BoardSize.Height, }, err } func main() { var err error var gameid string flag.Parse() if flag.NArg() < 1 { gameid, err = createGame() if err != nil { log.Fatal(err) } } else { gameid = flag.Arg(0) } ws, err := connect() if err != nil { log.Fatal(err) } board_info, err := negociate(ws, gameid) if err != nil { log.Fatal(err) } // TODO: var target govector.Point2d moveto := govector.Point2d{ X: rand.Float64() * board_info.width, Y: rand.Float64() * board_info.height, } log.Printf("%+v", moveto) var me bot.Robot log.Printf("negociated well, starting loop") for { var boardstate bot.Boardstate err = websocket.JSON.Receive(ws, &boardstate) if err != nil { log.Fatal("Connection lost") } for _, bot := range boardstate.Robots { if bot.Id == board_info.id { me = bot break } } log.Printf("%+v: %+v", me.Position, moveto) if govector.Distance(me.Position, moveto) < 3.0 { moveto = govector.Point2d{ X: rand.Float64() * board_info.width, Y: rand.Float64() * board_info.height, } } // TODO: send instructions log.Printf("%+v: %+v", me.Position, moveto) err = websocket.JSON.Send(ws, bot.Instruction{ MoveTo: &moveto, }) if err != nil { log.Fatal(err) } } }