eldhamud/boards/
eldhamud/clans/
eldhamud/classes/
eldhamud/councils/
eldhamud/deity/
eldhamud/doc/
eldhamud/doc/DIKU/
eldhamud/doc/MERC/
eldhamud/doc/mudprogs/
eldhamud/gods/
eldhamud/houses/
eldhamud/lockers/
eldhamud/player/a/
/****************************************************************************
 *   _______  _        ______            _______  _______           ______   *
 *  (  ____ \( \      (  __  \ |\     /|(  ___  )(       )|\     /|(  __  \  *
 *  | (    \/| (      | (  \  )| )   ( || (   ) || () () || )   ( || (  \  ) *
 *  | (__    | |      | |   ) || (___) || (___) || || || || |   | || |   ) | *
 *  |  __)   | |      | |   | ||  ___  ||  ___  || |(_)| || |   | || |   | | *
 *  | (      | |      | |   ) || (   ) || (   ) || |   | || |   | || |   ) | *
 *  | (____/\| (____/\| (__/  )| )   ( || )   ( || )   ( || (___) || (__/  ) *
 *  (_______/(_______/(______/ |/     \||/     \||/     \|(_______)(______/  *
 *              +-+-+-+  +-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+-+-+              *
 *              |T|h|e|  |O|a|k|l|a|n|d|  |C|h|r|o|n|i|c|l|e|s|              *
 *              +-+-+-+  +-+-+-+-+-+-+-+  +-+-+-+-+-+-+-+-+-+-+              *
 * ------------------------------------------------------------------------- *
 * EldhaMUD code (C) 2003-2005 by Robert Powell (Tommi)                      *
 * EldhaMUD Team: Celest, Altere and Krelowyn                                *
 * ------------------------------------------------------------------------- *
 *                                                                           *
 ****************************************************************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "./Headers/mud.h"
#include "./Headers/commands.h"

void do_pk_toggle( CHAR_DATA * ch, char *argument )
{
   int cost = 500000;   /* Cost to change */
   CHAR_DATA *mob;

   if( argument[0] == '\0' )
   {
      send_to_char( "&RSyntax: pk-toggle on\n\r", ch );
      send_to_char( "&RSyntax: pk-toggle off\n\r", ch );
      send_to_char( "&RSee &YHELP pk-toggle &Rfor more info.\n\r", ch );
      return;
   }
   /*
    * check for toggle mob 
    */
   for( mob = ch->in_room->first_person; mob; mob = mob->next_in_room )
   {
      if( IS_NPC( mob ) && xIS_SET( mob->act, ACT_PKTOGGLE ) )
      {
         break;
      }
      else
      {
         send_to_char( "&wThere doesn't seem to be anyone here who can help you with that!\n\r", ch );
         return;
      }
   }

   if( !str_cmp( argument, "on" ) )
   {
      if( get_age( ch ) < 18 )
      {
         send_to_char( "&rYou be 18 years of age to be a Player Killer.\n\r", ch );
      }

      else
      {

         if( CAN_PKILL( ch ) )
         {
            send_to_char( "&rYou are already a Player Killer!\n\r", ch );
         }
         else
         {
            send_to_char( "&rPK has been toggled on, you are now a Deadly Player!!!\n\r", ch );
            SET_BIT( ch->pcdata->flags, PCFLAG_DEADLY );
            xREMOVE_BIT( ch->act, PLR_NICE );
            save_char_obj( ch );
            saving_char = NULL;
         }
      }
      return;
   }


   if( !str_cmp( argument, "off" ) )
   {

      if( !CAN_PKILL( ch ) )
      {
         send_to_char( "&rYou are already peaceful!\n\r", ch );
         return;
      }

      else
      {

         if( ch->gold < cost )
         {
            send_to_char( "&rYou do not have enough money to toggle PK off!\n\r", ch );
            return;
         }

         else
         {

            ch->gold -= cost;
            REMOVE_BIT( ch->pcdata->flags, PCFLAG_DEADLY );
            xSET_BIT( ch->act, PLR_NICE );
            send_to_char( "&wPk has been toggled off. You are now a peacfull player.\n\r", ch );
            save_char_obj( ch );
            saving_char = NULL;
         }

      }

      return;
   }

}

