/* -*- LPC -*- */ /* * $Locker: $ * $Id: force.c,v 1.2 2000/06/23 03:40:56 pinkfish Exp $ * $Log: force.c,v $ * Revision 1.2 2000/06/23 03:40:56 pinkfish * Fix up the references to find_match. * * Revision 1.1 1998/01/06 05:08:31 ceres * Initial revision * */ /* code to handle forcing. The method used will be to ask the object to * do the command. While this is similar to the original method of doing this * it will be used to be more in the style of asking things to do things, * rather than the making things do things without asking them first. */ #include <obj_parser.h> #define FORCE_COST 1 #define ILLEGAL_FORCE ({ "alias", "unalias", "mv", "mkdir", "call", "rm", \ "force", "kill", "gauge", "exec", "promote", \ "new_domain", "rmdir", "cd", "history", "echoall", "shout" }) nosave string fname; nosave int no_force_me; void force_commands() { sscanf(file_name(this_object()), "%s#", fname); if(!this_object()->query_property("npc") && this_object()->query_property("force") || fname == "/global/lord") add_action("do_force", "force"); if(fname == "/global/lord") add_action("no_force", "noforce"); } protected int no_force(string str) { if(fname!="/global/lord") return 0; if(str == "on") { no_force_me = 1; write("Ok.\n"); return 1; } if(str == "off") { no_force_me = 0; write("Ok.\n"); return 1; } write("Forcing you is currently "); if(no_force_me) { write("disabled.\n"); } else { write("enabled.\n"); } return 1; } int do_force(string str) { string who, what; object *obs, ob; int i; class obj_match omatch; if(fname == "/global/player" && !this_player()->query_property("force")) { notify_fail("You do not have the ability to do that yet.\n"); return 0; } if(!str || sscanf(str, "%s %s", who, what) != 2) { notify_fail("Usage : force <person> <command>\n"); return 0; } if(this_player()->adjust_social_points(-FORCE_COST) < 0) { notify_fail("Insufficient social points.\n"); return 0; } who = (string)this_player()->expand_nickname(who); who = lower_case(who); omatch = match_objects_in_environments(who, environment(this_object())); if (omatch->result != OBJ_PARSER_SUCCESS) { notify_fail(match_objects_failed_mess(omatch)); return 0; } obs = omatch->objects; if (!sizeof(obs)) if (!(ob = find_living(who))) { notify_fail("No such living thing.\n"); return 0; } else obs += ({ ob }); for (i=0;i<sizeof(obs);i++) if(!obs[i]->do_force_on_me(what)) write(capitalize(who) + " didn't want to do that.\n"); write("Ok.\n"); return 1; } int do_force_on_me (string str) { string temp1, temp2; object forcer; forcer = this_player(1); if(!forcer) { forcer = previous_object(); } if(!this_object()->query_property("npc")) { log_file("FORCE", ctime(time()) + " " + forcer->query_name() + " " + this_object()->query_name() + " : " + str); } tell_object(this_object(), forcer->query_cap_name() + " tries to force you to " + str + "\n"); if (no_force_me || (string)this_object()->query_name() == "pinkfish") { log_file("FORCE", " (failed)\n"); return 0; } if(!sscanf(str, "%s %s", temp1, temp2)) { temp1 = str; } /* Delete this at your own peril */ if (member_array(temp1, ILLEGAL_FORCE) != -1 && !"secure/master"->high_programmer(geteuid(forcer))) { log_file("FORCE", " (failed)\n"); return 0; } command(str); log_file("FORCE", " (succeeded)\n"); return 1; }