• 欢迎来到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 = ','

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