Module:SouthernStraitCorridorOps

From MicrasWiki
Revision as of 18:09, 28 May 2026 by NewZimiaGov (talk | contribs) (Created page with "-- 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) loc...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

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