220 lines
5.6 KiB
Lua

if not RawTech then RawTech = require "utils/raw_technologies" end
local Recipe = {
classname = "FNRecipe"
}
function Recipe:get_recipe_list()
Debug:debug(Recipe.classname, "get_recipe_list( )")
local proto = Player.get().force.recipes or {}
local recipes = {}
for name, recipe in pairs(proto) do
recipes[name] = recipe
end
Recipe:append_implicit_recipes(recipes)
return recipes
end
--return a list of technologies that can open this recipe_name or {}
function Recipe:get_technologies_for_recipe(recipe_name)
Debug:debug(Recipe.classname, "get_technology_for_recipe(", recipe_name, ")")
return RawTech:get_recipe_list_in_tech_dependencies()[recipe_name] or {}
end
function Recipe:get_vRecipe_list(recipe_list)
Debug:debug(Recipe.classname, "get_technology_for_recipe(", recipe_list and "recipe_list", item_list and "item_list", ")")
return self:create_visible_recipes(recipe_list)
end
function Recipe:get_enRecipe_list(recipe_list)
Debug:debug(Recipe.classname, "get_enRecipe_list(", recipe_list and "recipe_list", ")")
return self:create_enable_recipes(recipe_list)
end
function Recipe:get_equals_recipe_list()
Debug:debug(Recipe.classname, "get_equals_recipe_list()")
if not global.fnei.eqRecipe then
global.fnei.eqRecipe = self:create_equals_recipe_list()
end
return global.fnei.eqRecipe
end
----------------------- secondary function --------------------------
function Recipe:append_implicit_recipes(into)
-- Utility to remove the duplicated impostor recipe baseline
local function add_impostor(name)
local recipe = {
name = name,
enabled = true,
hidden = false,
impostor = true,
ingredients = {},
products = {},
energy = 1
}
into[name] = recipe
return recipe
end
for _, proto in pairs(game.entity_prototypes) do
-- Create impostor recipes for items 'mined' from entities
if proto.mineable_properties and proto.resource_category then
local recipe = add_impostor('impostor-minable:' .. proto.name)
recipe.localised_name = get_localised_name(proto)
recipe.category = "mine " .. proto.resource_category
recipe.ingredients = {{ type = 'entity', name = proto.name, amount = 1 }}
recipe.products = proto.mineable_properties.products or {}
-- Required for crafting time estimates
recipe.mining_time = proto.mineable_properties.mining_time
if proto.mineable_properties.required_fluid then
table.insert(recipe.ingredients, {
type = 'fluid',
name = proto.mineable_properties.required_fluid,
amount = proto.mineable_properties.fluid_amount
})
end
end
-- Create impostor recipes for entities that produce a certain fluid/item unconditionally
if proto.fluid then
local recipe = add_impostor('impostor-pumped:' .. proto.name)
recipe.localised_name = get_localised_name(proto)
recipe.category = "pump " .. proto.name
recipe.products = {{ type = 'fluid', name = proto.fluid.name, amount = 1 }}
end
end
-- Impostor recipes are added to the parameter table
return
end
function Recipe:create_equals_recipe_list()
local recipes = game.recipe_prototypes
local ret_buf = {}
local raw_tech = game.technology_prototypes
for _, tech in pairs(raw_tech) do
local n_recipes = {}
local s_recipes = {}
for _,effect in pairs(tech.effects) do
if effect.type == "unlock-recipe" then
local recipe = recipes[effect.recipe]
n_recipes[recipe.name] = recipe
end
end
for name,recipe in pairs(n_recipes) do
for s_name, s_recipe in pairs(s_recipes) do
if Recipe:compare(recipe, s_recipe) then
if not ret_buf[name] then ret_buf[name] = {} end
table.insert(ret_buf[name], s_recipe)
if not ret_buf[s_name] then ret_buf[s_name] = {} end
table.insert(ret_buf[s_name], recipe)
end
end
s_recipes[name] = recipe
end
end
return ret_buf
end
local tech_dep
function Recipe:compare(recipe, s_recipe)
if recipe.energy == s_recipe.energy and recipe.category == s_recipe.category then
if Recipe:compare_recipe_prot(recipe.ingredients, s_recipe.ingredients) and
Recipe:compare_recipe_prot(recipe.products, s_recipe.products)
then
if not tech_dep then
tech_dep = RawTech:create_tech_dependencies(game.technology_prototypes)
end
return Recipe:compare_tech_prot(tech_dep[recipe.name], tech_dep[s_recipe.name])
end
end
return false
end
function Recipe:compare_recipe_prot(list1, list2)
if #list1 ~= #list2 then return false end
for _,prot1 in pairs(list1) do
local flag = false
for _,prot2 in pairs(list2) do
local flag2 = true
for name, val in pairs(prot1) do
flag2 = flag2 and (prot2[name] == val)
end
if flag2 then flag = true end
end
if not flag then return false end
end
return true
end
function Recipe:compare_tech_prot(list1, list2)
if #list1 ~= #list2 then return false end
for _,prot1 in pairs(list1) do
local flag = false
for _,prot2 in pairs(list2) do
if prot1.name == prot2.name then
flag = true
end
end
if not flag then return false end
end
return true
end
function Recipe:create_visible_recipes(recipe_list)
local ret_tb = {}
for _,recipe in pairs(recipe_list) do
if not recipe.hidden then
ret_tb[recipe.name] = recipe
end
end
return ret_tb
end
function Recipe:create_enable_recipes(recipe_list)
local ret_tb = {}
for _,recipe in pairs(recipe_list) do
if recipe.enabled then
ret_tb[recipe.name] = recipe
end
end
return ret_tb
end
return Recipe