置顶公告:【置顶】关于临时开启评论区所有功能的公告(2022.10.22) | 【置顶】关于本站Widget恢复使用的公告
  • 你好~!欢迎来到萌娘百科镜像站!如需查看或编辑,请联系本站管理员注册账号。
  • 本镜像站和其他萌娘百科的镜像站无关,请注意分别。

Module:PCR人物属性

贴贴♀百科,万娘皆可贴的百科全书!转载请标注来源页面的网页链接,并声明引自贴贴百科。内容不可商用。
跳到导航 跳到搜索
Template-info.svg 模块文档  [查看] [编辑] [历史] [刷新]

本模块的设计目的为取代模板{{PCR人物属性}}中的wiki代码,以便更灵活地调整不同情况下表格的结构,同时消除代码冗余,降低维护成本。然而因为wiki用户群多数不太了解lua,可能反而更难维护了……

本模块目前在施工中,当前效果可参考User:Bbbbbbbbba/Sandbox

local module = {}

local getArgs = require('Module:Arguments').getArgs

function module.main(frame)
	local args = getArgs(frame)
	
	local function color(c, s)
		return frame:expandTemplate{ title = 'color', args = {c, s} }
	end
	
	local function pink(s)
		return color('#f54b8c', s)
	end
	
	local flag6 = false  -- 目前是否正在生成6星表格
	
	-- 根据flag6,输出名为k或'6星' .. k的模板参数,且后者为粉色字体,例如HP/6星HP
	-- 如果没有名为'6星' .. k的模板参数,则仍返回3星参数且不使用粉色字体(例如并非所有6星角色都有“6星技能1”)
	-- pre和post会被分别加在该模板参数值的前后,且都会显示为粉色
	local function toggle6(pre, k, post)
		if not post then  -- 只有两个参数时默认为k和post,只有一个参数时默认为k
			post = k or ''
			k = pre
			pre = ''
		end
		if not flag6 or not args['6星' .. k] then return pre .. args[k] .. post end
		return pink(pre .. args['6星' .. k] .. post)
	end
	
    -- 如果k为空串则生成cutin台词/UB台词,如果k为“翻译”则生成对应的翻译
    -- 与通常的处理不同,此处允许参数值为空(因为UB台词往往需要过一段时间才会补充上去)
	local function voiceline(k)
		k0 = 'cutin台词' .. k
		k1 = 'UB台词' .. k
		args[k0] = args[k0] or ' '
		args[k1] = args[k1] or ' '
		if args['6星UB'] then
			args['6星' .. k0] = args['6星' .. k0] or ' '
			args['6星' .. k1] = args['6星' .. k1] or ' '
		end
		return '| colspan="3" | ' .. toggle6("'''", k0, "'''") .. '<br />' .. toggle6(k1) .. '\n'
	end
	
	-- 生成一个技能
	-- k为“UB”、“技能1”等
	-- skillType为“连结爆发”、“普通技能”等
	-- unlock为该技能的解锁条件
	-- plus为true时代表该技能有强化版本,为false时代表该技能没有强化版本(单个技能占据两行),为-1时代表表格中并未为该技能留出两行的位置
	local function skill(k, skillType, unlock, plus)
		local rs0 = plus == -1 and '' or 'rowspan="2" '  -- 技能图片、技能类型所占的行数
		local rs1 = plus and '' or rs0  -- 技能名称、技能内容所占的行数
		local res = '| ' .. rs0 .. '| ' .. toggle6('[[File:' , k .. '图片', '|100px]]') .. ' || ' .. rs1 .. '| <div>' .. toggle6(k) .. (unlock and '<br />(' .. unlock .. ')' or '') .. '</div>'
		res = res .. ' || ' .. rs0 .. '| ' .. skillType .. ' || ' .. rs1 .. (args['特殊状态' .. k .. '效果'] and '' or 'colspan="3" ') .. '| <div>' .. toggle6(k .. '效果') .. '</div>\n'
		if args['特殊状态' .. k .. '效果'] then
			res = res .. (k == 'EX' and '! ' or '| ') .. rs1 .. (args['特殊状态' .. k] and '| <div>' .. toggle6('特殊状态' .. k) .. '</div> || ' .. rs1 .. '| ' or 'colspan="2" | ')
			res = res .. '<div>' .. toggle6('特殊状态' .. k .. '效果') .. '</div>'
		end
		return res .. '\n'
	end
	
	-- 生成一个强化版本的技能
	local function plusSkill(k, unlock)
		local res = '| <div>' .. toggle6(k, '+') .. '<br />(' .. unlock .. ')</div> || ' .. (args['特殊状态' .. k .. '+效果'] and '' or 'colspan="3" | ') .. '<div>' .. toggle6(k .. '+效果') .. '</div>'
		if args['特殊状态' .. k .. '+效果'] then
			res = res .. ' || ' .. (args['特殊状态' .. k] and '<div>' .. toggle6('特殊状态' .. k, k == 'EX' and '' or '+') .. (k == 'EX' and '' or '<br />(' .. unlock .. ')') .. '</div> || ' or 'colspan="2" | ')
			res = res .. '<div>' .. toggle6('特殊状态' .. k .. '+效果', '') .. '</div>'
		end
		return res .. '\n'
	end
	
	local function rarity()
		if flag6 then return '★★★★★' .. pink('★') end
		local rarity = args['初始星级'] or ({ ['FES限定'] = 3, ['限定卡池'] = 3, ['活动'] = 1, ['交换'] = 1 })[args['获得方式']]
		local res = string.rep('★', rarity) .. string.rep('☆', 5 - rarity) .. (args['6星UB'] and pink('☆') or '') .. (args['获得方式'] and '<br />(' .. args['获得方式'] .. ')' or '')
		return args['获得方式'] == 'FES限定' and pink(res) or res
	end
	
	local function generateTable()
		local res = '{| class="wikitable" style="white-space:nowrap;"\n'
		res = (res .. '! 人物 !! colspan="3" | UB台词 !! 技能 !! 名称 !! 类型 !! ' .. (args['特殊状态'] and '' or 'colspan="3" | ') .. (args['初始状态'] or '效果')
			       .. (args['特殊状态'] and ' !! colspan="2" | ' .. args['特殊状态'] or '') .. '\n')
		res = res .. '|-\n'
		res = res .. '| rowspan="2" style="text-align:center" | ' .. toggle6('[[File:', '人物图片', "|80px]]<br />'''" .. args['人物'] .. "'''") .. '\n'
		res = res .. voiceline('') .. skill('UB', '连结爆发')
		res = res .. '|-\n'
		res = res .. voiceline('翻译')
		res = res .. '|-\n'
		local ue = args['专用装备']
		res = res .. '! 攻击距离 !! ' .. (ue and ' 星级 !! colspan="2" | 专用装备' or 'colspan="3" | 星级') .. '\n'
		local uePlus = ue and (not flag6 or not args['6星技能1'])
		res = res .. skill('技能1', '普通技能', 'Rank2解锁', uePlus)
		res = res .. '|-\n'
		res = res .. '| style="text-align:center" | '  .. args['攻击距离'] .. ' || ' .. (ue and '' or 'colspan="3" ') .. 'style="text-align:center" | ' .. rarity() .. '\n'
		if ue then res = res .. '| colspan="2" style="text-align:center" | [[File:' .. args['专用装备图片'] .. "|80px]]<br />'''" .. ue .. "'''\n" end
		if uePlus then res = res .. plusSkill('技能1', '专用装备强化') end
		res = res .. '|-\n'
		res = res .. '! colspan="' .. (ue and '2' or '4') .. '" | 基础数值' .. (ue and ' !! colspan="2" | 强化项目' or '') .. '\n'
		res = res .. skill('技能2', '普通技能', 'Rank4解锁', -1)
		res = res .. '|-\n'
		local typeColor = ({ ['物理'] = 'red', ['魔法'] = 'blue' })[args['类型']] or 'black'
		local atkStat = (args['reverse'] and { ['物理'] = '魔法', ['魔法'] = '物理' } or { ['物理'] = '物理', ['魔法'] = '魔法' })[args['类型']] or '其他'
		local sp = args['特殊技能']
		local statRs = (ue or sp) and '1' or '2'
		local statCs = sp and not ue and '2' or '1'
		
		local function stat(k)
			return 'rowspan="' .. statRs .. '" colspan="' .. statCs .. '" | ' .. (k == '攻击' and "'''" .. color(typeColor, atkStat) .. "'''" or '') .. k .. '<br/ >' .. toggle6(k)
		end
		
		res = res .. '| ' .. stat('HP') .. ' || ' .. stat('攻击') .. '\n'
		if ue then
			res = res .. '| ' .. (args['专用装备强化1'] or '') .. ' || ' .. (args['专用装备强化2'] or '') .. '\n'
		elseif not sp then
			res = res .. '| ' .. stat('物理防御') .. ' || ' .. stat('魔法防御') .. '\n'
		end
		if sp then
			res = res .. skill('特殊技能', '特殊技能', nil, -1)
			res = res .. '|-\n'
			statRs = '2'
			res = res .. '| ' .. stat('物理防御') .. ' || ' .. stat('魔法防御') .. '\n'
			if ue then res = res .. '| rowspan="2" | ' .. (args['专用装备强化3'] or '') .. ' || rowspan="2" | ' .. (args['专用装备强化4'] or '') .. '\n' end
		end
		args['EX图片'] = 'Prin Cone ' .. ({ ['物理攻击'] = 'Arm', ['物理防御'] = 'Defense', ['魔法攻击'] = 'Skill', ['魔法防御'] = 'Skill', ['最大HP'] = 'HP Great Update' })[args['EX强化']] .. '.webp'
		args['EX效果'] = '战斗开始时中幅度提升自己的' .. args['EX强化']
		args['EX+效果'] = '战斗开始时' .. (args['EX+强化1幅度'] or args['EX+强化'] and '中' or '大') .. '幅度提升自己的' .. args['EX强化'] .. (args['EX+强化'] and '<br />并小幅度提升自己的' .. args['EX+强化'] or '')
		if args['特殊状态'] and not args['额外技能效果'] then for i, k in ipairs({'EX效果', 'EX+效果'}) do args[k] = '<center>' .. args[k] .. '</center>' end end
		if args['额外技能效果'] then args['特殊状态EX效果'] = '额外技能' end
		res = res .. skill('EX', 'EX技能', 'Rank7解锁', true)
		res = res .. '|-\n'
		if not sp and ue then
			res = res .. '| ' .. stat('物理防御') .. ' || ' .. stat('魔法防御') .. ' || ' .. (args['专用装备强化3'] or '') .. ' || ' .. (args['专用装备强化4'] or '') .. '\n'
		end
		if args['额外技能效果'] then
			args['特殊状态EX'] = args['额外技能']
			args['特殊状态EX+效果'] = '<center>' .. args['额外技能效果'] .. '</center>'
		end
		res = res .. plusSkill('EX', '5★强化')
		res = res .. '|-\n! colspan="10" | 简介\n|-\n| colspan="10" | \'\'\'【' .. color(typeColor, args['类型']) .. "】'''" .. args['简介'] .. '\n'
		if ue then res = res .. '|-\n! colspan="10" | 专用装备介绍\n|-\n| colspan="10" | ' .. (args['专用装备介绍'] or '(待补充)') .. '\n' end
		res = res .. '|}'
		return res
	end
	
	s3 = generateTable()
	if not args['6星UB'] then return s3 end
	flag6 = true
	s6 = generateTable()
	return frame:expandTemplate{ title = '切换显示按钮', args = { ['@default'] = '3', ['@radio'] = 'a', ['@forceNoCancel'] = '1', ['3'] = '通常', ['6'] = '6星' } } .. '\n' ..
	       frame:expandTemplate{ title = '切换显示', args = {'3', '\n' .. s3, 'div'} } .. frame:expandTemplate{ title = '切换显示', args = {'6', '\n' .. s6, 'div'} }
end

return module