swrots/.slog/
swrots/doc/mudprogs/
swrots/gods/
swrots/html/profiles/
swrots/log/
swrots/planets/
swrots/player/
swrots/player/u/
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"

void do_plantbug( CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *victim;
 BUG_DATA *bug;
 BUG_DATA *cbug;
 OBJ_DATA *obj;
 bool checkbug = FALSE;
 int chance;
	
	if(IS_NPC(ch)) return;
	
	if ((victim = get_char_room(ch, argument)) == NULL){
		send_to_char("They aren't here.\n\r", ch);
		return;
	}

	if (IS_NPC(victim))
	{
	  send_to_char("You can't bug NPC's!\n\r", ch);
	  return;
	}

        if (IS_IMMORTAL(victim))
	{
	  send_to_char("Don't try to plant bugs on immortals.\n\r", ch);
	  return;
	} 

	if(in_arena(ch))
	{
	  send_to_char("You're here to FIGHT, not spy.\n\r", ch);
	  return;
	}

        if( ch == victim)
	{
	  send_to_char("You can't bug yourself!\n\r", ch);
	  return;
	}

        for(obj = ch->last_carrying; obj; obj = obj->prev_content)
	 if(obj->item_type == ITEM_BUG)
	  checkbug = TRUE;
	
        if(checkbug == FALSE)
	{
	 send_to_char("You don't have any bugs to plant.\n\r", ch);
	 return;
        }

	for(cbug=victim->first_bug;cbug;cbug=cbug->next_in_bug)
	  if(!str_cmp(ch->name, cbug->name)){
	  	send_to_char("You have already planted a bug on this person.\n\r", ch);
	  	return;
	  }
	
	chance = number_percent( ) - UMIN(0,(get_curr_lck(ch) - 14)) 
        + UMIN(0,(get_curr_lck(victim) - 13));
        
        if (chance < 0){
        	act(AT_WHITE, "You carefully reach into $N's pocket and place a bug.", ch, NULL, victim, TO_CHAR);
        	CREATE(bug, BUG_DATA, 1);
        	bug->name = ch->name;
        	LINK(bug, victim->first_bug, victim->last_bug, next_in_bug, prev_in_bug);

	  for(obj = ch->last_carrying; obj; obj = obj->prev_content)
	  {
	   if(obj->item_type == ITEM_BUG)
	   {
	    separate_obj(obj); obj_from_char(obj); extract_obj(obj);
	    break;
	   }
          }
        	return;
        }
        else {
        	send_to_char("&RYou try to find a pocket to plant the bug in but fail!\n\r", ch);
		if(number_bits(0) == 0)
		  ch_printf(victim, "You feel a slight brush against your pocket to find %s's hand there.\n\r", PERS(ch, victim));
        	return;
        }
}

void do_showbugs( CHAR_DATA *ch, char *argument ){
  DESCRIPTOR_DATA *d;
  CHAR_DATA *victim;
  int chance;
  char buf2[MAX_STRING_LENGTH];
  SHIP_DATA *ship;
  BUG_DATA *bug;
  char buf[MAX_STRING_LENGTH];
  chance = number_percent() - 20;
  if (chance > 0)
  {
  	send_to_char("You can't figure out what to do.\n\r", ch);
  	return;
  }
  send_to_char("Player                Planet/Ship        Room Name\n\r", ch);
  send_to_char("------                -----------        ---------\n\r", ch);
    
  for ( d = first_descriptor; d; d = d->next )
    if ( (d->connected == CON_PLAYING || d->connected == CON_EDITING )
    && ( victim = d->character ) != NULL){
      for(bug=victim->first_bug;bug;bug=bug->next_in_bug)
        if(!str_cmp(bug->name, ch->name)){
          if(victim->in_room->area && victim->in_room->area->planet)
            sprintf(buf2, "%s", victim->in_room->area->planet->name);
          else if((ship = ship_from_room(victim->in_room->vnum)) != NULL)
            sprintf(buf2, "%s", ship->name);
          else
            sprintf(buf2, "Unknown");  
          sprintf(buf, "%-21.21s %-18.18s %s\n\r", PERS(victim, ch), buf2, victim->in_room->name);
          send_to_char(buf, ch);
          break;
        }
    }
}
		
