Welcome to the Umamusume Wiki! If you want to contribute, please read the guidelines.

Module:Game/Characters

From Umamusume Wiki
Jump to navigation Jump to search

Documentation for this module may be created at Module:Game/Characters/doc

--[[
    !! THIS PAGE IS MANAGED BY GITLAB !!
    ANY EDITS TO PAGE CONTENT WILL BE OVERWRITTEN
    TO MAKE CHANGES, PLEASE SUBMIT A MERGE REQUEST AT https://gitlab.com/umamusume-wiki/lua-modules
]]

local Characters = {}
local Game = require("Module:Game")
local Cargo = require("Module:Cargo")
local Utils = require("Module:Utils")
local BannerUtils = require("Module:Game/Banners/Utils")

---@class CharacterInfo
---@field id string
---@field nameJP string
---@field nameEN string
---@field pageName string
---@field releaseDateJP string|nil
---@field releaseDateEN string|nil

---Get character info by their game ID
---@param charId string
---@return CharacterInfo|nil
function Characters.getCharacterInfo(charId)
    return Characters.getCharacterInfos({ charId })[Utils.normalString(charId)]
end

---Get bulk character info by a list of game IDs
---@param charIds string[]
---@return CharacterInfo[]
function Characters.getCharacterInfos(charIds)
    if #charIds == 0 then return {} end
    local normalIds = {}
    for _, charId in ipairs(charIds) do
        table.insert(normalIds, Utils.normalString(charId))
    end

    local charIdsInsert = table.concat(normalIds, ",")

    local namesJP = Game.getJPText(6, normalIds)
    local namesEN = Game.getENText(6, normalIds)

    -- Get release dates for characters (uses base card IDs with "01" appended)
    local releaseDatesJP = BannerUtils.getReleaseDates(normalIds, "character", "JP")
    local releaseDatesEN = BannerUtils.getReleaseDates(normalIds, "character", "EN")

    local cargoResults = Cargo.query {
        from = 'Characters',
        fields = { '_pageName=charPage', 'game_id', 'name_en' },
        where = string.format('game_id IN (%s)', charIdsInsert),
        limit = 9999
    }
    local cargoMap = {}
    for _, result in ipairs(cargoResults) do
        cargoMap[result.game_id] = result
    end

    local datas = {}
    for _, charId in ipairs(normalIds) do
        local cargoData = cargoMap[charId]

        if cargoData ~= nil then
            local data = { ---@type CharacterInfo
                id = charId,
                nameJP = namesJP[charId],
                nameEN = namesEN[charId] or cargoData.name_en,
                pageName = cargoData.charPage,
                releaseDateJP = releaseDatesJP[charId],
                releaseDateEN = releaseDatesEN[charId],
            }
            datas[charId] = data
        end
    end
    return datas
end

return Characters