来自碧蓝航线海事局

此模块的文档可以在模块:装备图鉴导航/doc创建



local p = require [[Module:装备数据]]


local TypeSpanDefination = {
	{
		text = '舰炮',
		sub_type = {
			1, 2, 3, 11, 4
		},
		sub_text = {
			'驱逐', '轻巡', '重巡', '大口径重巡', '战列'
		}
	};
	{
		text = '鱼雷',
		sub_type = { 5, 13 },
		sub_text = { '通常', '潜艇' }
	};
	{
		text = '防空炮',
		type = 6
	};
	{
		text = '舰载机',
		sub_type = { 7, 8, 9 },
		sub_text = { '战斗机', '鱼雷机', '轰炸机' }
	};
	{
		text = '设备',
		sub_type = { 10, 14 },
		sub_text = { '通常', '反潜' }
	};
	{
		text = '水上机',
		type = 12
	};
	{
		text = '反潜机',
		type = 15
	};
	{
		text = '直升机',
		type = 17
	};
}

--------------------------------------------------
--	公开函数
--------------------------------------------------

--显示按国籍、类型划分的导航面板
p.ShowEquipNavPannel = function()

	--当前页面的名称
	local curEquip = mw.title.getCurrentTitle().text
	local curNation;
	curEquip = curEquip:match('^(.+)T%d$') or curEquip
	
	--加载模块
	local equip_data = p.equip_data
		
	--分类汇总
	local data = {}
	for _, v in pairs(equip_data) do
		data[v.nationality] = data[v.nationality] or {}
		data[v.nationality][v.type] = data[v.nationality][v.type] or {}
		
		local sub_equip = v.sub_equips[#v.sub_equips]
		v.tech = sub_equip.tech
		v.rarity = sub_equip.rarity
		
		--找寻当前激活的页面
		curNation = curNation or v.name == curEquip and v.nationality
		
		table.insert(data[v.nationality][v.type], v)
	end
	
	curNation = curNation or 0
	
	--标签页面板参数
	local args = {
		theme = 'primary',
		label_style = 'font-weight:bolder; padding:0.5em 0.8em;',
		[1] = { 
			title = '通用',
			text = 'xx鱼雷 xx机枪',
			id = 'en',
			active = 1
		}
	}
	
	--整理表data的索引
	local nation_list = {}
	for nation, _ in pairs(data) do
		table.insert(nation_list, nation)
	end
	table.sort(nation_list)
	
	--遍历所有阵营
	for index, nation in ipairs(nation_list) do
		
		--表格开始
		local content = [[

<table class="table-ShowEquipNavPannel" width="100%">
]]
		local type_equip_dict = data[nation]
		
		--遍历每一个大类
		for _, def in ipairs(TypeSpanDefination) do
			
			--计算这个大类有哪些子类/要横跨多少行
			local rowspan = 0
			if def.sub_type then
				for _, sub_type in ipairs(def.sub_type) do
					if type_equip_dict[sub_type] then
						rowspan = rowspan + 1
					end
				end
			elseif def.type and type_equip_dict[def.type] then
				rowspan = 1
			end
			
			if rowspan < 1 then	--这个大类是空的,跳过
			else
				--遍历每一个子类
				local sub_type_list = def.sub_type or { def.type }
				local row_index = 0
				for i, equip_type in ipairs(sub_type_list) do
					local equip_list = type_equip_dict[equip_type]
					
					if not equip_list then
						--子类的装备列表是空的
					else
						row_index = row_index + 1
						
						--绘制表头<th>
						if row_index == 1 and def.type then
							-- [防空炮] | xx, xx, xxx
							content = content .. ([[
<tr class="tr-top">
<th class="th-equip-type" colspan="2">%s
</th>
]]):format(def.text)
						elseif row_index == 1 then
							-- [舰炮] | 驱逐 | xx, xx
							content = content .. ([[
<tr class="tr-top">
<th class="th-equip-type" rowspan="%d">%s
</th>
<th class="th-equip-subtype">%s
</th>
]]):format(rowspan, def.text, def.sub_text[i] or '')
						else
							-- [  ] | 战列 | xx, xx
							content = content .. ([[
<tr>
<th class="th-equip-subtype">%s
</th>
]]):format(def.sub_text[i] or '')
							
						end
						
						
						--对装备排序
						table.sort(equip_list, function(a, b)
								if a.rarity ~= b.rarity then
									return a.rarity > b.rarity
								elseif a.tech ~= b.tech then
									return a.tech > b.tech
								end
								return a.id < b.id
							end
						)
						
						
						--遍历每一个装备
						for j = 1, #equip_list do
							--解析为HTML文本
							local selflink = equip_list[j].name == curEquip
							equip_list[j] = equipHtmlSerializer(equip_list[j], selflink);
						end
						
						--绘制装备的单元格
						content = content .. ([[
<td>%s
</td>
</tr>
]]):format(table.concat(equip_list))
					end
				end
			end
		end
		
		--表格结束
		content = content.. '</table>\n'
		
		args[index] = {
			title = nationIdToName(nation),
			text = content,
			id = 'Nav-'..nation,
			active = curNation == nation
			}
	end
	
	
	local mTBP = require('Module:选项卡面板')
	return mTBP.GenerateWholePanel(args)
end



p['显示装备导航面板'] = function(frame)

	return p.ShowEquipNavPannel()
end


--------------------------------------------------
--	私有函数
--------------------------------------------------

--查找项目
function indexOf(t, val)
	for i, v in ipairs(t) do
		if v == val then return i end
	end
	return -1
end

--将稀有度转换为颜色
function rarityToColor(rare)
	if rare == 1 then
		return '#808080'	--白色
	elseif rare == 2 then
		return '#808080'	--白色
	elseif rare == 3 then
		return '#3b8bff'	--蓝色
	elseif rare == 4 then
		return '#8000ff'	--紫色
	elseif rare == 5 then
		return '#c90'	--金色
	elseif rare == 6 then
		return '#f37f82'	--彩色
	end
		return 'red'		--不存在
end

function typeIdToName(id)
	return p.equip_type[id] or '未知'
end

function nationIdToName(id)
	local nation_data = {
		[0] = '通用',
		[1] = '白鹰',
		[2] = '皇家',
		[3] = '重樱',
		[4] = '铁血',
		[5] = '东煌',
		[6] = '撒丁帝国',
		[7] = '北方联合',
		[8] = '鸢尾教廷',
		[9] = '维希教廷',
		[10] = '其他',
		[101] = '海王星联动',
		[102] = '哔哩哔哩联动',
		[103] = '传颂之物联动',
		[104] = 'KizunaAI联动',
		[105] = 'Hololive联动',
	}
	return nation_data[id] or '未知'
end

--将装备数据转换为有样式的HTML文本
function equipHtmlSerializer(equip, selflink)
	
	return selflink and 
('<span class="nowrap">&nbsp;•&nbsp;<strong class="selflink" style="color:#808080;">%s</strong></span> ')
		:format(equip.name) or 
('<span class="nowrap">&nbsp;•&nbsp;[[%s|<span style="color:%s;">%s</span>]]</span> ')
		:format(equip.name, rarityToColor(equip.rarity), equip.name)
end

return p