/* Do not remove the headers from this file! see /USAGE for more info. */
/*
** Hint menu For the Lima mudlib.
** Rust @ Lima Bean Nov, 1995.
**
*/
#include <menu.h>
#include <security.h>
inherit MENUS;
inherit M_ACCESS;
MENU toplevel;
MENU_ITEM quit_item;
MENU_ITEM goto_main_menu_item;
MENU_ITEM main_seperator;
MENU_ITEM blank_seperator;
string array hints;
int hints_read;
void show_next_hint(string input)
{
MENU m;
switch(input)
{
case "b":
goto_menu(previous_menu);
return;
case "":
break;
case "p":
if(hints_read==1)
{
write("No previous hints.\n");
return;
}
write(sprintf("%d) %s\n", --hints_read,hints[hints_read-1]));
return;
case "q":
quit_menu_application();
return;
default:
return;
}
if(hints_read >= sizeof(hints))
{
write("[no more hints]\n\n");
goto_menu(previous_menu);
return;
}
write(sprintf("%d) %s\n", hints_read+1, hints[hints_read++]));
}
void view_question(string area, string file, string question)
{
MENU question_menu = new_menu("");
set_menu_prompt(question_menu,
"[<enter>, (p)revious hint, (b)ack, (q)uit] ");
set_no_match_function(question_menu,(:show_next_hint:));
hints = explode(read_file("/help/hints/"+area+"/"+file), "\n")[1..]-({""});
hints_read = 0;
show_next_hint("");
allow_empty_selection(question_menu);
previous_menu = current_menu;
current_menu = question_menu;
}
void view_dir(string s)
{
string array files = get_dir("/help/hints/"+s+"/*") - ({".","..","README"});
string array questions = map(files, (: read_file("/help/hints/"+$(s)
+"/"+$1,1,1) :));
MENU m = new_menu(replace_string(s,"_"," "));
MENU_ITEM item;
function f;
add_menu_item(m, main_seperator);
for(int i = 0; i < sizeof(questions); i++)
{
f = (: view_question($(s),$(files[i]),$(questions[i][0..<2])) :);
item = new_menu_item(questions[i][0..<2], f);
add_menu_item(m, item);
}
add_menu_item(m, blank_seperator);
add_menu_item(m, quit_item);
add_menu_item(m, goto_main_menu_item);
add_menu_item(m, blank_seperator);
allow_empty_selection(m);
set_no_match_function(m,(:quit_if_cr:));
set_menu_prompt (m, "[#mq] ");
previous_menu = current_menu;
current_menu = m;
}
void create()
{
string array sections;
set_privilege(1);
toplevel = new_menu(mud_name()+" Hint Menu");
// Since we'll use these things more than once, we can just
// call new_menu_item once, and insert them wherever we want
// to use them.
quit_item = new_menu_item("Quit", (:quit_menu_application:), "q");
goto_main_menu_item =new_menu_item("Return to main menu",
toplevel, "m");
main_seperator =
new_seperator("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"
"=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
blank_seperator = new_seperator("");
// Add items to the toplevel (main) menu.
add_menu_item (toplevel,
new_seperator(
"What area of the mud are you looking for hints for?"));
add_menu_item (toplevel, main_seperator);
sections = sort_array(get_dir("/help/hints/*") - ({".","..","README"}),1);
foreach(string s in sections)
{
add_menu_item (toplevel, new_menu_item(replace_string(s,"_"," "),
(: view_dir($(s)) :)));
}
// if(sizeof(sections)%2)
add_menu_item(toplevel,blank_seperator);
add_menu_item (toplevel, main_seperator);
add_menu_item (toplevel, quit_item);
add_menu_item (toplevel, blank_seperator);
add_menu_item (toplevel, main_seperator);
set_menu_prompt (toplevel, "[#q] ");
allow_empty_selection(toplevel);
set_no_match_function(toplevel,(:quit_if_cr:));
}
void start_menu()
{
init_menu_application(toplevel);
}