local p = {}
-- 根据数值返回属性描述
local function get_attr_text(val)
local n = tonumber(val)
if not n then return val end
if n == 0 then return "0" end
if n >= 1 and n <= 2 then return "非常低" end
if n >= 3 and n <= 4 then return "低" end
if n >= 5 and n <= 6 then return "中等" end
if n >= 7 and n <= 8 then return "高" end
if n >= 9 then return "非常高" end
return "非常高"
end
-- 获取特定星级的数值/文本
local function get_star_prop(str, star_index)
if not str or str == "" then return "" end
local parts = mw.text.split(str, "[,,]")
local val = parts[star_index + 1]
if not val or mw.text.trim(val) == "" then
val = parts[1]
end
return mw.text.trim(val)
end
-- 处理技能描述(高亮 @@内容-@@)
local function parse_desc(text)
if not text then return "" end
return string.gsub(text, "@@(.-)-@@", '<span style="color:#15d4d4; font-weight:bold;">%1</span>')
end
-- 主函数
function p.main(frame)
local args = frame:getParent().args
local char_name = args['name'] or '未知角色'
-- 配置 Tabs 样式
local tabsArgs = {
color = "#2980b9",
ContainerWidth = "100%",
LabelBackgroundColor = "#f5f5f5",
LabelColor = "#666",
LabelBorderColor = "#ccc",
-- 透明化与去内边距
TextPadding = "0",
TextBackgroundColor = "transparent",
TextBorderColor = "transparent",
}
-- 预先获取 0 星的基础数值,用于对比
local cd_0 = get_star_prop(args['cd'], 0)
local cost_0 = get_star_prop(args['cost'], 0)
-- 循环生成 0 到 5 星的面板内容
for star = 0, 5 do
-- CD 和 费用 变色逻辑
local cd_val = get_star_prop(args['cd'], star)
-- 如果当前数值不等于0星数值,则标青色
if cd_val ~= cd_0 then
cd_val = string.format('<span style="color:#15d4d4; font-weight:bold;">%s</span>', cd_val)
end
local cost_val = get_star_prop(args['cost'], star)
if cost_val ~= cost_0 then
cost_val = string.format('<span style="color:#15d4d4; font-weight:bold;">%s</span>', cost_val)
end
local skills_html = ""
for i = 1, 4 do
local cat = args['skill'..i..'_cat']
if cat and cat ~= "" then
local s_name = args['skill'..i..'_name'] or ""
-- 处理图片路径逻辑
local img_name = args['skill'..i..'_image']
if img_name and mw.text.trim(img_name) ~= "" then
-- 如果有传入自定义图片,去除首尾空格
img_name = mw.text.trim(img_name)
-- 检查是否以 File: 或 file: 开头,如果不是则补全
if not string.find(img_name, "^[Ff]ile:") then
img_name = "File:" .. img_name
end
else
-- 如果没有传入,使用默认拼接方式
img_name = string.format("File:盲盒派对-技能图标-%s-%s.png", char_name, cat)
end
local level_add_text = ""
if args['skill'..i..'_levelup'] and (args['skill'..i..'_levelup'] ~= "") then
local levels = {[1]="+1", [2]="+2", [3]="+4", [4]="+6", [5]="+9"}
if star > 0 and levels[star] then
level_add_text = string.format(" <span style=\"color: #ebda1c\">%s</span>", levels[star])
end
end
local raw_desc_str = args['skill'..i..'_desc'] or ""
local desc_parts = mw.text.split(raw_desc_str, ";;")
local current_desc = desc_parts[star + 1]
if not current_desc or mw.text.trim(current_desc) == "" then
current_desc = desc_parts[1]
end
current_desc = parse_desc(current_desc)
-- 技能行
skills_html = skills_html .. string.format([=[
|-
! scope="row"| %s
| [[%s|50px]]<br>'''%s%s'''
| %s
]=], cat, img_name, s_name, level_add_text, current_desc)
end
end
-- 在循环内部生成星级效果表
local star_table = [[
<div class="mw-heading mw-heading3"><h3>星级</h3></div>
{| class="wikitable"
|-
! 星级 !! 效果 !! 升星所需碎片
]]
local frags_def = {30, 30, 30, 60, 90}
local stars_display = {"⭐", "⭐⭐", "⭐⭐⭐", "⭐⭐⭐⭐", "⭐⭐⭐⭐⭐"}
for k = 1, 5 do
local effect = args['star'..k..'_effect'] or "暂无效果"
local frag = args['star'..k..'_frag'] or frags_def[k]
-- 将效果文本加粗,表示已激活
if star >= k then
effect = "'''" .. effect .. "'''"
-- 如果你希望激活的行背景也变色,可以在这里加 style,例如:
-- style="background-color:#fffbea;"
end
star_table = star_table .. string.format([[
|-
| %s || %s || %s
]], stars_display[k], effect, frag)
end
star_table = star_table .. "\n|}"
local content = string.format([[
<div class="mw-heading mw-heading3"><h3>属性</h3></div>
{| class="wikitable" style="text-align:center;"
! 属性名称 !! 属性描述
|-
| 生命 || %s
|-
| 攻击 || %s
|-
| 支援 || %s
|-
| 冷却 || %s
|-
| 费用 || %s
|-
| 品质 || %s
|-
| 攻击类型 || %s
|-
| 好感礼物 || %s
|}
<div class="mw-heading mw-heading3"><h3>技能</h3></div>
{| class="wikitable col3-left" style="max-width: 800px; text-align:center;"
! 技能类别 !! 技能名称 !! 技能描述
%s
|}
%s
]],
get_attr_text(args['hp']),
get_attr_text(args['atk']),
get_attr_text(args['support']),
cd_val,
cost_val,
args['quality'] or "R",
args['type'] or "物理",
args['gift'] or "无",
skills_html,
star_table -- 将生成的星级表拼接到 Tab 内容末尾
)
-- Tab 标题
local tabName = star .. "星"
tabsArgs['bt' .. (star + 1)] = tabName
tabsArgs['tab' .. (star + 1)] = content
end
return frame:expandTemplate{ title = "Tabs", args = tabsArgs }
end
return p