Module:LocUnitData
From Heroes of Might and Magic: Olden Era Official Wiki
Documentation for this module may be created at Module:LocUnitData/doc
local p = {}
-- Подключаем модуль локализации
local LangStrings = require("Модуль:LocGetString")
local LocGameEntities = require("Модуль: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