void do_travel( CHAR_DATA * ch, char *argument )
{
   CHAR_DATA *travel_mage;
   CHAR_DATA *mount;
   char buf[MAX_STRING_LENGTH];
   char arg1[MAX_STRING_LENGTH];
   char arg2[MAX_STRING_LENGTH];
   int j;

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

   travel_mage = NULL;
   for( travel_mage = ch->in_room->first_person; travel_mage; travel_mage = travel_mage->next_in_room )
   {
      if( IS_NPC( travel_mage ) && xIS_SET( travel_mage->act, ACT_TRAVELMAGE ) )
         break;
   }

   if( !travel_mage )
   {
      ch_printf( ch, "There is no travel mage here.\n\r" );
      return;
   }



   if( arg1[0] == '\0' || !strcmp( arg1, "list" ) )
   {
      int i;

      ch_printf( ch, "I offer the following locations...\n\r" );
      ch_printf( ch, " \n\r" );
      ch_printf( ch, "[Location Name                           ] [Price ]\n\r" );
      ch_printf( ch, "---------------------------------------------------\n\r" );

      for( i = 0; i < ( MAX_TRAVEL_LOCATION - 1 ); i++ )
      {
         sprintf( buf, "[%-40s] [%-6ld]\n\r", travel_table[i].long_desc, travel_table[i].cost );
         ch_printf( ch, "%s", buf );
      }

      ch_printf( ch, " \n\r" );
      ch_printf( ch, "Please type 'travel buy <location>' and have your gold ready!\n\r" );
      ch_printf( ch, "For more information type 'help travelmage' and read!\n\r" );
      return;
   }

   if( !strcmp( arg1, "buy" ) )
   {
      if( arg2[0] == '\0' )
      {
         sprintf( buf, "%s You must tell me where you wish to travel to.\n\r", ch->name );
         send_to_char( buf, travel_mage );
         return;
      }

      for( j = 0; j < MAX_TRAVEL_LOCATION; j++ )
      {
         if( !str_cmp( arg2, travel_table[j].keyword ) )
         {
            if( ch->gold < travel_table[j].cost )
            {
               sprintf( buf, "%s Sorry you dont have enough gold to travel to %s\n\r", ch->name, travel_table[j].long_desc );
               send_to_char( buf, travel_mage );
               return;
            }

            ch->gold -= travel_table[j].cost;

            act( AT_PLAIN, "$n disappears in a violet fog.\n\r", ch, NULL, NULL, TO_ROOM );
            sprintf( buf, "You are surrounded by a violet fog.{x\n\r" );
            char_from_room( ch );
            char_to_room( ch, get_room_index( travel_table[j].vnum ) );
            ch_printf( ch, "%s", buf );

            mount = ch->mount;
            if( ch->mount != NULL && ch->mount->in_room == ch->in_room )
            {
               char_from_room( mount );
               char_to_room( mount, get_room_index( travel_table[j].vnum ) );
               act( AT_PLAIN, "&M$n disappears in a violet fog.&x\n\r", ch, NULL, NULL, TO_ROOM );
            }
            do_look( ch, "" );
            return;
         }
      }
      send_to_char( "Sorry, that location is not on the list.\n\r", ch );
      return;
   }
}

