techage/furnace/cooking.lua
Joachim Stolberg 1349e3c2d5 furnace added
2019-06-10 21:31:58 +02:00

118 lines
2.7 KiB
Lua

--[[
TechAge
=======
Copyright (C) 2019 Joachim Stolberg
LGPLv2.1+
See LICENSE.txt for more information
Cooking routines for furnace
]]--
-- for lazy programmers
local S = function(pos) if pos then return minetest.pos_to_string(pos) end end
local P = minetest.string_to_pos
local M = minetest.get_meta
-- Load support for intllib.
local MP = minetest.get_modpath("techage")
local I,_ = dofile(MP.."/intllib.lua")
local Recipes = {} -- registered recipes
local KeyList = {} -- index to Recipes key translation
local NumRecipes = 0
techage.furnace = {}
-- move recipe src items to output inventory
local function process(inv, recipe)
local res
-- check if all ingredients are available
for _,item in ipairs(recipe.input) do
if not inv:contains_item("src", item) then
return false
end
end
-- remove items
for _,item in ipairs(recipe.input) do
inv:remove_item("src", item)
end
-- add to dst
local stack = ItemStack(recipe.output)
stack:set_count(recipe.number)
inv:add_item("dst", stack)
return true
end
function techage.furnace.smelting(pos, mem, elapsed)
local inv = M(pos):get_inventory()
local state = techage.STANDBY
if inv and not inv:is_empty("src") then
local key = KeyList[mem.recipe_idx or 1] or KeyList[1]
local recipe = Recipes[key]
-- check dst inv
local item = ItemStack(recipe.output)
if not inv:room_for_item("dst", item) then
return techage.BLOCKED
end
elapsed = elapsed + (mem.leftover or 0)
while elapsed >= recipe.time do
if process(inv, recipe) == false then
mem.leftover = 0
return techage.STANDBY
else
state = techage.RUNNING
end
elapsed = elapsed - recipe.time
end
mem.leftover = elapsed
return state
end
return techage.STANDBY
end
function techage.furnace.get_output(idx)
local key = KeyList[idx] or KeyList[1]
return Recipes[key].output
end
function techage.furnace.get_num_recipes()
return NumRecipes
end
function techage.furnace.reset_cooking(mem)
mem.leftover = 0
end
if minetest.global_exists("unified_inventory") then
unified_inventory.register_craft_type("ta3_melting", {
description = I("TA3 Melting"),
icon = "techage_concrete.png^techage_appl_furnace.png^techage_frame_ta3.png",
width = 2,
height = 2,
})
end
function techage.furnace.register_recipe(recipe)
local output = string.split(recipe.output, " ")
local number = tonumber(output[2] or 1)
table.insert(KeyList, output)
Recipes[output] = {
input = recipe.recipe,
output = output[1],
number = number,
time = math.max((recipe.time or 3) * number, 2),
}
NumRecipes = NumRecipes + 1
if minetest.global_exists("unified_inventory") then
recipe.items = recipe.recipe
recipe.type = "ta3_melting"
unified_inventory.register_craft(recipe)
end
end