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

模块:Gun info/index

来自少前百科GFwiki
跳转至: 导航搜索

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

local bit32 = require('bit32')

local p = {}
local data0 = mw.loadData('Module:Gun info/data')
local data1 = mw.loadData('Module:Gun info/data extra')
local data2 = mw.loadData('Module:Gun info/data mod')
local odata = mw.loadData('Module:Gun info/obtain data')
local attrs = {'伤害', '射速', '命中', '回避', '暴击率', '技能冷却速度', '', '护甲'}
local guntype = { {'手枪', '冲锋枪', '步枪', '突击步枪', '机枪', '霰弹枪', [0] = '所有枪种'},
	{'HG', 'SMG', 'RF', 'AR', 'MG', 'SG'} }
local targets = {{0}, {4}, {1}, {2}, {6}, {5}}
local modrank = {0, 4, 4, 5, 6}
local basic = {16, 45, 5, 5}
local basic_life_armor = {
    {{55, .555},
    {2, .161}},
    {{96.283, .138},
    {13.979, .04}}
}
local grow = {
    {{.242, 0},
    {.181, 0},
    {.303, 0},
    {.303, 0}},
    {{.06, 18.018},
    {.022, 15.741},
    {.075, 22.572},
    {.075, 22.572}}
}
local base_attr = {
	{.6,.6,.8,1.2,1.8,0},
	{1.6,.6,1.2,.3,1.6,0},
	{.8,2.4,.5,1.6,.8,0},
	{1,1,1,1,1,0},
	{1.5,1.8,1.6,.6,.6,0},
	{2,.7,.4,.3,.3,1}
}
local lang = mw.language.getContentLanguage()
local root
local frame

local function getGridPositions(center, pos)
	local self_pos = 4 - math.floor(center / 5) + 3 * (center % 5 - 2)
	local effect_poses = {}
	for i, v in ipairs(pos) do
		effect_poses[i] = 3*(2 - (v - 1)%5) + math.floor((v - 1)/5) - 2 + self_pos
	end
	table.sort(effect_poses)
	return self_pos, effect_poses
end

local function createTileString(center, pos)
	local self_pos, effect_poses = getGridPositions(center, pos)
	local ret = {0,0,0,0,0,0,0,0,0}
	ret[self_pos] = 2
	for _, p in ipairs(effect_poses) do ret[p] = 1 end
	return table.concat(ret, ',')
end

local function listToSlash(l, d)
	local ret = {}
	for i, v in ipairs(l) do ret[i] = d[v] end
	return table.concat(ret, '/')
end

local function calcLifeArmor(lv, attr, gtype, ismod, ratio)
	local i = bit32.band(attr, 3)
    return math.ceil(
        (basic_life_armor[ismod][i][1] + (lv-1)*basic_life_armor[ismod][i][2])
        	* base_attr[gtype][attr] * ratio / 100
    )
end

local function calc(lv, attr, gtype, ismod, ratio, growth)
    local base = basic[attr-1] * base_attr[gtype][attr] * ratio / 100
    local accretion = (grow[ismod][attr-1][2] + (lv-1)*grow[ismod][attr-1][1])
    	* base_attr[gtype][attr] * ratio * growth / 100 / 100
    return math.ceil(base) + math.ceil(accretion)
end

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 createDataRow(k)
	local gdata = k < 1000 and data0[k] or data1[k]
	local gtype = gdata.guntype
	local eco = gtype == 1 and 2 or 1
	local target = listToSlash(gdata.effect_target or targets[gtype], guntype[1])
	local base = {
		['data-mod'] = gdata['mod'] or 0,
		['data-time-stamp'] = lang:formatDate('U', gdata.launch_date),
		['data-tile-effect1'] = attrs[gdata.effect[1]],
		['data-tile-effect1-time'] = tostring(gdata.effect[2]*eco) .. '%',
		['data-tile-effect2'] = attrs[gdata.effect[3]] or '',
		['data-tile-effect2-time'] = gdata.effect[4] ~= nil and tostring(gdata.effect[4]*eco) .. '%' or '',
		['data-id'] = gdata.id,
		['data-name-ingame'] = gdata.name,
		['data-url'] = tostring(mw.uri.localUrl(gdata.name)),
		['data-rarity'] = gdata.id > 1000 and 1 or gdata.rank,
		['data-tdoll-class'] = guntype[2][gtype],
		['data-tiles'] = createTileString(gdata.grid_center or 13, gdata.grid_pos),
		['data-obtain-method'] = listToSlash(gdata.obtain or {0}, odata),
		['data-tiles-affect'] = target,
		['data-base-hp'] = calcLifeArmor(100, 1, gtype, 1, gdata.life),
		['data-base-armor'] = gtype == 6 and calcLifeArmor(100, 6, 6, 1, gdata.armor) or 0,
		['data-skill1'] = '',
		['data-production-time'] = formattime(gdata.produce_time),
		['data-avatar'] = frame:callParserFunction('filepath', 'icon_No.' .. tostring(gdata.id) .. '.png'),
		['data-type'] = guntype[1][gtype]
	}
	local gas = {{'atk', 'rate', 'acc', 'eva'}, {'power', 'rate', 'hit', 'dodge'}}
	for i = 1, 4 do base['data-base-' .. gas[1][i]] = calc(
		100, i+1, gtype, 1, gdata[gas[2][i]], gdata.growth) end
	local div = root:tag('div'):addClass('dolldata'):attr(base)
	if gdata['mod'] then
		local mdata = {}
		local mdatao = data2[gdata.id+20000]
		local mtarget = mdatao.effect_target ~= nil and listToSlash(mdatao.effect_target, guntype[1]) or target
		for k, v in pairs(gdata) do mdata[k] = mdatao[k] or v end
		bmod = {
			['data-modtile-effect1-time'] = tostring(mdata.effect[2]*eco) .. '%',
			['data-modtile-effect2-time'] = mdata.effect[4] ~= nil and tostring(mdata.effect[2]*eco) .. '%' or '',
			['data-tiles-affect-mod'] = mtarget,
			['data-avatar-mod'] = frame:callParserFunction('filepath', 'icon_No.' .. tostring(gdata.id) .. '_Mod.png'),
			['data-mod-rarity'] = modrank[gdata.rank],
			['data-tiles-mod'] = createTileString(mdata.grid_center or 13, mdata.grid_pos),
			['data-mod-hp'] = calcLifeArmor(120, 1, gtype, 2, mdata.life),
			['data-mod-armor'] = gtype == 6 and calcLifeArmor(120, 6, 6, 2, mdata.armor) or 0
		}
		for i = 1, 4 do bmod['data-mod-' .. gas[1][i]] = calc(
			120, i+1, gtype, 2, gdata[gas[2][i]], mdata.growth) end
		div:attr(bmod)
	end
end

function p.dollIndex()
	root = mw.html.create()
	frame = mw.getCurrentFrame()
	for k, _ in pairs(data0) do createDataRow(k) end
	for k, _ in pairs(data1) do createDataRow(k) end
	return tostring(root)
end
return p