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

Module:Game/Supports/Data/Unique

From Umamusume Wiki
Jump to navigation Jump to search

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

---@class SupportDataEffectUnique
---@field nameJP string
---@field descriptionJP string[]
---@field nameEN string|nil
---@field descriptionEN string[]|nil
---@field level number
---@field bonuses SupportDataEffectUniqueBonus[]

---@class SupportDataEffectUniqueBonus
---@field typeId string
---@field value number
---@field hint string|nil

---@param support_datas table[]
---@return SupportDataEffectUnique[]
function Unique.getUniqueEffects(support_datas)
    local supportIds = {}
    local uniqueEffectIds = {}
    for _, support_data in ipairs(support_datas) do
        table.insert(supportIds, support_data.id)
        table.insert(uniqueEffectIds, support_data.unique_effect_id)
    end
    local uniqueEffectIdsInsert = table.concat(uniqueEffectIds, ',')

    local uniqueEffectMap = {}
    local support_card_unique_effects = Game.queryMaster {
        from = "support_card_unique_effect",
        where = string.format("id IN (%s)", uniqueEffectIdsInsert),
    }
    for _, support_card_unique_effect in ipairs(support_card_unique_effects) do
        uniqueEffectMap[support_card_unique_effect.id] = support_card_unique_effect
    end

    local namesJP = Game.getJPText(150, supportIds)
    local descriptionsJP = Game.getJPText(155, supportIds)

    local namesEN = Game.getENText(150, supportIds)
    local descriptionsEN = Game.getENText(155, supportIds)

    local datas = {}
    for _, support_data in ipairs(support_datas) do
        local uniqueEffect = uniqueEffectMap[support_data.unique_effect_id]
        if uniqueEffect ~= nil then
            local nameJP = namesJP[support_data.id] or ''
            local descriptionRawJP = descriptionsJP[support_data.id] or ''
            local descriptionJP = Utils.splitLines(descriptionRawJP)

            local nameEN = namesEN[support_data.id]
            local descriptionRawEN = descriptionsEN[support_data.id]
            local descriptionEN = descriptionRawEN and Utils.splitLines(descriptionRawEN) or nil

            local bonuses = {}
            for i = 0, 1 do
                local typeId = uniqueEffect[string.format("type_%s", i)]
                local value = tonumber(uniqueEffect[string.format("value_%s", i)]) or 0
                local values = {}
                for j = 1, 4 do
                    values[j] = tonumber(uniqueEffect[string.format("value_%s_%s", i, j)]) or 0
                end

                local mapped = Effects.getUniqueBonuses(typeId, value, values)
                for _, bonus in ipairs(mapped) do
                    table.insert(bonuses, bonus)
                end
            end

            local data = { ---@type SupportDataEffectUnique
                nameJP = nameJP,
                descriptionJP = descriptionJP,
                nameEN = nameEN,
                descriptionEN = descriptionEN,
                level = tonumber(uniqueEffect.lv) or -1,
                bonuses = bonuses
            }
            datas[support_data.id] = data
        end
    end
    return datas
end

return Unique