模块:深海栖舰函数改

来自舰娘百科
跳转至: 导航搜索

写在前面

若您在其他页面调用了本模块函数,请将调用页面更新于此

若您修改了本模块的代码逻辑,请确认上述页面工作正常

概述

本模块(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