1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
-- Ingame contextual help
-- We use our own hook list as to not overburn the hook proccessor
-- with many hooks that would slow down things
-- It would be very meaningless if the option is not even on
__ingame_hooks = {}
__ingame_help_max = 0
function ingame_help(t, ...)
-- This function can also be used to call the callbacks
if type(t) == "string" then
local f = getglobal("__ingame_help_fct_"..t)
call(f, arg)
return
end
assert(t.desc or t.fct, "no ingame help desc/fct")
assert(t.hook or t.callback, "no ingame help hook/callback")
if t.hook then assert(t.event, "no ingame hepl event needed by hook") end
-- Set it to only trigger once
setglobal("__ingame_help_activated_"..__ingame_help_max, FALSE)
-- Save/load it
add_loadsave("__ingame_help_activated_"..__ingame_help_max, FALSE)
if t.hook then
-- If the hok list didnt exist yet, add it
if not __ingame_hooks[t.hook] then
-- Set it to empty, we'll fill it later
__ingame_hooks[t.hook] = {}
-- Add the global hook
add_hooks
{
[t.hook] = function (...)
if option_ingame_help ~= TRUE then return end
local k, e
for k, e in __ingame_hooks[%t.hook] do
if k ~= "n" then
call(e, arg)
end
end
end
}
end
if t.desc then
tinsert(__ingame_hooks[t.hook],
function (...)
local tbl = %t
if getglobal("__ingame_help_activated_"..%__ingame_help_max) == FALSE then
if call(tbl.event, arg) == TRUE then
local k, e
for k, e in tbl.desc do
msg_print(TERM_YELLOW, e)
end
setglobal("__ingame_help_activated_"..%__ingame_help_max, TRUE)
end
end
end
)
elseif t.fct then
tinsert(__ingame_hooks[t.hook],
function (...)
local tbl = %t
if getglobal("__ingame_help_activated_"..%__ingame_help_max) == FALSE then
if call(tbl.event, arg) == TRUE then
if tbl.fct() == TRUE then
setglobal("__ingame_help_activated_"..%__ingame_help_max, TRUE)
end
end
end
end
)
end
else
local no_test = FALSE
if t.no_test == TRUE then no_test = TRUE end
if t.desc then
setglobal
(
"__ingame_help_fct_"..(t.callback),
function (...)
local tbl = %t
if ((option_ingame_help == TRUE) or (%no_test == TRUE)) and (getglobal("__ingame_help_activated_"..%__ingame_help_max) == FALSE) then
local k, e
for k, e in tbl.desc do
msg_print(TERM_YELLOW, e)
end
setglobal("__ingame_help_activated_"..%__ingame_help_max, TRUE)
end
end
)
elseif t.fct then
setglobal
(
"__ingame_help_fct_"..(t.callback),
function (...)
local tbl = %t
if ((option_ingame_help == TRUE) or (%no_test == TRUE)) and (getglobal("__ingame_help_activated_"..%__ingame_help_max) == FALSE) then
if call(tbl.fct, arg) == TRUE then
setglobal("__ingame_help_activated_"..%__ingame_help_max, TRUE)
end
end
end
)
end
end
__ingame_help_max = __ingame_help_max + 1
end
-- Clean up the ingame help seen at birth
add_hooks
{
[HOOK_BIRTH_OBJECTS] = function()
local i
for i = 0, __ingame_help_max - 1 do
setglobal("__ingame_help_activated_"..i, FALSE)
end
end
}
function ingame_clean()
local i
for i = 0, __ingame_help_max - 1 do
setglobal("__ingame_help_activated_"..i, FALSE)
end
end
-- helper function, brings up a doc
function ingame_help_doc(name, anchor)
-- Save screen
screen_save();
-- Peruse the help file
if not anchor then anchor = 0 end
show_file(name, 0, -anchor, 0)
-- Load screen
screen_load()
end
|