← Back to team overview

widelands-dev team mailing list archive

[Merge] lp:~widelands-dev/widelands/territorial_unify_notifications into lp:widelands

 

Toni Förster has proposed merging lp:~widelands-dev/widelands/territorial_unify_notifications into lp:widelands with lp:~widelands-dev/widelands/collectors_notification as a prerequisite.

Commit message:
- Notifications for Territorial are unified.
- Notifications are properly formatted (hour and minute)
- remaining time notifications and winning/losing status
  notifications are not mixed up any more
- new string added to territorial_lord
- string removed from territorial_time

Requested reviews:
  Widelands Developers (widelands-dev)

For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/territorial_unify_notifications/+merge/362502

Further details are here: https://wl.widelands.org/forum/post/26905/
-- 
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/territorial_unify_notifications into lp:widelands.
=== modified file 'data/scripting/win_conditions/collectors.lua'
--- data/scripting/win_conditions/collectors.lua	2019-01-30 23:12:08 +0000
+++ data/scripting/win_conditions/collectors.lua	2019-01-30 23:12:09 +0000
@@ -170,7 +170,7 @@
             .. h2(ngettext("Team Total: %i point", "Team Total: %i points", points)):format(points)
          msg = msg .. vspace(8) .. message
       end
-      
+
       broadcast(plrs, game_status.title, msg, {popup = show_popup})
    end
 

=== modified file 'data/scripting/win_conditions/territorial_functions.lua'
--- data/scripting/win_conditions/territorial_functions.lua	2018-12-03 20:30:01 +0000
+++ data/scripting/win_conditions/territorial_functions.lua	2019-01-30 23:12:09 +0000
@@ -103,7 +103,7 @@
    -- We record the last winning player name here to prevent crashes with retrieving
    -- the player name when the player was just defeated a few ms ago
    last_winning_player_name = "",
-   remaining_time = 10,
+   remaining_time = 1201,
    all_player_points = {},
    points = {}
 }
@@ -167,10 +167,15 @@
    -- Set the remaining time according to whether the winner is still the same
    if territory_was_kept then
       -- Still the same winner
-      territory_points.remaining_time = territory_points.remaining_time - 30
+      territory_points.remaining_time = territory_points.remaining_time - 1
    elseif winning_points == -1 then
       -- No winner. This value is used to calculate whether to send a report to players.
-      territory_points.remaining_time = 10
+      if territory_points.remaining_time == 1800 then
+         territory_points.remaining_time = 1201
+      elseif territory_points.remaining_time ~= 1201 then
+         territory_points.remaining_time = 1800
+      end
+      
    else
       -- Winner changed
       territory_points.remaining_time = 20 * 60 -- 20 minutes

=== modified file 'data/scripting/win_conditions/territorial_lord.lua'
--- data/scripting/win_conditions/territorial_lord.lua	2018-12-03 20:30:01 +0000
+++ data/scripting/win_conditions/territorial_lord.lua	2019-01-30 23:12:09 +0000
@@ -39,25 +39,30 @@
       -- Get all valueable fields of the map
       local fields = get_buildable_fields()
 
-      local function _send_state()
+      local function _send_state(show_popup)
          set_textdomain("win_conditions")
 
          for idx, player in ipairs(plrs) do
             local msg = ""
-            if territory_points.last_winning_team == player.team or territory_points.last_winning_player == player.number then
-               msg = msg .. winning_status_header() .. vspace(8)
+            if (territory_points.last_winning_team >= 0 or territory_points.last_winning_player >= 0) then
+               if territory_points.last_winning_team == player.team or territory_points.last_winning_player == player.number then
+                  msg = msg .. winning_status_header()
+               else
+                  msg = msg .. losing_status_header(plrs)
+               end
             else
-               msg = msg .. losing_status_header(plrs) .. vspace(8)
-            end
-            msg = msg .. vspace(8) .. game_status.body .. territory_status(fields, "has")
-         send_message(player, game_status.title, msg, {popup = true})
+               msg = p(_"Currently no faction owns more than half of the map’s area.")
+            end
+               msg = msg .. vspace(8) .. game_status.body .. territory_status(fields, "has")
+               player:send_message(game_status.title, msg, {popup = show_popup})
+            end
          end
       end
 
       -- here is the main loop!!!
-      while true do
-         -- Sleep 30 seconds == STATISTICS_SAMPLE_TIME
-         sleep(30000)
+      while count_factions(plrs) > 1 or territory_points.remaining_time > 0 do
+         -- Sleep 1 second
+         sleep(1000)
 
          -- A player might have been defeated since the last calculation
          check_player_defeated(plrs, lost_game.title, lost_game.body)
@@ -65,16 +70,15 @@
          -- Check if a player or team is a candidate and update variables
          calculate_territory_points(fields, wl.Game().players)
 
-         -- Do this stuff, if the game is over
-         if territory_points.remaining_time == 0 or count_factions(plrs) <= 1 then
-            territory_game_over(fields, wl.Game().players, wc_descname, wc_version)
-            break
-         end
-
          -- If there is a candidate, check whether we have to send an update
-         if (territory_points.last_winning_team >= 0 or territory_points.last_winning_player >= 0) and territory_points.remaining_time >= 0 and territory_points.remaining_time % 300 == 0 then
-            _send_state()
+         if (territory_points.remaining_time % 300 == 0 and territory_points.remaining_time ~= 0) then
+            local show_popup = false
+            if territory_points.remaining_time % 600 == 0 then show_popup = true end
+            _send_state(show_popup)
          end
       end
+
+      -- Game has ended
+      territory_game_over(fields, wl.Game().players, wc_descname, wc_version)
    end
 }

