◆少前百科是非盈利性、非官方的少女前线维基百科。
◆如果您发现某些内容错误/空缺,请勇于修正/添加!参与进来其实很容易!点这里 加入少前百科
◆有任何意见、建议、纠错,欢迎在 GFwiki:反馈与建议 提出和讨论。编辑事务讨论QQ群:597764980,微博@GFwiki少前百科
◆To foreigners,You can use twitter to contact us.
Icon Nyto Silver.png

“模块:Equip info”的版本间的差异

来自少前百科GFwiki
跳转至: 导航搜索
第165行: 第165行:
 
local infobox = root:tag('div'):addClass('equip-infobox')
 
local infobox = root:tag('div'):addClass('equip-infobox')
 
local fitguns = {}
 
local fitguns = {}
if d.fits ~= nil then
+
if edata.fits ~= nil then
for _, v in ipairs(d) do fitguns[#fitguns+1] = '<li>[[' .. xdata[v][1] .. ']]</li>' end
+
for _, v in ipairs(edata) do fitguns[#fitguns+1] = '<li>[[' .. xdata[v][1] .. ']]</li>' end
 
end
 
end
 
infobox:wikitext(makeCard(edata, mw.getCurrentFrame()))
 
infobox:wikitext(makeCard(edata, mw.getCurrentFrame()))

2023年4月6日 (四) 01:11的版本

此模块的文档可以在模块:Equip info/doc创建

local p = {}
local root
local data = mw.loadData('Module:Equip info/data')
local tdata = mw.loadData('Module:Equip info/type data')
local xdata = mw.loadData('Module:Gun info/ex data')
local odata = mw.loadData('Module:Gun info/obtain data')
local edata
local bonuses = {'pow', 'hit', 'dodge', 'speed', 'rate', 'critical_harm_rate',
	'critical_percent', 'armor_piercing', 'armor', 'night_view_percent', 'bullet_number_up'}
local titles = {{'Pow', '伤害'}, {'Hit', '命中'}, {'Dodge', '回避'},
	{'Move', '移速'}, {'Rate', '射速'}, {'CtPow', '暴伤'}, {'Ct', '暴击'},
	{'AP', '穿甲'}, {'Armor', '护甲'}, {'Night', '夜战'}, {'Bullet', '弹量'}}
local cats = {'配件', '弹匣', '人形'}
local equip

local function formattime(seconds)
	local minutes = math.floor(seconds/60)
	local hour = math.floor(minutes/60)
	minutes = minutes - hour*60
	return string.format('%02d:%02d:00', hour, minutes)
end

local function addObtain()
	equip:tag('h2'):addClass('obtain-tab'):wikitext('获取途径')
	local div = equip:tag('div'):addClass('equip-obtain')
	for _, v in ipairs(edata.obtain) do div:tag('p'):wikitext(odata[v]) end
	if edata.develop_duration then
		div:tag('div'):addClass('equip-develop'):wikitext(
			mw.getCurrentFrame():expandTemplate{
				title='fa', args={'clock', size='30px'}
			}, '<span>制造用时</span>',
			'<span>' .. formattime(edata.develop_duration) .. '</span>')
	end
end

local function addGrowing(growing, gtable)
	local thead = gtable:tag('tr')
	thead:tag('th'):wikitext('强化等级')
	for i, _ in ipairs(bonuses) do
		if growing[i] ~= nil then thead:tag('th'):wikitext(
			string.format('[[File:Data %s.png|link=]]%s', unpack(titles[i])))
		end
	end
	for lv = 0, 10 do
		local tr = gtable:tag('tr')
		tr:tag('td'):wikitext(lv)
		for i, _ in ipairs(bonuses) do
			if growing[i] ~= nil then
				local range, bonus = unpack(growing[i])
				local td = tr:tag('td')
				if range[1] == range[2] then td:wikitext('+', math.floor(range[1]*(1+bonus*lv/1e4)))
				else td:wikitext(string.format('<span>%+d</span><span>%+d</span>',
					math.floor(range[1]*(1+bonus*lv/1e4)), math.floor(range[2]*(1+bonus*lv/1e4))))
				end
			end
		end
	end
end

local function addFixed(fixed)
	local con = mw.html.create()
	for i, _ in ipairs(bonuses) do
		if fixed[i] ~= nil then
			local p = con:tag('p')
			p:wikitext(string.format('[[File:Data %s.png|link=]]%s',
				unpack(titles[i])))
			local vals = fixed[i]
			p:wikitext(string.format('<span%s>%+d</span>',
				vals[1] < 0 and ' style="color:red"' or '', vals[1]))
			if vals[1] ~= vals[2] then 
				p:tag('sub'):wikitext('校准率0%')
				p:wikitext(string.format('<span style="color:#ffb400">%+d</span>', vals[2]))
				p:tag('sub'):wikitext('校准率100%')
			end
		end
	end
	if edata.sp_desc ~= nil then con:tag('p'):addClass('equip-sp'):wikitext(
		'[[File:特殊技能icon.png|link=]]', edata.sp_desc) end
	return tostring(con)
end

local function addSpec()
	equip:tag('h2'):addClass('spec-tab'):wikitext('装备数据')
	local div = equip:tag('div'):addClass('equip-spec')
	local fixed, growing, hasGrowing = {}, {}, false
	for i, v in ipairs(bonuses) do
		if edata[v] ~= nil then
			local bonus = edata.max_level ~= 0 and edata.bonus_type[v] or nil
			if bonus ~= nil then
				growing[i] = {edata[v], bonus}
				hasGrowing = true
			else fixed[i] = edata[v] end
		end
	end
	div:wikitext(addFixed(fixed))
	if hasGrowing then
		local gtable = div:tag('table')
		addGrowing(growing, gtable)
	end
end

local function bannerLeft()
	local left = mw.html.create('div')
	local ex, ext = 'ex', '专属' 
	if edata.fits == nil then ex, ext = 'general', '通用' end
	left:wikitext(string.format(
		'[[File:%s_equipment_icon.png|link=]]<span class="cat cat-%s">%s装备</span>',
		ex, ex, ext))
	local fits = left:tag('div'):addClass('equip-fits-' .. ex)
	if ex == 'ex' then
		if edata.fits[2] == nil then
			fits:wikitext(xdata[edata.fits[1]][1])
		else fits:wikitext('多人专属') end
	else
		local types = tdata[edata.etype].fit_gun_type
		local gtypes = {'手枪', '冲锋枪', '狙击枪', '突击步枪', '机枪', '霰弹枪'}
		for _, v in ipairs(types) do fits:wikitext(string.format(
			'<abbr title="%s">[[File:反色图标平面-%s.png|link=]]</abbr>',
			(mw.ustring.gsub(gtypes[v], '狙击', '步')), gtypes[v]))
		end
	end
	return tostring(left)
end

local function addBanner()
	local banner = equip:tag('div'):addClass('equip-banner')
	local front = banner:tag('div'):addClass('equip-banner-front')
	front:wikitext(bannerLeft())
	front:tag('div'):addClass('equip-banner-sep')
	local right = front:tag('div'):addClass('equip-banner-right')
	right:tag('p'):wikitext(edata.intro)
	if edata.fits == nil then
		right:tag('div'):addClass('equip-note'):wikitext('*可能存在特殊人形不受枪种限制') end
	banner:tag('span'):addClass('equip-banner-back1'):wikitext('DATASHEET')
	banner:tag('span'):addClass('equip-banner-back2'):wikitext('装备详情')
end

local function makeCard(d, f)
	local typeinfo = tdata[d.etype]
	local desc = d.desc
	local dollar = (mw.ustring.find(desc, '$', 1, true))
	if mw.ustring.sub(desc, dollar-4, dollar-1) == '<hr>' then
		desc = mw.ustring.gsub(desc, '$', '')
	else desc = mw.ustring.gsub(desc, '$', '<hr>') end
	for i, v in ipairs(bonuses) do
		if d[v] ~= nil and mw.ustring.find(desc, v) ~= nil then
			local rpl = d[v][2]
			if d.bonus_type ~= nil and d.bonus_type[v] ~= nil then
				rpl = math.floor(rpl*(1+d.bonus_type[v]/1000)) end
			desc = mw.ustring.gsub(desc, v, string.format('span>%d</span', rpl))
		end
	end
	return f:expandTemplate{title = '装备/card', args = {
		['类型图标'] = typeinfo.code,
		['星级'] = d.rank,
		['代号'] = d.code,
		['名称'] = d.name,
		['类别'] = cats[typeinfo.category],
		['类型'] = typeinfo.name,
		['描述'] = mw.ustring.gsub(desc, '<%>', '<span>%</span>')
	}}
end

local function addInfobox()
	local infobox = root:tag('div'):addClass('equip-infobox')
	local fitguns = {}
	if edata.fits ~= nil then
		for _, v in ipairs(edata) do fitguns[#fitguns+1] = '<li>[[' .. xdata[v][1] .. ']]</li>' end
	end
	infobox:wikitext(makeCard(edata, mw.getCurrentFrame()))
	if #fitguns > 0 then
		infobox:tag('table')
			:tag('tr'):tag('th'):wikitext('适用人形'):done():done()
			:tag('tr'):tag('td'):tag('ul'):wikitext(table.concat(fitguns))
	end
end

local function _equipInfo(id)
	root = mw.html.create()
	edata = data[id]
	addInfobox()
	equip = root:tag('div'):addClass('equip')
	addBanner()
	addSpec()
	addObtain()
	local styles = mw.getCurrentFrame():extensionTag{
		name = 'templatestyles', args = { src = '模板:装备/styles.css' }
	}
	return styles .. tostring(root)
end

function p.equipInfo(frame)
	local args = frame == mw.getCurrentFrame() and frame:getParent().args or frame
	return _equipInfo(tonumber(args[1]))
end
return p