Module:Предметы

From Risk of Rain 2 Wiki
Jump to navigation Jump to search

[1]

  1. --<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>