Module:Arcaea Data:修订间差异
小无编辑摘要 |
小无编辑摘要 |
||
第209行: | 第209行: | ||
local s, info = "", {} | local s, info = "", {} | ||
if | if indexTyped == "id" then | ||
for i, k in ipairs(json['songs']) do | for i, k in ipairs(json['songs']) do | ||
info[k['id']] = k | info[k['id']] = k |
2022年7月29日 (五) 18:54的版本
本模块可查询Arcaea数据文件中存在的信息,为元模块,为其他模块提供支持。也提供接口对模块外直接查询。
通过模板:Songlist.json,模板:Songlist NS.json,模板:Packlist.json和模板:Unlocks.json进行分析以提供数据。
面向模块函数
singleSongInformation
获取一个曲目所有信息,返回值是一个函数。可以通过该函数进行查询。
使用方法
local data = require("Module:Arcaea Data")
local query = data.singleSongInformation("该曲目的索引值", "索引值的类型,id或name", "查找内容的平台,mobile或ns")
mw.log(query("需要查询的属性的名称"))
示例
local data = require("Module:Arcaea Data")
local query = data.singleSongInformation("ifi", "id", "mobile")
-- 此时query是一个函数,传入需要查询的属性名称返回该属性的值。
mw.log(query("pstChartDesigner"))
-- 输出"夜浪"
allSongInformation
获取任何曲目的任何信息,返回值是一个函数。可以通过该函数进行查询。
和前者比效率略低一点点,查询更不方便(如果只需要查询一个曲目的话)。
使用方法
local data = require("Module:Arcaea Data")
local query = data.singleSongInformation("索引值的类型,id或name", "查找内容的平台,mobile或ns")
mw.log(query("该曲目的索引值", "需要查询的属性的名称"))
示例
local data = require("Module:Arcaea Data")
local query = data.allSongInformation("id", "mobile")
-- 此时query是一个函数,传入需要查询的属性名称返回该属性的值。
mw.log(query("ifi", "pstChartDesigner"))
-- 输出"夜浪"
packName
获传入曲包ID,获得Packlist中的曲包名称,返回值是一个字符串。
果Template:Transition.json中存在转换,则使用转换后的名称,否则直接传出Packlist中的曲包名称。
使用方法
local data = require("Module:Arcaea Data")
local query = data.packName
mw.log(query("曲包ID"))
示例
local data = require("Module:Arcaea Data")
local query = data.packName
mw.log(query("vs"))
-- 输出"Black Fate"
unlockText
正在编写中。
直接查询函数
已将函数封为模板:Arcaea Data,可使用封包的模板来查询数据。
Song_Query
用法
示例
Pack_Query
用法
示例
属性名列表
- id
- title
- artist
- bpm
- set
- side
- date
- version
- bg
- pstChartDesigner
- pstJacketDesigner
- pstRating
- prsChartDesigner
- prsJacketDesigner
- prsRating
- ftrChartDesigner
- ftrJacketDesigner
- ftrRating
- bydChartDesigner
- bydJacketDesigner
- bydRating
- etrChartDesigner
- etrJacketDesigner
- etrRating
- pstChange
- prsChange
- ftrChange
- bydChange
- etrChange
- bydAudioChange
- bydBPM
- bydArtist
- 新背景参数:如果没有单独指定使用bg
- pstBg
- prsBg
- ftrBg
- bydBg
- etrBg
local p = {}
function p.packName(id)
-- 将曲包ID转换为曲包名称。
-- 传入Songlist中定义的曲包ID,返回Packlist中的曲包名称。如果Template:Transition.json中存在转换,则使用转换后的名称。
-- 检查曲包ID→曲包名称转换表是否存在转换规则。
local covList = mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Transition.json' })["packName"]
if covList[id] then return covList[id] end
-- 判断变量是否已有值,为多次调用预备。
-- 变量为全局变量
if packlist == nil then
packlist = mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Packlist.json' })
end
for i, k in ipairs(packlist['packs']) do
if k['id'] == id then return k['name_localized']['en'] end
end
end
function p.unlockText(songId)
-- 还未编写好的函数。目的:传入Songid,检索unlock,返回一个解锁要求文本的字符串。
-- 变量为全局变量
if unlock == nil
then
unlock = mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Packlist.json' })
end
local result = {}
for i, k in ipairs(json) do
if k['songId'] == songId then
result[tonumber(k['ratingClass'] + 1)] = k['conditions']
-- coding...
end
end
return result
end
function jsonAssayForSingleSong(json, index, indexTyped)
-- 传入JSON文件,索引值和索引值类型(索引是ID还是曲名)。分析JSON文件以获得曲目信息,返回的是一个查找单一曲目中信息的函数。仅获取单一曲目的信息。table中的索引名请查看下方switch表。
-- Songlist是以数字为索引值,因此遍历Songlist,直到发现需要找的曲目,将信息存入info变量中。
local s, info = "", {}
-- 如果模式是ID则遍历songlist直至发现id值为索引值为止,并获取内容。曲名同理。
if indexTyped == "id" then
for i, k in ipairs(json['songs']) do
if k['id'] == index then info = k end
end
else
for i, k in ipairs(json['songs']) do
if k['title_localized']['en'] == index then info = k end
end
end
-- 此处返回一个函数用于查询内容。
return function(key)
-- 如果info无值即无法在songlist中查找到索引值,则返回nil。
if info == nil
then
mw.log( '无法在Songlist中发现目标,索引值为:'..index )
return nil
end
-- 此处定义一个switch table以达到switch函数的效用。如果需要查找的参数在switch中不存在,返回nil。
local switch = {
["id"] = function() return info["id"] end,
["title"] = function() return info['title_localized']['en'] end,
["artist"] = function() return info["artist"] end,
["bpm"] = function() return info["bpm"] end,
["set"] = function() return info["set"] end,
["side"] = function() return info["side"] end,
["date"] = function() return info["date"] end,
["version"] = function() return info["version"] end,
["bg"] = function()
if info["bg"] ~= "" then
return info["bg"]
else
if info["side"] == 0 then
return 'base_light'
else
if info['side'] ==1 then
return 'base_conflict'
else
return 'undefined'
end
end
end
end,
["pstChartDesigner"] = function()
return info["difficulties"][1]['chartDesigner']
end,
["pstJacketDesigner"] = function()
return info["difficulties"][1]['jacketDesigner']
end,
["pstRating"] = function()
return info["difficulties"][1]['rating']
end,
["prsChartDesigner"] = function()
return info["difficulties"][2]['chartDesigner']
end,
["prsJacketDesigner"] = function()
return info["difficulties"][2]['jacketDesigner']
end,
["prsRating"] = function()
return info["difficulties"][2]['rating']
end,
["ftrChartDesigner"] = function()
return info["difficulties"][3]['chartDesigner']
end,
["ftrJacketDesigner"] = function()
return info["difficulties"][3]['jacketDesigner']
end,
["ftrRating"] = function()
if info["difficulties"][3]['ratingPlus'] then
return info["difficulties"][3]['rating'] .. '+'
else
return info["difficulties"][3]['rating']
end
end,
["bydChartDesigner"] = function()
if info["difficulties"][4] then
return info["difficulties"][4]['chartDesigner']
end
end,
["bydJacketDesigner"] = function()
if info["difficulties"][4] then
return info["difficulties"][4]['jacketDesigner']
end
end,
["bydRating"] = function()
if info["difficulties"][4] then
return info["difficulties"][4]['rating']
end
end,
["pstChange"] = function()
if info["difficulties"][1] then
return info["difficulties"][1]['has_controller_alt_chart']
end
end,
["prsChange"] = function()
if info["difficulties"][2] then
return info["difficulties"][2]['has_controller_alt_chart']
end
end,
["ftrChange"] = function()
if info["difficulties"][3] then
return info["difficulties"][3]['has_controller_alt_chart']
end
end,
["bydAudioChange"] = function()
if info["difficulties"][4] then
return info["difficulties"][4]['audioOverride']
end
end,
["bydBg"] = function()
if info["difficulties"][4] then
return info["difficulties"][4]['bg']
end
end,
["bydBPM"] = function()
if info["difficulties"][4] then
return info["difficulties"][4]['bpm']
end
end,
["bydArtist"] = function()
if info["difficulties"][4] then
return info["difficulties"][4]['artist']
end
end
}
if switch[key] == nil
then
mw.log( '未定义的索引类型,请检查是否拼写错误。' )
return nil
end
return switch[key]()
end
end
function p.singleSongInformation(index, indexTyped, platform)
-- 传入曲名或ID,获得一个查阅信息的函数。直接在下一个模块使用。
-- index:曲目的索引字符串,和typed一致 indexTyped:id或name,查找曲目的索引值类型 platform:mobile或ns
if platform == "mobile"
then
if indexTyped == "id" then
return jsonAssayForSingleSong(mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist.json' } ), index, 'id')
else
return jsonAssayForSingleSong(mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist.json' } ), index, 'name')
end
else
if indexTyped == "id" then
return jsonAssayForSingleSong(mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist NS.json' } ), index, 'id')
else
return jsonAssayForSingleSong(mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist NS.json' } ), index, 'name')
end
end
end
function jsonAssayForAllSong(json, indexTyped)
-- 传入JSON文件,获得一个通过索引值查找指定曲目指定信息的函数。与jsonAssayForSingleSong不同,本函数可以同时查找多个函数。
-- 索引值由下一步函数使用来指定,但是索引类型必须刚开始就指定。(id或name)
local s, info = "", {}
if indexTyped == "id" then
for i, k in ipairs(json['songs']) do
info[k['id']] = k
end
else
for i, k in ipairs(json['songs']) do
info[k['title_localized']['en']] = k
end
end
-- 此处返回一个函数用于查询内容。
return function(index, key)
-- 如果info无值即无法在songlist中查找到索引值,则返回nil。
if info[index] == nil
then
mw.log( '无法在Songlist中发现目标,索引值为:'..index )
return nil
end
-- 此处定义一个switch table以达到switch函数的效用。如果需要查找的参数在switch中不存在,返回nil。
local switch = {
["id"] = function() return info[index]["id"] end,
["title"] = function() return info[index]['title_localized']['en'] end,
["artist"] = function() return info[index]["artist"] end,
["bpm"] = function() return info[index]["bpm"] end,
["set"] = function() return info[index]["set"] end,
["side"] = function() return info[index]["side"] end,
["date"] = function() return info[index]["date"] end,
["version"] = function() return info[index]["version"] end,
["bg"] = function()
if info[index]["bg"] ~= "" then
return info[index]["bg"]
else
if info[index]["side"] == 0 then
return 'base_light'
else
if info[index]['side'] ==1 then
return 'base_conflict'
else
return 'undefined'
end
end
end
end,
["pstChartDesigner"] = function()
return info[index]["difficulties"][1]['chartDesigner']
end,
["pstJacketDesigner"] = function()
return info[index]["difficulties"][1]['jacketDesigner']
end,
["pstRating"] = function()
return info[index]["difficulties"][1]['rating']
end,
["prsChartDesigner"] = function()
return info[index]["difficulties"][2]['chartDesigner']
end,
["prsJacketDesigner"] = function()
return info[index]["difficulties"][2]['jacketDesigner']
end,
["prsRating"] = function()
return info[index]["difficulties"][2]['rating']
end,
["ftrChartDesigner"] = function()
return info[index]["difficulties"][3]['chartDesigner']
end,
["ftrJacketDesigner"] = function()
return info[index]["difficulties"][3]['jacketDesigner']
end,
["ftrRating"] = function()
if info[index]["difficulties"][3]['ratingPlus'] then
return info[index]["difficulties"][3]['rating'] .. '+'
else
return info[index]["difficulties"][3]['rating']
end
end,
["bydChartDesigner"] = function()
if info[index]["difficulties"][4] then
return info[index]["difficulties"][4]['chartDesigner']
end
end,
["bydJacketDesigner"] = function()
if info[index]["difficulties"][4] then
return info[index]["difficulties"][4]['jacketDesigner']
end
end,
["bydRating"] = function()
if info[index]["difficulties"][4] then
return info[index]["difficulties"][4]['rating']
end
end,
["pstChange"] = function()
if info[index]["difficulties"][1] then
return info[index]["difficulties"][1]['has_controller_alt_chart']
end
end,
["prsChange"] = function()
if info[index]["difficulties"][2] then
return info[index]["difficulties"][2]['has_controller_alt_chart']
end
end,
["ftrChange"] = function()
if info[index]["difficulties"][3] then
return info[index]["difficulties"][3]['has_controller_alt_chart']
end
end,
["bydAudioChange"] = function()
if info[index]["difficulties"][4] then
return info[index]["difficulties"][4]['audioOverride']
end
end,
["bydBg"] = function()
if info[index]["difficulties"][4] then
return info[index]["difficulties"][4]['bg']
end
end,
["bydBPM"] = function()
if info[index]["difficulties"][4] then
return info[index]["difficulties"][4]['bpm']
end
end,
["bydArtist"] = function()
if info[index]["difficulties"][4] then
return info[index]["difficulties"][4]['artist']
end
end
}
if switch[key] == nil
then
mw.log( '未定义的索引类型,请检查是否拼写错误。' )
return nil
end
return switch[key]()
end
end
function p.allSongInformation(indexTyped, platform)
-- 获得一个查阅信息的函数,可查阅任何曲目。直接在下一个模块使用。
-- indexTyped:id或name,查找曲目的索引值类型 platform:mobile或ns
if platform == "mobile"
then
if indexTyped == "id" then
return jsonAssayForAllSong(mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist.json' } ), 'id')
else
return jsonAssayForAllSong(mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist.json' } ), 'name')
end
else
if indexTyped == "id" then
return jsonAssayForAllSong(mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist NS.json' } ), 'id')
else
return jsonAssayForAllSong(mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist NS.json' } ), 'name')
end
end
end
local getArgs = require('Module:Arguments').getArgs
function makeInvokeFunc(funcName)
return function(frame)
local args = getArgs(frame)
return p[funcName](args)
end
end
p.Song_Query = makeInvokeFunc('_Song_Query')
function p._Song_Query(args)
-- 面向wikitext直接查询
-- return p.singleSongInformation(songIndex, songIndexType, platform)(attributeName)
return p.singleSongInformation(args[1], args[2], args[4])(args[3])
end
p.Pack_Query = makeInvokeFunc('_Pack_Query')
function p._Pack_Query(args)
-- 面向wikitext直接查询
return p.packName(args[1])
end
return p