From 15427d0fff4dffb2c4f2a7530ebce482f6f31719 Mon Sep 17 00:00:00 2001 From: TheSAguy Date: Tue, 9 Sep 2025 11:45:53 -0700 Subject: [PATCH] 2.0.13 Update --- Bio_Industries_2/changelog.txt | 7 + Bio_Industries_2/data-final-fixes.lua | 11 +- Bio_Industries_2/data-updates.lua | 277 +++++++- Bio_Industries_2/data.lua | 4 +- .../fluid_advanced_fertilizer_recipe.png | Bin 0 -> 2552 bytes .../graphics/icons/fluid_fertilizer.png | Bin 0 -> 2530 bytes .../icons/mod_bobangels/liquid-air.png | Bin 0 -> 1328 bytes .../{entity_old => old}/Arboretum_Icon.png | Bin .../{entity_old => old}/Arboretum_Icon_64.png | Bin .../{entity_old => old}/Bio_Farm_Cabeling.png | Bin .../{entity_old => old}/Bio_Farm_Icon.png | Bin .../{entity_old => old}/Bio_Farm_Icon_64.png | Bin .../{entity_old => old}/Bio_Farm_Lamp.png | Bin .../{entity_old => old}/Bio_Farm_Solar.png | Bin .../Bio_Solar_Boiler_64.png | Bin .../Bio_Solar_Boiler_Boiler_Icon.png | Bin .../Bio_Solar_Boiler_Icon.png | Bin .../Bio_Solar_Boiler_Panel_Icon.png | Bin .../{entity_old => old}/Bio_Solar_Farm_64.png | Bin .../Bio_Solar_Farm_Icon.png | Bin .../icons/old/advanced_fertilizer.png | Bin 0 -> 9942 bytes .../icons/old/advanced_fertilizer_64.png | Bin 0 -> 6586 bytes .../bi_LargeAccumulator.png | Bin .../bi_LargeAccumulator_64.png | Bin .../bi_LargeSubstation_64.png | Bin .../bi_LargeSubstation_icon.png | Bin .../{entity_old => old}/big-wooden-pole.png | Bin .../big-wooden-pole_64.png | Bin .../icons/{entity_old => old}/bio_boiler.png | Bin .../{entity_old => old}/bio_garden_64.png | Bin .../{entity_old => old}/bio_garden_icon.png | Bin .../{entity_old => old}/bio_greenhouse.png | Bin .../{entity_old => old}/bio_greenhouse_64.png | Bin .../{entity_old => old}/bio_turret_icon.png | Bin .../bio_turret_icon_64.png | Bin .../{entity_old => old}/biocannon_icon.png | Bin .../{entity_old => old}/biocannon_icon_64.png | Bin .../icons/{entity_old => old}/bioreactor.png | Bin .../{entity_old => old}/bioreactor_64.png | Bin .../icons/{entity_old => old}/cokery.png | Bin .../icons/{entity_old => old}/cokery_64.png | Bin .../graphics/icons/old/cokery_alt.png | Bin 0 -> 5318 bytes .../curved-rail-concrete.png | Bin .../{entity_old => old}/curved-rail-wood.png | Bin .../graphics/icons/old/fertilizer_64.png | Bin 0 -> 7487 bytes .../old/fluid_advanced_fertilizer_64.png | Bin 0 -> 16172 bytes .../icons/old/fluid_fertilizer_recipe_64.png | Bin 0 -> 16992 bytes .../giga_wooden_chest_64.png | Bin .../giga_wooden_chest_icon.png | Bin .../{entity_old => old}/huge-wooden-pole.png | Bin .../huge-wooden-pole_64.png | Bin .../huge_wooden_chest_64.png | Bin .../huge_wooden_chest_icon.png | Bin .../large_wooden_chest_64.png | Bin .../large_wooden_chest_icon.png | Bin .../pipe-to-ground-wood.png | Bin .../icons/{entity_old => old}/rail-wood.png | Bin .../icons/{entity_old => old}/solar-mat.png | Bin .../{entity_old => old}/stone_crusher.png | Bin .../{entity_old => old}/stone_crusher_64.png | Bin .../straight-rail-concrete.png | Bin .../straight-rail-wood.png | Bin .../icons/{entity_old => old}/wood_pipe.png | Bin .../{entity_old => old}/wood_pipe_alt.png | Bin .../{entity_old => old}/wooden-fence.png | Bin .../icons/{entity_old => old}/woodrail_64.png | Bin .../graphics/icons/tree-seed-1.png | Bin 0 -> 4010 bytes .../graphics/icons/tree-seed-2.png | Bin 0 -> 3969 bytes .../graphics/icons/tree-seed-3.png | Bin 0 -> 3391 bytes .../graphics/icons/tree-seed-4.png | Bin 0 -> 3849 bytes Bio_Industries_2/info.json | 2 +- Bio_Industries_2/libs/category-functions.lua | 43 +- Bio_Industries_2/libs/error-functions.lua | 154 +++++ Bio_Industries_2/libs/functions.lua | 108 ++-- Bio_Industries_2/libs/item-functions.lua | 411 ++++++++---- Bio_Industries_2/libs/recipe-functions.lua | 601 +++++++++++++++--- .../libs/technology-functions.lua | 474 ++++++++++---- .../Bio_Farm/compatible_recipes.lua | 8 +- Bio_Industries_2/prototypes/Bio_Farm/item.lua | 10 +- .../prototypes/Bio_Farm/recipe.lua | 74 ++- .../Bio_Garden/fluid_fertilizer.lua | 8 +- 81 files changed, 1711 insertions(+), 481 deletions(-) create mode 100644 Bio_Industries_2/graphics/icons/fluid_advanced_fertilizer_recipe.png create mode 100644 Bio_Industries_2/graphics/icons/fluid_fertilizer.png create mode 100644 Bio_Industries_2/graphics/icons/mod_bobangels/liquid-air.png rename Bio_Industries_2/graphics/icons/{entity_old => old}/Arboretum_Icon.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/Arboretum_Icon_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/Bio_Farm_Cabeling.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/Bio_Farm_Icon.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/Bio_Farm_Icon_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/Bio_Farm_Lamp.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/Bio_Farm_Solar.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/Bio_Solar_Boiler_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/Bio_Solar_Boiler_Boiler_Icon.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/Bio_Solar_Boiler_Icon.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/Bio_Solar_Boiler_Panel_Icon.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/Bio_Solar_Farm_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/Bio_Solar_Farm_Icon.png (100%) create mode 100644 Bio_Industries_2/graphics/icons/old/advanced_fertilizer.png create mode 100644 Bio_Industries_2/graphics/icons/old/advanced_fertilizer_64.png rename Bio_Industries_2/graphics/icons/{entity_old => old}/bi_LargeAccumulator.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/bi_LargeAccumulator_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/bi_LargeSubstation_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/bi_LargeSubstation_icon.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/big-wooden-pole.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/big-wooden-pole_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/bio_boiler.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/bio_garden_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/bio_garden_icon.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/bio_greenhouse.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/bio_greenhouse_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/bio_turret_icon.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/bio_turret_icon_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/biocannon_icon.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/biocannon_icon_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/bioreactor.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/bioreactor_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/cokery.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/cokery_64.png (100%) create mode 100644 Bio_Industries_2/graphics/icons/old/cokery_alt.png rename Bio_Industries_2/graphics/icons/{entity_old => old}/curved-rail-concrete.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/curved-rail-wood.png (100%) create mode 100644 Bio_Industries_2/graphics/icons/old/fertilizer_64.png create mode 100644 Bio_Industries_2/graphics/icons/old/fluid_advanced_fertilizer_64.png create mode 100644 Bio_Industries_2/graphics/icons/old/fluid_fertilizer_recipe_64.png rename Bio_Industries_2/graphics/icons/{entity_old => old}/giga_wooden_chest_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/giga_wooden_chest_icon.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/huge-wooden-pole.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/huge-wooden-pole_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/huge_wooden_chest_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/huge_wooden_chest_icon.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/large_wooden_chest_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/large_wooden_chest_icon.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/pipe-to-ground-wood.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/rail-wood.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/solar-mat.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/stone_crusher.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/stone_crusher_64.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/straight-rail-concrete.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/straight-rail-wood.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/wood_pipe.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/wood_pipe_alt.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/wooden-fence.png (100%) rename Bio_Industries_2/graphics/icons/{entity_old => old}/woodrail_64.png (100%) create mode 100644 Bio_Industries_2/graphics/icons/tree-seed-1.png create mode 100644 Bio_Industries_2/graphics/icons/tree-seed-2.png create mode 100644 Bio_Industries_2/graphics/icons/tree-seed-3.png create mode 100644 Bio_Industries_2/graphics/icons/tree-seed-4.png create mode 100644 Bio_Industries_2/libs/error-functions.lua diff --git a/Bio_Industries_2/changelog.txt b/Bio_Industries_2/changelog.txt index 4c58f9f..0270327 100644 --- a/Bio_Industries_2/changelog.txt +++ b/Bio_Industries_2/changelog.txt @@ -1,4 +1,11 @@ --------------------------------------------------------------------------------------------------- +Version: 2.0.13 +Date: 09.09.2025 + Changes: + + - Updated Rail to remove Decorative when placed + - Updated Bob's Compatibility +--------------------------------------------------------------------------------------------------- Version: 2.0.12 Date: 05.09.2025 Changes: diff --git a/Bio_Industries_2/data-final-fixes.lua b/Bio_Industries_2/data-final-fixes.lua index 5b488e0..b909fa8 100644 --- a/Bio_Industries_2/data-final-fixes.lua +++ b/Bio_Industries_2/data-final-fixes.lua @@ -265,9 +265,11 @@ if BI.Settings.BI_Game_Tweaks_Emissions_Multiplier then ["solid-fuel"] = 1.00, ["solid-carbon"] = 1.05, ["carbon"] = 1.05, - ["wood-bricks"] = 1.20, + ["bob-carbon"] = 1.05, + ["wood-bricks"] = 1.10, ["rocket-fuel"] = 1.20, ["bi-seed"] = 1.30, + ["tree-seed"] = 1.30, ["seedling"] = 1.30, ["bi-wooden-pole-big"] = 1.30, ["bi-wooden-pole-huge"] = 1.30, @@ -316,7 +318,7 @@ if mods["Krastorio2"] or mods["Krastorio2-spaced-out"] then -- require more wood/wood pulp. local update = { "wood", "bi-woodpulp", - "bi-seed", "seedling", "water", + "bi-seed", "tree-seed","seedling", "water" } local multiply = function(items) for _, item in pairs(items) do @@ -357,11 +359,11 @@ if not fertilizer.place_as_tile then condition_size = 1, condition = { layers = { water_tile = true } } } - fertilizer.icon = ICONPATH .. "fertilizer_64.png" + fertilizer.icon = ICONPATH .. "fertilizer.png" fertilizer.icon_size = 64 fertilizer.icons = { { - icon = ICONPATH .. "fertilizer_64.png", + icon = ICONPATH .. "fertilizer.png", icon_size = 64, } } @@ -393,6 +395,7 @@ if mods["space-exploration"] then local tweaks = { ["bi-solar-mat"] = 400, ["bi-seed"] = 800, + ["tree-seed"] = 800, ["seedling"] = 400, ["bi-woodpulp"] = 800, ["bi-ash"] = 400, diff --git a/Bio_Industries_2/data-updates.lua b/Bio_Industries_2/data-updates.lua index eb1c822..16a353f 100644 --- a/Bio_Industries_2/data-updates.lua +++ b/Bio_Industries_2/data-updates.lua @@ -1,5 +1,6 @@ local BioInd = require('common')('Bio_Industries_2') + for var, name in pairs({ Bio_Cannon = "BI_Bio_Cannon", BI_Bio_Fuel = "BI_Bio_Fuel", @@ -18,6 +19,7 @@ end BioInd.show("BI.Settings.BI_Easy_Bio_Gardens", BI.Settings.BI_Easy_Bio_Gardens) local ICONPATH = "__Bio_Industries_2__/graphics/icons/" +local ICONPATH = BioInd.modRoot .. "/graphics/icons/" local ICONPATH_E = BioInd.modRoot .. "/graphics/icons/entity/" local ICONPATH_PY = "__Bio_Industries_2__/graphics/icons/mod_py/" @@ -134,8 +136,8 @@ end --- Adds Solar Farm, Solar Plant, Musk Floor, Bio Accumulator and Substation to Tech tree if BI.Settings.BI_Solar_Additions then if data.raw.technology["bob-solar-energy-2"] then - thxbob.lib.tech.add_recipe_unlock("bob-electric-energy-accumulators-3", "bi-bio-accumulator") - thxbob.lib.tech.add_recipe_unlock("electric-energy-distribution-2", "bi-large-substation") + thxbob.lib.tech.add_recipe_unlock("bob-electric-energy-accumulators-2", "bi-bio-accumulator") + thxbob.lib.tech.add_recipe_unlock("electric-energy-distribution-2", "bi-large-substation") thxbob.lib.tech.add_recipe_unlock("bob-solar-energy-2", "bi-bio-solar-farm") thxbob.lib.tech.add_recipe_unlock("bob-solar-energy-2", "bi-solar-boiler-hidden-panel") else @@ -153,33 +155,40 @@ if BI.Settings.BI_Solar_Additions then --- Electric redo if Bob' Electric -- Huge Electric Pole - if data.raw.item["tinned-copper-cable"] then + if data.raw.item["bob-tinned-copper-cable"] then thxbob.lib.recipe.remove_ingredient("bi-wooden-pole-huge", "wood") thxbob.lib.recipe.add_new_ingredient("bi-wooden-pole-huge", { type = "item", - name = "tinned-copper-cable", + name = "bob-tinned-copper-cable", amount = 15 } ) end -- Solar Farm - if data.raw.item["solar-panel-large"] then + if data.raw.item["bob-solar-panel-2"] then thxbob.lib.recipe.remove_ingredient("bi-bio-solar-farm", "solar-panel") thxbob.lib.recipe.add_new_ingredient("bi-bio-solar-farm", { type = "item", - name = "solar-panel-large", + name = "bob-solar-panel-2", amount = 30 } ) end -- Huge Sub Station - if data.raw.item["substation-3"] then + if data.raw.item["bob-substation-3"] then thxbob.lib.recipe.remove_ingredient("bi-large-substation", "substation") thxbob.lib.recipe.add_new_ingredient("bi-large-substation", { type = "item", - name = "substation-3", + name = "bob-substation-3", + amount = 6 + } + ) + thxbob.lib.recipe.remove_ingredient("bi-large-substation", "steel-plate") + thxbob.lib.recipe.add_new_ingredient("bi-large-substation", { + type = "item", + name = "bi-wooden-pole-huge", amount = 6 } ) @@ -206,32 +215,32 @@ if BI.Settings.BI_Solar_Additions then ) end - if data.raw.item["aluminium-plate"] then + if data.raw.item["bob-aluminium-plate"] then thxbob.lib.recipe.remove_ingredient("bi-bio-accumulator", "copper-cable") thxbob.lib.recipe.add_new_ingredient("bi-bio-accumulator", { type = "item", - name = "aluminium-plate", + name = "bob-aluminium-plate", amount = 50 } ) end -- Solar Mat - if data.raw.item["aluminium-plate"] then + if data.raw.item["bob-aluminium-plate"] then thxbob.lib.recipe.remove_ingredient("bi-solar-mat", "steel-plate") thxbob.lib.recipe.add_new_ingredient("bi-solar-mat", { type = "item", - name = "aluminium-plate", + name = "bob-aluminium-plate", amount = 1 } ) end - if data.raw.item["silicon-wafer"] then + if data.raw.item["bob-silicon-wafer"] then thxbob.lib.recipe.remove_ingredient("bi-solar-mat", "copper-cable") thxbob.lib.recipe.add_new_ingredient("bi-solar-mat", { type = "item", - name = "silicon-wafer", + name = "bob-silicon-wafer", amount = 4 } ) @@ -252,6 +261,7 @@ end require("prototypes.Bio_Farm.compatible_recipes") -- Bob and Angels mesh require("prototypes.Bio_Farm.technology2") + -- Replace fertilizer/advanced fertilizer + water with fluid fertilizers in Bio garden recipes! BioInd.show("data-updates.lua -- BI.Settings.BI_Easy_Bio_Gardens", BI.Settings.BI_Easy_Bio_Gardens) if BI.Settings.BI_Easy_Bio_Gardens then @@ -325,22 +335,6 @@ if mods["Natural_Evolution_Buildings"] then end ------------- Support for Bob's Greenhouse -if data.raw["item"]["bob-greenhouse"] then - data.raw["item"]["seedling"].place_result = "seedling" - data.raw["item"]["seedling"].icon = ICONPATH .. "Seedling.png" - data.raw["item"]["seedling"].icon_size = 64 - data.raw["item"]["fertilizer"].icon = ICONPATH .. "fertilizer.png" - data.raw["item"]["fertilizer"].icon_size = 64 - - data.raw["item"]["fertilizer"].place_as_tile = { - result = BioInd.AB_tiles() and "vegetation-green-grass-3" or "grass-3", - condition_size = 1, - condition = { layers = { water_tile = true } } - } -end - - if settings.startup["angels-use-angels-barreling"] and settings.startup["angels-use-angels-barreling"].value then data.raw.technology["bi-tech-fertilizer"].prerequisites = { "bi-tech-bio-farming", @@ -431,11 +425,9 @@ end -- We may need liquid air and nitrogen -- but not if any of the following mods is active! - -local ICONPATH = BioInd.modRoot .. "/graphics/icons/" - -- We only want to create nitrogen if it doesn't exist yet. We then also need to create -- liquid air. +--[[ Removing this for now if not data.raw.fluid["nitrogen"] then data:extend({ { @@ -518,6 +510,225 @@ else BioInd.writeDebug("Removed recipes for \"nitrogen\" and \"liquid air\".") end +]] + + + -- Replace nitrogen (BI) with bob-nitrogen (Bob's) in recipe "bi-nitrogen" +if data.raw.fluid["bob-nitrogen"] then + + thxbob.lib.recipe.remove_result("bi-nitrogen", "nitrogen") + thxbob.lib.recipe.add_result("bi-nitrogen", { + type = "fluid", + name = "bob-nitrogen", + amount = 40 + }) + + thxbob.lib.recipe.replace_ingredient("bi-fertilizer-1", "nitrogen", "bob-nitrogen") + thxbob.lib.recipe.replace_ingredient("bi-fertilizer-2", "nitrogen", "bob-nitrogen") + + BioInd.writeDebug("Update nitrogen compatibility for Bob's") + +end + +-- Replace liquid-air (BI) with bob-liquid-air (Bob's) in recipe "bi-liquid-air" +if data.raw.fluid["bob-liquid-air"] then + + thxbob.lib.recipe.remove_result("bi-liquid-air", "liquid-air") + thxbob.lib.recipe.add_result("bi-liquid-air", { + type = "fluid", + name = "bob-liquid-air", + amount = 100 + }) + + thxbob.lib.recipe.replace_ingredient("bi-nitrogen", "liquid-air", "bob-liquid-air") + thxbob.lib.recipe.replace_ingredient("bi-biomass-2", "liquid-air", "bob-liquid-air") + thxbob.lib.recipe.replace_ingredient("bi-biomass-3", "liquid-air", "bob-liquid-air") + + BioInd.writeDebug("Update liquid-air compatibility for Bob's") + +end + +------------ Support for Bob's Greenhouse +-- Replace bob-fertiliser (Bob's) with fertilizer (BI) in recipe "bob-fertiliser" +if data.raw["item"]["bob-greenhouse"] then + + data.raw["item"]["bob-fertiliser"].icon = ICONPATH .. "fertilizer.png" + data.raw["item"]["bob-fertiliser"].icon_size = 64 + data.raw["recipe"]["bob-fertiliser"].icon = ICONPATH .. "fertilizer.png" + data.raw["recipe"]["bob-fertiliser"].icon_size = 64 + + thxbob.lib.recipe.remove_result("bob-fertiliser", "bob-fertiliser") + thxbob.lib.recipe.add_result("bob-fertiliser", { + type = "item", + name = "fertilizer", + amount = 1 + }) + + + thxbob.lib.recipe.replace_ingredient("bob-advanced-greenhouse-cycle", "bob-fertiliser", "fertilizer") + + data.raw["item"]["bob-fertiliser"].place_as_tile = { + result = BioInd.AB_tiles() and "vegetation-green-grass-3" or "grass-3", + condition_size = 1, + condition = { layers = { water_tile = true } } + } + + + data.raw["item"]["bob-seedling"].place_result = "seedling" + data.raw["item"]["bob-seedling"].icon = ICONPATH .. "Seedling.png" + data.raw["item"]["bob-seedling"].icon_size = 64 + data.raw["recipe"]["bob-seedling"].icon = ICONPATH .. "Seedling.png" + data.raw["recipe"]["bob-seedling"].icon_size = 64 + data.raw["recipe"]["bob-seedling"].main_product = "seedling" + + + thxbob.lib.recipe.replace_ingredient("bob-basic-greenhouse-cycle", "bob-seedling", "seedling") + thxbob.lib.recipe.replace_ingredient("bob-advanced-greenhouse-cycle", "bob-seedling", "seedling") + thxbob.lib.recipe.remove_result("bob-seedling", "bob-seedling") + thxbob.lib.recipe.add_result("bob-seedling", { + type = "item", + name = "seedling", + amount_min = 1, + amount_max = 6 + }) + + + BioInd.writeDebug("Update fertiliser compatibility for Bob's") + +end + + + -- Replace Bob's Resin with BI Resin +if data.raw.item["bob-resin"] then + + --data.raw.item["bob-resin"] = nil -- Remove Bob's resin + thxbob.lib.recipe.remove_result("bob-resin-wood", "bob-resin") + thxbob.lib.recipe.add_result("bob-resin-wood", { + type = "item", + name = "resin", + amount = 1 + }) + + BioInd.writeDebug("Replace Bob's Resin with BI Resin in Recipe 'bob-resin-wood'") + +end + +if data.raw.recipe["bob-resin-oil"] then + + thxbob.lib.recipe.remove_result("bob-resin-oil", "bob-resin") + thxbob.lib.recipe.add_result("bob-resin-oil", { + type = "item", + name = "resin", + amount = 2 + }) + + BioInd.writeDebug("Replace Bob's Resin with BI Resin in Recipe 'bob-resin-oil'") + +end + +if data.raw.recipe["bob-rubber"] then + + thxbob.lib.recipe.replace_ingredient("bob-rubber", "bob-resin", "resin") + + BioInd.writeDebug("Replace Bob's Resin with BI Resin in Recipe 'bob-rubber'") + +end + +--- Updaet seeds to work with Space Age if present. + +if data.raw.item["tree-seed"] then + + --data.raw.item["bi-seed"] = nil -- We can remove BI's seed, since it won't be used. + data.raw.item["bi-seed"].plant_result = "tree-plant" + data.raw.item["bi-seed"].place_result = "tree-plant" + data.raw.item["tree-seed"].stack_size = 200 -- Update tree seed stack size + + thxbob.lib.recipe.remove_result("bi-seed-1", "bi-seed") + thxbob.lib.recipe.add_result("bi-seed-1", { + type = "item", + name = "tree-seed", + amount_min = 30, + amount_max = 50 + }) + thxbob.lib.recipe.remove_result("bi-seed-2", "bi-seed") + thxbob.lib.recipe.add_result("bi-seed-2", { + type = "item", + name = "tree-seed", + amount_min = 40, + amount_max = 60 + }) + thxbob.lib.recipe.remove_result("bi-seed-3", "bi-seed") + thxbob.lib.recipe.add_result("bi-seed-3", { + type = "item", + name = "tree-seed", + amount_min = 50, + amount_max = 70 + }) + thxbob.lib.recipe.remove_result("bi-seed-4", "bi-seed") + thxbob.lib.recipe.add_result("bi-seed-4", { + type = "item", + name = "tree-seed", + amount_min = 60, + amount_max = 100 + }) + + thxbob.lib.recipe.replace_ingredient("bi-seed-1", "bi-seed", "tree-seed") + thxbob.lib.recipe.replace_ingredient("bi-seed-2", "bi-seed", "tree-seed") + thxbob.lib.recipe.replace_ingredient("bi-seed-3", "bi-seed", "tree-seed") + thxbob.lib.recipe.replace_ingredient("bi-seed-4", "bi-seed", "tree-seed") + thxbob.lib.recipe.replace_ingredient("bi-seedling-1", "bi-seed", "tree-seed") + thxbob.lib.recipe.replace_ingredient("bi-seedling-2", "bi-seed", "tree-seed") + thxbob.lib.recipe.replace_ingredient("bi-seedling-3", "bi-seed", "tree-seed") + thxbob.lib.recipe.replace_ingredient("bi-seedling-4", "bi-seed", "tree-seed") + thxbob.lib.recipe.replace_ingredient("bi-seed-bomb-basic", "bi-seed", "tree-seed") + thxbob.lib.recipe.replace_ingredient("bi-seed-bomb-standard", "bi-seed", "tree-seed") + thxbob.lib.recipe.replace_ingredient("bi-seed-bomb-advanced", "bi-seed", "tree-seed") + + if data.raw.recipe["bi-seed-bomb-basic-recycling"] then + + thxbob.lib.recipe.remove_result("bi-seed-bomb-basic-recycling", "bi-seed") + thxbob.lib.recipe.add_result("bi-seed-bomb-basic-recycling", { + type = "item", + name = "tree-seed", + amount = 100, + }) + + end + + if data.raw.recipe["bi-seed-bomb-standard-recycling"] then + + thxbob.lib.recipe.remove_result("bi-seed-bomb-standard-recycling", "bi-seed") + thxbob.lib.recipe.add_result("bi-seed-bomb-standard-recycling", { + type = "item", + name = "tree-seed", + amount = 100, + }) + + end + + if data.raw.recipe["bi-seed-bomb-advanced-recycling"] then + + thxbob.lib.recipe.remove_result("bi-seed-bomb-advanced-recycling", "bi-seed") + thxbob.lib.recipe.add_result("bi-seed-bomb-advanced-recycling", { + type = "item", + name = "tree-seed", + amount = 100, + }) + + end + + if data.raw.item["tree-plant"] then + bobmods.lib.recipe.update_recycling_recipe({ + "bi-seed-bomb-basic", + "bi-seed-bomb-standard", + "bi-seed-bomb-advanced", + }) + end + + BioInd.writeDebug("Replace BI's Seed with Space Age Tree-seed") + +end + -- Moved here from data-final-fixes.lua for 0.18.34/1.1.4! (Fixes https://mods.factorio.com/mod/Bio_Industries/discussion/5ff570bd916993002371332a) ---- Game Tweaks ---- Recipes if BI.Settings.BI_Game_Tweaks_Recipe then diff --git a/Bio_Industries_2/data.lua b/Bio_Industries_2/data.lua index d785bb6..3762d4e 100644 --- a/Bio_Industries_2/data.lua +++ b/Bio_Industries_2/data.lua @@ -28,13 +28,13 @@ end --- Help Files +require("libs.functions") -- From Bob's Libary +require("libs.error-functions") -- From Bob's Libary require("libs.item-functions") -- From Bob's Libary require("libs.recipe-functions") -- From Bob's Libary require("libs.technology-functions") -- From Bob's Libary -require("libs.functions") -- From Bob's Libary require("libs.category-functions") -- From Bob's Libary require("libs.bi_functions") -- Functions - require("prototypes.category") diff --git a/Bio_Industries_2/graphics/icons/fluid_advanced_fertilizer_recipe.png b/Bio_Industries_2/graphics/icons/fluid_advanced_fertilizer_recipe.png new file mode 100644 index 0000000000000000000000000000000000000000..a2c61c58bdf5bfe6cfd9d861342aa9cfc78a0bd2 GIT binary patch literal 2552 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 literal 0 HcmV?d00001 diff --git a/Bio_Industries_2/graphics/icons/mod_bobangels/liquid-air.png b/Bio_Industries_2/graphics/icons/mod_bobangels/liquid-air.png new file mode 100644 index 0000000000000000000000000000000000000000..eb88c9a7057f9cf0afebe56fcec6934b6bf5e7ca GIT binary patch literal 1328 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 Rh3y{!Movl@Tq|K3{6Ee7(Lw+K literal 0 HcmV?d00001 diff --git a/Bio_Industries_2/graphics/icons/old/advanced_fertilizer_64.png b/Bio_Industries_2/graphics/icons/old/advanced_fertilizer_64.png new file mode 100644 index 0000000000000000000000000000000000000000..d57b6d9e2dca52f614e4fdc0691f5f8c923b8421 GIT binary patch literal 6586 zcmV;r8AaxaP)I5a~rwqzg!|QUnBPqF_MXgEtX_V zVq(l_%*^cBIlDW%^V|F0$M=bXrpWB>IXmAu_k8F3m-pWNy?cN6-uK=&ZrndV|NQ*o z&!VXxn43w>I$|n4>!yLkjIueCColN_qWka7Bxm(6TRa=f<>tUqaW4O+-+$L%IHQT( zf5Ut4lT4AE@qw(&^hx^kZOy)Ar%#k$IBAju-J3M@%=rJ)+FMA^Y-h^5DbK^X^;Y<{ z%pG48x**$8nSlW7#k21+McK0prcO|@mYvbOOit`ay7wOpB=*c3}I)7)Y=LyGPG_M?gFf zD(9iP0KxiFDD%`nOQ1g5f()=T#1O4P`l$8QMmb%NHD3%bb#b^7ur?#X`7di(v8Uv6 zT}pE%JJK*_{BHvAcV_ZioRx4V#}O|MmEljv8@N2{OvPZjEo|lIz)w>Gy-{ZPs@RQN z$+zX6_^#R?-#3KfhxSBzHVx1BWa0U~96akv<3K*$9*rlp0eD>LgTV|t>iCarFcnUUIG1FJ@9RTE05EyJ zXA^e`q0&#AqY0$aSDty3JU?3d%I_D4EAV`8Hl8+y<8g&IK1o}S8gDJE(pmVrg)rB- z&n#uwwZEDy65B5|;{%y71;B8jSQYCaZ@D~Ld^NeE&$`lI891{9rud%*>PA)cYIQt* z8mJ#}{Z3OV_Czfoaqr7rxmq~=-*bT&POF#!QC7O4#M~K!Q7<(xN9SxRQutl{;jxP zn>Z=}hm$>Vqb`Y*+KhXx8Th<89XIPY;QH1??pkN_L-6I!TzuPIf*1XD9FQF$<~WlV zENbJYW3^-*n>hDyYa@A5w;C_{D(GGf2kTO0tjKlbrcO{9GY~WuOwC}8rdusWox2LY zE^!kLLMY$Vh2dDL7f$B{qC3_eO@8`l^4G_%FiW%s8l%xqkM0HFbe1136@}nJUI0#} zd7{=`4F_WF_;ZcEx~L+ut#wz&Rw7CU&h5sHcyVm&D}X+2isXI1=q(umcCMER2S9Jp z^vbdHgz?nqpP1=Y(*PS+sNrFOGai?^aWHlT=%B$<4TshmVRw)&zTV=GCp5?($Sv56 z-OqQyHoE^hXiV5U0{-y8ca>gvLLBq7GXvl3E#x5Vi?K(YrzSerTH}k39D$-_ZQK=! zSYHR=Xp$WVK!4%P3uDR!=F(!Hu!bvXR+uYPyDH;wj2TX>v*fa4l@9vjEU-6NpM&yv zn39i6-O(RoihC4BZ)Q8-YNj2oQ1tjXc^NJf(Ot=~#b=uwIGM6%g@Ei2H6RdU@QhsT zX?Gz8%OlVeXOG8i$)aao^cKJ5qTQKjSg9+p0Ey{a#u$KEJsbd1ezT@}V7M^{ws2d`uY%@Zc+1EUWi12l(BCBAEGXU7{F0z6Xze4FZ$w%w0d7g2f6#I&l zW|qa|ivky%-?)sxvc#QSM}F;kmOY#(O}CK~J4M5tI;P6cqg0ngg0!WJM+JZ>emr3* z+E;3euC@AWjR^>ElL6|pKi&dWURtnI;4}YsVOl<>A3cc~1uPpZvQrqLe2M)MG*f;c z98lE|M=+@&o)EgkSPFAFmLLV|E~K=3KHOF23v+;AAN6vn- zxeN|Rza+z+2$K=dY^Bi2IAUy+U&;xWwcAD(Cj_2NkcG6^(=nfYIk73r8M+C^sv?DA zj3nWvG#4%;!8#HY4a{E|gz<#MPQ{PF1E3`0{BlO2F6#>8!AWIps zXJZZkvHv9(B`K^kk{h8=q`@MrGna)k0l})h;RD`JGhXSeI4TfA;%uONVrQT(catLo z;s7Zm^y@wX>A+fJKHIf!DkI+SUh}fQqx7DOp$zAMc~i&D9ZUTuvw|aesVml-$cz}o zDot_pMw;?LH&Xn4eby2^wcxr;3DI^+C~|x=7{69_1?q}szBJGPt~SbWwNu41asyMT znPXQ6D1128hnat=V=z)_riTxL6-P;C(%dIUGud4crU>vdK+~4BSQ}^t7h4s$*(f2* zRtZ@SiYWaJinD05H`EaOqs@`*r41KS+|6DMrP+Qsx+fjW73aZ5M(mq0jQz~~Ws$SY z9vQENz%_acQBG$3CZF|lP(v>jN+%C);&S3Z7IxG}BRSRqK5p7@A}~Bi0+uTwiYz4E zUJ?0ZB?Tl!LsIA{xRybH#n>w$)LD%y?L=0!YK1;(idN$|wJYqyMV*(;e;%ty@OxHw z$C^4I(O3;xmalSvGbJ5u{@SA|-w|}S*z($jS?o4zw#iObqkb@HJXAEx_ZMZwC z!+E(X30aJt8oZn};peV{5PuVF+Tezc`WSjQW7IaCRK*zp|2ifB%%3_znVEmJdkSI= zrj;wf-M1Sk*4j74$~+c zSeAet8ewRVUyZGnA?VCVKy7X)+N)#V+Sc*?nXpxuJ9fE%miUZ~41gW}C5Y0M!X~Si z7O>Gmh7({SSw)PQ>?;852scG;isxGg+t-$g5+6TQ7zd$LHV~ca(b%t>h$Chx7;vFy zJaW;d7>ffY8?aw99*y#$DA8Dn^0?LLe*>_GTG#Pp$WnIJ!!hxHE7{o>oD?Oob7e6i zbtRE$`H}+yw8XJ~hyYnuHXML(H%%PfoBmb+j%`gtmti!rWmcnGIT2@li!q>^g)0#? zxRJUICronCPcj%^jdKB|Xdy7_<=3EjNhmTk-BFesgwCb}&MU$;^TVt;0A`D36pYPU zpxo>q{WZ1F=9|L-NV9ku1y}-}&M1rr%$aiv4N{_{hBgCk(T3!L1yh zcvazcMhmXTY)7AZJ}!II;O^#jTua)9i#`?j$h!zVnn~!jS%)lb53GxHLQ=FdD)Lt2 z$nG?FYDjPZ#HUSMG8XzzVvR8ZZ1zs)0BkT7FHC7Myh}!ztrpeCk_|>jB%aPq!FHG)ZCoGJI@Pfvf%vxVpLy7d*<)skQ-q z4w>k4O5y+rCBffJSPT3xCjLKZ(l`m$V2*7Fn!Hju0P%*>9Dq`XCA_n0SCtU}M7wIB zuQO$Ik|N)2FN;IFZ!`usY{89`CLA*?#!i*Z*ruF^vzB#ukh}+<+BRU1S}AsGkX6{! z;ZvVR++5p?OOBN|yQ~;zdWKO63<%5c_}f`_3zoK+X_F{#a;7Cbij{{%q)`+b6FJj7{=g`Rx&P!SK~%lGj4{q;+9V>>fOb?!k14G+{85I3c18JyeB-fm;x*C&NM5NHKr2jXdwjPh$b!oDc$# zZoLGdl&y^#_HxMV?US)zB?aB8*%+`W#~%s~;+jtjE*sV1md6g<4d}p4mlk|e)Q2b4 z{rE##4*^z#dgWpwzY59|DsgwsE__+mjn6hT<7(Pgob=AZKzcqtzkUdVXBy#WCg3M) z*;!ZL2>|s4)9qM8WzG=jN=r*dvLG^MB8f?R@745j?*@lOS`|v1pKfbR&&fVa4^llv1 zs-}Cb7&NQHX~Sw9FR@sxeq5YOVFd6gmQ%htdmYa3`wn05w@$8 zp+Thtr;N7ZanTXn59`7aom$+mX~v7*i}>;21>6ts!fm%!>`*PoIgciMQP_<;8ErV{ zSd4zVOnlVZfP0@E;{aSa*9>)#L{KOQ)bXS>hf;re|zYgk9$d+|k)0DvpeThV8jjE`Cx@$I9l zyq~+*dXN=qE7~l5mz>~zwz}e`B+faYE1-hHpp+mSk~k=Q$ZLTXKP{03WDo$(RHk;f zC2{3X_2kf?dWU9aHzM^N(WSu^nu6?cGkaigP9+E zApI_>@aJryvDG)5Tfs(iLy;A@Db0f;MFh6SC***vr3&z|R>bDi6&!$%`^!axVzM&I z9-)$C1#(H0?d9R#hECjz=)`A!J8;yf8hu1~Uu@WqKkoVn-;^Fk2N7R`3e^E*`t`~s z=+mL-;njo-)|I$H>G5DpH9B14aO>)MJb(I7)X$0DVk(OTiIJxGG`HUjfVTMbO{|eL z%jFyZVMfSgwWc8NF1A-d)e6CqcaYLMR1Zs6Q;eO^G z>?9(rP%OYc%_@B6Mqx0c2T$q;aD90*4x4Pn=M*A8b)-y?BE&WNzGPj4OKw%Tnc0N% zYfI7Uoq*fdF5>CqTcUoB_Y}iHTaX;-EO>`)a9X5ERZ#keM1O{v3~fXz4@Rg53Ldx%H( z&Wid-h_FQjO@?5DbjGoF3Wqi_VmAca;*K1EL~{o?lK!yQi=i5gBP#m0$3b}9$nB-DI(~NeVd?YX4h>|5a#PVgNU?a*Db5XQpGr2%H z_NZ5&ouWjuaxS(j=b%q5A4jb6(C57gJIrEnw7CN>o;||78-2X}eeG#*w^Koxn>rsK zP14{y0iZnjeJ$3IE$4zv4nm%-C)SXOt*p%GePA9Lgz0 zujzVx1K{gr5GKq+hiXr}p zL&(Aate0LzVK@d4?p(#!56<(pj~*z3zlRnw+|&@QFC`?xTko6}n@P{=ofPw`bKRY>ENq1VDdL`%nGuSPyf2mo)1Agq-Pr~Dxj>Cz$CD76wNlBjsP`x(A} zd{Z#LboW6L~fYJYo$2aQB@7m^)?4JYiUIQCfr@{)Id&CYfj=f|3pvDT1{m zI0*Yf4bbAR%R%s`h>#LzJHiUi7H&beWjvboW05JdhI7JN$uM+SZNm9wWeAgufUCG4 zA|)e{ARPs#1-`JE>x7kbZH>G?PPXnNv;T^G{|>HQ>_l#g8`iEeK++0rbgkA$49$Mb zSX#hRnOPs%%Flz>&<3Qf{9KeeM`L$DCDjH7JR-0HiCIJ`Rf}xLrqV@?XNG}ZIyks1 zdjtqaVzW`N6^2Z?0HmsfAx0qt9pG-9dp6RruS zTgt+npYWW62tx~0yTu_$O9dWujSV1$s>XUxHB^u#xDX-cr1;>-fl^#L-Gb|vcH!2Q zy}149eo9??MWC?XH>qwoeWU^1?NkA7&qY;!I5LyGup!!tD;*bXjG}l;oGkOeCxtFN z{IZ#6%Cns-*0-OUAPEZ6mJqtZ3rg+9e~t38Bx|O;H-4k7{Ct!ID&mc$;7$2}m+E5583e=_uCs_UaX!71<*Win0)dH#gBn8p^tm!WCrP0u z$ceTIv?C^S&17pUO1h+j4Qt<#DMP-7gJ@*#uz$e`aybm7)-z>#!YoGEk1`C2brsP)DmDR{lX7dIRIaC^HyS5_!@ z==Z1P?jpt683cCbfG^Tg+l=(WC^R!d4l|JC%X93xBQa)3wOq_WQJ*(G{+F12m=FL9 zX|d=@rb{L8U+1nBU(#gdY`p94TqsQmcx z<02iFEJSC(7Q`7W!3I;=5sI_5fF@sUthyR16emNemdKWY=mv z{>|KN+X{8A)M)Rf4Ea4;YS{&!#98L2j^? zB+`(+^#uzgN*_)+{B!FAGlc-WKYm;kBfwo0>)ZV{laI-X6lBX|B@TWxGf8NpQkgB9 zcK8>d**k+ToNTsn=23$^8%L32w1ZXeA{9es&!Q3|<}$}6SZ6BDPpJ(5-+`6v?0++p zn)Sk1a^|;7WyJpS{`m3Xzk~$+g&>$p&3YVX=8F9x)qGK;#V3=??!XEZI0Pd|R}ZdA zvQ!X>lSsfvT@evR=GfxC9vv$S$sZjExWycZ1S4tW)67)7qw);QM4EAyYZQ~a1-=Y* zT+F3sJy)1B_285V<2RBH;X+-8MD3RVFhfX$Ge3AQhaHdcP+fw}_CcugqN2polPhe! zc=q4SrNo{QNKZ^8XMM*A(^6LKFZBF>vVk!ESWnNk`sbs`Ya=#UFXvps+=E30wywyc z#;;MHg*s;9EVOy4iH^nbv8d0Rc7ED~@hPtPx#1ZP1_K>z@;j|==^1pojPa7jc#RCwC$Tgi_k=~aIbk(rVER#jPtvD4*UaSkT`MXhQxuZB_tyxHcNxW87#0t!eWq&@X+poo~37|yQiyb z&DwHbW9RqY7m-!vfdf^otc!CdJ1a9XBEGl%-tWElrAC){R4SEUD`eBR`0s$IczAUD zrlx5@CX*hfO!K?8?S7@x>%JBQq*dnT{zW5t&vo5jZ?;>v@jY$1w)6up@E&@;ujx9G z?|Is1ZsPmo_x9~@YF8PRE^u%JZ_{z=etA7tUQnJn<(02Fh zq~X8u*e2bG{h1Mqk>j`&Km%Uj|1Jciq-n}$qBK4D{Y)wol!}GGFm%oHyuh|B&32r? z%;fY~%%D!A;k!^!ab`x-HJ$qHrcbzOp^*QL4?q6oTeysS83pJUJTFz5DgDs*{S-{1 z@e_*|H&90NX)qk()tj8q@Ab&CZE_u3-a`iJ4+iA84$gITc!n1EzRrs5_4|4(ea6v&SXfB$7nDb>$c-+M$GulQX%(8SK$FhZNBoBM!`ZL_9lW0%hP9H50n-< ztu`g#0jvxPzeBD^w(H`1z9@@5142U?I>qo^xH-P!Q6iq84?g&SbSP=*+A76y?A}k` zpus0e~b1 z`JT1fyeLW&vu%spV=4;J$X^Lm%!?2)EEs=@rMI?s<@0W*ODQu!t&lLfSAAY%mtu!t^z z=ZWxaA#qg+7X_01JwrE;yL8Isa@1@zXoy%Z!5 zl=C1XjYcDC93N9Amlt5=16qVU;q?>nGLHPCdY$sf3d4Snrp^Nxz>ba^R45dbWnppT zase`SZB~L`h(qRc&9f6aY{}<3$RlH@U%*8B?LC_3^~&2;m2TZX^#pN5Aj=tgBf$ETrN=- zsgKt@K)&DE+7f|vLqXB*4w&R(0MAKK5}s0;nq5YiN$B*I&F8y^u>)8RDl2{EX?g^!_GO+Lj5WgMN12ZU$h9FW$N5?e6u}n6Da@moTI$x`i14VIh6#Or4 zZsU9W-5{(sr>6i0B5>g#ME>j58a>|Km4d}WY@4v=UTaK4fY*7Js?p)Wf$)IE)fMWZ zT;_Cn3kv-FtDmQ98|w&ggF2lKtv|nkBFUzwo13BV=T*w2NUBFaEQ+S>0b00-A^7@x z2Td|&uVcX;?VU6bn|+!un6!7?qru3TxGv)bTl3yKcWFPY8d-pDw+mL-rXB!~izcou z>ic!NfA7BpKm0Q!il43vGBmR3OTYXDWSh~X-!MG|;D#A99TTy`CdD#9 z^nRaaD~r^J;A^#_D4{zTOUw!;;Qs`8eBk;MU=aK2`UK#lbg)l>)pZroVtNhip)tb3 zvR!I|O0TZ1UD^XKRt#w|vS6tp+%(py({X1&)H*d!>awW&n+-|>93R(vR7jh! ze%Qp|<_Yq8Hj_T3e<5q+4>-3ovt#1J9^>L(M}5Tsm_OJKSCuw>Vf7mQ`0cmpa!K$4 z3g87s9Uv}lj#`J5O{OU~Tb0i_U2zwP5uUq$M%*Azj|=!UdV5NNICk^q^R&0OjdD3I zS%598!Mkohe|y3tec>BLREqgYy9_j(x*pHA9x}*Xw1cF@XnXudj(%|9Ik&q$r2x(Y?v;pH4LhDFB^kl%A*rD>{@ z#0pIzt>&PtsIoklg18Zg>o9$uz6a>~gcA2GmooV(wK`ooYIbQE)Ris7Ih+MgLI~9n zQspeCydvmuCYPmFqd`?zm@VIEG|7f175sVTsBxtVn~P1z7?fkwSUDzSTe3M06~yK&=s82^TVUE}yfFr>D;B%Nbc)QccO zuYB$fEv&2xz%dcpc;Pwe4sAbuN(lfeX9WgUesVjEuU7+8OrefQrLzVq%-U4bV7uEU zvIgW1S^%y&D$iBvYl~_67>qDR4y==b@M~fJUKKHVh!H>g={xlDoja1!*nQg&Sh_}@ z8kq3-td64S{(s+>^SJxN0&BXW#9DYAZm{xsbMsYXligry9)Qq4C=|*c>d6cZ0bc9R z-+=-a>0cim(D&~?q?cZKT?7fjRyViF*m6;63SVOinB-v%rP5=Ws!rM)$|` z!Gn*KaDd^NrUh4Wk`033EEkgZ-27lAac78QU7D<6bCv&QHmHX<#9?(=CUl`R z2)8`e!o~NoxHQW0rNs)B(i$aWy0ogKgBK{?z(dhf!V*a5=Q=9L6a?kY4?h`OOt||? zw_j3e&%xdkX~Pv z0+6aqBegx-w6& z#prQ(0)J<5d71rQyn%)GT%GK=EnZNqR=HJrbqa6+fEJWc%ogdl}q{M6`7QRrA) zqe`_RoIo%Hw0R6(!0obAJPDqODlXO#8EXO4-lCa?wJpldT_dlvPyVP2*BFQ}jL<7f zi{h?&h+YkV7IXjF@**uPEl6z3^v6?eFjm_2^)km$X!g-oJZHjonA6-*pIY(!zX2Ejl=@ zAvpbg_}=?MU~a$kA}yh&x1c~@DmM$;dR zR4SF({n-4szw>whNNcZtmE6FfjoYuIGOSatRVQcMk$OEEZmMy)YL79M-QC`y{oOq( zmP&B-d0~4z8{}3P_YDK-9;xu)dLpVRJTE5LBUR=zLV^n^0I{9Om*?mZvDx_KKDDh8 z4V-|kt-k;oo1mwk+@;N}9c3_BN2^UrX_xqBF&mf(h6gv!l zJW()2WPz0DB z8L_zBlY0WeRe6A8Behx1nMSE9kw-&U3L#!>#M+p#F`tiISth=kYL!I>%jVf$!<^zQKF%qLgmX z+}!-t5TSm11Y$D)>JO>c8PTvkq(N^;qrr&U-L43qOeLvWsfcCuu)2$^y|ukfy?$RB zoO;+Z;GW-K{?+$n_sJxE^1eYRhB*RLV&)h8-P^Zrsr~?65f#<|e4el}kIwQ_PiQTG zE}fyZwG|5YNQF3|P@LnR8=VT}jfoYQB6IgA2s1)dNNEuX3NeM}k3an9f0BkNT}24& z@9*!d&Xy0hcJ`_P@_U@eWLzf0T3y6z25!8%x-3mk$5T0*!OZ0H7cp#zTdO^Pe%J?K zAvwmCx2R?(?-gQYFjcU($xUq7@O z_XK$Y#8y;fP5sL$jdQ#7_Re*3)Mko!=;B-vN+}$&K+YU_q)6^A$?>>x=}PcYs^gs< zN5?00j79(6kN$xil*4TlJLz;vb##o_srw3;DR1Q>h|A?TJV5rDM;k2zC5#^KHW5K( zsG`d@Syl*#k{&7L8C8Q9R=}rE9!Cj{>~I$dS8w@3UYZrW5n8s;ll%}u(qIs#KVf`^ zrYP^E;iFicFTBAK&|~h9N70i3og_U)6P8l)P!&}KtYp)RvVUv`i8)wcVq zQUDP650T>joO8Sp{w{!BllS`PvT0$3IslDqp|U57;c%nq7Y!uhTzA=qS`IWJ2+=&E7J90 zuFg9_)MjRqy*`Zkk;T|URu*fN%VcSFu}al4+&q_~DipH5aze3mp4#oUcm&g6%W=+m z87sL~TNF7?1FKlzLA3Alay(F6MO>#tKHlapi1%S+NNiYC$#25_mZCPpd2mMc>L78XPbsFX|8 zM_fML+NPD|6)KmD=f4X}?(Xi(>xYj%m2LDqQ*5_8;rxIzOPe<9$21sjQXgzGTP%`; zl3Oyy+1UgrbQwzM^}9%qnX6O4UcLSuyu6i6#$PLxH~zMZ`u^sPHJX{5lMN4NOEvkq zOLboQdc4V+c>=%Jd9=>8f}?&V!eehEmM435BtMnmX%V;4&dvvT2dXt1OQyN9u5d&L z_!*BUD-3pH<^{*cvGb-ve&hPNIA?KBIz2l4LVG1)a!NGC%`nf2QG2Azejx>V;tend4J(q1#kx7 z(BrIdWyR2E!BA~q;b{*yEl!S`)NJ#VXQ+02BglD!1iNz{Y;pJSP^v#(KYItK(Ba6U zLwp{CYcDM=3Z`uD>`H@VvOhpq6XSFyEedj6`%>#Ro`vwKL}DeI&%bFowx)#}sAPNv zf%%oIHnvzy2A>Jq+N;yaNkhKJLU4MFXz!D!+x(lr$t0P7R>O)o?K-JFha7UePx#1ZP1_K>z@;j|==^1pojX=}AOERCwC$n|Y93=~>=?-*UFQcelFLT1LAiS+Zvn zp4FO(%`o;b_6)W$1@;iL#3Ui95E2qd5rL?Kq}I~i>h62{-g~xh$sgx-%Q!$Jc}U?Z&L1sRsddizo_BlR=Y5ah8}$0n zhrZ)2dk?9_Snf!{M=7{3zgE+QGMN+cx&0pZM-y-?R6c`z9x+2*Zdp zO_`lN{po-GL%;li+1c6dmE2GMT{zSa{J^2$Yu@FrG|c|}nJjvZU~Zriryb|L)9Pk!=|BZuE|)4xkIf1Q*$OUpgtM5BWti;F!L z7J4i$tww)mLg22u4z+_I*yak`FnE&$;n)p_cD?zVuHW+Qjn3HK@r|2Rz1cuXNs*;w zX^Jfi^1Q@ahYmud4j2py78X`GeP)F;HH2YE9BVdAHn?Wn6f4W!(@z{Z{!33CJuy2o zbN2IB8UnA02OK_p(@w3+8}7dQwrgv(`WqT`wLcEU?m+7}%MCh;85?iVYy=d8Wj0Jr zQft-GL5L87AdHD>O@x55FqFn3q#zsS$S^^LG4l%qC~?jb$8D@J4EyDy4}ams z|N78FUo=At# zKmMnUdi2e^_G~4NL;9kS?`HgobLCr_L{a^E{||86D4KMccQYQtok@u?P3 zED3^;Aczr4ArRHgg+vO0wVvmnI?mY_PB2`a#}paO$t~RQEqBozOUScTAjaAN=RJYe z7-O)`bK(37UwU)~DKtfCkiruNj)SkCWY?}Oq$Xr}rT^;x{MA4F*3W$Avolu>zW1}DkdAG zr2SQDtrl_IU^wXW^dpaP;_?KZ;XlQEf|q77@Eb$9{S>2e*DLO?bua&z<>Uw zAN`Uu=GI-iHn4Z!7Mjf#VHi;qIlXR=^Jl9#+dY^Dmgg>DtS5;a?Ybe-)ghb{406fhAVeumJqcJ!6}go}jV2qnUBmdMY33LD zD5*gRyz_V<4h-8iN9^7;#rUQzs32jvo6i5yrysrNr+@l?Jb5_)sQ;U2OwO26zwh*^ zrC{dRX->?X;?$}6D)t1#v821yrN5doKG8r*kMkK&^7KPr;^-g!G3C-Lh;kM3K5n=~ zY?o-)3`yjWcm$q63%my@JRoSrhI(iitEFgLP?VBkT5|sM9H&pdg2{7gopF>>NF~5~ z3ga=x5-CHdJwa5X-iYgy8^_*taUuKki!aVDT`>Sp9X)YIc=5>%lao=NnNB(^Y6}Z1 z`o-tZvbvhGZTloslQq(Qk3m*aZ$vm(Fj!sYi9ddfyt_;wEmC;2@(2M^is}WG2VkKW zVo*fdAq6-uD4irLB!gTqzal7&rz|bPTQr9L#ft<7_X33zV4We>L>-p9(q0!xd_ zoH%}(^UohA@FjUaMY@byXi35f1SLSo%F0CvOM`%gUVxX9sa8Rx9a@5Qke8C>fkXg- zg3Jiwz*AU3KNVy~GP&pVw5GQpgur=+vz|~xrzJVCcZ{hm*U*`q!q|c{r!PMKk3R4- zZ#i@3OnTWK@U_>ubLa9_r!lten$7Pv#O#(HU!yuXcI#&!422KZnlyNbecg zh+ZnmN=QpdKbI^GG%G_%FH`jM04Y4p*r1hMXTVYlj1ws7u}+|sC)SQuVo4%Tr)H6O zE-oxnd3jI%7@t?w!PW2!vtg$rl*pkd@$_ zqmvlYLSn3>7I<2TWuj?mC7xR3kpc=M85W9Rp-2l!VINI)M-Z?*)aG^fOOdIEJ}EYelF%QhJnx(h5o|80G@!JViQ02uNBT0H!vMGreho ziOC7tV=a`d?lCzz@efwJ>4#68m>pbkFEBTE?%dR-Nwii7rRjEu6ony*6%L6G10Vyz zC>|ve&!CVf>4~&w(A8)y$Vx?NDp0%!>jch&6jeARkz>5!Ft(z|D?>?X1@*Y9B$*Ku zr67p}nGpy9gT?b~-hK^le(NFj?%V3ZP)h)7a-{TxQAwPru{Yg(@SlF_Q=j|EE7k*~ zbgRyLya1&nE4`fMg_ghQgxxuRb@^qkHa&_pfr|Y0li$(OBKTmhD8-FN_y(C zB@P{0d+L!z3r7?{EAccFXvU5xsGi-=B~}Q80_z2V5@;#ev2!zbzwHM0ylxX(N$H)V zEDE~46&4oHGZ-x4eV=A0e*aJW#9u!1WqE*g&Pi1@E+`4k;hn^LXm1#&GtuJw+(n%C zl-8k@rRD#nx0R&BA7Xg%^KC&)^{%0My51jcx3jXH0+@2%{={s5hcHcD%} z_bgrPbL8XQ#$`b`uogU_%q8zb9;qf?{$=WkO>53Iv2g4k+ zst8hA3VNxeFx9{Bzu^FPzvu0YPmL2sRqJg^%lY%mJoWS|D^Gl7=3O8E%};+}?foBl zqcp%L@T34lW!Sz@zXs0)C)iQ@&9${@UMv?6iT-!WL2uxuIY_!f>41|gkg;L@cJ7Mu>bnk z2lsL9 z&DXMZ=T?F+7|~$x*3<82yz4!wbGdv+4nVx$zK(&@3*V@k{XLYEhwpX1D#i+Jxz5-p-A-UFO{ zZ2^b~DsiXsfOe-wRvKLH2!a8DDwuuw3{O8fORLqO(Wo)Kd5o#aHj~rSOl{tTe~ZVI zCBs3=>T-|%Y9CWtR+m?C)}n%dxE9kIZ_{kIXto=s>u4oA<2?C9?j>Ux@bLUs7C7RyyITjX{dG6R8 z-b)rP4yr!?*sBDAVsb-=-Fv3lvb94JN5u6SjaCDtBtn9c8mTlwsH)UCM_HESc|n>M z4Eian{fyOK%F@y*{eDJ&kRheubq6-Hd;c`1H1xX}ot7rf=kEQ$2X5Z+8^7`RE3cU> ze&bCyzV*(#-u!2AJ;oYKIvCPvCDf9D?s6Zb#1s}cqIb@@^*D95ihCVs8jXlXE1}g) zXw+kLs0agHiKbFwtz&6vm0oW^e>KBeJ8EF zyHWD=q*=*eSg>%Ri&7G$6gp5yQSo{q1X2l1;CcgW0O*i9we(5OzH_`Q6l_E-%|?ZB~i0Z z7;3WIpo0>v6=sQ(|fg6NGWm7Rfh=!y!S|3QjY~v zK~$?Ty=9usTPBE;5K~%uy&?V8lr$|U3IhU^9D$o6hT-eK_@NFf)S8JiYS21 zQ-Wq&Qrl3cGuEJ13jx8@#!gi|yvJBaI?O2wgYzEmDkVrNK`?Ur3TUy;|EZ3S7yi=U z0WCETKKJ{)`@pv%5jY&)d%O_D?P&)6m2dku_uba~`Okc5_3N4rUw7SgJAzOjlu{r> z)%sSXsCv05s9ISmL2E^`R<*6p+VwQ+ogXQ{f?6$PY`nqbWQVD#HWQOg#>N^nnlVA7 z5o%;%F#=jToUl|juMV$-UlpSsXARC(z=TQdQV|+S;}TJ^ zMeOLmjRX~{ky%=%TuhgF;@mMFJ988-JZDzUvv+d$rDu4L3If8g&aPXg-vvDQbpfz_ z=hnA&#@i^Z5NkO=NrVwZp+EvjtO>M2=>Qc3fJbS)=ELi;TNW86&uENq7>&&?B`@bI z7nVYjnT+}V0_O({tfXD$`WKiVF0!2U$XyOXRLNK=hDBQ4$5%1q*FXp(qz>MC=+L3y z=+UF)RROSl`}VliYQC-BtYIo2MvQ8_#}i7AR)QqfgmHva)$NoHky2G&B1SLfJ+>@~ z8!eC$haXLp1l~JxQ}XQm43Et{!K>XlGM8TxNJrDBHPDol>%eKHk)wL&JO~`#S%gw( z$@Cj``$I>M^5v@nVE5kL-#IxwwFxQFYcHb!Z_rXuixst4P){UDt%g(z6$I!oT&J*W z2T(eoIX1bTtSS(}*pkQQj`9aD{VB`Y3R(pyt%!7ll(Gtdk+4`zj>WoHm1W6Pqf&*n z2-d;2w!jMq0v>qpjoR*!08oRs&-NIt=jMq62}+4O&8^B=xvbZ^EQb zSZ|@j=u+3{JwnRLf?~~vBRL$wsqP%V{@lkoH<(9DMH1BzvXaJylV=vs<#6_a>Z3({~Pun9v>UO)_RXe;*eM?Fr~v32IUN) zcEq7W1(K-NB8*~!C`PF&UoZ+y*0Z!d5-13xm@uhVhnEtBM2v22jkyHI2!Pz?{P(9nhGoPcrK+g$$l`0;70x-V zb$I8$R->dWO0M60fIw-yt-PV~G7xz1B?ymFD#?TV&=mo&{m$(jDdqh#2tZT^@_yvH zu0YrvO^)=YN`lP}N@qgQRmE8g)^q2sTk)=9fZkbfRU_tIm0Z{E|BicZebW^I&|InA9o6E7_a5sU*4gTf zoIwdkfFV>CEgf1bg1A14b=EEIebogzYcZ}^TbSW=caDcoeR(wIR_pcNjgp=Bm-wC# zVqNxH%css*%F=MlwnJ=gZA92Ap9mpvu3FN-dhh~U8Zef6G`Q~nnFK%h&p!CR8*VuG zolA?0{TE-H9e3W4r5TYB1W{ZqCX^Z8lt^Eqr6Wl~q}B+fK?t|+vzG<1#kyzw4Hq(BEF0<`X~ZoLPPN+VS;Dtdx5-E*Y*5NmB^WmoY4H`@DI+yC*-V~xX< z24f6mUL9Tw%?}=WfSu#pkxs79DXMU(CR4U3Fxe1mY?Um_lDsTi?|8?d_^kZNwoT#Qe#@coEzc7))bgLtrD&rd81Gai^7#3 z-+%s3_~eN{Kw8O%?)o7nYU5-kr*sBf)!%CslIVz7M+hX=+x619rhJw85NFN0I;4UC zQ)bvABTxHyYjI^sKI~BpdgOyXX_j(oIc3}KJ+wD$q}R*8@bCZCue@hw=FHOHxFF$? ziyNmmd>=rT53#l+3IjBbBr4Dvq9i6tY6PRjW+~KqVnhg(P<-yihxpVBpT%N%=ia-x zZu0@~o=AtpI;IxJ)Pfp`j;hjF1;L2$7;IT!ZHYA{#^iV`#$-5eE1ps2lzB>#_AAQ| z`{eyDCeO&TjO9TFGGx#GT{N39wMMez#zXtYKk?fS{odc$3>|;w_@i&Ue&45Y;(l)& z-Q_OQd1wTTHzd|siXtb^GNL%G_&`vxITcpROOKy=l8-(2AYl};AsOSY9k=1iHOmT+ zRWfwmqU0!VjJTP1jxwu&cg|wH!P=tI{YLDtNc-44Bky-Bpo$R~SxS}~23gMHa>n@d z1jB(vtAeDS(CXB0zpQq6_Ak!-^Bw!Q-hmfm);b3LA<9RL)jUa5t+|^bCmr-FB2<=0 zsWC;4iees~{Sp>Onq|Ce_uXir@Iv4PIA`#tvSPLAWf5K=MNlPGYsk$IV+%}?;>r?d z&8X%B&Q%IiSz?NeVmQEBL!Or`FXs$~1^r=;^@=nNc=gqkIJW3SaO~KtAG@p_p}D!a z-o)hOi}iZ^UXK@Rs!bF~I&D?SVZx(zfGrE~l^9XAswFp0?PpL7Ikj?*2M*jv7zFsy z;-oEdOqt`X#oBVc0$5j44>va&Rw$PKx*GpFa4{^NrW z9{t2?_Ql8@cis9!8>Yv9QEDOLhM*M(Z0SU791Cb9nmCSWwAzGGjMBj+4j^?^s+<8O z(NPTEB9&V2?1U5u9Uu@`TU4%X3alxyMb$`IQ!&z_EXlJBYdqav&c&r6yE^S9i7;72kuWY8TTa!V_bwCjTLwx*T@B((-n zoS>r!fv7Aes{KMCAc$gwk|-TiLa4PBjaC|G4W`V&S33kAu+EYX2c-Q0!$HPiSdtD6 ztNns3b2tYMj=p?q@xRQRc;e$TGZcR-pUfOMFxj~Go||r-n2Zo&BPU-v&$%-fxVTcV zydqdwEa|ijV{J>l)~A+))d);!l$4|X-ZAKQy|JbB-h1c4I|6jYQgxuJj6V`W(!r2^ zZ%8^UC~{YAhg**^4(E79I6m{}k(WODrLW9BakZcOTrL3e{U7+QkEy^N-nxB?ezzd0 zMGOn)ePNsyLggu}^h(ZM$Y?b*V{J_sR+70GY5!6RoJUw=wRhE|$kBtL@lwfQnZi>;` zdsPH%=CM5~-DxNMv2&*vpL+Go>eE*Er;i+YsrR?>b=zeDP&!`|2)Zj7I#{JFOBOE< z=8rx;`!9|^_2LW1pL+4DXYu-`oAyi#tM+W(I`PIGJ0^F^%*RTI!aJW^=ZnINfibx~ z`uOaE7vh4G_Ja5Nyp+9_qestWuZ3k_)9(g1ZQ4}(o)6x4q|t~DDj`U7^UQ}&e&XGy zK0H6mH~4kgRbXP@MDz92J8wo%F3k@go0*v@`1|YcuW$J4{{Y_HQw{=(8c6^E002ov JPDHLkV1fptZ-M{- literal 0 HcmV?d00001 diff --git a/Bio_Industries_2/graphics/icons/old/fluid_advanced_fertilizer_64.png b/Bio_Industries_2/graphics/icons/old/fluid_advanced_fertilizer_64.png new file mode 100644 index 0000000000000000000000000000000000000000..76ff8e45260aa1cb4ceecdd29c6137db5ea8d419 GIT binary patch literal 16172 zcmeIZbyQr>wl3PZ6Erw9?(P=c-QBw(IB7Hl_uvk}3GObzgS!O_1PSgg!7s^gpS^$k z-Sf_UXN-6MJIz?oRrSqp&iZOr)mp0tA61oQ(2xm{0RRA+oUEk!%U{vo7b5)2?^5e` zD*ymtkEf=ti@KRR&A7vy1aJ+1Hm5FmH>dqVnv#DJTX5c_;~|IK-?4|I&fBz zck=8?IHuetepy(_I)qD`rjCLV(0p$|?6l+ibl>v4u42vHoM_9~o){`pQbY>xxOnkI zaQ#hW$Y(M8@)q~`dC&RgF``Q*ZvNL(Q_{qhN%s8-Q5$QZ`)w#u!_{ry!!6$9MbMeaG_KpEG>&uP>^fFQ13^k4Bx% z5ozy!opSb`q5~I2@DMr?A0p$n*1Wg9qx;@eWvABweH)Y~UgbeLrMK=gpVKFNk>r_9 zcA{VT7>}Mm-lb&UKaA{T6A2islVuUl-z50nwVAB?W{%HyesFib$#Qq2#7(aEqPgP6 z{V))mKpk`4(7ig`IeKs7E9jd}`2ml7b;6UzH|69FM)E3n0A&tCc1O*?KMew;@kI8G#eb>@^3=6n35^6`l~YU)J=twMh5eWrqz>p3C7v(DM9hQb~!hv+qK#yK2o&IDTo zC!Btw={O%kyb|-32|AafG^lVutQ@OL`e|lnFgMOZnSUqV*5S*Jnz z(l5#Swq@-hte$7N!B{gL0N97#nx?rjs=eZ}2 zxYV=W($Y2>tLW%Q7j$qkPcd>|@{ZYfRpK%|RFvVlxMyXke$=1t(6KeQqAp1Ey}iqTS%iAtrnj6zf#q3_W8O~D$DK;Pk>f9asV znkAgo2dPNJ!VQUzCqXw~$>XBtFNseT&B0ZJ{K3Z}nEXYPk4l?Q#7&)Hi?5f;X$2x; zhgBo)B!?X@6NO>hAf4Vqo~+S#p*lC4)2|{@_n9}Yy^)yQvuuywr(|%xe=pqFs_ckqQA9oE%>ydLD1e4<1(z;<9Ib@Sxj!hknpl_zO4UkS%^BC2+pFLU)j7}#lUFZd>LUNUQ2ujtZqD&X!_STF zSotc{g)}9^BAp%qqN=(0GP z#P!KHiRPG5rMvK)@k(odKjC4GWBP30ngCWFrXlur%ts)petc1}C2BGR=fKIt@o9Np z#6i;UL_$o}O5SZ7g~>*!92s9G*gxN&LeCyrWg(_J&6o=RL>oE z+BRoMKul~^&L)%1^3vjs3>$~$SYW+e3g5l4vNgTY@R-C+6b4kstaJww%YqE-vtPFV z_Ue2MbUU4BkU|QNiQI<7PgSDC5|PAeN6xKUIiN2bpBB{e2bH8N*a8ZTvbxBo!Y#6= z)vDv2SGA^%?%fT{-%wko@qIvLoW?5x>0R0Th7bH9)LSly-UNlZppo z21mI7E>&Ay&)eH-HX@fChTxs~;VFi+8mt@+B=6OVS055qkqL@#o+T^LY(UZLcBV6^ z8MN12wPmkSL--d1r%T4x>R`}nj@2fvLm>|YBFiLO;JzoM!)(18GVw3s92|Ic-UY`{ zS!<>oH>A9BBxFQ3l0u2HChD40D%>?pW)tL=A!FN`Vka`sWMWVsq@g(#EHm3+0$nB6 z8^abu&WqLj$t6<=4@n-96=4>nrEmIRr&YJvvwKyc+P`04E~|AKR-aYTF}z9*;q_Px zhkFHl_-sg7Va27=YgI9f@M;={V=aYp!Os(#vL^(?6=R|I(nlU6j0Xj5SR$cjZiIwkh>_h#s83zuZiAr4l9Z6k*cpv1zm zy#n5}iihFIZiiZ8M=YiWp}YSW=b?5M%*=WN;adz-Yd^G~u;gbs8SNv2su zNTs|`0^%X>RPwpIIjJiyiRc6#t`Qyxvwmh+1jBLY~SAQnN;Cilizu+KJAImad zt`*pIt5)Y?OOmjl)ReqK$cr?}tKheBI1W5iyczn%oE+w#y;<^9Cv8DZwtZlRLM5#g zv2BFsn_M{Zzi zI~Dr`B|M`<%SGIhcOi9PPlBcwG+ZzgJf{%5$ugmgeW)tsb$zZwVTnRw+5*gTa9F%p zOBm)f?fU$rRrzth)^M~Gjf(62fkdJaTmH=i$w zrLYO*IwgkyJsiz2u-YPSTa?+s~NR0aaC-~TXVnH9N zhDOop>l8)f9HnHN8L&ujToU14D?jdaCpS1PJ-6sZwmxIN?eZ6k2u z9vt~TU-MV+f3L-An}b_vQsycA36m!}@wyPH2nbssaa|iA_;tEpEoO8Z_GdFSM^XJoroxVtdWt;Csl_eaT)1}j!$`4|D!;oyyZpw)P>>yU!7I{F z<(#LKm@0jZ_S`Zv2BuN5A<(|-(4XT*p%@<(Uq8a5orLlEF&}pe%*1}ek^Y<(?VFUB z!##?yw?uphE8hcS74H2dP;%}s_OmitSFLFm zEeOBR56%MjDmcH^lHLHMbdXc&w4s}!$6f~YY_;lZj4U!F#e7ovb)E^~^+&WpIwHaw zO~MkTAiH(<9XG8{5Ne+!U%3O!a8F);!Q0gfv0OnmWr?H2sVh*uAla5xuQV=a3cY0M zd){iJSrti2&k;@Lcm>{U#4>--iFE#{$O=&&LKM0>x9YC{S!Ll$cD--VI6Ag*Bt|FA zsKx6y5_pMyVkCt0%&u|{7jTpT=LmsrN+qh5aUerbRr@{GQRQPJUpCD7&K%%%LpjSg zPiCnZ-3*}o>ww&KGhbJ^y&p2(GhbGzfn4~>-{He4Ra@O%4nI(l7#{8mCW4c3=)c{| zn{P5sB2jGI4?BN*SF~BdgL{Vnv@!L2&5<2hBG!}<;{Y|P1WPghIu`0&TT#6_#N!U&MU5^aLeYc@Ybqi95NA2o+9`Oisy4RC{bpBzUU z@p$hulY3H04oa-mccD>vbp5<<{f!5IeAJhGV$Yyfu2pPU2x{K~AfkQEsmc_c!GHP>PdtCy*N+?Y=7=P6wPxpU{!5qfL z?NJxi)dXEo;B(lsq3$niga!T(Je;Gkbw^QbE7U--BIWF|;je+-m)*HrKhP2T@bftB zDYQ_=7KJJ2kS4~j7IOi1v`*1ngZS~*XoWe9<;qf5F_Oq8s6G-v()jR@95z}Bq+koIPPw-_Anil={Lm7Jw9QMA8jHAc0bTcK1H-D%Fpl_Qiq10 zO<-xnGfIu)1bkvR7|s-N2z0V2Db**~6bcH;_p4vwdW+uCgJucqK)%F-!PQ*OoTJ`= zAvr1|Y}bZ7gP6*`dD*>BZFcINDm3?2Kjtc;#};b4hX9{C|Lx~;K}>&L>iWLAMr00o zf7p}hs&jR(HKzHB4!JHQC;)LHR*HQRp0u|{$sUayEoqpD6|GkG#h4*;}|!I5YtktDk5T_tS=X7jd9&GY(wKOOaSU^Qnzlc$k^ec~G%bu%`xkjZ02)x6ZqXa4 zp4&LJpdPJ$oEmx!9JGaUB?LwvYFAy3}|+RtEf z?3(1VztUC*q~L;iiPx+RMF0z~iZWTOnIa9u6DnxY>lEf8DeZ0u|&KHMPB|H@^)leO08|V+Cims^H zJ13P;I;8IV1E7ydqKF>-#M7V9KzpzA0js$7cyszQ#mAqNPN+W|q|&ibQ2Y__Uwuj~ zFue4*iR-S}U~1_=;d9)D58^qG#)0w>6q(U<}wuaZhf-SgS# zq{yJCeL_)RJ{QiOxzt4EN+WV7jV-={b+HQeAe5(rc~_Ji4xW>2mNLk(UzsV-UQbsz zVEnN;x!U7Ota4CBRw%Ecp8VA9rdmkouBTQ++qxJ{k7JfJsc>~Nj;3NR{W_ymx+|VN zGtf@dHJmyq@Z0E7yfwla1|OCUj^f#(E-1>up10nuE`GtQr^Ljb{+y(UQH%Vr$!*Ka z=sKD)OGa0y;*%xP_au|ShuL?>`}U*YC(0vRW2}wSDN-9q3_SU6oY06KwBXE+T|! zNr6I%{b;C`rhE!MymBWVDtgNU0^=-B8*S`pIPjguCcUCm_KbQGdVVVs*#X0u{FfY3gU7dMmxeDYn4c7;A)*^ZcL&^ci)ql*JCPW#Vm zGC3(~^gOPQF~BO`rzUbqQ)uLrQ6eH%=zExGnU*}F^*MI(iOA!W*o|-0orUeW-$-%%lXy`|jNVag zmuEXuHV&A{1*3Q8(C&XO`!?L}+Gy_|fHRuZL?RtU{&vEL!qYBcvv_p5XuN19iR4Yh zSeo)Cs2jCY_-i?u3cWhB)vIFUUZ^Y>wcVfaTnuZz1uAnOjJI9i8oZla^%uCJV-Y`v zHtqQCuX+=Mr9nP7d*w9|Ntw$ZOWSub6ED|jytTkO>67>dD|s8t{+lq6_$I#dtclLEDNKl%sjei#(= z(%i>hodbfYwwc?VN6txJTRMNQKFi*L<@MPuodL+~-Cm_IWST9eaMAfwL zfUfyQG2FZ2tmZsy<01j?@QTi~WaQzKWJA#)sG!oxr@biPn3N2P1rSZQVkfjIjRi^a z$`51IjQa}+n2pLTf69G*aE5|g+2QBjQkQ>gB+#qvqAfWZv`DC+boYn_i*}G(3de4~cUoGcq!bl82Jn}F_iN3 zT+&i^UjmqW=YyYA=yQvTmX-QvU8QYs33X*2i~040@uP}N?~l~h{D@e`a*A$9ghZfF z+O?=38C%5~=Hje%w}UsKVE1i-ePumbmvnf39y)dOFMgEAAi`mRj0vK!Nh=bWbkpyF z(^ZL{vtLt~WTb^?Hck>TO z>T*N*Q6dX&V6o!x^cYK;fQh3Xq#9;A}uP%hh@2R^tbji7>e?V|H&yQep1tjRFmu#`&} zt46xya{r^W0sI4Tu@$D!RZ;~?I6}ZcE*35pHfAXgYc~#xH^@LC2*^@ET~hiV6fY%V zinlHS5-@%Fe>ZYH$B<7S1kGZvXQ4pISI;zMS&1 zs)L;!T_F}=DL1f#3+3OPI@!58|J|pnGx&GapSbNnmaH#9{qg*F8yPtz)qmRjmeI=E z-sz9UZ}i`hAd7$EoLnJxe=r~mRBpqoL$TuEWp31UdUOjUwAmd{G1%@Aa-UDwE!l*uv$%=K0US|722sS?io#An)b=51smd;Dr84SJ@X^N67oX`PTry`>XWVf@Ej? zM=Buj&mtgTX7QK&&Sq|4(4QfA(ebY)i??PDR^XS__8(L2KkBXjlQibH-~_#V*qQmw zEqIu@%q%#V&AE7ZnE81vc{nXBxcMwC|H_qrvO7Cky11J`z+zS}Iq)*hFH`H!I0Nba zWFP&%$Kw7L{E{P#Z0rJTY!rVDFHnf}_k#K#-4pt~Zmp-|YX9l>aC5zr+5rmT+`>|1xRcx~RB2{Fmp%C$f276lne%_~^N)1isLDg_{_n(WkY_}u`^^~T= z8^fo0ly23fY9;fg;~T9P=^P~F(l8LwVKV@hoTfw*Y@|zd%YyFSP0m?9%{QK?6l4Ly z*n@&Co&{fYPCjHkUt~Pjk^bT~P8rq;{C#zfa~Jn{eHX4Z67J61H)olY;cKyo9&Se? zG-nf3v3g9oIn5yY@LrS8R{57w8%rXitHOnEr&eXctD%Bg$+=+$egmGt_a=g8yq)h} zV+_ZBoK?Gj_vI{}uz?J1l9j&Xjyy&qk0lUw*R{OErOERbJM&|IiFGUffj(Eg;}(3A z#IXkE)Q*JsvINvC6{1M^R14)Xw)zwS;4n1Z0uPAsG`PBa4ELik==U08wg;8p2iEe>>TG!Qnx&mRSVrdzQ1}v9Q8I zL;KY7`rnZ{`QetR7Km*$DuB{S&AZyGpcZI&KmCr>YTavXT>x#baLMBrARp9x%`@p| zI;=@W(a|is_s|FIfrB$8DJ!6V>)9&(-j%R20bK}{o<6{ot(Pjcp&Zz!SH7C_j;L#K zj&sEwU`Vla`M5uFtN}TwmZ&UIqoq>i7f*wIi*#C}TdrHp%#W=GX3#7)ZZ&?x^^ot` z8#Va)u>&SYvTR#s+X$Cn986h&nDa31nN}oOJ6;7HY4gb z40{b<#(08YmJb~c(w>3;Ta$q3kJRM1Ykb%#FibcEEQo-C)Wkw7XZI4CrPf$K;xC00 z2*eN}tlr|LN;+I~tQ`!B^;W!iR26=}5;)XHU3k4R*?`9iWI)tQMI|5;7BjD2ZCV2Y zDWO-36GgcB*!1m(A(|fK*!^fz1$hjUEkxflA1l8~7?G`z(99BgLrNIMRgqWXHQIJc zYfQjESx1=U+$;#_|D<|i4Pc40_xzm|tnTQ@5DW3}J_bKxa^n%`#qdhizA1{XrYbsY zbq?GF(;8m%A%Z|hSk5}oJG$j{xTcLWa{=2!6D29iJJ5)L7mL4fmIZcf<&i;;yylehB7t1B(^&KypA92 zb=s-==q2z)0GLf25{8rWO;<^-qm670bw^^-IA%}9BjJ*xwan6&Xo-XseKnPgV%{F@ zpfHI%62IXT>aJV$2}fg0o@%|a*agO1OC;`)&&5l-PIFm!l@87@<{f5dt?!(v(fA0O zJ7o4K;PM3R)s8>|LR+7{VOYG1Y_UKxCYz3{bS3!1$F_*8~^;s zsA!J&b{Wx6n0A$+*=^U*&#pIRkj((}S)eC7g}^IrqPo_cU$S~W%&%2*3!&2EjG*k4 zWhK#qJRg#Mvb@&Vyp71cgVE7bu!e`;c%r=L>YlRDXx<9+kf!X@DKbRdTe7UKUv>q8V?(!uPFPtBm~FdiPnhwTWY39cps?j-ysk zf2oVUK(Us5!cJfW`@;Y}A>G=C5UL^k(HpaROY5RsHD>b))5IRjXs_LG;BclRZkGe( zZ}%(tf-?*G(I&e6m%UHm60uuf;T5pEpfDL6Ic1)>YH!PTnV8l(2t_?Em3 z*YNiB=}^R*+|HiBM)@OXe`bPD0BK3YtSXLCc^sL&p?fB>!`voL031mszvTn;JL~9b z<02sqazMR$eUun%2BO(+0;|ipAw9WKU9vwd%^7Q1!nQi9G%uw@LvYd^^xB!bLdXd+ zK(Ojeg>KURLZvRX;FTZ_E^Mx@iXJyk{3{_?j|9I67D2L!x0aS8qvOe+G8x!;-+V0P z!LU`!q8YortRxJ`_2FS517@QvTsTfx*k#V}1X2dR^J7o7e@$v4gymHtbEN+2`-iQ% zpIn?ejiV+=;`))gyzgnog;l5<6%#Gs88N+sh2pRw2lH6)W0jL@qO9-5N6oTxKat;Q z;YHa*qKbX#{5q-E?sBuGCXXq@Zv950mc~8&9SBsKr0ghl*ReKp*&2@I14duy*n6eP z316IX6dQHawrY;F61FP~Q;ukqo7?nl=kh0MVn7}}Y85_T&3S|mF1&9|Vibuj0l$T? zgc0LH^}35TG5+Us(h!gA^N0+VF#s;$Z&3b!-MP>Rs~!ipQv zTct3#^oh|izg7{pbVG+$U|6B&rArf9z24gur4L3-yqO(5*~<~K-#aNSI+g7!d7N-npc(hYqDL_*Qo);Y>gg^cfjW7=^5Yn=6 zbBJ0MrM=+t6>(%jf9O;2><{mWWxLx&U>VIe3U$C52J=|$)TcuhuE1QADUv67zz^ps z62PeXA#{jAgsT0-8YFfhY&<7Ie7A;bXA1W&UyrjI3b6;8q_OMiBZJBje>V}r@T6HW z9=2l2!1joa)1s+=zPTD^kl5g9IHu1|PYTCFSa*Jfy&omD7CO`zMEjsp3MGh%#i}Or zwZezF0fta!#MxqL-y4D%3Yjl)m_-C(7*a^`*2$Mu=9Ueie7QOwE*)87^#^RL#yQR| z=pR-v1ki4&p%`YUmZ5IPsqGd#1lmQ$vAI^JsNHJ~cU}|w`6N$+j3*G<+~mrLe9-;SQ)zZsqdjYD>)dU_iY z7vB;TF@N!YQ_q8wj5An3f>W4Ja9l4=8t9K2ljebf-o?dvl+wbp)EM|VF%jh5bs$j{ zc+R%M!NJ%jWSq}<(zD6*tq-xl)Wg)TBZ;(fdM#?odf&R6NQ7W#vWyxPeFZZU)t@geqN+yrKVhfg$;k2kcvhQ0_o8O}ziG1l+UZg7+QZ=B*IXNWR(S^&q+$-uU(x4v5H;(v7oYdnS zNtR~nX&LeqB?06N>Qig6)uN#d7y96oJVa%-KNo3r?9$tgoEM4P+nn~uW7KE6szmp| z=;+U!-k93{K!v?272LAzVa^3MbBy}d*_pPI6~-x@9FO8nV~M_Qm#L2$N@MHdN+Wa~ zg@C_%LcWSStu|;D**{-hZ=gGcqHxJIEt|@c#0Rm9ew1P0%CK1CrzC#gCT}sz?(^=^ zYt=6Z4{E_~bg2ckh}3VkJigs8^hQ#gA>b{Z;QAT-$O@uvq0aQYU|;+(@f?!>6w?sO zV6}qGYuFr{k^71s@-+PQ)LPNZK{r$<5 zHcTvPNYiA4T7;l-P^5o|CzyWlsLAdq>gR_5yG&MN2S4VtYpM;hf)DW%ZC%$r2&AjN zegs#tOT|a24O(q_2R1}Q3dFulyBuE3l8fc*;nB@$hz^E^OvwlCplc6$nx3zt775XY zbwdCiSY3}??@*56+)D4k=|4bEVvqJ$Heap`-k%FHn2nW?j?D}wN(|vsDzI3vWLo$h z<3^`>d(@com+if31irPjxkqY;e=lP3Mm%e^We#b!S3O+4{~?SLk4mwsiI~IoI7qzvjr&rp(#0h^gjMiviM!M|}fBedO%Qdv@qEflgefbepI5a!IxxRn*9DbZT zJ(niabjzb_IOT5P^4u~RlqsnOH-W!?$u_4%PQe#MuO59xt>`<-(ZXJ^iJ}bK!c~4@ z`pJ!ON>ZIB9s%$pOY-#qN?QfPgWQ)bM(%xINTl3B@2C7U)ih?cG{$&Kr1(a|6x+tH z4S|NxfignLxtBSu0 zgg4yIA;)O)NwoEeiTU>SNZlRqv*&Qg5=k`zz3Zd)Dg75$+u%jt2{why7UdyLNy%Ua z?)@>fg+qHzzI30Y09Z%m10#hPZ>&mfVJMY7|+{NG=6VWTbdRr0Accksjn%E<;% z;4Spe!yf&+u^~iX`E8gGe5a*NnhT>VR+F={X9vFm>Ab!HcYg7fU5X-zlGr2mN@{=- z^W5Tl4aa&v44`VPqs{8C{;fedS`zqQHl@+tQVN~#c^ys?ClKm;HsX}ZW>XgrSW?QK zDJY)AKk}Dqa)zb`NzPiw#>U5wJAS8CXA6=mCzj{bifmXt)f%+PT+zLA^7@YP47puGY?e z@sW!Buu<{XBy6Nv!*RB)t&TP`-ZHZt^D2Fkg8?vrvD^})eR7m)t;*JF`J-`xs2DJ4 zWQkUa;6u30bDfUs95L{HippS=SAVAO34_*dg)A?G1kQfBez`>H=t+e rkD{iLX!i#P$;RDaA%<@qPh@9fhdW5!s3k9NxBzle%954hrUCy8fi|)1 literal 0 HcmV?d00001 diff --git a/Bio_Industries_2/graphics/icons/old/fluid_fertilizer_recipe_64.png b/Bio_Industries_2/graphics/icons/old/fluid_fertilizer_recipe_64.png new file mode 100644 index 0000000000000000000000000000000000000000..995dee8c3d1cf54c5dbfc8ad6b3e8c0bb6028b0b GIT binary patch literal 16992 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 Q&j0`b07*qoM6N<$g7?0?)&Kwi literal 0 HcmV?d00001 diff --git a/Bio_Industries_2/graphics/icons/tree-seed-2.png b/Bio_Industries_2/graphics/icons/tree-seed-2.png new file mode 100644 index 0000000000000000000000000000000000000000..7af15acb220530710fa3b746acc7add7cd5b81fa GIT binary patch literal 3969 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 b40`+n)7GaquFfy+00000NkvXXu0mjfA5){_ literal 0 HcmV?d00001 diff --git a/Bio_Industries_2/graphics/icons/tree-seed-3.png b/Bio_Industries_2/graphics/icons/tree-seed-3.png new file mode 100644 index 0000000000000000000000000000000000000000..56c306d9bbe77f913b347a0f9f57eba809eb7f65 GIT binary patch literal 3391 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 VVutOiD!Tvx002ovPDHLkV1m;|j#mHx literal 0 HcmV?d00001 diff --git a/Bio_Industries_2/graphics/icons/tree-seed-4.png b/Bio_Industries_2/graphics/icons/tree-seed-4.png new file mode 100644 index 0000000000000000000000000000000000000000..6f1b1222ec096d8a839c36d56bd9ba12d0add5b2 GIT binary patch literal 3849 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 LNkvXXu0mjf><& 0 and item.amount < 1 then - item.amount = 1 + if type(inputs) == "table" then + if inputs.name and type(inputs.name) == "string" then + item.name = inputs.name else - item.amount = math.floor(item.amount) + log(debug.traceback()) + log("Unable to determine an ingredient name") + return nil end - end - return item + if inputs.amount and type(inputs.amount) == "number" then + item.amount = inputs.amount + else + log(debug.traceback()) + log("Unable to determine an ingredient amount") + return nil + end + + if inputs.type then + item.type = inputs.type + else + log(debug.traceback()) + log("Unable to determine an ingredient type") + return nil + end + + if item.type == "item" then + if type(item.amount) ~= "number" or item.amount < 1 then + item.amount = 1 + else + item.amount = math.floor(item.amount) + end + end + if item.type == "fluid" then + item.temperature = inputs.temperature + item.minimum_temperature = inputs.minimum_temperature + item.maximum_temperature = inputs.maximum_temperature + item.fluidbox_index = inputs.fluidbox_index + item.fluidbox_multiplier = inputs.fluidbox_multiplier + end + + item.ignored_by_stats = inputs.ignored_by_stats + + return item + else + log(debug.traceback()) + thxbob.lib.error.ingredient(item) + return nil + end end -function thxbob.lib.item.item(inputs) +function thxbob.lib.item.ingredient(inputs) --returns a valid ingredient only if the item exists. + local item = thxbob.lib.item.ingredient_simple(inputs) + if item then + return item + else + if inputs and inputs.name then + log(inputs.name) + end + log(debug.traceback()) + thxbob.lib.error.ingredient(inputs) + return nil + end +end + +--Same as ingredient, but has support for amount_min, amount_max and probability +function thxbob.lib.item.result_simple(inputs) local item = {} - if inputs.name then - item.name = inputs.name - else - item.name = inputs[1] - end - - if inputs.amount then - item.amount = inputs.amount - else - if inputs[2] then - item.amount = inputs[2] + if type(inputs) == "table" then + if inputs.name and type(inputs.name) == "string" then + item.name = inputs.name + else + log(debug.traceback()) + log("Unable to determine a result name") + return nil end - end - if not item.amount then - if inputs.amount_min and inputs.amount_max then + + if inputs.amount and type(inputs.amount) == "number" then + item.amount = inputs.amount + elseif inputs.amount_min and inputs.amount_max then item.amount_min = inputs.amount_min item.amount_max = inputs.amount_max else - item.amount = 1 + log(debug.traceback()) + log("Unable to determine a result amount") + return nil end - end - if inputs.probability then item.probability = inputs.probability end - if inputs.type then - item.type = inputs.type + if inputs.probability then + item.probability = inputs.probability + end + + if inputs.type then + item.type = inputs.type + else + item.type = thxbob.lib.item.get_basic_type_simple(item.name) + end + + if item.type == "item" then + if item.amount then + if type(item.amount) ~= "number" or item.amount < 1 then + item.amount = 1 + else + item.amount = math.floor(item.amount) + end + end + if item.amount_min then + if type(item.amount_min) ~= "number" or item.amount_min < 1 then + item.amount_min = 0 + else + item.amount_min = math.floor(item.amount_min) + end + end + if item.amount_max then + if type(item.amount_max) ~= "number" or item.amount_max < 1 then + item.amount_max = 1 + else + item.amount_max = math.ceil(item.amount_max) + end + end + end + if item.type == "fluid" then + item.fluidbox_index = inputs.fluidbox_index + item.temperature = inputs.temperature + else + item.extra_count_fraction = inputs.extra_count_fraction + item.percent_spoiled = inputs.percent_spoiled + end + + item.ignored_by_stats = inputs.ignored_by_stats + item.ignored_by_productivity = inputs.ignored_by_productivity + item.show_details_in_recipe_tooltip = inputs.show_details_in_recipe_tooltip + end + + if + type(item.name) == "string" + and (type(item.amount) == "number" or (type(item.amount_min) == "number" and type(item.amount_max) == "number")) + and (item.probability == nil or type(item.probability) == "number") + and (item.type == "item" or item.type == "fluid") + then + return item else - item.type = thxbob.lib.item.get_basic_type(item.name) + log(debug.traceback()) + thxbob.lib.error.result(item) + return nil end - - return item end +function thxbob.lib.item.result(inputs) --returns a valid result only if the item exists. + local item = thxbob.lib.item.result_simple(inputs) + if item then + return item + else + if inputs and inputs.name then + log(inputs.name) + end + log(debug.traceback()) + thxbob.lib.error.result(inputs) + return nil + end +end function thxbob.lib.item.combine(item1_in, item2_in) local item = {} - local item1 = thxbob.lib.item.item(item1_in) - local item2 = thxbob.lib.item.item(item2_in) + local item1 = thxbob.lib.item.result(item1_in) + local item2 = thxbob.lib.item.result(item2_in) - item.name = item1.name - item.type = item1.type + if item1 and item2 then + item.name = item1.name + item.type = item1.type - if item1.amount and item2.amount then - item.amount = item1.amount + item2.amount - elseif item1.amount_min and item1.amount_max and item2.amount_min and item2.amount_max then - item.amount_min = item1.amount_min + item2.amount_min - item.amount_max = item1.amount_max + item2.amount_max - else - if item1.amount_min and item1.amount_max and item2.amount then + if item1.amount and item2.amount then + item.amount = item1.amount + item2.amount + elseif item1.amount_min and item1.amount_max and item2.amount_min and item2.amount_max then + item.amount_min = item1.amount_min + item2.amount_min + item.amount_max = item1.amount_max + item2.amount_max + elseif item1.amount_min and item1.amount_max and item2.amount then item.amount_min = item1.amount_min + item2.amount item.amount_max = item1.amount_max + item2.amount elseif item1.amount and item2.amount_min and item2.amount_max then item.amount_min = item1.amount + item2.amount_min item.amount_max = item1.amount + item2.amount_max end - end - if item1.probability and item2.probability then - item.probability = (item1.probability + item2.probability) / 2 - elseif item1.probability then - item.probability = (item1.probability + 1) / 2 - elseif item2.probability then - item.probability = (item2.probability + 1) / 2 - end + if item1.probability and item2.probability then + item.probability = (item1.probability + item2.probability) / 2 + elseif item1.probability then + item.probability = (item1.probability + 1) / 2 + elseif item2.probability then + item.probability = (item2.probability + 1) / 2 + end - return item + if item1.ignored_by_productivity and item2.ignored_by_productivity then + item.ignored_by_productivity = item1.ignored_by_productivity + item2.ignored_by_productivity + elseif item1.ignored_by_productivity then + item.ignored_by_productivity = item1.ignored_by_productivity + elseif item2.ignored_by_productivity then + item.ignored_by_productivity = item2.ignored_by_productivity + end + + if item1.ignored_by_stats and item2.ignored_by_stats then + item.ignored_by_stats = item1.ignored_by_stats + item2.ignored_by_stats + elseif item1.ignored_by_stats then + item.ignored_by_stats = item1.ignored_by_stats + elseif item2.ignored_by_stats then + item.ignored_by_stats = item2.ignored_by_stats + end + + item.fluidbox_index = item1.fluidbox_index or item2.fluidbox_index + + return item + else + return nil + end end - function thxbob.lib.item.add(list, item_in) --increments amount if exists - local item = thxbob.lib.item.item(item_in) - local addit = true - for i, object in pairs(list) do - if object[1] == item.name or object.name == item.name then - addit = false - list[i] = thxbob.lib.item.combine(object, item) + local item = thxbob.lib.item.result(item_in) + if type(list) == "table" and item then + local addit = true + for i, object in pairs(list) do + if object.name == item.name then + addit = false + list[i] = thxbob.lib.item.combine(object, item) + end + end + if addit then + table.insert(list, item) end end - if addit then table.insert(list, item) end end function thxbob.lib.item.add_new(list, item_in) --ignores if exists - local item = thxbob.lib.item.item(item_in) - local addit = true - for i, object in pairs(list) do - if item.name == thxbob.lib.item.basic_item(object).name then addit = false end - end - if addit then - table.insert(list, item) + local item = thxbob.lib.item.result(item_in) + if type(list) == "table" and item then + local addit = true + for i, object in pairs(list) do + local basic_object = thxbob.lib.item.result(object) + if basic_object and item.name == basic_object.name then + addit = false + end + end + if addit then + table.insert(list, item) + end end end function thxbob.lib.item.remove(list, item) - for i, object in ipairs(list) do - if object[1] == item or object.name == item then - table.remove(list, i) + if type(list) == "table" and type(item) == "string" then + for i, object in ipairs(list) do + if object.name == item then + table.remove(list, i) + end end + else + log(debug.traceback()) + thxbob.lib.error.item(item) end end function thxbob.lib.item.set(list, item_in) - local item = thxbob.lib.item.item(item_in) - for i, object in pairs(list) do - if object[1] == item.name or object.name == item.name then - list[i] = item + local item = thxbob.lib.item.result(item_in) + if type(list) == "table" and item then + local addit = true + for i, object in pairs(list) do + if object.name == item.name then + list[i] = item + addit = false + end + end + if addit then + table.insert(list, item) end end end + +function thxbob.lib.item.hide(item_name) + if type(item_name) == "string" then + local item = data.raw.item[item_name] or data.raw.fluid[item_name] + if item then + item.hidden = true + end + else + log(debug.traceback()) + thxbob.lib.error.item(item_name) + end +end + +function thxbob.lib.item.hide_entity(type_name, entity_name) + if type(type_name) == "string" and type(entity_name) == "string" then + local entities = data.raw[type_name] + if entities then + local entity = entities[entity_name] + if entity then + entity.hidden = true + end + end + else + log(debug.traceback()) + thxbob.lib.error.item(entity_name) + end +end + +function thxbob.lib.item.set_subgroup(item_name, subgroup) + if type(item_name) == "string" and type(subgroup) == "string" then + local item = data.raw.item[item_name] + if item then + item.subgroup = subgroup + else + item = data.raw.fluid[item_name] + if item then + item.subgroup = subgroup + end + end + else + log(debug.traceback()) + thxbob.lib.error.item(item_name) + end +end diff --git a/Bio_Industries_2/libs/recipe-functions.lua b/Bio_Industries_2/libs/recipe-functions.lua index 452f9f6..4a0593c 100644 --- a/Bio_Industries_2/libs/recipe-functions.lua +++ b/Bio_Industries_2/libs/recipe-functions.lua @@ -1,163 +1,560 @@ local BioInd = require('common')('Bio_Industries_2') -if not thxbob.lib.recipe then thxbob.lib.recipe = {} end - - -function thxbob.lib.recipe.replace_ingredient(recipe, old, new) - local retval = false - if data.raw.recipe[recipe] and thxbob.lib.item.get_type(new) then - - local amount = 0 - if data.raw.recipe[recipe].ingredients then - for i, ingredient in pairs(data.raw.recipe[recipe].ingredients) do - local item = thxbob.lib.item.basic_item(ingredient) - if item.name == old then - amount = item.amount + amount - end - end - if amount > 0 then - if thxbob.lib.item.get_type(old) == "fluid" and thxbob.lib.item.get_type(new) == "item" then - amount = math.ceil(amount / 10) - end - if thxbob.lib.item.get_type(old) == "item" and thxbob.lib.item.get_type(new) == "fluid" then - amount = amount * 10 - end - thxbob.lib.recipe.remove_ingredient(recipe, old) - thxbob.lib.recipe.add_ingredient(recipe, {new, amount}) - return true - else - return false - end - end - else - if not data.raw.recipe[recipe] then - BioInd.writeDebug("Recipe %s does not exist.", {recipe}) - end - if not thxbob.lib.item.get_type(new) then - BioInd.writeDebug("Ingredient %s does not exist.", {new}) - end - end - - return retval +if not thxbob.lib.recipe then + thxbob.lib.recipe = {} end +local function quantity_convertion(amount, old, new) + if thxbob.lib.item.get_type(old) == "fluid" and thxbob.lib.item.get_type(new) == "item" then + amount = math.ceil(amount / 10) + end + if thxbob.lib.item.get_type(old) == "item" and thxbob.lib.item.get_type(new) == "fluid" then + amount = amount * 10 + end + return amount +end + +local function get_old_quantity(ingredients, old) + local amount = 0 + for i, ingredient in pairs(ingredients) do + local item = thxbob.lib.item.ingredient_simple(ingredient) + if item then + if item.name == old then + amount = item.amount + amount + end + else + log("recipe contains an invalid ingredient") + end + end + return amount +end + +local function replace_ingredient(ingredients, old, new, new_type) + local amount = get_old_quantity(ingredients, old) + if amount > 0 then + amount = quantity_convertion(amount, old, new) + thxbob.lib.item.remove(ingredients, old) + thxbob.lib.item.add(ingredients, { type = new_type, name = new, amount = amount }) + return true + end + return false +end + +function thxbob.lib.recipe.replace_ingredient(recipe, old, new) + if type(recipe) == "string" and type(old) == "string" and type(new) == "string" and data.raw.recipe[recipe] then + local retval = false + local new_type = thxbob.lib.item.get_type(new) + + if new_type and data.raw.recipe[recipe].ingredients then + new_type = new_type == "fluid" and "fluid" or "item" + if replace_ingredient(data.raw.recipe[recipe].ingredients, old, new, new_type) then + retval = true + end + end + + return retval + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) + thxbob.lib.error.item(old) + thxbob.lib.error.item(new) + return false + end +end function thxbob.lib.recipe.replace_ingredient_in_all(old, new) - if thxbob.lib.item.get_basic_type(new) then + if type(old) == "string" and type(new) == "string" and thxbob.lib.item.get_type(new) then for i, recipe in pairs(data.raw.recipe) do thxbob.lib.recipe.replace_ingredient(recipe.name, old, new) end else - BioInd.writeDebug("Ingredient %s does not exist.", {new}) + log(debug.traceback()) + thxbob.lib.error.item(old) + thxbob.lib.error.item(new) end end - function thxbob.lib.recipe.remove_ingredient(recipe, item) - if data.raw.recipe[recipe] then + if type(recipe) == "string" and type(item) == "string" and data.raw.recipe[recipe] then if data.raw.recipe[recipe].ingredients then thxbob.lib.item.remove(data.raw.recipe[recipe].ingredients, item) end - else - BioInd.writeDebug("Recipe %s does not exist.", {recipe}) + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) + thxbob.lib.error.item(item) end end - -function thxbob.lib.recipe.add_new_ingredient(recipe, item) - if data.raw.recipe[recipe] and thxbob.lib.item.get_type(thxbob.lib.item.basic_item(item).name) then +function thxbob.lib.recipe.clear_ingredients(recipe) + if type(recipe) == "string" and data.raw.recipe[recipe] then if data.raw.recipe[recipe].ingredients then - thxbob.lib.item.add_new(data.raw.recipe[recipe].ingredients, thxbob.lib.item.basic_item(item)) + data.raw.recipe[recipe].ingredients = {} end - else - if not data.raw.recipe[recipe] then - BioInd.writeDebug("Recipe %s does not exist.", {recipe}) - end - if not thxbob.lib.item.get_type(item) then - BioInd.writeDebug("Ingredient %s does not exist.", {thxbob.lib.item.basic_item(item).name}) - end + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) end end -function thxbob.lib.recipe.add_ingredient(recipe, item) - if data.raw.recipe[recipe] and thxbob.lib.item.get_type(thxbob.lib.item.basic_item(item).name) then +function thxbob.lib.recipe.add_new_ingredient(recipe, item_in) + local item = thxbob.lib.item.ingredient(item_in) + if + type(recipe) == "string" + and data.raw.recipe[recipe] + and item + and type(item) == "table" + and thxbob.lib.item.get_type(item.name) + then if data.raw.recipe[recipe].ingredients then - thxbob.lib.item.add(data.raw.recipe[recipe].ingredients, thxbob.lib.item.basic_item(item)) + thxbob.lib.item.add_new(data.raw.recipe[recipe].ingredients, item) end - else - if not data.raw.recipe[recipe] then - BioInd.writeDebug("Recipe %s does not exist.", {recipe}) - end - if not thxbob.lib.item.get_basic_type(thxbob.lib.item.basic_item(item).name) then - BioInd.writeDebug("Ingredient %s does not exist.", {thxbob.lib.item.basic_item(item).name}) + if not (type(recipe) == "string" and data.raw.recipe[recipe]) then + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) end end end -function thxbob.lib.recipe.set_ingredient(recipe, item) - if data.raw.recipe[recipe] and thxbob.lib.item.get_type(thxbob.lib.item.basic_item(item).name) then +function thxbob.lib.recipe.add_ingredient(recipe, item_in) + local item = thxbob.lib.item.ingredient(item_in) + if + type(recipe) == "string" + and data.raw.recipe[recipe] + and item + and type(item) == "table" + and thxbob.lib.item.get_type(item.name) + then if data.raw.recipe[recipe].ingredients then - thxbob.lib.item.set(data.raw.recipe[recipe].ingredients, thxbob.lib.item.basic_item(item)) + thxbob.lib.item.add(data.raw.recipe[recipe].ingredients, item) end - else - if not data.raw.recipe[recipe] then - BioInd.writeDebug("Recipe %s does not exist.", {recipe}) - end - if not thxbob.lib.item.get_basic_type(thxbob.lib.item.basic_item(item).name) then - BioInd.writeDebug("Ingredient %s does not exist.", {thxbob.lib.item.basic_item(item).name}) + if not (type(recipe) == "string" and data.raw.recipe[recipe]) then + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) end end end +function thxbob.lib.recipe.add_ingredients(recipe, ingredients) + if type(recipe) == "string" and data.raw.recipe[recipe] and type(ingredients) == "table" then + for i, ingredient in pairs(ingredients) do + thxbob.lib.recipe.add_ingredient(recipe, ingredient) + end + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) + end +end -function thxbob.lib.recipe.add_result(recipe, item) - if data.raw.recipe[recipe] and thxbob.lib.item.get_type(thxbob.lib.item.basic_item(item).name) then - if data.raw.recipe[recipe].result or data.raw.recipe[recipe].results then - thxbob.lib.result_check(data.raw.recipe[recipe]) +function thxbob.lib.recipe.set_ingredient(recipe, item_in) + local item = thxbob.lib.item.ingredient(item_in) + if + type(recipe) == "string" + and data.raw.recipe[recipe] + and item + and type(item) == "table" + and thxbob.lib.item.get_type(item.name) + then + if data.raw.recipe[recipe].ingredients then + thxbob.lib.item.set(data.raw.recipe[recipe].ingredients, item) + end + else + if not (type(recipe) == "string" and data.raw.recipe[recipe]) then + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) + end + end +end + +function thxbob.lib.recipe.set_ingredients(recipe, ingredients) + if type(recipe) == "string" and data.raw.recipe[recipe] and type(ingredients) == "table" then + thxbob.lib.recipe.clear_ingredients(recipe) + thxbob.lib.recipe.add_ingredients(recipe, ingredients) + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) + end +end + +function thxbob.lib.recipe.add_result(recipe, item_in) + local item = thxbob.lib.item.result(item_in) + if + type(recipe) == "string" + and data.raw.recipe[recipe] + and item + and type(item) == "table" + and thxbob.lib.item.get_type(item.name) + then + if data.raw.recipe[recipe].results then thxbob.lib.item.add(data.raw.recipe[recipe].results, item) end - else - if not data.raw.recipe[recipe] then - BioInd.writeDebug("Recipe %s does not exist.", {recipe}) - end - if not thxbob.lib.item.get_basic_type(thxbob.lib.item.basic_item(item).name) then - BioInd.writeDebug("Item %s does not exist.", {thxbob.lib.item.basic_item(item).name}) + if not (type(recipe) == "string" and data.raw.recipe[recipe]) then + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) end end end -function thxbob.lib.recipe.set_result(recipe, item) - if data.raw.recipe[recipe] and thxbob.lib.item.get_type(thxbob.lib.item.basic_item(item).name) then - if data.raw.recipe[recipe].result or data.raw.recipe[recipe].results then - thxbob.lib.result_check(data.raw.recipe[recipe]) +function thxbob.lib.recipe.set_result(recipe, item_in) + local item = thxbob.lib.item.result(item_in) + if + type(recipe) == "string" + and data.raw.recipe[recipe] + and item + and type(item) == "table" + and thxbob.lib.item.get_type(item.name) + then + if data.raw.recipe[recipe].results then thxbob.lib.item.set(data.raw.recipe[recipe].results, item) end - else - if not data.raw.recipe[recipe] then - BioInd.writeDebug("Recipe %s does not exist.", {recipe}) - end - if not thxbob.lib.item.get_basic_type(thxbob.lib.item.basic_item(item).name) then - BioInd.writeDebug("Item %s does not exist.", {thxbob.lib.item.basic_item(item).name}) + if not (type(recipe) == "string" and data.raw.recipe[recipe]) then + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) end end end function thxbob.lib.recipe.remove_result(recipe, item) -local f_name = "remove_result" -BioInd.writeDebug("Entered function %s(%s, %s)", {f_name, recipe, item}) - if data.raw.recipe[recipe] then - if data.raw.recipe[recipe].result or data.raw.recipe[recipe].results then - thxbob.lib.result_check(data.raw.recipe[recipe]) + if type(recipe) == "string" and type(item) == "string" and data.raw.recipe[recipe] then + if data.raw.recipe[recipe].results then thxbob.lib.item.remove(data.raw.recipe[recipe].results, item) end - else - BioInd.writeDebug("Recipe %s does not exist.", {recipe}) + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) + thxbob.lib.error.item(item) end -end \ No newline at end of file +end + +function thxbob.lib.recipe.enabled(recipe, bool) + if type(recipe) == "string" and type(bool) == "boolean" and data.raw.recipe[recipe] then + data.raw.recipe[recipe].enabled = bool or false + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) + if not (type(bool) == "boolean") then + log("Variable Bool is missing or not of type Boolean") + end + end +end + +function thxbob.lib.recipe.hide(recipe) + if type(recipe) == "string" and data.raw.recipe[recipe] then + local prototype = data.raw.recipe[recipe] + prototype.hidden = true + prototype.enabled = false + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) + end +end + +function thxbob.lib.recipe.set_energy_required(recipe, time) + if type(recipe) == "string" and type(time) == "number" and data.raw.recipe[recipe] then + data.raw.recipe[recipe].energy_required = time + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) + if not (type(time) == "number") then + log("Variable Time is missing or not of type Number") + end + end +end + +local function duplicate_ingredient_check(recipe_name, ingredients) + local new_ingredients = {} + local items = {} + local rebuild = false + for i, ingredient in ipairs(ingredients) do + local item = thxbob.lib.item.ingredient(ingredient) + if item then -- duplicate value + if items[item.name] then + rebuild = true + log("Duplicate item " .. item.name .. " found on recipe " .. recipe_name .. ".") + else + items[item.name] = true + thxbob.lib.item.add(new_ingredients, ingredient) + end + else --invalid value + rebuild = true + log("Invalid item found on recipe " .. recipe_name .. ".") + end + end + if rebuild == true then + return new_ingredients + end +end + +local function duplicate_ingredient_check_full(recipe) + if type(recipe) == "string" and data.raw.recipe[recipe] then + if data.raw.recipe[recipe].ingredients then + local ingredients = duplicate_ingredient_check(recipe, data.raw.recipe[recipe].ingredients) + if ingredients then + data.raw.recipe[recipe].ingredients = ingredients + end + end + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe) + end +end + +function thxbob.lib.recipe.ingredients_cleanup() + log("Running recipe ingredients cleanup...") + for recipe_name, recipe in pairs(data.raw.recipe) do + duplicate_ingredient_check_full(recipe_name) + end +end + +function thxbob.lib.recipe.set_subgroup(recipe_name, subgroup) + if type(recipe_name) == "string" and type(subgroup) == "string" then + local recipe = data.raw.recipe[recipe_name] + if recipe then + recipe.subgroup = subgroup + end + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe_name) + end +end + +function thxbob.lib.recipe.set_category(recipe_name, category) + if type(recipe_name) == "string" and type(category) == "string" then + local recipe = data.raw.recipe[recipe_name] + if recipe then + recipe.category = category + end + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe_name) + end +end + +function thxbob.lib.recipe.allow_productivity(recipe_name) + if type(recipe_name) == "string" then + local recipe = data.raw.recipe[recipe_name] + if recipe then + recipe.allow_productivity = true + end + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe_name) + end +end + +function thxbob.lib.recipe.disallow_productivity(recipe_name) + if type(recipe_name) == "string" then + local recipe = data.raw.recipe[recipe_name] + if recipe then + recipe.allow_productivity = false + end + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe_name) + end +end + +function thxbob.lib.recipe.add_additional_category(recipe_name, category_name) + local recipe = data.raw.recipe[recipe_name] + local category = data.raw["recipe-category"][category_name] + if recipe and category then + recipe.additional_categories = recipe.additional_categories or {} + thxbob.lib.safe_insert(recipe.additional_categories, category_name) + end +end + +if mods["quality"] then + function thxbob.lib.recipe.update_recycling_recipe_icon(recipe_name, icon_name, size) + --Does not handle multiple icons + local target_recipe = data.raw.recipe[recipe_name] + local image_size = size or 64 + if type(icon_name) == "string" then + if target_recipe then + target_recipe.icons[2].icon = icon_name + target_recipe.icons[2].icon_size = image_size + target_recipe.icons[2].scale = 0.4 / (image_size / 64) + else + log(debug.traceback()) + log("Recycling recipe " .. recipe_name .. " not found") + end + else + log(debug.traceback()) + log("Invalid icon input") + end + end + + function thxbob.lib.recipe.update_recycling_recipe_single(recipe_name, replace_icon) + --Requires that the target recycling recipe's prefix is the same as the source used for recipe_name + if type(recipe_name) == "string" then + local target_recipe_name = recipe_name .. "-recycling" + local source_recipe = data.raw.recipe[recipe_name] + local target_recipe = data.raw.recipe[target_recipe_name] + if source_recipe then + if target_recipe then + local new_time = source_recipe.energy_required or 0.5 + target_recipe.energy_required = new_time / 16 + target_recipe.results = {} + local source_output_amount = 1 + for i, source_results in pairs(source_recipe.results) do + if source_results.name == recipe_name then + source_output_amount = source_results.amount + end + end + for i, outputs in pairs(source_recipe.ingredients) do + if source_recipe.ingredients[i].type == "item" then + table.insert(target_recipe.results, { + type = "item", + name = source_recipe.ingredients[i].name, + amount = source_recipe.ingredients[i].amount / source_output_amount / 4, + extra_count_fraction = source_recipe.ingredients[i].amount / source_output_amount % 4 / 4, + }) + end + end + + --Tries to find replacement icon if item of same name exists. If not, icon replacement will have do be done manually if desired. + if replace_icon == true then + local item_type = thxbob.lib.item.get_type(recipe_name) + local recipe_icon = target_recipe.icons[2].icon + local recipe_icon_size = target_recipe.icons[2].icon_size or 64 + if item_type and data.raw[item_type][recipe_name] then + if data.raw[item_type][recipe_name].icon then + recipe_icon = data.raw[item_type][recipe_name].icon + recipe_icon_size = data.raw[item_type][recipe_name].icon_size or 64 + thxbob.lib.recipe.update_recycling_recipe_icon(target_recipe_name, recipe_icon, recipe_icon_size) + elseif data.raw[item_type][recipe_name].icons then + target_recipe.icons = { { icon = "__quality__/graphics/icons/recycling.png" } } + for i, icon_replacement in pairs(data.raw[item_type][recipe_name].icons) do + local image_size = icon_replacement.icon_size or 64 + local image_scale = icon_replacement.scale or 1 + table.insert(target_recipe.icons, { + icon = icon_replacement.icon, + icon_size = image_size, + scale = 0.4 * image_scale / (image_size / 64), + shift = util.mul_shift(icon_replacement.shift, 0.8), + tint = icon_replacement.tint, + }) + end + table.insert(target_recipe.icons, { icon = "__quality__/graphics/icons/recycling-top.png" }) + end + end + end + else + log(debug.traceback()) + log("Recycling recipe " .. target_recipe_name .. " not found") + end + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe_name) + end + else + log(debug.traceback()) + thxbob.lib.error.recipe(recipe_name) + end + end + + function thxbob.lib.recipe.update_recycling_recipe(recipe_name) + if type(recipe_name) == "string" then + thxbob.lib.recipe.update_recycling_recipe_single(recipe_name, true) + end + if type(recipe_name) == "table" then + for i, single_recipe in pairs(recipe_name) do + thxbob.lib.recipe.update_recycling_recipe_single(single_recipe, true) + end + end + end + + function thxbob.lib.recipe.update_recycling_recipe_from_recipe(recycling_recipe, desired_recipe, replace_icon) + if + type(recycling_recipe) == "string" + and data.raw.recipe[recycling_recipe] + and string.sub(data.raw.recipe[recycling_recipe].name, -10) == "-recycling" + then + if type(desired_recipe) == "string" and data.raw.recipe[desired_recipe] then + local item_name = string.sub(recycling_recipe, 1, -11) + local target_recipe = data.raw.recipe[recycling_recipe] + local source_recipe = data.raw.recipe[desired_recipe] + local new_time = source_recipe.energy_required or 0.5 + target_recipe.energy_required = new_time / 16 + target_recipe.results = {} + local source_output_amount = 1 + for i, source_results in pairs(source_recipe.results) do + if source_results.name == item_name then + source_output_amount = source_results.amount + end + end + for i, outputs in pairs(source_recipe.ingredients) do + if source_recipe.ingredients[i].type == "item" then + table.insert(target_recipe.results, { + type = "item", + name = source_recipe.ingredients[i].name, + amount = source_recipe.ingredients[i].amount / source_output_amount / 4, + extra_count_fraction = source_recipe.ingredients[i].amount / source_output_amount % 4 / 4, + }) + end + end + + if replace_icon == true then + local item_type = thxbob.lib.item.get_type(item_name) + local recipe_icon = target_recipe.icons[2].icon + local recipe_icon_size = target_recipe.icons[2].icon_size or 64 + if item_type and data.raw[item_type][item_name] then + if data.raw[item_type][item_name].icon then + recipe_icon = data.raw[item_type][item_name].icon + recipe_icon_size = data.raw[item_type][item_name].icon_size or 64 + thxbob.lib.recipe.update_recycling_recipe_icon(recycling_recipe, recipe_icon, recipe_icon_size) + elseif data.raw[item_type][item_name].icons then + target_recipe.icons = { { icon = "__quality__/graphics/icons/recycling.png" } } + for i, icon_replacement in pairs(data.raw[item_type][item_name].icons) do + local image_size = icon_replacement.icon_size or 64 + local image_scale = icon_replacement.scale or 1 + table.insert(target_recipe.icons, { + icon = icon_replacement.icon, + icon_size = image_size, + scale = 0.4 * image_scale / (image_size / 64), + shift = util.mul_shift(icon_replacement.shift, 0.8), + tint = icon_replacement.tint, + }) + end + table.insert(target_recipe.icons, { icon = "__quality__/graphics/icons/recycling-top.png" }) + end + end + end + else + log(debug.traceback()) + thxbob.lib.error.recipe(desired_recipe) + end + else + log(debug.traceback()) + thxbob.lib.error.recipe(recycling_recipe) + end + end +else + function thxbob.lib.recipe.update_recycling_recipe_icon() + log(debug.traceback()) + log("Improper function call. Cannot update recycling without Quality mod.") + end + + function thxbob.lib.recipe.update_recycling_recipe_single() + log(debug.traceback()) + log("Improper function call. Cannot update recycling without Quality mod.") + end + + function thxbob.lib.recipe.update_recycling_recipe() + log(debug.traceback()) + log("Improper function call. Cannot update recycling without Quality mod.") + end + + function thxbob.lib.recipe.update_recycling_recipe_to_self_recipe() + log(debug.traceback()) + log("Improper function call. Cannot update recycling without Quality mod.") + end + + function thxbob.lib.recipe.update_recycling_recipe_from_recipe() + log(debug.traceback()) + log("Improper function call. Cannot update recycling without Quality mod.") + end +end diff --git a/Bio_Industries_2/libs/technology-functions.lua b/Bio_Industries_2/libs/technology-functions.lua index e388125..6503489 100644 --- a/Bio_Industries_2/libs/technology-functions.lua +++ b/Bio_Industries_2/libs/technology-functions.lua @@ -1,173 +1,419 @@ local BioInd = require('common')('Bio_Industries_2') -if not thxbob.lib.tech then thxbob.lib.tech = {} end +if not thxbob.lib.tech then + thxbob.lib.tech = {} +end - -function thxbob.lib.tech.replace_science_pack(technology, old, new) - if data.raw.technology[technology] and data.raw.tool[new] then - local doit = false - local amount = 0 - for i, ingredient in pairs(data.raw.technology[technology].unit.ingredients) do - if ingredient[1] == old then - doit = true - amount = ingredient[2] + amount - end - if ingredient.name == old then - doit = true - amount = ingredient.amount + amount +local function add_new_science_pack(technology, pack, amount) + if technology.unit and technology.unit.ingredients then + local addit = true + for i, ingredient in pairs(technology.unit.ingredients) do + if ingredient[1] == pack then + addit = false end end - if doit then - thxbob.lib.tech.remove_science_pack(technology, old) - thxbob.lib.tech.add_science_pack(technology, new, amount) - end - else - if not data.raw.technology[technology] then - BioInd.writeDebug("Technology %s does not exist.", {technology}) - end - if not data.raw.tool[new] then - BioInd.writeDebug("Science pack %s does not exist.", {new}) + if addit then + table.insert(technology.unit.ingredients, { pack, amount }) end end end -function thxbob.lib.tech.add_new_science_pack(technology, pack, amount) - if data.raw.technology[technology] and data.raw.tool[pack] then +local function add_science_pack(technology, pack, amount) + if technology.unit and technology.unit.ingredients then local addit = true - for i, ingredient in pairs(data.raw.technology[technology].unit.ingredients) do - if ingredient[1] == pack or ingredient.name == pack then addit = false end - end - if addit then table.insert(data.raw.technology[technology].unit.ingredients, {pack, amount}) end - else - if not data.raw.technology[technology] then - BioInd.writeDebug("Technology %s does not exist.", {technology}) - end - if not data.raw.tool[pack] then - BioInd.writeDebug("Science pack %s does not exist.", {pack}) - end - end -end - -function thxbob.lib.tech.add_science_pack(technology, pack, amount) - if data.raw.technology[technology] and data.raw.tool[pack] then - local addit = true - for i, ingredient in pairs(data.raw.technology[technology].unit.ingredients) do + for i, ingredient in pairs(technology.unit.ingredients) do if ingredient[1] == pack then addit = false ingredient[2] = ingredient[2] + amount end - if ingredient.name == pack then - addit = false - ingredient.amount = ingredient.amount + amount - end end if addit then - table.insert(data.raw.technology[technology].unit.ingredients, {pack, amount}) + table.insert(technology.unit.ingredients, { pack, amount }) + end + end +end + +local function remove_science_pack(technology, pack) + if technology.unit and technology.unit.ingredients then + for i, ingredient in pairs(technology.unit.ingredients) do + if ingredient[1] == pack then + table.remove(technology.unit.ingredients, i) + end + end + end +end + +local function replace_science_pack(technology, old, new) + if technology.unit and technology.unit.ingredients then + local doit = false + local amount = 0 + for i, ingredient in pairs(technology.unit.ingredients) do + if ingredient[1] == old then + doit = true + amount = ingredient[2] + amount + end + end + if doit then + remove_science_pack(technology, old) + add_science_pack(technology, new, amount) + end + end +end + +function thxbob.lib.tech.replace_science_pack(technology, old, new) + if + type(technology) == "string" + and type(old) == "string" + and type(new) == "string" + and data.raw.technology[technology] + -- data.raw.tool[old] and + and data.raw.tool[new] + then + if data.raw.technology[technology].unit then + replace_science_pack(data.raw.technology[technology], old, new) end else - if not data.raw.technology[technology] then - BioInd.writeDebug("Technology " .. tostring(technology) .. " does not exist.") + log(debug.traceback()) + thxbob.lib.error.technology(technology) + thxbob.lib.error.item_of_type(old, "tool", "Old science pack") + thxbob.lib.error.item_of_type(new, "tool", "New science pack") + end +end + +function thxbob.lib.tech.add_new_science_pack(technology, pack, amount) + if + type(technology) == "string" + and type(pack) == "string" + and type(amount) == "number" + and data.raw.technology[technology] + and data.raw.tool[pack] + then + if data.raw.technology[technology].unit then + add_new_science_pack(data.raw.technology[technology], pack, amount) end - if not data.raw.tool[pack] then - BioInd.writeDebug("Science pack %s does not exist.", {pack}) + else + log(debug.traceback()) + thxbob.lib.error.technology(technology) + thxbob.lib.error.item_of_type(pack, "tool", "Science pack") + end +end + +function thxbob.lib.tech.add_science_pack(technology, pack, amount) + if + type(technology) == "string" + and type(pack) == "string" + and type(amount) == "number" + and data.raw.technology[technology] + and data.raw.tool[pack] + then + if data.raw.technology[technology].unit then + add_science_pack(data.raw.technology[technology], pack, amount) end + else + log(debug.traceback()) + thxbob.lib.error.technology(technology) + thxbob.lib.error.item_of_type(pack, "tool", "Science pack") + end +end + +function thxbob.lib.tech.add_science_packs(technology, science_packs) + if type(technology) == "string" and type(science_packs) == "table" then + for i, science_pack in pairs(science_packs) do + if + type(science_pack) == "table" + and type(science_pack[1]) == "string" + and data.raw.tool[science_pack[1]] + and type(science_pack[2]) == "number" + then + thxbob.lib.tech.add_science_pack(technology, science_pack[1], science_pack[2]) + end + end + else + log(debug.traceback()) + thxbob.lib.error.technology(technology) end end function thxbob.lib.tech.remove_science_pack(technology, pack) - if data.raw.technology[technology] then - for i, ingredient in pairs(data.raw.technology[technology].unit.ingredients) do - if ingredient[1] == pack or ingredient.name == pack then - table.remove(data.raw.technology[technology].unit.ingredients, i) - end + if type(technology) == "string" and type(pack) == "string" and data.raw.technology[technology] then + if data.raw.technology[technology].unit then + remove_science_pack(data.raw.technology[technology], pack) end else - BioInd.writeDebug("Technology %s does not exist.", {technology}) + log(debug.traceback()) + thxbob.lib.error.technology(technology) end end +function thxbob.lib.tech.clear_science_packs(technology) + if type(technology) == "string" and data.raw.technology[technology] then + if data.raw.technology[technology].unit then + data.raw.technology[technology].unit.ingredients = {} + end + else + log(debug.traceback()) + thxbob.lib.error.technology(technology) + end +end + +function thxbob.lib.tech.set_science_packs(technology, science_packs) + if type(technology) == "string" and data.raw.technology[technology] and type(science_packs) == "table" then + thxbob.lib.tech.clear_science_packs(technology) + thxbob.lib.tech.add_science_packs(technology, science_packs) + else + log(debug.traceback()) + thxbob.lib.error.technology(technology) + end +end + +function thxbob.lib.tech.set_science_pack_count(technology, count) + if type(technology) == "string" and data.raw.technology[technology] then + local prototype = data.raw.technology[technology] + if prototype.unit then + prototype.unit.count = count + end + else + log(debug.traceback()) + thxbob.lib.error.technology(technology) + end +end + +local function has_recipe_unlock(technology, recipe) + if technology.effects then + for i, effect in pairs(technology.effects) do + if effect.type == "unlock-recipe" and effect.recipe == recipe then + return true + end + end + end + return false +end + +local function add_recipe_unlock(technology, recipe) + local addit = true + if not technology.effects then + technology.effects = {} + end + for i, effect in pairs(technology.effects) do + if effect.type == "unlock-recipe" and effect.recipe == recipe then + addit = false + end + end + if addit then + table.insert(technology.effects, { type = "unlock-recipe", recipe = recipe }) + end +end + +local function remove_recipe_unlock(technology, recipe) + if technology.effects then + for i, effect in pairs(technology.effects) do + if effect.type == "unlock-recipe" and effect.recipe == recipe then + table.remove(technology.effects, i) + end + end + end +end + +function thxbob.lib.tech.has_recipe_unlock(technology, recipe) + if + type(technology) == "string" + and type(recipe) == "string" + and data.raw.technology[technology] + and data.raw.recipe[recipe] + then + local hasit = false + hasit = has_recipe_unlock(data.raw.technology[technology], recipe) + + return hasit + else + log(debug.traceback()) + thxbob.lib.error.technology(technology) + thxbob.lib.error.recipe(recipe) + return false + end +end function thxbob.lib.tech.add_recipe_unlock(technology, recipe) - if data.raw.technology[technology] and data.raw.recipe[recipe] then - local addit = true - if not data.raw.technology[technology].effects then - data.raw.technology[technology].effects = {} - end - for i, effect in pairs(data.raw.technology[technology].effects) do - if effect.type == "unlock-recipe" and effect.recipe == recipe then addit = false end - end - if addit then table.insert(data.raw.technology[technology].effects, {type = "unlock-recipe", recipe = recipe}) end + if + type(technology) == "string" + and type(recipe) == "string" + and data.raw.technology[technology] + and data.raw.recipe[recipe] + then + add_recipe_unlock(data.raw.technology[technology], recipe) else - if not data.raw.technology[technology] then - BioInd.writeDebug("Technology %s does not exist.", {technology}) - end - if not data.raw.recipe[recipe] then - BioInd.writeDebug("Recipe %s does not exist.", {recipe}) - end + log(debug.traceback()) + thxbob.lib.error.technology(technology) + thxbob.lib.error.recipe(recipe) end end function thxbob.lib.tech.remove_recipe_unlock(technology, recipe) - if data.raw.technology[technology] and data.raw.technology[technology].effects then - for i, effect in pairs(data.raw.technology[technology].effects) do - if effect.type == "unlock-recipe" and effect.recipe == recipe then - table.remove(data.raw.technology[technology].effects, i) + if + type(technology) == "string" + and type(recipe) == "string" + and data.raw.technology[technology] + -- data.raw.recipe[recipe] --don't check to see if something we're removing exists. + then + remove_recipe_unlock(data.raw.technology[technology], recipe) + else + log(debug.traceback()) + thxbob.lib.error.technology(technology) + thxbob.lib.error.recipe(recipe) + end +end + +local function add_prerequisite(technology, prerequisite) + local addit = true + if technology.prerequisites then + for i, check in ipairs(technology.prerequisites) do + if check == prerequisite then + addit = false end end else - if not data.raw.technology[technology] then - BioInd.writeDebug("Technology %s does not exist.", {technology}) + technology.prerequisites = {} + end + if addit then + table.insert(technology.prerequisites, prerequisite) + end +end + +local function remove_prerequisite(technology, prerequisite) + if technology.prerequisites then + for i, check in ipairs(technology.prerequisites) do + if check == prerequisite then + table.remove(technology.prerequisites, i) + end + end + end +end + +local function replace_prerequisite(technology, old, new) + if technology.prerequisites then + for i, prerequisite in ipairs(technology.prerequisites) do + if prerequisite == old then + remove_prerequisite(technology, old) + add_prerequisite(technology, new) + end end end end function thxbob.lib.tech.replace_prerequisite(technology, old, new) - if data.raw.technology[technology] and data.raw.technology[new] then - for i, prerequisite in ipairs(data.raw.technology[technology].prerequisites) do - if prerequisite == old then - thxbob.lib.tech.remove_prerequisite(technology, old) - thxbob.lib.tech.add_prerequisite(technology, new) - end - end + if + type(technology) == "string" + and type(old) == "string" + and type(new) == "string" + and data.raw.technology[technology] + -- data.raw.technology[old] and + and data.raw.technology[new] + then + replace_prerequisite(data.raw.technology[technology], old, new) else - if not data.raw.technology[technology] then - BioInd.writeDebug("Technology %s does not exist.", {technology}) - end - if not data.raw.technology[new] then - BioInd.writeDebug("Technology %s does not exist.", {new}) - end + log(debug.traceback()) + thxbob.lib.error.technology(technology) + thxbob.lib.error.technology(old, "Old prerequisite", "Old prerequisite technology") + thxbob.lib.error.technology(new, "New prerequisite", "New prerequisite technology") end end function thxbob.lib.tech.add_prerequisite(technology, prerequisite) - if data.raw.technology[technology] and data.raw.technology[prerequisite] then - local addit = true - if data.raw.technology[technology].prerequisites then - for i, check in ipairs(data.raw.technology[technology].prerequisites) do - if check == prerequisite then addit = false end - end - else - data.raw.technology[technology].prerequisites = {} - end - if addit then table.insert(data.raw.technology[technology].prerequisites, prerequisite) end + if + type(technology) == "string" + and type(prerequisite) == "string" + and data.raw.technology[technology] + and data.raw.technology[prerequisite] + then + add_prerequisite(data.raw.technology[technology], prerequisite) else - if not data.raw.technology[technology] then - BioInd.writeDebug("Technology %s does not exist.", {technology}) - end - if not data.raw.technology[prerequisite] then - BioInd.writeDebug("Technology %s does not exist.", {prerequisite}) - end + log(debug.traceback()) + thxbob.lib.error.technology(technology) + thxbob.lib.error.technology(prerequisite, "Prerequisite", "Prerequisite technology") end end function thxbob.lib.tech.remove_prerequisite(technology, prerequisite) - if data.raw.technology[technology] then - for i, check in ipairs(data.raw.technology[technology].prerequisites) do - if check == prerequisite then - table.remove(data.raw.technology[technology].prerequisites, i) + if + type(technology) == "string" + and type(prerequisite) == "string" + and data.raw.technology[technology] + -- data.raw.technology[prerequisite] + then + remove_prerequisite(data.raw.technology[technology], prerequisite) + else + log(debug.traceback()) + thxbob.lib.error.technology(technology) + thxbob.lib.error.technology(prerequisite, "Prerequisite", "Prerequisite technology") + end +end + +function thxbob.lib.tech.hide(technology_name) + if type(technology_name) == "string" and data.raw.technology[technology_name] then + local technology = data.raw.technology[technology_name] + technology.hidden = true + technology.enabled = false + else + log(debug.traceback()) + thxbob.lib.error.technology(technology_name) + end +end + +function thxbob.lib.tech.ignore_tech_cost_multiplier(technology_name, ignore) + if type(technology_name) == "string" and type(ignore) == "boolean" then + local technology = data.raw.technology[technology_name] + if technology then + technology.ignore_tech_cost_multiplier = ignore + end + else + log(debug.traceback()) + thxbob.lib.error.technology(technology_name) + end +end + +function thxbob.lib.tech.technology_icon_constant(technology_icon, constant_icon, x, y) + local scale = 0.5 + local xshift = x or 64 + local yshift = y or 64 + if type(technology_icon) == "table" and technology_icon.icon and technology_icon.icon_size then + local icons = { + technology_icon, + { + icon = constant_icon, + icon_size = 128, + scale = scale, + shift = { xshift * scale, yshift * scale }, + }, + } + return icons + else + log(debug.traceback()) + log(technology_icon .. " not given in required table format") + end +end + +function thxbob.lib.tech.technology_line_icon_constant(technology_line, first, last, technology_icon, constant_icon) + local scale = 0.5 + if type(technology_icon) == "table" and technology_icon.icon and technology_icon.icon_size then + for i = first, last do + local tech_name = technology_line .. "-" .. i + if data.raw.technology[tech_name] then + data.raw.technology[tech_name].icons = { + technology_icon, + { + icon = constant_icon, + icon_size = 128, + scale = scale, + shift = { 64 * scale, 64 * scale }, + }, + } + else + log(debug.traceback()) + thxbob.lib.error.technology(tech_name) end end else - BioInd.writeDebug("Technology %s does not exist.", {technology}) + log(debug.traceback()) + log(technology_icon .. " not given in required table format") end end diff --git a/Bio_Industries_2/prototypes/Bio_Farm/compatible_recipes.lua b/Bio_Industries_2/prototypes/Bio_Farm/compatible_recipes.lua index c96cefe..a172683 100644 --- a/Bio_Industries_2/prototypes/Bio_Farm/compatible_recipes.lua +++ b/Bio_Industries_2/prototypes/Bio_Farm/compatible_recipes.lua @@ -144,8 +144,8 @@ if data.raw.item["solid-carbon"] and mods["angelspetrochem"] then data.raw.recipe["bi-pellet-coke"].icon = ICONPATH_BA .. "pellet_coke_c.png" data.raw.recipe["bi-pellet-coke"].icon_size = 64 thxbob.lib.tech.add_recipe_unlock("bi-tech-coal-processing-2", "bi-pellet-coke-2") -elseif data.raw.item["carbon"] and mods["bobplates"] then - thxbob.lib.recipe.add_new_ingredient ("bi-pellet-coke-2", {type = "item", name = "carbon", amount = 10}) +elseif data.raw.item["bob-carbon"] and mods["bobplates"] then + thxbob.lib.recipe.add_new_ingredient ("bi-pellet-coke-2", {type = "item", name = "bob-carbon", amount = 10}) data.raw.recipe["bi-coke-coal"].icon = ICONPATH_BA .. "pellet_coke_1.png" data.raw.recipe["bi-coke-coal"].icon_size = 64 data.raw.recipe["bi-pellet-coke-2"].icon = ICONPATH_BA .. "pellet_coke_b.png" @@ -178,10 +178,10 @@ if data.raw.item["solid-sodium-hydroxide"] and mods["angelspetrochem"] then data.raw.recipe["bi-fertilizer-2"].icon = ICONPATH_BA .. "fertilizer_solid_sodium_hydroxide.png" data.raw.recipe["bi-fertilizer-2"].icon_size = 64 thxbob.lib.tech.add_recipe_unlock("bi-tech-fertilizer", "bi-fertilizer-2") -elseif data.raw.item["sodium-hydroxide"] and mods["bobplates"] then +elseif data.raw.item["bob-sodium-hydroxide"] and mods["bobplates"] then thxbob.lib.recipe.add_new_ingredient("bi-fertilizer-2", { type = "item", - name = "sodium-hydroxide", + name = "bob-sodium-hydroxide", amount = 10 }) thxbob.lib.tech.add_recipe_unlock("bi-tech-fertilizer", "bi-fertilizer-2") diff --git a/Bio_Industries_2/prototypes/Bio_Farm/item.lua b/Bio_Industries_2/prototypes/Bio_Farm/item.lua index 596f38d..94417fd 100644 --- a/Bio_Industries_2/prototypes/Bio_Farm/item.lua +++ b/Bio_Industries_2/prototypes/Bio_Farm/item.lua @@ -194,7 +194,7 @@ data:extend( subgroup = "bio-bio-farm-raw", order = "a[bi]-a-bx[bi-woodbrick]", fuel_category = "chemical", - fuel_value = "20MJ", + fuel_value = "160MJ", stack_size = 200, weight = 4 * kg, }, @@ -519,11 +519,11 @@ data:extend( { type = "item", name = "fertilizer", - icon = ICONPATH .. "fertilizer_64.png", + icon = ICONPATH .. "fertilizer.png", icon_size = 64, icons = { { - icon = ICONPATH .. "fertilizer_64.png", + icon = ICONPATH .. "fertilizer.png", icon_size = 64, } }, @@ -537,11 +537,11 @@ data:extend( { type = "item", name = "bi-adv-fertilizer", - icon = ICONPATH .. "advanced_fertilizer_64.png", + icon = ICONPATH .. "fertilizer_advanced.png", icon_size = 64, icons = { { - icon = ICONPATH .. "advanced_fertilizer_64.png", + icon = ICONPATH .. "fertilizer_advanced.png", icon_size = 64, } }, diff --git a/Bio_Industries_2/prototypes/Bio_Farm/recipe.lua b/Bio_Industries_2/prototypes/Bio_Farm/recipe.lua index 078d23f..12c997b 100644 --- a/Bio_Industries_2/prototypes/Bio_Farm/recipe.lua +++ b/Bio_Industries_2/prototypes/Bio_Farm/recipe.lua @@ -27,10 +27,11 @@ data:extend({ { type = "item", name = "wood", amount = 20 }, }, results = { - { type = "item", name = "bi-seed", amount = 40 }, + { type = "item", name = "bi-seed", amount_min = 30, amount_max = 50 }, }, main_product = "", enabled = false, + allow_productivity = true, always_show_made_in = true, allow_decomposition = false, subgroup = "bio-bio-farm-fluid-1", @@ -61,10 +62,11 @@ data:extend({ { type = "item", name = "bi-ash", amount = 10 }, }, results = { - { type = "item", name = "bi-seed", amount = 50 }, + { type = "item", name = "bi-seed", amount_min = 40, amount_max = 60 }, }, main_product = "", enabled = false, + allow_productivity = true, always_show_made_in = true, allow_decomposition = false, subgroup = "bio-bio-farm-fluid-1", @@ -95,10 +97,11 @@ data:extend({ { type = "item", name = "fertilizer", amount = 10 }, }, results = { - { type = "item", name = "bi-seed", amount = 60 }, + { type = "item", name = "bi-seed", amount_min = 50, amount_max = 70 }, }, main_product = "", enabled = false, + allow_productivity = true, always_show_made_in = true, allow_decomposition = false, subgroup = "bio-bio-farm-fluid-1", @@ -129,10 +132,11 @@ data:extend({ { type = "fluid", name = "water", amount = 40 }, }, results = { - { type = "item", name = "bi-seed", amount = 80 }, + { type = "item", name = "bi-seed", amount_min = 60, amount_max = 100 }, }, main_product = "", enabled = false, + allow_productivity = true, always_show_made_in = true, allow_decomposition = false, subgroup = "bio-bio-farm-fluid-1", @@ -158,14 +162,14 @@ data:extend({ category = "biofarm-mod-greenhouse", energy_required = 400, ingredients = { - { type = "item", name = "bi-seed", amount = 20 }, { type = "fluid", name = "water", amount = 100 }, }, results = { - { type = "item", name = "seedling", amount = 40 }, + { type = "item", name = "seedling", amount_min = 25, amount_max = 55 }, }, main_product = "", enabled = false, + allow_productivity = true, always_show_made_in = true, allow_decomposition = false, subgroup = "bio-bio-farm-fluid-2", @@ -196,10 +200,11 @@ data:extend({ { type = "fluid", name = "water", amount = 100 }, }, results = { - { type = "item", name = "seedling", amount = 60 }, + { type = "item", name = "seedling", amount_min = 45, amount_max = 75 }, }, main_product = "", enabled = false, + allow_productivity = true, always_show_made_in = true, allow_decomposition = false, subgroup = "bio-bio-farm-fluid-2", @@ -230,10 +235,11 @@ data:extend({ { type = "fluid", name = "water", amount = 100 }, }, results = { - { type = "item", name = "seedling", amount = 90 }, + { type = "item", name = "seedling", amount_min = 75, amount_max = 105 }, }, main_product = "", enabled = false, + allow_productivity = true, always_show_made_in = true, subgroup = "bio-bio-farm-fluid-2", order = "b[bi]-ssw-b1[bi-Seedling_Mk3]", @@ -263,10 +269,11 @@ data:extend({ { type = "item", name = "bi-adv-fertilizer", amount = 10 }, }, results = { - { type = "item", name = "seedling", amount = 160 }, + { type = "item", name = "seedling", amount_min = 140, amount_max = 180 }, }, main_product = "", enabled = false, + allow_productivity = true, always_show_made_in = true, allow_decomposition = false, subgroup = "bio-bio-farm-fluid-2", @@ -291,6 +298,7 @@ data:extend({ }, category = "biofarm-mod-farm", enabled = false, + allow_productivity = true, always_show_made_in = true, allow_decomposition = false, energy_required = 400, @@ -299,10 +307,10 @@ data:extend({ { type = "fluid", name = "water", amount = 100 }, }, results = { - { type = "item", name = "wood", amount = 40 }, - { type = "item", name = "bi-woodpulp", amount = 80 }, + { type = "item", name = "wood", amount_min = 25, amount_max = 55 }, + { type = "item", name = "bi-woodpulp", amount_min = 65, amount_max = 95 }, }, - main_product = "", + main_product = "wood", subgroup = "bio-bio-farm-fluid-3", order = "c[bi]-ssw-c1[raw-wood1]", -- This is a custom property for use by "Krastorio 2" (it will change @@ -325,6 +333,7 @@ data:extend({ }, category = "biofarm-mod-farm", enabled = false, + allow_productivity = true, always_show_made_in = true, allow_decomposition = false, energy_required = 360, @@ -334,10 +343,10 @@ data:extend({ { type = "fluid", name = "water", amount = 100 }, }, results = { - { type = "item", name = "wood", amount = 75 }, - { type = "item", name = "bi-woodpulp", amount = 150 }, + { type = "item", name = "wood", amount_min = 60, amount_max = 90 }, + { type = "item", name = "bi-woodpulp", amount_min = 135, amount_max = 165 }, }, - main_product = "", + main_product = "wood", subgroup = "bio-bio-farm-fluid-3", order = "c[bi]-ssw-c1[raw-wood2]", -- This is a custom property for use by "Krastorio 2" (it will change @@ -360,6 +369,7 @@ data:extend({ }, category = "biofarm-mod-farm", enabled = false, + allow_productivity = true, always_show_made_in = true, allow_decomposition = false, energy_required = 300, @@ -369,10 +379,10 @@ data:extend({ { type = "fluid", name = "water", amount = 100 }, }, results = { - { type = "item", name = "wood", amount = 135 }, - { type = "item", name = "bi-woodpulp", amount = 270 }, + { type = "item", name = "wood", amount_min = 120, amount_max = 150 }, + { type = "item", name = "bi-woodpulp", amount_min = 255, amount_max = 285 }, }, - main_product = "", + main_product = "wood", subgroup = "bio-bio-farm-fluid-3", order = "c[bi]-ssw-c1[raw-wood3]", -- This is a custom property for use by "Krastorio 2" (it will change @@ -395,6 +405,7 @@ data:extend({ }, category = "biofarm-mod-farm", enabled = false, + allow_productivity = true, always_show_made_in = true, allow_decomposition = false, energy_required = 100, @@ -404,10 +415,10 @@ data:extend({ { type = "item", name = "bi-adv-fertilizer", amount = 5 }, }, results = { - { type = "item", name = "wood", amount = 160 }, - { type = "item", name = "bi-woodpulp", amount = 320 }, + { type = "item", name = "wood", amount_min = 140, amount_max = 180 }, + { type = "item", name = "bi-woodpulp", amount_min = 300, amount_max = 340 }, }, - main_product = "", + main_product = "wood", subgroup = "bio-bio-farm-fluid-3", order = "c[bi]-ssw-c1[raw-wood4]", -- This is a custom property for use by "Krastorio 2" (it will change @@ -584,9 +595,9 @@ data:extend({ }, subgroup = "bio-bio-farm-raw", order = "a[bi]-a-bx[bi-4-woodbrick]", - energy_required = 2, - ingredients = { { type = "item", name = "bi-woodpulp", amount = 24 } }, - results = { { type = "item", name = "wood-bricks", amount = 1 } }, + energy_required = 8, + ingredients = { { type = "item", name = "bi-woodpulp", amount = 192 } }, + results = { { type = "item", name = "wood-bricks", amount = 6 } }, main_product = "", enabled = false, allow_as_intermediate = true, -- Changed for 0.18.34/1.1.4 @@ -1120,12 +1131,15 @@ data:extend({ results = { { type = "fluid", name = "nitrogen", amount = 20 }, }, - main_product = "", + crafting_machine_tint = { + primary = { r = 0.0, g = 0.8, b = 0.0, a = 0.000 }, + secondary = { r = 0.5, g = 1.0, b = 0.5, a = 0.000 }, + tertiary = { r = 0.25, g = 0.5, b = 0.25, a = 0.000 }, + }, enabled = false, always_show_made_in = true, allow_decomposition = false, allow_as_intermediate = false, - --main_product= "nitrogen", subgroup = "bio-bio-farm-intermediate-product", order = "ab", }, @@ -1167,11 +1181,11 @@ data:extend({ { type = "recipe", name = "bi-adv-fertilizer-1", - icon = ICONPATH .. "advanced_fertilizer_64.png", + icon = ICONPATH .. "fertilizer_advanced.png", icon_size = 64, icons = { { - icon = ICONPATH .. "advanced_fertilizer_64.png", + icon = ICONPATH .. "fertilizer_advanced.png", icon_size = 64, } }, @@ -1199,11 +1213,11 @@ data:extend({ { type = "recipe", name = "bi-adv-fertilizer-2", - icon = ICONPATH .. "advanced_fertilizer_64.png", + icon = ICONPATH .. "fertilizer_advanced.png", icon_size = 64, icons = { { - icon = ICONPATH .. "advanced_fertilizer_64.png", + icon = ICONPATH .. "fertilizer_advanced.png", icon_size = 64, } }, diff --git a/Bio_Industries_2/prototypes/Bio_Garden/fluid_fertilizer.lua b/Bio_Industries_2/prototypes/Bio_Garden/fluid_fertilizer.lua index 90ef65c..11f5b4c 100644 --- a/Bio_Industries_2/prototypes/Bio_Garden/fluid_fertilizer.lua +++ b/Bio_Industries_2/prototypes/Bio_Garden/fluid_fertilizer.lua @@ -61,12 +61,12 @@ data:extend({ { type = "fluid", name = "bi-adv-fertilizer-fluid", - icon = ICONPATH .. "fluid_advanced_fertilizer_64.png", + icon = ICONPATH .. "fluid_advanced_fertilizer_recipe", icon_size = 64, icon_mipmaps = 1, icons = { { - icon = ICONPATH .. "fluid_advanced_fertilizer_64.png", + icon = ICONPATH .. "fluid_advanced_fertilizer_recipe.png", icon_size = 64, icon_mipmaps = 1, } @@ -91,11 +91,11 @@ data:extend({ { type = "recipe", name = "bi-fertilizer-fluid", - icon = ICONPATH .. "fluid_fertilizer_recipe_64.png", + icon = ICONPATH .. "fluid_fertilizer.png", icon_size = 64, icons = { { - icon = ICONPATH .. "fluid_fertilizer_recipe_64.png", + icon = ICONPATH .. "fluid_fertilizer.png", icon_size = 64, } },