WIKI公告栏
欢迎各位引航者访问卡拉彼丘WIKI,由于游客访问页面会有一定的页面旧版缓存,建议你登陆B站账号进行浏览,如果您觉得本WIKI有帮助到你,欢迎推荐给身边的引航者。
欢迎各位引航者访问卡拉彼丘WIKI,由于游客访问页面会有一定的页面旧版缓存,建议你登陆B站账号进行浏览,如果您觉得本WIKI有帮助到你,欢迎推荐给身边的引航者。
全站通知:
模块:角色
刷
历
编
跳到导航
跳到搜索
此模块的文档可以在模块:角色/doc创建
local p = {}
local format = string.format
local data = mw.loadData("Module:角色/Data") -- 加载角色数据
local a = require("Module:ACandy") -- 引入ACandy模块
local tr, th, td = a.tr, a.th, a.td
local Raw = a.Raw
-- 角色评论标题映射
local RoleCommentsTitle = { ["令"] = "令的手工俱乐部",
["香奈美"] = "香奈美的粉丝团",
["芙拉薇娅"] = "芙拉薇娅的围棋室",
["加拉蒂亚·利里"] = "加拉蒂亚的魔术团",
["玛德蕾娜·利里"] = "玛德蕾娜的绘梦室",
["米雪儿·李"] = "米雪儿的猫猫军团",
["绯莎"] = "绯莎的秘训基地",
["伊薇特"] = "伊薇特的小熊团",
["信"]= "信的侦探推理社",
["奥黛丽·格罗夫"] = "奥黛丽的执事团",
["明"] = "明的暗影刺客团",
["梅瑞狄斯"] = "梅瑞狄斯科考团",
["星绘"]= "星绘的疗愈小屋",
["拉薇"]= "拉薇的茗香茶社",
["艾卡"] = "艾卡的吉他室",
["心夏"]= "心夏的无人机小队",
["白墨"] = "白墨的涂鸦社",
["珐格兰丝"] = "珐格兰丝的植物园",
["忧雾"] = "忧雾的图书角"
}
-- 获取当前页面标题
local function getPageTitle()
return mw.title.getCurrentTitle().text
end
--[[角色页角色模板角色信息部分--]]
p["角色信息"] = function(frame)
local roleName = getPageTitle() -- 获取角色名称
local RoleInfo = data[roleName] -- 获取角色信息
assert(RoleInfo, "角色数据不存在") -- 确保角色数据存在
local Th = th[{ colspan = 2, style = "text-align:center;border-radius: 0;" }] -- 创建表头
local Td = td[{ style = "border-radius: 0;" }] -- 创建表格数据单元格
local CommentsTitle = RoleCommentsTitle[roleName] -- 获取评论标题
local css = frame:callParserFunction('#css', '.comments-title { max-width: 0; white-space: nowrap; }' ..
'.comments-title::before { position: absolute; content: "' .. CommentsTitle .. '"; }')
--- 定位图标链接
local function ProfessionIconLink(profession)
return a.span { class = "badge rounded-pill bg-primary", style = "padding: 5px; border-radius: 5px; background-color: #DDD",
Raw(format(
'[[File:角色定位-%s.png|20px|link=角色定位#%s|alt=]] [[角色定位#%s|<span style="color: #000;">%s</span>]]',
profession, profession, profession, profession
))
}
end
--- 阵营图标链接
local function CampIconLink(camp)
return Raw(format(
'[[File:%s阵营小图标.png|30px|link=角色阵营#%s|alt=]] [[角色阵营#%s|<span style="color: #000;">%s</span>]]',
camp, camp, camp, camp
))
end
-- 创建角色信息表格
local Roletable = a.table { class = "klbqtable", style = "text-align: center; width: 100%; font-weight: bold;",
tr {
td { rowspan = 3, colspan = 2, style = "border-bottom-left-radius: 0;", "[[文件:", roleName, "头像.png|80px|class=radius50]]" },
td { style = "border-bottom-right-radius: 0;", roleName },
},
tr {
Td { RoleInfo.NameEn }, -- 英文名
},
tr {
Td / a.span { lang = "ja", RoleInfo.NameJp } -- 日文名
},
tr {
Th "性别", -- 性别
Td { RoleInfo.Sex },
},
tr {
Th "身份", -- 身份
Td / a.span { class = "badge rounded-pill bg-primary", style = "color: #fff;padding: 5px;border-radius: 5px;background-color: #C02A35",
RoleInfo.Title,
},
},
tr {
Th "定位", -- 定位
Td { ProfessionIconLink(RoleInfo.Profession) },
},
tr {
Th "阵营", -- 阵营
Td { CampIconLink(RoleInfo.Camp) },
},
tr {
th { colspan = 2, style = "text-align:center;border-top-left-radius: 0;", "简介" }, -- 简介
td { style = "border-top-right-radius: 0;", RoleInfo.Desc },
},
}
return a.h2 "角色信息", Roletable, a.br, css -- 返回角色信息
end
--[[角色页角色模板角色设定部分--]]
p["角色设定"] = function()
local roleName = getPageTitle() -- 获取角色名称
local RoleInfo = data[roleName] -- 获取角色信息
assert(RoleInfo, "角色数据不存在") -- 确保角色数据存在
-- 创建表格行函数
local function Row(tableHeader, tableData)
return tr {
th[{ style = "width: 25%;" }](tableHeader), -- 表头
td(tableData), -- 表格数据
}
end
local zhcn = mw.language.new("zh-cn") -- 创建中文语言对象
-- 检查生日是否为有效的日期格式
local formattedBirthday
if RoleInfo.Birthday == "" then
formattedBirthday = RoleInfo.Birthday
else
formattedBirthday = zhcn:formatDate("Mj日", RoleInfo.Birthday) -- 格式化生日
end
-- 创建角色设定表格
local Roletable = a.table { class = "klbqtable", style = "font-size: 14px; width: 100%; text-align: center;",
Row("声优", { "中文:", RoleInfo.CvCn, a.br, "日文:", RoleInfo.Cv }), -- 声优
Row("画师", "卡丘画师协会"), -- 画师
Row("生日", formattedBirthday), -- 生日
Row("星座", RoleInfo.Constellation), -- 星座
Row("年龄", RoleInfo.Age), -- 年龄
Row("身高", RoleInfo.Height), -- 身高
Row("体重", RoleInfo.Weight), -- 体重
Row("活动区域", RoleInfo.Apartment), -- 活动区域
}
return a.h2 "角色设定", Roletable -- 返回角色设定
end
--[[角色页角色模板角色技能部分--]]
p["角色技能"] = function(frame)
local args = frame:getParent().args -- 获取父框架的参数
local role = getPageTitle() -- 获取角色名称
local skillTypeToNum = {
["主动"] = 1, -- 主动技能
["被动"] = 2, -- 被动技能
["终极"] = 3, -- 终极技能
["战术"] = 4, -- 战术技能
}
local skills = {} -- 1、2、3分别为主动、被动、终极技能
for i = 1, 4 do
local prefix = "技能" .. i -- 获取技能前缀
skills[i] = {
name = args[prefix], -- 技能名称
desc = args[prefix .. "描述"], -- 技能描述
video = args[prefix .. "视频演示"], -- 视频演示链接
analysis = args[prefix .. "解析"], -- 技能解析
}
end
local div, span = a.div, a.span
local divtabs1 = div[{ class = "resp-tab-content", style = "display: block; text-align: left; height: 240px;" }] -- 技能描述的标签
local divtabs2 = div[{ class = "resp-tab-content", style = "text-align: left; height: 240px;overflow: scroll" }] -- 视频和解析的标签
-- 技能详情创建函数
local function SkillDetail(skillType)
local num = skillTypeToNum[skillType] -- 获取技能类型编号
local skill = skills[num] -- 获取对应技能
local skilldata = mw.text.jsonDecode(mw.title.new('模块:弦能增幅网络/Skill.json'):getContent() or '{}') -- 获取技能数据
local roleskill = skilldata[role] -- 获取角色技能
assert(roleskill, "角色名称错误: " .. (role or "未知")) -- 确保角色名称存在
local RoleSkillType1 = skillType .. "技能" -- 获取技能类型
local RoleSkillType = roleskill[RoleSkillType1] -- 获取对应技能类型
assert(RoleSkillType, "技能类型错误: " .. (RoleSkillType1 or "未知")) -- 确保技能类型存在
local skillinfo = RoleSkillType[1] -- 获取技能信息
assert(skillinfo, RoleSkillType1 .. " 中没有技能") -- 确保技能信息存在
return {
tr / th { colspan = 2, style = "text-align:center;font-size: 18px", skillType, "技能" }, -- 技能标题
tr {
td { style = "width:20%;font-weight:bold;font-size: 20px;",
"[[文件:", role, "技能", num, ".png]]", a.br, Raw(skillinfo['Name']), -- 技能名称及图标
},
td[{ style = "height: 307px;" }] / div["main-line-wrap"] / div["resp-tabs"] {
a.ul { class = "resp-tabs-list clearfix",
a.li["active bili-list-style"] / span { class = "tab-panel", "技能描述" }, -- 描述标签
a.li["bili-list-style"] / span { class = "tab-panel", "视频演示" }, -- 视频标签
a.li["bili-list-style"] / span { class = "tab-panel", "技能解析" }, -- 解析标签
},
div { class = "resp-tabs-container", style = "padding:10px;font-size: 16px",
divtabs1 { Raw(skillinfo['Intro']) }, -- 技能描述内容
divtabs2 { Raw(skill.video) }, -- 视频内容
divtabs2 { Raw(skill.analysis) }, -- 解析内容
},
},
},
}
end
-- 创建角色技能表格
local Roleskilltable = a.table { class = "klbqtable", style = "width: 100%;text-align: center",
SkillDetail("主动"), -- 主动技能
SkillDetail("被动"), -- 被动技能
SkillDetail("终极"), -- 终极技能
SkillDetail("战术"), -- 战术技能
}
return a.h2 "角色技能", Roleskilltable -- 返回角色技能信息
end
--[[角色页角色模板角色武器部分--]]
p["角色武器"] = function()
local RoleInfo = data[getPageTitle()] -- 获取角色信息
assert(RoleInfo, "角色数据不存在") -- 确保角色数据存在
local head = a.li "武器详情、原型资料等请前往武器页查看。" -- 武器信息提示
local RoleWeapontable = a.table { class = "klbqtable", style = "text-align:center;width:100%",
tr {
td { style = "font-weight: bold; font-size: 18px;", "[[", RoleInfo.Weapon, "]]" }, -- 武器名称
td { style = "font-weight: bold;", RoleInfo.Weapontype }, -- 武器类型
},
tr / td { colspan = 2, RoleInfo.Weapondesc }, -- 武器描述
tr / td { colspan = 2, "[[File:", getPageTitle(), "-weapon.png|300px]]" }, -- 武器图片
}
return a.h2 "角色武器", head, RoleWeapontable -- 返回武器信息
end
--[[角色筛选表页面模块--]]
p["角色筛选"] = function()
local html = mw.html.create() -- 创建HTML对象
local resultList = {} -- 创建一个空表用于存储结果
for value, role in pairs(data) do -- 遍历所有角色数据
local roleHTML = html
:tag('tr'):addClass('divsort'):attr('data-param1', role.Camp):attr('data-param2', role.Profession):attr(
'data-param3', role.Weapontype) -- 添加角色分类属性
:tag('td'):tag('div'):cssText(
'width: 80px; border-radius: 50%; margin: 0 auto; font-size: 15px; font-weight: bold; padding: 2px')
:wikitext('[[File:' .. role.Iconfile .. '|class=profilepicture|link=' .. value .. ']]<br>[[' .. value .. ']]') -- 角色图标及名称
:done():done()
:tag('td'):wikitext('[[文件:' .. role.Camp .. '阵营小图标.png|30px]]' .. role.Camp):done() -- 阵营图标及名称
:tag('td'):wikitext('中文:' .. role.CvCn .. '<br>日文:' .. role.Cv):done() -- 声优信息
:tag('td'):tag('span'):addClass('badge rounded-pill bg-primary')
:cssText('width: 60px; padding: 5px; border-radius: 5px; background-color: #DDD')
:wikitext('[[File:角色定位-' ..
role.Profession ..
'.png|20px|link=角色定位#' ..
role.Profession ..
'|alt=]] [[角色定位#' .. role.Profession .. '|<span style="color: #000">' .. role.Profession .. '</span>]]') -- 定位信息
:done():done()
:tag('td'):wikitext(role.Weapontype):done() -- 武器类型
:tag('td'):addClass('hidden-xs'):wikitext(role.Speed):done() -- 速度
:tag('td'):addClass('hidden-xs'):wikitext(role.Armor):done() -- 护甲
table.insert(resultList, tostring(roleHTML)) -- 将生成的HTML代码添加到结果表中
end
local result = table.concat(resultList) -- 将结果表中的所有HTML代码连接在一起
return result -- 返回连接后的结果
end
-------角色单项信息拉取模块-------
function p.getInfo(frame)
local attr = frame.args[1] -- 获取属性名称
assert(attr and attr ~= "", "缺少参数1") -- 确保参数存在
attr = mw.text.trim(attr)
local name = mw.text.trim(frame.args[2] or "null") -- 获取角色名称
local info = data[name] -- 获取角色信息
if not (info and info[attr]) then
return mw.text.trim(frame.args[3] or "") -- 返回默认值
end
return info[attr] -- 返回指定属性值
end
--[[角色设定卡生成函数--]]
p["角色设定卡"] = function(frame)
local rolename = frame.args[1] -- 获取角色名称
local allrows = ""
local RoleInfo = data[rolename] -- 获取角色信息
assert(RoleInfo, "角色数据不存在") -- 确保角色数据存在
local zhcn = mw.language.new("zh-cn") -- 创建中文语言对象
-- 检查生日是否为有效的日期格式
local formattedBirthday
if RoleInfo.Birthday == "" then
formattedBirthday = RoleInfo.Birthday
else
formattedBirthday = zhcn:formatDate("Mj日", RoleInfo.Birthday) -- 格式化生日
end
-- 扩展角色设定卡模板
allrows = frame:expandTemplate {
title = '角色设定卡/core', -- 模板标题
args = {
['中文名'] = rolename, -- 中文名
['中文全名'] = frame.args['中文全名'], -- 中文全名
['相关人士'] = frame.args['相关人士'], -- 相关人士
['角色介绍'] = frame.args['角色介绍'], -- 角色介绍
['萌点'] = frame.args['萌点'], -- 萌点
['英文名'] = RoleInfo.NameEn, -- 英文名
['日文名'] = RoleInfo.NameJp, -- 日文名
['阵营'] = RoleInfo.Camp, -- 阵营
['中文声优'] = RoleInfo.CvCn, -- 中文声优
['日文声优'] = RoleInfo.Cv, -- 日文声优
['年龄'] = RoleInfo.Age, -- 年龄
['星座'] = RoleInfo.Constellation, -- 星座
['生日'] = formattedBirthday, -- 生日
['身高'] = RoleInfo.Height, -- 身高
['体重'] = RoleInfo.Weight, -- 体重
['活动区域'] = RoleInfo.Apartment, -- 活动区域
['Color'] = frame.args['Color'] -- 颜色属性
}
}
return allrows -- 返回生成的角色设定卡
end
return p