void do_bind( CHAR_DATA *ch, char *argument )
{
  OBJ_DATA *obj;
  OBJ_DATA *tobj;
  int chance;
  CHAR_DATA *victim;
  bool checkbinders=FALSE;
  
  if (argument[0] == '\0')
  {
  	send_to_char("Syntax: Bind <victim>\n\r", ch);
  	return;
  }
  
  if ((victim = get_char_room(ch, argument)) == NULL)
  {
  	send_to_char("They are not here.\n\r", ch);
  	return;
  }

  if (victim == ch)
  {
  	send_to_char("You can not bind yourself!\n\r", ch);
  	return;
  }

  if (IS_NPC(victim))
  {
	send_to_char("You can only bind players.\n\r", ch);
	return;
  }
  
  if (IS_SET(victim->pcdata->act2, ACT_BOUND))
  {
  	send_to_char("They've already been bound!\n\r", ch);
  	return;
  }

  for(obj = ch->last_carrying; obj; obj = obj->prev_content)
   if(obj->item_type == ITEM_BINDERS)
   {
    checkbinders = TRUE;
    break;
   }

  if(checkbinders == FALSE)
  {
   send_to_char("You don't have any binders to bind them with.\n\r", ch);
   return;
  }

  if (victim->position != POS_STUNNED && victim->position != POS_SLEEPING)
  {
  	send_to_char("They need to be stunned or asleep.\n\r", ch);
  	return;
  }
  
  chance = (int) (0);

  if( number_percent() < chance)
  {
  separate_obj(obj); obj_from_char(obj); obj_to_char(obj,victim);
  act(AT_WHITE, "You quickly bind $N's wrists.", ch, NULL, victim, TO_CHAR);
  act(AT_WHITE, "$n quickly binds your wrists.", ch, NULL, victim, TO_VICT);
  act(AT_WHITE, "$n quickly binds $N's wrists.", ch, NULL, victim, TO_NOTVICT);
  tobj = get_eq_char( ch, WEAR_BOTH_WRISTS );
  if(tobj)
    unequip_char(ch, tobj);

  equip_char(victim, obj, WEAR_BOTH_WRISTS);
  SET_BIT(victim->pcdata->act2, ACT_BOUND);
  }
  else
   send_to_char("You peer at the binders, curious upon how to use them.\n\r", ch);

 return;
}

void do_unbind( CHAR_DATA *ch, char *argument )
{
  OBJ_DATA *obj;
  bool checkbinders=FALSE;
  char buf[MAX_STRING_LENGTH];
  CHAR_DATA *victim;
  
  if (IS_NPC(ch))
  {
	send_to_char("You're a mob.\n\r", ch);
	return;
  }

  if (argument[0] == '\0')
  {
  	send_to_char("Syntax: Unbind <victim>\n\r", ch);
  	return;
  }
  
  if ((victim = get_char_room(ch, argument)) == NULL){
  	send_to_char("They aren't here.\n\r", ch);
  	return;
  }
  
  if (victim == ch){
  	send_to_char("You can not unbind yourself!\n\r", ch);
  	return;
  }
  
  if (IS_NPC(victim))
  {
	send_to_char("You can only unbind players.\n\r", ch);
	return;
  }

  if (IS_SET(ch->pcdata->act2, ACT_BOUND))
  {
  	send_to_char("Nice try. You're bound yourself!\n\r", ch);
  	return;
  }

  if (!IS_SET(victim->pcdata->act2, ACT_BOUND))
  {
  	send_to_char("But they're not bound.\n\r", ch);
  	return;
  }


  obj = get_eq_char( victim, WEAR_BOTH_WRISTS );
  if(obj)
    unequip_char(victim, obj);
  else
  {
    send_to_char("Something went wrong. get an imm.\n\r", ch);
    sprintf(buf, "%s unbinding %s: has no bothwrists object!", ch->name, victim->name);
    bug(buf);
    return;
  }

  for(obj = victim->last_carrying; obj; obj = obj->prev_content)
   if(obj->item_type == ITEM_BINDERS)
   {
    checkbinders = TRUE;
    break;
   }

  if(checkbinders == FALSE)
  {
   bug("Unbind: no binders in victims inventory.");
   send_to_char("Something went wrong. get an imm.\n\r", ch);
   return;
  }

  separate_obj(obj); obj_from_char(obj); obj_to_char(obj, ch);
  act(AT_WHITE, "You quickly unbind $N's wrists.", ch, NULL, victim, TO_CHAR);
  act(AT_WHITE, "$n quickly unbinds your wrists.", ch, NULL, victim, TO_VICT);
  act(AT_WHITE, "$n quickly unbinds $N's wrists.", ch, NULL, victim, TO_NOTVICT);
  REMOVE_BIT(victim->pcdata->act2, ACT_BOUND);
}  

