模块:舰娘函数

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

舰娘函数 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