/* $Header: rob.c,v 2.0 90/05/05 12:45:40 lachesis Exp $ * $Log: rob.c,v $ * Revision 2.0 90/05/05 12:45:40 lachesis * Incorporated ABODE and HAVEN flags (remembering to convert FireFoot's * usage of those flags to ours). * Added Examine of objects that don't belong to you, added GOD_PRIV. * * Revision 1.2 90/04/20 14:06:49 lachesis * Added @odrop && @drop. * * Revision 1.1 90/04/14 14:56:50 lachesis * Initial revision * */ #include "copyright.h" /* rob and kill */ #include "os.h" #include "db.h" #include "config.h" #include "interface.h" #include "match.h" #include "externs.h" void do_rob (dbref player, const char *what) { dbref thing; char buf[BUFFER_LEN]; init_match (player, what, TYPE_PLAYER); match_neighbor (); match_me (); if (Wizard (player)) { match_absolute (); match_player (); } thing = match_result (); switch (thing) { case NOTHING: notify (player, "Rob whom?"); break; case AMBIGUOUS: notify (player, "I don't know who you mean!"); break; default: if (Typeof (thing) != TYPE_PLAYER) { notify (player, "Sorry, you can only rob other players."); } else if (db[thing].sp.player.pennies < 1) { sprintf (buf, "%s is bereft of cookies.", db[thing].name); notify (player, buf); sprintf (buf, "%s tried to rob you, but you have no cookies to take.", db[player].name); notify (thing, buf); } else if (can_doit (player, thing, "Your conscience tells you not to.")) { /* steal a penny */ db[player].sp.player.pennies++; db[thing].sp.player.pennies--; notify (player, "You stole a cookie."); sprintf (buf, "%s stole one of your cookies!", db[player].name); notify (thing, buf); } break; } } void do_kill (dbref player, const char *what, int cost) { dbref victim; char buf[BUFFER_LEN]; #ifdef GENDER char xbuf[BUFFER_LEN]; #endif /* GENDER */ init_match (player, what, TYPE_PLAYER); match_neighbor (); match_me (); if (Wizard (player)) { match_player (); match_absolute (); } victim = match_result (); switch (victim) { case NOTHING: notify (player, "I don't see that player here."); break; case AMBIGUOUS: notify (player, "I don't know who you mean!"); break; default: if (Typeof (victim) != TYPE_PLAYER) { notify (player, "Sorry, you can only kill other players."); } else { /* go for it */ /* set cost */ if (cost < KILL_MIN_COST) cost = KILL_MIN_COST; #ifdef HAVEN if (db[db[player].location].flags & HAVEN && !controls (player, db[player].location)) { notify (player, "You can't kill anyone here!"); break; } #endif /* HAVEN */ /* see if it works */ if (!payfor (player, cost)) { notify (player, "You don't have enough cookies."); } else if ((OS_RAND () % KILL_BASE_COST) < cost && !Wizard (victim)) { /* you killed him */ if (db[victim].drop_message) /* give him the drop message */ notify (player, db[victim].drop_message); else { sprintf (buf, "You killed %s!", db[victim].name); notify (player, buf); } /* notify victim */ sprintf (buf, "%s killed you!", db[player].name); notify (victim, buf); /* maybe pay off the bonus */ if (db[victim].sp.player.pennies < MAX_PENNIES) { sprintf (buf, "Your insurance policy pays %d cookies.", KILL_BONUS); notify (victim, buf); db[victim].sp.player.pennies += KILL_BONUS; } else { notify (victim, "Your insurance policy has been revoked."); } /* now notify everybody else */ /* give drop message */ sprintf (buf, "%s killed %s!", db[player].name, db[victim].name); if (db[victim].odrop) { (void) strcat (buf, " "); #ifdef GENDER pronoun_substitute (xbuf, player, db[victim].odrop, 0); (void) strcat (buf, xbuf); #endif /* GENDER */ } notify_except2 (db[db[player].location].contents, player, victim, buf); /* send him home */ send_home (victim); } else { /* notify player and victim only */ notify (player, "Your murder attempt failed."); sprintf (buf, "%s tried to kill you!", db[player].name); notify (victim, buf); } break; } } } void do_give (dbref player, char *recipient, int amount) { dbref who; char buf[BUFFER_LEN]; /* do amount consistency check */ if (amount < 0 && !Wizard (player)) { notify (player, "Try using the \"rob\" command."); return; } else if (amount == 0) { notify (player, "You must specify a positive number of cookies."); return; } /* check recipient */ init_match (player, recipient, TYPE_PLAYER); match_neighbor (); match_me (); if (Wizard (player)) { match_player (); match_absolute (); } switch (who = match_result ()) { case NOTHING: notify (player, "Give to whom?"); return; case AMBIGUOUS: notify (player, "I don't know who you mean!"); return; default: if (!Wizard (player)) { if (Typeof (who) != TYPE_PLAYER) { notify (player, "You can only give to other players."); return; } else if (db[who].sp.player.pennies + amount > MAX_PENNIES) { notify (player, "That player doesn't need that many cookies!"); return; } } break; } /* try to do the give */ if (!payfor (player, amount)) { notify (player, "You don't have that many cookies to give!"); } else { /* he can do it */ switch (Typeof (who)) { case TYPE_PLAYER: db[who].sp.player.pennies += amount; sprintf (buf, "You give %d %s to %s.", amount, amount == 1 ? "cookie" : "cookies", db[who].name); notify (player, buf); sprintf (buf, "%s gives you %d %s.", db[player].name, amount, amount == 1 ? "cookie" : "cookies"); notify (who, buf); break; case TYPE_THING: db[who].sp.thing.value += amount; sprintf (buf, "You change the value of %s to %d %s.", db[who].name, db[who].sp.thing.value, db[who].sp.thing.value == 1 ? "cookie" : "cookies"); notify (player, buf); break; default: notify (player, "You can't give cookies to that!"); break; } } }