void do_gag( CHAR_DATA *ch, char *argument )
{  
  CHAR_DATA *victim;
  int chance;

  if (argument[0] == '\0')
  {
  	send_to_char("Syntax: Gag <victim>\n\r", ch);
  	return;
  }
  
  if ((victim = get_char_room(ch, argument)) == NULL)
  {
  	send_to_char("They are not here.\n\r", ch);
  	return;
  }

  if (victim == ch)
  {
  	send_to_char("You can not gag yourself!\n\r", ch);
  	return;
  }
  
  if (IS_NPC(victim))
  {
	send_to_char("You can only gag players.\n\r", ch);
	return;
  }

  if ((victim->position != POS_STUNNED) && (victim->position != POS_SLEEPING) && !IS_SET(victim->pcdata->act2, ACT_BOUND))
  {
  	send_to_char("They need to be stunned, asleep, or bound.\n\r", ch);
  	return;
  }

  chance = (int) (0);

  if( number_percent() < chance)  
  {
   act(AT_WHITE, "You quickly place a gag over $N's mouth.", ch, NULL, victim, TO_CHAR);
   act(AT_WHITE, "$n roughly puts a gag over your mouth.", ch, NULL, victim, TO_VICT);
   act(AT_WHITE, "$n roughly places a gag on $N's mouth.", ch, NULL, victim, TO_NOTVICT);
   SET_BIT(victim->pcdata->act2, ACT_GAGGED);
  }
  else
   send_to_char("You look puzzled as you wonder how to put on such a contraption.\n\r",ch);

  return;
}

void do_ungag( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  
  if (argument[0] == '\0')
  {
  	send_to_char("Syntax: Ungag <victim>\n\r", ch);
  	return;
  }
  
  if ((victim = get_char_room(ch, argument)) == NULL)
  {
  	send_to_char("They aren't here.\n\r", ch);
  	return;
  }
  
  if (victim == ch && IS_SET(victim->pcdata->act2, ACT_BOUND))
  {
  	send_to_char("You can not ungag yourself when you're bound!\n\r", ch);
  	return;
  }
  
  if (IS_NPC(victim))
  {
	send_to_char("You can only ungag players.\n\r", ch);
	return;
  }

  if (!IS_SET(victim->pcdata->act2, ACT_GAGGED)){
  	send_to_char("But they're not gagged.\n\r", ch);
  	return;
  }

  if( victim != ch)
  {
   act(AT_WHITE, "You quickly rip off $N's gag.", ch, NULL, victim, TO_CHAR);
   act(AT_WHITE, "$n quickly rips off your gag.", ch, NULL, victim, TO_VICT);
   act(AT_WHITE, "$n quickly rips off $N's gag.", ch, NULL, victim, TO_NOTVICT);
  }
  else
  {
   act(AT_WHITE, "You quickly rip off your gag.", ch, NULL, victim, TO_CHAR);
   act(AT_WHITE, "$n quickly rips off his gag.", ch, NULL, victim, TO_NOTVICT);
  }

  REMOVE_BIT(victim->pcdata->act2, ACT_GAGGED);
}  
  
void do_ambush( CHAR_DATA *ch, char *argument ){
  CHAR_DATA *victim;
  int percent;
  
  if (argument[0] == '\0'){
  	send_to_char("Syntax: Ambush <victim>\n\r", ch);
  	return;
  }
  
  if (IS_NPC(ch)){
  	send_to_char("Only players may use this ability.\n\r", ch);
  	return;
  }
  
  if ((victim = get_char_room(ch, argument)) == NULL){
  	send_to_char("How can you ambush someone who's not even here.\n\r", ch);
  	return;
  }
  
  if (ch == victim){
  	send_to_char("How can you possibly ambush yourself?\n\r", ch);
  	return;
  }
  
  if (ch->position == POS_FIGHTING){
  	send_to_char("You are already fighting someone!\n\r", ch);
  	return;
  } 
  
  if (victim->position == POS_FIGHTING){
  	send_to_char("They are already fighting someone!\n\r", ch);
  	return;
  }
  
  if ( victim->position <= POS_STUNNED )
  {
      send_to_char( "Come now, there's no honor in that!\n\r", ch);
      return;
  }

  if (!IS_SET(ch->affected_by, AFF_SNEAK)){
  	send_to_char("You are moving far too loudly to ambush someone!\n\r", ch);
  	return;
  }
  percent = number_percent( ) - (get_curr_lck(ch) - 14) 
      + (get_curr_lck(victim) - 13);

    affect_strip ( ch, gsn_sneak                        );
    REMOVE_BIT   ( ch->affected_by, AFF_HIDE            );
    REMOVE_BIT   ( ch->affected_by, AFF_SNEAK           );

    
  act(AT_RED, "You jump out from behind $N and attack $M!", ch, NULL, victim, TO_CHAR);
  act(AT_RED, "$n jumps out from behind you and attacks you!", ch, NULL, victim, TO_VICT);
  act(AT_RED, "$n jumps out from behind $N and attacks $M!", ch, NULL, victim, TO_NOTVICT);
    if ( !IS_AWAKE(victim) || percent < 0 ){
       multi_hit(ch, victim, TYPE_HIT);
    }
    else {
	global_retcode = damage( ch, victim, 0, TYPE_HIT, FALSE );
    }    	
}

