widelands-dev team mailing list archive
-
widelands-dev team
-
Mailing list archive
-
Message #07592
[Merge] lp:~widelands-dev/widelands/bug-1418154-collectors-teams into lp:widelands
GunChleoc has proposed merging lp:~widelands-dev/widelands/bug-1418154-collectors-teams into lp:widelands.
Commit message:
Collectors now reports team scores as well as player scores.
Requested reviews:
Widelands Developers (widelands-dev)
Related bugs:
Bug #1418154 in widelands: "Collectors in teams: points are shown for each single player"
https://bugs.launchpad.net/widelands/+bug/1418154
For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/bug-1418154-collectors-teams/+merge/294702
--
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/bug-1418154-collectors-teams into lp:widelands.
=== modified file 'data/scripting/win_conditions/collectors.lua'
--- data/scripting/win_conditions/collectors.lua 2016-03-15 08:42:41 +0000
+++ data/scripting/win_conditions/collectors.lua 2016-05-14 10:42:25 +0000
@@ -31,13 +31,17 @@
-- set the objective with the game type for all players
broadcast_objective("win_condition", wc_descname, wc_desc)
- -- Simple flowing text. One Paragraph
- local function p(s)
- return "<p line-spacing=3 font-size=12>" .. s .. "<br></p>" ..
- "<p font-size=8> <br></p>"
+ local plrs = wl.Game().players
+ local teams = {}
+ for idx,plr in ipairs(plrs) do
+ if (plr.team ~= 0) then
+ if (teams[plr.team] == nil) then
+ teams[plr.team] = {}
+ end
+ table.insert(teams[plr.team], plr)
+ end
end
-
-- The list of wares that give points
local point_table = {
barbarians = {
@@ -93,36 +97,42 @@
},
}
- -- Calculate the momentary points for one player
- local function _calc_points(plr)
+ -- Calculate the momentary points for a list of players
+ local function _calc_points(players)
set_textdomain("win_conditions")
- local bs = array_combine(
- plr:get_buildings(plr.tribe_name .. "_headquarters"), plr:get_buildings(plr.tribe_name .. "_warehouse"), plr:get_buildings(plr.tribe_name .. "_port")
- )
-
- local points = 0
- local descr = { "</p>" .. h2((_"Status for %s"):format(plr.name)) .. "<p line-spacing=3 font-size=12>"}
- for idx, ware in ipairs(point_table[plr.tribe_name .. "_order"]) do
- local value = point_table[plr.tribe_name][ware]
- local count = 0
- for idx,b in ipairs(bs) do
- count = count + b:get_wares(ware)
- end
- local lpoints = count * value
- points = points + lpoints
-
- local warename = wl.Game():get_ware_description(ware).descname
- -- TRANSLATORS: For example: 'gold (3 P) x 4 = 12 P', P meaning 'Points'
- descr[#descr+1] = listitem_bullet(_"%1$s (%2$i P) x %3$i = %4$i P"):bformat(
- warename, value, count, lpoints
+ local team_points = 0
+ local descr = ""
+
+ for idx, plr in ipairs(players) do
+ local bs = array_combine(
+ plr:get_buildings(plr.tribe_name .. "_headquarters"), plr:get_buildings(plr.tribe_name .. "_warehouse"), plr:get_buildings(plr.tribe_name .. "_port")
)
+
+ descr = descr .. h2((_"Status for %s"):format(plr.name))
+ local points = 0
+ for idx, ware in ipairs(point_table[plr.tribe_name .. "_order"]) do
+ local value = point_table[plr.tribe_name][ware]
+ local count = 0
+ for idx,b in ipairs(bs) do
+ count = count + b:get_wares(ware)
+ end
+ local lpoints = count * value
+ points = points + lpoints
+
+ local warename = wl.Game():get_ware_description(ware).descname
+ -- TRANSLATORS: For example: 'gold (3 P) x 4 = 12 P', P meaning 'Points'
+ descr = descr .. listitem_bullet(_"%1$s (%2$i P) x %3$i = %4$i P"):bformat(
+ warename, value, count, lpoints
+ )
+ end
+ descr = descr .. "</p>" .. h3(ngettext("Total: %i point", "Total: %i points", points)):format(points)
+ team_points = team_points + points
end
- descr[#descr+1] = "</p>" .. h3(ngettext("Total: %i point", "Total: %i points", points)):format(points)
- .. "<p line-spacing=3 font-size=12>"
- return points, p(table.concat(descr, "\n"))
+
+ return team_points, descr
end
- local plrs = wl.Game().players
+
-- Send all players the momentary game state
local function _send_state(remaining_time, plrs)
set_textdomain("win_conditions")
@@ -144,12 +154,21 @@
end
-- TRANSLATORS: Context: 'The game will end in 2 hours and 30 minutes.'
local msg = p(_"The game will end in %s."):format(time)
- msg = msg .. "\n\n"
+ -- Points for players without team
for idx, plr in ipairs(plrs) do
- local points, pstat = _calc_points(plr)
-
- msg = msg .. pstat
+ if (plr.team == 0) then
+ local points, pstat = _calc_points({plr})
+ msg = msg .. "<p font-size=8> <br></p>" .. pstat
+ end
+ end
+ -- Team points
+ for idx, team in ipairs(teams) do
+ local points, pstat = _calc_points(team)
+ local message = h1((_"Status for Team %d"):format(idx))
+ .. pstat
+ .. h2(ngettext("Team Total: %i point", "Team Total: %i points", points)):format(points)
+ msg = msg .. "<p font-size=8> <br></p>" .. message
end
for idx, plr in ipairs(plrs) do
@@ -160,15 +179,29 @@
local function _game_over(plrs)
local points = {}
for idx,plr in ipairs(plrs) do
- points[#points + 1] = { plr, _calc_points(plr) }
+ if (plr.team == 0) then
+ points[#points + 1] = { plr, _calc_points({plr}) }
+ else
+ points[#points + 1] = { plr, _calc_points(teams[plr.team]) }
+ end
end
table.sort(points, function(a,b) return a[2] < b[2] end)
for i=1,#points-1 do
- points[i][1]:send_message(lost_game_over.title, lost_game_over.body)
- wl.game.report_result(points[i][1], 0, make_extra_data(points[i][1], wc_descname, wc_version, {score=points[i][2]}))
- end
- points[#points][1]:send_message(won_game_over.title, won_game_over.body)
- wl.game.report_result(points[#points][1], 1, make_extra_data(points[#points][1], wc_descname, wc_version, {score=points[#points][2]}))
+ local player = points[i][1]
+ player:send_message(lost_game_over.title, lost_game_over.body)
+ if (player.team == 0) then
+ wl.game.report_result(player, 0, make_extra_data(player, wc_descname, wc_version, {score=points[i][2]}))
+ else
+ wl.game.report_result(player, 0, make_extra_data(player, wc_descname, wc_version, {score=_calc_points({player}), team_score=points[i][2]}))
+ end
+ end
+ local player = points[#points][1]
+ player:send_message(won_game_over.title, won_game_over.body)
+ if (player.team == 0) then
+ wl.game.report_result(player, 1, make_extra_data(player, wc_descname, wc_version, {score=points[#points][2]}))
+ else
+ wl.game.report_result(player, 1, make_extra_data(player, wc_descname, wc_version, {score=_calc_points({player}), team_score=points[#points][2]}))
+ end
end
-- Instantiate the hook to calculate points
=== modified file 'src/wui/game_summary.cc'
--- src/wui/game_summary.cc 2016-02-18 18:27:52 +0000
+++ src/wui/game_summary.cc 2016-05-14 10:42:25 +0000
@@ -70,7 +70,7 @@
hbox1->add_space(PADDING);
UI::Box * info_box = new UI::Box(hbox1, 0, 0, UI::Box::Vertical, 0, 0);
- info_area_label_ = new UI::Textarea(info_box, _("Player info:"));
+ info_area_label_ = new UI::Textarea(info_box, _("Player Info:"));
info_box->add(info_area_label_, UI::Align::kLeft);
info_area_ = new UI::MultilineTextarea(
info_box, 0, 0, 130,
@@ -275,6 +275,9 @@
if (key == "score") {
info_str +=
(boost::format("%1% : %2%\n") % _("Score") % pair.at(1)).str();
+ } else if (key == "team_score") {
+ info_str +=
+ (boost::format("%1% : %2%\n") % _("Team Score") % pair.at(1)).str();
} else if (key == "resign_reason") {
info_str +=
(boost::format("%1%\n") % pair.at(1)).str();
Follow ups