- 您可以在 贡献者社区 中了解更新进度或提出建议
模块:舰娘函数
舰娘函数 API参考指南
请勿调用尚未实现的方法。 警告:这个模块不会对非法参数进行特殊错误处理,请确保参数合法。
已经实现的方法
getSpDataById
根据请求的舰船id和属性名称,返回符合搜索条件的第一个值。id为kcwiki ID(非改装船维持不变,改装船为原船+一位字母表示科技等级改修等级)。
{{#invoke:舰娘函数|getSpDataById|舰船编号|属性名1|属性名2|衍生等级}}调用示例:
{{#invoke:舰娘函数|getSpDataById|131|数据|火力|2}}
调用示例的返回值:
129
参数合法值:
舰船编号: 请求的舰船的ID。必须为数字。 ID必须为3位数,或3位数+1个小写字母的形式。例如:080a 具体舰船对应编号请参考 > http://zh.kcwiki.moe/wiki/%E6%A8%A1%E5%9D%97:%E8%88%B0%E5%A8%98%E6%95%B0%E6%8D%AE 属性名1: 可以是ID、图鉴号、日文名、假名、中文名、舰种、级别、类别、搭载、数据、装备、获得、消耗、改修、解体、改装、画师、声优、入手方式。 类别是舰种+级别数据的计算后结果。例如,{{#invoke:舰娘函数|getSpDataById|131|类别}}的返回值为:大和型 / 一番舰 / 战列舰 搭载是舰船所能搭载的最大飞机数量。 属性名2: 若属性名1为级别,可以是1或2。1对应型号,2对应番号,均为Raw data。若要获取计算后的结果请使用"类别"。 若属性名1为数据,可以是耐久、火力、雷装、对空、装甲、对潜、回避、索敌、运、速力、射程、稀有度。 若属性名1为装备,可以是格数、搭载、初期装备。 若属性名1为获得,可以是改造、建造、掉落、时间。 若属性名1为消耗,可以是燃料、弹药。 若属性名1为改修,可以是火力、雷装、对空、装甲。 若属性名1为解体,可以是燃料、弹药、钢材、铝。 若属性名1为改装,可以是等级、弹药、钢材、改装前、改装后。 衍生等级: 将最后一个参数取名为衍生等级并没有什么特别的意义,完全是作者eve中毒的结果( 若属性名1为数据,衍生等级为1返回初始属性,衍生等级为2返回最大强化时的属性。不适用于速力、射程和稀有度。 若属性名1为装备,衍生等级数用于指定插槽。例如,衍生等级2指第二装备插槽。不适用于插槽数(格数)本身。 ps: 如果舰船的某个装备格不能安装装备,则请求装备时返回空字符串。如果某个装备格完全不能搭载飞机,则请求搭载数时返回空字符串。
返回值的具体含义请参考:http://zh.kcwiki.moe/wiki/%E6%A8%A1%E5%9D%97:%E8%88%B0%E5%A8%98%E6%95%B0%E6%8D%AE
尚未实现的方法
这里列出已在队列中但是还没有填完的坑。请勿使用它们。
getSpById
根据请求的舰船ID,返回符合搜索条件的第一个值。id为图鉴ID。 已知问题:
数据存储格式有问题,此模块暂时无法应用于所有舰船。 数据输出存在问题,尚未成功找到问题所在。调用格式:
{{#invoke:舰娘函数|getSpById|舰船ID}}调用示例:
{{#invoke:舰娘函数|getSpById|1}}
调用示例的返回值:
Lua错误 第186行:attempt to index field '?' (a nil value)
参数合法值:
任意合法的舰船ID均可,无须补0。
getSpDataByFilter
根据请求的舰船类型,返回符合过滤条件的所有舰船的可排序属性列表。
调用格式:{{#invoke:舰娘函数|getSpDataByFilter|舰船类型}}调用示例:
{{#invoke:舰娘函数|getSpDataByFilter|战列舰}}
调用示例的返回值:
<待补完>{{#invoke:舰娘函数|getSpDataByFilter|战列舰}}
参数合法值:
<待补完>
Source code
-- UNDER CONSTRUCTION --
-- 正在施工 --
-- 警告:这个模块不保证会对非法参数进行特殊错误处理,请确保参数合法。
local spData = require("模块:舰娘数据")
local eqData = require("模块:舰娘装备数据改")
local getSpData = {}
local string = {
len = string.len,
sub = string.sub
}
-- 创建变量并读取数据表 --
local shipDataTb = spData.shipDataTb
local equipDataTb = eqData.equipDataTb
-- 函数:获取指定舰船的指定属性 --
function getSpData.getSpDataById(frame)
local requestId = frame.args[1]
if shipDataTb[requestId] == nil then
return "<span style=\"color:#ee8080\">舰船ID无效。</span>"
end
if frame.args[2] == "级别" or frame.args[2] == "获得" or frame.args[2] == "消耗" or frame.args[2] == "改修" or frame.args[2] == "解体" or frame.args[2] == "改造" then
if frame.args[2] == "级别" then
return shipDataTb[requestId][frame.args[2]][tonumber(frame.args[3])]
elseif frame.args[2] == "获得" and frame.args[3] == "时间" then
local temp1,temp2 = getFriendlyTimeByMinute(shipDataTb[requestId][frame.args[2]][frame.args[3]])
return "0"..temp1 .. ":" .. temp2 .. ":00"
else
return shipDataTb[requestId][frame.args[2]][frame.args[3]]
end
elseif frame.args[2] == "数据" then
if frame.args[3] == "速力" then
return getSpSpeedLevelValueById[tostring(shipDataTb[requestId]["数据"]["速力"])]
elseif frame.args[3] == "射程" then
return getSpAttackRangeValueById[shipDataTb[requestId]["数据"]["射程"]]
else
local value = shipDataTb[requestId][frame.args[2]][frame.args[3]][tonumber(frame.args[4])]
if value == '-1' or value == -1 then
return '?'
end
return value
end
elseif frame.args[2] == "装备" then
if frame.args[3] == "搭载" then
if tonumber(frame.args[4]) > shipDataTb[requestId]["装备"]["格数"] or shipDataTb[requestId]["装备"]["搭载"][tonumber(frame.args[4])] == -1 then
return ""
else
return shipDataTb[requestId]["装备"]["搭载"][tonumber(frame.args[4])]
end
elseif frame.args[3] == "初期装备" then
if tonumber(frame.args[4]) > shipDataTb[requestId]["装备"]["格数"] then
return ""
elseif shipDataTb[requestId]["装备"]["初期装备"][tonumber(frame.args[4])] == -1 then
return "无装备"
else
local equipEntry = shipDataTb[requestId]["装备"]["初期装备"][tonumber(frame.args[4])]
if type(equipEntry) == 'number' or type(equipEntry) == 'string' then
return getEqName(equipEntry)
end
if type(equipEntry) == 'table' then
local equipId = equipEntry['id']
if equipId == nil then
return '"初期装备"错误,KcWikiId:%d' .. requestId
end
return getEqName(equipId)
end
end
elseif frame.args[3] == "初期装备改修数" then
if tonumber(frame.args[4]) > shipDataTb[requestId]["装备"]["格数"] then
return ""
end
if shipDataTb[requestId]["装备"]["初期装备"][tonumber(frame.args[4])] == -1 then
return ""
end
local equipEntry = shipDataTb[requestId]["装备"]["初期装备"][tonumber(frame.args[4])]
if type(equipEntry) ~= 'table' then
return ""
end
local star = equipEntry['star']
if type(star) == 'number' and star > 0 then
return '★+' .. tostring(star)
end
return ""
else
return shipDataTb[requestId][frame.args[2]][frame.args[3]][tonumber(frame.args[4])]
end
elseif frame.args[2] == "ID" or frame.args[2] == "日文名" or frame.args[2] == "假名" or frame.args[2] == "中文名" or frame.args[2] == "舰种" or frame.args[2] == "画师" or frame.args[2] == "声优" or frame.args[2] == "日文WIKI" or frame.args[2] == "英文WIKI" then
return shipDataTb[requestId][frame.args[2]]
elseif frame.args[2] == "类别" then
return shipDataTb[requestId]["级别"][1].." "..getSpLevelValueById(shipDataTb[requestId]["级别"][2]).."/ "..getSpTypeValueById[shipDataTb[requestId]["舰种"]]
elseif frame.args[2] == "搭载" then
return getSpPlaneCapacityValue(shipDataTb[requestId]["装备"]["搭载"])
elseif frame.args[2] == "入手方式" then
local temp = ""
local brswitch = false
if shipDataTb[requestId]["获得"]["建造"] == 1 then
local temp1,temp2 = getFriendlyTimeByMinute(shipDataTb[requestId]["获得"]["时间"])
temp = "建造 / ".."0"..temp1 .. ":" .. temp2 .. ":00"
brswitch = true
end
if shipDataTb[requestId]["获得"]["改造"] >= 1 then
if brswitch == true then
temp = temp .. "<br/>"
else
brswitch = true
end
local beforeSpId=shipDataTb[requestId]["改造"]["改造前"]
temp = temp .. "改造 / "..shipDataTb[beforeSpId]["改造"]["等级"].."级"..shipDataTb[beforeSpId]["中文名"]
if shipDataTb[requestId]["获得"]["改造"] == 2 then
temp = temp .. "+图纸"
end
if shipDataTb[requestId]["获得"]["改造"] == 3 then
temp = temp .. "+图纸+弹射器"
end
if shipDataTb[requestId]["获得"]["改造"] == 4 then
temp = temp .. "+图纸+战斗详报"
end
end
--if shipDataTb[requestId]["获得"]["掉落"] == 1 then
--if brswitch == true then
--temp = temp .. "<br/>"
--else
--brswitch = true
--end
--temp = temp .. "掉落 / <span class='plainlinks'>[https://db.kcwiki.org/drop/ship/"..shipDataTb[requestId]["ID"].."/SAB.html 可通过打捞获得]</span>"
--end
if brswitch == false then
temp = "不可建造"
end
return temp
else
return "<span style=\"color:#ee8080\">参数无效。</span>"
end
end
-- 私有函数,仅供读取装备名称用 --
function getEqName(equipId)
equipId = tostring(equipId)
--装备那边作者比较懒用被动补0解决了他自己的排序问题,于是我这边就要麻烦一点。。。
if string.len(equipId) == 1 then
equipId = "00" .. equipId
elseif string.len(equipId) == 2 then
equipId = "0" .. equipId
end
if equipDataTb[equipId] == nil then
return "<找不到此装备>";
else
return equipDataTb[equipId]["中文名"]
end
end
-- 私有函数,将分钟数转化为时:分 --
function getFriendlyTimeByMinute(minute)
temp = tostring(minute - math.floor(minute/60)*60)
if string.len(temp) == 1 then
temp = "0"..temp
end
return tostring (math.floor(minute/60)),temp
end
-- 私有函数,在合理范围内格式化请求Id --
function formatId(temp)
if tonumber(string.sub(temp,-2,-1)) == nil then
if string.len(temp) == 3 then
temp = "0" + temp
elseif string.len(temp) == 2 then
temp = "00" + temp
end
else
if string.len(temp) == 2 then
temp = "0" + temp
elseif string.len(temp) == 1 then
temp = "00" + temp
end
end
return temp
end
-- 函数:获取指定舰船 --
-- 此功能已在 Template:舰娘资料 中实现,这里只保存一份早期实验用代码副本。
function getSpData.getSpById(frame)
wikitext = "{{舰娘资料|编号="..frame.args[1]..
"| 日文名字 ="..shipDataTb[frame.args[1]]["日文名"]..
"| 日文平假 ="..shipDataTb[frame.args[1]]["假名"]..
"| 中文名字 ="..shipDataTb[frame.args[1]]["中文名"]..
"| 类别 ="..shipDataTb[frame.args[1]]["级别"][1].." "..getSpLevelValueById(shipDataTb[frame.args[1]]["级别"][2]).."/ "..getSpTypeValueById[shipDataTb[frame.args[1]]["舰种"]]..
"| 耐久 ="..shipDataTb[frame.args[1]]["数据"]["耐久"][1]..
"| 耐久最大值 ="..shipDataTb[frame.args[1]]["数据"]["耐久"][2]..
"| 火力 ="..shipDataTb[frame.args[1]]["数据"]["火力"][1]..
"| 火力最大值 ="..shipDataTb[frame.args[1]]["数据"]["火力"][2]..
"| 装甲 ="..shipDataTb[frame.args[1]]["数据"]["装甲"][1]..
"| 装甲最大值 ="..shipDataTb[frame.args[1]]["数据"]["装甲"][2]..
"| 雷装 ="..shipDataTb[frame.args[1]]["数据"]["雷装"][1]..
"| 雷装最大值 ="..shipDataTb[frame.args[1]]["数据"]["雷装"][2]..
"| 回避 ="..shipDataTb[frame.args[1]]["数据"]["回避"][1]..
"| 回避最大值 ="..shipDataTb[frame.args[1]]["数据"]["回避"][2]..
"| 对空 ="..shipDataTb[frame.args[1]]["数据"]["对空"][1]..
"| 对空最大值 ="..shipDataTb[frame.args[1]]["数据"]["对空"][2]..
"| 搭载 ="..getSpPlaneCapacityValue(shipDataTb[frame.args[1]]["装备"]["搭载"])..
"| 对潜 ="..shipDataTb[frame.args[1]]["数据"]["对潜"][1]..
"| 对潜最大值 ="..shipDataTb[frame.args[1]]["数据"]["对潜"][2]..
"| 速力 ="..getSpSpeedLevelValueById[tostring(shipDataTb[frame.args[1]]["数据"]["速力"])]..
"| 索敌 ="..shipDataTb[frame.args[1]]["数据"]["索敌"][1]..
"| 索敌最大值 ="..shipDataTb[frame.args[1]]["数据"]["索敌"][2]..
"| 射程 ="..getSpAttackRangeValueById[shipDataTb[frame.args[1]]["数据"]["射程"]]..
"| 运 ="..shipDataTb[frame.args[1]]["数据"]["运"][1]..
"| 运最大值 ="..shipDataTb[frame.args[1]]["数据"]["运"][2]..
"| 建造时间 ="..shipDataTb[frame.args[1]]["获得"]["时间"]..
"| 装备1 =".."缺少数据"..
"| 装备2 =".."缺少数据"..
"| 装备3 =".."缺少数据"..
"| 装备4 =".."缺少数据"..
"| 搭载1 ="..getSpPlaneLayoutValue(shipDataTb[frame.args[1]]["装备"]["搭载"][1])..
"| 搭载2 ="..getSpPlaneLayoutValue(shipDataTb[frame.args[1]]["装备"]["搭载"][2])..
"| 搭载3 ="..getSpPlaneLayoutValue(shipDataTb[frame.args[1]]["装备"]["搭载"][3])..
"| 搭载4 ="..getSpPlaneLayoutValue(shipDataTb[frame.args[1]]["装备"]["搭载"][4])..
"| 画师 ="..shipDataTb[frame.args[1]]["画师"]..
"| 声优 ="..shipDataTb[frame.args[1]]["声优"]..
"| 日文WIKI ="..shipDataTb[frame.args[1]]["日文WIKI"]..
"| 英文WIKI ="..shipDataTb[frame.args[1]]["英文WIKI"].."}}"
return wikitext
end
------------------
-- Storage --
------------------
getSpTypeValueById={
"海防舰",
"驱逐舰",
"轻型巡洋舰",
"重型雷装巡洋舰",
"重型巡洋舰",
"航空巡洋舰",
"轻型航空母舰",
"战列巡洋舰",
"战列舰",
"航空战列舰",
"航空母舰",
"超弩级战舰",
"潜水舰",
"潜水航空母舰",
"补给舰(深海)",
"水上机母舰",
"扬陆舰",
"装甲航空母舰",
"工作舰",
"潜水母舰",
"练习巡洋舰",
"补给舰",
"轻航空巡洋舰",
"改装航空巡洋舰",
"兵装实验轻巡"
}
getSpSpeedLevelValueById={
["0"]="陆上基地",
["5"]="低速",
["10"]="高速"
}
getSpAttackRangeValueById={
"短",
"中",
"长",
"超长"
}
function getSpPlaneCapacityValue(temp)
local sum = 0
for i=1,5 do
if temp[i] ~= nil and temp[i] >= 0 then
sum = sum + temp[i]
end
end
return sum
end
function getSpPlaneLayoutValue(temp)
if temp>=0 then
return temp
else
return ""
end
end
function getSpLevelValueById(SpId)
local temp = {"/ 一番舰 ",
"/ 二番舰 ",
"/ 三番舰 ",
"/ 四番舰 ",
"/ 五番舰 ",
"/ 六番舰 ",
"/ 七番舰 ",
"/ 八番舰 ",
"/ 九番舰 ",
"/ 十番舰 ",
"/ 十一番舰 ",
"/ 十二番舰 ",
"/ 十三番舰 ",
"/ 十四番舰 ",
"/ 十五番舰 ",
"/ 十六番舰 ",
"/ 十七番舰 ",
"/ 十八番舰 ",
"/ 十九番舰 ",
"/ 二十番舰 ",
"/ 二十一番舰 ",
"/ 二十二番舰 ",
"/ 二十三番舰 ",
"/ 二十四番舰 ",
"/ 二十五番舰 ",
"/ 二十六番舰 ",
"/ 二十七番舰 ",
"/ 二十八番舰 ",
"/ 二十九番舰 ",
"/ 三十番舰 ",}
if type(SpId) == "string" then
return SpId .. " "
end
if SpId > 0 then
return temp[SpId]
else
return ""
end
end
return getSpData