← Back to team overview

widelands-dev team mailing list archive

[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