• 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"

From Kancolle Wiki
Jump to navigation Jump to search
m
Line 2: Line 2:
  
 
local template = {
 
local template = {
top_header = [[{|style="text-align:center"
+
footer = "|}",
 +
header = [[{|style="text-align:center;width:100%"
 
!colspan="5" style="background-color:#3baef5;color:white"|Rewards]],
 
!colspan="5" style="background-color:#3baef5;color:white"|Rewards]],
footer = [[|}]],
+
ship_row = [=[|-
ship = [=[|-
+
!style="background-color:#3baef5;color:white;width:40%%"|Ship
!style="background-color:#3baef5;color:white"|Ship
 
 
|colspan="4" style="background-color:#eef2f7"|%s<br>[[%s]]]=],
 
|colspan="4" style="background-color:#eef2f7"|%s<br>[[%s]]]=],
header = [[|-
+
item_header = [[{|style="text-align:center;width:100%" class="sortable"
!style="background-color:#3baef5;color:white"|Equipment/Item
+
!style="background-color:#3baef5;color:white;width:40%"|Item/Equipment
!style="background-color:#3baef5;color:white;width:15%"|丁<br>Casual
+
!class="unsortable" style="background-color:#3baef5;color:white;width:15%"|丁<br>Casual
!style="background-color:#3baef5;color:white;width:15%"|丙<br>Easy
+
!class="unsortable" style="background-color:#3baef5;color:white;width:15%"|丙<br>Easy
!style="background-color:#3baef5;color:white;width:15%"|乙<br>Medium
+
!class="unsortable" style="background-color:#3baef5;color:white;width:15%"|乙<br>Medium
!style="background-color:#3baef5;color:white;width:15%"|甲<br>Hard]],
+
!class="unsortable" style="background-color:#3baef5;color:white;width:15%"|甲<br>Hard]],
row = [=[|-
+
item_row = [=[|-
|style="background-color:#eef2f7;font-size:12px"|%s<br>[[%s]]
+
|data-sort-value="%s" style="background-color:#eef2f7;font-size:12px"|%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
Line 52: Line 52:
 
end
 
end
 
local function getCount(name, diff)
 
local function getCount(name, diff)
return ((tbl[name] or {})[diff] or {}).count or ''
+
return ((tbl[name] or {})[diff] or {}).count or 0
 
end
 
end
 
local function getLevel(name, diff)
 
local function getLevel(name, diff)
Line 59: Line 59:
 
end
 
end
 
local function getCell(name, diff)
 
local function getCell(name, diff)
return getCount(name, diff) .. getLevel(name, diff)
+
local count = getCount(name, diff)
 +
return (count == 0 and '' or count) .. getLevel(name, diff)
 
end
 
end
 
local function getAsset(name)
 
local function getAsset(name)
Line 68: Line 69:
 
setData('Easy')
 
setData('Easy')
 
setData('Casual')
 
setData('Casual')
local result = { template.top_header }
+
local result = { template.header }
 
if ship then
 
if ship then
table.insert(result, string.format(template.ship, getAsset(ship), ship))
+
table.insert(result, string.format(template.ship_row, getAsset(ship), ship))
 
end
 
end
table.insert(result, template.header)
+
table.insert(result, template.footer)
for _, name in ipairs(index) do
+
table.insert(result, template.item_header)
table.insert(result, string.format(template.row, getAsset(name), name, getCell(name, 'Casual'), getCell(name, 'Easy'), getCell(name, 'Medium'), getCell(name, 'Hard')))
+
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
 +
for i, name in ipairs(index) do
 +
table.insert(result, string.format(template.item_row, sortValues[name], getAsset(name), name,
 +
getCell(name, 'Casual'), getCell(name, 'Easy'), getCell(name, 'Medium'), getCell(name, 'Hard')))
 
end
 
end
 
table.insert(result, template.footer)
 
table.insert(result, template.footer)

Revision as of 17:49, 26 June 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"|Rewards]],
	ship_row = [=[|-
!style="background-color:#3baef5;color:white;width:40%%"|Ship
|colspan="4" style="background-color:#eef2f7"|%s<br>[[%s]]]=],
	item_header = [[{|style="text-align:center;width:100%" class="sortable"
!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"|%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]=],
}

local assetTypes = { item = 'Item Icon', equipment = 'Equipment Card', ship = 'Ship Banner' }

local assetSizes = { item = '75px', equipment = '75px', ship = '240px' }

local function render(frame)
	local event = frame.args[1] or "??"
	local map = 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
			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
	local function getCount(name, diff)
		return ((tbl[name] or {})[diff] or {}).count or 0
	end
	local function getLevel(name, diff)
		local level = ((tbl[name] or {})[diff] or {}).level
		return level and string.format(" (★%d)", level) or ''
	end
	local function getCell(name, diff)
		local count = getCount(name, diff)
		return (count == 0 and '' or count) .. getLevel(name, diff)
	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 = { template.header }
	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
	for i, name in ipairs(index) do
		table.insert(result, string.format(template.item_row, sortValues[name], getAsset(name), name,
			getCell(name, 'Casual'), getCell(name, 'Easy'), getCell(name, 'Medium'), getCell(name, 'Hard')))
	end
	table.insert(result, template.footer)
	return table.concat(result, "\n")
end

return { render = render }