-- 模块: llsifasptadd
-- 迁移自模板: {{llsifasptadd}}
-- 功能概述:
-- 1. 读取所有“数字命名参数” (例如 |30=..., |25=...) ,其值为成员卡ID列表,用逗号或、分隔。
-- 2. 为每个成员输出 Hover,before/after 分别为 Mini 与 Mini_t 图。
-- 可通过 |path<加成值>_<序号>= 自定义 before 图文件名;|path<加成值>_<序号>_t= 自定义 after 图文件名。
-- 末尾文件扩展由 |suffix=(默认 png)决定。
-- 3. 第二列显示 “<加成值>%(最大 X%)” 规则:
-- mode 空: +5%
-- mode=2: +15%
-- mode=3: 若加成值=30 -> +20%;加成值=15 -> +15%;其余无“最大”说明。
-- 4. 表格 class: wikitable mw-collapsible mw-collapsed
-- 5. 表后附注释,说明突破界限加成规则;drop 参数(默认 pt) 可替换“pt”。
-- 6. 兼容传入成员 ID 用英文逗号或“、”分割,自动去重与去空。
local getArgs = require('Module:Arguments').getArgs
local p = {}
-- 拆分成员列表
local function splitMembers(raw)
if not raw or raw == '' then return {} end
-- 统一分隔符为 、
raw = mw.ustring.gsub(raw, '[,,]', '、')
local list = {}
local exists = {}
for part in mw.ustring.gmatch(raw, '([^、]+)') do
part = mw.text.trim(part)
if part ~= '' and not exists[part] then
table.insert(list, part)
exists[part] = true
end
end
return list
end
-- 构建单个 Hover (使用模板:Hover)
local function buildHover(frame, beforeFile, afterFile)
-- 输出使用 90px 宽度,与原模板 style=width:90px; 一致
return frame:expandTemplate{
title = 'Hover',
args = {
before = frame:callParserFunction('#img', { frame:callParserFunction('filepath', { beforeFile }), style = 'width:90px;' }),
after = frame:callParserFunction('#img', { frame:callParserFunction('filepath', { afterFile }), style = 'width:90px;' }),
dis = 'inline-block',
width = '90px',
height = '90px'
}
}
end
local function buildMaxText(mode, base)
local b = tonumber(base)
if not b then return '' end
if mode == '2' then
return mw.ustring.format('(最大%d%%)', b + 15)
elseif mode == '3' then
if b == 30 then
return mw.ustring.format('(最大%d%%)', b + 20)
elseif b == 15 then
return mw.ustring.format('(最大%d%%)', b + 15)
else
return ''
end
else
return mw.ustring.format('(最大%d%%)', b + 5)
end
end
function p.main(frame)
local args = getArgs(frame, { parentFirst = true })
local suffix = args.suffix or 'png'
local mode = args.mode and tostring(args.mode) or ''
local drop = args.drop or 'pt'
-- 收集数值 key
local numericKeys = {}
for k, v in pairs(args) do
if type(k) == 'number' and v and v ~= '' then
table.insert(numericKeys, k)
end
end
table.sort(numericKeys, function(a,b) return tonumber(a) < tonumber(b) end)
local root = mw.html.create('table')
:addClass('wikitable')
:addClass('mw-collapsible')
:addClass('mw-collapsed')
local header = root:tag('tr')
header:tag('th'):wikitext('加成成员')
header:tag('th'):wikitext('加成幅度')
for _, key in ipairs(numericKeys) do
local rawList = args[key]
local members = splitMembers(rawList)
local row = root:tag('tr')
-- 第一列:多个 Hover
local tdMembers = row:tag('td')
for i, id in ipairs(members) do
local beforeParam = args['path' .. key .. '_' .. i]
local afterParam = args['path' .. key .. '_' .. i .. '_t']
local beforeFile = beforeParam or mw.ustring.format('LLAS_Card_%s_Mini.%s', id, suffix)
local afterFile = afterParam or mw.ustring.format('LLAS_Card_%s_Mini_t.%s', id, suffix)
tdMembers:wikitext(buildHover(frame, beforeFile, afterFile) .. ' ')
end
-- 第二列:加成幅度
local maxText = buildMaxText(mode, key)
local tdAdd = row:tag('td')
tdAdd:wikitext(mw.ustring.format('%s%%%s', key, maxText))
end
local note
if mode == '2' then
note = mw.ustring.format('每张卡每进行一次突破界限,活动%s加成幅度依次上涨5/4/3/2/1%%,直到达到最大值为止。', drop)
elseif mode == '3' then
note = mw.ustring.format('奖励UR卡每进行一次突破界限,活动%s加成幅度依次上涨10/4/3/2/1%%,奖励SR卡每进行一次突破界限,活动%s加成幅度依次上涨5/4/3/2/1%%;直到达到最大值为止。卡池UR突破后活动%s加成幅度不上涨。本表格的加成并不包括成员额外加成。', drop, drop, drop)
else
note = mw.ustring.format('每张卡每进行一次突破界限,活动%s加成幅度上涨1%%', drop)
end
local result = tostring(root)
result = result .. '\n*注:光标悬停或移动端点击显示觉醒头像。' .. note
return result
end
return p