lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* 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);
}