]> hydra-www.ietfng.org Git - acmetensortoys-esp-lua_ctfws/commitdiff
Add territory and location parsing
authorNathaniel Wesley Filardo <nwfilardo@gmail.com>
Sat, 29 Jun 2019 13:11:53 +0000 (14:11 +0100)
committerNathaniel Wesley Filardo <nwfilardo@gmail.com>
Sat, 29 Jun 2019 15:46:21 +0000 (16:46 +0100)
And display the team whose jail this is as a capitalized letter in the
flag readout

README.rst
ctfws-lcd.lua
ctfws-lfs-strings.lua
ctfws.lua
init3.lua

index 361964e003d50e4f8dd369c30e974a957b23fe95..fdcdc10876ae75804df8a6eba294e94e8e55bca3 100644 (file)
@@ -147,7 +147,7 @@ Setup time display::
     0         1         
     01234567890123456789
     SETUP    :   MM:SS.s
-       NN⚑: R=0 Y=0
+       NN⚑: R=0 y=0
     messagemessagemessag
     START IN :   MM:SS.s
 
@@ -156,7 +156,7 @@ Steady state display::
     0         1         
     01234567890123456789
     GAME      :  MM:SS.s
-       NN⚑: R=NN Y=NN
+       NN⚑: R=NN y=NN
     messagemessagemessag
     JB#   n/N :  MM:SS.s
 
@@ -165,7 +165,7 @@ Last round display::
     0         1         
     01234567890123456789
     GAME      :  MM:SS.s
-       NN⚑: R=NN Y=NN
+       NN⚑: R=NN y=NN
     messagemessagemessag
     GAME END  :  MM:SS.s
 
@@ -174,7 +174,7 @@ Game over::
     0         1         
     01234567890123456789
      CMUKGB CTFWS TIMER
-       NN⚑: R=NN Y=NN
+       NN⚑: R=NN y=NN
     messagemessagemessag
      GAME OVER @ MM:SS
 
index ef1ce0af34c6ac78498c779bea754b5fff8f6eba..a53a78b0d0470fe1dbf9775e865415f1e20d0340 100644 (file)
@@ -50,7 +50,7 @@ local function scroller(t, lix, msg)
 end
 
 -- call back `cb` cycling through elements of table `ta` using
--- timer `tm` every linger `ms`.
+-- timer `tm` every `linger` ms.
 local function alternator(tm, linger, ta, cb)
   local lcd = self.lcd
   local n = #ta
@@ -85,6 +85,7 @@ end
 
 local function drawSteadyBotLine(self,rix,maxt,rem)
   local lcd = self.lcd
+  local ctfws = self.ctfws
   if self.dl_remain == nil then
     lcd:put(lcd:locate(3,0), "                    ")
     if rix == 0 then
@@ -151,15 +152,21 @@ local function drawTimes(self)
 end
 
 local function drawFlags(self)
+  local ctfws = self.ctfws
   if ctfws.flagsN then -- try not to blank a flagsmessage unless we have reason
     self.ftmr:unregister()
     self.fatmr:unregister()
     lcd:put(lcd:locate(1,0),"                    ")
   end
   if ctfws.startT then
