Module:Test Version History

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

Documentation for this module may be created at Module:Test Version History/doc

--<nowiki>
local p = {}

local logbook = require("Module:Items/LogbookData")
local data = require("Module:Test Version History/Data")
local all_dates = data.patch


---------------------------------------- Version Infobox
local infobox_template_item = [=[
{{Item
| title = %s
| image = %s.png
| caption = %s
| desc = %s
| date = %s
| category = %s
| ID = %s
%s
}}]=]

function p.InfoboxVersion(frame)
  local item_name = frame.args[1] ~= "" and frame.args[1] or mw.title.getCurrentTitle().text
  local item = all_dates[item_name]
  return frame:preprocess(infobox_template_item:format(
    item_name,
    item_name,
    item.Desc:gsub("\r\n", "<br>"),
    item.Date,
    item.Category and Category(item.Category) or "",
    item.ID,
    item.Stats and Stats(item.Stats) 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

----------------------------------------  Table
local table_head = [=[
{| class="article-table sortable firstcolumn-center-nowrap floatheader" style="width:100%; max-width:1350px; text-align:center;"
! data-sort-type=isoDate style="width:10%" | Date
! class="unsortable" style="width:10%" | Version
! class="unsortable" style="width:10%" | New Survivor(s)
! class="unsortable" | Description
]=]

local table_row = [=[
|-
| data-sort-direction="desc" data-sort-value="%s" | %s
| %s
| %s
| %s
]=]

function p.Table(frame)
  local wikitable = table_head
  for i, item in ipairs(Sort(all_dates)) do
    wikitable = wikitable .. table_row:format(
      item.Date, DateToString(item.Date), 
      item.Version, 
      item.NewSurvivor and (function()
        local result = {}
        for _, survivorName in ipairs(item.NewSurvivor) do
        table.insert(result, ("[[File:%s.png|center|64px|link=%s]][[%s]]"):format(survivorName, survivorName, survivorName))
        end
        return table.concat(result, '<br />')
      end)() or "-",
      Description(item.Desc)
    )
  end
  return frame:preprocess(wikitable .. "|}")
end

---------------------------------------- Description()

local link_patterns = {}
link_patterns["Damage"] = { "[Dd]amage", "[Aa]ttack [Ss]peed" }
link_patterns["Health"] = { "[Hh]ealth" }
link_patterns["Shield"] = { "[Ss]hields?" }
link_patterns["Barrier"] = { "[Bb]arrier" }
link_patterns["Armor"] = { "[Aa]rmor" }
link_patterns["Movement Speed"] = { "[Mm]ovement [Ss]peed", "[Ss]print [Ss]peed", "[Mm]ovespeed" }
link_patterns["Chests#Rusty Lockbox"] = { "[Hh]idden [Cc]ache" }
link_patterns[":Category:OnKillEffect Items"] = { "On%-Kill" }
link_patterns["Interactibles#Shrines"] = { "Shrine" }
link_patterns["3D Printers"] = { "3D Printers" }
link_patterns["57 Leaf Clover"] = { "[Ll]uck" }
link_patterns["Monsters#Bosses"] = { "[Bb]osses" }
link_patterns["Monsters#Elites"] = { "[Ee]lites?" }

-- this function replaces instances of keywords found in the description using link patterns found above. takes into account upper and lower case 
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

---------------------------------------- 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.Date < b.Date end)
  return items
end

---------------------------------------- DateToString()
-- MON XX, YEAR
function DateToString(isodate)
  m = {"January","February","March","April","May","June","July","August","September","October","November","December"}
  return m[tonumber(string.sub(isodate,5,6))].." "..string.sub(isodate,7)..", "..string.sub(isodate,1,4)
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">Error: Name missing. 1st parameter is required.[[Category:Pages with script errors]]</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">Error: Incorrect name. Check capitalization.[[Category:Pages with script errors]]</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 == 'Elite Equipment' then
    rarity = 'Equipment'
  elseif simple_form and rarity == 'Lunar Equipment' then
    rarity = 'Lunar'
  end
  
  return rarity
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>