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

Module:Game/Skills/Data/Evolved

From Umamusume Wiki
Jump to navigation Jump to search

Documentation for this module may be created at Module:Game/Skills/Data/Evolved/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 Evolved = {}
local Game = require("Module:Game")

---Get the card IDs and skill IDs the given skill IDs evolve from
---@param skillIds string[]
---@return (string|nil)[] sourceSkillIds, (string|nil)[] cardIds maps keyed with skill ID
function Evolved.getEvolvedFromSkillAndCard(skillIds)
    local skillIdsInsert = table.concat(skillIds, ",")

    local sourceSkillIdMap = {}
    local cardIdMap = {}

    -- Card upgrades
    local skill_upgrade_descriptions = Game.queryMaster {
        from = "skill_upgrade_description",
        where = string.format("skill_id IN (%s)", skillIdsInsert),
    }

    local cardIds = {}
    for _, skill_upgrade_description in ipairs(skill_upgrade_descriptions) do
        table.insert(cardIds, skill_upgrade_description.card_id)
    end
    local cardIdsInsert = table.concat(cardIds, ",")

    local card_datas = Game.queryMaster {
        from = "card_data",
        where = string.format("id IN (%s)", cardIdsInsert)
    }

    local availableSkillSetIds = {}
    for _, card_data in ipairs(card_datas) do
        table.insert(availableSkillSetIds, card_data.available_skill_set_id)
    end
    local availableSkillSetIdsInsert = table.concat(availableSkillSetIds, ",")

    local available_skill_sets = Game.queryMaster {
        from = "available_skill_set",
        where = string.format("available_skill_set_id IN (%s)", availableSkillSetIdsInsert),
    }

    for _, skill_upgrade_description in ipairs(skill_upgrade_descriptions) do
        local cardId = skill_upgrade_description.card_id

        -- find source skill for rank of the given card id
        -- if a card eventually has two (or more) skills of a given rank, would need to refactor this to add both
        for _, card_data in ipairs(card_datas) do
            if card_data.id == cardId then
                for _, available_skill_set in ipairs(available_skill_sets) do
                    if available_skill_set.need_rank == skill_upgrade_description.rank then
                        sourceSkillIdMap[skill_upgrade_description.skill_id] = available_skill_set.skill_id
                        break
                    end
                end
            end
        end

        cardIdMap[skill_upgrade_description.skill_id] = cardId
    end

    -- Scenario upgrades
    local skill_upgrade_specialties = Game.queryMaster {
        from = "skill_upgrade_speciality",
        where = string.format("skill_id IN (%s)", skillIdsInsert),
    }

    for _, skill_upgrade_specialty in ipairs(skill_upgrade_specialties) do
        sourceSkillIdMap[skill_upgrade_specialty.skill_id] = skill_upgrade_specialty.base_skill_id
    end

    return sourceSkillIdMap, cardIdMap
end

---@class CardEvolvedSkill
---@field rank string
---@field skillId string
---@field conditions CardEvolvedSkillCondition[][]

---@class CardEvolvedSkillCondition
---@field text string

---Get a list of evolved skills, ranks, and conditions for each card ID in the given list
---@param cardIds string[]
---@return CardEvolvedSkill[][] evolvedSkills keyed by card ID
function Evolved.getEvolvedSkillsForCards(cardIds)
    local cardIdsInsert = table.concat(cardIds, ",")
    local skill_upgrade_descriptions = Game.queryMaster {
        from = "skill_upgrade_description",
        where = string.format("card_id IN (%s)", cardIdsInsert),
    }

    local descriptionIds = {}
    for _, skill_upgrade_description in ipairs(skill_upgrade_descriptions) do
        table.insert(descriptionIds, skill_upgrade_description.id)
    end

    local descriptionIdsInsert = table.concat(descriptionIds, ",")
    local skill_upgrade_conditions = Game.queryMaster {
        from = "skill_upgrade_condition",
        where = string.format("description_id IN (%s)", descriptionIdsInsert),
        order_by = "num ASC, sub_num ASC"
    }

    local conditionIds = {}
    local descriptionConditionMap = {}
    for _, skill_upgrade_condition in ipairs(skill_upgrade_conditions) do
        local key = skill_upgrade_condition.description_id
        if descriptionConditionMap[key] == nil then descriptionConditionMap[key] = {} end

        table.insert(conditionIds, skill_upgrade_condition.id)
        table.insert(descriptionConditionMap[key], skill_upgrade_condition)
    end

    local conditionTexts = Game.getJPText(290, conditionIds)

    local datas = {}
    for _, skill_upgrade_description in ipairs(skill_upgrade_descriptions) do
        local key = skill_upgrade_description.card_id
        if datas[key] == nil then datas[key] = {} end

        local descriptionConditions = descriptionConditionMap[skill_upgrade_description.id]

        local conditions = {}
        for _, skill_upgrade_condition in ipairs(descriptionConditions) do
            local num = tonumber(skill_upgrade_condition.num) or 0
            if conditions[num] == nil then conditions[num] = {} end
            local condition = { ---@type CardEvolvedSkillCondition
                text = conditionTexts[skill_upgrade_condition.id]
            }
            table.insert(conditions[num], condition)
        end

        local data = { ---@type CardEvolvedSkill
            rank = skill_upgrade_description.rank,
            skillId = skill_upgrade_description.skill_id,
            conditions = conditions,
        }
        table.insert(datas[key], data)
    end
    return datas
end

return Evolved