Skip to content

Instantly share code, notes, and snippets.

@NikolajDL
Created October 29, 2017 13:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NikolajDL/fcb6d719e33402ce9b207dd7c4fe421d to your computer and use it in GitHub Desktop.
Save NikolajDL/fcb6d719e33402ce9b207dd7c4fe421d to your computer and use it in GitHub Desktop.
Factorio Calculater
var config = {
blue_circuit: createItem(10, 1, { red_circuit: 2, green_circuit: 20 }),
red_circuit: createItem(6, 1, { green_circuit: 2, plastic: 2, copper_cable: 4 }),
green_circuit: createItem(0.5, 1, { copper_cable: 3 }),
plastic: createItem(1, 2, { }),
copper_cable: createItem(0.5, 2, { }),
rail: createItem(0.5, 2, { iron_stick: 1, steel: 1 }),
iron_stick: createItem(0.5, 2, { }),
steel: createItem(17.5 * (1.25 / 2), 1, { }),
gear: createItem(0.5, 1, { }),
yellow_belt: createItem(0.5, 2, { gear: 1 }),
red_belt: createItem(0.5, 1, { yellow_belt: 1, gear: 5 }),
yellow_underground_belt: createItem(1, 2, { yellow_belt: 5 }),
red_underground_belt: createItem(0.5, 2, { yellow_underground_belt: 2, gear: 40 }),
yellow_splitter: createItem(1, 1, { yellow_belt: 4, green_circuit: 5 }),
red_splitter: createItem(2, 1, { yellow_splitter: 1, green_circuit: 10, gear: 10 }),
yellow_inserter: createItem(0.5, 1, { green_circuit: 1, gear: 1 }),
red_inserter: createItem(0.5, 1, { yellow_inserter: 1, gear: 1 }),
blue_inserter: createItem(0.5, 1, { yellow_inserter: 1, green_circuit: 2 }),
purple_inserter: createItem(0.5, 1, { blue_inserter: 1, green_circuit: 4 }),
stack_inserter: createItem(0.5, 1, { blue_inserter: 1, red_circuit: 1, green_circuit: 15, gear: 15 }),
stack_filter_inserter: createItem(0.5, 1, { stack_inserter: 1, green_circuit: 5 }),
speed_module: createItem(15, 1, { green_circuit: 5, red_circuit: 5 }),
speed_module_2: createItem(30, 1, { speed_module: 4, red_circuit: 5, blue_circuit: 5 }),
speed_module_3: createItem(60, 1, { speed_module_2: 5, red_circuit: 5, blue_circuit: 5 })
};
function createItem(time, result, reqs){
return {
time,
result,
reqs
};
}
function calculateFactories(type, amount, seconds, rslt = {}, nesting = 0, verbose = false){
var cnf = config[type];
var result = factoriesPerAmount(cnf.time, cnf.result, amount, seconds);
rslt[type] = rslt[type] ? rslt[type]+result : result;
if(verbose){
console.log(' '.repeat(nesting*2) + `Building ${amount} ${type} in ${seconds}s requires: `, rslt[type], rslt);
}
return Object.keys(cnf.reqs).reduce((agg, n) => (
{ ...agg, ...calculateFactories(n, cnf.reqs[n] * amount, seconds, rslt, nesting + 1, verbose) }
), rslt);
}
function factoriesPerAmount(time, result, amount, seconds){
return (((amount / result) / seconds) * time);
}
function sumResults([...args]){
return args.reduce((agg, n) => {
Object.keys(n).forEach((key) => {
agg[key] = agg[key] ? agg[key] + n[key] : n[key];
});
return agg;
}, {});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment