Модуль:Prototypes/Роль/Экипировка: различия между версиями
Pok (обсуждение | вклад) мНет описания правки Метка: ручная отмена |
Pok (обсуждение | вклад) мНет описания правки |
||
| Строка 8: | Строка 8: | ||
local p = {} | local p = {} | ||
-- Функция для | -- Функция для создания кэша по id | ||
local function | local function createCache(tbl) | ||
local cache = {} | |||
for k, v in pairs(tbl) do | for k, v in pairs(tbl) do | ||
if | if v.id then | ||
cache[v.id] = v | |||
else | |||
cache[k] = v | |||
end | end | ||
end | end | ||
return | return cache | ||
end | |||
-- Кэши для данных | |||
local jobCache = createCache(jobData) | |||
local gearCache = createCache(gearData) | |||
local roleLoadoutCache = createCache(gearRoleLoadout) | |||
local loadoutCache = createCache(gearloadout) | |||
local loadoutGroupCache = createCache(gearloadoutGroup) | |||
-- Функция для поиска объекта по id | |||
local function findById(tbl, id) | |||
return tbl[id] | |||
end | end | ||
| Строка 22: | Строка 37: | ||
if not str or str == "" then return "" end | if not str or str == "" then return "" end | ||
return str:sub(1,1):upper() .. str:sub(2) | return str:sub(1,1):upper() .. str:sub(2) | ||
end | |||
-- Функция для сборки результата экипировки | |||
local function buildResult(itemId, sourceGear, slot) | |||
if slot == "back" and sourceGear.storage and sourceGear.storage.back then | |||
local storageBack = "" | |||
for _, storageItem in ipairs(sourceGear.storage.back) do | |||
storageBack = storageBack .. string.format("{{#invoke:Prototypes/Предмет/Содержание|main|%s}}", storageItem) | |||
end | |||
return string.format("<div>{{#invoke:Prototypes/Предмет/Содержание|image|%s}} {{СollapsibleMenu|%s}}</div>", itemId, storageBack) | |||
else | |||
return string.format("{{#invoke:Prototypes/Предмет/Содержание|image|%s}}", itemId) | |||
end | |||
end | |||
-- Функция для обработки результата в зависимости от режима radio | |||
local function processResult(itemId, result, radioMode, frame) | |||
if radioMode then | |||
return frame:preprocess(string.format("{{#invoke:Prototypes/Механика/Частоты|main|radio|%s}}", itemId)) | |||
else | |||
return frame:preprocess(result) | |||
end | |||
end | end | ||
function p.main(frame) | function p.main(frame) | ||
local args = frame.args | local args = frame.args | ||
local param = mw.text.trim(args[1] or "") | local param = mw.text.trim(args[1] or "") | ||
local idParam = mw.text.trim(args[2] or "") | local idParam = mw.text.trim(args[2] or "") | ||
| Строка 35: | Строка 72: | ||
-- Режим "special": обработка имплантов через данные должности | -- Режим "special": обработка имплантов через данные должности | ||
if param == "special" then | if param == "special" then | ||
local job = findById( | local job = findById(jobCache, capitalizeFirst(idParam)) | ||
if not job then | if not job then | ||
return "" | return "" | ||
| Строка 63: | Строка 100: | ||
slot = "ears" | slot = "ears" | ||
end | end | ||
local itemId = "" | |||
local sourceGear = nil | |||
-- Пробуем найти запись роли в gearRoleLoadout по ключу "Job" + idParam (с заглавной буквы) | -- Пробуем найти запись роли в gearRoleLoadout по ключу "Job" + idParam (с заглавной буквы) | ||
local roleLoadoutId = "Job" .. capitalizeFirst(idParam) | local roleLoadoutId = "Job" .. capitalizeFirst(idParam) | ||
local roleLoadoutData = findById( | local roleLoadoutData = findById(roleLoadoutCache, roleLoadoutId) | ||
if not roleLoadoutData then | if not roleLoadoutData then | ||
local gear = findById( | -- Если запись роли НЕ найдена, то воспринимаем второй параметр как идентификатор набора экипировки (startingGear) | ||
local gear = findById(gearCache, idParam) | |||
if not gear then | if not gear then | ||
return "Ошибка: не найдена экипировка с id " .. idParam | return "Ошибка: не найдена экипировка с id " .. idParam | ||
end | end | ||
local gearEquipment = gear.equipment or {} | local gearEquipment = gear.equipment or {} | ||
itemId = gearEquipment[slot] or "" | |||
if itemId == "" then | if itemId == "" then | ||
return "" | return "" | ||
end | |||
sourceGear = gear | |||
else | |||
-- Если запись роли найдена, то обрабатываем через данные должности | |||
local jobId = capitalizeFirst(idParam) | |||
local job = findById(jobCache, jobId) | |||
if not job then | |||
return "Ошибка: не найдена должность с id " .. jobId | |||
end | end | ||
local | local gearId = job.startingGear | ||
if | if not gearId then | ||
return "Ошибка: у должности с id " .. jobId .. " не указан startingGear" | |||
end | end | ||
local gear = findById(gearCache, gearId) | |||
if not gear then | |||
return "Ошибка: не найдена экипировка с id " .. gearId | |||
return | |||
end | end | ||
local gearEquipment = gear.equipment or {} | |||
itemId = gearEquipment[slot] or "" | |||
sourceGear = gear | |||
-- Если для данного слота ничего не найдено в базовом наборе, пытаемся найти его через roleLoadout | |||
if itemId == "" then | |||
for _, groupId in ipairs(roleLoadoutData.groups or {}) do | |||
if groupId ~= "Trinkets" then -- исключаем группу Trinkets | |||
local groupFound = findById(loadoutGroupCache, groupId) | |||
if groupFound and type(groupFound.loadouts) == "table" then | |||
for _, loadoutID in ipairs(groupFound.loadouts) do | |||
local loadout = findById(loadoutCache, loadoutID) | |||
if loadout and not loadout.effects and loadout.equipment and loadout.equipment[slot] then | |||
itemId = loadout.equipment[slot] | |||
sourceGear = loadout | |||
break | |||
end | |||
end | end | ||
end | end | ||
end | end | ||
if itemId ~= "" then break end | |||
end | end | ||
end | end | ||
end | end | ||
| Строка 144: | Строка 168: | ||
end | end | ||
local result | local result = buildResult(itemId, sourceGear, slot) | ||
return processResult(itemId, result, radioMode, frame) | |||
end | end | ||
return p | return p | ||