330 lines
12 KiB
Lua

-- This generates bottle items and fill/empty recipes for gasses.
local function get_item(name)
local items = data.raw["item"]
if items then
return items[name]
end
return nil
end
local function get_recipes_for_barrel(name)
local recipes = data.raw["recipe"]
if recipes then
return recipes["fill-" .. name], recipes["empty-" .. name]
end
return nil
end
-- Generates the icons definition for a barrel item with the provided name and fluid definition using the provided empty barrel base icon
local function generate_gas_bottle_item_icons(fluid)
return {
{ icon = "__boblibrary__/graphics/icons/cylinder/gas-canister.png", icon_size = 32 },
{ icon = "__boblibrary__/graphics/icons/cylinder/cylinder-top.png", icon_size = 32, tint = fluid.flow_color },
{ icon = "__boblibrary__/graphics/icons/cylinder/cylinder-mid.png", icon_size = 32, tint = fluid.base_color },
}
end
local function generate_fluid_canister_item_icons(fluid)
return {
{ icon = "__boblibrary__/graphics/icons/cylinder/empty-canister.png", icon_size = 32 },
{ icon = "__boblibrary__/graphics/icons/cylinder/canister-top.png", icon_size = 32, tint = fluid.flow_color },
{ icon = "__boblibrary__/graphics/icons/cylinder/canister-bottom.png", icon_size = 32, tint = fluid.base_color },
}
end
-- Generates the icons definition for a fill-barrel recipe with the provided fluid definition and icon
local function generate_fill_recipe_icons(fluid, icon)
if fluid.icon and fluid.icon_size then
table.insert(
icon,
{ icon = fluid.icon, icon_size = fluid.icon_size, scale = 16.0 / fluid.icon_size, shift = { 4, -8 } }
)
elseif fluid.icons and util.combine_icons then
icon = util.combine_icons(icon, fluid.icons, { scale = 0.5, shift = { 4, -8 } })
end
return icon
end
local function generate_fill_gas_bottle_icons(fluid)
local icon = generate_gas_bottle_item_icons(fluid)
return generate_fill_recipe_icons(fluid, icon)
end
local function generate_fill_fluid_canister_icons(fluid)
local icon = generate_fluid_canister_item_icons(fluid)
return generate_fill_recipe_icons(fluid, icon)
end
-- Generates the icons definition for a empty-barrel recipe with the provided fluid definition and icon
local function generate_empty_recipe_icons(fluid, icon)
if fluid.icon and fluid.icon_size then
table.insert(
icon,
{ icon = fluid.icon, icon_size = fluid.icon_size, scale = 16.0 / fluid.icon_size, shift = { 7, 8 } }
)
elseif fluid.icons and util.combine_icons then
icon = util.combine_icons(icon, fluid.icons, { scale = 0.5, shift = { 7, 8 } })
end
return icon
end
local function generate_empty_gas_bottle_icons(fluid)
local icon = generate_gas_bottle_item_icons(fluid)
return generate_empty_recipe_icons(fluid, icon)
end
local function generate_empty_fluid_canister_icons(fluid)
local icon = generate_fluid_canister_item_icons(fluid)
return generate_empty_recipe_icons(fluid, icon)
end
-- Generates a gas bottle item with the provided name and fluid definition
local function create_gas_bottle_item(fluid)
local result = {
type = "item",
name = fluid.name .. "-barrel",
localised_name = { "item-name.filled-gas-canister", fluid.localised_name or { "fluid-name." .. fluid.name } },
icons = generate_gas_bottle_item_icons(fluid),
subgroup = "bob-gas-bottle",
order = "b[" .. fluid.name .. "-barrel" .. "]",
stack_size = 10,
}
data:extend({ result })
return result
end
-- Generates a fluid canister item with the provided name and fluid definition
local function create_fluid_canister_item(fluid)
local result = {
type = "item",
name = fluid.name .. "-barrel",
localised_name = { "item-name.filled-canister", fluid.localised_name or { "fluid-name." .. fluid.name } },
icons = generate_gas_bottle_item_icons(fluid),
subgroup = "bob-canister",
order = "b[" .. fluid.name .. "-barrel" .. "]",
stack_size = 10,
}
data:extend({ result })
return result
end
-- Creates a recipe to fill the provided barrel item with the provided fluid
local function create_fill_gas_bottle_recipe(fluid)
local recipe = {
type = "recipe",
name = "fill-" .. fluid.name .. "-barrel",
localised_name = { "recipe-name.fill-gas-canister", fluid.localised_name or { "fluid-name." .. fluid.name } },
category = "air-pump",
subgroup = "bob-gas-bottle",
energy_required = 0.2,
order = "b[fill-" .. fluid.name .. "-barrel" .. "]",
enabled = false,
icons = generate_fill_gas_bottle_icons(fluid),
ingredients = {
{ type = "fluid", name = fluid.name, amount = 50 },
{ type = "item", name = "gas-canister", amount = 1 },
},
results = {
{ type = "item", name = fluid.name .. "-barrel", amount = 1 },
},
allow_decomposition = false,
}
data:extend({ recipe })
return recipe
end
-- Creates a recipe to fill the provided barrel item with the provided fluid
local function create_fill_fluid_canister_recipe(fluid)
local recipe = {
type = "recipe",
name = "fill-" .. fluid.name .. "-barrel",
localised_name = { "recipe-name.fill-canister", fluid.localised_name or { "fluid-name." .. fluid.name } },
category = "air-pump",
subgroup = "bob-canister",
energy_required = 0.2,
order = "b[fill-" .. fluid.name .. "-barrel" .. "]",
enabled = false,
icons = generate_fill_fluid_canister_icons(fluid),
ingredients = {
{ type = "fluid", name = fluid.name, amount = 50 },
{ type = "item", name = "gas-canister", amount = 1 },
},
results = {
{ type = "item", name = fluid.name .. "-barrel", amount = 1 },
},
allow_decomposition = false,
}
data:extend({ recipe })
return recipe
end
-- Creates a recipe to empty the provided full barrel item producing the provided fluid
local function create_empty_gas_bottle_recipe(fluid)
local recipe = {
type = "recipe",
name = "empty-" .. fluid.name .. "-barrel",
localised_name = {
"recipe-name.empty-filled-gas-canister",
fluid.localised_name or { "fluid-name." .. fluid.name },
},
category = "air-pump",
subgroup = "bob-empty-gas-bottle",
energy_required = 0.2,
order = "c[empty-" .. fluid.name .. "-barrel" .. "]",
enabled = false,
icons = generate_empty_gas_bottle_icons(fluid),
ingredients = {
{ type = "item", name = fluid.name .. "-barrel", amount = 1 },
},
results = {
{ type = "fluid", name = fluid.name, amount = 50 },
{ type = "item", name = "gas-canister", amount = 1 },
},
allow_decomposition = false,
}
data:extend({ recipe })
return recipe
end
-- Creates a recipe to empty the provided full barrel item producing the provided fluid
local function create_empty_fluid_canister_recipe(fluid)
local recipe = {
type = "recipe",
name = "empty-" .. fluid.name .. "-barrel",
localised_name = { "recipe-name.empty-filled-canister", fluid.localised_name or { "fluid-name." .. fluid.name } },
category = "air-pump",
subgroup = "bob-empty-canister",
energy_required = 0.2,
order = "c[empty-" .. fluid.name .. "-barrel" .. "]",
enabled = false,
icons = generate_empty_fluid_canister_icons(fluid),
ingredients = {
{ type = "item", name = fluid.name .. "-barrel", amount = 1 },
},
results = {
{ type = "fluid", name = fluid.name, amount = 50 },
{ type = "item", name = "gas-canister", amount = 1 },
},
allow_decomposition = false,
}
data:extend({ recipe })
return recipe
end
function bobmods.lib.create_gas_bottle(fluid)
if
fluid
and data.raw["item-subgroup"]["bob-empty-gas-bottle"]
and data.raw["recipe-category"]["air-pump"]
and data.raw["item-subgroup"]["bob-gas-bottle"]
then
-- check if a barrel already exists for this fluid if not - create one
local barrel_item = get_item(fluid.name .. "-barrel")
if barrel_item then
barrel_item.icons = generate_gas_bottle_item_icons(fluid)
barrel_item.localised_name =
{ "item-name.filled-gas-canister", fluid.localised_name or { "fluid-name." .. fluid.name } }
barrel_item.subgroup = "bob-gas-bottle"
else
barrel_item = create_gas_bottle_item(fluid)
end
-- check if the barrel has a recipe if not - create one
local fill_recipe, empty_recipe = get_recipes_for_barrel(fluid.name .. "-barrel")
if fill_recipe then
fill_recipe.localised_name =
{ "recipe-name.fill-gas-canister", fluid.localised_name or { "fluid-name." .. fluid.name } }
fill_recipe.category = "air-pump"
fill_recipe.subgroup = "bob-gas-bottle"
fill_recipe.icons = generate_fill_gas_bottle_icons(fluid)
bobmods.lib.recipe.replace_ingredient(fill_recipe.name, "empty-barrel", "gas-canister")
bobmods.lib.tech.remove_recipe_unlock("fluid-handling", fill_recipe.name)
bobmods.lib.tech.remove_recipe_unlock("fluid-barrel-processing", fill_recipe.name)
else
fill_recipe = create_fill_gas_bottle_recipe(fluid)
end
if empty_recipe then
empty_recipe.localised_name =
{ "recipe-name.empty-filled-gas-canister", fluid.localised_name or { "fluid-name." .. fluid.name } }
empty_recipe.category = "air-pump"
empty_recipe.subgroup = "bob-empty-gas-bottle"
empty_recipe.icons = generate_empty_gas_bottle_icons(fluid)
bobmods.lib.recipe.remove_result(empty_recipe.name, "empty-barrel")
bobmods.lib.recipe.set_result(empty_recipe.name, "gas-canister")
bobmods.lib.tech.remove_recipe_unlock("fluid-handling", empty_recipe.name)
bobmods.lib.tech.remove_recipe_unlock("fluid-barrel-processing", empty_recipe.name)
else
empty_recipe = create_empty_gas_bottle_recipe(fluid)
end
-- add barrel recipe to the unlock list of the technology
bobmods.lib.tech.add_recipe_unlock("gas-canisters", fill_recipe.name)
bobmods.lib.tech.add_recipe_unlock("gas-canisters", empty_recipe.name)
end
end
function bobmods.lib.create_fluid_canister(fluid)
if
fluid
and data.raw["item-subgroup"]["bob-empty-canister"]
and data.raw["recipe-category"]["barrelling"]
and data.raw["item-subgroup"]["bob-canister"]
then
-- check if a barrel already exists for this fluid if not - create one
local barrel_item = get_item(fluid.name .. "-barrel")
if barrel_item then
barrel_item.icons = generate_fluid_canister_item_icons(fluid)
barrel_item.localised_name =
{ "item-name.filled-gas-canister", fluid.localised_name or { "fluid-name." .. fluid.name } }
barrel_item.subgroup = "bob-canister"
else
barrel_item = create_fluid_canister_item(fluid)
end
-- check if the barrel has a recipe if not - create one
local fill_recipe, empty_recipe = get_recipes_for_barrel(fluid.name .. "-barrel")
if fill_recipe then
fill_recipe.localised_name =
{ "recipe-name.fill-canister", fluid.localised_name or { "fluid-name." .. fluid.name } }
fill_recipe.subgroup = "bob-canister"
fill_recipe.icons = generate_fill_fluid_canister_icons(fluid)
bobmods.lib.recipe.replace_ingredient(fill_recipe.name, "empty-barrel", "empty-canister")
bobmods.lib.tech.remove_recipe_unlock("fluid-handling", fill_recipe.name)
bobmods.lib.tech.remove_recipe_unlock("fluid-barrel-processing", fill_recipe.name)
else
fill_recipe = create_fill_fluid_canister_recipe(fluid)
end
if empty_recipe then
empty_recipe.localised_name =
{ "recipe-name.empty-filled-canister", fluid.localised_name or { "fluid-name." .. fluid.name } }
empty_recipe.subgroup = "bob-empty-canister"
empty_recipe.icons = generate_empty_fluid_canister_icons(fluid)
bobmods.lib.recipe.remove_result(empty_recipe.name, "empty-barrel")
bobmods.lib.recipe.add_result(empty_recipe.name, "empty-canister")
bobmods.lib.tech.remove_recipe_unlock("fluid-handling", empty_recipe.name)
bobmods.lib.tech.remove_recipe_unlock("fluid-barrel-processing", empty_recipe.name)
else
empty_recipe = create_empty_fluid_canister_recipe(fluid)
end
-- add barrel recipe to the unlock list of the technology
bobmods.lib.tech.add_recipe_unlock("fluid-canister-processing", fill_recipe.name)
bobmods.lib.tech.add_recipe_unlock("fluid-canister-processing", empty_recipe.name)
end
end