Simple flowchart for Satisfactory, a game developed & published by Coffe Stain Studios (game Steam page).
Note
TODO
- build interactive graph/flowchart
data.jsondata.txtdata.dotgephi.svgconvert_json.js- Extract images
- Parsing JSON data (notes)
- Legacy U3 flowchart
UTF-8 JSON file with the following structure/formatting
declare type DATA_JSON = {
descriptions: {
products: [string, number, string, string, string][]; // [ display name, sink value, element type (Solid|Liquid|Gas), IMG path, description ]
manufacturers: [string, string, string][]; // [ display name, IMG path, description ]
};
recipes: {
name: string; // recipe display name
input: [string, number][]; // [ product display name, amount per cycle (items or m³) ]
output: [string, number][]; // [ product display name, amount per cycle (items or m³) ]
machine: [string, ...string[]]; // manufacturer display names
duration: number; // time in seconds for one production cycle (items/min = amount * 60 / duration)
}[];
};click to show/hide example JSON data in en-US language
{
"descriptions": {
"products": [
["Heavy Modular Frame", 10800,"S","./FactoryGame/Content/FactoryGame/Resource/Parts/ModularFrameHeavy/UI/IconDesc_ModularFrameHeavy_256.png", "A more robust multipurpose frame."],
["Nitrogen Gas", 10,"G","./FactoryGame/Content/FactoryGame/Resource/Parts/PackagedNitrogen/UI/IconDesc_NitrogenGas_256.png", "Has a variety of uses, including metallurgy, cooling, and Nitric Acid production. On MASSAGE-2 (AB)b, it can be extracted from underground gas wells."],
["Water", 5,"L","./FactoryGame/Content/FactoryGame/Resource/RawResources/Water/UI/LiquidWater_Pipe_256.png", "It's water."],
// ...
],
"manufacturers": [
["Constructor", "./FactoryGame/Content/FactoryGame/Buildable/Factory/ConstructorMk1/UI/IconDesc_ConstructorMk1_256.png","Crafts 1 part into another part.\n\nCan be automated by feeding component parts in via a Conveyor Belt connected to the input port. The resulting parts can be automatically extracted by connecting a Conveyor Belt to the output port."],
["Crafting Bench", "./FactoryGame/Content/FactoryGame/Buildable/Factory/WorkBench/UI/Workbench_256.png", "Allows you to manually craft a wide range of different parts. \nThese parts can then be used to construct various factory buildings, vehicles, and equipment."],
["Smelter", "./FactoryGame/Content/FactoryGame/Buildable/Factory/SmelterMk1/UI/IconDesc_SmelterMk1_256.png", "Smelts ore into ingots.\n\nCan be automated by feeding ore in via a Conveyor Belt connected to the input port. The resulting ingots can be automatically extracted by connecting a Conveyor Belt to the output port."]
// ...
]
},
"recipes": [
{
"name": "Excited Photonic Matter",
"input": [],
"output": [["Excited Photonic Matter",10]],
"machine": ["Converter"],
"duration": 3
},
{
"name": "Heavy Modular Frame",
"input": [["Screw",120],["Modular Frame",5],["Steel Pipe",20],["Encased Industrial Beam",5]],
"output": [["Heavy Modular Frame",1]],
"machine": ["Manufacturer","Crafting Bench"],
"duration": 30
},
{
"name": "Ionized Fuel",
"input": [["Power Shard",1],["Rocket Fuel",16]],
"output": [["Compacted Coal",2],["Ionized Fuel",16]],
"machine": ["Refinery"],
"duration": 24
},
// ...
]
}it uses one tab indentation and except top-levels everything is sorted alphabetically by name with respect to language of DOCS.json file, so binary search is possible (for names)
some additional spaces have been added to make it more human readable
there are narrow-non-break-spaces (U+202F) in descriptions between value and unit pairs ie 1000-2000\u202FMW
liquid/gas volume is already converted to m³ (from dm³)
list of all AWESOME Sink values (coupon cost) in ascending order
Does not include FICSIT Coupon (gives 1 each) and lists non-sinkable items like artifacts or waste, with ones that yield DNA points under 0
directed graph of recipe order
for all recipes
AandB: whenA.outputsmatches at least one product inB.inputs: connectA -> B
all recipes are connected via index (same index as data.json) and labeled with their name (same language as data.json)
first all recipes (with label) then all connections for each recipe (all outgoing connections inline)
a (static) graph view of data.dot via https://github.com/gephi/gephi/ (outdated)
SVG with selectable text here: https://maz01001.github.io/SatisfactoryFlowchart/gephi.svg
- get
node.js: https://github.com/nodejs/node (easier to installVisual Studio (Community)and addnode.jsas dev-environment)
# generate data.json with en-US language in current directory (overrides data.json)
node convert_json.js /Satisfactory/CommunityResources/Docs/en-US.json data.json
# optionally also generate data.txt to see sink values (overrides data.json and data.txt)
node convert_json.js /Satisfactory/CommunityResources/Docs/en-US.json data.json data.txt
# optionally also generate data.dot for graphing (overrides data.json and data.txt and data.dot)
node convert_json.js /Satisfactory/CommunityResources/Docs/en-US.json data.json data.txt data.dotthe script works with any of the languages in the /Satisfactory/CommunityResources/Docs/ folder; string-sorting is also language dependent
does not calculate graph connections when data.dot CLI-parameter is not supplied
run script (convert_json.js) and copy regexp "FModel IMG path regexp" logged to console (yellow on black, near the end)
- get
7Zip: https://7-zip.org/ - get
FModel: https://github.com/4sval/FModel
- open
/Satisfactory/FactoryGameSteam.exevia 7zip, go to folder.rsrcand openversion.txtand seePRODUCTVERSIONfor Unreal-Engine version ~5,3,2,0=5.3 - open FModel and follow the steps at https://docs.ficsit.app/satisfactory-modding/latest/Development/ExtractGameFiles.html#FModel [archive] (only
FModelsection) but with the Unreal-Engine version from previous step instead - then in
Archivestab (Loading Mode: Multiple) selectFactoryGame-Windows.pakandFactoryGame-Windows.utocand click on Load, it should switch to theFolderstab - then click in the folder view and hit Ctrl+Shift+F and paste in the "FModel IMG path regexp" from before (make sure to check the
.*to the right of the search bar) and press Enter- current FModel IMG path regexp (might be outdated):
FactoryGame/Content/FactoryGame/(Resource/|Buildable/Factory/(WorkBench|Workshop|QuantumEncoder|Converter|HadronCollider|OilRefinery|FoundryMk1|Packager|ManufacturerMk1|AssemblerMk1|Blender|SmelterMk1|ConstructorMk1)/).*_256
- current FModel IMG path regexp (might be outdated):
- select all listed files (Ctrl+A) and right-click and
safe texture (.png)
after all have finished extracting there should be a folder FactoryGame inside /FModel/Output/Exports with all the icons;
this is the root folder with the folder structure that the data.json expects,
so you can copy paste that to the same directory where you have the data.json stored (so the relative-paths in data.json work)
the JSON file Coffe Stain Studios provides is in UTF-16 LE + BOM
JavaScript (node.js) as most languages use UTF-16 natively so that is not a problem but the BOM (0xFEFF) at start of file needs to be ignored so JSON can be parsed → skip first (utf-16) character (2 bytes) when loading file
(relevant) NativeClass names (via regexp \.(\w+)'$) ! not ordered in JSON file
- product-recipes:
FGRecipe- under
Classeseach as{mDisplayName, mIngredients, mProduct, mProducedIn}- ignore all that have empty
mProducedIn - ignore all that have
BP_BuildGun_CorFGBuildGuninmProducedIn mProducedIn~> regexp match all"[^".]*\.(\w+)"for manufacturer-class-name- replace
BP_WorkBenchComponent_C,FGBuildableAutomatedWorkBench, andBuild_AutomatedWorkBench_Cwith (just one)Build_WorkBench_C - replace
BP_WorkshopComponent_CwithBuild_Workshop_C
- replace
mIngredientsandmProduct~> skip first and last 2 chars; split at each),(then regexp matchItemClass="[^']+'[^.]+\.(\w+)'"(product-class-name) andAmount=([0-9]+)(convert to number) on each entrymManufactoringDurationis stored as string so parse to float
- ignore all that have empty
- product descriptions & img path:
FGAmmoTypeInstantHitFGAmmoTypeProjectileFGAmmoTypeSpreadshotFGConsumableDescriptorFGEquipmentDescriptorFGResourceDescriptorFGPowerShardDescriptorFGItemDescriptorFGItemDescriptorBiomassFGItemDescriptorNuclearFuelFGItemDescriptorPowerBoosterFuel- under
Classeseach as{ClassName, mDisplayName, mDescription, mForm, mSmallIcon, mResourceSinkPoints}- use
ClassNamefor resolving class names in recipes later - replace all
\r\ninmDescriptionwith\n mFormcan beRF_SOLID,RF_LIQUID,RF_GAS, orRF_INVALID(string) use first letter and note what is liquid/gas for unit conversion in recipes latermSmallIconfor img paths later during resolving class names in recipesmResourceSinkPointsfor AWESOME Sink points (DNA points are not given and others at 0 will clog the sink)
- use
- manufacturer descriptions:
FGBuildableManufacturerFGBuildableManufacturerVariablePower- and from
FGBuildableonlyBuild_WorkBench_CandBuild_Workshop_C - under
Classeseach as{ClassName, mDisplayName, mDescription}
- manufacturer img path:
FGBuildingDescriptor- includes more than those found under "manufacturer descriptions"
- under
Classeseach as{ClassName, mDisplayName, mSmallIcon}- ignore all where
ClassNamematches regexpBeam|Blue|[Ww]alk|Conveyor|Foundation|Generator|Jump|Miner|Pi(?:llar|pe)|Power|Roof|Sign|Storage|Train|Wall|Set_|_8x(for most but not all redundant images)
- ignore all where
after parsing, when resolving class names in recipes, for every mSmallIcon replace _512 with _256 then match with regexp Texture2D /Game/([^.]*)\. and replace entire string with "/FactoryGame/Content/$1.png" (where $1 is from the regexp match) to match extracted images paths/folder structure
also check if any name in recipes in-/output is a liquid/gas and convert amount accordingly (divide by 1000 when liquid/gas otherwise do nothing)
if you want to see the old flowchart I made for the U3 (0.3) version of Satisfactory, you can find the code in the legacy branch in this repo and a wayback-machine snapshot of the website here: https://web.archive.org/web/20240919112412/https://maz01001.github.io/site/satisfactory_u3_flowchart
it might still be available at its original location https://maz01001.github.io/site/satisfactory_u3_flowchart and the source code at MAZ01001/MAZ01001.github.io/site/satisfactory_u3_flowchart.html
