缺氧 wiki 编辑团队提示:注册账号并登录后体验更佳,且可通过参数设置定制优化您的浏览体验!

该站点为镜像站点,如果你想帮助这个由玩家志愿编辑的 wiki 站点,请前往原站点参与编辑,
同时欢迎加入编辑讨论群 851803695 与其他编辑者一起参与建设!

全站通知:

模块:表格/建筑配方

来自缺氧WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:表格/建筑配方/doc创建

-- Module:表格/配方
local p = {}
local getArgs = require('Module:Dev/Arguments').getArgs
local fstr = mw.ustring.format -- shortcut for formattig a string
local po = require([[Module:Po]]).po
local tb = require([[Module:表格]])
local utils = require([[Module:Utils]])
local i18ndb = require([[Module:I18n]]).loadMessages([[Module:i18n/Buildings]])
local buData = mw.loadData([[Module:Data/Buildings]])
local k0 = utils.K0

-- return {buCode}
local function getBuCode(pagename)
    local buCode = i18ndb:msgRev({
        key = pagename,
        args = {
            prefix = "STRINGS.BUILDINGS.PREFABS."
        }
    } or "")
    if buCode == nil or utils.isDefaultT(pagename, buCode) then
        error(fstr("找不到建筑物 '%s',请使用参数1或检查 [[%s]]。", pagename, [[Module:Data/Buildings]]))
    else
        return buCode
    end
    return nil
end

function p._main(recipe, buCode)
    local out = {}
    -- 工作时间
    table.insert(out, recipe.workTime == 1 and "每秒" or fstr("%s 秒", utils.float2str(recipe.workTime)))
    -- 消耗
    if recipe.input ~= nil then
        local inputs = {}
        for _, input in ipairs(recipe.input) do
            local inputName = utils.getEntry(input.element)
            table.insert(inputs, fstr("{{物品|%s}} %s 千克", inputName, utils.float2str(input.amount)))
        end
        if #inputs > 0 then
            table.insert(out, table.concat(inputs, "<br/>"))
        else
            table.insert(out, "")
        end
    else
        table.insert(out, "")
    end
    -- 消耗
    if recipe.output ~= nil then
        local outputs = {}
        for _, output in ipairs(recipe.output) do
            local outputName = utils.getEntry(output.element)
            local minTemperature = output.minTemperature ~= nil and utils.float2str(output.minTemperature + k0) .. " °C" or ""
            table.insert(outputs, fstr('<abbr title = "最低温度:%s">{{物品|%s}}</abbr> %s 千克',
                minTemperature,
                outputName,
                utils.float2str(output.amount)
            ))
        end
        if #outputs > 0 then
            table.insert(out, table.concat(outputs, "<br/>"))
        else
            table.insert(out, "")
        end
    else
        table.insert(out, "")
    end
    return out
end

-- test by : = p.main(require("Module:debug").frame({},{debug=1, pagename="燃气灶"}))
-- test by : = p.main(require("Module:debug").frame({},{debug=1, "SteamTurbine"}))
function p.main(frame)
    local args = getArgs(frame)
    local builds = {}
    if args ~= nil and args[1] ~= nil then
        for _, buId in ipairs(args) do
            for k, v in pairs(buData) do
                if k:upper() == buId:upper() then
                    local _, _, buCode = utils.getEntry(buId)
                    table.insert(builds, {
                        id = k,
                        code = buCode
                    })
                    break
                end
            end
        end
    else
        local buCode = getBuCode(args.pagename)
        if buCode ~= nil then
            local buId = buCode:match("([%u%d]+).NAME$")
            table.insert(builds, {
                id = buId,
                code = buCode
            })
        end
    end

    if #builds <= 0 then
        error(fstr("找不到建筑物 '%s',请使用参数1或检查 [[%s]]。", args.pagename, [[Module:Data/Buildings]]))
    end

    -- 组装信息
    local infos = {}
    for _, building in ipairs(builds) do
        for k, v in pairs(buData) do
            if k:upper() == building.id:upper() then
                if v.recipes ~= nil then
                    for i, recipe in ipairs(v.recipes) do
                        local info = p._main(recipe, building.code)
                        table.insert(infos, info)
                    end
                end
            end
        end
    end

    if args.debug then
        mw.logObject(infos, "infos")
    end

    return tb.table(infos, args)
end

return p