-    local oneline = string.format("%d\000: R=%s Y=%s",
+    local rc, yc = "r", "y"
+    (({ ['r'] = function() rc = 'R' end,
+        ['y'] = function() yc = 'Y' end
+    })[ctfws:myTeam()] or function() end)()
+    local oneline = string.format("%d\000: %s=%s %s=%s",
                       ctfws.flagsN,
-                      tostring(ctfws.flagsR), tostring(ctfws.flagsY))
+                      rc, tostring(ctfws.flagsR),
+                      yc, tostring(ctfws.flagsY))
     if #oneline <= 20 then
       lcd:put(lcd:locate(1,(20-#oneline)/2),oneline)
     else
@@ -168,8 +175,8 @@ local function drawFlags(self)
       local maxl = math.max(#fr, #fy)
       if maxl + #tostring(ctfws.flagsN) + 5 <= 20 then
         alternator(self.fatmr, 2000,
-          { string.format("%d\000: R=%s%s", ctfws.flagsN, string.rep(" ", maxl-#fr), fr)
-          , string.format("%d\000: Y=%s%s", ctfws.flagsN, string.rep(" ", maxl-#fy), fy)
+          { string.format("%d\000: %s=%s%s", ctfws.flagsN, rc, string.rep(" ", maxl-#fr), fr)
+          , string.format("%d\000: %s=%s%s", ctfws.flagsN, yc, string.rep(" ", maxl-#fy), fy)
           },
           function(msg) lcd:put(lcd:locate(1,(20-#msg)/2),msg) end)
        else
index e72c33a50b2f57acd06901665e6354ca5f028a9b..de6aad2bb77161efa724657c3f538ea01b3b5170 100644 (file)
@@ -8,26 +8,29 @@ local modload = "cron", "cron.entry", "schedule", "unschedule",
 
 local ctfws = "ctfws", "ctfws_lcd", "ctfws_tmr",
   "setupD", "roundD", "rounds", "startT", "endT", "flagsN", "flagsR", "flagsY",
-  "times", "config", "deconfig", "setFlags", "setEndTime",
+    "ter", "tercfg",
+  "times", "config", "deconfig", "setFlags", "setEndTime", "myTeam", "setTerritory",
   "GAME NOT CONFIGURED!",
   "GAME OVER @ %02d:%02d", "GAME OVER",
   "START TIME IN FUTURE",
   "TIME IS UP",
-  "CTFWS"
+  "CTFWS",
+  "r", "y"
 
 local lcdpreload =
   "define_char",
   "lcd", "mtmr", "ftmr", "fatmr", "dl_elapsed", "dl_elapsed", "dl_remain", "dl_round",
   "attnState", "reset", "drawTimes", "drawFlags", "drawMessage", "drawFlagsMessage",
   "%02d:%02d.%d", "%02d.%d", "%d", "%-20s",
-  "%d\000: R=%s Y=%s", "%d\000: R=%s%s", "%d\000: Y=%s%s",
+  "%d\000: %s=%s %s=%s", "%d\000: %s=%s%s",
   " CMUKGB CTFWS TIMER ", "                    ",
   "GAME      :",
   "SETUP     :",
   "START IN  :",
   "GAME END  :",
   "JB#   %d/%d :",
-  "JB# %2d/%2d :"
+  "JB# %2d/%2d :",
+  "R", "Y"
 
 local init3load =
   "flg_tmr", "lastMsgTime", "mqttUser", "msg_tmr", "fla_tmr",
@@ -40,7 +43,7 @@ local init3load =
   "ctfws/game/message",
   "ctfws/game/message/jail",
   "none",
-  "^%s*(%d+)%s+(%d+)%s+(%d+)%s+(%d+)%s+(%d+).*$",
+  "^%s*(%d+)%s+(%d+)%s+(%d+)%s+(%d+)%s+(%d+)%s+(%d+)%s+(%S+).*$",
   "^%s*(%d+)%s+(-?%d+)%s+(-?%d+).*$",
   "^%s*(%d+)%s*(.*)$",
   "^%s*%?.*$",
index 34c7c96e1513f467f48078d5bee3e0c18f06c68a..1bc78ea7ccca88e25c396c250475cf7f95dc3773 100644 (file)
--- a/ctfws.lua
+++ b/ctfws.lua
@@ -5,6 +5,8 @@
 --   rounds* -- number of rounds of game play
 --   startT* -- POSIX seconds of game start
 --   endT    -- POSIX seconds of game end (if set)
+--   tercfg  -- The territory config string
+--   ter     -- My territory
 --
 --   flagsN* -- total flags
 --   flagsR* -- flags captured by the red team
 -- *'d fields are publicly read; startT ~= nil is used as a proxy for "is
 -- game configured"
 
+local v = {}
+
 -- returns round index, this round duration, elapsed time
 -- round index: 0 for setup, 1-N for game play, and nil for game over / no game
 -- all return times in deciseconds
-local function times(self, nowf)
+function v:times(nowf)
   if self.startT == nil then
     return nil, "GAME NOT CONFIGURED!"
   end
@@ -53,15 +57,16 @@ local function times(self, nowf)
   end
 end
 
-local function config(self, st, sd, nr, rd, nf)
+function v:config(st, sd, nr, rd, nf, tc)
   self.startT = st
   self.setupD = sd * 10
   self.rounds = nr
   self.roundD = rd * 10
   self.flagsN = nf
+  self.tercfg = tc
 end
 
-local function deconfig(self)
+function v:deconfig()
   self.startT = nil
   self.rounds = nil
   -- leave flagsN alone for end-of-game display logic
@@ -69,21 +74,25 @@ end
 
 -- return whether or not a change took place, for duplicate message
 -- suppression
-local function setFlags(self, fr, fy)
+function v:setFlags(fr, fy)
   if (self.flagsR == fr) and (self.flagsY == fy) then return false end
   self.flagsR = fr
   self.flagsY = fy
   return true
 end
 
-local function setEndTime(self,t)
+function v:setEndTime(t)
   self.endT = t
 end
 
-local self = {}
-self.times = times
-self.config = config
-self.deconfig = deconfig
-self.setFlags = setFlags
-self.setEndTime = setEndTime
-return self
+function v:setTerritory(t)
+  self.ter = t
+end
+
+function v:myTeam()
+  if self.ter    == nil then return nil end
+  if self.tercfg == nil then return nil end
+  return ({ 'r', 'y' })[self.tercfg:find(self.ter)]
+end
+
+return v
index 3c6805bd05c559dae3ec2b85ec8ec23810b39f99..d2f014914751b608f9f67bfd203c88e4fc89dcd4 100644 (file)
--- a/init3.lua
+++ b/init3.lua
@@ -25,6 +25,7 @@ mqc, mqttUser = OVL.nwfmqtt().mkclient("nwfmqtt.conf")
 if mqc == nil then
   print("CTFWS", "You forgot your MQTT configuration file")
 end
+local mqttLocnTopic  = string.format("ctfws/devc/%s/location",mqttUser)
 local mqttBootTopic  = string.format("ctfws/dev/%s/beat",mqttUser)
 mqc:lwt(mqttBootTopic,"dead",1,1)
 
@@ -84,12 +85,20 @@ nwfnet.onmqtt["init"] = function(c,t,m)
     if not m or m == "none"
      then ctfws:deconfig()
           ctfws_lcd_draw_all()
-     else local st, sd, nr, rd, nf = m:match("^%s*(%d+)%s+(%d+)%s+(%d+)%s+(%d+)%s+(%d+).*$")
+     else local st,     -- start time
+               sd,     -- setup duration
+               nr,     -- number of rounds
+               rd,     -- round duration
+               nf,     -- number of flags
+               gn,     -- game number
+               tc      -- territory configuration string
+                       --   st      sd      nr      rd      nf      gn      tc
+            = m:match("^%s*(%d+)%s+(%d+)%s+(%d+)%s+(%d+)%s+(%d+)%s+(%d+)%s+(%S+).*$")
           if st == nil
            then ctfws:deconfig()
            else -- the game's afoot!
                 ctfws:config(tonumber(st), tonumber(sd), tonumber(nr),
-                             tonumber(rd), tonumber(nf))
+                             tonumber(rd), tonumber(nf), tc)
                 ctfws_start_tmr()
           end
           ctfws_lcd_draw_all()
@@ -112,6 +121,9 @@ nwfnet.onmqtt["init"] = function(c,t,m)
    --   if m:match("^%s*(%d+)%s+%?.*$") then ... end
    -- but for now, let's just take any ill-formed message
    if ctfws:setFlags("?","?") then ctfws_lcd:drawFlags() end
+  elseif t == mqttLocnTopic then
+   ctfws:setTerritory(m)
+   ctfws_lcd:drawFlags()
   elseif t:match("^ctfws/game/message") then
     boot_message_hack = nil
     local mt, ms = m:match("^%s*(%d+)%s*(.*)$")
@@ -146,6 +158,7 @@ nwfnet.onnet["init"] = function(e,c)
       ["ctfws/game/config"] = 2,
       ["ctfws/game/endtime"] = 2,
       ["ctfws/game/flags"] = 2,
+      [mqttLocnTopic] = 2,             -- my location
       ["ctfws/game/message"] = 2,      -- broadcast messages
       ["ctfws/game/message/jail"] = 2, -- jail-specific messages
     })