全站通知:

模块:升级

来自戴森球计划WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

示例

{{升级
|科技名称 = 机甲核心
|新列 = 能量上限,机甲耐久度,激光武器范围,激光武器伤害
|铁块*20+铜块*20, 3600, , ,
+80.0MJ 核心能量上限
机甲耐久度 +300
机甲激光武器攻击距离 +1m,
200MJ,11m,+300,26hp

|电磁矩阵*100+能量矩阵*100, 36.0k, , , 
+200MJ 核心能量上限
机甲耐久度 +300
机甲激光武器攻击距离 +1m
机甲激光武器伤害 +2.0hp,
500MJ,12m,+600,28hp

|{{图标|信息矩阵|1000}}<math>×Lv</math>,<math>500(Lv-2)</math>M,,,
此行是杜撰的数据
仅作展示用,
800MJ,13m,+900,30hp
}}
机甲核心
Window-border-1-title3.pngWindow-border-1-title2.png
等级图标研究消耗数据量解锁能量上限机甲耐久度激光武器范围激光武器伤害
1机甲核心(1)铁块20铜块203600 哈希块

+80.0MJ 核心能量上限
机甲耐久度 +300
机甲激光武器攻击距离 +1m

200MJ11m+30026hp
2机甲核心(2)电磁矩阵100能量矩阵10036.0k 哈希块

+200MJ 核心能量上限
机甲耐久度 +300
机甲激光武器攻击距离 +1m
机甲激光武器伤害 +2.0hp

500MJ12m+60028hp
机甲核心(3)信息矩阵1000[math]\displaystyle{ ×Lv }[/math][1][math]\displaystyle{ 500(Lv-2) }[/math]M 哈希块

此行是杜撰的数据
仅作展示用

800MJ13m+90030hp


注意事项

  1. 当不存在“科技名称”参数时,模版会自动从页面名称猜测,但依然建议写入本参数
  2. 可以通过“新列”参数为表格添加自定义的新列,“新列”参数中各值用逗号分开
  3. 其他参数不需要参数名,依次写上这级科技的研究消耗、数据量(无单位)、前置科技、后续科技和解锁。参数中各值同样用逗号分开,没有的可以空过去
  4. 当所有升级科技对某个值都没有取值时,模板渲染的表格会忽略这一列
  5. 为保持美观,前置科技和后续科技中不要填和它同名的相邻等级科技
  6. 研究消耗、前置科技和后续科技按{{公式}}中的写法填入
  7. 当出现无限科技时,用{{图标}}模板和<math>标签填入公式
  8. “解锁”的值默认被<poem>标签环绕,识别所有的换行

注释


  1. 这里的“Lv”是科技等级的意思。
local getArgs = require([[Module:Arguments]]).getArgs
local p = {}

function p.main(frame)
	local args = getArgs(frame, {removeBlanks = false})
	return p._main(frame, args)
end

