Module:PCR人物属性
跳到导航
跳到搜索
本模块的设计目的为取代模板{{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