如果你看到本段文字,说明该页面未正常加载全局JS,部分功能无法使用,请点击 刷新 重新加载页面。
如果打开页面显示缩略图创建出错,请点击刷新或页面右上WIKI功能中的刷新按钮清除页面缓存并刷新,如果还有问题,请多尝试几次。
全站通知:

模块:舰队模拟器

来自碧蓝航线WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:舰队模拟器/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