Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/abacabadabacaba/wesnoth i…
Browse files Browse the repository at this point in the history
…nto abacabadabacaba-master

Conflicts:
	changelog
	src/game_launcher.cpp
  • Loading branch information
gfgtdf committed Jun 21, 2015
2 parents 3d3b510 + b21dd2d commit 0cd8ea5
Show file tree
Hide file tree
Showing 11 changed files with 121 additions and 38 deletions.
3 changes: 2 additions & 1 deletion changelog
Expand Up @@ -50,6 +50,7 @@ Version 1.13.0+dev:
pages.
* Fixed Wesnoth's fonts remaining in use by Windows after abnormal exits, as
well as being available to other applications.
* Started showing on which difficulty levels a campaign was completed.
* WML engine:
* Added support for [object] duration=turn end
* New or updated image path functions:
Expand All @@ -72,7 +73,7 @@ Version 1.13.0+dev:
lobby with music and sound enabled (bug #23633, bug #23599) with libvorbis
builds affected by Debian bug #782831.
* Moved [role] tag to Lua (fix for bug #23630)

Version 1.13.0:
* Security fixes:
* Fixed arbitrary file read from WML/Lua API (CVE-2015-0844, bug #23440).
Expand Down
37 changes: 34 additions & 3 deletions data/gui/default/window/campaign_difficulty.cfg
Expand Up @@ -114,11 +114,42 @@
horizontal_alignment = "left"
border = "all"
border_size = 5
[image]
id = "icon"
[stacked_widget]
id = ""
definition = "default"
linked_group = "icon"
[/image]
[stack]
[layer]
[row]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "left"
border_size = 3
[image]
id = "victory"
definition = "default"
label = "misc/laurel.png"
[/image]
[/column]
[/row]
[/layer]
[layer]
[row]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "left"
border_size = 3
[image]
id = "icon"
definition = "default"
[/image]
[/column]
[/row]
[/layer]
[/stack]
[/stacked_widget]
[/column]
[column]
grow_factor = 1
Expand Down
3 changes: 3 additions & 0 deletions players_changelog
Expand Up @@ -55,6 +55,9 @@ Version 1.13.0+dev:
builds affected by Debian bug #782831.
* Moved [role] tag to Lua (fix for bug #23630)

* User interface:
* Started showing on which difficulty levels a campaign was completed.


Version 1.13.0:
* Security fixes:
Expand Down
15 changes: 9 additions & 6 deletions src/game_initialization/create_engine.cpp
Expand Up @@ -582,10 +582,6 @@ void create_engine::prepare_for_campaign(const std::string& difficulty)
*/
std::string create_engine::select_campaign_difficulty(int set_value)
{
const std::string difficulty_descriptions =
current_level().data()["difficulty_descriptions"];
std::vector<std::string> difficulty_options =
utils::split(difficulty_descriptions, ';');
const std::vector<std::string> difficulties =
utils::split(current_level().data()["difficulties"]);

Expand Down Expand Up @@ -616,9 +612,16 @@ std::string create_engine::select_campaign_difficulty(int set_value)
}
else
{
if(difficulty_options.size() != difficulties.size())
std::string campaign_id = current_level().data()["id"];
std::vector<std::string> difficulty_opts =
utils::split(current_level().data()["difficulty_descriptions"], ';');
if(difficulty_opts.size() != difficulties.size())
{
difficulty_options = difficulties;
difficulty_opts = difficulties;
}
std::vector<std::pair<std::string, bool> > difficulty_options;
for (size_t i = 0; i < difficulties.size(); i++) {
difficulty_options.push_back(make_pair(difficulty_opts[i], preferences::is_campaign_completed(campaign_id, difficulties[i])));
}

// show gui
Expand Down
2 changes: 1 addition & 1 deletion src/game_launcher.cpp
Expand Up @@ -1078,7 +1078,7 @@ void game_launcher::launch_game(RELOAD_GAME_DATA reload)
// don't show The End for multiplayer scenario
// change this if MP campaigns are implemented
if(result == LEVEL_RESULT::VICTORY && state_.classification().campaign_type != game_classification::CAMPAIGN_TYPE::MULTIPLAYER) {
preferences::add_completed_campaign(state_.classification().campaign);
preferences::add_completed_campaign(state_.classification().campaign, state_.classification().difficulty);
the_end(disp(), state_.classification().end_text, state_.classification().end_text_duration);
if(state_.classification().end_credits) {
about::show_about(disp(),state_.classification().campaign);
Expand Down
47 changes: 37 additions & 10 deletions src/game_preferences.cpp
Expand Up @@ -56,6 +56,7 @@ bool message_private_on = false;

bool haloes = true;

std::map<std::string, std::set<std::string> > completed_campaigns;
std::set<std::string> encountered_units_set;
std::set<t_translation::t_terrain> encountered_terrains_set;

Expand Down Expand Up @@ -120,6 +121,26 @@ manager::manager() :
preferences::erase("mp_countdown_action_bonus");
}

/*
completed_campaigns = "A,B,C"
[completed_campaigns]
[campaign]
name = "A"
difficulty_levels = "EASY,MEDIUM"
[/campaign]
[/completed_campaigns]
*/
BOOST_FOREACH(const std::string &c, utils::split(preferences::get("completed_campaigns"))) {
completed_campaigns[c]; // create the elements
}
if (const config &ccc = preferences::get_child("completed_campaigns")) {
BOOST_FOREACH(const config &cc, ccc.child_range("campaign")) {
std::set<std::string> &d = completed_campaigns[cc["name"]];
std::vector<std::string> nd = utils::split(cc["difficulty_levels"]);
std::copy(nd.begin(), nd.end(), std::inserter(d, d.begin()));
}
}

const std::vector<std::string> v (utils::split(preferences::get("encountered_units")));
encountered_units_set.insert(v.begin(), v.end());

Expand Down Expand Up @@ -148,6 +169,15 @@ manager::manager() :

manager::~manager()
{
config campaigns;
typedef const std::pair<std::string, std::set<std::string> > cc_elem;
BOOST_FOREACH(cc_elem &elem, completed_campaigns) {
config cmp;
cmp["name"] = elem.first;
cmp["difficulty_levels"] = utils::join(elem.second);
campaigns.add_child("campaign", cmp);
}
preferences::set_child("completed_campaigns", campaigns);
std::vector<std::string> v (encountered_units_set.begin(), encountered_units_set.end());
preferences::set("encountered_units", utils::join(v));
t_translation::t_list terrain (encountered_terrains_set.begin(), encountered_terrains_set.end());
Expand Down Expand Up @@ -304,20 +334,17 @@ bool is_ignored(const std::string& nick)
}
}

void add_completed_campaign(const std::string& campaign_id) {
std::vector<std::string> completed = utils::split(preferences::get("completed_campaigns"));

if(std::find(completed.begin(), completed.end(), campaign_id) != completed.end())
return;

completed.push_back(campaign_id);
preferences::set("completed_campaigns", utils::join(completed));
void add_completed_campaign(const std::string &campaign_id, const std::string &difficulty_level) {
completed_campaigns[campaign_id].insert(difficulty_level);
}

bool is_campaign_completed(const std::string& campaign_id) {
std::vector<std::string> completed = utils::split(preferences::get("completed_campaigns"));
return completed_campaigns.count(campaign_id) != 0;
}

return std::find(completed.begin(), completed.end(), campaign_id) != completed.end();
bool is_campaign_completed(const std::string& campaign_id, const std::string &difficulty_level) {
std::map<std::string, std::set<std::string> >::iterator it = completed_campaigns.find(campaign_id);
return it == completed_campaigns.end() ? false : it->second.count(difficulty_level) != 0;
}

bool parse_should_show_lobby_join(const std::string &sender, const std::string &message)
Expand Down
3 changes: 2 additions & 1 deletion src/game_preferences.hpp
Expand Up @@ -69,11 +69,12 @@ class acquaintance;
std::map<std::string, std::string> get_acquaintances_nice(const std::string& filter);
bool add_friend(const std::string& nick, const std::string& notes);
bool add_ignore(const std::string& nick, const std::string& reason);
void add_completed_campaign(const std::string& campaign_id);
void add_completed_campaign(const std::string &campaign_id, const std::string &difficulty_level);
void remove_acquaintance(const std::string& nick);
bool is_friend(const std::string& nick);
bool is_ignored(const std::string& nick);
bool is_campaign_completed(const std::string& campaign_id);
bool is_campaign_completed(const std::string& campaign_id, const std::string &difficulty_level);

const std::vector<game_config::server_info>& server_list();

Expand Down
22 changes: 15 additions & 7 deletions src/gui/dialogs/campaign_difficulty.cpp
Expand Up @@ -65,12 +65,12 @@ namespace gui2
REGISTER_DIALOG(campaign_difficulty)

tcampaign_difficulty::tcampaign_difficulty(
const std::vector<std::string>& items)
const std::vector<std::pair<std::string, bool> >& items)
: index_(-1), items_()
{
FOREACH(const AUTO & it, items)
FOREACH(const AUTO & p, items)
{
items_.push_back(tlegacy_menu_item(it));
items_.push_back(std::make_pair(tlegacy_menu_item(p.first), p.second));
}
}

Expand All @@ -83,17 +83,25 @@ void tcampaign_difficulty::pre_show(CVideo& /*video*/, twindow& window)

FOREACH(const AUTO & item, items_)
{
if(item.is_default()) {
if(item.first.is_default()) {
index_ = list.get_item_count();
}

data["icon"]["label"] = item.icon();
data["label"]["label"] = item.label();
data["icon"]["label"] = item.first.icon();
data["label"]["label"] = item.first.label();
data["label"]["use_markup"] = "true";
data["description"]["label"] = item.description();
data["description"]["label"] = item.first.description();
data["description"]["use_markup"] = "true";

list.add_row(data);

tgrid* grid = list.get_row_grid(list.get_item_count() - 1);
assert(grid);

twidget *widget = grid->find("victory", false);
if (widget && !item.second) {
widget->set_visible(twidget::tvisible::hidden);
}
}

if(index_ != -1) {
Expand Down
7 changes: 5 additions & 2 deletions src/gui/dialogs/campaign_difficulty.hpp
Expand Up @@ -26,7 +26,10 @@ namespace gui2
class tcampaign_difficulty : public tdialog
{
public:
explicit tcampaign_difficulty(const std::vector<std::string>& items);
/**
* @param items vector of (difficulty description, already completed) pairs
*/
explicit tcampaign_difficulty(const std::vector<std::pair<std::string, bool> >& items);

/**
* Returns the selected item index after displaying.
Expand All @@ -39,7 +42,7 @@ class tcampaign_difficulty : public tdialog

private:
int index_;
std::vector<tlegacy_menu_item> items_;
std::vector<std::pair<tlegacy_menu_item, bool> > items_;

/** Inherited from tdialog, implemented by REGISTER_DIALOG. */
virtual const std::string& window_id() const;
Expand Down
18 changes: 12 additions & 6 deletions src/savegame.cpp
Expand Up @@ -131,20 +131,26 @@ void loadgame::show_difficulty_dialog()
|| (!cfg_summary["turn"].empty()) )
return;

std::string campaign_id = cfg_summary["campaign"];
const config::const_child_itors &campaigns = game_config_.child_range("campaign");
std::vector<std::string> difficulty_descriptions;
std::vector<std::string> difficulties;
std::vector<std::pair<std::string, bool> > difficulty_options;
BOOST_FOREACH(const config &campaign, campaigns)
{
if (campaign["id"] == cfg_summary["campaign"]) {
difficulty_descriptions = utils::split(campaign["difficulty_descriptions"], ';');
if (campaign["id"] == campaign_id) {
difficulties = utils::split(campaign["difficulties"], ',');

std::vector<std::string> difficulty_opts = utils::split(campaign["difficulty_descriptions"], ';');
if (difficulty_opts.size() != difficulties.size()) {
difficulty_opts = difficulties;
}
for (size_t i = 0; i < difficulties.size(); i++) {
difficulty_options.push_back(make_pair(difficulty_opts[i], preferences::is_campaign_completed(campaign_id, difficulties[i])));
}
break;
}
}

if (difficulty_descriptions.empty())
if (difficulty_options.empty())
return;

#if 0
Expand All @@ -157,7 +163,7 @@ void loadgame::show_difficulty_dialog()
}
#endif

gui2::tcampaign_difficulty difficulty_dlg(difficulty_descriptions);
gui2::tcampaign_difficulty difficulty_dlg(difficulty_options);
difficulty_dlg.show(gui_.video());

if (difficulty_dlg.get_retval() != gui2::twindow::OK) {
Expand Down
2 changes: 1 addition & 1 deletion src/tests/gui/test_gui2.cpp
Expand Up @@ -517,7 +517,7 @@ struct twrapper<gui2::tcampaign_difficulty>
{
static gui2::tcampaign_difficulty* create()
{
static std::vector<std::string> items;
static std::vector<std::pair<std::string, bool> > items;

return new gui2::tcampaign_difficulty(items);
}
Expand Down

0 comments on commit 0cd8ea5

Please sign in to comment.