如果你看到本段文字,说明该页面未正常加载全局JS,部分功能无法使用,请点击 刷新 重新加载页面。
如果打开页面显示缩略图创建出错,请点击刷新或页面右上WIKI功能中的刷新按钮清除页面缓存并刷新,如果还有问题,请多尝试几次。
全站通知:
模块:舰队模拟器
刷
历
编
跳到导航
跳到搜索
此模块的文档可以在模块:舰队模拟器/doc创建
local p = {}
local equip_data_module = require('模块:装备数据')
local ship_data_module = require('模块:舰娘数据')
--------------------------------------------------
-- 公开函数
--------------------------------------------------
p['舰娘数据'] = function()
local ship_data = callAskQuery('[[Category:舰娘||方案舰娘||联动舰娘||META舰娘]]', {
'?编号',
'?类型',
'?阵营',
'?改造后类型',
'?稀有度',
'?改造后稀有度',
'?名称',
'?1号槽装备类型',
'?2号槽装备类型',
'?3号槽装备类型',
link = 'none',
sort = '编号',
headers = 'hide',
format = 'table',
limit = 1000
})
local output = ''
for _, item in ipairs(ship_data) do
if string.len(item['改造后稀有度']) > 0 then
item['名称'] = item['名称']..'改'
item['类型'] = item['改造后类型']
item['改造'] = 1
item['稀有度编号'] = p.ship_rarity_data[item['改造后稀有度']]
else
item['稀有度编号'] = p.ship_rarity_data[item['稀有度']]
end
if item['类型'] == '驱逐' or item['类型'] == '轻巡' then
item['4号槽装备类型'] = '设备、反潜设备'
item['5号槽装备类型'] = '设备、反潜设备'
elseif item['类型'] == '轻航' and item['名称'] ~= '镇海'then
item['4号槽装备类型'] = '设备、反潜机'
item['5号槽装备类型'] = '设备、反潜机'
elseif item['名称'] == '伊势改' or item['名称'] == '日向改' or item['名称'] == '山城改' or item['名称'] == '扶桑改' then
item['2号槽装备类型'] = '轰炸机、鱼雷机、水上机'
item['4号槽装备类型'] = '设备'
item['5号槽装备类型'] = '设备'
elseif item['类型'] == '运输' then
item['4号槽装备类型'] = '设备、货物'
item['5号槽装备类型'] = '设备、货物'
elseif item['名称'] == '科隆改' then
item['4号槽装备类型'] = '设备、直升机'
item['5号槽装备类型'] = '设备'
elseif item['名称'] == '厌战改' then
item['4号槽装备类型'] = '设备、反潜机'
item['5号槽装备类型'] = '设备'
elseif item['名称'] == '絮库夫' then
item['3号槽装备类型'] = '重巡炮'
item['4号槽装备类型'] = '设备'
item['5号槽装备类型'] = '设备'
elseif item['类型'] == '风帆S' or item['类型'] == '风帆V'then
item['1号槽装备类型'] = '驱逐炮'
item['2号槽装备类型'] = '驱逐炮'
item['4号槽装备类型'] = '设备'
item['5号槽装备类型'] = '设备'
elseif item['类型'] == '风帆M' then
item['1号槽装备类型'] = '战列炮'
item['2号槽装备类型'] = '驱逐炮'
item['3号槽装备类型'] = '驱逐炮'
item['4号槽装备类型'] = '设备'
item['5号槽装备类型'] = '设备'
else
item['4号槽装备类型'] = '设备'
item['5号槽装备类型'] = '设备'
end
if item['名称'] == '鞍山改' or item['名称'] == '长春改' then
item['类型'] = '导驱'
end
if string.sub(item['名称'], -4) == 'META' then
item['阵营'] = 'META'
end
if item['编号'] == '001' then
item['星级'] = '★★★★'
elseif item['编号'] == '002' then
item['星级'] = '★★★★★'
else
item['星级'] = string.rep('★', math.floor((p.ship_rarity_data[item['稀有度']]-1)/2)+4)
end
end
output = output..'<div id="shipdata">{'
for _, item in ipairs(ship_data) do
output = output..parseShipData(item)
end
output = string.sub(output,1,-2)..'}</div>'
for _, item in ipairs(ship_data) do
output = output..parseShipIcon(item)
end
return output
end
p['装备数据'] = function()
local equip_data = callAskQuery('[[Category:装备]]', {
'?类型',
'?所属阵营',
'?稀有度',
'?名称',
'?唯一装备',
'?禁用舰种',
link = 'none',
sort = '名称',
headers = 'hide',
format = 'table',
limit = 1000
})
local output = ''
for _, item in ipairs(equip_data) do
--item['T级'] = string.sub(item['名称'], -1)
end
output = output..'<div id="equipdata">{'
icons = ''
local equipNameToId = {}
for _, equipm in ipairs(equip_data_module.equip_data) do
if equipm['displayname'] then
equipm['name'] = equipm['displayname']
end
for _, equips in ipairs(equipm['sub_equips']) do
for _, item in ipairs(equip_data) do
if item['名称'] == equipm['name']..'T'..equips['tech'] then
equipNameToId[item['名称']] = equips['id']
end
end
end
end
for _, equipm in ipairs(equip_data_module.equip_data) do
for _, equips in ipairs(equipm['sub_equips']) do
for _, item in ipairs(equip_data) do
if item['名称'] == equipm['name']..'T'..equips['tech'] then
output = output..parseEquipData(item, equips, equipm, equipNameToId)
icons = icons..parseEquipIcon(item, equips, equipm)
end
end
end
end
output = string.sub(output,1,-2)..'}</div>'
output = output..icons
return output
end
p['特殊兵装数据'] = function()
local spweapon_data = callAskQuery('[[Category:特殊兵装]]', {
'?稀有度',
'?名称',
'?适用舰种',
'?专属角色',
link = 'none',
sort = '名称',
headers = 'hide',
format = 'table',
limit = 1000
})
local ship_data = callAskQuery('[[Category:舰娘||方案舰娘||联动舰娘||META舰娘]]', {
'?编号',
'?名称',
link = 'none',
sort = '编号',
headers = 'hide',
format = 'table',
limit = 1000
})
local output = ''
for _, item in ipairs(spweapon_data) do
if item['专属角色'] == "" then
item['专属角色'] = "0"
else
for _, ship in ipairs(ship_data) do
if item['专属角色'] == ship['名称'] then
item['专属角色'] = ship['编号']
end
end
end
end
output = output..'<div id="spweapondata">{'
icons = ''
local equipNameToId = {}
for _, equipm in ipairs(equip_data_module.equip_data) do
if equipm['displayname'] then
equipm['name'] = equipm['displayname']
end
for _, equips in ipairs(equipm['sub_equips']) do
for _, item in ipairs(spweapon_data) do
if item['名称'] == equipm['name']..'T'..equips['tech'] then
equipNameToId[item['名称']] = equips['id']
end
end
end
end
for _, equipm in ipairs(equip_data_module.equip_data) do
for _, equips in ipairs(equipm['sub_equips']) do
for _, item in ipairs(spweapon_data) do
if item['名称'] == equipm['name']..'T'..equips['tech'] then
output = output..parseSpWeaponData(item, equips, equipm, equipNameToId)
icons = icons..parseSpWeaponIcon(item, equips, equipm)
end
end
end
end
output = string.sub(output,1,-2)..'}</div>'
output = output..icons
return output
end
p['国籍舰种数据'] = function()
local output = '<div id="shiptypedata">{'
for key, item in pairs(p.ship_type_data) do
output = output..string.format("\"%s\":\"%s\",", key, item)
end
output = string.sub(output,1,-2)..'}</div>'
output = output..'<div id="nationalitydata">{'
for key, item in pairs(p.nationality_data) do
output = output..string.format("\"%s\":\"%s\",", key, item)
end
output = string.sub(output,1,-2)..'}</div>'
return output
end
--------------------------------------------------
-- 私有函数
--------------------------------------------------
--调用#ask语义查询,并将结果解析为table
function callAskQuery(title, args)
local frame = mw.getCurrentFrame()
args.format = 'table'
local html = frame:callParserFunction('#ask:'..title, args)
--返回解析结果的key
local keys = {}
keys[1] = '' --#ask的参数#1是title
for i, v in ipairs(args) do
keys[i+1] = mw.text.trim(v:sub(2))
end
local data = {}
for tr in html:gmatch('<tr .-</tr>') do
if tr:match('smwfooter') then break end
local item = {}
local i = 1 --#1单元格是页面名称
for td in tr:gmatch('<td.->(.-)</td>') do
td = mw.text.trim(td)
item[i] = td
if keys[i] then item[ keys[i] ] = td end
i = i + 1
end
table.insert(data, item)
end
return data
end
function splitWord(str)
local t = {}
for word in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do
table.insert(t, word)
end
return t
end
function split(inputstr, sep)
local t={}
for str in string.gmatch(inputstr, "([^{"..sep.."}]+)") do
table.insert(t, str)
end
return t
end
function parseShipIcon(item)
return '<div id="shipIcon'..item['编号']..'">[[file:'..item['名称']..'头像.jpg|link=]]</div>'
end
function parseShipData(item)
local output_table = {}
local output = '"'..item['编号']..'":{'
table.insert(output_table, string.format("\"%s\":%s", 'nationality', nationalityNameToId(item['阵营'])))
table.insert(output_table, string.format("\"%s\":%s", 'type', shipTypeNameToId(item['类型'])))
table.insert(output_table, string.format("\"%s\":\"%s\"", 'uni_id', item['编号']))
table.insert(output_table, string.format("\"%s\":\"%s\"", 'cn_name', item['名称']))
table.insert(output_table, string.format("\"%s\":%s", 'retro', item['改造'] or 0))
table.insert(output_table, string.format("\"%s\":%s", 'rarity', item['稀有度编号'] or item['稀有度']))
table.insert(output_table, string.format("\"%s\":\"%s\"", 'star', item['星级']))
function insertEquip(t, etype, stype)
table.insert(t, equipTypeNameToId(etype) or -1)
if (stype == '战列' or stype == '战巡' or stype == '航战') and etype == '防空炮' then
table.insert(t, 21)
end
end
for i = 1,5 do
local temp = {}
local temp_string = ''
local temp_table = splitWord(item[i.."号槽装备类型"])
for k, v in ipairs(temp_table) do
if v == '、' then
insertEquip(temp, temp_string, item['类型'])
temp_string = ''
else
temp_string = temp_string..v
end
end
if string.len(temp_string) > 0 then
insertEquip(temp, temp_string, item['类型'])
end
table.insert(output_table, string.format("\"%s\":[%s]", 'equip_'..i, table.concat(temp, ',')))
end
output = output..table.concat(output_table, ",").."},"
return output
end
function parseEquipIcon(item, equips, equipm)
return '<div id="equipIcon'..equips['id']..'">[[file:'..item['名称']..'.jpg|link=]]</div>'
end
function parseEquipData(item, equips, equipm, equipNameToId)
local output_table = {}
local output = '"'..equips['id']..'":{'
table.insert(output_table, string.format("\"%s\":%s", 'nationality', equipm['nationality']))
table.insert(output_table, string.format("\"%s\":%s", 'type', equipm['type']))
table.insert(output_table, string.format("\"%s\":\"%s\"", 'id', equips['id']))
table.insert(output_table, string.format("\"%s\":\"%s\"", 'cn_name', item['名称']))
table.insert(output_table, string.format("\"%s\":%s", 'rarity', equips['rarity']))
table.insert(output_table, string.format("\"%s\":%s", 'tech', equips['tech']))
local temp = {}
local temp_string = ''
local temp_table = splitWord(item["禁用舰种"])
for k, v in ipairs(temp_table) do
if v == '、' then
table.insert(temp, shipTypeNameToId(temp_string) or temp_string)
temp_string = ''
else
temp_string = temp_string..v
end
end
if string.len(temp_string) > 0 then
table.insert(temp, shipTypeNameToId(temp_string) or temp_string)
end
table.insert(output_table, string.format("\"%s\":[%s]", 'ship_type_forbidden', table.concat(temp, ',')))
if item["唯一装备"] == "是" then
table.insert(output_table, string.format("\"%s\":\"%s\"", 'equip_limit', equips['id']))
elseif string.len(item['唯一装备']) > 0 then
temp_string = ""
temp_table = splitWord(item["唯一装备"])
for k, v in ipairs(temp_table) do
local temp_pos = string.find(v, '、', 1, true)
if temp_pos then
temp_string = temp_string..string.sub(v, 1, temp_pos-1)
table.insert(output_table, string.format("\"%s\":\"%s\"", 'equip_limit', equipNameToId[temp_string] or equips['id']))
break
else
temp_string = temp_string..v
end
end
if string.len(temp_string) == string.len(item["唯一装备"]) then
table.insert(output_table, string.format("\"%s\":\"%s\"", 'equip_limit', equipNameToId[temp_string] or equips['id']))
end
else
table.insert(output_table, string.format("\"%s\":\"%s\"", 'equip_limit', 0))
end
output = output..table.concat(output_table, ",").."},"
return output
end
function parseSpWeaponIcon(item, equips, equipm)
return '<div id="spweaponIcon'..equips['id']..'">[[file:'..item['名称']..'.jpg|link=]]</div>'
end
function parseSpWeaponData(item, equips, equipm, equipNameToId)
local output_table = {}
local output = '"'..equips['id']..'":{'
table.insert(output_table, string.format("\"%s\":\"%s\"", 'id', equips['id']))
table.insert(output_table, string.format("\"%s\":\"%s\"", 'cn_name', item['名称']))
table.insert(output_table, string.format("\"%s\":%s", 'rarity', equips['rarity']))
table.insert(output_table, string.format("\"%s\":%s", 'tech', equips['tech']))
table.insert(output_table, string.format("\"%s\":%s", 'type', equipm['type']))
table.insert(output_table, string.format("\"%s\":\"%s\"", 'limit', item['专属角色']))
local temp = {}
local temp_string = ''
item["适用舰种"] = item["适用舰种"]:gsub('<br>', '、')
local temp_table = splitWord(item["适用舰种"])
for k, v in ipairs(temp_table) do
if v == '、' then
table.insert(temp, shipTypeNameToId(temp_string) or temp_string)
if temp_string == '驱逐' then
table.insert(temp, 20)
end
temp_string = ''
else
temp_string = temp_string..v
end
end
if string.len(temp_string) > 0 then
table.insert(temp, shipTypeNameToId(temp_string) or temp_string)
end
table.insert(output_table, string.format("\"%s\":[%s]", 'ship_type', table.concat(temp, ',')))
output = output..table.concat(output_table, ",").."},"
return output
end
function equipTypeNameToId(name)
return p.equip_type_data[name]
end
function nationalityNameToId(name)
for k, v in pairs(ship_data_module.nation_data) do
if v == name then
return k
end
end
return -1
end
function shipTypeNameToId(name)
for k, v in pairs(ship_data_module.type_data) do
if v == name then
return k
end
end
return -1
end
--------------------------------------------------
-- 数据
--------------------------------------------------
p.nationality_data = {
[1] = '白鹰',
[2] = '皇家',
[3] = '重樱',
[4] = '铁血',
[5] = '东煌',
[6] = '撒丁帝国',
[7] = '北方联合',
[8] = '自由鸢尾',
[9] = '维希教廷',
[10] = '其他',
[96] = '飓风',
[97] = 'META',
[101] = '海王星',
[102] = '哔哩哔哩',
[103] = '传颂之物',
[104] = 'KizunaAI',
-- [105] = 'Hololive',
[106] = '维纳斯假期',
[107] = '偶像大师',
[108] = 'SSSS',
}
p.ship_type_data = {
[1] = "驱逐",
[2] = "轻巡",
[3] = "重巡",
[4] = "战巡",
[5] = "战列",
[6] = "轻航", --轻母
[7] = "航母", --正航
[8] = "潜艇",
[9] = "航巡",
[10] = "航战",
[11] = "雷巡",
[12] = "维修",
[13] = "重炮",
[17] = "潜母",
[18] = "超巡",
[19] = "运输",
[20] = "导驱", --前排,后排21
[22] = "风帆S",
[23] = "风帆V",
[24] = "风帆M",
}
p.ship_rarity_data = {
['普通'] = 2,
['稀有'] = 3,
['精锐'] = 4,
['超稀有'] = 5,
['海上传奇'] = 6,
['最高方案'] = 5,
['决战方案'] = 6
}
p.equip_type_data = {
['驱逐炮'] = 1,
['轻巡炮'] = 2,
['重巡炮'] = 3,
['战列炮'] = 4,
['水面鱼雷'] = 5,
['防空炮'] = 6,
['战斗机'] = 7,
['鱼雷机'] = 8,
['轰炸机'] = 9,
['设备'] = 10,
['大口径重巡炮'] = 11,
['水上机'] = 12,
['潜艇鱼雷'] = 13,
['反潜设备'] = 14,
['反潜机'] = 15,
['直升机'] = 17,
['货物'] = 18,
['导弹'] = 20,
['防空炮(远程)'] = 21,
}
return p