muse1.7b4/
muse1.7b4/config/
muse1.7b4/doc/
muse1.7b4/run/
muse1.7b4/run/db/
muse1.7b4/src/
muse1.7b4/src/db/
muse1.7b4/src/files/
muse1.7b4/src/io/
muse1.7b4/src/prog/
muse1.7b4/src/util/
/* rob.c */
/* $Id: rob.c,v 1.3 1993/01/30 03:38:43 nils Exp $ */

#include "copyright.h"
#include <ctype.h>

/* rob and kill */

#include "db.h"
#include "config.h"
#include "interface.h"
#include "match.h"
#include "externs.h"
#ifdef INCLUDE_ROB
void do_rob(player,what)
     dbref player;
 char *what;
{
  dbref thing;
  
  if ( Guest(db[player].owner) )  {
    notify(player, "Guests don't use money!");
    return;
  }
  
  init_match(player, what, TYPE_PLAYER);
  match_neighbor();
  match_me();
  if(power(player, TYPE_HONWIZ)) {
    match_absolute();
    match_player();
  }
  thing = match_result();
  
  if ( Guest(db[thing].owner) )  {
    notify(player, "You can't rob guests.");
    return;
  }
  
  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(Pennies(thing) < 1) {
      notify(player,tprintf( "%s has no credits.", db[thing].name));
      notify(thing,    
	     tprintf(
		     "%s tried to rob you, but you have no credits to take.",
		     db[player].name));
    } else if(could_doit(player, thing, A_LOCK)) {
      /* steal a penny */
      giveto(player,1);
      giveto(thing,-1);
      notify(player, "You stole a Credit.");
      notify(thing,
	     tprintf( "%s stole one of your Credits!", db[player].name));
      did_it(player,thing,A_SUCC,NULL,A_OSUCC,NULL,A_ASUCC);
    }
    else 
      did_it(player,thing,A_FAIL,"Your conscience tells you not to.",
	     A_OFAIL,NULL,A_AFAIL);
    break;
  }
}
#endif
#ifdef ILL_MIN_COST
void do_kill(player,what,cost)
     dbref player;
 char *what;
     int cost;
{
  dbref victim;
  char buf[BUFFER_LEN+100];
  char buf1[BUFFER_LEN+100];
  
  if ( Guest(db[player].owner) )  {
    notify(player, "Guests can't kill!");
    return;
  }
  
  init_match(player, what, TYPE_PLAYER);
  match_neighbor();
  match_me();
  match_here();
  if(power(player, POW_REMOTE)) {
    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 ( Guest(db[victim].owner) )
      notify(player, "Guests are immune to being killed.");
    if((Typeof(victim) != TYPE_PLAYER) && (Typeof(victim)!=TYPE_THING))
      notify(player, "Sorry, you can only kill other players.");
    else if (((db[db[victim].location].flags & HAVEN) &&
	      !power(player, POW_MODIFY)) ||
	     (controls(victim,db[victim].location, POW_MODIFY) &&
	      !controls(player,db[victim].location, POW_MODIFY))){
      notify(player, "Sorry.");
    } else {
      /* go for it */
      /* set cost */
      if(cost < KILL_MIN_COST) cost = KILL_MIN_COST;
      
      /* see if it works */
      if(!payfor(player, cost)) {
	notify(player, "You don't have enough Credits.");
      } else if((random() % KILL_BASE_COST) < cost
		&& !power(victim, POW_SLAY)) {
	/* you killed him */
	sprintf(buf, "You killed %s!", db[victim].name);
	sprintf(buf1,"killed %s!",db[victim].name);
	if (Typeof(victim)==TYPE_THING)
	  do_halt(victim,"");
	did_it(player,victim,A_KILL,buf,A_OKILL,buf1,A_AKILL);
	
	/* notify victim */
	sprintf(buf, "%s killed you!", db[player].name);
	notify(victim, buf);
	
	/* maybe pay off the bonus */
	if(Pennies(db[victim].owner) < MAX_PENNIES) {
	  sprintf(buf, "Your insurance policy pays %d Credits.",
		  KILL_BONUS);
	  notify(victim, buf);
	  giveto(db[victim].owner,KILL_BONUS);
	} else {
	  notify(victim, "Your insurance policy has been revoked.");
	}
	
	/* send him home */
	safe_tel(victim,HOME);
	/* if victim is object also dequeue all commands */
      } 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;
    }
  }
}
#endif
void do_slay(player,what)
     dbref player;
 char *what;
{
  dbref victim;
  char buf[BUFFER_LEN+100];
  char buf1[BUFFER_LEN+100];
  
  if ( ! power(player, POW_SLAY)) {
    notify(player, "You do not have such power.");
    return; 
  }
  
  init_match(player, what, TYPE_PLAYER);
  match_neighbor();
  match_me();
  match_here();
  if(power(player, POW_REMOTE)) {
    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) && (Typeof(victim)!=TYPE_THING)) {
      notify(player, "Sorry, you can only kill other players.");
      /*    } else if (!controls(player,victim)){*/
    } else if (Level(player)<Levnm(victim)) {
      notify(player, "Sorry.");
    } else {
      /* go for it */
      /* you killed him */
      sprintf(buf, "You killed %s!", db[victim].name);
      sprintf(buf1,"killed %s!",db[victim].name);
      if (Typeof(victim)==TYPE_THING)
	do_halt(victim,"");
      did_it(player,victim,A_KILL,buf,A_OKILL,buf1,A_AKILL);
      
      /* notify victim */
      sprintf(buf, "%s killed you!", db[player].name);
      notify(victim, buf);
      
      
      /* send him home */
      safe_tel(victim,HOME);
    }
    break;
  }
}
void do_giveto(player,who,amnt)
     dbref player;
     char *who;
     char *amnt;
{
  int amount;
  dbref recipt;

  if(!power(player,POW_MEMBER)) {
    notify(player,"Silly, you can't give out money!");
    return;
  }
  init_match(player,who,TYPE_PLAYER);
  match_player();
  match_absolute();
  match_neighbor();
  recipt=noisy_match_result();
  if(recipt==NOTHING) {
    return;
  }
  amount=atoi(amnt);
  if(amount<1) {
    notify(player,"You can only @giveto positive amounts.");
    return;
  }
  if(!payfor(player,amount)) {
    notify(player,"You can't pay for that much1");
    return;
  }
  giveto(recipt,amount);
  notify(player,"Given.");
}

