- 欢迎来到THBWiki!如果您是第一次来到这里,请点击右上角注册一个帐户
- 有任何意见、建议、求助、反馈都可以在 讨论板 提出
- THBWiki以专业性和准确性为目标,如果你发现了任何确定的错误或疏漏,可在登录后直接进行改正
模块:沙盒/单条符卡
< 模块:沙盒
跳到导航
跳到搜索
[创建]
模块文档

local p = {}
local libargs = require('Module:libargs')
local libstr = require('Module:libstr')
local libnames = require('Module:libnames')
varLua = mw.ext.VariablesLua
local init_cards = {}
-- 原始cards数据
-- cards指调用单张符卡模板生成的一行或多行数据
-- 不同难度、不同符卡名都需要在录入SMW的过程中拆开
-- 拆分后的最小单元叫card,每个card可以包含多个难度,但名字应该是唯一的
local card_list = {}
-- 这里的cards表存储拆分后的符卡card数据,在录入SMW时使用
local auto_num = 0
local reps = ','
local function initCards(frame)
-- 一些初始化步骤,处理输入并形成原始数据
if frame.args['分隔符'] ~= nil then
reps = frame.args['分隔符']
end
local names = {'显示','符卡号','难度','编号','角色符卡号'}
init_cards = libargs.namedDict(frame.args,names)
init_cards['角色符卡号'] = libstr.split(init_cards['角色符卡号'], reps)
local diff = init_cards['难度']
-- 本来可以用getchar拆分成字符,但由于还需要兼容手动输入难度的情况
-- 且出于性能考虑,所以还是用dict
local diff_dict = {
['ENHLO'] = {'Easy', 'Normal', 'Hard', 'Lunatic', 'Overdrive'},
['ENHL'] = {'Easy', 'Normal', 'Hard', 'Lunatic'},
['ENH'] = {'Easy', 'Normal', 'Hard'},
['EN'] = {'Easy'},
['NHLO'] = {'Normal', 'Hard', 'Lunatic', 'Overdrive'},
['NHL'] = {'Normal', 'Hard', 'Lunatic'},
['HLO'] = {'Hard', 'Lunatic', 'Overdrive'},
['HL'] = {'Hard', 'Lunatic'},
['L'] = {'Lunatic'},
['H'] = {'Hard'},
['N'] = {'Normal'},
['E'] = {'Easy'},
['S'] = {'Spell card'},
}
if diff_dict[diff] ~= nil then
init_cards['难度'] = diff_dict[diff]
else
init_cards['难度'] = libstr.split(diff,reps)
end
local numbering = init_cards['编号']
if numbering ~= nil then
init_cards['编号'] = libstr.split(numbering,reps)
end
auto_num = varLua.var('自动编号')
end
function p.createTable(frame)
-- 在页面上生成表格
initCards(frame)
if varLua.var('引用') == '1' then
return p.createTableRef(frame)
end
-- TODO: 存入SMW
return p.createTableMain(frame)
end
function p.createTableMain(frame)
local work_symbol = varLua.var('作品缩写')
local stage_name = varLua.var('关卡名')
local is_new_stage = tonumber(varLua.var('新关卡')) or 0
local vname_stage_name_row = stage_name..'行数'
local stage_name_row = tonumber(varLua.var(vname_stage_name_row)) or 0
local chara_name = varLua.var('角色名')
local is_new_chara = tonumber(varLua.var('新角色')) or 0
local diff_raw = libstr.join(init_cards['难度'], '')
local vname_chara_name_row = stage_name..chara_name..diff_raw..'行数'
local chara_name_row = tonumber(varLua.var(vname_chara_name_row)) or 0
local chara_name_display = '[['..chara_name..']]'
local chara_name_short = libnames.getCharaTemplateName(chara_name)
local stage_row = #init_cards['难度']
local trs = {}
if init_cards['显示'] ~= nil and init_cards['显示'] ~= '' then
chara_name_display = init_cards['显示']
end
if is_new_stage == 1 then
stage_name_row = 0
end
stage_name_row = stage_name_row + stage_row
varLua.vardefine(vname_stage_name_row, stage_name_row)
if is_new_chara == 1 then
chara_name_row = 0
end
chara_name_row = chara_name_row + stage_row
varLua.vardefine(vname_chara_name_row, chara_name_row)
for i = 1, stage_row do
-- 开始生成表格
local main_tr = mw.html.create('tr')
if i == 1 then
if is_new_stage == 1 then
main_tr:tag('td')
:wikitext(stage_name)
:attr('rowspan', varLua.var_final(vname_stage_name_row, stage_name_row))
end
if is_new_chara == 1 then
main_tr:tag('td')
:wikitext(chara_name_display)
:attr('rowspan', varLua.var_final(vname_chara_name_row, chara_name_row))
end
main_tr:tag('td')
:wikitext(init_cards['符卡号'])
:attr('rowspan', stage_row)
end
local cardNum = auto_num
local cardNumDisplay = ''
-- 优先自动编号,如指定了编号则覆盖
if init_cards['编号'] ~= nil then
local numbering = init_cards['编号'][i]
if numbering then
cardNum = numbering
end
end
if cardNum ~= '/' then
auto_num = auto_num + 1
varLua.vardefine('自动编号', auto_num)
end
if tonumber(cardNum) ~= nil then
cardNumDisplay = libstr.padLeft(cardNum, 3)
else
cardNumDisplay = cardNum
end
main_tr:tag('td')
:wikitext(init_cards['难度'][i])
main_tr:tag('td')
:wikitext(cardNumDisplay)
local mapping_id = init_cards['角色符卡号'][i]
local card_name_row = 1
if mapping_id ~= '-' then
if i == #init_cards['角色符卡号'] then
card_name_row = 1
else
for j=i+1, #init_cards['角色符卡号'] do
if init_cards['角色符卡号'][j] ~= '-' then
break
end
card_name_row = card_name_row + 1
end
end
local card_name_ja = libnames.getCardName(chara_name_short,work_symbol,mapping_id,'ja')
local card_name_zh = libnames.getCardName(chara_name_short,work_symbol,mapping_id,'zh')
local card_name_ja_display = card_name_ja[1]
local card_name_zh_display = '[['..card_name_zh[1]..']]'
if card_name_zh[2] ~= nil then
card_name_zh_display = card_name_zh_display..'('..card_name_zh[2]..')'
end
main_tr:tag('td')
:wikitext(card_name_ja_display)
:attr('rowspan', card_name_row)
main_tr:tag('td')
:wikitext(card_name_zh_display)
:attr('rowspan', card_name_row)
end
table.insert(trs,tostring(main_tr))
end
return libstr.join(trs,'')
end
function p.createTableRef(frame)
local work_symbol = varLua.var('作品缩写')
local chara_name = varLua.var('角色名')
local chara_name_short = libnames.getCharaTemplateName(chara_name)
local trs = {}
for i = 1, #init_cards['难度'] do
-- 开始生成表格
local main_tr = mw.html.create('tr')
local mapping_id = init_cards['角色符卡号'][i]
local diff_list = {}
if mapping_id ~= '-' then
if i == #init_cards['角色符卡号'] then
-- 单条符卡,直接赋值
table.insert(diff_list,init_cards['难度'][1])
else
-- 从下一条开始,看这条符卡对应有多少难度
table.insert(diff_list,init_cards['难度'][i])
for j=i+1, #init_cards['角色符卡号'] do
if init_cards['角色符卡号'][j] ~= '-' then
break
end
table.insert(diff_list,init_cards['难度'][j])
end
end
local card_name_ja = libnames.getCardName(chara_name_short,work_symbol,mapping_id,'ja')
local card_name_zh = libnames.getCardName(chara_name_short,work_symbol,mapping_id,'zh')
local card_name_ja_display = card_name_ja[1]
local card_name_zh_display = '[['..card_name_zh[1]..']]'
if card_name_zh[2] ~= nil then
card_name_zh_display = card_name_zh_display..'('..card_name_zh[2]..')'
end
main_tr:tag('td')
:wikitext(card_name_ja_display)
main_tr:tag('td')
:wikitext(card_name_zh_display)
main_tr:tag('td')
:wikitext(libstr.join(diff_list, ' / '))
local note = varLua.var('备注')
if note ~= nil then
main_tr:tag('td')
:wikitext(note)
end
end
table.insert(trs,tostring(main_tr))
end
return libstr.join(trs,'')
end
return p