Author: zaroth
Date: Thu May 12 19:22:20 2011
New Revision: 49494
URL: http://svn.gna.org/viewcvs/wesnoth?rev=49494&view=rev
Log:
patch #1937 by Quetzalcoatl: Randomizing starting positions in mp games
Modified:
trunk/changelog
trunk/data/core/about.cfg
trunk/data/gui/default/window/lobby_main.cfg
trunk/src/game_preferences.cpp
trunk/src/game_preferences.hpp
trunk/src/gui/dialogs/lobby/lobby_data.cpp
trunk/src/gui/dialogs/lobby/lobby_data.hpp
trunk/src/gui/dialogs/lobby_main.cpp
trunk/src/mp_game_settings.cpp
trunk/src/mp_game_settings.hpp
trunk/src/multiplayer_connect.cpp
trunk/src/multiplayer_connect.hpp
trunk/src/multiplayer_create.cpp
trunk/src/multiplayer_create.hpp
trunk/src/multiplayer_lobby.cpp
trunk/src/multiplayer_lobby.hpp
trunk/src/server/game.cpp
Modified: trunk/changelog
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/changelog?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/changelog (original)
+++ trunk/changelog Thu May 12 19:22:20 2011
@@ -2,6 +2,9 @@
* Language and i18n:
* Updated translations: British English, Galician, Portuguese (Brazil),
Serbian
+ * Multiplayer:
+ * New "Shuffle sides" option in MP creation list, allowing to randomize
+ player to side assignment (patch #1937 by Quetzalcoatl)
* WML engine:
* new attribute team_name= in SSFs
* added [event][filter_side]<SSF keys> support
Modified: trunk/data/core/about.cfg
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/data/core/about.cfg?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/data/core/about.cfg (original)
+++ trunk/data/core/about.cfg Thu May 12 19:22:20 2011
@@ -1038,9 +1038,6 @@
name = "Luiz Fernando de Faria Pereira (lfernando)"
[/entry]
[entry]
- name = "Åukasz Dobrogowski (nital)"
- [/entry]
- [entry]
name = "Maksim Orlovich (SadEagle)"
[/entry]
[entry]
@@ -1092,6 +1089,9 @@
[/entry]
[entry]
name = "Priit Laes (plaes)"
+ [/entry]
+ [entry]
+ name = "Quetzalcoatl"
[/entry]
[entry]
name = "Richard Yao (srk9)"
Modified: trunk/data/gui/default/window/lobby_main.cfg
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/data/gui/default/window/lobby_main.cfg?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/data/gui/default/window/lobby_main.cfg (original)
+++ trunk/data/gui/default/window/lobby_main.cfg Thu May 12 19:22:20 2011
@@ -174,6 +174,7 @@
{GAMELISTBOX_BODY_LABEL "map_size_text" ""}
{GAMELISTBOX_BODY_LABEL "scenario" ""}
{GAMELISTBOX_BODY_IMAGE "observer_icon" "misc/eye.png" ""}
+
{GAMELISTBOX_BODY_IMAGE "shuffle_sides_icon" "misc/shuffle-sides.png" _"Assign
sides to players at random"}
{GAMELISTBOX_BODY_IMAGE "needs_password" "misc/key.png" _"Requires a password
to join"}
{GAMELISTBOX_BODY_IMAGE "use_map_settings" "misc/ums.png" _"Use map settings"}
{GAMELISTBOX_BODY_IMAGE "reloaded" "misc/reloaded.png" _"Reloaded game"}
Modified: trunk/src/game_preferences.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/game_preferences.cpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/game_preferences.cpp (original)
+++ trunk/src/game_preferences.cpp Thu May 12 19:22:20 2011
@@ -422,6 +422,16 @@
preferences::set("allow_observers", value);
}
+bool shuffle_sides()
+{
+ return preferences::get("shuffle_sides", false);
+}
+
+void set_shuffle_sides(bool value)
+{
+ preferences::set("shuffle_sides", value);
+}
+
bool use_map_settings()
{
return preferences::get("mp_use_map_settings", true);
Modified: trunk/src/game_preferences.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/game_preferences.hpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/game_preferences.hpp (original)
+++ trunk/src/game_preferences.hpp Thu May 12 19:22:20 2011
@@ -98,6 +98,9 @@
bool allow_observers();
void set_allow_observers(bool value);
+ bool shuffle_sides();
+ void set_shuffle_sides(bool value);
+
bool use_map_settings();
void set_use_map_settings(bool value);
Modified: trunk/src/gui/dialogs/lobby/lobby_data.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/dialogs/lobby/lobby_data.cpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/gui/dialogs/lobby/lobby_data.cpp (original)
+++ trunk/src/gui/dialogs/lobby/lobby_data.cpp Thu May 12 19:22:20 2011
@@ -179,6 +179,7 @@
, fog(game["mp_fog"].to_bool())
, shroud(game["mp_shroud"].to_bool())
, observers(game["observer"].to_bool(true))
+, shuffle_sides(game["shuffle_sides"].to_bool(true))
, use_map_settings(game["mp_use_map_settings"].to_bool())
, verified(true)
, password_required(game["password"].to_bool())
Modified: trunk/src/gui/dialogs/lobby/lobby_data.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/dialogs/lobby/lobby_data.hpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/gui/dialogs/lobby/lobby_data.hpp (original)
+++ trunk/src/gui/dialogs/lobby/lobby_data.hpp Thu May 12 19:22:20 2011
@@ -134,6 +134,7 @@
bool fog;
bool shroud;
bool observers;
+ bool shuffle_sides;
bool use_map_settings;
bool verified;
bool password_required;
Modified: trunk/src/gui/dialogs/lobby_main.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/dialogs/lobby_main.cpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/gui/dialogs/lobby_main.cpp (original)
+++ trunk/src/gui/dialogs/lobby_main.cpp Thu May 12 19:22:20 2011
@@ -744,6 +744,7 @@
set_visible_if_exists(grid, "vision_shroud", game.shroud);
set_visible_if_exists(grid, "vision_none", !(game.fog || game.shroud));
set_visible_if_exists(grid, "observers_yes", game.observers);
+ set_visible_if_exists(grid, "shuffle_sides_icon", game.shuffle_sides);
set_visible_if_exists(grid, "observers_no", !game.observers);
set_visible_if_exists(grid, "needs_password", game.password_required);
set_visible_if_exists(grid, "reloaded", game.reloaded);
Modified: trunk/src/mp_game_settings.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/mp_game_settings.cpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/mp_game_settings.cpp (original)
+++ trunk/src/mp_game_settings.cpp Thu May 12 19:22:20 2011
@@ -40,6 +40,7 @@
fog_game(false),
shroud_game(false),
allow_observers(false),
+ shuffle_sides(false),
share_view(false),
share_maps(false),
saved_game(false),
@@ -66,6 +67,7 @@
fog_game(false),
shroud_game(false),
allow_observers(false),
+ shuffle_sides(false),
share_view(false),
share_maps(false),
saved_game(false),
@@ -93,6 +95,7 @@
, fog_game(settings.fog_game)
, shroud_game(settings.shroud_game)
, allow_observers(settings.allow_observers)
+ , shuffle_sides(settings.shuffle_sides)
, share_view(settings.share_view)
, share_maps(settings.share_maps)
, saved_game(settings.saved_game)
@@ -121,6 +124,7 @@
mp_countdown_action_bonus = cfg["mp_countdown_action_bonus"];
village_gold = cfg["mp_village_gold"];
allow_observers = cfg["observer"].to_bool();
+ shuffle_sides = cfg["shuffle_sides"].to_bool();
saved_game = cfg["savegame"].to_bool();
}
@@ -138,7 +142,7 @@
mp_countdown_turn_bonus=0;
mp_countdown_action_bonus=0;
mp_countdown=false;
- use_map_settings = random_start_time = fog_game = shroud_game =
allow_observers = share_view = share_maps = false;
+ use_map_settings = random_start_time = fog_game = shroud_game =
allow_observers = shuffle_sides = share_view = share_maps = false;
scenario_data.clear();
}
@@ -162,6 +166,7 @@
cfg["mp_shroud"] = shroud_game;
cfg["mp_use_map_settings"] = use_map_settings;
cfg["observer"] = allow_observers;
+ cfg["shuffle_sides"] = shuffle_sides;
cfg["savegame"] = saved_game;
return cfg;
Modified: trunk/src/mp_game_settings.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/mp_game_settings.hpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/mp_game_settings.hpp (original)
+++ trunk/src/mp_game_settings.hpp Thu May 12 19:22:20 2011
@@ -52,6 +52,7 @@
bool fog_game;
bool shroud_game;
bool allow_observers;
+ bool shuffle_sides;
bool share_view;
bool share_maps;
Modified: trunk/src/multiplayer_connect.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/multiplayer_connect.cpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/multiplayer_connect.cpp (original)
+++ trunk/src/multiplayer_connect.cpp Thu May 12 19:22:20 2011
@@ -777,6 +777,16 @@
update_controller_ui();
}
+int connect::side::get_index()
+{
+ return index_;
+}
+
+void connect::side::set_index(int index)
+{
+ index_ = index;
+}
+
const std::string& connect::side::get_player_id() const
{
return player_id_;
@@ -790,6 +800,49 @@
controller_ = i->controller;
}
update_ui();
+}
+
+int connect::side::get_team()
+{
+ return team_;
+}
+
+void connect::side::set_team(int team)
+{
+ team_ = team;
+}
+
+std::vector<std::string> connect::side::get_children_to_swap()
+{
+ std::vector<std::string> children;
+
+ children.push_back("village");
+ children.push_back("unit");
+ children.push_back("ai");
+
+ return children;
+}
+
+std::map<std::string, config> connect::side::get_side_children()
+{
+ std::map<std::string, config> children;
+
+ foreach(const std::string& children_to_swap, get_children_to_swap())
+ foreach(const config& child, cfg_.child_range(children_to_swap))
+ children.insert(std::pair<std::string,
config>(children_to_swap, child));
+
+ return children;
+}
+
+void connect::side::set_side_children(std::map<std::string, config> children)
+{
+ foreach(const std::string& children_to_remove, get_children_to_swap())
+ cfg_.clear_children(children_to_remove);
+
+ std::pair<std::string, config> child_map;
+
+ foreach(child_map, children)
+ cfg_.add_child(child_map.first, child_map.second);
}
void connect::side::set_ready_for_start(bool ready_for_start)
@@ -1115,6 +1168,42 @@
void connect::start_game()
{
DBG_MP << "starting a new game" << std::endl;
+
+ // Shuffle sides (check preferences and if it is a re-loaded
game)
+ if (preferences::shuffle_sides() && !(level_.child("snapshot") &&
level_.child("snapshot").child("side")))
+ {
+ // Only playable sides should be shuffled
+ std::vector<int> playable_sides;
+
+ // Find ids of playable sides
+ for (side_list::iterator itor = sides_.begin(); itor !=
sides_.end(); itor++)
+ if (itor->allow_player())
playable_sides.push_back(itor->get_index());
+
+ // Now do Fisher-Yates shuffle
+ for (int i = playable_sides.size(); i > 1; i--)
+ {
+ int j_side = playable_sides[get_random() % i];
+ int i_side = playable_sides[i - 1];
+
+ int tmp_index = sides_[j_side].get_index();
+ sides_[j_side].set_index(sides_[i_side].get_index());
+ sides_[i_side].set_index(tmp_index);
+
+ int tmp_team = sides_[j_side].get_team();
+ sides_[j_side].set_team(sides_[i_side].get_team());
+ sides_[i_side].set_team(tmp_team);
+
+ std::map<std::string, config> tmp_side_children =
sides_[j_side].get_side_children();
+
sides_[j_side].set_side_children(sides_[i_side].get_side_children());
+ sides_[i_side].set_side_children(tmp_side_children);
+
+ // This is needed otherwise fog bugs will apear
+ side tmp_side = sides_[j_side];
+ sides_[j_side] = sides_[i_side];
+ sides_[i_side] = tmp_side;
+ }
+ }
+
// Resolves the "random faction", "random gender" and "random message"
for (side_list::iterator itor = sides_.begin(); itor != sides_.end();
++itor) {
@@ -1604,6 +1693,7 @@
level_["version"] = game_config::version;
level_["observer"] = params_.allow_observers;
+ level_["shuffle_sides"] = params_.shuffle_sides;
if(level_["objectives"].empty()) {
level_["objectives"] = "<big>" + t_string(N_("Victory:"),
"wesnoth") +
Modified: trunk/src/multiplayer_connect.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/multiplayer_connect.hpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/multiplayer_connect.hpp (original)
+++ trunk/src/multiplayer_connect.hpp Thu May 12 19:22:20 2011
@@ -94,6 +94,10 @@
const std::string& get_current_player() const
{ return current_player_; }
+ int get_index();
+
+ void set_index(int index);
+
const std::string& get_player_id() const;
/** Sets the username of this side. */
@@ -101,6 +105,16 @@
/** Sets if the joining player has chosen his leader. */
void set_ready_for_start(bool ready_for_start);
+
+ int get_team();
+
+ void set_team(int team);
+
+ std::vector<std::string> get_children_to_swap();
+
+ std::map<std::string, config> get_side_children();
+
+ void set_side_children(std::map<std::string, config> children);
/**
* Imports data from the network into this side, and updates
the UI
Modified: trunk/src/multiplayer_create.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/multiplayer_create.cpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/multiplayer_create.cpp (original)
+++ trunk/src/multiplayer_create.cpp Thu May 12 19:22:20 2011
@@ -89,6 +89,7 @@
fog_game_(disp.video(), _("Fog Of War"), gui::button::TYPE_CHECK),
shroud_game_(disp.video(), _("Shroud"), gui::button::TYPE_CHECK),
observers_game_(disp.video(), _("Observers"), gui::button::TYPE_CHECK),
+ shuffle_sides_(disp.video(), _("Shuffle sides"),
gui::button::TYPE_CHECK),
cancel_game_(disp.video(), _("Cancel")),
launch_game_(disp.video(), _("OK")),
regenerate_map_(disp.video(), _("Regenerate")),
@@ -203,6 +204,9 @@
observers_game_.set_check(preferences::allow_observers());
observers_game_.set_help_string(_("Allow users who are not playing to
watch the game"));
+ shuffle_sides_.set_check(preferences::shuffle_sides());
+ shuffle_sides_.set_help_string(_("Assign sides to players at random"));
+
// The possible vision settings
std::vector<std::string> vision_types;
vision_types.push_back(_("Share View"));
@@ -251,6 +255,7 @@
// Save values for next game
DBG_MP << "storing parameter values in preferences" << std::endl;
preferences::set_allow_observers(parameters_.allow_observers);
+ preferences::set_shuffle_sides(parameters_.shuffle_sides);
preferences::set_use_map_settings(parameters_.use_map_settings);
preferences::set_countdown(parameters_.mp_countdown);
preferences::set_countdown_init_time(parameters_.mp_countdown_init_time);
@@ -315,6 +320,7 @@
parameters_.fog_game = fog_game_.checked();
parameters_.shroud_game = shroud_game_.checked();
parameters_.allow_observers = observers_game_.checked();
+ parameters_.shuffle_sides = shuffle_sides_.checked();
parameters_.share_view = vision_combo_.selected() == 0;
parameters_.share_maps = vision_combo_.selected() == 1;
@@ -646,6 +652,7 @@
fog_game_.hide(hide);
shroud_game_.hide(hide);
observers_game_.hide(hide);
+ shuffle_sides_.hide(hide);
cancel_game_.hide(hide);
launch_game_.hide(hide);
regenerate_map_.hide(hide || generator_ == NULL);
@@ -779,8 +786,11 @@
shroud_game_.set_location(xpos + (ca.w - xpos)/2 + 5, ypos);
ypos += observers_game_.height() + border_size;
+ shuffle_sides_.set_location(xpos, ypos);
+ random_start_time_.set_location(xpos + (ca.w - xpos)/2 + 5, ypos);
+ ypos += shuffle_sides_.height() + border_size;
+
countdown_game_.set_location(xpos, ypos);
- random_start_time_.set_location(xpos + (ca.w - xpos)/2 + 5, ypos);
ypos += countdown_game_.height() + border_size;
countdown_init_time_label_.set_location(xpos, ypos);
Modified: trunk/src/multiplayer_create.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/multiplayer_create.hpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/multiplayer_create.hpp (original)
+++ trunk/src/multiplayer_create.hpp Thu May 12 19:22:20 2011
@@ -86,6 +86,7 @@
gui::button fog_game_;
gui::button shroud_game_;
gui::button observers_game_;
+ gui::button shuffle_sides_;
gui::button cancel_game_;
gui::button launch_game_;
gui::button regenerate_map_;
Modified: trunk/src/multiplayer_lobby.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/multiplayer_lobby.cpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/multiplayer_lobby.cpp (original)
+++ trunk/src/multiplayer_lobby.cpp Thu May 12 19:22:20 2011
@@ -50,6 +50,7 @@
time_limit_icon_locator_("themes/sand-clock.png"),
observer_icon_locator_("misc/eye.png"),
no_observer_icon_locator_("misc/no_observer.png"),
+ shuffle_sides_icon_locator_("misc/shuffle-sides.png"),
map_hashes_(map_hashes),
item_height_(100),
margin_(5),
@@ -201,6 +202,17 @@
// all text and icons can be aligned symmetrical to it
ypos -= observer_icon->h/2;
xpos += observer_icon->w + 2 * h_padding_;
+ }
+
+ // Draw shuffle icon
+ if (game.shuffle_sides)
+ {
+ const surface
shuffle_icon(image::get_image(shuffle_sides_icon_locator_));
+ if(shuffle_icon) {
+ video().blit_surface(xpos, ypos - shuffle_icon->h/2,
shuffle_icon);
+
+ xpos += shuffle_icon->w + 2 * h_padding_;
+ }
}
// Draw gold icon
@@ -572,6 +584,7 @@
}
games_.back().xp = game["experience_modifier"] + "%";
games_.back().observers = game["observer"].to_bool(true);
+ games_.back().shuffle_sides =
game["shuffle_sides"].to_bool(true);
games_.back().verified = verified;
// Hack...
Modified: trunk/src/multiplayer_lobby.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/multiplayer_lobby.hpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/multiplayer_lobby.hpp (original)
+++ trunk/src/multiplayer_lobby.hpp Thu May 12 19:22:20 2011
@@ -56,6 +56,7 @@
fog(false),
shroud(false),
observers(false),
+ shuffle_sides(false),
use_map_settings(false),
verified(false),
password_required(false),
@@ -81,6 +82,7 @@
bool fog;
bool shroud;
bool observers;
+ bool shuffle_sides;
bool use_map_settings;
bool verified;
bool password_required;
@@ -116,6 +118,7 @@
image::locator time_limit_icon_locator_;
image::locator observer_icon_locator_;
image::locator no_observer_icon_locator_;
+ image::locator shuffle_sides_icon_locator_;
const config &map_hashes_;
Modified: trunk/src/server/game.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/game.cpp?rev=49494&r1=49493&r2=49494&view=diff
==============================================================================
--- trunk/src/server/game.cpp (original)
+++ trunk/src/server/game.cpp Thu May 12 19:22:20 2011
@@ -171,6 +171,7 @@
<< "\tfog: " << s["mp_fog"]
<< "\tshroud: " << s["mp_shroud"]
<< "\tobservers: " << s["observer"]
+ << "\tshuffle: " << s["shuffle_sides"]
<< "\ttimer: " << s["mp_countdown"]
<< (s["mp_countdown"].to_bool() ?
"\treservoir time: " +
s["mp_countdown_reservoir_time"].to_string() +
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits