Skip to content

Commit

Permalink
MP Lobby: moved turn/slot data formatting from server to client
Browse files Browse the repository at this point in the history
  • Loading branch information
Vultraz committed Feb 20, 2018
1 parent f45cd3e commit 88e5c49
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 49 deletions.
34 changes: 24 additions & 10 deletions src/game_initialization/lobby_data.cpp
Expand Up @@ -204,7 +204,7 @@ game_info::game_info(const config& game, const config& game_config, const std::v
, vision()
, status()
, time_limit()
, vacant_slots(lexical_cast_default<int>(game["slots"], 0)) // Can't use to_int() here.
, vacant_slots()
, current_turn(0)
, reloaded(game["savegame"].to_bool())
, started(false)
Expand Down Expand Up @@ -411,19 +411,33 @@ game_info::game_info(const config& game, const config& game_config, const std::v
verified = false;
}

std::string turn = game["turn"];
// These should always be present in the data the server sends, but may or may not be empty.
// I'm just using child_or_empty here to preempt any cases where they might not be included.
const config& s = game.child_or_empty("slot_data");
const config& t = game.child_or_empty("turn_data");

if(!turn.empty()) {
started = true;
if(!s.empty()) {
started = false;

const std::string current_turn_string = turn.substr(0, turn.find_first_of('/'));
current_turn = lexical_cast<unsigned int>(current_turn_string);
vacant_slots = s["vacant"].to_unsigned();

status = _("Turn") + " " + turn;
} else {
started = false;
if(vacant_slots > 0) {
status = _n("Vacant Slot:", "Vacant Slots:", vacant_slots) + " " + game["slots"];
status = formatter() << _n("Vacant Slot:", "Vacant Slots:", vacant_slots) << " " << vacant_slots << "/" << s["max"];
} else {
// TODO: status message for no vacant sides!
}
}

if(!t.empty()) {
started = true;

current_turn = t["current"].to_unsigned();
const int max_turns = t["max"].to_int();

if(max_turns > -1) {
status = formatter() << _("Turn") << " " << t["current"] << "/" << max_turns;
} else {
status = formatter() << _("Turn") << " " << t["current"];
}
}

Expand Down
34 changes: 24 additions & 10 deletions src/gui/widgets/window.cpp
Expand Up @@ -886,23 +886,38 @@ void window::layout()

log_scope2(log_gui_layout, LOG_SCOPE_HEADER);

point size = get_best_size();
const point mouse = get_mouse_position();

variables_.add("mouse_x", wfl::variant(mouse.x));
variables_.add("mouse_y", wfl::variant(mouse.y));
variables_.add("window_width", wfl::variant(0));
variables_.add("window_height", wfl::variant(0));
variables_.add("best_window_width", wfl::variant(size.x));
variables_.add("best_window_height", wfl::variant(size.y));
variables_.add("size_request_mode", wfl::variant("maximum"));

get_screen_size_variables(variables_);

const int maximum_width = automatic_placement_ ? maximum_width_
? std::min(maximum_width_, settings::screen_width)
: settings::screen_width
: w_(variables_, &functions_);
int maximum_width = 0;
int maximum_height = 0;

const int maximum_height = automatic_placement_ ? maximum_height_
? std::min(maximum_height_, settings::screen_height)
: settings::screen_height
: h_(variables_, &functions_);
if(automatic_placement_) {
if(maximum_width_ > 0) {
maximum_width = std::min(maximum_width_, settings::screen_width);
} else {
maximum_width = settings::screen_width;
}

if(maximum_height_ > 0) {
maximum_height = std::min(maximum_height_, settings::screen_height);
} else {
maximum_height = settings::screen_height;
}
} else {
maximum_width = w_(variables_, &functions_);
maximum_height = h_(variables_, &functions_);
}

/***** Handle click dismiss status. *****/
button* click_dismiss_button = nullptr;
Expand Down Expand Up @@ -987,8 +1002,7 @@ void window::layout()
}

/***** Get the best location for the window *****/
point size = get_best_size();

size = get_best_size();
assert(size.x <= maximum_width && size.y <= maximum_height);

point origin(0, 0);
Expand Down
53 changes: 24 additions & 29 deletions src/server/game.cpp
Expand Up @@ -193,23 +193,6 @@ bool game::is_player(const socket_ptr& player) const
return std::find(players_.begin(), players_.end(), player) != players_.end();
}

namespace
{
std::string describe_turns(int turn, int num_turns)
{
std::ostringstream buf;
buf << turn;

// If the game has a turn limit.
if(num_turns > -1) {
buf << '/' << num_turns;
}

return buf.str();
}

} // anon namespace

std::string game::username(const socket_ptr& player) const
{
const auto iter = player_connections_.find(player);
Expand Down Expand Up @@ -386,7 +369,6 @@ void game::start_game(const socket_ptr& starter)
void game::update_game()
{
started_ = false;
description_->set_attr("turn", "");

update_side_data();
describe_slots();
Expand Down Expand Up @@ -706,16 +688,15 @@ bool game::describe_slots()
++i;
}

std::ostringstream buf;
buf << available_slots << '/' << num_sides;
std::string descr = buf.str();

if((*description_)["slots"] != descr) {
description_->set_attr_dup("slots", descr.c_str());
return true;
} else {
return false;
simple_wml::node* slots_cfg = description_->child("slot_data");
if(!slots_cfg) {
slots_cfg = &description_->add_child("slot_data");
}

slots_cfg->set_attr_int("vacant", available_slots);
slots_cfg->set_attr_int("max", num_sides);

return true;
}

bool game::player_is_banned(const socket_ptr& sock) const
Expand Down Expand Up @@ -1320,7 +1301,14 @@ void game::process_change_turns_wml(simple_wml::document& data, const socket_ptr
num_turns_ = num_turns;

assert(static_cast<int>(this->current_turn()) == current_turn);
description_->set_attr_dup("turn", describe_turns(current_turn, num_turns_).c_str());

simple_wml::node* turns_cfg = description_->child("turn_data");
if(!turns_cfg) {
turns_cfg = &description_->add_child("turn_data");
}

ctw_node.copy_into(*turns_cfg);

// Don't send or store this change, all players should have gotten it by wml.
}

Expand Down Expand Up @@ -1351,7 +1339,14 @@ bool game::end_turn()
return false;
}

description_->set_attr_dup("turn", describe_turns(current_turn(), num_turns_).c_str());
simple_wml::node* turns_cfg = description_->child("turn_data");
if(!turns_cfg) {
turns_cfg = &description_->add_child("turn_data");
}

turns_cfg->set_attr_int("current", current_turn());
turns_cfg->set_attr_int("max", num_turns_);

return true;
}

Expand Down

0 comments on commit 88e5c49

Please sign in to comment.