Module:ElementNames

From Oxygen Not Included Wiki
Jump to navigation Jump to search

This is a utility module for:

It has 4 outward functions; Three functions that return the entire Element from the various Data Modules(Special, Solid, Liquid, and Gas), and one function to match the pagename for a given element.

  • elementFromPagename(pagename)
  • elementFromElementId(eleID)
  • elementFromLocId(locID)
  • pagenameFromElement(e)

local p = {}

local i18nde = require("module:i18n/strings/elements")
local _e = function(...) return i18nde["en"][(({...})[1])] end
local function _spaceToUnderscore(str) return str:gsub("%s", "_") end

-- prime game data
local function _addIdx(dt)
    local idIdx = {}
    local locIdx = {}
    for i, v in ipairs(dt) do
        idIdx[v.elementId] = i
        locIdx[v.localizationID] = i
    end
    dt.getById = function(self, id) return self[idIdx[id]] end
    dt.getByLoc = function(self, loc) return self[locIdx[loc]] end
    return dt
end

local dataGa = _addIdx(require("Module:Data/gas"))
local dataLi = _addIdx(require("Module:Data/liquid"))
local dataSo = _addIdx(require("Module:Data/solid"))
local dataSp = _addIdx(require("Module:Data/special"))
local stateData = {
    solid = dataSo,
    liquid = dataLi,
    gas = dataGa,
    special = dataSp
}

-- before english localization names were unique, the english wiki choose it's own pagenames
-- the english wikis pagenames are now in line with the english localization
-- to assure backwards compatibility with older scripts these old pagenames must be matched
local pageMatch = {
    ['Liquid Cobalt'] = 'MoltenCobalt', 
    ['Liquid Copper'] = 'MoltenCopper', 
    ['Liquid Gold'] = 'MoltenGold', 
    ['Liquid Iron'] = 'MoltenIron', 
    ['Liquid Niobium'] = 'MoltenNiobium', 
    ['Liquid Steel'] = 'MoltenSteel', 
    ['Liquid Tungsten'] = 'MoltenTungsten',
    ['Resin'] = 'SolidResin',
    ['Methane'] = 'LiquidMethane',
    ['Naphtha'] = 'Naphtha',
    ['Nuclear Waste'] = 'NuclearWaste',
    ['Visco-Gel'] = 'ViscoGel',
    ['Gas Aluminum'] = 'AluminumGas',
    ['Gas Aluminium'] = 'AluminumGas',
    ['Gas Cobalt'] = 'CobaltGas',
    ['Gas Copper'] = 'CopperGas',
    ['Gas Gold'] = 'GoldGas',
    ['Gas Iron'] = 'IronGas',
    ['Gas Lead'] = 'LeadGas',
    ['Gas Mercury'] = 'MercuryGas',
    ['Gas Niobium'] = 'NiobiumGas',
    ['Gas Steel'] = 'SteelGas',
    ['Gas Tungsten'] = 'TungstenGas',
    ['Gas Ethanol'] = 'EthanolGas',
    ['Gas Carbon'] = 'CarbonGas',
    ['Chlorine'] = 'ChlorineGas',
    ['Hydrogen'] = 'HydrogenGas',
    ['Gas Phosphorus'] = 'PhosphorusGas',
    ['Gas Sulfur'] = 'SulfurGas',
    ['Gas Super Coolant'] = 'SuperCoolantGas'
}

local function _locIdFromLocConstructor()
    -- invert and filter element strings table for names
    local t = {}
    local pattern = "^STRINGS%.ELEMENTS%..*%.NAME$"    
    for key, value in pairs(i18nde["en"]) do
        if string.match(key, pattern) then
            t[_spaceToUnderscore(value)] = key
        end
    end
    return t
end
local locIdFromLoc = _locIdFromLocConstructor()

-- gets entire Element data from ElementID
local function _eleFromEleId(field, eleID)
    for _, state in pairs(field) do
        local result = state:getById(eleID)
        if result then return result end
    end
    return _eleFromEleId(field, "Void") -- if fails, return the literal void
end

-- gets entire Element data from LocalizationID
local function _eleFromLocId(field, locID)
    for _, state in pairs(field) do
        local result = state:getByLoc(locID)
        if result then return result end
    end
    return _eleFromEleId(field, "Void") -- if fails, return the literal void
end
function p.elementFromLocId(locID)
    return _eleFromLocId(stateData, locID)
end

function p.elementFromElementId(eleID)
    return _eleFromEleId(stateData, eleID)
end

function p.elementFromPagename(pagename)
    local eleConstruct = ''

    if pageMatch[pagename] then 
        return _eleFromEleId(stateData, pageMatch[pagename])
    end

    return _eleFromLocId(stateData, locIdFromLoc[_spaceToUnderscore(pagename)]    )
end

function p.pagenameFromElement(e)
    return _e(e.localizationID)
end

function p.pagenameFromElementID(eleID)
    return _e("STRINGS.ELEMENTS." .. eleID:upper() .. ".NAME")
end

return p