Page 1 of 1

Print resistances of all enemy types

Posted: Thu Feb 08, 2024 3:15 am
by vernir
Hello. Never wrote for Factorio. Could you kick me in a right direction to help me write a script that prints all resistances of all enemy prototypes to the file? Or just how to iterate through all available Prototype/Units?

Re: Print resistances of all enemy types

Posted: Thu Feb 08, 2024 1:47 pm
by Pi-C
vernir wrote: Thu Feb 08, 2024 3:15 am Could you kick me in a right direction to help me write a script that prints all resistances of all enemy prototypes to the file? Or just how to iterate through all available Prototype/Units?
This can be done in two way:
  • Data stage: Create your own mod (containing info.json and data-final-fixes.lua) and run this in data-final-fixes.lua:

    Code: Select all

    local objects = {
    	 "unit",			-- Biters/spitters
    	 "unit-spawner", 	-- Spawners
    	 "turret",			-- Worms
     }
    for p, protos in pairs(objects) do
    	log("Type: "..protos) 
    	for p, proto in pairs(data.raw[protos] do
    		log(string.format("Ty %s:\tResistances: %s", p, serpent.block(proto.resistances))
    	end
    end
    
    Potential drawback: Mods that modify resistances in data-final-fixes.lua after your mod is done could falsify your results.
  • Directly in the game (all prototypes are final), you can run the following from the command line/chat console:

    Code: Select all

    /c protos = game.get_filtered_entity_prototypes{{filter = "type", type = { "unit", "unit-spawner", "turret"}}}
    for p, proto in pairs(protos) do 
    	log(string.format("Name: %s (%s)\tResistances: %s", p, proto.type, serpent.block(proto.resistances)))
    end
    

Re: Print resistances of all enemy types

Posted: Thu Feb 08, 2024 3:45 pm
by SoShootMe
Pi-C wrote: Thu Feb 08, 2024 1:47 pm Potential drawback: Mods that modify resistances in data-final-fixes.lua after your mod is done could falsify your results.
Instrument mode allows an instrument-after-data.lua that is guaranteed to run last.

There's also --dump-data (see Command line parameters).

Re: Print resistances of all enemy types

Posted: Thu Feb 08, 2024 4:06 pm
by Pi-C
SoShootMe wrote: Thu Feb 08, 2024 3:45 pm Instrument mode allows an instrument-after-data.lua that is guaranteed to run last.
Right, that would work. I've never used this mode before, though, so I didn't think of it. :-)
There's also --dump-data (see Command line parameters).
Definitely useful in general, but dumping all of data.raw seems a bit excessive in this particular case where the OP is interested only in one particular property of a subset of the game's prototypes.

Re: Print resistances of all enemy types

Posted: Thu Feb 08, 2024 4:41 pm
by SoShootMe
Pi-C wrote: Thu Feb 08, 2024 4:06 pm
SoShootMe wrote: Thu Feb 08, 2024 3:45 pm There's also --dump-data (see Command line parameters).
Definitely useful in general, but dumping all of data.raw seems a bit excessive in this particular case where the OP is interested only in one particular property of a subset of the game's prototypes.
I agree it is overkill, but the output will most likely also contain the answers to questions that follow "What are the resistances?" ;). (Also, it's much faster than loading the game and can easily be generated as part of an automated process.)

Re: Print resistances of all enemy types

Posted: Thu Feb 08, 2024 6:13 pm
by vernir
Pi-C wrote: Thu Feb 08, 2024 1:47 pm
vernir wrote: Thu Feb 08, 2024 3:15 am Could you kick me in a right direction to help me write a script that prints all resistances of all enemy prototypes to the file? Or just how to iterate through all available Prototype/Units?
This can be done in two way:
  • Data stage: Create your own mod (containing info.json and data-final-fixes.lua) and run this in data-final-fixes.lua:

    Code: Select all

    local objects = {
    	 "unit",			-- Biters/spitters
    	 "unit-spawner", 	-- Spawners
    	 "turret",			-- Worms
     }
    for p, protos in pairs(objects) do
    	log("Type: "..protos) 
    	for p, proto in pairs(data.raw[protos] do
    		log(string.format("Ty %s:\tResistances: %s", p, serpent.block(proto.resistances))
    	end
    end
    
    Potential drawback: Mods that modify resistances in data-final-fixes.lua after your mod is done could falsify your results.
  • Directly in the game (all prototypes are final), you can run the following from the command line/chat console:

    Code: Select all

    /c protos = game.get_filtered_entity_prototypes{{filter = "type", type = { "unit", "unit-spawner", "turret"}}}
    for p, proto in pairs(protos) do 
    	log(string.format("Name: %s (%s)\tResistances: %s", p, proto.type, serpent.block(proto.resistances)))
    end
    
Thank you, that helps!