package main import ( "code.google.com/p/go.net/websocket" "flag" "fmt" "log" "math/rand" "net/http" "time" ) var addr = flag.String("addr", ":8666", "http service address") var velocity = flag.Float64("velocity", 30, "") var tick = flag.Int("tick", 33, "") var weapon_radius = flag.Int("weapon_radius", 35, "") var verbose = flag.Bool("verbose", false, "") var width = flag.Float64("width", 800, "width of field") var height = flag.Float64("height", 550, "height of field") var delta float64 var g *game var games map[string]*game var idg *IdGenerator func main() { rand.Seed(time.Now().UnixNano()) flag.Parse() games = make(map[string]*game) idg = NewIdGenerator() delta = float64(*tick) / 1000 http.Handle("/ws/", websocket.Handler(addPlayer)) http.Handle("/game/start/", JsonHandler(startGame)) // http.Handle("/game/stop/", stopGame) err := http.ListenAndServe(*addr, nil) if err != nil { log.Fatal("unable to start server") } } func startGame(w http.ResponseWriter, req *http.Request) { new_game_name := idg.Hash() _g := NewGame() go _g.run() games[new_game_name] = _g w.Write([]byte(fmt.Sprintf(`{"id": "%s"}`, new_game_name))) } func addPlayer(ws *websocket.Conn) { id := fmt.Sprintf("robot%d", <-g.robot_id) conf, err := Negociate(ws, id, *width, *height) if err != nil { websocket.JSON.Send(ws, NewFailure(err.Error())) } if conf != nil { p := &player{ Robot: robot{ Stats: conf.Stats, Id: id, Health: conf.Stats.Hp, Scanners: make([]scanner, 0)}, send: make(chan *boardstate), ws: ws, } p.reset() g.register <- p defer func() { g.unregister <- p }() go p.sender() p.recv() log.Printf("%v has been disconnect from this game\n", p.Robot.Id) } else { s := &Spectator{ send: make(chan *boardstate), ws: ws, } g.sregister <- s defer func() { g.sunregister <- s }() s.sender() log.Printf("%+v has been disconnect from this game\n", s) } }