• Welcome to the Kancolle Wiki!
  • If you have any questions regarding site content, account registration, etc., please visit the KanColle Wiki Discord

Difference between revisions of "Module:Development"

From Kancolle Wiki
Jump to navigation Jump to search
(Created page with "local U = require("Module:Utils") local Self = {} Self.groups = { { { [1] = 3, [2] = 5, [3] = 3, [4] = 3, ...")
 
m (17 revisions imported)
 
(16 intermediate revisions by 2 users not shown)
Line 1: Line 1:
local U = require("Module:Utils")
+
local U = require("Module:Core")
  
 
local Self = {}
 
local Self = {}
Line 277: Line 277:
  
 
Self.typeGroups = {
 
Self.typeGroups = {
     "Group 1", -- { "DE", "DD", "CL", "CLT", "SS", "AP", "CT", "AO" },
+
     [[<span class="explain" data-group="1" title="DE/DD/CL/CLT/SS/CT/AO">G1</span>]], -- { "DE", "DD", "CL", "CLT", "SS", "AP", "CT", "AO" },
     "Group 2", -- { "CA", "FBB", "BB", "XBB", "AR" },
+
     [[<span class="explain" data-group="2" title="CA/FBB/BB/AR">G2</span>]], -- { "CA", "FBB", "BB", "XBB", "AR" },
     "Group 3", -- { "CAV", "CVL", "BBV", "CV", "SSV", "AV", "LHA", "CVB", "AS" },
+
     [[<span class="explain" data-group="3" title="CAV/CVL/BBV/CV/SSV/AV/LHA/CVB/AS">G3</span>]], -- { "CAV", "CVL", "BBV", "CV", "SSV", "AV", "LHA", "CVB", "AS" },
 
}
 
}
  
Line 289: Line 289:
 
}
 
}
 
--]]
 
--]]
 
function findGroups(id)
 
    local groups = {}
 
    for typeGroup, resourceGroups in ipairs(Self.groups) do
 
        for resourceGroup, equipment in ipairs(resourceGroups) do
 
            if equipment[id] and equipment[id] > 0 then
 
                groups[typeGroup] = groups[typeGroup] or {}
 
                groups[typeGroup][resourceGroup] = equipment[id]
 
            end
 
        end
 
    end
 
    return groups
 
end
 
  
 
function ensureResourceGroup(fuel, ammo, steel, bauxite, resourceGroup)
 
function ensureResourceGroup(fuel, ammo, steel, bauxite, resourceGroup)
 
     local main = math.max(unpack({fuel, ammo, steel, bauxite}))
 
     local main = math.max(unpack({fuel, ammo, steel, bauxite}))
 +
    function fix(x)
 +
        return x < main and main + 1 or x
 +
    end
 
     if resourceGroup == 1 then
 
     if resourceGroup == 1 then
         return math.max(main + 1, fuel), ammo, math.max(main + 1, steel), bauxite
+
         return fix(fuel), ammo, fix(steel), bauxite
 
     elseif resourceGroup == 2 then
 
     elseif resourceGroup == 2 then
         return fuel, math.max(main + 1, ammo), steel, bauxite
+
         return fuel, fix(ammo), steel, bauxite
 
     elseif resourceGroup == 3 then
 
     elseif resourceGroup == 3 then
         return fuel, ammo, steel, math.max(main + 1, bauxite)
+
         return fuel, ammo, steel, fix(bauxite)
 
     end
 
     end
 
end
 
end
  
function Self.formatTypes(eq)
+
function Self.formatResources(eq, rates)
 
     if eq:buildable() then
 
     if eq:buildable() then
 
         local result = {}
 
         local result = {}
 
         local id = eq:id()
 
         local id = eq:id()
        local groups = findGroups(id)
 
 
         local fuel = (eq:scrap().fuel or 1) * 10
 
         local fuel = (eq:scrap().fuel or 1) * 10
 
         local ammo = (eq:scrap().ammo or 1) * 10
 
         local ammo = (eq:scrap().ammo or 1) * 10
 
         local steel = (eq:scrap().steel or 1) * 10
 
         local steel = (eq:scrap().steel or 1) * 10
 
         local bauxite = (eq:scrap().bauxite or 1) * 10
 
         local bauxite = (eq:scrap().bauxite or 1) * 10
         for typeGroup, _ in pairs(groups) do