void do_heal( CHAR_DATA * ch, char *argument )
{
   CHAR_DATA *mob;
   char arg[MAX_INPUT_LENGTH];
   int cost, sn;
   SPELL_FUN *spell;
   char *words;

   /*
    * Search for an act_healer 
    */
   for( mob = ch->in_room->first_person; mob; mob = mob->next_in_room )
   {
      if( IS_NPC( mob ) && xIS_SET( mob->act, ACT_HEALER ) )
         break;
   }

   if( mob == NULL )
   {
      send_to_char( "You can't do that here.\n\r", ch );
      return;
   }

   one_argument( argument, arg );

   if( arg[0] == '\0' )
   {
      /*
       * display price list 
       */
      act( AT_PLAIN, "$N says 'I offer the following spells:'", ch, NULL, mob, TO_CHAR );
      send_to_char( "  light: cure light wounds          1000 gold\n\r", ch );
      send_to_char( "  serious: cure serious wounds      1500 gold\n\r", ch );
      send_to_char( "  critical: cure critical wounds    2500 gold\n\r", ch );
      send_to_char( "  heal: healing spell               5000 gold\n\r", ch );
      send_to_char( "  blind: cure blindness             2000 gold\n\r", ch );
      send_to_char( "  poison:  cure poison              2500 gold\n\r", ch );
      send_to_char( "  curse: remove curse               5000 gold\n\r", ch );
      send_to_char( "  refresh: restore movement          500 gold\n\r", ch );
      send_to_char( "  mana:  restore mana	          1000 gold\n\r", ch );
      send_to_char( " Type heal <type> to be healed.\n\r", ch );
      return;
   }

   if( !str_cmp( arg, "light" ) )
   {
      spell = spell_smaug;
      sn = skill_lookup( "cure light" );
      words = "judicandus dies";
      cost = 1000;
   }

   else if( !str_cmp( arg, "serious" ) )
   {
      spell = spell_smaug;
      sn = skill_lookup( "cure serious" );
      words = "judicandus gzfuajg";
      cost = 1600;
   }

   else if( !str_cmp( arg, "critical" ) )
   {
      spell = spell_smaug;
      sn = skill_lookup( "cure critical" );
      words = "judicandus qfuhuqar";
      cost = 2500;
   }

   else if( !str_cmp( arg, "heal" ) )
   {
      spell = spell_smaug;
      sn = skill_lookup( "heal" );
      words = "pzar";
      cost = 5000;
   }

   else if( !str_cmp( arg, "blind" ) )
   {
      spell = spell_cure_blindness;
      sn = skill_lookup( "cure blindness" );
      words = "judicandus noselacri";
      cost = 2000;
   }

   else if( !str_cmp( arg, "poison" ) )
   {
      spell = spell_cure_poison;
      sn = skill_lookup( "cure poison" );
      words = "judicandus sausabru";
      cost = 2500;
   }

   else if( !str_cmp( arg, "curse" ) )
   {
      spell = spell_remove_curse;
      sn = skill_lookup( "remove curse" );
      words = "candussido judifgz";
      cost = 5000;
   }

   else if( !str_cmp( arg, "mana" ) )
   {
      spell = NULL;
      sn = -1;
      words = "energizer";
      cost = 1000;
   }


   else if( !str_cmp( arg, "refresh" ) )
   {
      spell = spell_smaug;
      sn = skill_lookup( "refresh" );
      words = "candusima";
      cost = 500;
   }

   else
   {
      act( AT_PLAIN, "$N says ' Type 'heal' for a list of spells.'", ch, NULL, mob, TO_CHAR );
      return;
   }

   if( cost > ch->gold )
   {
      act( AT_PLAIN, "$N says 'You do not have enough gold for my services.'", ch, NULL, mob, TO_CHAR );
      return;
   }

   WAIT_STATE( ch, PULSE_VIOLENCE );
   ch->gold -= cost;
   act( AT_PLAIN, "$n utters the words '$T'.", mob, NULL, words, TO_ROOM );

   if( spell == NULL )
   {
      ch->mana += dice( 2, 8 ) + ch->level / 3;
      ch->mana += UMIN( ch->level, ch->max_mana - ch->mana );
      send_to_char( "A warm glow passes through you.\n\r", ch );
      return;
   }

   if( sn == -1 )
      return;

   spell( sn, ch->level, mob, ch );
}

void do_restring( CHAR_DATA * ch, char *argument )
{

   CHAR_DATA *mob = NULL;
   char arg[MAX_INPUT_LENGTH];
   char arg1[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   OBJ_DATA *obj = NULL;
   int value;

   smash_tilde( argument );
   argument = one_argument( argument, arg );
   argument = one_argument( argument, arg1 );
   strcpy( arg2, argument );

   if( arg[0] == '\0' || arg1[0] == '\0' || arg2[0] == '\0' )
   {
      send_to_char( "Syntax:\n\r", ch );
      send_to_char( "  restring <Obj-Name> <Field> <String>\n\r", ch );
      send_to_char( "    fields: name short long\n\r", ch );
      return;
   }

   if( ( obj = get_obj_world( ch, arg ) ) == NULL )
   {
      send_to_char( "There is nothing like that in all the realms.\n\r", ch );
      return;
   }

   for( mob = ch->in_room->first_person; mob; mob = ch->next_in_room )
   {
      if( IS_NPC( mob ) && xIS_SET( mob->act, ACT_RESTRING ) )
         break;
   }

   if( !mob )
   {
      send_to_char( "You need to be at a restringer to do that.\n\r", ch );
      return;
   }

   if( ch->gold < 2000 )
   {
      send_to_char( "&rYou do not have enough money to restring anything!\n\r", ch );
      return;
   }

   strcpy( arg, obj->name );
   separate_obj( obj );
   value = atoi( arg2 );
   if( !str_cmp( arg1, "name" ) )
   {
      STRFREE( obj->name );
      obj->name = STRALLOC( arg2 );
      send_to_char( "Ok.\n\r", ch );
      ch->gold -= 2000;
      return;
   }

   if( !str_cmp( arg1, "short" ) )
   {
      STRFREE( obj->short_descr );
      obj->short_descr = STRALLOC( arg2 );
      send_to_char( "Ok.\n\r", ch );
      ch->gold -= 2000;
      return;
   }

   if( !str_cmp( arg1, "long" ) )
   {
      STRFREE( obj->description );
      obj->description = STRALLOC( arg2 );
      send_to_char( "Ok.\n\r", ch );
      ch->gold -= 2000;
      return;
   }
}