func InsertVersusMenu(ui gui.WidgetParent, replace func(gui.WidgetParent) error) error { // return doChooserMenu(ui, makeChooseVersusMetaMenu, replace, inserter(insertGoalMenu)) chooser, done, err := makeChooseVersusMetaMenu() if err != nil { return err } ui.AddChild(chooser) go func() { m := <-done ui.RemoveChild(chooser) if m != nil && len(m) == 1 { base.Log().Printf("Chose: %v", m) switch m[0] { case "Select House": ui.AddChild(MakeGamePanel("versus/basic.lua", nil, map[string]string{"map": "select"}, "")) case "Random House": ui.AddChild(MakeGamePanel("versus/basic.lua", nil, map[string]string{"map": "random"}, "")) case "Continue": ui.AddChild(MakeGamePanel("versus/basic.lua", nil, map[string]string{"map": "continue"}, "")) default: base.Error().Printf("Unknown meta choice '%s'", m[0]) return } } else { err := replace(ui) if err != nil { base.Error().Printf("Error replacing menu: %v", err) } } }() return nil }
func InsertStartMenu(ui gui.WidgetParent) error { var sm StartMenu datadir := base.GetDataDir() err := base.LoadAndProcessObject(filepath.Join(datadir, "ui", "start", "layout.json"), "json", &sm.layout) if err != nil { return err } sm.buttons = []ButtonLike{ &sm.layout.Menu.Continue, &sm.layout.Menu.Versus, &sm.layout.Menu.Online, &sm.layout.Menu.Settings, } sm.layout.Menu.Continue.f = func(interface{}) {} sm.layout.Menu.Versus.f = func(interface{}) { ui.RemoveChild(&sm) ui.AddChild(MakeGamePanel("versus/basic.lua", nil, nil)) } sm.layout.Menu.Settings.f = func(interface{}) {} sm.layout.Menu.Online.f = func(interface{}) { ui.RemoveChild(&sm) err := InsertOnlineMenu(ui) if err != nil { base.Error().Printf("Unable to make Online Menu: %v", err) return } } ui.AddChild(&sm) return nil }
func InsertCreditsMenu(ui gui.WidgetParent) error { var cm CreditsMenu datadir := base.GetDataDir() err := base.LoadAndProcessObject(filepath.Join(datadir, "ui", "start", "credits", "layout.json"), "json", &cm.layout) if err != nil { return err } cm.buttons = []ButtonLike{ &cm.layout.Back, &cm.layout.Up, &cm.layout.Down, } cm.layout.Back.f = func(interface{}) { ui.RemoveChild(&cm) InsertStartMenu(ui) } d := base.GetDictionary(cm.layout.Credits.Size) cm.layout.Credits.Scroll.Height = len(cm.layout.Credits.Lines) * int(d.MaxHeight()) cm.layout.Down.valid_func = func() bool { return cm.layout.Credits.Scroll.Height > cm.layout.Credits.Scroll.Dy } cm.layout.Up.valid_func = cm.layout.Down.valid_func cm.layout.Down.f = func(interface{}) { cm.layout.Credits.Scroll.Down() } cm.layout.Up.f = func(interface{}) { cm.layout.Credits.Scroll.Up() } cm.ui = ui ui.AddChild(&cm) return nil }
func insertGoalMenu(ui gui.WidgetParent, replace replacer) error { chooser, done, err := makeChooseGoalMenu() if err != nil { return err } ui.AddChild(chooser) go func() { m := <-done ui.RemoveChild(chooser) if m != nil { base.Log().Printf("Chose: %v", m) err = insertGoalMenu(ui, replace) if err != nil { base.Error().Printf("Error making goal menu: %v", err) } } else { err := replace(ui) if err != nil { base.Error().Printf("Error replacing menu: %v", err) } } }() return nil }
func doChooserMenu(ui gui.WidgetParent, cm chooserMaker, r replacer, i inserter) error { chooser, done, err := cm() if err != nil { return err } ui.AddChild(chooser) go func() { m := <-done ui.RemoveChild(chooser) if m != nil { base.Log().Printf("Chose: %v", m) err = i(ui, r) if err != nil { base.Error().Printf("Error making menu: %v", err) } } else { err := r(ui) if err != nil { base.Error().Printf("Error replacing menu: %v", err) } } }() return nil }
func InsertOnlineMenu(ui gui.WidgetParent) error { var sm OnlineMenu datadir := base.GetDataDir() err := base.LoadAndProcessObject(filepath.Join(datadir, "ui", "start", "online", "layout.json"), "json", &sm.layout) if err != nil { return err } sm.buttons = []ButtonLike{ &sm.layout.Back, &sm.layout.Unstarted.Up, &sm.layout.Unstarted.Down, &sm.layout.Active.Up, &sm.layout.Active.Down, &sm.layout.User, &sm.layout.NewGame, } sm.control.in = make(chan struct{}) sm.control.out = make(chan struct{}) sm.layout.Back.f = func(interface{}) { ui.RemoveChild(&sm) InsertStartMenu(ui) } sm.ui = ui var net_id mrgnet.NetId fmt.Sscanf(base.GetStoreVal("netid"), "%d", &net_id) if net_id == 0 { net_id = mrgnet.NetId(mrgnet.RandomId()) base.SetStoreVal("netid", fmt.Sprintf("%d", net_id)) } in_newgame := false sm.layout.NewGame.f = func(interface{}) { if in_newgame { return } in_newgame = true go func() { var req mrgnet.NewGameRequest req.Id = net_id var resp mrgnet.NewGameResponse done := make(chan bool, 1) go func() { mrgnet.DoAction("new", req, &resp) done <- true }() select { case <-done: case <-time.After(10 * time.Second): resp.Err = "Couldn't connect to server." } <-sm.control.in defer func() { in_newgame = false sm.control.out <- struct{}{} }() if resp.Err != "" { sm.layout.Error.err = resp.Err base.Error().Printf("Couldn't make new game: %v", resp.Err) return } ui.RemoveChild(&sm) err := InsertMapChooser( ui, func(name string) { ui.AddChild(MakeGamePanel(name, nil, nil, resp.Game_key)) }, InsertOnlineMenu, ) if err != nil { base.Error().Printf("Error making Map Chooser: %v", err) } }() } for _, _glb := range []*gameListBox{&sm.layout.Active, &sm.layout.Unstarted} { glb := _glb glb.Up.f = func(interface{}) { glb.Scroll.Up() } glb.Down.f = func(interface{}) { glb.Scroll.Down() } glb.update = make(chan mrgnet.ListGamesResponse) } go func() { var resp mrgnet.ListGamesResponse mrgnet.DoAction("list", mrgnet.ListGamesRequest{Id: net_id, Unstarted: true}, &resp) sm.layout.Unstarted.update <- resp }() go func() { var resp mrgnet.ListGamesResponse mrgnet.DoAction("list", mrgnet.ListGamesRequest{Id: net_id, Unstarted: false}, &resp) sm.layout.Active.update <- resp }() sm.layout.User.Button.f = func(interface{}) { var req mrgnet.UpdateUserRequest req.Name = sm.layout.User.Entry.text req.Id = net_id var resp mrgnet.UpdateUserResponse go func() { mrgnet.DoAction("user", req, &resp) <-sm.control.in sm.layout.User.SetText(resp.Name) sm.update_alpha = 1.0 sm.update_time = time.Now() sm.control.out <- struct{}{} }() } go func() { var resp mrgnet.UpdateUserResponse mrgnet.DoAction("user", mrgnet.UpdateUserRequest{Id: net_id}, &resp) <-sm.control.in sm.layout.User.SetText(resp.Name) sm.update_alpha = 1.0 sm.update_time = time.Now() sm.control.out <- struct{}{} }() ui.AddChild(&sm) return nil }
func InsertMapChooser(ui gui.WidgetParent, chosen func(string), resert func(ui gui.WidgetParent) error) error { var bops []OptionBasic datadir := base.GetDataDir() err := base.LoadAndProcessObject(filepath.Join(datadir, "ui", "start", "versus", "map_select.json"), "json", &bops) if err != nil { base.Error().Printf("Unable to insert MapChooser: %v", err) return err } var opts []Option algorithm.Map2(bops, &opts, func(ob OptionBasic) Option { return &ob }) for _, opt := range opts { base.Log().Printf(opt.String()) } var ch Chooser err = base.LoadAndProcessObject(filepath.Join(datadir, "ui", "chooser", "layout.json"), "json", &ch.layout) if err != nil { base.Error().Printf("Unable to insert MapChooser: %v", err) return err } ch.options = opts ch.buttons = []*Button{ &ch.layout.Up, &ch.layout.Down, &ch.layout.Back, &ch.layout.Next, } ch.non_scroll_buttons = []*Button{ &ch.layout.Back, &ch.layout.Next, } ch.layout.Up.f = func(interface{}) { ch.layout.Options.Up() } ch.layout.Down.f = func(interface{}) { ch.layout.Options.Down() } ch.selected = make(map[int]bool) ch.layout.Back.f = func(interface{}) { ui.RemoveChild(&ch) err := resert(ui) if err != nil { base.Error().Printf("Unable to make Start Menu: %v", err) return } } ch.layout.Next.f = func(interface{}) { for i := range ch.options { if ch.selected[i] { ui.RemoveChild(&ch) chosen(ch.options[i].String()) } } } ch.layout.Next.valid_func = func() bool { return ch.selector(-1, ch.selected, false) } ch.min, ch.max = 1, 1 if ch.min == 1 && ch.max == 1 { ch.selector = SelectExactlyOne } else { ch.selector = SelectInRange(ch.min, ch.max) } ch.info_region = gui.Region{ gui.Point{ch.layout.Info.X, ch.layout.Info.Y}, gui.Dims{ch.layout.Info.Dx, ch.layout.Info.Dy}, } ui.AddChild(&ch) return nil }
func InsertOnlineMenu(ui gui.WidgetParent) error { var sm OnlineMenu datadir := base.GetDataDir() err := base.LoadAndProcessObject(filepath.Join(datadir, "ui", "start", "online", "layout.json"), "json", &sm.layout) if err != nil { return err } sm.buttons = []ButtonLike{ &sm.layout.Back, &sm.layout.Unstarted.Up, &sm.layout.Unstarted.Down, &sm.layout.Active.Up, &sm.layout.Active.Down, &sm.layout.User, } sm.layout.Back.f = func(interface{}) { ui.RemoveChild(&sm) InsertStartMenu(ui) } var net_id mrgnet.NetId fmt.Sscanf(base.GetStoreVal("netid"), "%d", &net_id) if net_id == 0 { net_id = mrgnet.NetId(mrgnet.RandomId()) base.SetStoreVal("netid", fmt.Sprintf("%d", net_id)) } for _, _glb := range []*gameListBox{&sm.layout.Active, &sm.layout.Unstarted} { glb := _glb glb.Up.f = func(interface{}) { glb.Scroll.Up() } glb.Down.f = func(interface{}) { glb.Scroll.Down() } glb.update = make(chan mrgnet.ListGamesResponse) } go func() { var resp mrgnet.ListGamesResponse mrgnet.DoAction("list", mrgnet.ListGamesRequest{Id: net_id, Unstarted: true}, &resp) sm.layout.Unstarted.update <- resp }() go func() { var resp mrgnet.ListGamesResponse mrgnet.DoAction("list", mrgnet.ListGamesRequest{Id: net_id, Unstarted: false}, &resp) sm.layout.Active.update <- resp }() sm.update_user = make(chan mrgnet.UpdateUserResponse) sm.layout.User.Button.f = func(interface{}) { var req mrgnet.UpdateUserRequest req.Name = sm.layout.User.Entry.text req.Id = net_id var resp mrgnet.UpdateUserResponse go func() { mrgnet.DoAction("user", req, &resp) sm.update_user <- resp }() } go func() { var resp mrgnet.UpdateUserResponse mrgnet.DoAction("user", mrgnet.UpdateUserRequest{Id: net_id}, &resp) sm.update_user <- resp }() ui.AddChild(&sm) return nil }