+
        local maxRate
             table.insert(result, table.concat(Self.typeGroups[t], "/"))
+
         for typeGroup, resourceGroups in ipairs(Self.groups) do
 +
             for resourceGroup, equipment in ipairs(resourceGroups) do
 +
                if equipment[id] and equipment[id] > 0 then
 +
                    local fuel, ammo, steel, bauxite = ensureResourceGroup(fuel, ammo, steel, bauxite, resourceGroup)
 +
                    local recipe = U.format{
 +
                        "${fuel}/${ammo}/${steel}/${bauxite}",
 +
                        fuel = fuel,
 +
                        ammo = ammo,
 +
                        steel = steel,
 +
                        bauxite = bauxite,
 +
                    }
 +
                    result[recipe] = result[recipe] or {
 +
                        fuel = fuel,
 +
                        ammo = ammo,
 +
                        steel = steel,
 +
                        bauxite = bauxite,
 +
                        resourceGroup = resourceGroup,
 +
                        types = {},
 +
                    }
 +
                    local rate = U.round(100 * equipment[id] / 50)
 +
                    result[recipe].types[Self.typeGroups[typeGroup]] = result[recipe].types[Self.typeGroups[typeGroup]] or {
 +
                        rate = rate,
 +
                    }
 +
                    if not maxRate or rate > maxRate then
 +
                        maxRate = rate
 +
                    end
 +
                    break
 +
                end
 +
            end
 
         end
 
         end
         return table.concat(result, "\n")
+
         return U.ijoin(
 +
            U.imap(
 +
                U.isort(U.keys(result)),
 +
                function(recipe)
 +
                    local types = U.isort(U.keys(result[recipe].types))
 +
                    local resourceGroup = result[recipe].resourceGroup
 +
                    return U.format{
 +
                        rates and "${rates}" or "${recipe} (${types})",
 +
                        recipe = U.format{
 +
                          "${fuel}/${ammo}/${steel}/${bauxite}",
 +
                            fuel = (resourceGroup == 1 and U.red or U.id)(result[recipe].fuel),
 +
                            ammo = (resourceGroup == 2 and U.red or U.id)(result[recipe].ammo),
 +
                            steel = (resourceGroup == 1 and U.red or U.id)(result[recipe].steel),
 +
                            bauxite = (resourceGroup == 3 and U.red or U.id)(result[recipe].bauxite),
 +
                        },
 +
                        types = U.ijoin(U.imap(types, function(type)
 +
                            local rate = result[recipe].types[type].rate
 +
                            return (rate == maxRate and U.red or U.id)(type)
 +
                        end), "/"),
 +
                        rates = U.ijoin(U.imap(types, function(type)
 +
                            local rate = result[recipe].types[type].rate
 +
                            return (rate == maxRate and U.red or U.id)(tostring(rate) .. "%")
 +
                        end), "/"),
 +
                    }
 +
                end
 +
            ),
 +
            "<br>"
 +
        )
 
     else
 
     else
         return 'N/A'
+
         return "-"
 
     end
 
     end
 
end
 
end
  
function Self.formatResources(eq)
+
function Self.formatRates(eq)
 +
    return Self.formatResources(eq, true)
 +
end
 +
 
 +
function Self.formatHQ(eq)
 
     if eq:buildable() then
 
     if eq:buildable() then
         local result = {}
