swfote2.1/.slog/
swfote2.1/backup/u/
swfote2.1/bin/cygwin/
swfote2.1/building/
swfote2.1/doc/mudprogs/
swfote2.1/gods/
swfote2.1/html/profiles/
swfote2.1/player/
swfote2.1/player/u/
 /*********************************************************************************** 
 *                                                                                  *
 *          _______.____    __    ____       _______                  _______       *
 *         /       |\   \  /  \  /   /  _   |   ____|          __    |   ____|      *
 *        |   (----` \   \/    \/   /  (_)  |  |__    ____   _/  |_  |  |__         *
 *         \   \      \            /    _   |   __|  /  _ \  \   __\ |   __|        *
 *     .----)   |      \    /\    /    (_)  |  |    (  <_> )  |  |   |  |____       *
 *     |_______/        \__/  \__/          |__|     \____/   |__|   |_______|      *
 *                                                                                  *
 * SWFotE v2.0 (FotE v1.1 cleaned up and considerably modded)  by:                  *
 * Greg (Keberus) Mosley                                                            *
 * Roman (Trelar) Arnold                                                            *
 *                                                                                  *
 * SWFotE v1 & v1.1 copyright (c) 2002 was created by                               *
 * Chris 'Tawnos' Dary (cadary@uwm.edu),                                            *
 * Korey 'Eleven' King (no email),                                                  *
 * Matt 'Trillen' White (mwhite17@ureach.com),                                      *
 * Daniel 'Danimal' Berrill (danimal924@yahoo.com),                                 *
 * Richard 'Bambua' Berrill (email unknown),                                        *
 * Stuart 'Ackbar' Unknown (email unknown)                                          *
 *                                                                                  *
 * SWR 1.0 copyright (c) 1997, 1998 was created by Sean Cooper                      *
 * based on a concept and ideas from the original SWR immortals:                    *
 * Himself (Durga), Mark Matt (Merth), Jp Coldarone (Exar), Greg Baily (Thrawn),    *
 * Ackbar, Satin, Streen and Bib as well as much input from our other builders      *
 * and players.                                                                     *
 *                                                                                  *
 * Original SMAUG 1.4a written by Thoric (Derek Snider) with Altrag,                *
 * Blodkai, Haus, Narn, Scryn, Swordbearer, Tricops, Gorog, Rennard,                *
 * Grishnakh, Fireblade, and Nivek.                                                 *
 *                                                                                  *
 * Original MERC 2.1 code by Hatchet, Furey, and Kahn.                              *
 *                                                                                  *
 * Original DikuMUD code by: Hans Staerfeldt, Katja Nyboe, Tom Madsen,              *
 * Michael Seifert, and Sebastian Hammer.                                           *
 *                                                                                  *
 ***********************************************************************************/

#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 < ch->pcdata->learned[gsn_plantbug]){
        	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);
        	learn_from_success(ch, gsn_plantbug);

	  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);
        	learn_from_failure(ch, gsn_plantbug);
		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 > ch->pcdata->learned[gsn_showbugs])
  {
  	send_to_char("You can't figure out what to do.\n\r", ch);
	learn_from_failure(ch,gsn_showbugs);
  	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;
        }
    }
    learn_from_success(ch,gsn_showbugs);
}
		
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) (ch->pcdata->learned[gsn_bind]);

  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);
  learn_from_success(ch, gsn_bind);
  }
  else
  {
  send_to_char("You peer at the binders, curious upon how to use them.\n\r", ch);
  learn_from_failure(ch, gsn_bind);
  }

 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) (ch->pcdata->learned[gsn_gag]);

  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);
   learn_from_success(ch, gsn_gag);
  }
  else
  {
   send_to_char("You look puzzled as you wonder how to put on such a contraption.\n\r",ch);
   learn_from_failure(ch, gsn_gag);
  }

  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                        );
    affect_strip ( ch, gsn_silent                       );
    REMOVE_BIT   ( ch->affected_by, AFF_HIDE            );
    if (ch->race != RACE_DEFEL) /* Defel has perm invis */
    REMOVE_BIT   ( ch->affected_by, AFF_INVISIBLE       );
    if (ch->race != RACE_NOGHRI) /* Noghri has perm sneak */
    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 < ch->pcdata->learned[gsn_ambush] ){
       multi_hit(ch, victim, gsn_ambush);
       learn_from_success( ch, gsn_ambush );
    }
    else {
	learn_from_failure( ch, gsn_ambush );
	global_retcode = damage( ch, victim, 0, gsn_ambush );
    }    	
}

//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;

}