//Contract System by Tawnos.
void do_contract( CHAR_DATA *ch, char *argument )
{
   CHAR_DATA *victim;
   CHAR_DATA *target;
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   char arg3[MAX_INPUT_LENGTH];
   long amount = 0;
   CONTRACT_DATA *ccontract;
   CONTRACT_DATA *contract;

   argument = one_argument( argument , arg1 );
   argument = one_argument( argument , arg2 );
   argument = one_argument( argument , arg3 );

   if(IS_NPC(ch))
     return;

   if(arg1[0] =='\0' || arg2[0] == '\0' || arg3[0] == '\0')
   {
     send_to_char("&RSyntax: contract <person> <target> <amount>\n\r", ch);
     return;
   }

   if ((victim = get_char_room(ch, arg1)) == NULL)
   {
     send_to_char("They aren't here.\n\r", ch);
     return;
   }

   if ((target = get_char_world_ooc(ch, arg2)) == NULL)
   {
     send_to_char("Your target is currently not online.\n\r", ch);
     return;
   }

   if ( ch == victim)
   {
     send_to_char("You can't contract yourself!\n\r", ch);
     return;
   }

   if (IS_NPC(victim) || IS_NPC(target) )
   {
     send_to_char("You can't contract NPC's.\n\r", ch);
     return;
   }

   if ( ch == target)
   {
     send_to_char("You can't contract against yourself!\n\r", ch);
     return;
   }

   if ( target == victim)
   {
     send_to_char("You can't contract them to kill themself!\n\r", ch);
     return;
   }

    amount = atoi(arg3);

    if(amount < 5000)
    {
      send_to_char("&RYour contract must be for at least 5000 credits.\n\r", ch);
      return;
    }
    
    if( ch->gold < amount)
    {
      send_to_char("&RYou don't have enough credits!\n\r", ch);
      return;
    }

    for(ccontract=victim->first_contract;ccontract;ccontract=ccontract->next_in_contract)
    {
      if(!str_cmp(ccontract->target, target->name))
      {
       ch->gold -= amount;
       ccontract->amount += amount;
       ch_printf(ch, "&GYou have contracted %s to kill %s for an amount of %d credits.\n\r", PERS(victim, ch), target->name, amount);
       ch_printf(victim, "&G%s has contracted you to kill %s, raising your contract reward by %d credits.\n\r",PERS(ch, victim), target->name, amount);
       return;
      }
    }

     CREATE(contract, CONTRACT_DATA, 1);
       contract->target = target->name;
       contract->amount = amount;
       LINK(contract, victim->first_contract, victim->last_contract,next_in_contract, prev_in_contract);

       ch->gold -= amount;
       ch_printf(ch, "&GYou have contracted %s to kill %s for an amount of %d credits.\n\r", PERS(victim, ch), target->name, amount);
       ch_printf(victim, "&G%s has contracted you to kill %s for an amount of %d credits.\n\r", PERS(ch, victim), target->name, amount);    

}

void do_showcontracts(CHAR_DATA *ch, char *argument)
{
 CONTRACT_DATA *contract;

 send_to_char("&R   Target   &W|&R Amount\n\r", ch);
 send_to_char("&W------------|----------\n\r", ch);
 
for(contract=ch->first_contract;contract;contract=contract->next_in_contract)
    {
	ch_printf(ch, "&R%-12s&W|&R %d&W\n\r", contract->target, 
contract->amount);
    }

}

void do_remcontract(CHAR_DATA *ch, char *argument)
{
 CONTRACT_DATA *contract;
 CONTRACT_DATA *scontract=NULL;

 if(argument[0] == '\0')
 {
   send_to_char("&RSyntax: remcontract <target name>\n\r", ch);
   return;
 }

for(contract=ch->first_contract;contract;contract=contract->next_in_contract)
    {
      if(!str_cmp(contract->target, argument))
      {
	scontract = contract;
	break;
      }
    }

 if(!scontract || scontract == NULL)
 {
   send_to_char("No such target.\n\r", ch);
   return;
 }

  STRFREE(scontract->target);
  UNLINK(scontract, ch->first_contract, ch->last_contract, next_in_contract, prev_in_contract);
  DISPOSE(scontract);

 send_to_char("Contract removed.\n\r", ch);
 return;

}