+
         return math.max(math.max((eq:rarity() or 0) - 2, 0) * 10, 1)
        local id = eq:id()
 
        local groups = findGroups(id)
 
        local fuel = (eq:scrap().fuel or 1) * 10
 
        local ammo = (eq:scrap().ammo or 1) * 10
 
        local steel = (eq:scrap().steel or 1) * 10
 
        local bauxite = (eq:scrap().bauxite or 1) * 10
 
        for typeGroup, resourceGroups in pairs(groups) do
 
            for resourceGroup, _ in pairs(resourceGroups) do
 
                local fuel, ammo, steel, bauxite = ensureResourceGroup(fuel, ammo, steel, bauxite, resourceGroup)
 
                table.insert(result, U.format{
 
                    "${fuel}/${ammo}/${steel}/${bauxite} (${typeGroup})",
 
                    fuel = fuel,
 
                    ammo = ammo,
 
                    steel = steel,
 
                    bauxite = bauxite,
 
                    typeGroup = Self.typeGroups[typeGroup],
 
                })
 
            end
 
        end
 
        return table.concat(result, "<br>")
 
 
     else
 
     else
         return 'N/A'
+
         return "-"
 
     end
 
     end
 
end
 
end
Line 362: Line 390:
 
function Self.test()
 
function Self.test()
 
     local Equipment = require("Module:Equipment")
 
     local Equipment = require("Module:Equipment")
     return Self.formatResources(Equipment("46cm Triple Gun Mount"))
+
     return
 +
        Self.formatResources(Equipment("46cm Triple Gun Mount")) ..
 +
        "\n" ..
 +
        Self.formatRates(Equipment("46cm Triple Gun Mount")) ..
 +
        "\n" ..
 +
        Self.formatResources(Equipment("12cm Single Gun Mount"))
 
end
 
end
 +
-- print(p.test())
  
 
return Self
 
return Self

Latest revision as of 12:48, 12 May 2021

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

local U = require("Module:Core")

local Self = {}

