• 欢迎来到THBWiki!如果您是第一次来到这里,请点击右上角注册一个帐户
  • 有任何意见、建议、求助、反馈都可以在 讨论板 提出
  • THBWiki以专业性和准确性为目标,如果你发现了任何确定的错误或疏漏,可在登录后直接进行改正

模块:单条符卡

来自THBWiki
跳到导航 跳到搜索
[创建] Template-info.svg 模块文档
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