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. */

/*
 * By Beek.  Merged in some functionality written by Valentino.
 */

inherit M_ACTIONS;
inherit M_INPUT;

void simple_action(string);
string query_name();

mapping options = ([]);
mapping responses = ([]);

mapping current = ([]);
mapping start = ([]);
array default_start = ({ });
mixed goodbye_action;

void set_goodbye(mixed arg)
{
    goodbye_action = arg;
}

void set_options(mapping m) 
{
    options = m;
}

void set_responses(mapping m) 
{
    responses = m;
}

varargs void set_start(array a, object target) 
{
    if (target)
	start[target] = a;
    else
	default_start = a;
}

mixed direct_talk_to_liv() 
{
    return 1;
}

mixed direct_talk_with_liv()
{
    return 1;
}


void continue_conversation(object, string);

void show_menu(object ob) 
{
    int n = 1;
    
    write("\n");
    
    foreach (string option in current[ob])
	printf("   %%^MENU_CHOICE%%^%2d%%^RESET%%^: %s\n",
	       n++, options[option]);
    printf("    %%^MENU_CHOICE%%^q%%^RESET%%^: Quit talking to "+query_name()
	   + ".\n");
    
    modal_simple( (: continue_conversation, ob :),
		  "[choice] :>");
}

void do_action(object ob, mixed action) {
    string add;
    string remove;
    
    if (arrayp(action))
	foreach(mixed act in action)
	    do_action(ob, act);
    else {
	if (functionp(action))
	    evaluate(action);
	else if (stringp(action)) {
	    if (sscanf(action, "%s@@%s", action, add) == 2) {
		if (sscanf(add, "%s@@%s", add, remove) == 2)
		    current[ob] -= explode(remove, ",");
		current[ob] += explode(add, ",");
	    }

	    if (action[0] == '!')
		do_game_command(action[1..]);
	    else
		do_game_command("say " + action);
	} else {
	    if (wizardp(ob)) {
		if (!action)
		    write("Error: no response found\n");
		else
		    write("Error: invalid type response\n");
	    }
	    simple_action("$N $vare not sure what to say in response to that.");
	    show_menu(ob);
	}
    }
}

void bye(object ob)
{
    map_delete(current, ob);
    
    if (goodbye_action)
	do_action(ob, goodbye_action);
}

void continue_conversation(object ob, string input) 
{
    int num;
    string tmp;
    string response;
    string tag;
    
    if (input == "q") {
	return bye(ob);
    }
    if (sscanf(input, "%d%s", num, tmp) != 2 || tmp != "") {
	simple_action("$N $vsuggest that you use the numbers to "+
		      "indicate what you want to say.");
	show_menu(ob);
	return;
    }
    if (num <= 0 || num > sizeof(current[ob])) {
	simple_action("$N $vsuggest that you pick a legal option.");
	show_menu(ob);
	return;
    }
    num--;
    tag = current[ob][num];
    ob->simple_action("$N $vsay: " + options[tag]);
    response = responses[tag];

    do_action(ob, response);

    current[ob] -= ({ tag });

    if (sizeof(current[ob]))
	show_menu(ob);
    else
	return bye(ob);
}

void begin_conversation() 
{
    current[this_body()] = start[this_body()] || default_start;

    show_menu(this_body());
}