- Welcome to the Kancolle Wiki!
- If you have any questions regarding site content, account registration, etc., please visit the KanColle Wiki Discord
Difference between revisions of "Module:MapRewards"
Jump to navigation
Jump to search
Line 9: | Line 9: | ||
|colspan="4" style="background-color:#eef2f7"|%s<br>[[%s]]]=], | |colspan="4" style="background-color:#eef2f7"|%s<br>[[%s]]]=], | ||
choice = [=[|- | choice = [=[|- | ||
− | ! | + | !style="background-color:#eef2f7;color:red"|OR |
+ | |colspan="4" style="background-color:#eef2f7"|]=], | ||
-- TODO: class="sortable" | -- TODO: class="sortable" | ||
item_header = [[{|style="text-align:center;width:100%" | item_header = [[{|style="text-align:center;width:100%" | ||
Line 23: | Line 24: | ||
|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_row_choice1 = [=[|- | ||
+ | |data-sort-value="%s" style="background-color:#eef2f7;font-size:12px;line-height:14px;border-top:4px solid grey"|%s<br>[[%s]] | ||
+ | |style="background-color:#eef2f7;font-size:18px;border-top:4px solid grey"|%s | ||
+ | |style="background-color:#eef2f7;font-size:18px;border-top:4px solid grey"|%s | ||
+ | |style="background-color:#eef2f7;font-size:18px;border-top:4px solid grey"|%s | ||
+ | |style="background-color:#eef2f7;font-size:18px;border-top:4px solid grey"|%s]=], | ||
+ | item_row_choice2 = [=[|- | ||
+ | |data-sort-value="%s" style="background-color:#eef2f7;font-size:12px;line-height:14px;border-bottom:4px solid grey"|%s<br>[[%s]] | ||
+ | |style="background-color:#eef2f7;font-size:18px;border-bottom:4px solid grey"|%s | ||
+ | |style="background-color:#eef2f7;font-size:18px;border-bottom:4px solid grey"|%s | ||
+ | |style="background-color:#eef2f7;font-size:18px;border-bottom:4px solid grey"|%s | ||
+ | |style="background-color:#eef2f7;font-size:18px;border-bottom:4px solid grey"|%s]=], | ||
} | } | ||
Line 29: | Line 42: | ||
local assetSizes = { item = '75px', equipment = '75px', ship = '240px' } | local assetSizes = { item = '75px', equipment = '75px', ship = '240px' } | ||
− | local function render(frame) | + | local function render(frame, event, map) |
− | local event = frame.args[1] or "??" | + | local event = event or frame.args[1] or "??" |
− | local map = frame.args[2] or "??" | + | local map = map or frame.args[2] or "??" |
local success, data = U.loadData("Data/Map/" .. event) | local success, data = U.loadData("Data/Map/" .. event) | ||
if not success then return "Unknown event: " .. event end | if not success then return "Unknown event: " .. event end | ||
Line 39: | Line 52: | ||
local tbl = {} | local tbl = {} | ||
local types = {} | local types = {} | ||
− | |||
-- TODO: assuming 0-1 single ship reward on all difficulties | -- TODO: assuming 0-1 single ship reward on all difficulties | ||
local ship = false | local ship = false | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
local function setData(diff) | local function setData(diff) | ||
for _, v in ipairs(data[diff] or {}) do | for _, v in ipairs(data[diff] or {}) do | ||
if v.choice then | 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 | ||
end | end | ||
end | end | ||
− | local function getCount(name, diff) | + | local function getCount(name, diff, i) |
− | return ((tbl[name] or {})[diff] or {}).count or 0 | + | 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 | end | ||
− | local function getLevel(name, diff) | + | local function getLevel(name, diff, i) |
− | local level = ((tbl[name] or {})[diff] or {}).level | + | 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 '' | return level and string.format(" (★%d)", level) or '' | ||
end | end | ||
− | local function getCell(name, diff) | + | local function getCell(name, diff, i) |
− | local count = getCount(name, diff) | + | local count = getCount(name, diff, i) |
− | return (count == 0 and '' or count) .. getLevel(name, diff) | + | return (count == 0 and '' or count) .. getLevel(name, diff, i) |
end | end | ||
local function getAsset(name) | local function getAsset(name) | ||
Line 97: | Line 118: | ||
table.insert(result, template.footer) | table.insert(result, template.footer) | ||
table.insert(result, template.item_header) | table.insert(result, template.item_header) | ||
+ | --[[ | ||
local sortedIndex = U.imap(index, function(name, i) return { name = name, i = i, typ = types[name] } end) | local sortedIndex = U.imap(index, function(name, i) return { name = name, i = i, typ = types[name] } end) | ||
table.sort(sortedIndex, function (x, y) | table.sort(sortedIndex, function (x, y) | ||
Line 108: | Line 130: | ||
local sortValues = {} | local sortValues = {} | ||
for i, e in ipairs(sortedIndex) do sortValues[e.name] = i end | for i, e in ipairs(sortedIndex) do sortValues[e.name] = i end | ||
+ | ]]-- | ||
+ | -- sortValues[name] | ||
for i, name in ipairs(index) do | for i, name in ipairs(index) do | ||
− | table.insert(result, string.format(template. | + | if types[name] == 'choice' then |
− | + | local names = U.split(name, '||') | |
− | + | local name1 = names[1]:sub(1, -2) | |
+ | local name2 = names[2]:sub(1, -2) | ||
+ | table.insert(result, string.format(template.item_row_choice1, 0, getAsset(name1), name1, | ||
+ | getCell(name, 'Casual', 1), getCell(name, 'Easy', 1), getCell(name, 'Medium', 1), getCell(name, 'Hard', 1))) | ||
table.insert(result, template.choice) | table.insert(result, template.choice) | ||
+ | table.insert(result, string.format(template.item_row_choice2, 0, getAsset(name2), name2, | ||
+ | getCell(name, 'Casual', 2), getCell(name, 'Easy', 2), getCell(name, 'Medium', 2), getCell(name, 'Hard', 2))) | ||
+ | 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 | ||
end | end | ||
Line 119: | Line 151: | ||
end | end | ||
− | return { render = render } | + | local function test() |
+ | mw.log(render(nil, 'Summer 2022 Event', 'E-1')) | ||
+ | end | ||
+ | |||
+ | return { render = render, test = test } |
Revision as of 09:41, 27 August 2022
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_row_choice1 = [=[|-
|data-sort-value="%s" style="background-color:#eef2f7;font-size:12px;line-height:14px;border-top:4px solid grey"|%s<br>[[%s]]
|style="background-color:#eef2f7;font-size:18px;border-top:4px solid grey"|%s
|style="background-color:#eef2f7;font-size:18px;border-top:4px solid grey"|%s
|style="background-color:#eef2f7;font-size:18px;border-top:4px solid grey"|%s
|style="background-color:#eef2f7;font-size:18px;border-top:4px solid grey"|%s]=],
item_row_choice2 = [=[|-
|data-sort-value="%s" style="background-color:#eef2f7;font-size:12px;line-height:14px;border-bottom:4px solid grey"|%s<br>[[%s]]
|style="background-color:#eef2f7;font-size:18px;border-bottom:4px solid grey"|%s
|style="background-color:#eef2f7;font-size:18px;border-bottom:4px solid grey"|%s
|style="background-color:#eef2f7;font-size:18px;border-bottom:4px solid grey"|%s
|style="background-color:#eef2f7;font-size:18px;border-bottom:4px solid grey"|%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 name1 = names[1]:sub(1, -2)
local name2 = names[2]:sub(1, -2)
table.insert(result, string.format(template.item_row_choice1, 0, getAsset(name1), name1,
getCell(name, 'Casual', 1), getCell(name, 'Easy', 1), getCell(name, 'Medium', 1), getCell(name, 'Hard', 1)))
table.insert(result, template.choice)
table.insert(result, string.format(template.item_row_choice2, 0, getAsset(name2), name2,
getCell(name, 'Casual', 2), getCell(name, 'Easy', 2), getCell(name, 'Medium', 2), getCell(name, 'Hard', 2)))
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 }