Fix arboretum
This commit is contained in:
parent
5964b4e1f6
commit
e30fbfeaad
3 changed files with 83 additions and 1057 deletions
File diff suppressed because it is too large
Load diff
|
@ -460,15 +460,15 @@ local function On_Built(event)
|
||||||
elseif entity.type == "electric-pole" then
|
elseif entity.type == "electric-pole" then
|
||||||
local pole = entity
|
local pole = entity
|
||||||
-- Make sure hidden poles of the Bio gardens are connected correctly!
|
-- Make sure hidden poles of the Bio gardens are connected correctly!
|
||||||
local garden_names = { "bi-bio-garden", "bi-bio-garden-larger", "bi-bio-garden-huge" }
|
local garden_names = { "bi-bio-garden", "bi-bio-garden-larger", "bi-bio-garden-huge" }
|
||||||
for _, gname in ipairs(garden_names) do
|
for _, gname in ipairs(garden_names) do
|
||||||
if entities[gname] and pole.name == entities[gname].hidden[h_key].name and base then
|
if entities[gname] and pole.name == entities[gname].hidden[h_key].name and base then
|
||||||
BioInd.writeDebug("Bio garden (" .. gname .. ")!")
|
BioInd.writeDebug("Bio garden (" .. gname .. ")!")
|
||||||
BioInd.connect_garden_pole(base, pole)
|
BioInd.connect_garden_pole(base, pole)
|
||||||
BioInd.writeDebug("Connected %s (%s)", { pole.name, pole.unit_number or "nil" })
|
BioInd.writeDebug("Connected %s (%s)", { pole.name, pole.unit_number or "nil" })
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- A seedling has been planted
|
-- A seedling has been planted
|
||||||
elseif entity.name == "seedling" then
|
elseif entity.name == "seedling" then
|
||||||
|
@ -649,16 +649,37 @@ end
|
||||||
-- Radar stuff
|
-- Radar stuff
|
||||||
--------------------------------------------------------------------
|
--------------------------------------------------------------------
|
||||||
|
|
||||||
-- Radar completed a sector scan
|
-- Robust sector scanned handler for Arboretum radar
|
||||||
local function On_Sector_Scanned(event)
|
local function On_Sector_Scanned(event)
|
||||||
local f_name = "On_Sector_Scanned"
|
-- defensive checks
|
||||||
BioInd.writeDebug("Entered function %s(%s)", { f_name, event })
|
BioInd.writeDebug("On_Sector_Scanned fired")
|
||||||
|
--game.print("On_Sector_Scanned fired")
|
||||||
|
if not (event and event.radar) then return end
|
||||||
|
local radar = event.radar
|
||||||
|
if not (radar.valid and radar.unit_number) then return end
|
||||||
|
|
||||||
---- Each time a Arboretum-Radar scans a sector ----
|
-- Make sure compound-entity data is available before accessing it
|
||||||
local arboretum = storage.bi_arboretum_radar_table[event.radar.unit_number]
|
local arb_proto = BioInd.compound_entities and BioInd.compound_entities["bi-arboretum"]
|
||||||
if arboretum then
|
if not (arb_proto and arb_proto.hidden and arb_proto.hidden.radar and arb_proto.hidden.radar.name) then
|
||||||
Get_Arboretum_Recipe(storage.bi_arboretum_table[arboretum], event)
|
-- not ready yet (init not finished) — bail out safely
|
||||||
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Only handle scans from our arboretum radar type
|
||||||
|
if radar.name ~= arb_proto.hidden.radar.name then return end
|
||||||
|
|
||||||
|
-- Look up the base arboretum unit_number (stored when the hidden radar was created)
|
||||||
|
local base_unit_number = storage.bi_arboretum_radar_table and storage.bi_arboretum_radar_table[radar.unit_number]
|
||||||
|
if not base_unit_number then
|
||||||
|
-- no mapping found -> nothing to do
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local arb_table = storage.bi_arboretum_table and storage.bi_arboretum_table[base_unit_number]
|
||||||
|
if not arb_table then return end
|
||||||
|
|
||||||
|
-- All good: call the arboretum recipe handler
|
||||||
|
Get_Arboretum_Recipe(arb_table, event)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -42,12 +42,21 @@ end
|
||||||
-- Check that all ingredients are available!
|
-- Check that all ingredients are available!
|
||||||
local function check_ingredients(arboretum)
|
local function check_ingredients(arboretum)
|
||||||
local recipe = arboretum.get_recipe()
|
local recipe = arboretum.get_recipe()
|
||||||
local need = recipe and storage.bi_arboretum_recipe_table[recipe.name]
|
if not recipe then
|
||||||
|
--game.print("No recipe set on arboretum")
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
--game.print("Recipe name: " .. recipe.name)
|
||||||
|
local need = storage.bi_arboretum_recipe_table[recipe.name]
|
||||||
|
if not need then
|
||||||
|
--game.print("No recipe data found for " .. recipe.name)
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
local function check(need, have)
|
local function check(need, have)
|
||||||
for name, amount in pairs(need or {}) do
|
for name, amount in pairs(need or {}) do
|
||||||
if not (have and have[name]) or (have[name] < amount) then
|
if not (have and have[name]) or (have[name] < amount) then
|
||||||
BioInd.writeDebug("Missing ingredient %s (have %s of %s)", { name, have[name] or 0, amount })
|
--game.print("Missing ingredient " .. name .. " (have " .. (have[name] or 0) .. " of " .. amount .. ")")
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -55,9 +64,38 @@ local function check_ingredients(arboretum)
|
||||||
end
|
end
|
||||||
|
|
||||||
local inventory = arboretum.get_inventory(defines.inventory.assembling_machine_input)
|
local inventory = arboretum.get_inventory(defines.inventory.assembling_machine_input)
|
||||||
|
local inv_contents_raw = inventory and inventory.get_contents() or {}
|
||||||
|
|
||||||
|
-- Check if inv_contents_raw is a map or list, convert if needed
|
||||||
|
local function is_map(t)
|
||||||
|
if type(t) ~= "table" then return false end
|
||||||
|
for k, v in pairs(t) do
|
||||||
|
if type(k) ~= "string" or type(v) ~= "number" then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local inv_contents
|
||||||
|
if is_map(inv_contents_raw) then
|
||||||
|
inv_contents = inv_contents_raw
|
||||||
|
else
|
||||||
|
-- Convert list of item stacks to map
|
||||||
|
inv_contents = {}
|
||||||
|
for _, item in pairs(inv_contents_raw) do
|
||||||
|
inv_contents[item.name] = (inv_contents[item.name] or 0) + item.count
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local fluid_contents = arboretum.get_fluid_contents() or {}
|
||||||
|
|
||||||
|
--game.print("Inventory contents (map): " .. serpent.line(inv_contents))
|
||||||
|
--game.print("Fluid contents: " .. serpent.line(fluid_contents))
|
||||||
|
|
||||||
return need and
|
return need and
|
||||||
check(need.items, inventory and inventory.get_contents()) and
|
check(need.items, inv_contents) and
|
||||||
check(need.fluids, arboretum.get_fluid_contents()) and
|
check(need.fluids, fluid_contents) and
|
||||||
{ ingredients = need, name = recipe.name } or nil
|
{ ingredients = need, name = recipe.name } or nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -111,10 +149,14 @@ function Get_Arboretum_Recipe(ArboretumTable, event)
|
||||||
local check = check_ingredients(arboretum)
|
local check = check_ingredients(arboretum)
|
||||||
local ingredients, recipe_name
|
local ingredients, recipe_name
|
||||||
if check then
|
if check then
|
||||||
|
--game.print("There are ingredients")
|
||||||
ingredients, recipe_name = check.ingredients, check.name
|
ingredients, recipe_name = check.ingredients, check.name
|
||||||
|
else
|
||||||
|
--game.print("No ingredients")
|
||||||
end
|
end
|
||||||
|
|
||||||
if ingredients then
|
if ingredients then
|
||||||
|
|
||||||
local create_seedling, new_plant
|
local create_seedling, new_plant
|
||||||
pos = BioInd.normalize_position(arboretum.position) or
|
pos = BioInd.normalize_position(arboretum.position) or
|
||||||
BioInd.arg_err("nil", "position")
|
BioInd.arg_err("nil", "position")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue