Module:BassaridEmployment

From MicrasWiki
Jump to navigationJump to search

Documentation for this module may be created at Module:BassaridEmployment/doc

local p = {}

---------------------------------------------------------
-- 1. getCurrentDate
--   Returns a date string in PSSC format, plus day/month
---------------------------------------------------------
local function getCurrentDate()
    local startDate = os.time({year = 1999, month = 8, day = 6})
    local secondsInDay = 86400
    local daysPerYear = 183

    local currentDate = os.time()
    local totalDaysElapsed = math.floor((currentDate - startDate) / secondsInDay)

    local yearFraction = totalDaysElapsed / daysPerYear
    local psscYear = math.floor(yearFraction)
    local dayOfYear = math.floor((yearFraction - psscYear) * daysPerYear) + 1

    local month, dayOfMonth
    if dayOfYear <= 61 then
        month = 1
        dayOfMonth = dayOfYear
    elseif dayOfYear <= 122 then
        month = 2
        dayOfMonth = dayOfYear - 61
    else
        month = 3
        dayOfMonth = dayOfYear - 122
    end

    return string.format("%d/%d/%d [[PSSC]]", dayOfMonth, month, psscYear), dayOfMonth, month
end

---------------------------------------------------------
-- 2. Basic Setup
---------------------------------------------------------
local population = 55499301
local unemploymentRate = 0.04 -- 4% unemployment
local employedPopulation = math.floor(population * (1 - unemploymentRate))

-- Company table and their employment percentages
local companies = {
    {name = "Lake Morovia Blockade Fund", employmentPercentage = 0.0300},
    {name = "Gladeseed Farmers' Union", employmentPercentage = 0.1205},
    {name = "Atterian Cattle Drivers", employmentPercentage = 0.0502},
    {name = "Roving Wind Farm Corporation", employmentPercentage = 0.0210},
    {name = "Baratar Corporation", employmentPercentage = 0.0401},
    {name = "Noctic Fleet", employmentPercentage = 0.0603},
    {name = "Keepers of the Bloodbaths of Laprind", employmentPercentage = 0.0105},
    {name = "Jogiani Merchants of Manwine", employmentPercentage = 0.0208},
    {name = "Keepers of the Grove of Zoe Elm", employmentPercentage = 0.0112},
    {name = "Plains of Jogi", employmentPercentage = 0.0807},
    {name = "Ale of the Night Central Brewery", employmentPercentage = 0.0201},
    {name = "Camel Herders of the Jangsong Province", employmentPercentage = 0.0306},
    {name = "Thalassian Temple Granite Export Cooperative", employmentPercentage = 0.0310},
    {name = "East Keltian Iron Company", employmentPercentage = 0.0415},
    {name = "Mylecian Coal Ports", employmentPercentage = 0.0317},
    {name = "Merchants of the Valley of Diamonds", employmentPercentage = 0.0102},
    {name = "Maritime Guild of the Cult of Maskmakers", employmentPercentage = 0.0109},
    {name = "Hatch Ministry", employmentPercentage = 0.0203},
    {name = "Anterran Imports and Services", employmentPercentage = 0.0113},
    {name = "East Keltian Timber Company", employmentPercentage = 0.0312},
    {name = "Grand Cave Bee Meadery", employmentPercentage = 0.0215},
    {name = "Merchant Guild of the Poppy Goddess", employmentPercentage = 0.0111},
    {name = "Cinnamon Plains of Rouge", employmentPercentage = 0.0218},
    {name = "Seamstresses of Rouge", employmentPercentage = 0.0114},
    {name = "Salurian Temple of Sacred Horehound", employmentPercentage = 0.0212},
    {name = "Suncliff Fisheries", employmentPercentage = 0.0309},
    {name = "Bird Keepers of Saluria", employmentPercentage = 0.0108},
    {name = "Velvet Homestead", employmentPercentage = 0.0110},
    {name = "Hunters of the Giant Fanged Penguin", employmentPercentage = 0.0116},
    {name = "Professional Pillarion League", employmentPercentage = 0.0052},
    {name = "La Sái Ebile", employmentPercentage = 0.0104},
    {name = "Temple Bank of the Reformed Stripping Path", employmentPercentage = 0.0118},
    {name = "Market Hanavusu", employmentPercentage = 0.0157},
    {name = "Couriers of the Lizard Queen", employmentPercentage = 0.0117},
    {name = "Temple University of Delphica", employmentPercentage = 0.0209},
    {name = "Trans-Morovian Railway Company", employmentPercentage = 0.0155}
}

---------------------------------------------------------
-- 3. Random Variation
--   Up to ±25% daily shift in each company's employees
---------------------------------------------------------
local function calculateEmployees(company)
    local currentEmployees = math.floor(employedPopulation * company.employmentPercentage)
    local maxChange = math.floor(currentEmployees * 0.25)
    local changeAmount = math.random(-maxChange, maxChange)
    local newEmployees = math.max(1, currentEmployees + changeAmount)
    return currentEmployees, newEmployees
end

---------------------------------------------------------
-- 4. generateTable
--   Seeds randomness by the day so that results are
--   stable for that day but refresh the next day.
---------------------------------------------------------
function p.generateTable()
    -- (A) Create a daily seed from year & day-of-year
    local localTime = os.date("*t")
    local dailySeed = localTime.year * 1000 + localTime.yday
    math.randomseed(dailySeed)  -- ensures daily refresh

    -- (B) Get current date string
    local date, _, _ = getCurrentDate()

    local totalEmployed = 0
    local wikitable = "{| class=\"wikitable\"\n"
        .. "! Date (Day/Month/Year [[PSSC]]) !! Company !! Employment Percentage !! Previous Employees !! Current Employees !! Change\n"

    -- (C) Calculate for each company
    for _, company in ipairs(companies) do
        local prevEmployees, currEmployees = calculateEmployees(company)
        local change = (currEmployees < prevEmployees) and "Decreased" or "Increased"

        totalEmployed = totalEmployed + currEmployees
        wikitable = wikitable .. string.format(
            "|-\n| %s || %s || %.2f%% || %d || %d || %s\n",
            date,
            company.name,
            company.employmentPercentage * 100,
            prevEmployees,
            currEmployees,
            change
        )
    end

    -- (D) Summaries: total employed vs. total unemployed
    local totalUnemployed = population - totalEmployed
    wikitable = wikitable
        .. string.format("|-\n| Total Employed || || || || %d ||\n", totalEmployed)
        .. string.format("|-\n| Total Unemployed || || || || %d ||\n|}", totalUnemployed)

    return wikitable
end

return p