--[[
Order
An order object that can be easily manipulated and hooked on to functions.
]]
local Order = {}
Order.__index = Order
function Order.new(Customer, Items, Employee)
local self = {
Customer = Customer or "",
Items = Items or {},
Employee = Employee or "",
CompletedItems = {},
Status = Employee and "Processing" or "Unclaimed",
Rating=0
}
self.ChangedEvent = Instance.new("BindableEvent")
self.Changed = self.ChangedEvent.Event
setmetatable(self, Order)
return self
end
function Order:Destroy()
if self.ChangedEvent then
self.ChangedEvent:Destroy()
end
for i,_ in pairs (self) do
self[i]=nil
end
setmetatable(self,nil)
self=nil
end
function Order:Assign(Employee)
self.Employee = Employee
self.ChangedEvent:Fire("Employee", Employee)
end
function Order:CompleteItem(itemName)
local found
for i,item in pairs (self.Items) do
if item==itemName then
found=item
table.remove(self.Items,i)
end
end
if not found then
warn("No found item of name "..itemName)
return
end
table.insert(self.CompletedItems, found)
self.ChangedEvent:Fire("CompletedItems", found)
end
function Order:Rate(rating)
self.Rating = rating
self.ChangedEvent:Fire("Rating", rating)
end
function Order:Complete(callback)
if self.Items>0 then
warn("Order isn't completed")
return false
end
self.Status = "Complete"
self.ChangedEvent:Fire("Status", "Complete")
--// Award employee, etc
if callback then
coroutine.wrap(callback)(self)
end
return true
end
return Order
--[[
Recipe
Representation of steps needed to complete a recipe. For example, touching
a water dispenser can can call :CompleteStep("Water") on the current recipe.
When all steps has been completed, Recipe.Completed will fire. This can be connected
to Order:CompleteItem()
]]
local Recipe = {}
Recipe.__index = Recipe
Recipe.Recipes = {
["Americano"] = {
"Coffee Beans",
"Grind",
"Water",
},
["Latte"] = {
"Coffee Beans",
"Grind",
"Water",
"Milk",
},
}
local function tablecopy (t)
local nt = {}
for i,v in pairs(t) do
nt[i]=v
end
return nt
end
local function tablefind (t,value)
for i,v in pairs(t) do
if v==value then return i,v end
end
end
function Recipe.new(recipeName, doesOrderMatter)
assert(Recipe.Recipes[recipeName], "No recipe found of name "..recipeName)
local self = {
RecipeName = recipeName,
Steps = tablecopy(Recipe.Recipes[recipeName]),
CompletedSteps = {},
doesOrderMatter = doesOrderMatter or false
}
self.CompletedEvent = Instance.new("BindableEvent")
self.Completed = self.CompletedEvent.Event
setmetatable(self,Recipe)
return self
end
function Recipe:CompleteStep(name)
local order, step = tablefind(self.Steps,name)
if step and (self.doesOrderMatter and order==1 or true) then
--// Make sure the previous step has been completed, if order matters
table.insert(self.CompletedSteps,name)
else
return
end
if #self.CompletedSteps == #self.Steps then
self.CompletedEvent:Fire()
end
end
function Recipe:Destroy()
setmetatable(self,nil)
self=nil
end
return Recipe