Self.groups = {
    {
        {
            [1] = 3,
            [2] = 5,
            [3] = 3,
            [4] = 3,
            [5] = 1,
            [6] = 1,
            [11] = 3,
            [12] = 1,
            [13] = 1,
            [14] = 2,
            [15] = 1,
            [16] = 1,
            [19] = 1,
            [20] = 1,
            [23] = 1,
            [25] = 1,
            [27] = 2,
            [28] = 1,
            [29] = 1,
            [33] = 2,
            [34] = 1,
            [37] = 2,
            [38] = 1,
            [39] = 2,
            [44] = 1,
            [49] = 2,
            [65] = 2,
            [66] = 2,
            [75] = 2,
        },
        {
            [1] = 1,
            [2] = 2,
            [3] = 2,
            [4] = 2,
            [5] = 2,
            [6] = 1,
            [7] = 1,
            [10] = 2,
            [11] = 2,
            [12] = 1,
            [13] = 1,
            [14] = 2,
            [15] = 1,
            [16] = 2,
            [17] = 1,
            [23] = 2,
            [24] = 1,
            [27] = 1,
            [28] = 1,
            [29] = 1,
            [33] = 2,
            [34] = 2,
            [35] = 1,
            [37] = 1,
            [38] = 1,
            [39] = 2,
            [40] = 1,
            [41] = 1,
            [44] = 6,
            [45] = 1,
            [49] = 1,
            [65] = 2,
        },
        {
            [1] = 1,
            [2] = 1,
            [3] = 1,
            [4] = 1,
            [5] = 1,
            [7] = 1,
            [10] = 2,
            [16] = 3,
            [17] = 1,
            [19] = 2,
            [20] = 2,
            [21] = 1,
            [23] = 2,
            [24] = 2,
            [25] = 5,
            [26] = 2,
            [27] = 1,
            [28] = 1,
            [29] = 1,
            [33] = 1,
            [34] = 1,
            [35] = 1,
            [38] = 1,
            [39] = 1,
            [40] = 1,
            [41] = 1,
            [44] = 5,
            [45] = 1,
            [46] = 4,
            [47] = 1,
            [163] = 0,
            [181] = 1,
        },
    },
    {
        {
            [1] = 2,
            [2] = 1,
            [3] = 1,
            [4] = 3,
            [5] = 2,
            [6] = 3,
            [10] = 1,
            [11] = 4,
            [12] = 2,
            [13] = 2,
            [14] = 2,
            [25] = 1,
            [27] = 1,
            [29] = 1,
            [30] = 1,
            [31] = 1,
            [32] = 1,
            [33] = 2,
            [34] = 1,
            [35] = 2,
            [36] = 2,
            [37] = 4,
            [38] = 3,
            [39] = 2,
            [40] = 1,
            [49] = 1,
            [72] = 2,
            [73] = 1,
        },
        {
            [4] = 1,
            [5] = 2,
            [6] = 3,
            [7] = 5,
            [8] = 4,
            [9] = 2,
            [10] = 3,
            [11] = 4,
            [12] = 2,
            [13] = 2,
            [14] = 2,
            [16] = 1,
            [17] = 1,
            [23] = 1,
            [24] = 1,
            [28] = 1,
            [29] = 1,
            [33] = 2,
            [34] = 2,
            [35] = 2,
            [36] = 1,
            [37] = 1,
            [38] = 1,
            [39] = 2,
            [40] = 1,
            [41] = 1,
            [49] = 1,
        },
        {
            [4] = 1,
            [5] = 1,
            [6] = 1,
            [7] = 5,
            [8] = 4,
            [9] = 2,
            [10] = 4,
            [16] = 2,
            [17] = 2,
            [18] = 1,
            [19] = 2,
            [20] = 3,
            [21] = 2,
            [22] = 1,
            [23] = 3,
            [24] = 1,
            [25] = 3,
            [26] = 2,
            [28] = 1,
            [29] = 1,
            [33] = 1,
            [34] = 1,
            [35] = 1,
            [36] = 1,
            [39] = 1,
            [40] = 1,
            [41] = 1,
            [49] = 1,
            [163] = 0,
        },
    },
    {
        {
            [1] = 1,
            [2] = 1,
            [3] = 4,
            [10] = 5,
            [19] = 2,
            [20] = 3,
            [21] = 2,
            [25] = 6,
            [26] = 2,
            [27] = 1,
            [28] = 1,
            [29] = 1,
            [30] = 1,
            [31] = 1,
            [32] = 1,
            [33] = 3,
            [34] = 2,
            [37] = 2,
            [38] = 3,
            [40] = 1,
            [41] = 3,
            [49] = 2,
            [59] = 1,
            [181] = 1,
        },
        {
            [1] = 1,
            [2] = 1,
            [3] = 4,
            [10] = 1,
            [16] = 3,
            [17] = 5,
            [18] = 2,
            [20] = 1,
            [21] = 1,
            [23] = 4,
            [24] = 3,
            [25] = 6,
            [26] = 4,
            [35] = 3,
            [37] = 2,
            [38] = 3,
            [40] = 1,
            [41] = 1,
            [49] = 1,
            [52] = 1,
            [57] = 1,
            [60] = 1,
            [168] = 0,
        },
        {
            [16] = 3,
            [17] = 5,
            [18] = 2,
            [19] = 2,
            [20] = 5,
            [21] = 4,
            [22] = 1,
            [23] = 5,
            [24] = 3,
            [25] = 4,
            [26] = 3,
            [27] = 1,
            [30] = 1,
            [35] = 3,
            [52] = 1,
            [54] = 2,
            [55] = 1,
            [57] = 1,
            [60] = 1,
            [61] = 1,
            [168] = 0,
            [181] = 1,
        }
    }
}

Self.typeGroups = {
    [[<span class="explain" data-group="1" title="DE/DD/CL/CLT/SS/CT/AO">G1</span>]], -- { "DE", "DD", "CL", "CLT", "SS", "AP", "CT", "AO" },
    [[<span class="explain" data-group="2" title="CA/FBB/BB/AR">G2</span>]], -- { "CA", "FBB", "BB", "XBB", "AR" },
    [[<span class="explain" data-group="3" title="CAV/CVL/BBV/CV/SSV/AV/LHA/CVB/AS">G3</span>]], -- { "CAV", "CVL", "BBV", "CV", "SSV", "AV", "LHA", "CVB", "AS" },
}

