- 欢迎来到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 = varLua.var('分隔符')
local function initCards(frame)
-- 一些初始化步骤,处理输入并形成原始数据
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', 'Normal'},
['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 = tonumber(varLua.var('自动编号'))
if auto_num == nil then
auto_num = 1
varLua.vardefine('自动编号', 1)
end
init_cards['角色'] = libstr.split(varLua.var('角色名'),reps)
init_cards['关卡名'] = 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 disable_cn_num = tonumber(varLua.var('隐藏符卡号')) or 0
local disable_num = tonumber(varLua.var('隐藏编号')) or 0
local disable_diff = tonumber(varLua.var('隐藏难度')) or 0
local work_full = varLua.var('作品名')
local work_symbol = varLua.var('作品缩写')
local stage_name = varLua.var('关卡名')
local is_new_stage = tonumber(varLua.var('新关卡')) or 0
local vname_stage_name_row = work_full..stage_name..'行数'
local stage_name_row = tonumber(varLua.var(vname_stage_name_row)) or 0
local chara_name = init_cards['角色'][1]
local raw_chara_name = varLua.var('角色名')
local is_new_chara = tonumber(varLua.var('新角色')) or 0
local cn_num = tostring(frame.args['符卡号']) or ''
local vname_chara_name_row = work_full..stage_name..raw_chara_name..'行数'
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['难度']
if disable_diff == 1 then
if disable_num == 1 then
stage_row = 1
else
stage_row = #init_cards['编号']
end
end
local trs = {}
local chara_linked = {}
if #init_cards['角色'] > 1 then
for i=1,#init_cards['角色'] do
chara_linked[i] = '[['..init_cards['角色'][i]..']]'
end
if work_symbol == 'PYH' then
chara_name_display = chara_linked[1]..'为主役<br>'..chara_linked[2]..'为下仆'
else
chara_name_display = libstr.join(chara_linked,'<br>&<br>')
end
end
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
local stage_name_link = stage_name
if stage_name == 'Extra Stage' or stage_name == 'Stage EX' or stage_name == 'Revenging Stage' then
stage_name_link = 'Extra'
end
local stage_link = work_full..'/'..stage_name_link
local linked_stage_name = '[['..stage_link..'|'..stage_name..']]'
if init_cards['关卡链接'] ~= nil and init_cards['关卡链接'] ~= '' then
stage_link = init_cards['关卡链接']
if stage_link == '无' then
linked_stage_name = stage_name
else
linked_stage_name = '[['..stage_link..'|'..stage_name..']]'
end
end
main_tr:tag('td')
:wikitext(linked_stage_name)
:attr('rowspan', varLua.var_final(vname_stage_name_row, stage_name_row))
end
local manul_chara_name_row = tonumber(varLua.var('手动指定'..stage_name..raw_chara_name..'角色行数')) or 0
if is_new_chara == 1 then
if manul_chara_name_row ~= 0 then
main_tr:tag('td')
:wikitext(chara_name_display)
:attr('rowspan', manul_chara_name_row)
else
main_tr:tag('td')
:wikitext(chara_name_display)
:attr('rowspan', varLua.var_final(vname_chara_name_row, chara_name_row))
end
end
if disable_cn_num ~= 1 then
if cn_num == '/' then
main_tr:tag('td')
else
main_tr:tag('td')
:wikitext(cn_num)
:attr('rowspan', stage_row)
end
end
end
local cardNum = auto_num
local cardNumDisplay = ''
-- 优先自动编号,如指定了编号则覆盖
if init_cards['编号'] ~= nil then
local numbering = init_cards['编号'][i]
if work_full == '弹幕天邪鬼' then
numbering = stage_name..' 场景'..numbering
elseif work_full == '秘封噩梦日记' then
numbering = stage_name..' 弹幕梦'..numbering
end
if numbering and numbering ~= '-' then
cardNum = numbering
auto_num = auto_num - 1
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
if disable_diff ~= 1 then
main_tr:tag('td')
:wikitext(init_cards['难度'][i])
end
if disable_num ~= 1 then
if work_symbol == 'YYC' then
if cardNumDisplay == '/' then
main_tr:tag('td')
else
main_tr:tag('td')
:wikitext('[[东方永夜抄/符卡说明#'..stage_name..'|'..cardNumDisplay..']]')
end
else
if cardNumDisplay == '/' then
main_tr:tag('td')
else
main_tr:tag('td')
:wikitext(cardNumDisplay)
end
end
end
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_ja_display = ''
if card_name_ja[1] == nil or card_name_ja[1] == '缺少参数' then
local mapping_name = chara_name_short..'符卡名/日文'
local linked_name = '[[特殊:管理映射方案/'..mapping_name..'|'..mapping_name..']]'
card_name_ja_display = '获取映射失败:'..linked_name..'|'..work_symbol..'-'..mapping_id..'不存在'
else
card_name_ja_display = card_name_ja[1]
end
local card_name_zh = libnames.getCardName(chara_name_short,work_symbol,mapping_id,'zh')
local card_name_zh_display = ''
if card_name_zh[1] == nil or card_name_zh[1] == '缺少参数' then
local mapping_name = chara_name_short..'符卡名/中文'
local linked_name = '[[特殊:管理映射方案/'..mapping_name..'|'..mapping_name..']]'
card_name_zh_display = '获取映射失败:'..linked_name..'|'..work_symbol..'-'..mapping_id..'不存在'
else
card_name_zh_display = '[['..card_name_zh[1]..']]'
end
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_master = chara_name
local stage_name = init_cards['关卡名']
local target = 0
for j=1, #init_cards['角色'] do
if init_cards['角色'][j] == chara_name then
target = 1
if j == 2 then
chara_name_master = init_cards['角色'][1]
end
break
end
end
if target ~= 1 then
return
end
local chara_name_short = libnames.getCharaTemplateName(chara_name_master)
local trs = {}
if #init_cards['难度'] == 0 then
-- 隐藏难度的作品
local numbering = init_cards['编号']
if #init_cards['编号'] == 0 then
-- 文花帖、文花帖DS等没有编号也没有难度的作品
numbering = {1}
end
for i = 1, #numbering do
-- 开始生成表格
local sg_tr = mw.html.create('tr')
local mapping_id = init_cards['角色符卡号'][i]
if mapping_id ~= '-' then
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
sg_tr:tag('td')
:wikitext(card_name_ja_display)
sg_tr:tag('td')
:wikitext(card_name_zh_display)
if work_symbol == 'EMRJ' then
sg_tr:tag('td')
:wikitext(stage_name..' 弹幕梦'..numbering[i])
else
sg_tr:tag('td')
:wikitext(stage_name)
end
local note = init_cards['备注'] or ''
local chara_name_linked = ''
if #init_cards['角色'] > 1 then
local chara_linked = {}
for i=1,#init_cards['角色'] do
chara_linked[i] = '[['..init_cards['角色'][i]..']]'
end
if #init_cards['角色'] == 2 then
chara_name_linked = chara_linked[1] .. '与' .. chara_linked[2] .. '合作'
else
local last_chara = chara_linked[#chara_linked]
table.remove(chara_linked, #chara_linked)
chara_name_linked = libstr.join(chara_linked,'、').. '与' .. last_chara .. '合作'
end
end
local display_note_text = ''
if chara_name_linked ~= '' and note ~= '' then
display_note_text = chara_name_linked..'<br>'..note
else
if chara_name_linked ~= '' then
display_note_text = chara_name_linked
else
display_note_text = note
end
end
sg_tr:tag('td')
:wikitext(display_note_text)
end
table.insert(trs,tostring(sg_tr))
end
return libstr.join(trs,'')
end
for i = 1, #init_cards['难度'] do
-- 排除自机符卡
local ex_works_ftg = {
-- 格斗作
['CMX'] = true,
['FXT'] = true,
['FXTZ'] = true,
['XQL'] = true,
['SML'] = true,
['PYH'] = true,
}
local ex_works = {
['YYC'] = true, -- 永夜抄
}
if ex_works_ftg[work_symbol] then
if init_cards['难度'][i] == '对战使用符卡' then
return
end
end
if ex_works[work_symbol] then
if init_cards['难度'][i] == 'Spell Card' or init_cards['难度'][i] == 'Last Spell' then
return
end
end
-- 开始生成表格
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['难度'][i])
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)
if work_symbol == 'DZZ' then
main_tr:tag('td')
:wikitext(stage_name)
else
main_tr:tag('td')
:wikitext(libstr.join(diff_list, ' / '))
end
local note = init_cards['备注'] or ''
local chara_name_linked = ''
if #init_cards['角色'] > 1 then
local chara_linked = {}
for i=1,#init_cards['角色'] do
chara_linked[i] = '[['..init_cards['角色'][i]..']]'
end
if #init_cards['角色'] == 2 then
if work_symbol == 'PYH' then
chara_name_linked = chara_linked[1] .. '为主役,' .. chara_linked[2] .. '为下仆'
else
chara_name_linked = chara_linked[1] .. '与' .. chara_linked[2] .. '合作'
end
else
local last_chara = chara_linked[#chara_linked]
table.remove(chara_linked, #chara_linked)
chara_name_linked = libstr.join(chara_linked,'、').. '与' .. last_chara .. '合作'
end
end
local display_note_text = ''
if chara_name_linked ~= '' and note ~= '' then
display_note_text = chara_name_linked..'<br>'..note
else
if chara_name_linked ~= '' then
display_note_text = chara_name_linked
else
display_note_text = note
end
end
main_tr:tag('td')
:wikitext(display_note_text)
end
table.insert(trs,tostring(main_tr))
end
return libstr.join(trs,'')
end
return p