Files
integration/luprex/lua/menu.lua
2026-04-14 02:05:15 -04:00

69 lines
1.9 KiB
Lua

----------------------------------------------------------------
--
-- To add a menu to an object (such as a Brick Oven), you will
-- be adding a function 'lookmenu' to the appropriate class,
-- like this:
--
-- function brickoven.lookmenu(add)
-- add("Light Oven", function () ... end)
-- add("Add Fuel", function () ... end)
-- end
--
-- This function will get called twice: once in a 'probe' when
-- Unreal wants to know what menu items exist, and a second time
-- in an 'invoke' to find the right closure. The 'add' function
-- which is passed in can therefore be one of two functions.
--
-- In probe mode, the goal is to build up an array that looks
-- like this:
--
-- {"Light Oven", "Add Fuel"}
--
-- So therefore, in probe mode, the 'add' function is a closure
-- that adds the label to the array.
--
-- In invoke mode, the goal is to find the right closure. So
-- therefore, in invoke mode, the 'add' function is a closure
-- that compares the label to the menu item which was already
-- selected. If there's a match, it records the closure.
--
----------------------------------------------------------------
makeclass('engio')
function engio.getmenu()
local class = tangible.getclass(place)
-- if the tangible doesn't have a 'lookmenu' function, do nothing
if class == nil or class.lookmenu == nil then
return {}
end
local items = {}
local add = function(label, closure)
table.insert(items, label)
end
class.lookmenu(add)
return items
end
function engio.pressmenu(label)
local class = tangible.getclass(place)
-- if the tangible doesn't have a 'lookmenu' function, do nothing
if class == nil or class.lookmenu == nil then
return
end
local result = nil
local add = function(lbl, closure)
if (lbl == label) then
result = closure
end
end
class.lookmenu(add)
if result ~= nil then
result()
end
end