diff options
Diffstat (limited to 'lib/mods/theme/core/help.lua')
-rw-r--r-- | lib/mods/theme/core/help.lua | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/lib/mods/theme/core/help.lua b/lib/mods/theme/core/help.lua new file mode 100644 index 00000000..a581fe63 --- /dev/null +++ b/lib/mods/theme/core/help.lua @@ -0,0 +1,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 |