Module:MapRewards
Revision as of 08:02, 28 August 2022 by Memetails (talk | contribs) (→Items in Choice within inner table to include name below image (May cause sizing issue in event page due to max width of the info panel)
Documentation for this module may be created at Module:MapRewards/doc
local U = require('Module:Core')
local template = {
footer = "|}",
header = [[{|style="text-align:center;width:100%%"
!colspan="5" style="background-color:#3baef5;color:white;padding:10px"|Rewards<span class="plainlinks" style="float:right">[[https://en.kancollewiki.net/Module:Data/Map/%s?action=edit edit]]</span>]],
ship_row = [=[|-
!style="background-color:#3baef5;color:white;width:40%%"|Ship
|colspan="4" style="background-color:#eef2f7"|%s<br>[[%s]]]=],
choice = [=[|-
!style="background-color:#eef2f7;color:red"|OR
|colspan="4" style="background-color:#eef2f7"|]=],
-- TODO: class="sortable"
item_header = [[{|style="text-align:center;width:100%"
!style="background-color:#3baef5;color:white;width:40%"|Item/Equipment
!class="unsortable" style="background-color:#3baef5;color:white;width:15%"|丁<br>Casual
!class="unsortable" style="background-color:#3baef5;color:white;width:15%"|丙<br>Easy
!class="unsortable" style="background-color:#3baef5;color:white;width:15%"|乙<br>Medium
!class="unsortable" style="background-color:#3baef5;color:white;width:15%"|甲<br>Hard]],
item_row = [=[|-
|data-sort-value="%s" style="background-color:#eef2f7;font-size:12px;line-height:14px"|%s<br>[[%s]]
|style="background-color:#eef2f7;font-size:18px"|%s
|style="background-color:#eef2f7;font-size:18px"|%s
|style="background-color:#eef2f7;font-size:18px"|%s
|style="background-color:#eef2f7;font-size:18px"|%s]=],
item_style_top = [=[|data-sort-value="%s" style="background-color:#eef2f7;color:red;font-size:12px;line-height:14px;width:auto;border-top:4px solid grey"|]=],
item_style_bottom = [=[|data-sort-value="%s" style="background-color:#eef2f7;color:red;font-size:12px;line-height:14px;width:auto;border-bottom:4px solid grey"|]=],
item_style_both = [=[|data-sort-value="%s" style="background-color:#eef2f7;color:red;font-size:12px;line-height:14px;width:auto;border-bottom:4px solid grey;border-top:4px solid grey"|]=],
item_amount_style = [=[
|style="background-color:#eef2f7;font-size:18px;border-bottom:4px solid grey;border-top:4px solid grey"|]=],
inner_table_header = [=[|-
|
{|style="text-align:center;width:100%"]=],
or_style = [=[|rowspan="2"style="background-color:#eef2f7;color:red"|OR]=],
item_link = [=[[[%s]]]=],
}
local assetTypes = { item = 'Item Icon', equipment = 'Equipment Card', ship = 'Ship Banner' }
local assetSizes = { item = '75px', equipment = '75px', ship = '240px' }
local function render(frame, event, map)
local event = event or frame.args[1] or "??"
local map = map or frame.args[2] or "??"
local success, data = U.loadData("Data/Map/" .. event)
if not success then return "Unknown event: " .. event end
data = data[map]
if not data then return "Unknown map: " .. map end
local index = {}
local tbl = {}
local types = {}
-- TODO: assuming 0-1 single ship reward on all difficulties
local ship = false
local function setData(diff)
for _, v in ipairs(data[diff] or {}) do
if v.choice then
local v1 = v.choice[1]
local v2 = v.choice[2]
local name1 = v1.item or v1.equipment or v1.ship or '??'
local name2 = v2.item or v2.equipment or v2.ship or '??'
types[name1] = v1.item and 'item' or v1.equipment and 'equipment' or v1.ship and 'ship' or '??'
types[name2] = v2.item and 'item' or v2.equipment and 'equipment' or v2.ship and 'ship' or '??'
local names = {name1 .. '1', name2 .. '2'}
local name = names[1] .. '||' .. names[2]
types[name] = 'choice'
if not U.ifind(index, name) then table.insert(index, name) end
tbl[name] = tbl[name] or {}
tbl[name][diff] = {
{ name = name1, count = v1.count or 1, level = v1.level },
{ name = name2, count = v2.count or 1, level = v2.level },
}
else
local name = v.item or v.equipment or v.ship or '??'
types[name] = v.item and 'item' or v.equipment and 'equipment' or v.ship and 'ship' or '??'
if v.ship then
ship = v.ship
else
if not U.ifind(index, name) then table.insert(index, name) end
tbl[name] = tbl[name] or {}
tbl[name][diff] = { count = v.count or 1, level = v.level }
end
end
end
end
local function getCount(name, diff, i)
if i then
return (((tbl[name] or {})[diff] or {})[i] or {}).count or 0
else
return ((tbl[name] or {})[diff] or {}).count or 0
end
end
local function getLevel(name, diff, i)
local level
if i then
level = (((tbl[name] or {})[diff] or {})[i] or {}).level
else
level = ((tbl[name] or {})[diff] or {}).level
end
return level and string.format(" (★%d)", level) or ''
end
local function getCell(name, diff, i)
local count = getCount(name, diff, i)
return (count == 0 and '' or count) .. getLevel(name, diff, i)
end
local function getAsset(name)
return string.format("[[File:%s %s.png|%s|link=%s]]", assetTypes[types[name]] or '??', name, assetSizes[types[name]] or '??', name)
end
setData('Hard')
setData('Medium')
setData('Easy')
setData('Casual')
local result = { string.format(template.header, mw.uri.encode(event, 'WIKI')) }
if ship then
table.insert(result, string.format(template.ship_row, getAsset(ship), ship))
end
table.insert(result, template.footer)
table.insert(result, template.item_header)
--[[
local sortedIndex = U.imap(index, function(name, i) return { name = name, i = i, typ = types[name] } end)
table.sort(sortedIndex, function (x, y)
if x.typ ~= y.typ then return x.typ > y.typ end
if getCount(x.name, 'Casual') ~= getCount(y.name, 'Casual') then return getCount(x.name, 'Casual') > getCount(y.name, 'Casual') end
if getCount(x.name, 'Easy') ~= getCount(y.name, 'Easy') then return getCount(x.name, 'Easy') > getCount(y.name, 'Easy') end
if getCount(x.name, 'Medium') ~= getCount(y.name, 'Medium') then return getCount(x.name, 'Medium') > getCount(y.name, 'Medium') end
if getCount(x.name, 'Hard') ~= getCount(y.name, 'Hard') then return getCount(x.name, 'Hard') > getCount(y.name, 'Hard') end
return x.i < y.i
end)
local sortValues = {}
for i, e in ipairs(sortedIndex) do sortValues[e.name] = i end
]]--
-- sortValues[name]
for i, name in ipairs(index) do
if types[name] == 'choice' then
local names = U.split(name, '||')
local reward = {}
local difficulty = {'Casual', 'Easy', 'Medium', 'Hard'}
--Output the reward items as a table inside the cell
table.insert(result, template.inner_table_header)
local str = "%s"
for c=1, #names do
if c>1 then table.insert(result, template.or_style) end
table.insert(result, template.item_style_top)
table.insert(result, getAsset(names[c]:sub(1, -2)))
end
table.insert(result, "|-")
for c=1, #names do
table.insert(result, template.item_style_bottom)
table.insert(result, string.format(template.item_link, names[c]:sub(1, -2)))
end
table.insert(result, template.footer)
--Output the amounts of reward for each difficulty & item
for d=1, #difficulty do
str = template.item_amount_style .. "%s "
for c=1, #names do
if c>1 then if getCell(name, difficulty[d], c) == '' then str = str .. " %s " else str = str .. " / %s " end end
if getCell(name, difficulty[d], c) == '' then str = string.format(str, "") else str = string.format(str, getCell(name, difficulty[d], c)) end
end
table.insert(result, str)
end
else
table.insert(result, string.format(template.item_row, 0, getAsset(name), name,
getCell(name, 'Casual'), getCell(name, 'Easy'), getCell(name, 'Medium'), getCell(name, 'Hard')))
end
end
table.insert(result, template.footer)
return table.concat(result, "\n")
end
local function test()
mw.log(render(nil, 'Summer 2022 Event', 'E-1'))
end
return { render = render, test = test }