gui2 mp create improvements

This fixes the loadingscreen showing in that dialog.

This fixed the gui1 create screen showing after the gui2 create screen,
im particular the gui2 create screen can now be used to start mp
scenarios (but not all configure options work correctly yet)
This commit is contained in:
gfgtdf 2016-08-16 14:56:24 +02:00
parent b4a98cdc84
commit f264b6cddc
4 changed files with 82 additions and 39 deletions

View file

@ -11,19 +11,11 @@
namespace ng {
configure_engine::configure_engine(saved_game& state) :
state_(state),
parameters_(state_.mp_settings()),
side_cfg_(state_.get_starting_pos().child_or_empty("side"))
configure_engine::configure_engine(saved_game& state, const config* intial)
: state_(state)
, parameters_(state_.mp_settings())
, initial_(intial ? intial : &state_.get_starting_pos())
{
if (!state_.get_starting_pos().has_child("side")) {
std::stringstream msg;
msg << "Configure Engine: No sides found in scenario, aborting.";
std::cerr << msg.str();
std::cerr << "Full scenario config:\n";
std::cerr << state_.to_config().debug();
throw game::error(msg.str());
}
set_use_map_settings(use_map_settings_default());
if(state_.classification().get_tagname() == "scenario") {
@ -42,11 +34,6 @@ configure_engine::configure_engine(saved_game& state) :
}
}
void configure_engine::update_side_cfg()
{
side_cfg_ = state_.get_starting_pos().child_or_empty("side");
}
void configure_engine::set_default_values() {
set_use_map_settings(use_map_settings_default());
set_game_name(game_name_default());
@ -65,7 +52,7 @@ void configure_engine::set_default_values() {
}
bool configure_engine::force_lock_settings() const {
return state_.get_starting_pos()["force_lock_settings"].to_bool(!state_.classification().is_normal_mp_game());
return initial_cfg()["force_lock_settings"].to_bool(!state_.classification().is_normal_mp_game());
}
std::string configure_engine::game_name() const { return parameters_.name; }
@ -133,22 +120,22 @@ std::string configure_engine::game_name_default() const {
}
int configure_engine::num_turns_default() const {
return use_map_settings() ?
settings::get_turns(state_.get_starting_pos()["turns"]) :
settings::get_turns(initial_cfg()["turns"]) :
preferences::turns();
}
int configure_engine::village_gold_default() const {
return use_map_settings() && !side_cfg_.empty() ?
settings::get_village_gold(side_cfg_["village_gold"], &state_.classification()) :
return use_map_settings() && !side_cfg().empty() ?
settings::get_village_gold(side_cfg()["village_gold"], &state_.classification()) :
preferences::village_gold();
}
int configure_engine::village_support_default() const {
return use_map_settings() && !side_cfg_.empty() ?
settings::get_village_support(side_cfg_["village_support"]) :
return use_map_settings() && !side_cfg().empty() ?
settings::get_village_support(side_cfg()["village_support"]) :
preferences::village_support();
}
int configure_engine::xp_modifier_default() const {
return use_map_settings() ?
settings::get_xp_modifier(state_.get_starting_pos()["experience_modifier"]) :
settings::get_xp_modifier(initial_cfg()["experience_modifier"]) :
preferences::xp_modifier();
}
int configure_engine::mp_countdown_init_time_default() const {
@ -171,17 +158,17 @@ bool configure_engine::use_map_settings_default() const {
}
bool configure_engine::random_start_time_default() const {
return use_map_settings() ?
state_.get_starting_pos()["random_start_time"].to_bool(false) :
initial_cfg()["random_start_time"].to_bool(false) :
preferences::random_start_time();
}
bool configure_engine::fog_game_default() const {
return use_map_settings() && !side_cfg_.empty() ?
side_cfg_["fog"].to_bool(state_.classification().is_normal_mp_game()) :
return use_map_settings() && !side_cfg().empty() ?
side_cfg()["fog"].to_bool(state_.classification().is_normal_mp_game()) :
preferences::fog();
}
bool configure_engine::shroud_game_default() const {
return use_map_settings() && !side_cfg_.empty() ?
side_cfg_["shroud"].to_bool(false) :
return use_map_settings() && !side_cfg().empty() ?
side_cfg()["shroud"].to_bool(false) :
preferences::shroud();
}
bool configure_engine::allow_observers_default() const {

View file

@ -31,7 +31,7 @@ namespace ng {
class configure_engine
{
public:
configure_engine(saved_game& state);
configure_engine(saved_game& state, const config* intial = nullptr);
// Set all parameters to their default values
void set_default_values();
@ -112,10 +112,15 @@ public:
const std::vector<std::string>& entry_point_titles() const;
void write_parameters();
void update_side_cfg();
void update_initial_cfg(const config& cfg)
{
initial_ = &cfg;
}
private:
saved_game& state_;
mp_game_settings& parameters_;
/// Never nullptr.
const config* initial_;
// village gold, village support, fog, and shroud are per player, always show values of player 1.
/**
* @todo This might not be 100% correct, but at the moment
@ -123,8 +128,15 @@ private:
* This might change in the future.
* NOTE when 'load game' is selected there are no sides.
*/
config side_cfg_;
const config& side_cfg() const
{
return initial_->child_or_empty("side");
}
const config& initial_cfg() const
{
return *initial_;
}
std::vector<const config*> entry_points_;
std::vector<std::string> entry_point_titles_;

View file

@ -534,6 +534,8 @@ static void enter_create_mode(CVideo& video, const config& game_config,
if(wesnothd_connection) {
wesnothd_connection->send_data(config("refresh_lobby"));
}
enter_connect_mode(video, game_config, state, wesnothd_connection, local_players_only);
return;
}
do {

View file

@ -103,6 +103,9 @@ tmp_create_game::tmp_create_game(const config& cfg, ng::create_engine& create_en
return create_engine_.get_levels_by_type_unfiltered(type_info.first).empty();
}), level_types_.end());
create_engine_.get_state() = saved_game();
create_engine_.get_state().classification().campaign_type = game_classification::CAMPAIGN_TYPE::MULTIPLAYER;
}
void tmp_create_game::pre_show(twindow& window)
@ -436,16 +439,13 @@ void tmp_create_game::update_details(twindow& window)
create_engine_.current_level().set_metadata();
create_engine_.get_state() = saved_game();
create_engine_.get_state().classification().campaign_type = game_classification::CAMPAIGN_TYPE::MULTIPLAYER;
create_engine_.prepare_for_scenario();
create_engine_.prepare_for_new_level();
//create_engine_.prepare_for_scenario();
//create_engine_.prepare_for_new_level();
//create_engine_.get_parameters();
//config_engine_.write_parameters();
//config_engine_->update_side_cfg();
config_engine_.reset(new ng::configure_engine(create_engine_.get_state()));
config_engine_->update_initial_cfg(create_engine_.current_level().data());
config_engine_->set_default_values();
// TODO: display a message?
if(tcombobox* eras = find_widget<tcombobox>(&window, "eras", false, false)) {
@ -570,6 +570,48 @@ void tmp_create_game::post_show(twindow& window)
{
if(get_retval() == twindow::OK) {
find_widget<tlistbox>(&window, "games_list", false);
create_engine_.prepare_for_era_and_mods();
if (create_engine_.current_level_type() == ng::level::TYPE::CAMPAIGN ||
create_engine_.current_level_type() == ng::level::TYPE::SP_CAMPAIGN) {
std::string difficulty = create_engine_.select_campaign_difficulty();
if (difficulty == "CANCEL") {
return;
}
create_engine_.prepare_for_campaign(difficulty);
}
else if (create_engine_.current_level_type() == ng::level::TYPE::SCENARIO)
{
create_engine_.prepare_for_scenario();
}
else
{
//This means define= doesn't work for random generated scenarios
create_engine_.prepare_for_other();
}
create_engine_.prepare_for_new_level();
create_engine_.prepare_for_scenario();
create_engine_.prepare_for_new_level();
create_engine_.get_parameters();
if (!config_engine_->force_lock_settings())
{
//config_engine_->set_use_map_settings(fog_->get_widget_value());
config_engine_->set_num_turns(turns_->get_widget_value(window));
config_engine_->set_village_gold(gold_->get_widget_value(window));
config_engine_->set_village_support(support_->get_widget_value(window));
config_engine_->set_xp_modifier(experience_->get_widget_value(window));
config_engine_->set_random_start_time(start_time_->get_widget_value(window));
config_engine_->set_fog_game(fog_->get_widget_value(window));
config_engine_->set_shroud_game(shroud_->get_widget_value(window));
config_engine_->write_parameters();
}
//config_engine_->set_options(cfg);
}
}