--[[
Self.resourceGroups = {
    { "Fuel", "Steel" },
    { "Ammo" },
    { "Bauxite" },
}
--]]

function ensureResourceGroup(fuel, ammo, steel, bauxite, resourceGroup)
    local main = math.max(unpack({fuel, ammo, steel, bauxite}))
    function fix(x)
        return x < main and main + 1 or x
    end
    if resourceGroup == 1 then
        return fix(fuel), ammo, fix(steel), bauxite
    elseif resourceGroup == 2 then
        return fuel, fix(ammo), steel, bauxite
    elseif resourceGroup == 3 then
        return fuel, ammo, steel, fix(bauxite)
    end
end

function Self.formatResources(eq, rates)
    if eq:buildable() then
        local result = {}
        local id = eq:id()
        local fuel = (eq:scrap().fuel or 1) * 10
        local ammo = (eq:scrap().ammo or 1) * 10
        local steel = (eq:scrap().steel or 1) * 10
        local bauxite = (eq:scrap().bauxite or 1) * 10
        local maxRate
        for typeGroup, resourceGroups in ipairs(Self.groups) do
            for resourceGroup, equipment in ipairs(resourceGroups) do
                if equipment[id] and equipment[id] > 0 then
                    local fuel, ammo, steel, bauxite = ensureResourceGroup(fuel, ammo, steel, bauxite, resourceGroup)
                    local recipe = U.format{
                        "${fuel}/${ammo}/${steel}/${bauxite}",
                        fuel = fuel,
                        ammo = ammo,
                        steel = steel,
                        bauxite = bauxite,
                    }
                    result[recipe] = result[recipe] or {
                        fuel = fuel,
                        ammo = ammo,
                        steel = steel,
                        bauxite = bauxite,
                        resourceGroup = resourceGroup,
                        types = {},
                    }
                    local rate = U.round(100 * equipment[id] / 50)
                    result[recipe].types[Self.typeGroups[typeGroup]] = result[recipe].types[Self.typeGroups[typeGroup]] or {
                        rate = rate,
                    }
                    if not maxRate or rate > maxRate then
                        maxRate = rate
                    end
                    break
                end
            end
        end
        return U.ijoin(
            U.imap(
                U.isort(U.keys(result)),
                function(recipe)
                    local types = U.isort(U.keys(result[recipe].types))
                    local resourceGroup = result[recipe].resourceGroup
                    return U.format{
                        rates and "${rates}" or "${recipe} (${types})",
                        recipe = U.format{
                           "${fuel}/${ammo}/${steel}/${bauxite}",
                            fuel = (resourceGroup == 1 and U.red or U.id)(result[recipe].fuel),
                            ammo = (resourceGroup == 2 and U.red or U.id)(result[recipe].ammo),
                            steel = (resourceGroup == 1 and U.red or U.id)(result[recipe].steel),
                            bauxite = (resourceGroup == 3 and U.red or U.id)(result[recipe].bauxite),
                        },
                        types = U.ijoin(U.imap(types, function(type)
                            local rate = result[recipe].types[type].rate
                            return (rate == maxRate and U.red or U.id)(type)
                        end), "/"),
                        rates = U.ijoin(U.imap(types, function(type)
                            local rate = result[recipe].types[type].rate
                            return (rate == maxRate and U.red or U.id)(tostring(rate) .. "%")
                        end), "/"),
                    }
                end
            ),
            "<br>"
        )
    else
        return "-"
    end
end

function Self.formatRates(eq)
    return Self.formatResources(eq, true)
end

function Self.formatHQ(eq)
    if eq:buildable() then
        return math.max(math.max((eq:rarity() or 0) - 2, 0) * 10, 1)
    else
        return "-"
    end
end

function Self.test()
    local Equipment = require("Module:Equipment")
    return
        Self.formatResources(Equipment("46cm Triple Gun Mount")) ..
        "\n" ..
        Self.formatRates(Equipment("46cm Triple Gun Mount")) ..
        "\n" ..
        Self.formatResources(Equipment("12cm Single Gun Mount"))
end
-- print(p.test())

return Self