WIKI公告栏
欢迎各位引航者访问卡拉彼丘WIKI,由于游客访问页面会有一定的页面旧版缓存,建议你登陆B站账号进行浏览,如果您觉得本WIKI有帮助到你,欢迎推荐给身边的引航者。
全站通知:

模块:角色

来自卡拉彼丘WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:角色/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