◆少前百科是非盈利性、非官方的少女前线维基百科。 ◆如果您发现某些内容错误/空缺,请勇于修正/添加!参与进来其实很容易!点这里 加入少前百科。 ◆有任何意见、建议、纠错,欢迎在 GFwiki:反馈与建议 提出和讨论。编辑事务讨论QQ群:597764980,微博@GFwiki少前百科 ◆To foreigners,You can use twitter to contact us. |
“模块:Gun info”的版本间的差异
第14行: | 第14行: | ||
local function makeCard(d, f, p) | local function makeCard(d, f, p) | ||
+ | local cats = {'配件', '弹匣', '人形'} | ||
local typeinfo = etdata[d.etype] | local typeinfo = etdata[d.etype] | ||
local desc = d.desc | local desc = d.desc |
2023年5月8日 (一) 00:05的版本
模块:Gun info及其子页面是一组主要用于存放和展示战术人形相关信息的模块,其各个部分的作用见下文。
组成部分
控制代码
- 主页面,实现模板:战术人形信息
- 模块:Gun info/index输出人形数据列表,供战术人形图鉴使用
- 模块:Gun info/new输出最近30天实装的人形,供首页/新增人形展示用
数据
- 人形数据
- 模块:Gun info/data存放未心智升级的普通战术人形的数据
- 模块:Gun info/data extra存放特典人形的数据
- 模块:Gun info/data mod存放战术人形心智升级后与原来不同的数据
- 模块:Gun info/ex data从人形数据中单独挑出的人形名称和专属装备编号数据,替代完整的人形数据被装备页面模板请求,以减少请求的数据体积(见模块:Equip info)
- 模块:Gun info/obtain data存放获取方式的数据,也包括装备、妖精等游戏内容的获取方式
- 模块:Gun info/org data存放战术人形和融合势力在格里芬所属部门的数据
- 模块:Gun info/skin data存放人形装扮的数据
- 模块:Gun info/skinclass data存放装扮主题的数据
local p = {} local args = {} local super local gundata local data local bdata = {} local etdata = mw.loadData('Module:Equip info/type data') local infobox = require('Module:Infobox').infobox local guntype = { {'手枪', '冲锋枪', '步枪', '突击步枪', '机枪', '霰弹枪', [0] = '所有枪种'}, {'HG', 'SMG', 'RF', 'AR', 'MG', 'SG'} } local attrs = {'伤害', '射速', '命中', '回避', '暴击率', '技能冷却速度', '', '护甲'} local bonuses = {'pow', 'hit', 'dodge', 'speed', 'rate', 'critical_harm_rate', 'critical_percent', 'armor_piercing', 'armor', 'night_view_percent', 'bullet_number_up'} local function makeCard(d, f, p) local cats = {'配件', '弹匣', '人形'} local typeinfo = etdata[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 = #bonuses, 1, -1 do local v = bonuses[i] 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, ['页面'] = p ~= nil and d.altname or d.name, ['名称'] = d.name, ['类别'] = cats[typeinfo.category], ['类型'] = typeinfo.name, ['描述'] = mw.ustring.gsub(desc, '<%%>', '<span>%</span>') }} end local function putEquipments() local root = super:tag('div'):attr('id', 'equip-container') local function copy(t) local ret = {} for i, v in ipairs(t) do ret[i] = v end return ret end local equips = { {{1, 4, 13, 16}, {2, 6}, {3,10}}, {{3, 9, 10}, {2, 6}, {1, 1, 2, 3, 4, 13}}, {{2, 5}, {1, 1, 2, 3, 13}, {3, 15}}, {{1, 1, 2, 3, 4, 13}, {2, 8}, {3, 9, 10}}, {{2, 5, 17}, {1, 1, 2, 3, 16}, {3, 14, 21}}, {{3, 11}, {2, 7}, {1, 1, 2, 3, 4, 22}} } local defaults = equips[gundata.guntype] local catnames = {'配件', '弹匣', '人形'} root:newline():wikitext('=== 装备 ==='):newline() local edata = {} for i = 1,3 do edata[i] = gundata['equip' .. tostring(i)] and copy(gundata['equip' .. tostring(i)]) or defaults[i] end local equipTable = root:tag('table') for i = 1,3 do local tr = equipTable:tag('tr') for j = 1,3 do local td = tr:tag('td') if i == 1 then td:wikitext( '[[File:Equip_cat_' .. tostring(edata[j][1]) .. '.png|link=]]') elseif i == 2 then td:wikitext(catnames[edata[j][1]]) else local etypes = {} for k = 2,#(edata[j]) do etypes[k-1] = etdata[edata[j][k]].name end td:wikitext('可装备', table.concat(etypes, '/')) end end end local ex = gundata.exclusives if ex then local frame = mw.getCurrentFrame() local eqdata = mw.loadData('Module:Equip info/data') local exTable = root:tag('table'):tag('tr') local cols = {} for i = 1,3 do cols[#cols+1] = exTable:tag('td') end for _,v in ipairs(ex) do local e = eqdata[v] cols[etdata[e.etype].category]:wikitext(makeCard(e, frame)) end end end local function serveSkillInfo(order, ismod) local root = mw.html.create() local id = (ismod and moddata or gundata)['skill' .. order] local group = math.floor(id/1e5) == 1 and '1' or 'other' if not bdata[group] then bdata[group] = mw.loadData('Module:Battle skill config/data ' .. group) end skilldata = bdata[group][id] local skill = root:tag('table'):attr{ id = 'skill' .. order .. (ismod and 'mod' or ''), class = 'skill-table', ['data-cd'] = skilldata.cd_time, ['data-cd-start'] = skilldata.start_cd_time } if skilldata.vals then skill:attr('data-val', skilldata.vals) end local signature = skill:tag('tr'):attr('class', 'skill-signature') local icon = signature:tag('td') icon:attr('rowspan', 2) :wikitext('[[file:icon Skill ' .. skilldata.code .. '.png|48px|link=]]') local skillname = signature:tag('td') skillname:wikitext(skilldata.name) if order == '2' or ismod then skillname:tag('span'):wikitext('心智升级') end local lvcd = skill:tag('tr'):tag('td'):attr('class', 'skill-lvcd') lvcd:tag('span'):wikitext('等级10') lvcd:wikitext('前置冷却<span></span>秒/冷却时间<span></span>秒') skill:tag('tr'):tag('td'):attr{class = 'lv-control', colspan = 2} local desc = skill:tag('tr'):tag('td'):attr('colspan', 2) if skilldata.desc then local descstr = string.gsub(skilldata.desc, '{}', '<span class="skill"></span>') descstr = string.gsub(descstr, '\n', '<br>') desc:wikitext(descstr) else for i, v in ipairs(skilldata.full_desc) do desc:tag('p'):wikitext((string.gsub(v, '\n', '<br>'))) end end return tostring(root) end local function putSkills() local root = super:tag('div'):attr('id', 'skill-container') root:newline():wikitext('=== 技能 ==='):newline() root:wikitext(serveSkillInfo('1')) if gundata['mod'] then root:wikitext(serveSkillInfo('1', true)) root:wikitext(serveSkillInfo('2', true)) end end local function addImages() local root = super:tag('div'):attr('id', 'image-container') root:newline():wikitext('== 人形外观 =='):newline() local guncode = string.gsub(gundata.code, ' ', '_') local skindata = mw.loadData('Module:Gun info/skin_data') local control = root:tag('div'):attr('id', 'unit-showcase-control') control:tag('div'):attr('id', 'unit-image-selected') :tag('div'):wikitext('初始形象'):done():tag('div') local menu = control:tag('ul'):attr('id', 'unit-image-selector'):css('display', 'none') control:tag('div'):attr('id', 'state-toggle'):done() :tag('div'):attr('id', 'live2d-toggle') menu:tag('li'):attr('data-skincode', guncode):wikitext('初始形象') if moddata then local moditem = menu:tag('li') :attr('data-skincode', guncode .. 'Mod'):wikitext('心智升级') local l2dmod = {[55] = 1, [56] = 1, [57] = 1, [65] = 1, [101] = 1, [103] = 1, [122] = 1, [143] = 1} if l2dmod[gundata.id] then moditem:addClass('live2d1') end end for _, v in ipairs(gundata.skins) do skin = skindata[v] if skin then local skincode = guncode .. '_' .. tostring(v) local item = menu:tag('li') item:tag('span'):wikitext(skin.name) item:tag('span'):wikitext(skindata.skin_classes[skin.class]) local skintype = skin['type'] item:attr('data-skincode', skincode) if skintype ~= 0 then item:addClass('live2d' .. tostring(skintype)) end end end local showcase = root:tag('div'):attr('id', 'unit-image-showcase') showcase:tag('div'):attr('id', 'unit-image-display') :done():tag('div'):attr('id', 'live2d-control'):cssText('display:none') end 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 concatEffects(anames, avals, coeff) local effects = {} for i = 1, #anames do local sign = avals[i] > 0 and '+' or '' table.insert(effects, string.format('%s<span class="effect-%s">%s%d%%</span>', anames[i], sign == '+' and 'positive' or 'negative', sign, math.floor(avals[i]*coeff))) end return table.concat(effects, ' ') end local function makeEffectTable(self_pos, effect_poses, target, effect, parent) local effect_table = parent:tag('table'):addClass('effect-table'):tag('tr') local effect_grid = effect_table:tag('td'):tag('table'):addClass('effect-grid') local index = 1 for i = 0, 2 do local tr = effect_grid:tag('tr') for j = 1, 3 do local td = tr:tag('td') if i*3 + j == effect_poses[index] then td:addClass('effect-cell') index = index + 1 elseif i*3 + j == self_pos then td:addClass('self-cell') end end end local effect_text = effect_table:tag('td') effect_text:wikitext('<span class="effect-caption">影响格效果</span><br>') local targets = {} for _, v in ipairs(target) do targets[#targets+1] = guntype[1][v] end effect_text:wikitext(string.format('对%s有效', table.concat(targets, '、'))) local anames, avals = {}, {} for i,v in ipairs(effect) do if i%2 == 1 then table.insert(anames, attrs[v]) else table.insert(avals, v) end end effect_text:wikitext('<br>') effect_text:wikitext(concatEffects(anames, avals, 1)) if gundata.guntype == 1 then for i = 1.25, 2, 0.25 do effect_text:wikitext('<br>') effect_text:wikitext(concatEffects(anames, avals, i)) end end end local function addCombatInfo() local root = super:tag('div'):attr('id', 'stat-container') local gtype = gundata.guntype local speeds = {15,12,7,10,4,6} local crits = {20,5,40,20,5,40} local targets = {{0}, {4}, {1}, {2}, {6}, {5}} root:newline():wikitext('== 战斗数据 =='):newline() local ratios = { gundata.life, gundata.power, gundata.rate, gundata.hit, gundata.dodge, gundata.armor or 0 } local attrdataset = root:tag('div'):attr{ id = 'attr-dataset', ['data-type'] = gtype, ['data-growing'] = table.concat(ratios, ','), ['data-growth'] = gundata.growth, ['data-max-rate'] = gundata.max_rate } if moddata then ratios = { moddata.life, moddata.power, moddata.rate, moddata.hit, moddata.dodge, moddata.armor or 0 } attrdataset:attr{ ['data-growing-mod'] = table.concat(ratios, ','), ['data-growth-mod'] = moddata.growth, ['data-max-rate-mod'] = moddata.max_rate } end local attrtable = root:tag('div'):attr('id', 'attr-table') attrtable:newline():wikitext(string.format([[ {| !id="ap"|穿甲!!id="round"|弹量!!id="speed"|移速!!id="crit"|暴击!!id="critpow"|暴伤 |- |15||data-attr="%d" data-mod="%d"|%s||%s||data-attr="%d" data-mod="%d"|%s||150%% |}]], gundata.round or 0, moddata and moddata.round or 0, tostring(gundata.round or '不适用'), tostring(speeds[gtype]), gundata.crit or crits[gtype], moddata and moddata.crit or crits[gtype], tostring(gundata.crit or crits[gtype]))) local self_pos, effect_poses = getGridPositions(gundata.grid_center or 13, gundata.grid_pos) local container = moddata and root:tag('div'):attr('id', 'effects') or root makeEffectTable(self_pos, effect_poses, gundata.effect_target or targets[gtype], gundata.effect, container) if moddata then self_pos, effect_poses = getGridPositions(moddata.grid_center or 13, moddata.grid_pos) makeEffectTable(self_pos, effect_poses, moddata.effect_target or targets[gtype], moddata.effect, container) end end local function addInfobox() local modrank = {'', '4', '4', '5', '6'} local orgdata = mw.loadData('Module:Gun info/org data') local org, org2 = orgdata[math.floor(gundata.org/100)], orgdata[gundata.org] local illu, cv = gundata.illu, gundata.cv root:wikitext(infobox{ above = gundata.name, label1 = '编号', data1 = gundata.id, label2 = '武器类型', data2 = guntype[1][gundata.guntype], label3 = '稀有度', data3 = tostring(gundata.rank) .. (moddata and '(心智升级:' .. modrank[gundata.rank] .. ')' or ''), label4 = '所属部门', data4 = string.format('[[内部一览/%s|%s]]-%s', org, org, org2), label5 = '作画', data5 = illu and string.format('[[立绘画师一览#%s|%s]]', illu, illu), label6 = '配音', data6 = cv and string.format('[[角色配音一览#%s|%s]]', cv, cv) }) root:newline() end local function _gunInfo() if tonumber(args[1]) < 1000 then data = mw.loadData('Module:Gun info/data') else data = mw.loadData('Module:Gun info/data extra') end gundata = data[tonumber(args[1])] if gundata == nil then return '<p style="color:red">未找到编号对应的战术人形信息,请检查编号是否正确及' .. '<a href="/w/Module:Gun_info/data">Module:Gun info/data</a>的数据是否为最新。</p>' end if gundata.mod == 1 then local moddataOrig = mw.loadData('Module:Gun info/data mod')[tonumber(args[1])+20000] moddata = {skill2 = moddataOrig.skill2} for k,v in pairs(gundata) do moddata[k] = moddataOrig[k] or v end end local root = mw.html.create() super = root:tag('div'):attr('id', 'doll-container') --addInfobox() addImages() addCombatInfo() putSkills() putEquipments() local templatestyles = mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = '模板:战术人形信息/styles.css' } } return templatestyles .. tostring(root) end function p.gunInfo(frame) if frame == mw.getCurrentFrame() then args = frame:getParent().args else args = frame end return _gunInfo() end return p