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