From 0521c59b88c63de615d70e32da6099eea698fee2 Mon Sep 17 00:00:00 2001 From: uid68803 Date: Thu, 8 Jan 2004 18:22:40 +0000 Subject: [PATCH] some fixes to multiplayer setup screens --- src/multiplayer_client.cpp | 1 + src/multiplayer_connect.cpp | 85 +++++++++++++++++-------------------- src/multiplayer_connect.hpp | 3 +- src/playturn.cpp | 8 ++-- src/sdl_utils.cpp | 8 ++++ src/sdl_utils.hpp | 1 + src/server/server.cpp | 3 +- src/widgets/button.cpp | 31 +++++++++++++- src/widgets/button.hpp | 5 +++ src/widgets/combo.cpp | 4 ++ src/widgets/combo.hpp | 3 ++ 11 files changed, 99 insertions(+), 53 deletions(-) diff --git a/src/multiplayer_client.cpp b/src/multiplayer_client.cpp index 4c5a61a7a73..c5123597480 100644 --- a/src/multiplayer_client.cpp +++ b/src/multiplayer_client.cpp @@ -126,6 +126,7 @@ public: got_side = false; throw network::error("Side chosen is unavailable"); } else if(reply["side_secured"].empty() == false) { + std::cerr << "received side secured message\n"; got_side = true; } else if(reply.child("start_game")) { std::cerr << "received start_game message\n"; diff --git a/src/multiplayer_connect.cpp b/src/multiplayer_connect.cpp index f167e2fa507..afd1b7dedcc 100644 --- a/src/multiplayer_connect.cpp +++ b/src/multiplayer_connect.cpp @@ -266,7 +266,7 @@ void mp_connect::lists_init() player_colors_.push_back(string_table["purple"]); } -void mp_connect::add_player(std::string name) +void mp_connect::add_player(const std::string& name) { player_types_.push_back(name); @@ -275,6 +275,13 @@ void mp_connect::add_player(std::string name) } } +void mp_connect::remove_player(const std::string& name) +{ + const std::vector::iterator itor = std::find(player_types_.begin(),player_types_.end(),name); + if(itor != player_types_.end()) + player_types_.erase(itor); +} + void mp_connect::gui_init() { @@ -458,7 +465,8 @@ int mp_connect::gui_do() //Player type //Don't let user change this if a player is sitting - if(combos_type_[n].selected() < 4) { + combos_type_[n].enable(combos_type_[n].selected() < 4); + int old_select = combos_type_[n].selected(); if(combos_type_[n].process(mousex, mousey, left_button)) { if(combos_type_[n].selected() == 0) { @@ -491,42 +499,30 @@ int mp_connect::gui_do() } network::send_data(*level_); } - } //Player race - if(!save_) { - if(combos_race_[n].process(mousex, mousey, left_button)) { - const string_map& values = - possible_sides[combos_race_[n].selected()]->values; - for(string_map::const_iterator i = values.begin(); i != values.end(); ++i) { - side[i->first] = i->second; - } - network::send_data(*level_); + combos_race_[n].enable(!save_); + combos_team_[n].enable(!save_); + combos_color_[n].enable(!save_); + + if(combos_race_[n].process(mousex, mousey, left_button)) { + const string_map& values = possible_sides[combos_race_[n].selected()]->values; + for(string_map::const_iterator i = values.begin(); i != values.end(); ++i) { + side[i->first] = i->second; } - } else { - combos_race_[n].draw(); + network::send_data(*level_); } //Player team - if(!save_) { - if(combos_team_[n].process(mousex, mousey, left_button)) { - std::stringstream str; - str << (combos_team_[n].selected()+1); - side["team_name"] = str.str(); - network::send_data(*level_); - } - } else { - combos_team_[n].draw(); + if(combos_team_[n].process(mousex, mousey, left_button)) { + std::stringstream str; + str << (combos_team_[n].selected()+1); + side["team_name"] = str.str(); + network::send_data(*level_); } - //Player color - if(!save_) { - if(combos_color_[n].process(mousex, mousey, left_button)) { - - network::send_data(*level_); - } - } else { - combos_color_[n].draw(); + if(combos_color_[n].process(mousex, mousey, left_button)) { + network::send_data(*level_); } if(!save_){ @@ -561,7 +557,8 @@ int mp_connect::gui_do() return status_; } - if(full_ == true) { + launch_.enable(full_); + if(launch_.process(mousex,mousey,left_button)) { //Tell everyone to start config cfg; @@ -592,9 +589,6 @@ int mp_connect::gui_do() status_ = 0; return status_; } - } else { - launch_.draw(); - } gui_update(); update_positions(); @@ -615,8 +609,7 @@ void mp_connect::update_positions() const config::child_list& possible_sides = cfg_->get_children("multiplayer_side"); config::child_iterator sd; for(sd = sides.first; sd != sides.second; ++sd) { - if((**sd)["controller"] == "network" && - (**sd)["description"] == "") { + if((**sd)["taken"] != "yes") { positions_[*sd] = 0; } } @@ -666,11 +659,8 @@ void mp_connect::update_network() i->second = 0; i->first->values.erase("taken"); - // Add to combo list - std::stringstream str; - str << i->first->values["description"]; - //remove_player(str.str()); - i->first->values["description"]=""; + remove_player(i->first->values["description"]); + i->first->values["description"] = ""; } } @@ -701,17 +691,22 @@ void mp_connect::update_network() if(side_taken >= 0 && side_taken < int(sides.size())) { std::map::iterator pos = positions_.find(sides[side_taken]); if(pos != positions_.end()) { - if(!pos->second) { + if(!pos->second || pos->second == sock) { std::cerr << "client has taken a valid position\n"; + //does the client already own the side, and is just updating + //it, or is it taking a vacant slot? + const bool update_only = pos->second == sock; + //broadcast to everyone the new game status + pos->first->values["controller"] = "network"; pos->first->values["taken"] = "yes"; pos->first->values["description"] = cfg["description"]; pos->first->values["name"] = cfg["name"]; pos->first->values["type"] = cfg["type"]; pos->first->values["recruit"] = cfg["recruit"]; pos->first->values["music"] = cfg["music"]; - positions_[sides[side_taken]] = sock; + pos->second = sock; network::send_data(*level_); std::cerr << "sent player data\n"; @@ -726,9 +721,7 @@ void mp_connect::update_network() network::send_data(reply,sock); // Add to combo list - std::stringstream str; - str << cfg["description"]; - add_player(str.str()); + add_player(cfg["description"]); } else { config response; response.values["failed"] = "yes"; diff --git a/src/multiplayer_connect.hpp b/src/multiplayer_connect.hpp index d5d3679104f..372118339b7 100644 --- a/src/multiplayer_connect.hpp +++ b/src/multiplayer_connect.hpp @@ -42,7 +42,8 @@ private: void lists_init(); void gui_init(); void gui_update(); - void add_player(std::string name); + void add_player(const std::string& name); + void remove_player(const std::string& name); void update_positions(); void update_network(); void is_full(); diff --git a/src/playturn.cpp b/src/playturn.cpp index b4bc641c24b..04c046c83b4 100644 --- a/src/playturn.cpp +++ b/src/playturn.cpp @@ -1087,13 +1087,15 @@ void turn_info::status_table() items.push_back(heading.str()); + const team& viewing_team = teams_[gui_.viewing_team()]; + //if the player is under shroud or fog, they don't get to see - //details about the other sides, only their own side, and a ??? is + //details about the other sides, only their own side, allied sides and a ??? is //shown to demonstrate lack of information about the other sides - const bool fog = teams_[gui_.viewing_team()].uses_fog() || teams_[gui_.viewing_team()].uses_shroud(); + const bool fog = viewing_team.uses_fog() || viewing_team.uses_shroud(); for(size_t n = 0; n != teams_.size(); ++n) { - if(fog && gui_.viewing_team() != n) + if(fog && viewing_team.is_enemy(n+1)) continue; const team_data data = calculate_team_data(teams_[n],n+1,units_); diff --git a/src/sdl_utils.cpp b/src/sdl_utils.cpp index 8b36790f1ce..c034bcd44ba 100644 --- a/src/sdl_utils.cpp +++ b/src/sdl_utils.cpp @@ -27,6 +27,14 @@ int sdl_add_ref(SDL_Surface* surface) return 0; } +SDL_Surface* clone_surface(SDL_Surface* surface) +{ + if(surface == NULL) + return NULL; + + return scale_surface(surface,surface->w,surface->h); +} + SDL_Surface* scale_surface(SDL_Surface* surface, int w, int h) { if(surface == NULL) diff --git a/src/sdl_utils.hpp b/src/sdl_utils.hpp index 9c0cb334c45..d621cf477c9 100644 --- a/src/sdl_utils.hpp +++ b/src/sdl_utils.hpp @@ -41,6 +41,7 @@ int sdl_add_ref(SDL_Surface* surface); typedef util::scoped_resource scoped_sdl_surface; +SDL_Surface* clone_surface(SDL_Surface* surface); SDL_Surface* scale_surface(SDL_Surface* surface, int w, int h); void adjust_surface_colour(SDL_Surface* surface, int r, int g, int b); diff --git a/src/server/server.cpp b/src/server/server.cpp index 9cefd3f82de..3624d5123f1 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -210,8 +210,7 @@ void server::run() continue; } - const string_map::const_iterator side = - data.values.find("side"); + const string_map::const_iterator side = data.values.find("side"); if(side != data.values.end()) { const bool res = g->take_side(sock,data); config response; diff --git a/src/widgets/button.cpp b/src/widgets/button.cpp index 501cc4a08a1..921a81b7e95 100644 --- a/src/widgets/button.cpp +++ b/src/widgets/button.cpp @@ -31,7 +31,7 @@ button::button(display& disp, const std::string& label, button::TYPE type, label_(label), display_(&disp), image_(NULL), pressedImage_(NULL), activeImage_(NULL), pressedActiveImage_(NULL), x_(0), y_(0), button_(true), - state_(UNINIT), type_(type) + state_(UNINIT), type_(type), enabled_(true) { set_label(label); @@ -113,6 +113,19 @@ void button::hide() restorer_.restore(); } +void button::enable(bool new_val) +{ + if(enabled_ != new_val) { + enabled_ = new_val; + draw(); + } +} + +bool button::enabled() const +{ + return enabled_; +} + void button::draw() { if(type_ == TYPE_CHECK) { @@ -147,6 +160,13 @@ void button::draw() textx = x_ + image_w + horizontal_padding/2; } + scoped_sdl_surface greyed_image(NULL); + if(!enabled_) { + greyed_image.assign(clone_surface(image)); + adjust_surface_colour(greyed_image,-50,-50,-50); + image = greyed_image; + } + display_->blit_surface(x_,y_,image); font::draw_text(display_,clipArea,font_size, font::BUTTON_COLOUR,label_,textx,texty); @@ -212,6 +232,15 @@ int button::height() const bool button::process(int mousex, int mousey, bool button) { + if(!enabled_) { + if(state_ == UNINIT) { + state_ = NORMAL; + draw(); + } + + return false; + } + enum MOUSE_STATE { UNCHANGED, UP, DOWN }; MOUSE_STATE mouse_state = UNCHANGED; if(button && !button_) diff --git a/src/widgets/button.hpp b/src/widgets/button.hpp index 24e5f15c55f..97eb201856e 100644 --- a/src/widgets/button.hpp +++ b/src/widgets/button.hpp @@ -53,6 +53,9 @@ public: void backup_background(); void hide(); + void enable(bool new_val); + bool enabled() const; + private: surface_restorer restorer_; std::string label_; @@ -68,6 +71,8 @@ private: TYPE type_; + bool enabled_; + bool hit(int x, int y) const; }; //end class button diff --git a/src/widgets/combo.cpp b/src/widgets/combo.cpp index 95d86284e94..a498e8cdde6 100644 --- a/src/widgets/combo.cpp +++ b/src/widgets/combo.cpp @@ -82,4 +82,8 @@ bool combo::process(int x, int y, bool button) return false; } +void combo::enable(bool new_val) { button_.enable(new_val); } + +bool combo::enabled() const { return button_.enabled(); } + } diff --git a/src/widgets/combo.hpp b/src/widgets/combo.hpp index 822f24032c5..5f31a7dec8b 100644 --- a/src/widgets/combo.hpp +++ b/src/widgets/combo.hpp @@ -38,6 +38,9 @@ public: bool process(int mousex, int mousey, bool button); + void enable(bool new_val); + bool enabled() const; + private: std::vector items_; int selected_;