Module:SouthernStraitCorridorOps
From MicrasWiki
Documentation for this module may be created at Module:SouthernStraitCorridorOps/doc
-- Module:SouthernStraitCorridorOps
-- Unified daily operations wrapper for War League, Hatch Ministry, and Temple Bank missionary operations.
-- This module does not rewrite the source modules. It invokes them and displays their outputs together.
local p = {}
--------------------------------------------------------------------------------
-- Helpers
--------------------------------------------------------------------------------
local function yn(value, default)
local v = tostring(value or ""):lower()
if v == "" then return default end
if v == "no" or v == "n" or v == "0" or v == "false" then return false end
if v == "yes" or v == "y" or v == "1" or v == "true" then return true end
return default
end
local function makeFrame(args)
return { args = args or {} }
end
local function safeRequire(moduleName)
local ok, mod = pcall(require, moduleName)
if ok and mod then
return mod, nil
end
return nil, "Could not load " .. tostring(moduleName)
end
local function safeCall(moduleName, funcName, args)
local mod, err = safeRequire(moduleName)
if not mod then
return false, "''" .. err .. ".''"
end
if type(mod[funcName]) ~= "function" then
return false, "''" .. tostring(moduleName) .. " has no public function named " .. tostring(funcName) .. ".''"
end
local ok, result = pcall(function()
return mod[funcName](makeFrame(args))
end)
if not ok then
return false, "''Error while invoking " .. tostring(moduleName) .. "." .. tostring(funcName) .. ": " .. tostring(result) .. "''"
end
return true, tostring(result or "")
end
local function doyToMonthDom(doy)
doy = tonumber(doy) or 1
if doy < 1 then doy = 1 end
if doy > 183 then doy = 183 end
if doy <= 61 then
return 1, doy
elseif doy <= 122 then
return 2, doy - 61
else
return 3, doy - 122
end
end
local function dateLabel(args)
local y = tonumber(args.year or args.psscyear)
local d = tonumber(args.day or args.dayofyear)
if y and d then
local m, dom = doyToMonthDom(d)
return string.format("%d/%d/%d PSSC", dom, m, y)
end
return "current PSSC date"
end
local function section(title, body)
local out = {}
table.insert(out, "===" .. title .. "===")
table.insert(out, body or "''No output.''")
return table.concat(out, "\n")
end
local function hr()
return "\n----\n"
end
--------------------------------------------------------------------------------
-- Main combined view
--------------------------------------------------------------------------------
function p.makeTable(frame)
local args = (frame and frame.args) or {}
local showIntro = yn(args.intro, true)
local showLegend = yn(args.legend or args.showlegend, false)
local includeWar = yn(args.war or args.warleague, true)
local includeHatch = yn(args.hatch or args.hatchministry, true)
local includeMission = yn(args.missionary or args.templebank, true)
local year = args.year or args.psscyear
local day = args.day or args.dayofyear
local title = args.title or "Southern Strait Corridor Daily Operations"
local label = dateLabel(args)
local out = {}
table.insert(out, "==" .. title .. "==")
if showIntro then
table.insert(out, string.format(
"''Combined operational display for %s, drawing together War League deployments, Hatch Ministry privateer activity, and Temple Bank missionary operations.''",
label
))
table.insert(out, "")
table.insert(out, "This page is a wrapper display. The underlying operational rows remain generated by the individual War League, Hatch Ministry, and Temple Bank missionary systems.")
end
----------------------------------------------------------------------------
-- War League
----------------------------------------------------------------------------
if includeWar then
local warArgs = {
year = year,
day = day,
rows = args.warrows or args.rows or "36",
showlegend = showLegend and "yes" or "no",
flagsize = args.flagsize or "20",
}
if args.division and tostring(args.division) ~= "" then
warArgs.division = args.division
elseif args.wardivision and tostring(args.wardivision) ~= "" then
warArgs.division = args.wardivision
end
if args.seed and tostring(args.seed) ~= "" then
warArgs.seed = args.seed
end
local ok, body = safeCall("Module:WarLeagueDivisionOpsBVR", "makeTable", warArgs)
table.insert(out, hr())
table.insert(out, section("War League deployments", body))
end
----------------------------------------------------------------------------
-- Hatch Ministry
----------------------------------------------------------------------------
if includeHatch then
local hatchArgs = {
year = year,
day = day,
legend = showLegend and "yes" or "no",
}
if args.captain and tostring(args.captain) ~= "" then
hatchArgs.captain = args.captain
end
local ok, body = safeCall("Module:HatchMinistryDailyOps", "dailyReport", hatchArgs)
table.insert(out, hr())
table.insert(out, section("Hatch Ministry privateer operations", body))
end
----------------------------------------------------------------------------
-- Temple Bank / Missionary Operations
----------------------------------------------------------------------------
if includeMission then
local missionaryArgs = {
year = year,
day = day,
region = args.missionaryregion or args.region or "Haifan",
showlegend = showLegend and "yes" or "no",
includeThreat = args.includeThreat or args.includethreat or "no",
showEcon = args.showEcon or args.showecon or "no",
}
if args.missionarylimit and tostring(args.missionarylimit) ~= "" then
missionaryArgs.limit = args.missionarylimit
elseif args.limit and tostring(args.limit) ~= "" then
missionaryArgs.limit = args.limit
end
local ok, body = safeCall("Module:MissionaryDailyOpsBVR", "makeTable", missionaryArgs)
table.insert(out, hr())
table.insert(out, section("Temple Bank missionary operations", body))
end
if showLegend then
table.insert(out, hr())
table.insert(out, "=== Combined legend ===")
table.insert(out, "* '''War League deployments''' show military/security responses, force allocations, oversight, and compliance notes.")
table.insert(out, "* '''Hatch Ministry privateer operations''' show privateer-led port, sea, rail, anti-smuggling, and escort work.")
table.insert(out, "* '''Temple Bank missionary operations''' show cult-specific missionary formations, tasking, severity, and Temple Bank notes.")
end
return table.concat(out, "\n")
end
--------------------------------------------------------------------------------
-- Shortcut views
--------------------------------------------------------------------------------
function p.southernStrait(frame)
local args = (frame and frame.args) or {}
args.region = args.region or "Haifan"
args.missionaryregion = args.missionaryregion or "Haifan"
args.title = args.title or "Southern Strait Corridor Daily Operations"
return p.makeTable({ args = args })
end
function p.warOnly(frame)
local args = (frame and frame.args) or {}
args.hatch = "no"
args.missionary = "no"
args.war = "yes"
args.title = args.title or "War League Daily Operations"
return p.makeTable({ args = args })
end
function p.hatchOnly(frame)
local args = (frame and frame.args) or {}
args.war = "no"
args.missionary = "no"
args.hatch = "yes"
args.title = args.title or "Hatch Ministry Daily Operations"
return p.makeTable({ args = args })
end
function p.missionaryOnly(frame)
local args = (frame and frame.args) or {}
args.war = "no"
args.hatch = "no"
args.missionary = "yes"
args.region = args.region or "Haifan"
args.missionaryregion = args.missionaryregion or args.region
args.title = args.title or "Temple Bank Missionary Daily Operations"
return p.makeTable({ args = args })
end
return p