Page 1 of 1

Table Building Function

Posted: Fri Jul 08, 2016 1:09 am
by Ranakastrasz
I would like to make a function I can call in config, or in an addon mod, which will let me build this kind of table. Is there a pre-existing mod that has something like this I could look at, or a good explaination on how to do such?

I suspect that Factorio itself does something similar, with how it uses Extend for prototype definitions.

Code: Select all

RanaMods.ModularArmor.equipmentData =
{
    {
        name = "conduit",
        type = "conduit",
        equipment =
        {
            {name = "power-conduit-equipment"    , power = 60 * 1000 * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick},
            {name = "power-conduit-mk2-equipment", power = 90 * 1000 * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick},
            {name = "power-conduit-mk3-equipment", power =150 * 1000 * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick},
            {name = "power-conduit-mk4-equipment", power =240 * 1000 * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick},
        }
    },
    {
        name = "burner",
        type = "fuelled",
        equipment = 
        {
            {name = "engine-equipment"    ,  power = 100 * 1000 * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick},
            {name = "engine-mk2-equipment",  power = 150 * 1000 * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick},
            {name = "engine-mk3-equipment",  power = 250 * 1000 * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick},
            {name = "engine-mk4-equipment",  power = 400 * 1000 * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick},
        },
        fuel = 
        {
            {name = "solid-fuel", power =  25.*1000*1000*RanaMods.ModularArmor.config.fuelCoef}, -- Value of each fuel type.
            {name = "coal"      , power =   8.*1000*1000*RanaMods.ModularArmor.config.fuelCoef}, 
            {name = "raw-wood"  , power =   4.*1000*1000*RanaMods.ModularArmor.config.fuelCoef},
        },
        pollution = 0.01, -- Per kilowatt produced.
    
    },
    {
        name = "fusion",
        type = "fuelled",
        equipment = 
        {
            {name = "fusion-reactor-equipment"    , power =  960 * 1000 * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick},
            {name = "fusion-reactor-mk2-equipment", power = 1500 * 1000 * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick},
            {name = "fusion-reactor-mk3-equipment", power = 2500 * 1000 * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick},
            {name = "fusion-reactor-mk4-equipment", power = 4000 * 1000 * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick},
        },
        fuel = 
        {
            {name = "alien-fuel", power =  200.*1000*1000*RanaMods.ModularArmor.config.fuelCoef},
        }
    
    }
}

Re: Table Building Function

Posted: Fri Jul 08, 2016 9:01 am
by prg
You're looking for a function that can insert a new element into an existing table?

Re: Table Building Function

Posted: Fri Jul 08, 2016 9:23 am
by Ranakastrasz
Yes.

Re: Table Building Function

Posted: Fri Jul 08, 2016 9:27 am
by prg

Code: Select all

table.insert(mytable, element)

Re: Table Building Function

Posted: Fri Jul 08, 2016 9:38 am
by Ranakastrasz
How can I use that to alter the inner table?

Re: Table Building Function

Posted: Fri Jul 08, 2016 9:43 am
by prg
What inner table do you want to modify how? You want to do more than just append a new { type="foo", name="foo", ... } to equipmentData?

Re: Table Building Function

Posted: Fri Jul 08, 2016 10:01 am
by Ranakastrasz
Need to add to the "equipment ="

Re: Table Building Function

Posted: Fri Jul 08, 2016 10:14 am
by prg
Could you give a proper specification of that function you're looking for and an example usage? I'm just guessing here. Do you want to add a new entry to the equipment table of a certain name/type in the equipmentData table?

Code: Select all

for _, v in pairs(RanaMods.ModularArmor.equipmentData) do
    if v.type == "fuelled" and v.name == "burner" then
        table.insert(v.equipment, {name="foo", power=123})
        break
    end
end

Re: Table Building Function

Posted: Fri Jul 08, 2016 10:32 am
by Ranakastrasz
Basically, yes. That looks like it should work..
Work, even tho it is ugly.

Re: Table Building Function

Posted: Fri Jul 08, 2016 7:23 pm
by bobingabout
I know it's probably solved now, but, if you ever need to look at example functions, take a look at this viewtopic.php?f=51&t=16642
I do this sort of table manipulation all over the place in my mods.

Re: Table Building Function

Posted: Sat Jul 09, 2016 6:41 pm
by Ranakastrasz
Appears to works now, But I would honestly like more error/duplicate checking. Still, should make the next part possible at least.

Code: Select all

function registerEquipmentGroup(iName,iType)
    if not RanaMods.ModularArmor.equipmentData then
        RanaMods.ModularArmor.equipmentData = {}
    end
    for _, v in pairs(RanaMods.ModularArmor.equipmentData) do
        if v.name == iName then
            return
        end
    end
    table.insert(RanaMods.ModularArmor.equipmentData, {name=iName, type = iType})
end

function registerEquipmentPrototype (iName,iType,iPrototype,iPower)

    if not RanaMods.ModularArmor.equipmentData then
        RanaMods.ModularArmor.equipmentData = {}
    end
    for _, v in pairs(RanaMods.ModularArmor.equipmentData) do
        if v.name == iName then
            if not v.equipment then
                v.equipment = {}
            end
            
            table.insert(v.equipment, {name=iPrototype, power=iPower * RanaMods.ModularArmor.config.powerCoef *RanaMods.ModularArmor.config.secondsPerTick})
            
            break
        end
    end
end

function registerFuelPrototype (iName,iType,iPrototype,iPower)

    if not RanaMods.ModularArmor.equipmentData then
        RanaMods.ModularArmor.equipmentData = {}
    end
    for _, v in pairs(RanaMods.ModularArmor.equipmentData) do
        if v.name == iName then
            if not v.fuel then
                v.fuel = {}
            end
            
            table.insert(v.fuel, {name=iPrototype, power=iPower*RanaMods.ModularArmor.config.fuelCoef})
            
            break
        end
    end
end

registerEquipmentGroup("conduit","conduit")
registerEquipmentGroup("burner","fuelled")
registerEquipmentGroup("fusion","fuelled")

registerEquipmentPrototype("conduit","conduit","power-conduit-equipment"    , 60 * 1000)
registerEquipmentPrototype("burner" ,"fuelled","engine-equipment"           ,100 * 1000)
registerEquipmentPrototype("fusion" ,"fuelled","fusion-reactor-equipment"   ,960 * 1000)

registerFuelPrototype("burner" ,"fuelled","solid-fuel",25   * 1000 * 1000)
registerFuelPrototype("burner" ,"fuelled","coal"      ,8.   * 1000 * 1000)
registerFuelPrototype("burner" ,"fuelled","raw-wood"  ,4.   * 1000 * 1000)

registerFuelPrototype("fusion" ,"fuelled","alien-fuel",200. * 1000 * 1000)