Module:Предметы
Jump to navigation
Jump to search
- ↑
--<nowiki> local p = {} local logbook = require("Module:Items/LogbookData") local data = require("Module:Items/Data") local data_e = require("Module:Equipment/Data") local all_items = data.items local all_equipment = data_e.equipment -- Utility local function HasValue(tab, val) if tab == nil then return false end for index, value in ipairs(tab) do if value == val then return true end end return false end ---------------------------------------- Count function p.ItemCount() local c, e = 0, 0 for i, item in pairs(all_items) do if not HasValue(item.Category, "Hidden") then c = c + 1 end end for i in pairs(all_equipment) do e = e + 1 end return c .. " items and " .. e .. " equipment" end function p.TierCount(frame) local tier = frame.args[1] local c = 0; if tier == "Снаряжение" or tier == "Лунное Снаряжение" or tier == "Элитное Снаряжение" or tier == "ВсеСнаряжение" then for i, equip in pairs(all_equipment) do if equip.Rarity == tier or tier == "ВсеСнаряжение" then c = c + 1 end end return c end for i, item in pairs(all_items) do if item.Rarity == tier then c = c + 1 end end return c end ---------------------------------------- Item Infobox local infobox_template_item = [=[ {{Item | title = %s | image = %s.png | caption = %s | desc = %s | rarity = %s | boss = %s | category = %s | unlock = %s | corrupt = %s | uncorrupt = %s | ID = %s %s }}]=] function p.InfoboxItem(frame) local item_name = frame.args[1] ~= "" and frame.args[1] or mw.title.getCurrentTitle().text local item = all_items[item_name] return frame:preprocess(infobox_template_item:format( item_name, item_name, item.Quote, item.Desc:gsub("\r\n", "<br>"), item.Rarity, item.Boss or "", item.Category and Category(item.Category) or "", item.Unlock and "[[" .. item.Unlock .. "]]" or "", item.Corrupt and "{{ItemLink|" .. item.Corrupt .. "}}" or "", item.Uncorrupt and "{{ItemLink|" .. item.Uncorrupt .. "}}" or "", item.ID, item.Stats and Stats(item.Stats) or "" )) end ---------------------------------------- Equipment Infobox local infobox_template_equipment = [=[ {{Equipment | title = %s | image = %s.png | caption = %s | desc = %s | rarity = %s | cooldown = %s | gest = %s | fuel = %s | unlock = %s | ID = %s }}]=] function p.InfoboxEquipment(frame) local equipment_name = frame.args[1] ~= "" and frame.args[1] or mw.title.getCurrentTitle().text local equipment = all_equipment[equipment_name] return frame:preprocess(infobox_template_equipment:format( equipment_name, equipment_name, equipment.Quote, equipment.Desc:gsub("\r\n", "<br>"), equipment.Rarity, equipment.Cooldown and equipment.Cooldown .. "s" or "", equipment.Duration and math.ceil(math.log(equipment.Duration / (equipment.Cooldown * 0.5)) / math.log(0.85) - 0.05) + 1 or "", equipment.Duration and math.ceil(math.log(equipment.Duration / equipment.Cooldown) / math.log(0.85) - 0.05) or "", equipment.Unlock and "[[" .. equipment.Unlock .. "]]" or "", equipment.ID )) end ---------------------------------------- Expansions function p.ItemExpansion(frame) -- Check Item local item_name = frame.args[1] ~= "" and frame.args[1] or mw.title.getCurrentTitle().text local item = all_items[item_name] if item == nil then -- Check Equipment local equipment = all_equipment[item_name] if equipment == nil then return "" end return equipment.Expansion and frame:preprocess("{{" .. equipment.Expansion .. "|" .. item_name .. "}}") or "" end return item.Expansion and frame:preprocess("{{" .. item.Expansion .. "|" .. item_name .. "}}") or "" end ---------------------------------------- Category() function Category(list) local cats = {} for i, v in ipairs(list) do table.insert(cats, "[[:Category:" .. v .. " Items|" .. v .. "]][[Category:" .. v .. " Items]]") end return table.concat(cats, "<br>") end ---------------------------------------- Stats() local stats_row = [=[ | stat%s = %s | value%s = %s | stack%s = %s | add%s = %s ]=] function Stats(stats) local rows = "" for i, v in ipairs(stats) do rows = rows .. stats_row:format( i, v.Stat, i, v.Value, i, Stack(v.Stack), i, v.Add ) end return rows end ---------------------------------------- Stack() local colors = {} colors["Линейный"] = "#CCCCCC" colors["Гиперболический"] = "#33CC33" colors["Экспоненциальный"] = "#CC6666" colors["Особый"] = "#8888FF" colors["Нет"] = "#888888" function Stack(stack) if stack == "Нет" then return "<span style=\"color:" .. colors.None .. "\">None</span>" end for k, v in pairs(colors) do if stack == k then stack = stack:gsub(k, "<span class=\"color-link\" style=\"color:" .. v .. "\">[[Item Stacking#" .. k .. " Stacking|" .. k .. "]]</span>") break end end return stack end ---------------------------------------- Item Table local table_head_item = [=[ {| class="article-table sortable firstcolumn-center-nowrap floatheader" style="width:100%;max-width:1350px" ! style="width:20%" | Item ! class="unsortable" | Description ! style="width:10%" | Stack Type ]=] local table_row_item = [=[ |- | data-sort-value="%s" | [[File:%s.png|center|64px|link=%s]]%s[[%s]] | %s | %s ]=] function p.Table(frame) local rarity = frame.args[1] local wikitable = table_head_item for i, item in ipairs(Sort(all_items)) do if item.Rarity == rarity and not HasValue(item.Category, "Hidden") then wikitable = wikitable .. table_row_item:format( item.Name, item.Name, item.Name, (item.Expansion and "{{" .. item.Expansion .. "}}" or ""), item.Name, Description(item.Desc), StackTypes(item.Stats) ) end end return frame:preprocess(wikitable .. "|}") end ---------------------------------------- Boss Table local table_head_boss = [=[ {| class="article-table sortable firstcolumn-center-nowrap floatheader" style="width:100%;max-width:1350px" ! style="width:20%" | Item ! class="unsortable" | Description ! style="width:20%" | Boss / Acquired From ! style="width:10%" | Stack Type ]=] local table_row_boss = [=[ |- | data-sort-value="%s" | [[File:%s.png|center|64px|link=%s]]%s[[%s]] | %s | style="text-align:center;white-space:nowrap" data-sort-value="%s" | %s | %s ]=] function p.BossTable(frame) local wikitable = table_head_boss for i, item in ipairs(Sort(all_items)) do if item.Rarity == "Boss" and not HasValue(item.Category, "Hidden") then wikitable = wikitable .. table_row_boss:format( item.Name, item.Name, item.Name, (item.Expansion and "{{" .. item.Expansion .. "}}" or ""), item.Name, Description(item.Desc), item.Boss or "-", item.Boss and ("[[File:%s.png|center|64px|link=%s]][[%s]]"):format(item.Boss, item.Boss, item.Boss) or "-", StackTypes(item.Stats) ) end end return frame:preprocess(wikitable .. "|}") end ---------------------------------------- Equipment Table local table_head_equipment = [=[ {| class="article-table sortable firstcolumn-center-nowrap floatheader" style="width:100%%;max-width:1350px" ! style="width:20%%" | Item ! class="unsortable" | Description ! style="white-space:nowrap;width:10%%" data-sort-type="number" | %s ]=] local table_row_equipment = [=[ |- | data-sort-value="%s" | [[File:%s.png|center|64px|link=%s]]%s[[%s]] | %s | style="text-align:center" | %s ]=] function p.EquipmentTable(frame) local rarity = frame.args[1] local wikitable = table_head_equipment:format(rarity == "Элитное снаряжение" and "Элитное" or "Перезарядка") for i, equipment in ipairs(Sort(all_equipment)) do if equipment.Rarity == rarity and not HasValue(equipment.Category, "Скрыть") then wikitable = wikitable .. table_row_equipment:format( equipment.Name, equipment.Name, equipment.Name, (equipment.Expansion and "{{" .. equipment.Expansion .. "}}" or ""), equipment.Name, Description(equipment.Desc), rarity == "Elite Equipment" and equipment.Elite or (equipment.Cooldown and equipment.Cooldown .. "с" or "-") ) end end return frame:preprocess(wikitable .. "|}") end ---------------------------------------- Description() local link_patterns = {} link_patterns["Урон"] = { "[Уу]рон", "[Сс]корость [Аа]таки" } link_patterns["Здоровье"] = { "[Зз]доровье" } link_patterns["Щит"] = { "[Щщ]ит?" } link_patterns["Барьер"] = { "[Бб]арьер" } link_patterns["Броня"] = { "[Бб]роня" } link_patterns["Скорость движения"] = { "[Сс]корость [Дд]вижения", "[Сс]корость [Бб]ега" } link_patterns["Сундуки#Ржавый сейф"] = { "[Сс]прятанный [Тт]айник" } link_patterns[":Category:ПриУничтоженииВрага Предметы"] = { "[Пп]ри [Уу]ничтожении", "[Уу]бив" } link_patterns["Взаимодействие#Святыни"] = { "Святыни" } link_patterns["3D Принтеры"] = { "3D Принтеры" } link_patterns["57-Листный клевер"] = { "[Уу]дача" } link_patterns["Монстры#Боссы"] = { "[Бб]оссы" } link_patterns["Монстры#Элитные"] = { "[Ээ]литные?" } function Description(desc) for link, patterns in pairs(link_patterns) do for i, v in ipairs(patterns) do local a, b = desc:find(v) if a then desc = desc:sub(1, a - 1) .. "<span class{{=}}\"color-link\" style{{=}}\"text-decoration:underline\">[[" .. link .. "|" .. desc:sub(a, b) .. "]]</span>" .. desc:sub(b + 1, desc:len()) break end end end return desc end ---------------------------------------- StackTypes() function StackTypes(stats) if not stats then return "-" end local stack = {} for i, v in ipairs(stats) do if v.Stack ~= stack[#stack] then table.insert(stack, v.Stack) end end return table.concat(stack, "<br>") end ---------------------------------------- Nav Items local nav_head_items = [=[ {| class="navbox" |- ! [[Items]] ]=] local nav_row_items = [=[ |- | [[Items#%s|%s]] |- | %s ]=] function p.NavItems(frame) local nav = nav_head_items local items = { Common = {}, Uncommon = {}, Legendary = {}, Boss = {}, Lunar = {}, Void = {}, Untiered = {}, Consumed = {} } for name, item in pairs(all_items) do if not HasValue(item.Category, "Hidden") then table.insert(items[item.Rarity], "{{ItemLink|" .. name .. "|noDLC=true}}") end if item.Consumed == true then table.insert(items["Consumed"], "{{ItemLink|" .. name .. "|noDLC=true}}") end end for rarity in pairs(items) do table.sort(items[rarity]) end for i, rarity in ipairs({ "Common", "Uncommon", "Legendary", "Boss", "Lunar", "Void", "Consumed" }) do nav = nav .. nav_row_items:format( rarity, rarity, table.concat(items[rarity], " • ") ) end return frame:preprocess(nav .. "|}") end ---------------------------------------- Nav Equipment local nav_head_equipment = [=[ {| class="navbox" |- ! [[Items#Active Items|Equipment]] ]=] local nav_row_equipment = [=[ |- | [[Items#%s|%s]] |- | %s ]=] function p.NavEquipment(frame) local nav = nav_head_equipment local equipment = { Equipment = {}, ["Лунное снаряжение"] = {}, ["Элитное снаряжение"] = {} } for name, e in pairs(all_equipment) do if not HasValue(e.Category, "Скрыть") then table.insert(equipment[e.Rarity], '{{ItemLink|' .. name .. '|noDLC=true}}') end end for rarity in pairs(equipment) do table.sort(equipment[rarity]) end for i, rarity in ipairs({ "Снаряжение", "Лунное снаряжение", "Элитное снаряжение" }) do nav = nav .. nav_row_equipment:format( rarity, rarity:gsub(" Снаряжение", ""):gsub("Снаряжение", "Обычный"), table.concat(equipment[rarity], " • ") ) end return frame:preprocess(nav .. "|}") end ---------------------------------------- Sort() function Sort(list) local items = {} for name, item in pairs(list) do item.Name = name table.insert(items, item) end table.sort(items, function(a, b) return a.Name < b.Name end) return items end ---------------------------------------- GetItemOrEquipment() -- returns item object (table) or string with error function GetItemOrEquipment(item_name) if item_name == nil then return '<span style="color:red; font-weight:bold">Ошибка: Имя отсутствует. 1-ый параметр обязателен.[[Category:Страницы с ошибками скрипта]]</span>' end local item = all_items[item_name] or all_equipment[item_name] if item == nil then return '<span style="color:red; font-weight:bold">Ошибка: Неправильное имя. Проверьте заглавные буквы.[[Category:Страницы с ошибками скрипта]]</span>' else return item end end ---------------------------------------- GetRarity() function p.GetRarity(frame) local item_name = frame.args[1] local simple_form = frame.args[2] or false local item = GetItemOrEquipment(item_name) if type(item) == 'string' then return item end local rarity = item.Rarity if simple_form and rarity == 'Элитное снаряжение' then rarity = 'Снаряжение' elseif simple_form and rarity == 'Лунное снаряжение' then rarity = 'Лунное' end return rarity end ---------------------------------------- local GetItemBox() local itembox_template = '<span style="position: relative; display: inline-flex;">' .. '[[File:bg%s.png|%spx|link=%s]]' .. '<span style="position: absolute; left: %spx; top: %spx;">' .. '[[File:%s.png|%spx|link=%s]]' .. '</span>' .. '</span>' local function GetItemBox(frame, name, size) frame.args[1] = name frame.args[2] = 'simple' local rarity = p.GetRarity(frame) local itemSize = math.floor(size * 0.9375) local offset = (size - itemSize) / 2 return string.format(itembox_template, rarity, size, name, offset, offset, name, itemSize, name ) end ---------------------------------------- Logbook() local logbook_template = [=[ {| style = "border-spacing: %spx" %s |}]=] function p.Logbook(frame) local size = frame.args.size or frame.args[1] or 64 local spacing = math.max(0, size / 16 - 2) local rows = {} for i, item in ipairs(logbook.order) do rows[#rows+1] = '| ' .. GetItemBox(frame, item, size) if i % logbook.width == 0 and i ~= count then rows[#rows+1] = '|-' end end return string.format(logbook_template, spacing, table.concat(rows, '\n')) end return p --</nowiki>