Module:LocUnitData

From Heroes of Might and Magic: Olden Era Official Wiki
Revision as of 11:53, 10 November 2025 by Krom (talk | contribs)

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

local p = {}

-- Подключаем модуль локализации
local LangStrings = require("Module:LocGetString")
local LocGameEntities = require("Module:LocGameEntities")

local dataCache = nil

-- Функция для загрузки и объединения данных
local function loadUnits()
    if dataCache then return dataCache end
    dataCache = {}

    local function loadJson(title)
        local page = mw.title.new(title)
        local content = page and page:getContent() or ""
        if content == "" then return {} end
        local ok, data = pcall(mw.text.jsonDecode, content)
        if not ok then return {} end
        return data
    end

    local stats = loadJson("Data:UnitsStats.json")
    local data = loadJson("Data:UnitsData.json")

    -- Индексируем stats по id
    local statsById = {}
    for key, item in pairs(stats) do
        local id = item.id or key
        statsById[id] = item
    end

    -- Основная таблица по имени
    for name, item in pairs(data) do
        if item.id and statsById[item.id] then
            local merged = {}
            for k,v in pairs(statsById[item.id]) do merged[k]=v end
            for k,v in pairs(item) do merged[k]=v end
            dataCache[name] = merged
        end
    end

    return dataCache
end

-- Функция для локализованных подписей
local function getLabel(sid, lang)
    local text = LangStrings.getText({ args = { sid = sid, lang = lang } })
    return text or "—"
end

local function getUnitLabels(lang)
    local L = {}
    L.Attack      = getLabel("unit_attack", lang)
    L.Defense     = getLabel("unit_defence", lang)
    L.Damage      = getLabel("unit_damage", lang)
    L.Health      = getLabel("unit_health", lang)
    L.Speed       = getLabel("unit_speed", lang)
    L.Initiative  = getLabel("unit_init", lang)
    L.Morale      = getLabel("unit_moral", lang)
    L.Luck        = getLabel("unit_luck", lang)
    L.Tier        = getLabel("tooltipRang", lang)
    L.Fraction    = getLabel("faction_laws", lang)
    L.Price       = 'Price'          -- статичная строка
    L.Experience  = getLabel("hero_ui_exp", lang)
    L.SquadValue  = 'SquadValue'     -- статичная
    L.Range       = 'Range'          -- статичная
    L.Growth      = 'Growth'         -- статичная
    L.Movement    = 'Movement'       -- статичная

    return L
end

local function getLocFraction(code, lang)
    
    local valid = {
        human = true,
        demon = true,
        dungeon = true,
        nature = true,
        undead = true,
        unfrozen = true
    }

    if not valid[code] then
        return "-"
    end

    local sid = "world_cheat_dropdown_fraction_" .. code
    return LangStrings.getText({ args = { sid = sid, lang = lang } })
end

-- Главная функция для вывода таблицы юнита
function p.getUnit(frame)
    local name = frame.args[1] or frame.args.name
    local lang = frame.args.lang or "en"
    if not name then return "No unit name provided" end

    local units = loadUnits()
    local unit = units[name]
    if not unit then return "Unit not found: " .. name end

    -- Локализованные имя и описание
    local locName = LocGameEntities.getLocName({ args = { name = name, lang = lang } })
    local locDesc = LocGameEntities.getLocDescription({ args = { name = name, lang = lang } })

    local stats = unit.stats or {}
    local cost = unit.unitCost or {}

    local function val(x)
        if x == nil or x == "" then return "—" end
        return x
    end

    -- Локализованные подписи
    local L = getUnitLabels(lang)
   
    -- Формирование таблицы без иконок
    local text = "{| class='wikitable' style='max-width:1000px;margin-left:auto;margin-right:auto;'\n"
    text = text .. "|- style='font-size:1.5em;text-align:left;' \n| colspan='6' |" .. locName .. "\n"

    text = text .. "|-\n|" .. L.Attack .. " || " ..  tostring(stats["offence"]) .. " | " .. L.Tier .. " || " .. val(unit.tier) .. "\n"
    text = text .. "|-\n|" .. L.Defense .. " || " .. val(stats.defence) .. " || " .. L.Fraction .. " || " .. getLocFraction(unit.fraction, lang) .. "\n"
    text = text .. "|-\n|" .. L.Damage .. " || " .. val(stats.damageMin) .. "–" .. val(stats.damageMax) .. " || " .. L.Range .. " || " .. val(unit.ai) .. "\n"
    text = text .. "|-\n|" .. L.Health .. " || " .. val(stats.hp) .. " || " .. L.Movement .. " || " .. val(unit.moveType) .. "\n"
    text = text .. "|-\n|" .. L.Speed .. " || " .. val(stats.speed) .. " || " .. L.Price .. " || " .. val(cost.gold) .. " Gold\n"
    text = text .. "|-\n|" .. L.Initiative .. " || " .. val(stats.initiative) .. " || " .. L.Growth .. " || " .. val(unit.growth) .. "\n"
    text = text .. "|-\n|" .. L.Morale .. " || " .. val(stats.moral) .. " || " .. L.Experience .. " || " .. val(unit.expBonus) .. "\n"
    text = text .. "|-\n|" .. L.Luck .. " || " .. val(stats.luck) .. " || " .. L.SquadValue .. " || " .. val(unit.squadValue) .. "\n"

    text = text .. "|-\n| colspan='6' |" .. locDesc .. "\n"

    -- Получаем локализованные имена всех способностей
    local abilityNames = {}
    for _, aid in ipairs(unit.abilities or {}) do
        local name = LocGameEntities.getLocName({ args = { name = aid, lang = lang } })

        if name and name ~= "" then 
            local desctipion = LocGameEntities.getLocDescription({ args = { name = aid, lang = lang } })
            table.insert(abilityNames, "<b>" .. name .. "</b> - " .. desctipion)
        end
    end

    local abilitiesText = table.concat(abilityNames, "<br /><hr /><br />")


    text = text .. "|-\n| colspan='6' |" .. (abilitiesText ~= "" and abilitiesText or "—") .. "\n"

    text = text .. "|}\n"

    -- отладочный JSON 
    -- local debugJson = "<pre>DEBUG JSON:\n" .. mw.text.jsonEncode(unit) .. "</pre>\n"
    -- text = text .. mw.text.jsonEncode(stats)

    return text   
end

return p