summaryrefslogtreecommitdiff
path: root/factory/init.lua
diff options
context:
space:
mode:
Diffstat (limited to 'factory/init.lua')
-rw-r--r--factory/init.lua142
1 files changed, 142 insertions, 0 deletions
diff --git a/factory/init.lua b/factory/init.lua
new file mode 100644
index 0000000..4c97662
--- /dev/null
+++ b/factory/init.lua
@@ -0,0 +1,142 @@
+factory={
+ crafts={},
+ empty={item=ItemStack(nil),time=0}
+}
+
+-- Settings
+dofile(minetest.get_modpath("factory").."/settings.txt")
+
+-- This below is the Crafter mod by the legend MasterGollum
+
+function factory.register_craft(craft)
+ assert(craft.type ~= nil and craft.recipe ~= nil and craft.output ~= nil,
+ "Invalid craft definition, it must have type, recipe and output")
+ assert(type(craft.recipe)=="table" and type(craft.recipe[1])=="table","'recipe' must be a bidimensional table")
+ minetest.log("verbose","registerCraft ("..craft.type..", output="..craft.output.." recipe="..dump(craft.recipe))
+ craft._h=#craft.recipe
+ craft._w=#craft.recipe[1]
+ -- TODO check that all the arrays have the same length...
+ factory.crafts[#factory.crafts+1]=craft
+end
+
+function factory.get_craft_result(data)
+ assert(data.method ~= nil and data.items ~= nil, "Invalid call, method and items must be provided")
+ local w = 1
+ if data.width ~= nil and data.width>0 then
+ w=data.width
+ end
+ local r=nil
+ for zz,craft in ipairs(factory.crafts) do
+ r=factory._check_craft(data,w,craft)
+ if r ~= nil then
+ if factory.debug then
+ print("Craft found, returning "..dump(r.item))
+ end
+ return r
+ end
+ end
+ return factory.empty
+end
+
+function factory._check_craft(data,w,c)
+ if c.type == data.method then
+ -- Here we go..
+ for i=1,w-c._h+1 do
+ for j=1,w-c._w+1 do
+ local p=(i-1)*w+j
+ if factory.debug then
+ print("Checking data.items["..dump(i).."]["..dump(j).."]("..dump(p)..")="..dump(data.items[p]:get_name()).." vs craft.recipe[1][1]="..dump(c.recipe[1][1]))
+ end
+ if data.items[p]:get_name() == c.recipe[1][1] then
+ for m=1,c._h do
+ for n=1,c._w do
+ local q=(i+m-1-1)*w+j+n-1
+ if factory.debug then
+ print(" Checking data.items["..dump(i+m-1).."]["..dump(j+n-1).."]("..dump(q)..")="..dump(data.items[q]:get_name())..
+ " vs craft.recipe["..dump(m).."]["..dump(n).."]="..dump(c.recipe[m][n]))
+ end
+ if c.recipe[m][n] ~= data.items[q]:get_name() then
+ return nil
+ end
+ end
+ end
+ -- found! we still must check that is not any other stuff outside the limits of the recipe sizes...
+ -- Checking at right of the matching square
+ for m=i-c._h+1+1,w do
+ for n=j+c._w,w do
+ local q=(m-1)*w+n
+ if factory.debug then
+ print(" Checking right data.items["..dump(m).."]["..dump(n).."]("..dump(q)..")="..dump(data.items[q]:get_name()))
+ end
+ if data.items[q]:get_name() ~= "" then
+ return nil
+ end
+ end
+ end
+ -- Checking at left of the matching square (the first row has been already scanned)
+ for m=i-c._h+1+1+1,w do
+ for n=1,j-1 do
+ local q=(m-1)*w+n
+ if factory.debug then
+ print(" Checking left data.items["..dump(m).."]["..dump(n).."]("..dump(q)..")="..dump(data.items[q]:get_name()))
+ end
+ if data.items[q]:get_name() ~= "" then
+ return nil
+ end
+ end
+ end
+ -- Checking at bottom of the matching square
+ for m=i+c._h,w do
+ for n=j,j+c._w do
+ local q=(m-1)*w+n
+ if factory.debug then
+ print(" Checking bottom data.items["..dump(m).."]["..dump(n).."]("..dump(q)..")="..dump(data.items[q]:get_name()))
+ end
+ if data.items[q]:get_name() ~= "" then
+ return nil
+ end
+ end
+ end
+ if factory.debug then
+ print("Craft found! "..c.output)
+ end
+ return {item=ItemStack(c.output),time=1}
+ elseif data.items[p] ~= nil and data.items[p]:get_name() ~= "" then
+ if factory.debug then
+ print("Invalid data item "..dump(data.items[p]:get_name()))
+ end
+ return nil
+ end
+ end
+ end
+ end
+end
+
+-- GUI related stuff
+factory_gui_bg = "bgcolor[#080808BB;true]"
+factory_gui_bg_img = "background[5,5;1,1;gui_factoryformbg.png;true]"
+factory_gui_slots = "listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]"
+
+function factory.get_hotbar_bg(x,y)
+ local out = ""
+ for i=0,7,1 do
+ out = out .."image["..x+i..","..y..";1,1;gui_hb_bg.png]"
+ end
+ return out
+end
+
+function factory.swap_node(pos,name)
+ local node = minetest.get_node(pos)
+ if node.name == name then
+ return
+ end
+ node.name = name
+ minetest.swap_node(pos,node)
+end
+
+dofile(minetest.get_modpath("factory").."/nodes.lua")
+dofile(minetest.get_modpath("factory").."/craftitems.lua")
+dofile(minetest.get_modpath("factory").."/crafting.lua")
+
+dofile(minetest.get_modpath("factory").."/ind_furnace.lua")
+dofile(minetest.get_modpath("factory").."/ind_squeezer.lua") \ No newline at end of file