=== modified file 'data/scripting/win_conditions/territorial_time.lua'
--- data/scripting/win_conditions/territorial_time.lua	2018-12-03 20:30:01 +0000
+++ data/scripting/win_conditions/territorial_time.lua	2019-01-30 23:12:09 +0000
@@ -27,11 +27,11 @@
    "after 4 hours, whichever comes first."
 )
 
-
 return {
    name = wc_name,
    description = wc_desc,
    func = function()
+      local game = wl.Game()
       local plrs = wl.Game().players
 
       -- set the objective with the game type for all players
@@ -41,59 +41,65 @@
       local fields = get_buildable_fields()
 
       -- variables to track the maximum 4 hours of gametime
-      local remaining_max_time = 4 * 60 * 60 -- 4 hours
+      local max_time = 4 * 60
 
-      local function _send_state()
+      local function _send_state(remaining_time, plrs, show_popup)
          set_textdomain("win_conditions")
 
-         local remaining_max_minutes = remaining_max_time // 60
+         local remaining_time_minutes = remaining_time // 60
          for idx, player in ipairs(plrs) do
             local msg = ""
-            if territory_points.remaining_time < remaining_max_time and
+            if territory_points.remaining_time < remaining_time and
                (territory_points.last_winning_team >= 0 or territory_points.last_winning_player >= 0) then
                if territory_points.last_winning_team == player.team or territory_points.last_winning_player == player.number then
-                  msg = msg .. winning_status_header() .. vspace(8)
+                  msg = msg .. winning_status_header()
                else
-                  msg = msg .. losing_status_header(plrs) .. vspace(8)
+                  msg = msg .. losing_status_header(plrs)
                end
-               -- TRANSLATORS: Refers to "You own more than half of the map’s area. Keep it for x more minute(s) to win the game."
-               msg = msg .. p((ngettext("Otherwise the game will end in %i minute.",
-                            "Otherwise the game will end in %i minutes.",
-                            remaining_max_minutes))
-                  :format(remaining_max_minutes))
+            elseif remaining_time <= 1200 then
+               territory_points.remaining_time = remaining_time
+               msg = msg .. format_remaining_time(remaining_time_minutes)
             else
-               msg = msg .. p((ngettext("The game will end in %i minute.",
-                            "The game will end in %i minutes.",
-                            remaining_max_minutes))
-                  :format(remaining_max_minutes))
+               msg = msg .. format_remaining_time(remaining_time_minutes)
             end
             msg = msg .. vspace(8) .. game_status.body .. territory_status(fields, "has")
-            send_message(player, game_status.title, msg, {popup = true})
+            player:send_message(game_status.title, msg, {popup = show_popup})
          end
       end
 
+      -- Start a new coroutine that triggers status notifications.
+      run(function()
+         local remaining_time = max_time
+         local msg = ""
+         while game.time <= ((max_time - 5) * 60 * 1000) and count_factions(plrs) > 1 and territory_points.remaining_time > 0 do
+            remaining_time, show_popup = notification_remaining_time(max_time, remaining_time)
+            if territory_points.remaining_time == 1201 then
+               msg = msg .. format_remaining_time(remaining_time) .. vspace(8) .. game_status.body .. territory_status(fields, "has")
+               broadcast(plrs, game_status.title, msg, {popup = show_popup})
+            end
+         end
+      end)
+         
       -- here is the main loop!!!
-      while true do
-         -- Sleep 30 seconds == STATISTICS_SAMPLE_TIME
-         sleep(30000)
+      while game.time < (max_time * 60 * 1000) and count_factions(plrs) > 1 and territory_points.remaining_time > 0 do
+         -- Sleep 1 seconds
+         sleep(1000)
 
-         remaining_max_time = remaining_max_time - 30
          -- A player might have been defeated since the last calculation
          check_player_defeated(plrs, lost_game.title, lost_game.body)
+
          -- Check if a player or team is a candidate and update variables
          -- Returns the names and points for the teams and players without a team
-         calculate_territory_points(fields, wl.Game().players)
-
-         -- Game is over, do stuff after loop
-         if territory_points.remaining_time <= 0 or remaining_max_time <= 0 or count_factions(plrs) <= 1 then break end
-
-         -- at the beginning send remaining max time message only each 30 minutes
-         -- if only 30 minutes or less are left, send each 5 minutes
-         -- also check if there is a candidate and we need to send an update
-         if ((remaining_max_time < (30 * 60) and remaining_max_time % (5 * 60) == 0)
-               or remaining_max_time % (30 * 60) == 0)
-               or territory_points.remaining_time % 300 == 0 then
-            _send_state()
+         calculate_territory_points(fields, plrs)
+
+         -- check if there is a candidate and we need to send an update 
+         if (territory_points.remaining_time % 300 == 0 and territory_points.remaining_time ~= 0) then
+            local remaining_time = (max_time * 60 * 1000 - game.time) // 1000
+            local show_popup = false
+            
+            if territory_points.remaining_time % 600 == 0 then show_popup = true end
+            _send_state(remaining_time, plrs, show_popup)
+
          end
       end
 

=== modified file 'data/scripting/win_conditions/win_condition_functions.lua'
--- data/scripting/win_conditions/win_condition_functions.lua	2019-01-30 23:12:08 +0000
+++ data/scripting/win_conditions/win_condition_functions.lua	2019-01-30 23:12:09 +0000
@@ -108,7 +108,7 @@
 function broadcast(plrs, header, msg, goptions)
    local options = goptions or {}
    for idx, p in ipairs(plrs) do
-      send_message(p, header, msg, options)
+      p:send_message(header, msg, options)
    end
 end
 


References