void do_give(player,recipient,amnt)
     dbref player;
     char *recipient;
     char *amnt;
{
  dbref who;               
  int amount;
  char buf[BUFFER_LEN];
  char *s;
  
  if ( Guest(db[player].owner) )  {
    notify(player, "Sorry, guests can't do that!");
    return;
  }
  
  /* check recipient */
  init_match(player, recipient, TYPE_PLAYER);
  match_neighbor();
  match_me();
  if(power(player, POW_REMOTE)) {
    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;
    }
  
  /* make sure amount is all digits */
  for(s=amnt;*s && ((isdigit(*s)) || (*s=='-'));s++);
  /* must be giving object */
  if (*s)
    {
      dbref thing;
      
      init_match(player, amnt, TYPE_THING);
      match_possession();
      match_me();
      switch(thing = match_result())
	{
        case NOTHING:
	  notify(player, "You don't have that!");
	  return;
        case AMBIGUOUS:
	  notify(player, "I don't know which you mean!");
	  return;
        default:     
	  if (((Typeof(thing)==TYPE_THING) || (Typeof(thing)==TYPE_PLAYER)) &&
	      (((db[who].flags & ENTER_OK) && could_doit(player,thing,A_LOCK))
		|| controls(player,who, POW_TELEPORT)))
	    {  
	      moveto(thing,who);
	      notify(who,
		     tprintf("%s gave you %s.",db[player].name,db[thing].name));
	      notify(player,"Given.");
	      notify(thing,tprintf("%s gave you to %s.",db[player].name,
				   db[who].name));
	    }
	  else
	    notify(player,"Permission denied.");
	}
      return;
    }
  amount=atoi(amnt);
  /* do amount consistency check */
  if(amount < 0 && !power(player, POW_STEAL)) {
    notify(player, "Try using the \"rob\" command.");
    return;
  } else if(amount == 0) {
    notify(player, "You must specify a positive number of Credits.");
    return;
  }  
  
  if(!power(player, POW_STEAL)) {
    if(Pennies(who) + amount > MAX_PENNIES) {
      notify(player, "That player doesn't need that many Credits!");
      return;
    }
  }
  
  /* try to do the give */
  if(!payfor(player, amount)) {
    notify(player, "You don't have that many Credits to give!");
  } else {
    /* objects work differently */
    if (Typeof(who)==TYPE_THING)
      {
	int cost;
	if (amount<(cost=atoi(atr_get(who,A_COST))))
	  {
            notify(player,"Feeling poor today?");
            giveto(player,amount);
            return;
	  }
	if (cost<0)
	  return;
	if((amount-cost) > 0 ) {
          sprintf(buf,"You get %d in change.",amount-cost);
	}
	else {
	  sprintf(buf,"You paid %d credits.",amount);
	}
	notify(player,buf);
	giveto(player,amount-cost);
	giveto(who,cost);
	did_it(player,who,A_PAY,NULL,A_OPAY,NULL,A_APAY);
	return;
      }       
    else
      {
	/* he can do it */
	notify(player,
	       tprintf( "You give %d Credits to %s.",
		       amount,
		       db[who].name));
	if(Typeof(who) == TYPE_PLAYER) {
	  notify(who,
		 tprintf( "%s gives you %d Credits.",
			 db[player].name,
			 amount));
	}
	giveto(who,amount);  
	did_it(player,who,A_PAY,NULL,A_OPAY,NULL,A_APAY);
      }
  }
}