create_automall_old
./lua/create_automall_old.lua
--/sc
--[[
does not use ELSE output, works in version 2.0
how to use:
1) change the constants: minimum_items_desired, maximum_items_desired, ingredient_stock_multiplier
2) set the necessary recipes: local recipes = {}
3) select a decider-combinator in the game and run the script
4) select a constant-combinator in the game and run the script
5) use combinators in the build, see example BP
]]
--[[
local quality = "legendary"
local quality = "epic"
local quality = "rare"
local quality = "uncommon"
local quality = "normal"]]
local minimum_items_desired = 1
local maximum_items_desired = 1
local ingredient_stock_multiplier = 1 --[[to start production you need this supply in chests]]
local recipes = {
{name = "carbonic-asteroid-crushing", quality = "normal"},
{name = "oxide-asteroid-crushing", quality = "normal"},
{name = "metallic-asteroid-crushing", quality = "normal"}
}
local recipes = {
{name = "biochamber", quality = "rare"},
{name = "biochamber", quality = "epic"},
{name = "biochamber", quality = "legendary"}
}
--[[-------------------------------------------------]]
local function add_recipe_conditions(recipe, combinator, quality, product_amount, ingr_stock_multiplier)
for _, result in pairs(recipe.products) do
combinator.add_condition {
first_signal = {type = result.type, name = result.name, quality = quality},
first_signal_networks = {red = false, green = true},
constant = product_amount,
comparator = "<",
compare_type = "and"
}
end
for _, ingredient in pairs(recipe.ingredients) do
local ingredient_quality = ingredient.type == "item" and quality or "normal"
local required_amount = ingredient.amount * ingr_stock_multiplier
combinator.add_condition {
first_signal = {type = ingredient.type, name = ingredient.name, quality = ingredient_quality},
first_signal_networks = {red = false, green = true},
constant = required_amount,
comparator = ">=",
compare_type = "and"
}
end
end
--[[-------------------------------------------------]]
local function make_everything_combinator_old(entity)
if not entity then
return
end
if entity.type == "decider-combinator" then
local combinator = entity.get_control_behavior()
combinator.parameters = {conditions = {}, outputs = {}}
local index = -1
for _, r in pairs(recipes) do
local quality = r.quality
local recipe = prototypes.recipe[r.name]
index = index + 2
--[[local stack_size = recipe.main_product and prototypes.item[recipe.main_product.name].stack_size or -1]]
--[[section that starts recipe production]]
combinator.add_condition {
first_signal = {type = "virtual", name = "signal-each"},
first_signal_networks = {green = false, red = true},
constant = index,
comparator = "="
}
combinator.add_condition {
first_signal = {type = "virtual", name = "signal-deny"},
first_signal_networks = {green = false, red = true},
comparator = "=",
compare_type = "and"
}
add_recipe_conditions(recipe, combinator, quality, minimum_items_desired, ingredient_stock_multiplier)
--[[section that continues production of the recipe]]
combinator.add_condition {
first_signal = {type = "virtual", name = "signal-each"},
first_signal_networks = {green = false, red = true},
constant = index + 1,
comparator = "="
}
add_recipe_conditions(recipe, combinator, quality, maximum_items_desired, 1)
end
--[[-------------------]]
combinator.add_output(
{
signal = {type = "virtual", name = "signal-each"},
constant = 1,
copy_count_from_input = false
}
)
combinator.add_output(
{
signal = {type = "virtual", name = "signal-deny"},
constant = -1,
copy_count_from_input = false
}
)
end
if entity.type == "constant-combinator" then
--[[fill in the necessary constants]]
local index = -1
local combinator = entity.get_control_behavior()
combinator.add_section()
local section = combinator.get_section(1)
local slot_index = 0
for _, r in pairs(recipes) do
local quality = r.quality
local recipe = prototypes.recipe[r.name]
index = index + 2
slot_index = slot_index + 1
section.set_slot(
slot_index,
{
value = {type = "recipe", name = recipe.name, quality = quality},
min = index
}
)
end
end
end
make_everything_combinator_old(game.player.selected)