/* $Header: /belch_a/users/rearl/tinymuck/src/RCS/rob.c,v 1.5 90/09/16 04:42:51 rearl Exp $ */
/*
* $Log: rob.c,v $
* Revision 1.5 90/09/16 04:42:51 rearl
* Preparation code added for disk-based MUCK.
*
* Revision 1.4 90/08/15 03:10:13 rearl
* Fiddled with do_kill() and put in pronoun subs for it.
*
* Revision 1.3 90/08/05 03:19:55 rearl
* Redid matching routines.
*
* Revision 1.2 90/08/02 02:16:20 rearl
* Odrop and x killed y! messages now come before y has left.
* Pronoun substitution added for player odrop.
*
* Revision 1.1 90/07/19 23:04:05 casie
* Initial revision
*
*
*/
#include "copyright.h"
#include "config.h"
/* rob and kill */
#include "db.h"
#include "params.h"
#include "interface.h"
#include "match.h"
#include "externs.h"
void do_kill(dbref player, const char *what, int Cost)
{
dbref victim;
char buf[BUFFER_LEN];
struct match_data md;
init_match(player, what, TYPE_PLAYER, &md);
match_neighbor(&md);
match_me(&md);
if(Arch(player)) {
match_player(&md);
match_absolute(&md);
}
victim = match_result(&md);
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 && Typeof(victim)!=TYPE_THING) {
notify(player, "Sorry, you can only kill other players and objects.");
} else {
/* go for it */
/* set Cost */
if(Cost < KILL_MIN_COST) Cost = KILL_MIN_COST;
#ifdef HAVEN
if (Haven(DBFETCH(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 pennies.");
} else if((random() % KILL_BASE_COST) < Cost
&& !controls(victim, DBFETCH(victim)->location)) {
/* you killed him */
if(get_attr(victim,"Kill"))
/* give him the drop message */
notify(player, get_attr(victim,"Kill"));
else
{
sprintf(buf, "You killed %s!", NAME(victim));
notify(player, buf);
}
/* now notify everybody else */
if (get_attr(victim,"Okill"))
sprintf(buf, "%s %s", NAME(victim),
pronoun_substitute(player,
get_attr(victim,"Okill"),
victim));
else {
sprintf(buf, "%s killed %s!", NAME(player), NAME(victim));
}
notify_except(DBFETCH(DBFETCH(player)->location)->contents,
player, buf);
/* maybe pay off the bonus */
#if (KILL_BONUS) != 0
if(DBFETCH(victim)->sp.player.pennies < MAX_PENNIES) {
sprintf(buf, "Your insurance policy pays %d pennies.",
KILL_BONUS);
notify(victim, buf);
DBFETCH(victim)->sp.player.pennies += KILL_BONUS;
DBDIRTY(victim);
DBDIRTY(OWNER(victim));
} else {
notify(victim, "Your insurance policy has been revoked.");
}
#endif /* KILL_BONUS */
/* send him home */
send_home(victim);
halt_long(victim);
if(get_attr(victim, "Akill"))
trigobj(victim, get_attr(victim, "Akill"), player);
} else {
/* notify player and victim only */
notify(player, "Your murder attempt failed.");
sprintf(buf, "%s tried to kill you!", NAME(player));
notify(victim, buf);
}
break;
}
}
}
void do_give(dbref player, const char *recipient, int amount)
{
dbref who;
char buf[BUFFER_LEN];
struct match_data md;
/* do amount consistency check */
if(amount < 0 && !(Arch(player))) {
notify(player, "Try using the \"rob\" command.");
return;
}
/* check recipient */
init_match(player, recipient, TYPE_PLAYER, &md);
match_neighbor(&md);
match_me(&md);
match_possession(&md);
match_here(&md);
if(Arch(player)) {
match_player(&md);
match_absolute(&md);
}
switch(who = match_result(&md)) {
case NOTHING:
notify(player, "Give to whom?");
return;
case AMBIGUOUS:
notify(player, "I don't know who you mean!");
return;
default:
if(!Arch(player)) {
if((Typeof(who) != TYPE_PLAYER) && (Typeof(who) != TYPE_THING)) {
notify(player, "You can only give to other players.");
return;
} else if(DBFETCH(who)->sp.player.pennies + amount > MAX_PENNIES) {
notify(player, "That player doesn't need that many pennies!");
return;
}
}
break;
}
/* try to do the give */
if(!payfor(player, amount)) {
notify(player, "You don't have that many pennies to give!");
} else {
/* he can do it */
switch(Typeof(who)) {
case TYPE_PLAYER:
DBFETCH(who)->sp.player.pennies += amount;
sprintf(buf, "You give %d %s to %s.",
amount,
amount == 1 ? "penny" : "pennies",
NAME(who));
notify(player, buf);
sprintf(buf, "%s gives you %d %s.",
NAME(player),
amount,
amount == 1 ? "penny" : "pennies");
notify(who, buf);
break;
case TYPE_THING:
if(!get_attr(who,"Cost")) {
if(!Arch(player) &&
(DBFETCH(who)->sp.thing.value + amount > MAX_OBJECT_DEPOSIT)) {
sprintf(buf,
"Object cannot exceed the maximum value of %d pennies.",
MAX_OBJECT_DEPOSIT);
notify(player, buf);
}
else {
DBFETCH(who)->sp.thing.value += amount;
sprintf(buf, "You change the value of %s to %d %s.",
NAME(who),
DBFETCH(who)->sp.thing.value,
DBFETCH(who)->sp.thing.value == 1 ? "penny" : "pennies");
notify(player, buf);
}
return;
}
if(amount < atoi(get_attr(who,"Cost"))) {
notify(player, "Feeling poor today?");
return;
}
sprintf(buf,"You get %d in change.", amount-atoi(get_attr
(who,"Cost")));
notify(player,buf);
DBFETCH(player)->sp.player.pennies += /*refund the change */
amount - atoi(get_attr(who, "Cost"));
DBFETCH(who)->sp.player.pennies += atoi(get_attr(who,"Cost"));
if(get_attr(who, "Pay"))
notify(player,get_attr(who,"Pay"));
if(get_attr(who, "Opay")) {
dbref where = DBFETCH(player)->location;
sprintf(buf,"%s %s", NAME(who), get_attr(who, "Opay"));
notify_except(DBFETCH(where)->contents, player,
pronoun_substitute(player, buf, who));
}
if(get_attr(who, "Apay"))
trigobj(who, get_attr(who, "Apay"), player);
break;
default:
notify(player, "You can't give pennies to that!");
break;
}
DBDIRTY(who);
}
}