function p._main(frame, args)
	local techArgsGrp = {}
	local tableHead = {"等级", "图标", "研究消耗", "数据量", "前置科技", "后续科技", "解锁"}
	local techName = ''
	if args['科技名称'] then
		techName = args['科技名称']
	else
		techName = frame:getParent():getTitle()
	end

	-- 将其他传参格式化,获得二维数组techArgsGrp
	for k, v in ipairs(args) do
		if type(k) == 'number' then
			local row = {}
			if v == nil then
				v = ','
			end
			for key, text in pairs(mw.text.split(v, '[\,,]')) do
				row[key] = mw.text.trim(text)
			end
			table.insert(techArgsGrp, k, row)
		end
	end

	-- 将参数“新列”格式化,并与tableHead合并
	if args['新列'] == nil then
		args['新列'] = ''
	end
	for key, text in pairs(mw.text.split(args['新列'], '[\,,]')) do
		table.insert(tableHead, mw.text.trim(text))
	end

	-- 遍历techArgsGrp,找到没有值的列,获得最终的tableHead
	for i = 3, #tableHead do
		local nillTableHead = true
		for row = 1, #techArgsGrp do
			if techArgsGrp[row][i-2] ~= "" and techArgsGrp[row][i-2] ~= nil then
				nillTableHead = false
				break
			end
		end
		if nillTableHead then
			tableHead[i] = ""
		end
	end

	-- 拼接表格
	local table = mw.html.create('table')
	table:css({['border-collapse']='separate', ['border-spacing']='5px 0px'})
	-- 表头
	local th = mw.html.create('tr')
	th
		:css('text-align', 'center')
		:addClass('dsp-font')
	for i = 1, #tableHead do
		if tableHead[i] ~= "" and tableHead[i] ~= nil then
			local cell = mw.html.create('td')
			if tableHead[i] == '前置科技' then
				cell:wikitext(tableHead[i]..frame:extensionTag('ref', '这里列出的前置科技不包括和它同名的上一级科技。'))
			elseif tableHead[i] == '后续科技' then
				cell:wikitext(tableHead[i]..frame:extensionTag('ref', '这里列出的后续科技不包括和它同名的下一级科技。'))
			else
				cell:wikitext(tableHead[i])
			end
			th:node(cell)
		end
	end
	table:node(th)
	-- 表的内容
	for i = 1, #techArgsGrp do
		local tr = mw.html.create('tr')
		---- 等级
		if tableHead[1] ~= '' and tableHead[1] ~= nil then
			local levelCell = mw.html.create('td')
			if string.find(techArgsGrp[i][1], 'math') then
				levelCell
					:wikitext('∞')
					:css('text-align', 'center')
			else
				levelCell
					:wikitext(i)
					:css('text-align', 'center')
					:addClass('dsp-font')
			end
			tr:node(levelCell)
		end
		---- 图标
		if tableHead[2] ~= '' and tableHead[2] ~= nil then
			local iconCell = mw.html.create('td')
			iconCell:wikitext(frame:expandTemplate{
				title = '图标',
				args = {techName..'('..i..')'}
			})
			tr:node(iconCell)
		end
		---- 研究消耗
		if tableHead[3] ~= '' and tableHead[3] ~= nil then
			local consumeCell = mw.html.create('td')
			if string.find(techArgsGrp[i][1], 'math') then
				consumeCell:wikitext(techArgsGrp[i][1]..frame:extensionTag('ref', '这里的“Lv”是科技等级的意思。'))
			else
				consumeCell:wikitext(frame:expandTemplate{
					title = '公式',
					args = {techArgsGrp[i][1]}
				})
			end
			tr:node(consumeCell)
		end
		---- 数据量
		if tableHead[4] ~= '' and tableHead[4] ~= nil then
			local dataCell = mw.html.create('td')
			local techDataNum = mw.html.create('span')
			local techDataHash = mw.html.create('span')
			if mw.ustring.len(techArgsGrp[i][2]) > 8 then
				techDataNum:css('font-size', '12px')
			else
				techDataNum:css('font-size', '20px')
			end
			techDataNum
				:addClass('dsp-font')
				:wikitext(techArgsGrp[i][2])
			techDataHash
				:css({['font-size'] = '12px', ['white-space'] = 'nowrap'})
				:addClass('dsp-font')
				:wikitext(' 哈希块')
			dataCell
				:node(techDataNum)
				:node(techDataHash)
			tr:node(dataCell)
		end
		---- 前置科技
		if tableHead[5] ~= '' and tableHead[5] ~= nil then
			local beforeTechCell = mw.html.create('td')
			beforeTechCell:wikitext(frame:expandTemplate{
				title = '公式',
				args = {techArgsGrp[i][3]}
			})
			tr:node(beforeTechCell)
		end
		---- 后续科技
		if tableHead[6] ~= '' and tableHead[6] ~= nil then
			local afterTechCell = mw.html.create('td')
			afterTechCell:wikitext(frame:expandTemplate{
				title = '公式',
				args = {techArgsGrp[i][4]}
			})
			tr:node(afterTechCell)
		end
		---- 解锁
		if tableHead[7] ~= '' and tableHead[7] ~= nil then
			local unlockCell = mw.html.create('td')
			unlockCell:wikitext(frame:extensionTag('poem', techArgsGrp[i][5]))
			tr:node(unlockCell)
		end
		---- 新列
		for col = 8, #tableHead do
			if tableHead[col] ~= '' and tableHead[col] ~= nil then
				local cell = mw.html.create('td')
				cell
					:css('text-align', 'right')
					:wikitext(techArgsGrp[i][col-2])
				tr:node(cell)
			end
		end
		table:node(tr)
	end

	-- 将表放到dsp-box模板里
	local dspBox = mw.html.create('div')
	dspBox
		:css('display', 'flex')
		:wikitext(frame:expandTemplate{
			title = 'dsp-box',
			args = {techName, tostring(table)}
		})

	return tostring(dspBox)
end

return p