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

模块:Roles

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

此模块用于输出角色数据,一般用于角色页的角色模板和角色筛选表。


local p = {}

local format = string.format
local data = mw.loadData("Module:Roles/Data")
local a = require("Module:ACandy")
local tr, th, td = a.tr, a.th, a.td
local Raw = a.Raw


local function getPageTitle()
	return mw.title.getCurrentTitle().text
end


-------角色页角色模板角色信息部分-------
p["角色信息"] = function()
	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 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
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 Roletable = a.table { class = "klbqtable", style = "font-size: 14px; width: 100%; text-align: center;",
		Row("声优", { "中文:", RoleInfo.CvCn, a.br, "日文:", RoleInfo.Cv }),
		Row("画师", "卡丘画师协会"),
		Row("生日", zhcn:formatDate("Mj日", RoleInfo.Birthday)),
		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,
	}
	local skills = {} -- 1、2、3分别为主动、被动、终极技能
	for i = 1, 3 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;" }]

	local function SkillDetail(skillType)
		local num = skillTypeToNum[skillType]
		local skill = skills[num]
		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(skill.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(skill.desc) },
						divtabs2 { Raw(skill.video) },
						divtabs2 { Raw(skill.analysis) },
					},
				},
			},
		}
	end

	local Roleskilltable = a.table { class = "klbqtable", style = "width: 100%;text-align: center",
		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()
	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 zhcn = mw.language.new("zh-cn")
	local allrows = ""

	local RoleInfo = data[rolename]
	assert(RoleInfo, "角色数据不存在")

	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,
			['生日'] = zhcn:formatDate("Mj日", RoleInfo.Birthday),
			['身高'] = RoleInfo.Height,
			['体重'] = RoleInfo.Weight,
			['活动区域'] = RoleInfo.Apartment,
			['Color'] = frame.args['Color']
		}
	}
	return allrows
end


return p