模块:舰娘图鉴导航
你可以通过#invoke
指令来调用这个模块中的函数。
增添舰船信息
添加舰船基本信息
在模块:舰娘数据中添加舰船的ID、阵营(nationality)、类型(type)、稀有度(rarity)、是否具有改造(transform)。
(没有改造可以省略transform的书写。)
例如:
["卡辛"] = { id = 101031, nationality = 1, type = 1, rarity = 2, transform = true },
上面代码的含义为:卡辛,ID为101031,阵营为白鹰,船型为驱逐舰,稀有度为普通,拥有船体改造。
添加舰船型号信息
在模块:舰娘数据/型号中增加舰船的ID、级别(class_des)、类型描述(type_des)、舷号(pennant_code)、同级舰船的序号(serial_no)
例如:
["神风"] = { id = 301301, class_des = "神风级", type_des = "驱逐舰", pennant_code = nil, serial_no = 1 },
上面代码的含义为:神风,ID为301301,神风级驱逐舰,无舷号,是神风级的首舰。
这里的type_des = "驱逐舰"
只用于显示,而不用于划分舰船类型,因此也可以填写为“轻型驱逐舰”或“护卫舰”等。
添加舰船级别信息
在模块:舰娘数据/级别中按顺序增加舰船级别用于排序
添加新的阵营
在模块:舰娘数据中的表p.nation_data
中添加阵营编号和阵营名称。
例如:
p.nation_data = { [1] = '白鹰', [2] = '皇家', [3] = '重樱', [4] = '铁血', [5] = '东煌', [10] = '格里芬与克鲁格', }
上面代码添加了编号为10,名为“格里芬与克鲁格”的阵营。 注意标点符号,尤其是引号和逗号。
在这个页面中的表p.nation_data.prints
中添加阵营编号和阵营英文缩写。
例如:
p.nation_data.prints = { [1] = "us", [2] = "en", [3] = "jp", [4] = "de", [5] = "cn", [10] = "gk", }
上面代码将“格里芬与克鲁格”的阵营英文设为“gk”。
在这个页面中的表p.ship_data
中修改舰船的阵营(nationality)属性,将其设为新的阵营编号。
例如:
["纳甘左轮"] = { id = 1001031, nationality = 10, type = 1, rarity = 2 },
上面代码将纳甘左轮的阵营设为了10,即“格里芬与克鲁格”阵营。
函数列表
显示带颜色的舰船链接
- 函数名
ShowNavItem
或显示项目
- 参数
- 参数#1 - 舰船的名称
代码:
{{#invoke: 舰娘图鉴导航|ShowNavItem|独角兽}} {{#invoke: 舰娘图鉴导航|显示项目|彗星}} {{#invoke: 舰娘图鉴导航|显示项目|不存在的舰船}}
显示某种类型的所有舰船链接
- 函数名
ShowNavListInType
或依类型显示导航列表
- 参数
- 参数#1 - 舰船类型(驱逐、轻巡等)
示例代码
{{#invoke:舰娘图鉴导航|依类型显示导航列表|战列}}
- 显示为
- • 腓特烈大帝
• 佐治亚• 君主• 出云• 大山• 马可·波罗• 香槟• 加斯科涅• 弗兰德尔
• 新泽西• 前卫• 武藏• 乌尔里希·冯·胡滕• 俾斯麦Zwei• 苏维埃同盟• 阿尔萨斯
• 北卡罗来纳• 华盛顿• 南达科他• 印第安纳• 马萨诸塞• 阿拉巴马• 厌战• 英王乔治五世• 威尔士亲王• 约克公爵• 豪• 皇家橡树• 长门• 加贺BB• 土佐• 三笠• 纪伊• 尾张• 骏河• 俾斯麦• 提尔比茨• 维托里奥·维内托• 利托里奥• 罗马• 苏维埃贝拉罗斯• 苏维埃罗西亚• 黎塞留• 让·巴尔• 克莱蒙梭• 加斯科涅(μ兵装)• 绊爱·SuperGamer• 穗香• 水濑伊织• 新条茜• 帕特莉夏·阿贝尔海姆• 雪不归• 金色暗影
• 亚利桑那• 科罗拉多• 马里兰• 西弗吉尼亚• 伊丽莎白女王• 纳尔逊• 罗德尼• 英勇• 复仇• 陆奥• 图林根• 小腓特烈• 朱利奥·凯撒• 安德烈亚·多利亚• 甘古特• 阿尔汉格尔斯克• 塞瓦斯托波尔• 波尔塔瓦• 里昂• 凪咲• 貉SSSS
• 宾夕法尼亚• 田纳西• 加利福尼亚• 扶桑• 山城• 伊势• 日向• 加富尔伯爵
• 内华达• 俄克拉荷马
显示整个图鉴导航
- 函数名
ShowNavTableContent
或显示导航列表
代码:
{{折叠面板|标题=图鉴导航|选项=3|主框=1|样式=primary}} {{#invoke:舰娘图鉴导航| 显示导航列表}} {{折叠面板|内容结束}}
显示为:
显示带标签页的导航面板
另,这个函数生成的面板可以/需要用CSS进一步调整样式。
另,这个函数不应当与函数【显示舰船型号导航面板】在同一个页面使用,会产生ID冲突。
- 函数名
ShowNavTabTable
或显示标签页导航面板
显示带标签页、按型号划分的导航面板
- 函数名
ShowShipClassNavPannel
或显示舰船型号导航面板
代码:
{{#invoke:舰娘图鉴导航| 显示舰船型号导航面板}}
显示为:
- 白鹰
- 皇家
- 重樱
- 铁血
- 东煌
- 撒丁帝国
- 北方联合
- 自由鸢尾
- 维希教廷
- 其他
- μ兵装
- 飓风
- META
- 海王星
- 哔哩哔哩
- 传颂之物
- KizunaAI
- 维纳斯假期
- 偶像大师
- SSSS
- Atelier Ryza
- 闪乱神乐NL
- To LOVE-Ru
--------------------------------------------------
-- TODO:
--
--------------------------------------------------
--------------------------------------------------
-- 调用模块:舰娘数据
--------------------------------------------------
local p = require('模块:舰娘数据')
local mSI = require('模块:舰娘图标')
local mSDC = require('模块:舰娘数据/型号')
local mCD = require('模块:舰娘数据/级别')
--------------------------------------------------
-- 公开函数
--------------------------------------------------
-- 显示一个导航项目,参数#1 - 船名
p.ShowNavItem = function(frame)
local data = { dye = 3, transform = 1,}
data.ship = normalizeShipName(frame.args[1])
return mSI.ParseShipTextOnly(data)
end
p["显示项目"] = p.ShowNavItem
-- 显示一段导航列表,参数#1 - 舰船类型
p.ShowNavListInType = function(frame)
local ship_type = parseShipType(frame.args[1]) or 1;
local list = getShipListInType(ship_type)
if #list < 1 then return '' end
local last_rare = p.ship_data[list[1]].rarity
for i = 1, #list do
local ship = list[i]
local rare = p.ship_data[ship].rarity
list[i] = ('• [[%s|<span style="color:%s;">%s</span>]]'):format(
ship, rarityToColor(rare), ship
)
if rare ~= last_rare then
list[i] = '<br>'..list[i]
last_rare = rare
end
end
return table.concat(list)
end
p["依类型显示导航列表"] = p.ShowNavListInType
--显示所有改造的舰船列表
p.ShowNavListOfKai = function(frame)
local list = {}
for ship, data in pairs(p.ship_data) do
if data.transform then
table.insert(list, data)
data.name = ship
end
end
table.sort(list, function(a, b)
if a.rarity ~= b.rarity then
return a.rarity > b.rarity
elseif a.nationality ~= b.nationality then
return a.nationality < b.nationality
elseif a.type ~= b.type then
return a.type > b.type
else
return a.id < b.id
end
end)
if #list < 1 then return '' end
local last_rare = list[1].rarity
local data = { dye = 2, transform = 3 }
for i = 1, #list do
local ship = list[i]
local rare = ship.rarity
data.ship = ship.name
list[i] = '• '.. mSI.ParseShipTextOnly(data)..' '
if rare ~= last_rare then
list[i] = '<br>'..list[i]
last_rare = rare
end
end
return table.concat(list)
end
p["依改造显示导航列表"] = p.ShowNavListOfKai
-- 显示整个导航区域
p.ShowNavTableContent = function(frame)
local content = [[
{| style="width:100%;" class="table-ShowNavTableContent"
]]
local table_line = [[
|-
! style="width:8%%;text-align:center" | %s
| %s
|-
| colspan=2|
----
]] -- {1} = 驱逐、战列等;{2} = 舰船列表
local postfix = [[
|} ]]
--当前页面的名称
local current_title = normalizeShipName(mw.title.getCurrentTitle().text)
local data = {}
--分类汇总
for k, v in pairs(p.ship_data) do
data[v.type] = data[v.type] or {}
table.insert(data[v.type], k)
end
--遍历每个舰船类型
for ship_type, ship_list in pairs(data) do
--排序(稀有度高,国家编号小,舰船编号小)
table.sort(ship_list, function(x,y)
local tx = p.ship_data[x]
local ty = p.ship_data[y]
if tx.rarity ~= ty.rarity then
return tx.rarity > ty.rarity
end
if tx.nationality ~= ty.nationality then
return tx.nationality < ty.nationality
end
return tx.id < ty.id
end)
--记录最后一个稀有度,用于按稀有度换行
local last_rare = #ship_list > 0
and p.ship_data[ship_list[1]].rarity
or 0
--遍历每个舰船
local tmp = { dye = 3, transform = 1,}
for i = 1, #ship_list do
local ship = ship_list[i]
tmp.ship = ship --舰娘名称
tmp.rarity = p.ship_data[ship].rarity --舰娘稀有度
local html = mSI.ParseShipTextOnly(tmp);
ship_list[i] = ('• %s '):format(html);
if tmp.rarity ~= last_rare then
ship_list[i] = '<br>'..ship_list[i]
last_rare = tmp.rarity
end
end
content = content..table_line:format(
typeIdToName(ship_type),
table.concat(ship_list)
);
end
return content..postfix
end
p["显示导航列表"] =p.ShowNavTableContent
--显示带标签页的导航面板
p.ShowNavTabTable = function(frame)
--当前页面的名称
local curShip = normalizeShipName(mw.title.getCurrentTitle().text)
local curNation = p.ship_data[curShip] and p.ship_data[curShip].nationality or 1
local ship_data = p.ship_data
local ship_data_class = mSDC.ship_data_class
local ship_class_list = mCD.ship_class_list
--分类汇总
local data = {}
for k, v in pairs(p.ship_data) do
data[v.nationality] = data[v.nationality] or {}
data[v.nationality][v.type] = data[v.nationality][v.type] or {}
table.insert(data[v.nationality][v.type], k)
end
--标签页
local args = {
theme = 'shiptable',
label_style = nil,
[1] = {
title = '皇家',
text = '胡德 厌战 反击 etc',
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 ship_list = data[nation]
--表格开始
local content = [[
{| style="width:100%;" class="table-ShowNavTabTable"
]]
--遍历每一个类型
for ship_type = 1, 13 do
local list = ship_list[ship_type]
if list and #list > 0 then
--遍历每个舰船
local tmp = { dye = 3, transform = 1,}
for i = 1, #list do
local ship = list[i]
tmp.ship = ship --舰娘名称
local html = mSI.ParseShipTextOnly(tmp);
list[i] = ('• %s '):format(html);
end
--表头
content = content..[[
|-
! ]] .. typeIdToName(ship_type) .. [[
| ]] .. table.concat(list) .. '\n'
end
end
--表格结束
content = content.. '|}\n'
args[index] = {
title = nationIdToName(nation),
text = content,
id = 'Nav-'..nationIdToEn(nation):upper(),
active = curNation == nation
}
end
local mTBP = require('Module:选项卡面板')
return mTBP.GenerateWholePanel(args)
end
p["显示标签页导航面板"]=p.ShowNavTabTable
--显示带标签页、按型号划分的导航面板
p.ShowShipClassNavPannel = function(frame, shipHtmlSerializer)
--将舰娘名字转换为有样式的HTML文本
shipHtmlSerializer = shipHtmlSerializer or function(ship)
return ('• %s '):format(
mSI.ParseShipTextOnly({
dye = 3,
transform = 1,
ship = ship
})
)
end
--当前页面的名称
local curShip = normalizeShipName(mw.title.getCurrentTitle().text)
local curNation = p.ship_data[curShip] and p.ship_data[curShip].nationality or 1
--加载模块
local ship_data_class = mSDC.ship_data_class
local ship_data = p.ship_data
local ship_class_list = mCD.ship_class_list
--分类汇总
local data = {}
for ship, v in pairs(ship_data) do
data[v.nationality] = data[v.nationality] or {}
data[v.nationality][v.type] = data[v.nationality][v.type] or {}
--当ship_data中有该舰船,而ship_data_class中没有时
if not ship_data_class[ship] then
mw.log("ShowShipClassNavPannel> ship_data_class中缺少ship_data中记录的舰船-"..ship)
ship_data_class[ship] = {id = v.id}
end
local v2 = ship_data_class[ship]
local class = v2.class_des or '其他'
data[v.nationality][v.type][class] =
data[v.nationality][v.type][class] or {}
table.insert(data[v.nationality][v.type][class], ship)
end
--标签页面板参数
local args = {
theme = 'shiptable',
label_style = 'font-weight:bolder;padding:0.4em 0.5em;cursor:pointer;',
[1] = {
title = '皇家',
text = '胡德 厌战 反击 etc',
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-ShowShipClassNavPannel" width="100%">
]]
--遍历所有舰船类型
for sortID, stype in ipairs(p.type_sort) do
if data[nation][stype] then
--对舰船级别排序
local class_list = {}
for class, ship_list in pairs(data[nation][stype]) do
table.insert(class_list, class)
--对舰船进行排序
table.sort(ship_list, function(a,b)
local sa = ship_data_class[a].serial_no
local sb = ship_data_class[b].serial_no
if sa == sb then
return ship_data[a].id < ship_data[b].id
else
return (sa or -1) < (sb or -1)
end
end
)
end
table.sort(class_list, function(a,b)
local ai, bi
for i, c in pairs(ship_class_list) do
if a == c then
ai = i
end
if b == c then
bi = i
end
end
if a == '其他' then
return false
elseif b == '其他' then
return true
end
if not ai or not bi then
local shipA = data[nation][stype][a][1]
local shipB = data[nation][stype][b][1]
return ship_data_class[shipA].id
< ship_data_class[shipB].id
end
return ai < bi
end
)
--舰船类型表头
if stype > 1 then
content = content .. ([[
<tr class="tr-top">
<th class="th-ship-type" rowspan="%s">%s
</th>
]]):format(#class_list, typeIdToName(stype))
else
content = content .. ([[
<tr class="tr-top">
<th class="th-ship-type" rowspan="%s">%s
</th>
]]):format(#class_list, typeIdToName(stype))
end
--遍历所有舰船级别
for i, class in ipairs(class_list) do
local ship_list = data[nation][stype][class]
local ship_v = ship_data_class[ship_list[1]]
local class_name = class == '其他' and '其他舰船'
or ship_v.type_des and ('%s<span class="ship-class-postfix">%s</span>'):format(class, ship_v.type_des)
or class
--遍历每一艘船
for j = 1, #ship_list do
--解析为HTML文本
ship_list[j] = shipHtmlSerializer(ship_list[j]);
end
--舰船级别表头 / 内容
if i > 1 then
content = content .. ([[
<tr>
<th class="th-ship-class">%s
</th>
<td>%s
</td>
</tr>
]]):format(class_name, table.concat(ship_list))
else
content = content .. ([[
<th class="th-ship-class">%s
</th>
<td>%s
</td>
</tr>
]]):format(class_name, table.concat(ship_list))
end
end
end
end
--表格结束
content = content.. '</table>\n'
args[index] = {
title = nationIdToName(nation),
text = content,
id = 'Nav-'..nationIdToEn(nation):upper(),
active = curNation == nation
}
end
local mTBP = require('Module:选项卡面板')
return mTBP.GenerateWholePanel(args)
end
p['显示舰船型号导航面板'] = function(frame)
local handler = frame.args[1] and mw.text.trim(frame.args[1])
handler = handler and mSI[handler];
local serializer;
if (handler) then
local ff = mw.getCurrentFrame();
ff.args = parseArgument(frame);
serializer = function(ship)
frame.args[1] = ship;
return (' %s '):format(
handler(ff)
)
end
end
return p.ShowShipClassNavPannel(frame, serializer);
end
--------------------------------------------------
-- 测试函数
--------------------------------------------------
p['测试'] = function(frame)
mw.log('测试', frame[1])
local foo = p[frame[1]]
if not foo then
local msg = ('函数%s不存在!'):format(frame[1] or 'nil')
mw.log(msg)
return msg
end
return mw.text.nowiki(foo(frame))
end
--------------------------------------------------
-- 私有函数
--------------------------------------------------
--解析传入参数——去空白符+转换数字
function parseArgument(frame)
local arg = {}
for k, v in pairs(frame.args) do
arg[k] = tonumber(v) or Text.trim(v)
end
return arg
end
function getShipListInType(shipType)
local ret = {}
for k, v in pairs(p.ship_data) do
if v.type == shipType then
table.insert(ret,k)
end
end
--排序
table.sort(ret, function(x,y)
local tx = p.ship_data[x]
local ty = p.ship_data[y]
if tx.rarity ~= ty.rarity then
return tx.rarity > ty.rarity
end
if tx.nationality ~= ty.nationality then
return tx.nationality < ty.nationality
end
return tx.id < ty.id
end)
return ret
end
function parseShipType(text)
if type(text) == 'number' then return number end
text = trim(text)
for id, stype in pairs(p.type_data) do
if text == stype then
return id
end
end
return text == '轻航' and 6 --轻航
or text == '轻母' and 6
or text == '正航' and 7 --正航
or text == '航母' and 7
or text == '空母' and 7
or nil
end
function typeIdToName(id)
return p.TypeIdToName(id, '未知')
end
function nationIdToName(id)
return p.NationIdToName(id, '未知')
end
function nationIdToEn(id)
return p.nation_data.prints[id] or 'nil'
end
function rarityToColor(n)
return mSI.RarityToColor(n)
end
function trim(str)
if not str then return '' end
return mw.text.trim(str)
end
function normalizeShipName(str)
return p.NormalizeShipName(trim(str or '') or '')
end
return p