模块:深海栖舰函数改
写在前面
若您在其他页面调用了本模块函数,请将调用页面更新于此
若您修改了本模块的代码逻辑,请确认上述页面工作正常
概述
本模块(module)基于模块:深海栖舰数据改和模块:深海装备数据提供了以下2个API
- 查询深海栖舰信息
- 查询深海栖舰名,不含后缀(改,elite,后期型,flagship)
查询栖舰信息
调用方法
在其他页面中调用API时,使用如下格式:
{{#invoke: 深海栖舰函数改|getShipDataById|栖舰ID|参数1}} {{#invoke: 深海栖舰函数改|getShipDataById|栖舰ID|参数1|参数2}} {{#invoke: 深海栖舰函数改|getShipDataById|栖舰ID|参数1|参数2|参数3}}
- 栖舰ID:舰队收藏游戏中,api_start2定义的深海装备ID
- 参数:需要获得的参数信息
当前支持查询的参数信息如下:
参数1 | 参数2 | 参数3 | 调用示例 | 返回结果 | 备注/注意点 |
---|---|---|---|---|---|
中文名 | {{#invoke: 深海栖舰函数改|getShipDataById|1542|中文名}} | 战舰TA级elite | |||
日文名 | {{lang|ja|{{#invoke: 深海栖舰函数改|getShipDataById|1542|日文名}}}} | 戦艦タ級elite | 需要再次调用日语处理模板{{lang|ja}}模板来处理返回结果 | ||
属性 | 耐久 对空 对潜 回避 索敌 速力 装甲 运 射程 |
{{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|耐久}} {{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|对空}} {{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|对潜}} {{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|回避}} {{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|索敌}} {{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|速力}} {{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|装甲}} {{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|运}} {{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|射程}} |
88 65 0 40 30 高 88 20 长 |
||
属性 | 火力 雷装 |
1:裸装值 2:栖装值 |
{{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|火力|1}} {{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|雷装|2}} |
75 0 |
|
装备 | 搭载 | <整数值> | {{#invoke: 深海栖舰函数改|getShipDataById|1542|装备|搭载|4}} | 4 | 参数3对应的装备槽的理论搭载量 |
装备 | 装备 | <整数值> | {{#invoke: 深海栖舰函数改|getShipDataById|1542|装备|装备|4}} | 参数3对应的装备槽的装备中文名 在本示例中,TA级的第4装备槽的搭载量是4,但装备却是水上雷达 Mark.I | |
搭载量 | {{#invoke: 深海栖舰函数改|getShipDataById|1542|搭载量}} | 16 | 所有装备槽的理论搭载量总和 | ||
装备列表 | {{#invoke: 深海栖舰函数改|getShipDataById|1604|装备列表}} | (6) |
以<p></p>分隔的装备列表中文名,如果是飞机类装备,带有搭载数 这个接口只供模板:深海栖舰改调用,请参考:该接口实现细节 | ||
后缀 | {{#invoke: 深海栖舰函数改|getShipDataById|1542|后缀}} | elite | 所有可能的中文后缀,包括: elite/flagship 后期型/后期型elite/后期型flagship 改/改elite/改flagship | ||
kcwiki分类 | {{#invoke: 深海栖舰函数改|getShipDataById|1542|kcwiki分类}} | 深海常规舰队 战列舰 |
- 日文名/中文名/kcwiki分类/属性数据/装备格数/单个装备槽搭载/单个装备槽装备,所有的整型-1和字符串型"-1"都会返回字符'?',空白字符(串)""或" "则原样返回
- 计算总搭载量时(如{{#invoke: 深海栖舰函数改|getShipDataById|shipID|搭载量}}),搭载数为-1的装备槽视为搭载数0
- 获得装备列表(如{{#invoke: 深海栖舰函数改|getShipDataById|shipID|装备列表}}),如果某一个装备槽装备了飞机类,但对应的搭载数为-1,则返回的字符串中,只有该飞机装备的中文名,不带搭载数
出错返回
错误调用示例 | 返回结果 |
---|---|
{{#invoke: 深海栖舰函数改|getShipDataById|1542|a}} | 第二个参数不正确: 1542, a |
{{#invoke: 深海栖舰函数改|getShipDataById|1542|日文名|1}} | 模块:深海栖舰函数改:79: 参数个数过多: 1542, 日文名, 1 |
{{#invoke: 深海栖舰函数改|getShipDataById|1542|属性}} | 模块:深海栖舰函数改:130: 参数个数小于3: 1542, 属性 |
{{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|火力}} | 模块:深海栖舰函数改:70: 最后一个参数不是整数: 1542, 属性, 火力 |
{{#invoke: 深海栖舰函数改|getShipDataById|1542|属性|火力|a}} | 模块:深海栖舰函数改:70: 最后一个参数不是整数: 1542, 属性, 火力, a |
{{#invoke: 深海栖舰函数改|getShipDataById|11542|属性|火力|1}} | ship ID不存在: 11542 |
{{#invoke: 深海栖舰函数改|getShipDataById|1542|装备}} | 模块:深海栖舰函数改:215: 参数个数小于3: 1542, 装备 |
{{#invoke: 深海栖舰函数改|getShipDataById|1542|装备|a}} | 模块:深海栖舰函数改:231: 第三个参数不正确: 1542, 装备, a |
{{#invoke: 深海栖舰函数改|getShipDataById|1542|装备|搭载|5}} | 模块:深海栖舰函数改:83: 索引越界: 1542, 装备, 搭载, 5 |
查询不带后缀的栖舰名
调用方法
主要是为了模板:深海栖舰改设计的API,暂无其他用途,使用方法如下:
{{#invoke: 深海栖舰函数改|getShipBasicNameById|栖舰ID|zh}} {{lang|ja|{{#invoke: 深海栖舰函数改|getShipBasicNameById|栖舰ID|ja}}}}
第一个参数zh/ja分别表示中文名和英文名,例如ID 1744的深海栖舰驱逐NA级后期型flagship,调用该接口的结果为:
驱逐NA级
駆逐ナ級
出错返回
错误调用示例 | 返回结果 |
---|---|
{{#invoke: 深海栖舰函数改|getShipBasicNameById|11744|zh}} | ship ID不存在: 11744 |
{{#invoke: 深海栖舰函数改|getShipBasicNameById|1744|z}} | 第二个参数不正确("zh" or "ja"): 1744, z |
{{#invoke: 深海栖舰函数改|getShipBasicNameById|1744}} | 第二个参数不正确("zh" or "ja"): 1744 |
实现细节
装备列表
仅供模板:深海栖舰改调用的函数API:
{{#invoke: 深海栖舰函数改|getShipDataById|1604|装备列表}}
实际返回的结果应该是:
<p>20英寸连装炮</p><p>20英寸连装炮</p><p>水上雷达 Mark.II</p><p>深海栖舰侦察机(6)</p>
因为<p></p>会被wiki直接解析,所以不能看到
在模板:深海栖舰改中,函数返回值被赋值给变量data2,作为模板:InfoboxKai的参数使用
遗留问题
出现海域
虽然在模块:深海栖舰数据中记录了出现海域数据,但并没有被使用
具体要返回什么样的格式的数据,还需要在今后的使用场景中再讨论/设计
现在调用
{{#invoke: 深海栖舰函数改|getShipDataById|1745|出现海域}}
都会返回
模块:深海栖舰函数改:296: 还不支持出现海域查询
--- Source code of KcWiki "模块:深海舰队函数"
-- Provide lua APIs to get shinkai ship data from "模块:深海舰队数据"
-- https://github.com/kcwikizh/kancolle-shinkai-db/tree/develop/lua
-- Please contact us by github issue
local p = {}
local ships, equips = {}, {}
if mw then
-- Kcwiki platform
ships = require('模块:深海栖舰数据改')
equips = require('模块:深海装备数据')
else
ships = require('ships')
equips = require('equips2')
end
local shipDataTable = ships.shipDataTable
local equipDataTable = equips.equipDataTable
local table = {
concat = table.concat,
insert = table.insert
}
local string = {
format = string.format,
find = string.find,
gsub = string.gsub
}
local UNKNOW_RETURN_VALUE = '?'
local planeCategoryTable = {
[6] = '舰上战斗机',
[7] = '舰上爆击机',
[8] = '舰上攻击机',
[9] = '舰上侦察机',
[10] = '水上侦察机',
[11] = '水上爆击机',
[41] = '大型飞行艇',
}
--- Return error massage with span style HTML label
-- @param msg: original message.
-- @return string: message with span style HTML label.
local function errMsg (msg)
if msg == nil then
retrurn ''
end
return string.format('<span style="color:#ee8080">%s</span>', msg)
end
--- Trim string
-- @param s: original string.
-- @return string: string that been trimmed
local function trim (s)
return (s:gsub("^%s*(.-)%s*$", "%1"))
end
--- Get the data directly, specified by args
-- @param ship: lua table of this ship
-- @param args: frame.args, all parameters by invoke {{#invoke:}} of wiki.
-- @param lastNumIdx: weather last element of args is a number or not.
-- @return string: the data that user want to get.
local function getDataDirectly (ship, args, lastNumIdx)
local var = ship
if lastNumIdx then
-- convert string -> number with validation
local lastArg = args[#args]
local data = tonumber(lastArg)
if data == nil then
error(string.format('最后一个参数不是整数: %s', table.concat(args, ', ')))
end
args[#args] = data
end
for i, v in ipairs(args) do
-- Skip args[1] because it's ship ID.
if i > 1 then
if type(var) ~= 'table' then
error(string.format('参数个数过多: %s', table.concat(args, ', ')))
end
var = var[v]
if var == nil then
error(string.format('索引越界: %s', table.concat(args, ', ')))
end
end
end
if type(var) == 'table' then
error(string.format('参数个数过少: %s', table.concat(args, ', ')))
end
return var
end
--- Get the ship suffix
-- @param ship: lua table of this ship
-- @return string: 'elite', 'flagship', '后期型', '后期型elite', '后期型flagship'
local function getSuffix (ship)
local fullName = ship['中文名']
local output = ''
if fullName == nil then
return output
end
if string.find(fullName, '后期型') then
output = '后期型'
elseif string.find(fullName, '改') then
output = '改'
end
if string.find(fullName, 'elite') then
output = output .. 'elite'
elseif string.find(fullName, 'flagship') then
output = output .. 'flagship'
end
return output
end
--- Get the ship attribute, specified by args, and maybe contains index at last
-- @param ship: lua table of this ship
-- @param args: frame.args, all parameters by invoke {{#invoke:}} of wiki.
-- @return string: the data that user want to get.
local function getAttrData (ship, args)
if #args < 3 then
error(string.format('参数个数小于3: %s', table.concat(args, ', ')))
end
if args[3] == '速力' then
local soku = getDataDirectly(ship, args)
local t = {
[0] = '路基',
[5] = '低',
[10] = '高'
}
return t[soku] or -1
end
if args[3] == '射程' then
local leng = getDataDirectly(ship, args)
local t = {
[0] = '无',
[1] = '短',
[2] = '中',
[3] = '长',
[4] = '超长',
[5] = '超超长'
}
return t[leng] or -1
end
if args[3] == '火力' or args[3] == '雷装' then
return getDataDirectly(ship, args, true)
end
return getDataDirectly(ship, args)
end
--- Get the equipment Lua table, specified by id
-- @param equipId: equipment id
-- @return table: the equipment Lua table
local function getEquipDataById (equipId)
local equipId = tostring(equipId)
local equipData = equipDataTable[equipId]
if equipData == nil then
error(string.format('equip ID不存在: %s', equipId))
end
return equipData
end
--- Get the equipments name, specified by id
-- @param equipId: equipment id
-- @return string: equipment chinese name
local function getEquipNameById (equipId)
local equipData = getEquipDataById(equipId)
local equipName = equipData['中文名']
if equipName == nil then
error(string.format('中文名缺失,equip ID: %s ', equipId))
end
return equipName
end
--- Get the equipments category, specified by id
-- @param equipId: equipment id
-- @return number: equipment category
local function getEquipCategoryById (equipId)
local equipData = getEquipDataById(equipId)
local equipCategory = equipData['类型'][3]
if equipCategory == nil then
error(string.format('Category,equip ID: %s ', equipId))
end
return equipCategory
end
--- Get the equipments, specified by args, and maybe contains index at last
-- @param ship: lua table of this ship
-- @param args: frame.args, all parameters by invoke {{#invoke:}} of wiki.
-- @return string: the data that user want to get.
local function getEquipData (ship, args)
if #args < 3 then
error(string.format('参数个数小于3: %s', table.concat(args, ', ')))
end
local arg3 = args[3]
if arg3 == '格数' then
return getDataDirectly(ship, args)
end
if arg3 == '搭载' then
return getDataDirectly(ship, args, true)
end
if arg3 == '装备' then
return getEquipNameById(getDataDirectly(ship, args, true))
end
error(string.format('第三个参数不正确: %s', table.concat(args, ', ')))
end
--- Get the number of total planes can carry
-- @param ship: lua table of this ship
-- @param args: frame.args, all parameters by invoke {{#invoke:}} of wiki
-- @return string: the planes number
local function getPlanesNum (ship)
local num = 0
for _, v in ipairs(ship['装备']['搭载']) do
if type(v) == 'number' then
if v > 0 then
num = num + v
end
end
end
return num
end
--- Get the HTML code of equips list for KcWiki template: 深海栖舰
-- @param ship: lua table of this ship
-- @return string : HTML code of equips
local function getEquipListHtml (ship)
local output = {}
for i, equipID in ipairs(ship['装备']['装备']) do
local status, name = pcall(getEquipNameById, equipID)
if status == false then
return errMsg(name)
end
local slotCapacity = ship['装备']['搭载'][i]
if slotCapacity and slotCapacity > 0 then
local status, category = pcall(getEquipCategoryById, equipID)
if status == false then
return errMsg(category)
end
if planeCategoryTable[category] then
name = string.format('%s(%d)', name, slotCapacity)
end
end
table.insert(output, string.format('<p>%s</p>', name))
end
return table.concat(output)
end
-- A table stores each method to get data spicified by frame.args[2]
local getShipDataMethodTable = {
['日文名'] = getDataDirectly,
['中文名'] = getDataDirectly,
['后缀'] = getSuffix,
['kcwiki分类'] = getDataDirectly,
['属性'] = getAttrData,
['装备'] = getEquipData,
['搭载量'] = getPlanesNum,
['装备列表'] = getEquipListHtml,
['出现海域'] = function ()
error('还不支持出现海域查询')
end
}
--- Get the ship data by ship id (api_start2)
-- @param frame: all parameters by invoke {{#invoke:}} of wiki.
-- @return string: the formated data.
function p.getShipDataById (frame)
-- Something strange that:
-- frame.args can't be table.concat or passed to deep function as parameter
-- or it will be an empty table, such as: table.concat(frame.args) -> ''
-- assign it to a local variable 'args', it works.
local args = {}
for _, v in ipairs(frame.args) do
table.insert(args, trim(v))
end
local ship = shipDataTable[args[1]]
if ship == nil then
return errMsg(string.format('ship ID不存在: %s', args[1]))
end
local getDataMethod = getShipDataMethodTable[args[2]]
if getDataMethod == nil then
return errMsg(string.format('第二个参数不正确: %s',
table.concat(args, ', ')))
end
local status, data = pcall(getDataMethod, ship, args)
if status == false then
return errMsg(data)
end
if data == -1 or data == '-1' then
return UNKNOW_RETURN_VALUE
else
return data
end
end
local function getBasicName (ship, lang)
local output = ''
local t = {
['zh'] = ship['中文名'],
['ja'] = ship['日文名']
}
local entire_name = t[lang]
if entire_name == nil then
return output
end
if lang == 'zh' then
output = string.gsub(entire_name, '后期型', '')
else
output = string.gsub(entire_name, '後期型', '')
end
output = string.gsub(output, '改', '')
output = string.gsub(output, 'elite', '')
output = string.gsub(output, 'flagship', '')
return output
end
--- Get the ship name without any suffix (改, 后期型, elite, flagship)
-- @param frame: all parameters by invoke {{#invoke:}} of wiki.
-- @return string: the formated data.
function p.getShipBasicNameById (frame)
local args = {}
for _, v in ipairs(frame.args) do
table.insert(args, trim(v))
end
local ship = shipDataTable[args[1]]
if ship == nil then
return errMsg(string.format('ship ID不存在: %s', args[1]))
end
local lang = args[2] or ''
if lang ~= 'zh' and lang ~= 'ja' then
return errMsg(string.format('第二个参数不正确("zh" or "ja"): %s',
table.concat(args, ', ')))
end
return getBasicName(ship, lang)
end
return p