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

Reply via email to