diff --git a/src/game_initialization/create_engine.cpp b/src/game_initialization/create_engine.cpp index 426202f941bb8..7ad927bc261c5 100644 --- a/src/game_initialization/create_engine.cpp +++ b/src/game_initialization/create_engine.cpp @@ -28,6 +28,7 @@ #include "map/map.hpp" #include "minimap.hpp" #include "saved_game.hpp" +#include "video.hpp" #include "wml_exception.hpp" #include "serialization/preprocessor.hpp" @@ -226,7 +227,7 @@ void campaign::mark_if_completed() } } -create_engine::create_engine(CVideo& v, saved_game& state) +create_engine::create_engine(saved_game& state) : current_level_type_() , current_level_index_(0) , current_era_index_(0) @@ -238,7 +239,7 @@ create_engine::create_engine(CVideo& v, saved_game& state) , eras_() , mods_() , state_(state) - , video_(v) + , video_(CVideo::get_singleton()) , dependency_manager_(nullptr) , generator_(nullptr) , selected_campaign_difficulty_() diff --git a/src/game_initialization/create_engine.hpp b/src/game_initialization/create_engine.hpp index 918377c69fadc..341cb703c5f35 100644 --- a/src/game_initialization/create_engine.hpp +++ b/src/game_initialization/create_engine.hpp @@ -274,7 +274,7 @@ class campaign : public level class create_engine { public: - create_engine(CVideo& v, saved_game& state); + explicit create_engine(saved_game& state); enum MP_EXTRA { ERA, MOD }; diff --git a/src/game_initialization/multiplayer.cpp b/src/game_initialization/multiplayer.cpp index f882bb83de5fd..0a671c703d83b 100644 --- a/src/game_initialization/multiplayer.cpp +++ b/src/game_initialization/multiplayer.cpp @@ -470,11 +470,11 @@ void enter_create_mode(mp_workflow_helper_ptr helper) bool dlg_cancel = false; { - ng::create_engine create_eng(helper->video, helper->state); + bool local_mode = helper->connection == nullptr; + mp::user_info* host_info = helper->lobby_info->get_user(preferences::login()); - gui2::dialogs::mp_create_game dlg(helper->game_config, create_eng); - dlg.show(helper->video); - dlg_cancel = dlg.get_retval() == gui2::window::CANCEL; + gui2::dialogs::mp_create_game dlg(helper->game_config, helper->state, local_mode, host_info); + dlg_cancel = !dlg.show(helper->video); } if(!dlg_cancel) { diff --git a/src/game_initialization/singleplayer.cpp b/src/game_initialization/singleplayer.cpp index d2d3aadaf0ef2..6bae01a5bc28b 100644 --- a/src/game_initialization/singleplayer.cpp +++ b/src/game_initialization/singleplayer.cpp @@ -31,7 +31,7 @@ bool enter_create_mode(CVideo& video, const config& game_config, saved_game& sta bool configure_canceled = false; do { - ng::create_engine create_eng(video, state); + ng::create_engine create_eng(state); create_eng.set_current_level_type(ng::level::TYPE::SP_CAMPAIGN); diff --git a/src/gui/dialogs/multiplayer/mp_create_game.cpp b/src/gui/dialogs/multiplayer/mp_create_game.cpp index 33284c01196d2..fdd4811fedbf2 100644 --- a/src/gui/dialogs/multiplayer/mp_create_game.cpp +++ b/src/gui/dialogs/multiplayer/mp_create_game.cpp @@ -17,35 +17,36 @@ #include "gui/dialogs/multiplayer/mp_create_game.hpp" #include "game_config_manager.hpp" -#include "preferences/game.hpp" +#include "game_initialization/lobby_data.hpp" #include "gettext.hpp" #include "gui/auxiliary/field.hpp" #include "gui/dialogs/helper.hpp" #include "gui/dialogs/message.hpp" #include "gui/dialogs/simple_item_selector.hpp" #include "gui/dialogs/transient_message.hpp" -#include "gui/widgets/integer_selector.hpp" #include "gui/widgets/button.hpp" -#include "gui/widgets/menu_button.hpp" #include "gui/widgets/image.hpp" +#include "gui/widgets/integer_selector.hpp" +#include "gui/widgets/menu_button.hpp" +#include "preferences/game.hpp" #ifdef GUI2_EXPERIMENTAL_LISTBOX #include "gui/widgets/list.hpp" #else #include "gui/widgets/listbox.hpp" #endif +#include "formatter.hpp" +#include "game_config.hpp" #include "gui/widgets/minimap.hpp" #include "gui/widgets/settings.hpp" #include "gui/widgets/slider.hpp" #include "gui/widgets/stacked_widget.hpp" #include "gui/widgets/status_label_helper.hpp" +#include "gui/widgets/text_box.hpp" #include "gui/widgets/toggle_button.hpp" #include "gui/widgets/toggle_panel.hpp" -#include "gui/widgets/text_box.hpp" -#include "game_config.hpp" #include "log.hpp" #include "savegame.hpp" #include "settings.hpp" -#include "formatter.hpp" #ifdef GUI2_EXPERIMENTAL_LISTBOX #include "utils/functional.hpp" @@ -73,9 +74,9 @@ namespace prefs = preferences; REGISTER_DIALOG(mp_create_game) -mp_create_game::mp_create_game(const config& cfg, ng::create_engine& create_eng) +mp_create_game::mp_create_game(const config& cfg, saved_game& state, bool local_mode, mp::user_info* host_info) : cfg_(cfg) - , create_engine_(create_eng) + , create_engine_(state) , config_engine_() , options_manager_() , selected_game_index_(-1) @@ -101,6 +102,8 @@ mp_create_game::mp_create_game(const config& cfg, ng::create_engine& create_eng) , action_bonus_(register_integer("action_bonus", true, prefs::countdown_action_bonus, prefs::set_countdown_action_bonus)) , mod_list_() , eras_menu_button_() + , local_mode_(local_mode) + , host_info_(host_info) { level_types_ = { {ng::level::TYPE::SCENARIO, _("Scenarios")}, @@ -299,6 +302,26 @@ void mp_create_game::pre_show(window& win) bind_status_label(&win, reservoir_->id()); bind_status_label(&win, action_bonus_->id()); + // + // Disable certain settings if we're playing a local game. + // + + // Don't allow a 'registered users only' game if the host themselves isn't registered. + if(local_mode_ || (host_info_ && !host_info_->registered)) { + registered_users_->widget_set_enabled(win, false, false); + } + + if(local_mode_) { + find_widget(&win, "game_password", false).set_active(false); + + observers_->widget_set_enabled(win, false, false); + strict_sync_->widget_set_enabled(win, false, false); + } + + if(host_info_ && !host_info_->registered) { + registered_users_->widget_set_enabled(win, false, false); + } + // // Set up tab control // diff --git a/src/gui/dialogs/multiplayer/mp_create_game.hpp b/src/gui/dialogs/multiplayer/mp_create_game.hpp index e7e47a8145be8..e14b2c9488b32 100644 --- a/src/gui/dialogs/multiplayer/mp_create_game.hpp +++ b/src/gui/dialogs/multiplayer/mp_create_game.hpp @@ -25,12 +25,14 @@ class config; -namespace gui2 +namespace mp { +struct user_info; +} +namespace gui2 +{ class toggle_button; -class toggle_panel; -class widget; class listbox; class menu_button; @@ -42,7 +44,7 @@ class mp_create_game : public modal_dialog, private plugin_executor typedef std::pair level_type_info; public: - mp_create_game(const config& cfg, ng::create_engine& create_eng); + mp_create_game(const config& cfg, saved_game& state, bool local_mode, mp::user_info* host_info = nullptr); private: /** Inherited from modal_dialog, implemented by REGISTER_DIALOG. */ @@ -56,7 +58,7 @@ class mp_create_game : public modal_dialog, private plugin_executor const config& cfg_; - ng::create_engine& create_engine_; + ng::create_engine create_engine_; std::unique_ptr config_engine_; std::unique_ptr options_manager_; @@ -113,6 +115,10 @@ class mp_create_game : public modal_dialog, private plugin_executor listbox* mod_list_; menu_button* eras_menu_button_; + bool local_mode_; + + mp::user_info* host_info_; + template void on_filter_change(window& window, const std::string& id, bool do_select);