Module:Arcaea Data

来自Arcaea中文维基
Star0讨论 | 贡献2022年7月29日 (五) 14:49的版本 (// Edit via Wikiplus)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

本模块可查询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

用法

{{Arcaea Data|type=Song_Query|索引名称|索引名称类型|属性名称|平台}}

示例

{{Arcaea Data|type=Song_Query|ifi|id|title|mobile}}

Pack_Query

用法

{{Arcaea Data|type=Pack_Query|曲包ID}}

示例

{{Arcaea Data|type=Pack_Query|vs}}

属性名列表

  • 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 getArgs = require('Module:Arguments').getArgs
local loadJson = require("Module:LoadJson")

local p = {}

function makeInvokeFunc(funcName)
    return function(frame)
        local args = getArgs(frame)
        return p[funcName](args)
    end
end

-- p.pack = makeInvokeFunc('_pack')

local packlist

function p.packId(packId)
    -- 将曲包ID转换为曲包名称。
    local covList = {
        ['chunithm_append_1'] = 'CHUNITHM Collaboration - Collaboration Chapter 2',
        ['dividedheart'] = 'Divided Heart',
        ['groovecoaster'] = 'Groove Coaster Collaboration',
        ['lanota'] = 'Lanota Collaboration',
        ['lanota_append_1'] = 'Lanota Collaboration - Collaboration Chapter 2',
        ['tonesphere'] = 'Tone Sphere Collaboration',
        ['chunithm'] = 'CHUNITHM Collaboration',
        ['dynamix'] = 'Dynamix Collaboration',
        ['maimai'] = 'maimai Collaboration',
        ['ongeki'] = 'O.N.G.E.K.I. Collaboration',
        ['musedash'] = 'Muse Dash Collaboration',
        ['single'] = 'Memory Archive'
    }
    if covList[args[1]] then return covList[args[1]] end

    if packlist == nil then
        packlist = mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Packlist' })
    end

    for i, k in ipairs(packlist) do
        if k['id'] == packId then return k['name_localized']['en'] end
    end
end

function p.unlock(songId)
    local json = loadJson.unlocks()['unlocks']
    local result = {}
    for i, k in ipairs(json) do
        if k['songId'] == songId then
            result[tonumber(k['ratingClass'] + 1)] = k['conditions']
        end
    end
    return result
end

p.song = makeInvokeFunc('_song')

function p._song(args)
    local json
    if args['type'] or args[3] == 'ns' then
        json = loadJson.Songlist()
    else
        json = loadJson.SonglistNS()
    end

    return getSingle(json, args[1], args['index'])(args[2])
end

function getSingle(json, index, genre)
    -- 传入JSON文件,索引值和索引值类型(索引是ID还是曲名)。分析JSON文件以获得曲目信息。仅获取单一曲目的信息。table中的索引名请查看下方switch表。

    -- Songlist是以数字为索引值,因此遍历Songlist,直到发现需要找的曲目,将信息存入info变量中。
    local s, info = "", {}
    -- 如果模式是ID则遍历songlist直至发现id值为索引值为止,并获取内容。曲名同理。
    if genre == "id" then
        for i, k in ipairs(json['songs']) do
            if k['id'] == index then list[index] = 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.getMobile(name, id)
    -- 传入曲名或ID,获得一个查阅信息的函数(移动版信息)。直接在下一个模块使用。
    if id then
        return getSingle(mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist.json' } ), id, 'id')
    else
        return getSingle(mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist.json' } ), name, 'name')
    end
end

function p.getNS(name, id)
    -- 传入曲名或ID,获得一个查阅信息的函数(NS版信息)。直接在下一个模块使用。
    if id then
        return getSingle(mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist NS.json' } ), id, 'id')
    else
        return getSingle(mw.text.jsonDecode(mw.getCurrentFrame():expandTemplate{ title = 'Songlist NS.json' } ), name, 'name')
    end
end

return p