/* 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()); }