static void enter_create_mode(game_display& disp, const config& game_config, mp::chat& chat, config& gamelist, mp::controller default_controller, bool local_players_only) { if (0 && gui2::new_widgets) { gui2::tmp_create_game dlg(game_config); dlg.show(disp.video()); network::send_data(config("refresh_lobby"), 0, true); } else { mp::ui::result res; mp_game_settings params; int num_turns; { mp::create ui(disp, game_config, chat, gamelist); run_lobby_loop(disp, ui); res = ui.get_result(); params = ui.get_parameters(); num_turns = ui.num_turns(); } switch (res) { case mp::ui::CREATE: enter_connect_mode(disp, game_config, chat, gamelist, params, num_turns, default_controller, local_players_only); break; case mp::ui::QUIT: default: //update lobby content network::send_data(config("refresh_lobby"), 0, true); break; } } }
static bool enter_configure_mode(game_display& disp, const config& game_config, saved_game& state, bool local_players_only) { DBG_MP << "entering configure mode" << std::endl; bool connect_canceled; do { connect_canceled = false; mp::ui::result res; { mp::configure ui(disp, game_config, gamechat, gamelist, state, local_players_only); run_lobby_loop(disp, ui); res = ui.get_result(); ui.get_parameters(); } switch (res) { case mp::ui::CREATE: connect_canceled = !enter_connect_mode(disp, game_config, state, local_players_only); break; case mp::ui::QUIT: default: //update lobby content network::send_data(config("refresh_lobby"), 0); return false; } } while(connect_canceled); return true; }
static void enter_create_mode(game_display& disp, const config& game_config, game_state& state, bool local_players_only) { DBG_MP << "entering create mode" << std::endl; bool configure_canceled; bool connect_canceled; do { configure_canceled = false; connect_canceled = false; if (gui2::new_widgets) { gui2::tmp_create_game dlg(game_config); dlg.show(disp.video()); network::send_data(config("refresh_lobby"), 0); } else { mp::ui::result res; mp_game_settings new_params; { mp::create ui(disp, game_config, state, gamechat, gamelist); run_lobby_loop(disp, ui); res = ui.get_result(); new_params = ui.get_parameters(); } switch (res) { case mp::ui::CREATE: configure_canceled = !enter_configure_mode(disp, game_config, state, new_params, local_players_only); break; case mp::ui::LOAD_GAME: connect_canceled = !enter_connect_mode(disp, game_config, state, new_params, local_players_only); break; case mp::ui::QUIT: default: //update lobby content network::send_data(config("refresh_lobby"), 0); break; } } } while(configure_canceled || connect_canceled); }
static bool enter_connect_mode(game_display& disp, const config& game_config, game_state& state, const mp_game_settings& params, bool local_players_only = false) { DBG_MP << "entering connect mode" << std::endl; mp::ui::result res; const network::manager net_manager(1,1); network_game_manager m; gamelist.clear(); statistics::fresh_stats(); { mp::connect_engine_ptr connect_engine(new mp::connect_engine(disp, state, params, local_players_only, true)); mp::connect ui(disp, params.name, game_config, gamechat, gamelist, *connect_engine); run_lobby_loop(disp, ui); res = ui.get_result(); // start_game() updates the parameters to reflect game start, // so it must be called before get_level() if (res == mp::ui::PLAY) { ui.start_game(); } } switch (res) { case mp::ui::PLAY: play_game(disp, state, game_config, IO_SERVER, false, !local_players_only); recorder.clear(); break; case mp::ui::CREATE: enter_create_mode(disp, game_config, state, local_players_only); break; case mp::ui::QUIT: default: network::send_data(config("refresh_lobby"), 0); return false; } return true; }
static void enter_wait_mode(game_display& disp, const config& game_config, mp::chat& chat, config& gamelist, bool observe) { mp::ui::result res; game_state state; network_game_manager m; upload_log nolog(false); gamelist.clear(); statistics::fresh_stats(); { mp::wait ui(disp, game_config, chat, gamelist); ui.join_game(observe); run_lobby_loop(disp, ui); res = ui.get_result(); if (res == mp::ui::PLAY) { ui.start_game(); // FIXME commented a pointeless if since the else does exactly the same thing //if (preferences::skip_mp_replay()){ //FIXME implement true skip replay //state = ui.request_snapshot(); //state = ui.get_state(); //} //else{ state = ui.get_state(); //} } } switch (res) { case mp::ui::PLAY: play_game(disp, state, game_config, nolog, IO_CLIENT, preferences::skip_mp_replay() && observe); recorder.clear(); break; case mp::ui::QUIT: default: break; } }
static void enter_connect_mode(game_display& disp, const config& game_config, mp::chat& chat, config& gamelist, const mp_game_settings& params, const int num_turns, mp::controller default_controller, bool local_players_only = false) { mp::ui::result res; game_state state; const network::manager net_manager(1,1); network_game_manager m; upload_log nolog(false); gamelist.clear(); statistics::fresh_stats(); { mp::connect ui(disp, game_config, chat, gamelist, params, num_turns, default_controller, local_players_only); run_lobby_loop(disp, ui); res = ui.get_result(); // start_game() updates the parameters to reflect game start, // so it must be called before get_level() if (res == mp::ui::PLAY) { ui.start_game(); state = ui.get_state(); } } switch (res) { case mp::ui::PLAY: play_game(disp, state, game_config, nolog, IO_SERVER); recorder.clear(); break; case mp::ui::CREATE: enter_create_mode(disp, game_config, chat, gamelist, default_controller, local_players_only); break; case mp::ui::QUIT: default: network::send_data(config("refresh_lobby"), 0, true); break; } }
static void enter_wait_mode(game_display& disp, const config& game_config, game_state& state, bool observe) { DBG_MP << "entering wait mode" << std::endl; mp::ui::result res; network_game_manager m; gamelist.clear(); statistics::fresh_stats(); n_unit::id_manager::instance().clear(); //< reset the unit underlying_id counter back to zero { mp::wait ui(disp, game_config, state, gamechat, gamelist); ui.join_game(observe); run_lobby_loop(disp, ui); res = ui.get_result(); if (res == mp::ui::PLAY) { ui.start_game(); // FIXME commented a pointeless if since the else does exactly the same thing //if (preferences::skip_mp_replay()){ //FIXME implement true skip replay //state = ui.request_snapshot(); //} } } switch (res) { case mp::ui::PLAY: play_game(disp, state, game_config, IO_CLIENT, preferences::skip_mp_replay() && observe, true); recorder.clear(); break; case mp::ui::QUIT: default: break; } }
static void enter_lobby_mode(game_display& disp, const config& game_config, game_state& state) { DBG_MP << "entering lobby mode" << std::endl; mp::ui::result res; while (true) { const config &cfg = game_config.child("lobby_music"); if (cfg) { BOOST_FOREACH(const config &i, cfg.child_range("music")) { sound::play_music_config(i); } sound::commit_music_changes(); } else { sound::empty_playlist(); sound::stop_music(); } lobby_info li(game_config); // Force a black background const Uint32 color = SDL_MapRGBA(disp.video().getSurface()->format , 0 , 0 , 0 , 255); sdl_fill_rect(disp.video().getSurface(), NULL, color); if(preferences::new_lobby()) { gui2::tlobby_main dlg(game_config, li, disp); dlg.set_preferences_callback( boost::bind(do_preferences_dialog, boost::ref(disp), boost::ref(game_config))); dlg.show(disp.video()); //ugly kludge for launching other dialogs like the old lobby switch (dlg.get_legacy_result()) { case gui2::tlobby_main::CREATE: res = mp::ui::CREATE; break; case gui2::tlobby_main::JOIN: res = mp::ui::JOIN; break; case gui2::tlobby_main::OBSERVE: res = mp::ui::OBSERVE; break; default: res = mp::ui::QUIT; } } else { mp::lobby ui(disp, game_config, gamechat, gamelist); run_lobby_loop(disp, ui); res = ui.get_result(); } switch (res) { case mp::ui::JOIN: try { enter_wait_mode(disp, game_config, state, false); } catch(config::error& error) { if(!error.message.empty()) { gui2::show_error_message(disp.video(), error.message); } //update lobby content network::send_data(config("refresh_lobby"), 0); } break; case mp::ui::OBSERVE: try { enter_wait_mode(disp, game_config, state, true); } catch(config::error& error) { if(!error.message.empty()) { gui2::show_error_message(disp.video(), error.message); } } // update lobby content unconditionally because we might have left only after the // game ended in which case we ignored the gamelist and need to request it again network::send_data(config("refresh_lobby"), 0); break; case mp::ui::CREATE: try { enter_create_mode(disp, game_config, state, false); } catch(config::error& error) { if (!error.message.empty()) gui2::show_error_message(disp.video(), error.message); //update lobby content network::send_data(config("refresh_lobby"), 0); } break; case mp::ui::QUIT: return; case mp::ui::PREFERENCES: { do_preferences_dialog(disp, game_config); //update lobby content network::send_data(config("refresh_lobby"), 0); } break; default: return; } }