ACT_INFO.C
上传用户:kesirui
上传日期:2007-01-07
资源大小:263k
文件大小:54k
源码类别:

Internet/网络编程

开发平台:

WINDOWS

  1. /***************************************************************************
  2.  *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
  3.  *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
  4.  *                                                                         *
  5.  *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
  6.  *  Chastain, Michael Quan, and Mitchell Tse.                              *
  7.  *                                                                         *
  8.  *  In order to use any part of this Merc Diku Mud, you must comply with   *
  9.  *  both the original Diku license in 'license.doc' as well the Merc       *
  10.  *  license in 'license.txt'.  In particular, you may not remove either of *
  11.  *  these copyright notices.                                               *
  12.  *                                                                         *
  13.  *  Much time and thought has gone into this software and you are          *
  14.  *  benefitting.  We hope that you share your changes too.  What goes      *
  15.  *  around, comes around.                                                  *
  16.  ***************************************************************************/
  17. #if defined(macintosh)
  18. #include <types.h>
  19. #else
  20. #include <sys/types.h>
  21. #endif
  22. #include <ctype.h>
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include <time.h>
  27. #include "merc.h"
  28. //#ifdef WIN32s
  29. //#define crypt(d,s) strcpy(d,s)
  30. //#endif
  31. char * const where_name [] =
  32. {
  33.     "<used as light>     ",
  34.     "<worn on finger>    ",
  35.     "<worn on finger>    ",
  36.     "<worn around neck>  ",
  37.     "<worn around neck>  ",
  38.     "<worn on body>      ",
  39.     "<worn on head>      ",
  40.     "<worn on legs>      ",
  41.     "<worn on feet>      ",
  42.     "<worn on hands>     ",
  43.     "<worn on arms>      ",
  44.     "<worn as shield>    ",
  45.     "<worn about body>   ",
  46.     "<worn about waist>  ",
  47.     "<worn around wrist> ",
  48.     "<worn around wrist> ",
  49.     "<wielded>           ",
  50.     "<held>              "
  51. };
  52. /*
  53.  * Local functions.
  54.  */
  55. char * format_obj_to_char args( ( OBJ_DATA *obj, CHAR_DATA *ch,
  56.     bool fShort ) );
  57. void show_list_to_char args( ( OBJ_DATA *list, CHAR_DATA *ch,
  58.     bool fShort, bool fShowNothing ) );
  59. void show_char_to_char_0 args( ( CHAR_DATA *victim, CHAR_DATA *ch ) );
  60. void show_char_to_char_1 args( ( CHAR_DATA *victim, CHAR_DATA *ch ) );
  61. void show_char_to_char args( ( CHAR_DATA *list, CHAR_DATA *ch ) );
  62. bool check_blind args( ( CHAR_DATA *ch ) );
  63. char *format_obj_to_char( OBJ_DATA *obj, CHAR_DATA *ch, bool fShort )
  64. {
  65.     static char buf[MAX_STRING_LENGTH];
  66.     buf[0] = '';
  67.     if ( IS_OBJ_STAT(obj, ITEM_INVIS)     )   strcat( buf, "(Invis) "     );
  68.     if ( IS_AFFECTED(ch, AFF_DETECT_EVIL)
  69.          && IS_OBJ_STAT(obj, ITEM_EVIL)   )   strcat( buf, "(Red Aura) "  );
  70.     if ( IS_AFFECTED(ch, AFF_DETECT_MAGIC)
  71.          && IS_OBJ_STAT(obj, ITEM_MAGIC)  )   strcat( buf, "(Magical) "   );
  72.     if ( IS_OBJ_STAT(obj, ITEM_GLOW)      )   strcat( buf, "(Glowing) "   );
  73.     if ( IS_OBJ_STAT(obj, ITEM_HUM)       )   strcat( buf, "(Humming) "   );
  74.     if ( fShort )
  75.     {
  76. if ( obj->short_descr != NULL )
  77.     strcat( buf, obj->short_descr );
  78.     }
  79.     else
  80.     {
  81. if ( obj->description != NULL )
  82.     strcat( buf, obj->description );
  83.     }
  84.     return buf;
  85. }
  86. /*
  87.  * Show a list to a character.
  88.  * Can coalesce duplicated items.
  89.  */
  90. void show_list_to_char( OBJ_DATA *list, CHAR_DATA *ch, bool fShort, bool fShowNothing )
  91. {
  92.     char buf[MAX_STRING_LENGTH];
  93.     char **prgpstrShow;
  94.     int *prgnShow;
  95.     char *pstrShow;
  96.     OBJ_DATA *obj;
  97.     int nShow;
  98.     int iShow;
  99.     int count;
  100.     bool fCombine;
  101.     if ( ch->desc == NULL )
  102. return;
  103.     /*
  104.      * Alloc space for output lines.
  105.      */
  106.     count = 0;
  107.     for ( obj = list; obj != NULL; obj = obj->next_content )
  108. count++;
  109.     prgpstrShow = alloc_mem( count * sizeof(char *) );
  110.     prgnShow    = alloc_mem( count * sizeof(int)    );
  111.     nShow = 0;
  112.     /*
  113.      * Format the list of objects.
  114.      */
  115.     for ( obj = list; obj != NULL; obj = obj->next_content )
  116.     { 
  117. if ( obj->wear_loc == WEAR_NONE && can_see_obj( ch, obj ) )
  118. {
  119.     pstrShow = format_obj_to_char( obj, ch, fShort );
  120.     fCombine = FALSE;
  121.     if ( IS_NPC(ch) || IS_SET(ch->act, PLR_COMBINE) )
  122.     {
  123. /*
  124.  * Look for duplicates, case sensitive.
  125.  * Matches tend to be near end so run loop backwords.
  126.  */
  127. for ( iShow = nShow - 1; iShow >= 0; iShow-- )
  128. {
  129.     if ( !strcmp( prgpstrShow[iShow], pstrShow ) )
  130.     {
  131. prgnShow[iShow]++;
  132. fCombine = TRUE;
  133. break;
  134.     }
  135. }
  136.     }
  137.     /*
  138.      * Couldn't combine, or didn't want to.
  139.      */
  140.     if ( !fCombine )
  141.     {
  142. prgpstrShow [nShow] = str_dup( pstrShow );
  143. prgnShow    [nShow] = 1;
  144. nShow++;
  145.     }
  146. }
  147.     }
  148.     /*
  149.      * Output the formatted list.
  150.      */
  151.     for ( iShow = 0; iShow < nShow; iShow++ )
  152.     {
  153. if ( IS_NPC(ch) || IS_SET(ch->act, PLR_COMBINE) )
  154. {
  155.     if ( prgnShow[iShow] != 1 )
  156.     {
  157. sprintf( buf, "(%2d) ", prgnShow[iShow] );
  158. send_to_char( buf, ch );
  159.     }
  160.     else
  161.     {
  162. send_to_char( "     ", ch );
  163.     }
  164. }
  165. send_to_char( prgpstrShow[iShow], ch );
  166. send_to_char( "nr", ch );
  167. free_string( prgpstrShow[iShow] );
  168.     }
  169.     if ( fShowNothing && nShow == 0 )
  170.     {
  171. if ( IS_NPC(ch) || IS_SET(ch->act, PLR_COMBINE) )
  172.     send_to_char( "     ", ch );
  173. send_to_char( "Nothing.nr", ch );
  174.     }
  175.     /*
  176.      * Clean up.
  177.      */
  178.     free_mem( prgpstrShow, count * sizeof(char *) );
  179.     free_mem( prgnShow,    count * sizeof(int)    );
  180.     return;
  181. }
  182. void show_char_to_char_0( CHAR_DATA *victim, CHAR_DATA *ch )
  183. {
  184.     char buf[MAX_STRING_LENGTH];
  185.     buf[0] = '';
  186.     if ( IS_AFFECTED(victim, AFF_INVISIBLE)   ) strcat( buf, "(Invis) "      );
  187.     if ( IS_AFFECTED(victim, AFF_HIDE)        ) strcat( buf, "(Hide) "       );
  188.     if ( IS_AFFECTED(victim, AFF_CHARM)       ) strcat( buf, "(Charmed) "    );
  189.     if ( IS_AFFECTED(victim, AFF_PASS_DOOR)   ) strcat( buf, "(Translucent) ");
  190.     if ( IS_AFFECTED(victim, AFF_FAERIE_FIRE) ) strcat( buf, "(Pink Aura) "  );
  191.     if ( IS_EVIL(victim)
  192.     &&   IS_AFFECTED(ch, AFF_DETECT_EVIL)     ) strcat( buf, "(Red Aura) "   );
  193.     if ( IS_AFFECTED(victim, AFF_SANCTUARY)   ) strcat( buf, "(White Aura) " );
  194.     if ( !IS_NPC(victim) && IS_SET(victim->act, PLR_KILLER ) )
  195. strcat( buf, "(KILLER) "     );
  196.     if ( !IS_NPC(victim) && IS_SET(victim->act, PLR_THIEF  ) )
  197. strcat( buf, "(THIEF) "      );
  198.     if ( victim->position == POS_STANDING && victim->long_descr[0] != '' )
  199.     {
  200. strcat( buf, victim->long_descr );
  201. send_to_char( buf, ch );
  202. return;
  203.     }
  204.     strcat( buf, PERS( victim, ch ) );
  205.     if ( !IS_NPC(victim) && !IS_SET(ch->act, PLR_BRIEF) )
  206. strcat( buf, victim->pcdata->title );
  207.     switch ( victim->position )
  208.     {
  209.     case POS_DEAD:     strcat( buf, " is DEAD!!" );              break;
  210.     case POS_MORTAL:   strcat( buf, " is mortally wounded." );   break;
  211.     case POS_INCAP:    strcat( buf, " is incapacitated." );      break;
  212.     case POS_STUNNED:  strcat( buf, " is lying here stunned." ); break;
  213.     case POS_SLEEPING: strcat( buf, " is sleeping here." );      break;
  214.     case POS_RESTING:  strcat( buf, " is resting here." );       break;
  215.     case POS_STANDING: strcat( buf, " is here." );               break;
  216.     case POS_FIGHTING:
  217. strcat( buf, " is here, fighting " );
  218. if ( victim->fighting == NULL )
  219.     strcat( buf, "thin air??" );
  220. else if ( victim->fighting == ch )
  221.     strcat( buf, "YOU!" );
  222. else if ( victim->in_room == victim->fighting->in_room )
  223. {
  224.     strcat( buf, PERS( victim->fighting, ch ) );
  225.     strcat( buf, "." );
  226. }
  227. else
  228.     strcat( buf, "somone who left??" );
  229. break;
  230.     }
  231.     strcat( buf, "nr" );
  232.     buf[0] = UPPER(buf[0]);
  233.     send_to_char( buf, ch );
  234.     return;
  235. }
  236. void show_char_to_char_1( CHAR_DATA *victim, CHAR_DATA *ch )
  237. {
  238.     char buf[MAX_STRING_LENGTH];
  239.     OBJ_DATA *obj;
  240.     int iWear;
  241.     int percent;
  242.     bool found;
  243.     if ( can_see( victim, ch ) )
  244.     {
  245. act( "$n looks at you.", ch, NULL, victim, TO_VICT    );
  246. act( "$n looks at $N.",  ch, NULL, victim, TO_NOTVICT );
  247.     }
  248.     if ( victim->description[0] != '' )
  249.     {
  250. send_to_char( victim->description, ch );
  251.     }
  252.     else
  253.     {
  254. act( "You see nothing special about $M.", ch, NULL, victim, TO_CHAR );
  255.     }
  256.     if ( victim->max_hit > 0 )
  257. percent = ( 100 * victim->hit ) / victim->max_hit;
  258.     else
  259. percent = -1;
  260.     strcpy( buf, PERS(victim, ch) );
  261.          if ( percent >= 100 ) strcat( buf, " is in perfect health.nr"  );
  262.     else if ( percent >=  90 ) strcat( buf, " is slightly scratched.nr" );
  263.     else if ( percent >=  80 ) strcat( buf, " has a few bruises.nr"     );
  264.     else if ( percent >=  70 ) strcat( buf, " has some cuts.nr"         );
  265.     else if ( percent >=  60 ) strcat( buf, " has several wounds.nr"    );
  266.     else if ( percent >=  50 ) strcat( buf, " has many nasty wounds.nr" );
  267.     else if ( percent >=  40 ) strcat( buf, " is bleeding freely.nr"    );
  268.     else if ( percent >=  30 ) strcat( buf, " is covered in blood.nr"   );
  269.     else if ( percent >=  20 ) strcat( buf, " is leaking guts.nr"       );
  270.     else if ( percent >=  10 ) strcat( buf, " is almost dead.nr"        );
  271.     else                       strcat( buf, " is DYING.nr"              );
  272.     buf[0] = UPPER(buf[0]);
  273.     send_to_char( buf, ch );
  274.     found = FALSE;
  275.     for ( iWear = 0; iWear < MAX_WEAR; iWear++ )
  276.     {
  277. if ( ( obj = get_eq_char( victim, iWear ) ) != NULL
  278. &&   can_see_obj( ch, obj ) )
  279. {
  280.     if ( !found )
  281.     {
  282. send_to_char( "nr", ch );
  283. act( "$N is using:", ch, NULL, victim, TO_CHAR );
  284. found = TRUE;
  285.     }
  286.     send_to_char( where_name[iWear], ch );
  287.     send_to_char( format_obj_to_char( obj, ch, TRUE ), ch );
  288.     send_to_char( "nr", ch );
  289. }
  290.     }
  291.     if ( victim != ch
  292.     &&   !IS_NPC(ch)
  293.     &&   number_percent( ) < ch->pcdata->learned[gsn_peek] )
  294.     {
  295. send_to_char( "nrYou peek at the inventory:nr", ch );
  296. show_list_to_char( victim->carrying, ch, TRUE, TRUE );
  297.     }
  298.     return;
  299. }
  300. void show_char_to_char( CHAR_DATA *list, CHAR_DATA *ch )
  301. {
  302.     CHAR_DATA *rch;
  303.     for ( rch = list; rch != NULL; rch = rch->next_in_room )
  304.     {
  305. if ( rch == ch )
  306.     continue;
  307. if ( !IS_NPC(rch)
  308. &&   IS_SET(rch->act, PLR_WIZINVIS)
  309. &&   get_trust( ch ) < get_trust( rch ) )
  310.     continue;
  311. if ( can_see( ch, rch ) )
  312. {
  313.     show_char_to_char_0( rch, ch );
  314. }
  315. else if ( room_is_dark( ch->in_room )
  316. &&        IS_AFFECTED(rch, AFF_INFRARED ) )
  317. {
  318.     send_to_char( "You see glowing red eyes watching YOU!nr", ch );
  319. }
  320.     }
  321.     return;
  322. bool check_blind( CHAR_DATA *ch )
  323. {
  324.     if ( !IS_NPC(ch) && IS_SET(ch->act, PLR_HOLYLIGHT) )
  325. return TRUE;
  326.     if ( IS_AFFECTED(ch, AFF_BLIND) )
  327.     {
  328. send_to_char( "You can't see a thing!nr", ch );
  329. return FALSE;
  330.     }
  331.     return TRUE;
  332. }
  333. void do_look( CHAR_DATA *ch, char *argument )
  334. {
  335.     char buf  [MAX_STRING_LENGTH];
  336.     char arg1 [MAX_INPUT_LENGTH];
  337.     char arg2 [MAX_INPUT_LENGTH];
  338.     EXIT_DATA *pexit;
  339.     CHAR_DATA *victim;
  340.     OBJ_DATA *obj;
  341.     char *pdesc;
  342.     int door;
  343.     if ( !IS_NPC( ch ) && ch->desc == NULL ) 
  344. return;
  345.     if ( ch->position < POS_SLEEPING )
  346.     {
  347. send_to_char( "You can't see anything but stars!nr", ch );
  348. return;
  349.     }
  350.     if ( ch->position == POS_SLEEPING )
  351.     {
  352. send_to_char( "You can't see anything, you're sleeping!nr", ch );
  353. return;
  354.     }
  355.     if ( !check_blind( ch ) )
  356. return;
  357.     if ( !IS_NPC(ch)
  358.     &&   !IS_SET(ch->act, PLR_HOLYLIGHT)
  359.     &&   room_is_dark( ch->in_room ) )
  360.     {
  361. send_to_char( "It is pitch black ... nr", ch );
  362. show_char_to_char( ch->in_room->people, ch );
  363. return;
  364.     }
  365.     argument = one_argument( argument, arg1 );
  366.     argument = one_argument( argument, arg2 );
  367.     if ( arg1[0] == '' || !str_cmp( arg1, "auto" ) )
  368.     {
  369. /* 'look' or 'look auto' */
  370. send_to_char( ch->in_room->name, ch );
  371. if ( IS_HERO(ch) )
  372.        {
  373.        static char *szSectorTypes[] = { "inside", "city", "field", "forest",
  374.           "hills", "mountain", "water/swim", "water/boat", "error(8)", "air",
  375.           "desert", "error(11)" };
  376.        sprintf(buf, "nr#%4d <%s> %s%s%s%s%s%s%s%s%s", ch->in_room->vnum,
  377.           szSectorTypes[ch->in_room->sector_type],
  378.           (ch->in_room->room_flags &     1) ? "[DARK]" : "",
  379.           (ch->in_room->room_flags &     4) ? "[NO MOB]" : "",
  380.           (ch->in_room->room_flags &     8) ? "[INDOORS]" : "",
  381.           (ch->in_room->room_flags &   512) ? "[PRIVATE]" : "",
  382.           (ch->in_room->room_flags &  1024) ? "[SAFE]" : "",
  383.           (ch->in_room->room_flags &  2048) ? "[SOLITARY]" : "",
  384.           (ch->in_room->room_flags &  4096) ? "[PET SHOP]" : "",
  385.           (ch->in_room->room_flags &  8192) ? "[NO RECALL]" : "",
  386.           (ch->in_room->room_flags & 16384) ? "[PEACEFUL]" : "");
  387.      send_to_char( buf, ch );
  388.        }
  389. send_to_char( "nr", ch );
  390. if ( !IS_NPC(ch) && IS_SET(ch->act, PLR_AUTOEXIT) )
  391.     do_exits( ch, "auto" );
  392. if ( arg1[0] == ''
  393. || ( !IS_NPC(ch) && !IS_SET(ch->act, PLR_BRIEF) ) )
  394.     send_to_char( ch->in_room->description, ch );
  395. show_list_to_char( ch->in_room->contents, ch, FALSE, FALSE );
  396. show_char_to_char( ch->in_room->people,   ch );
  397. return;
  398.     }
  399.     if ( !str_cmp( arg1, "i" ) || !str_cmp( arg1, "in" ) )
  400.     {
  401. /* 'look in' */
  402. if ( arg2[0] == '' )
  403. {
  404.     send_to_char( "Look in what?nr", ch );
  405.     return;
  406. }
  407. if ( ( obj = get_obj_here( ch, arg2 ) ) == NULL )
  408. {
  409.     send_to_char( "You do not see that here.nr", ch );
  410.     return;
  411. }
  412. switch ( obj->item_type )
  413. {
  414. default:
  415.     send_to_char( "That is not a container.nr", ch );
  416.     break;
  417. case ITEM_DRINK_CON:
  418.     if ( obj->value[1] <= 0 )
  419.     {
  420. send_to_char( "It is empty.nr", ch );
  421. break;
  422.     }
  423.     sprintf( buf, "It's %s full of a %s liquid.nr",
  424. obj->value[1] <     obj->value[0] / 4
  425.     ? "less than" :
  426. obj->value[1] < 3 * obj->value[0] / 4
  427.     ? "about"     : "more than",
  428. liq_table[obj->value[2]].liq_color
  429. );
  430.     send_to_char( buf, ch );
  431.     break;
  432. case ITEM_CONTAINER:
  433. case ITEM_CORPSE_NPC:
  434. case ITEM_CORPSE_PC:
  435.     if ( IS_SET(obj->value[1], CONT_CLOSED) )
  436.     {
  437. send_to_char( "It is closed.nr", ch );
  438. break;
  439.     }
  440.     act( "$p contains:", ch, obj, NULL, TO_CHAR );
  441.     show_list_to_char( obj->contains, ch, TRUE, TRUE );
  442.     break;
  443. }
  444. return;
  445.     }
  446.     if ( ( victim = get_char_room( ch, arg1 ) ) != NULL )
  447.     {
  448. show_char_to_char_1( victim, ch );
  449. return;
  450.     }
  451.     for ( obj = ch->carrying; obj != NULL; obj = obj->next_content )
  452.     {
  453. if ( can_see_obj( ch, obj ) )
  454. {
  455.     pdesc = get_extra_descr( arg1, obj->extra_descr );
  456.     if ( pdesc != NULL )
  457.     {
  458. send_to_char( pdesc, ch );
  459. return;
  460.     }
  461.     pdesc = get_extra_descr( arg1, obj->pIndexData->extra_descr );
  462.     if ( pdesc != NULL )
  463.     {
  464. send_to_char( pdesc, ch );
  465. return;
  466.     }
  467. }
  468. if ( is_name( arg1, obj->name ) )
  469. {
  470.     send_to_char( obj->description, ch );
  471.     return;
  472. }
  473.     }
  474.     for ( obj = ch->in_room->contents; obj != NULL; obj = obj->next_content )
  475.     {
  476. if ( can_see_obj( ch, obj ) )
  477. {
  478.     pdesc = get_extra_descr( arg1, obj->extra_descr );
  479.     if ( pdesc != NULL )
  480.     {
  481. send_to_char( pdesc, ch );
  482. return;
  483.     }
  484.     pdesc = get_extra_descr( arg1, obj->pIndexData->extra_descr );
  485.     if ( pdesc != NULL )
  486.     {
  487. send_to_char( pdesc, ch );
  488. return;
  489.     }
  490. }
  491. if ( is_name( arg1, obj->name ) )
  492. {
  493.     send_to_char( obj->description, ch );
  494.     return;
  495. }
  496.     }
  497.     pdesc = get_extra_descr( arg1, ch->in_room->extra_descr );
  498.     if ( pdesc != NULL )
  499.     {
  500. send_to_char( pdesc, ch );
  501. return;
  502.     }
  503.          if ( !str_cmp( arg1, "n" ) || !str_cmp( arg1, "north" ) ) door = 0;
  504.     else if ( !str_cmp( arg1, "e" ) || !str_cmp( arg1, "east"  ) ) door = 1;
  505.     else if ( !str_cmp( arg1, "s" ) || !str_cmp( arg1, "south" ) ) door = 2;
  506.     else if ( !str_cmp( arg1, "w" ) || !str_cmp( arg1, "west"  ) ) door = 3;
  507.     else if ( !str_cmp( arg1, "u" ) || !str_cmp( arg1, "up"    ) ) door = 4;
  508.     else if ( !str_cmp( arg1, "d" ) || !str_cmp( arg1, "down"  ) ) door = 5;
  509.     else
  510.     {
  511. send_to_char( "You do not see that here.nr", ch );
  512. return;
  513.     }
  514.     /* 'look direction' */
  515.     if ( ( pexit = ch->in_room->exit[door] ) == NULL )
  516.     {
  517. send_to_char( "Nothing special there.nr", ch );
  518. return;
  519.     }
  520.     if ( pexit->description != NULL && pexit->description[0] != '' )
  521. send_to_char( pexit->description, ch );
  522.     else
  523. send_to_char( "Nothing special there.nr", ch );
  524.     if ( pexit->keyword    != NULL
  525.     &&   pexit->keyword[0] != ''
  526.     &&   pexit->keyword[0] != ' ' )
  527.     {
  528. if ( IS_SET(pexit->exit_info, EX_CLOSED) )
  529. {
  530.     act( "The $d is closed.", ch, NULL, pexit->keyword, TO_CHAR );
  531. }
  532. else if ( IS_SET(pexit->exit_info, EX_ISDOOR) )
  533. {
  534.     act( "The $d is open.",   ch, NULL, pexit->keyword, TO_CHAR );
  535. }
  536.     }
  537.     return;
  538. }
  539. void do_examine( CHAR_DATA *ch, char *argument )
  540. {
  541.     char buf[MAX_STRING_LENGTH];
  542.     char arg[MAX_INPUT_LENGTH];
  543.     OBJ_DATA *obj;
  544.     one_argument( argument, arg );
  545.     if ( arg[0] == '' )
  546.     {
  547. send_to_char( "Examine what?nr", ch );
  548. return;
  549.     }
  550.     do_look( ch, arg );
  551.     if ( ( obj = get_obj_here( ch, arg ) ) != NULL )
  552.     {
  553. switch ( obj->item_type )
  554. {
  555. default:
  556.     break;
  557. case ITEM_DRINK_CON:
  558. case ITEM_CONTAINER:
  559. case ITEM_CORPSE_NPC:
  560. case ITEM_CORPSE_PC:
  561.     send_to_char( "When you look inside, you see:nr", ch );
  562.     sprintf( buf, "in %s", arg );
  563.     do_look( ch, buf );
  564. }
  565.     }
  566.     return;
  567. }
  568. /*
  569.  * Thanks to Zrin for auto-exit part.
  570.  */
  571. void do_exits( CHAR_DATA *ch, char *argument )
  572. {
  573.     extern char * const dir_name[];
  574.     char buf[MAX_STRING_LENGTH];
  575.     EXIT_DATA *pexit;
  576.     bool found;
  577.     bool fAuto;
  578.     int door;
  579.     buf[0] = '';
  580.     fAuto  = !str_cmp( argument, "auto" );
  581.     if ( !check_blind( ch ) )
  582. return;
  583.     strcpy( buf, fAuto ? "[Exits:" : "Obvious exits:nr" );
  584.     found = FALSE;
  585.     for ( door = 0; door <= 5; door++ )
  586.     {
  587. if ( ( pexit = ch->in_room->exit[door] ) != NULL
  588. &&   pexit->to_room != NULL
  589. &&   !IS_SET(pexit->exit_info, EX_CLOSED) )
  590. {
  591.     found = TRUE;
  592.     if ( fAuto )
  593.     {
  594. strcat( buf, " " );
  595. strcat( buf, dir_name[door] );
  596.     }
  597.     else
  598.     {
  599. sprintf( buf + strlen(buf), "%-5s - %snr",
  600.     capitalize( dir_name[door] ),
  601.     room_is_dark( pexit->to_room )
  602. ?  "Too dark to tell"
  603. : pexit->to_room->name
  604.     );
  605.     }
  606. }
  607.     }
  608.     if ( !found )
  609. strcat( buf, fAuto ? " none" : "None.nr" );
  610.     if ( fAuto )
  611. strcat( buf, "]nr" );
  612.     send_to_char( buf, ch );
  613.     return;
  614. }
  615. void do_score( CHAR_DATA *ch, char *argument )
  616. {
  617.     char buf[MAX_STRING_LENGTH];
  618.     AFFECT_DATA *paf;
  619.     sprintf( buf,
  620. "You are %s%s, level %d, %d years old (%d hours).nr",
  621. ch->name,
  622. IS_NPC(ch) ? "" : ch->pcdata->title,
  623. ch->level,
  624. get_age(ch),
  625. (get_age(ch) - 17) * 2 );
  626.     send_to_char( buf, ch );
  627.     if ( get_trust( ch ) != ch->level )
  628.     {
  629. sprintf( buf, "You are trusted at level %d.nr",
  630.     get_trust( ch ) );
  631. send_to_char( buf, ch );
  632.     }
  633.     sprintf( buf,
  634. "You have %d/%d hit, %d/%d mana, %d/%d movement, %d practices.nr",
  635. ch->hit,  ch->max_hit,
  636. ch->mana, ch->max_mana,
  637. ch->move, ch->max_move,
  638. ch->practice );
  639.     send_to_char( buf, ch );
  640.     sprintf( buf,
  641. "You are carrying %d/%d items with weight %d/%d kg.nr",
  642. ch->carry_number, can_carry_n(ch),
  643. ch->carry_weight, can_carry_w(ch) );
  644.     send_to_char( buf, ch );
  645.     sprintf( buf,
  646. "Str: %d  Int: %d  Wis: %d  Dex: %d  Con: %d.nr",
  647. get_curr_str(ch),
  648. get_curr_int(ch),
  649. get_curr_wis(ch),
  650. get_curr_dex(ch),
  651. get_curr_con(ch) );
  652.     send_to_char( buf, ch );
  653.     sprintf( buf,
  654. "You have scored %d exp, and have %d gold coins.nr",
  655. ch->exp,  ch->gold );
  656.     send_to_char( buf, ch );
  657.     sprintf( buf,
  658. "Autoexit: %s.  Autoloot: %s.  Autosac: %s.nr",
  659. (!IS_NPC(ch) && IS_SET(ch->act, PLR_AUTOEXIT)) ? "yes" : "no",
  660. (!IS_NPC(ch) && IS_SET(ch->act, PLR_AUTOLOOT)) ? "yes" : "no",
  661. (!IS_NPC(ch) && IS_SET(ch->act, PLR_AUTOSAC) ) ? "yes" : "no" );
  662.     send_to_char( buf, ch );
  663.     
  664.     sprintf( buf, "Wimpy set to %d hit points.nr", ch->wimpy );
  665.     send_to_char( buf, ch );
  666.     if ( !IS_NPC( ch ) )
  667.     {
  668. sprintf( buf, "Page pausing set to %d lines of text.nr",
  669. ch->pcdata->pagelen );
  670. send_to_char( buf, ch );
  671.     }
  672.     if ( !IS_NPC(ch) && ch->pcdata->condition[COND_DRUNK]   > 10 )
  673. send_to_char( "You are drunk.nr",   ch );
  674.     if ( !IS_NPC(ch) && ch->pcdata->condition[COND_THIRST] ==  0 )
  675. send_to_char( "You are thirsty.nr", ch );
  676.     if ( !IS_NPC(ch) && ch->pcdata->condition[COND_FULL]   ==  0 )
  677. send_to_char( "You are hungry.nr",  ch );
  678.     switch ( ch->position )
  679.     {
  680.     case POS_DEAD:     
  681. send_to_char( "You are DEAD!!nr", ch );
  682. break;
  683.     case POS_MORTAL:
  684. send_to_char( "You are mortally wounded.nr", ch );
  685. break;
  686.     case POS_INCAP:
  687. send_to_char( "You are incapacitated.nr", ch );
  688. break;
  689.     case POS_STUNNED:
  690. send_to_char( "You are stunned.nr", ch );
  691. break;
  692.     case POS_SLEEPING:
  693. send_to_char( "You are sleeping.nr", ch );
  694. break;
  695.     case POS_RESTING:
  696. send_to_char( "You are resting.nr", ch );
  697. break;
  698.     case POS_STANDING:
  699. send_to_char( "You are standing.nr", ch );
  700. break;
  701.     case POS_FIGHTING:
  702. send_to_char( "You are fighting.nr", ch );
  703. break;
  704.     }
  705.     if ( ch->level >= 25 )
  706.     {
  707. sprintf( buf, "AC: %d.  ", GET_AC(ch) );
  708. send_to_char( buf, ch );
  709.     }
  710.     send_to_char( "You are ", ch );
  711.          if ( GET_AC(ch) >=  101 ) send_to_char( "WORSE than naked!nr", ch );
  712.     else if ( GET_AC(ch) >=   80 ) send_to_char( "naked.nr",            ch );
  713.     else if ( GET_AC(ch) >=   60 ) send_to_char( "wearing clothes.nr",  ch );
  714.     else if ( GET_AC(ch) >=   40 ) send_to_char( "slightly armored.nr", ch );
  715.     else if ( GET_AC(ch) >=   20 ) send_to_char( "somewhat armored.nr", ch );
  716.     else if ( GET_AC(ch) >=    0 ) send_to_char( "armored.nr",          ch );
  717.     else if ( GET_AC(ch) >= - 20 ) send_to_char( "well armored.nr",     ch );
  718.     else if ( GET_AC(ch) >= - 40 ) send_to_char( "strongly armored.nr", ch );
  719.     else if ( GET_AC(ch) >= - 60 ) send_to_char( "heavily armored.nr",  ch );
  720.     else if ( GET_AC(ch) >= - 80 ) send_to_char( "superbly armored.nr", ch );
  721.     else if ( GET_AC(ch) >= -100 ) send_to_char( "divinely armored.nr", ch );
  722.     else                           send_to_char( "invincible!nr",       ch );
  723.     if ( ch->level >= 15 )
  724.     {
  725. sprintf( buf, "Hitroll: %d  Damroll: %d.nr",
  726.     GET_HITROLL(ch), GET_DAMROLL(ch) );
  727. send_to_char( buf, ch );
  728.     }
  729.     
  730.     if ( ch->level >= 10 )
  731.     {
  732. sprintf( buf, "Alignment: %d.  ", ch->alignment );
  733. send_to_char( buf, ch );
  734.     }
  735.     send_to_char( "You are ", ch );
  736.          if ( ch->alignment >  900 ) send_to_char( "angelic.nr", ch );
  737.     else if ( ch->alignment >  700 ) send_to_char( "saintly.nr", ch );
  738.     else if ( ch->alignment >  350 ) send_to_char( "good.nr",    ch );
  739.     else if ( ch->alignment >  100 ) send_to_char( "kind.nr",    ch );
  740.     else if ( ch->alignment > -100 ) send_to_char( "neutral.nr", ch );
  741.     else if ( ch->alignment > -350 ) send_to_char( "mean.nr",    ch );
  742.     else if ( ch->alignment > -700 ) send_to_char( "evil.nr",    ch );
  743.     else if ( ch->alignment > -900 ) send_to_char( "demonic.nr", ch );
  744.     else                             send_to_char( "satanic.nr", ch );
  745.     
  746.     if ( ch->affected != NULL )
  747.     {
  748. send_to_char( "You are affected by:nr", ch );
  749. for ( paf = ch->affected; paf != NULL; paf = paf->next )
  750. {
  751.     sprintf( buf, "Spell: '%s'", skill_table[paf->type].name );
  752.     send_to_char( buf, ch );
  753.     if ( ch->level >= 20 )
  754.     {
  755. sprintf( buf,
  756.     " modifies %s by %d for %d hours",
  757.     affect_loc_name( paf->location ),
  758.     paf->modifier,
  759.     paf->duration );
  760. send_to_char( buf, ch );
  761.     }
  762.     send_to_char( ".nr", ch );
  763. }
  764.     }
  765.     return;
  766. }
  767. char * const day_name [] =
  768. {
  769.     "the Moon", "the Bull", "Deception", "Thunder", "Freedom",
  770.     "the Great Gods", "the Sun"
  771. };
  772. char * const month_name [] =
  773. {
  774.     "Winter", "the Winter Wolf", "the Frost Giant", "the Old Forces",
  775.     "the Grand Struggle", "the Spring", "Nature", "Futility", "the Dragon",
  776.     "the Sun", "the Heat", "the Battle", "the Dark Shades", "the Shadows",
  777.     "the Long Shadows", "the Ancient Darkness", "the Great Evil"
  778. };
  779. void do_time( CHAR_DATA *ch, char *argument )
  780. {
  781.     extern char str_boot_time[];
  782.     char buf[MAX_STRING_LENGTH];
  783.     char *suf;
  784.     int day;
  785.     day     = time_info.day + 1;
  786.          if ( day > 4 && day <  20 ) suf = "th";
  787.     else if ( day % 10 ==  1       ) suf = "st";
  788.     else if ( day % 10 ==  2       ) suf = "nd";
  789.     else if ( day % 10 ==  3       ) suf = "rd";
  790.     else                             suf = "th";
  791.     sprintf( buf,
  792. "It is %d o'clock %s, Day of %s, %d%s the Month of %s.nrMerc started up at %srThe system time is %sr",
  793. (time_info.hour % 12 == 0) ? 12 : time_info.hour % 12,
  794. time_info.hour >= 12 ? "pm" : "am",
  795. day_name[day % 7],
  796. day, suf,
  797. month_name[time_info.month],
  798. str_boot_time,
  799. (char *) ctime( &current_time )
  800. );
  801.     send_to_char( buf, ch );
  802.     return;
  803. }
  804. void do_weather( CHAR_DATA *ch, char *argument )
  805. {
  806.     char buf[MAX_STRING_LENGTH];
  807.     static char * const sky_look[4] =
  808.     {
  809. "cloudless",
  810. "cloudy",
  811. "rainy",
  812. "lit by flashes of lightning"
  813.     };
  814.     if ( !IS_OUTSIDE(ch) )
  815.     {
  816. send_to_char( "You can't see the weather indoors.nr", ch );
  817. return;
  818.     }
  819.     sprintf( buf, "The sky is %s and %s.nr",
  820. sky_look[weather_info.sky],
  821. weather_info.change >= 0
  822. ? "a warm southerly breeze blows"
  823. : "a cold northern gust blows"
  824. );
  825.     send_to_char( buf, ch );
  826.     return;
  827. }
  828. void do_help( CHAR_DATA *ch, char *argument )
  829. {
  830.     HELP_DATA *pHelp;
  831.     if ( argument[0] == '' )
  832. argument = "summary";
  833.     for ( pHelp = help_first; pHelp != NULL; pHelp = pHelp->next )
  834.     {
  835. if ( pHelp->level > get_trust( ch ) )
  836.     continue;
  837. if ( is_name( argument, pHelp->keyword ) )
  838. {
  839.     if ( pHelp->level >= 0 && str_cmp( argument, "imotd" ) )
  840.     {
  841. send_to_char( pHelp->keyword, ch );
  842. send_to_char( "nr", ch );
  843.     }
  844.     /*
  845.      * Strip leading '.' to allow initial blanks.
  846.      */
  847.     if ( pHelp->text[0] == '.' )
  848. send_to_char( pHelp->text+1, ch );
  849.     else
  850. send_to_char( pHelp->text  , ch );
  851.     return;
  852. }
  853.     }
  854.     send_to_char( "No help on that word.nr", ch );
  855.     return;
  856. }
  857. /*
  858.  * New 'who' command originally by Alander of Rivers of Mud.
  859.  */
  860. void do_who( CHAR_DATA *ch, char *argument )
  861. {
  862.     char buf[MAX_STRING_LENGTH];
  863.     char buf2[MAX_STRING_LENGTH];
  864.     DESCRIPTOR_DATA *d;
  865.     int iClass;
  866.     int iLevelLower;
  867.     int iLevelUpper;
  868.     int nNumber;
  869.     int nMatch;
  870.     bool rgfClass[MAX_CLASS];
  871.     bool fClassRestrict;
  872.     bool fImmortalOnly;
  873.  
  874.     /*
  875.      * Set default arguments.
  876.      */
  877.     iLevelLower    = 0;
  878.     iLevelUpper    = MAX_LEVEL;
  879.     fClassRestrict = FALSE;
  880.     fImmortalOnly  = FALSE;
  881.     for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
  882. rgfClass[iClass] = FALSE;
  883.     /*
  884.      * Parse arguments.
  885.      */
  886.     nNumber = 0;
  887.     for ( ;; )
  888.     {
  889. char arg[MAX_STRING_LENGTH];
  890. argument = one_argument( argument, arg );
  891. if ( arg[0] == '' )
  892.     break;
  893. if ( is_number( arg ) )
  894. {
  895.     switch ( ++nNumber )
  896.     {
  897.     case 1: iLevelLower = atoi( arg ); break;
  898.     case 2: iLevelUpper = atoi( arg ); break;
  899.     default:
  900. send_to_char( "Only two level numbers allowed.nr", ch );
  901. return;
  902.     }
  903. }
  904. else
  905. {
  906.     int iClass;
  907.     if ( strlen(arg) < 3 )
  908.     {
  909. send_to_char( "Classes must be longer than that.nr", ch );
  910. return;
  911.     }
  912.     /*
  913.      * Look for classes to turn on.
  914.      */
  915.     arg[3]    = '';
  916.     if ( !str_cmp( arg, "imm" ) )
  917.     {
  918. fImmortalOnly = TRUE;
  919.     }
  920.     else
  921.     {
  922. fClassRestrict = TRUE;
  923. for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
  924. {
  925.     if ( !str_cmp( arg, class_table[iClass].who_name ) )
  926.     {
  927. rgfClass[iClass] = TRUE;
  928. break;
  929.     }
  930. }
  931. if ( iClass == MAX_CLASS )
  932. {
  933.     send_to_char( "That's not a class.nr", ch );
  934.     return;
  935. }
  936.     }
  937. }
  938.     }
  939.     /*
  940.      * Now show matching chars.
  941.      */
  942.     nMatch = 0;
  943.     buf[0] = '';
  944.     for ( d = descriptor_list; d != NULL; d = d->next )
  945.     {
  946. CHAR_DATA *wch;
  947. char const *class;
  948. /*
  949.  * Check for match against restrictions.
  950.  * Don't use trust as that exposes trusted mortals.
  951.  */
  952. if ( d->connected != CON_PLAYING || !can_see( ch, d->character ) )
  953.     continue;
  954. wch   = ( d->original != NULL ) ? d->original : d->character;
  955. if ( wch->level < iLevelLower
  956. ||   wch->level > iLevelUpper
  957. || ( fImmortalOnly  && wch->level < LEVEL_HERO )
  958. || ( fClassRestrict && !rgfClass[wch->class] ) )
  959.     continue;
  960. nMatch++;
  961. /*
  962.  * Figure out what to print for class.
  963.  */
  964. class = class_table[wch->class].who_name;
  965. switch ( wch->level )
  966. {
  967. default: break;
  968. case MAX_LEVEL - 0: class = "GOD"; break;
  969. case MAX_LEVEL - 1: class = "SUP"; break;
  970. case MAX_LEVEL - 2: class = "DEI"; break;
  971. case MAX_LEVEL - 3: class = "ANG"; break;
  972. }
  973. /*
  974.  * Format it up.
  975.  */
  976. sprintf( buf + strlen(buf), "[%s][%2d %s] %s%s%s%snr",
  977.        race_table[wch->race].who_name,
  978.     wch->level,
  979.     class,
  980.     IS_SET(wch->act, PLR_KILLER) ? "(KILLER) " : "",
  981.     IS_SET(wch->act, PLR_THIEF)  ? "(THIEF) "  : "",
  982.     wch->name,
  983.     wch->pcdata->title );
  984.     }
  985.     sprintf( buf2, "You see %d player%s in the game.nr",
  986.     nMatch, nMatch == 1 ? "" : "s" );
  987.     strcat( buf, buf2 );
  988.     send_to_char( buf, ch );
  989.     return;
  990. }
  991. void do_inventory( CHAR_DATA *ch, char *argument )
  992. {
  993.     send_to_char( "You are carrying:nr", ch );
  994.     show_list_to_char( ch->carrying, ch, TRUE, TRUE );
  995.     return;
  996. }
  997. void do_equipment( CHAR_DATA *ch, char *argument )
  998. {
  999.     OBJ_DATA *obj;
  1000.     int iWear;
  1001.     bool found;
  1002.     send_to_char( "You are using:nr", ch );
  1003.     found = FALSE;
  1004.     for ( iWear = 0; iWear < MAX_WEAR; iWear++ )
  1005.     {
  1006. if ( ( obj = get_eq_char( ch, iWear ) ) == NULL )
  1007.     continue;
  1008. send_to_char( where_name[iWear], ch );
  1009. if ( can_see_obj( ch, obj ) )
  1010. {
  1011.     send_to_char( format_obj_to_char( obj, ch, TRUE ), ch );
  1012.     send_to_char( "nr", ch );
  1013. }
  1014. else
  1015. {
  1016.     send_to_char( "something.nr", ch );
  1017. }
  1018. found = TRUE;
  1019.     }
  1020.     if ( !found )
  1021. send_to_char( "Nothing.nr", ch );
  1022.     return;
  1023. }
  1024. void do_compare( CHAR_DATA *ch, char *argument )
  1025. {
  1026.     char arg1[MAX_INPUT_LENGTH];
  1027.     char arg2[MAX_INPUT_LENGTH];
  1028.     OBJ_DATA *obj1;
  1029.     OBJ_DATA *obj2;
  1030.     int value1;
  1031.     int value2;
  1032.     char *msg;
  1033.     argument = one_argument( argument, arg1 );
  1034.     argument = one_argument( argument, arg2 );
  1035.     if ( arg1[0] == '' )
  1036.     {
  1037. send_to_char( "Compare what to what?nr", ch );
  1038. return;
  1039.     }
  1040.     if ( ( obj1 = get_obj_carry( ch, arg1 ) ) == NULL )
  1041.     {
  1042. send_to_char( "You do not have that item.nr", ch );
  1043. return;
  1044.     }
  1045.     if ( arg2[0] == '' )
  1046.     {
  1047. for ( obj2 = ch->carrying; obj2 != NULL; obj2 = obj2->next_content )
  1048. {
  1049.     if ( obj2->wear_loc != WEAR_NONE
  1050.     &&   can_see_obj( ch, obj2 )
  1051.     &&   obj1->item_type == obj2->item_type
  1052.     && ( obj1->wear_flags & obj2->wear_flags & ~ITEM_TAKE) != 0 )
  1053. break;
  1054. }
  1055. if ( obj2 == NULL )
  1056. {
  1057.     send_to_char( "You aren't wearing anything comparable.nr", ch );
  1058.     return;
  1059. }
  1060.     }
  1061.     else
  1062.     {
  1063. if ( ( obj2 = get_obj_carry( ch, arg2 ) ) == NULL )
  1064. {
  1065.     send_to_char( "You do not have that item.nr", ch );
  1066.     return;
  1067. }
  1068.     }
  1069.     
  1070.     msg = NULL;
  1071.     value1 = 0;
  1072.     value2 = 0;
  1073.     if ( obj1 == obj2 )
  1074.     {
  1075. msg = "You compare $p to itself.  It looks about the same.";
  1076.     }
  1077.     else if ( obj1->item_type != obj2->item_type )
  1078.     {
  1079. msg = "You can't compare $p and $P.";
  1080.     }
  1081.     else
  1082.     {
  1083. switch ( obj1->item_type )
  1084. {
  1085. default:
  1086.     msg = "You can't compare $p and $P.";
  1087.     break;
  1088. case ITEM_ARMOR:
  1089.     value1 = obj1->value[0];
  1090.     value2 = obj2->value[0];
  1091.     break;
  1092. case ITEM_WEAPON:
  1093.     value1 = obj1->value[1] + obj1->value[2];
  1094.     value2 = obj2->value[1] + obj2->value[2];
  1095.     break;
  1096. }
  1097.     }
  1098.     if ( msg == NULL )
  1099.     {
  1100.      if ( value1 == value2 ) msg = "$p and $P look about the same.";
  1101. else if ( value1  > value2 ) msg = "$p looks better than $P.";
  1102. else                         msg = "$p looks worse than $P.";
  1103.     }
  1104.     act( msg, ch, obj1, obj2, TO_CHAR );
  1105.     return;
  1106. }
  1107. void do_credits( CHAR_DATA *ch, char *argument )
  1108. {
  1109.     do_help( ch, "diku" );
  1110.     return;
  1111. }
  1112. void do_where( CHAR_DATA *ch, char *argument )
  1113. {
  1114.     char buf[MAX_STRING_LENGTH];
  1115.     char arg[MAX_INPUT_LENGTH];
  1116.     CHAR_DATA *victim;
  1117.     DESCRIPTOR_DATA *d;
  1118.     bool found;
  1119.     one_argument( argument, arg );
  1120.     if ( arg[0] == '' )
  1121.     {
  1122. send_to_char( "Players near you:nr", ch );
  1123. found = FALSE;
  1124. for ( d = descriptor_list; d; d = d->next )
  1125. {
  1126.     if ( d->connected == CON_PLAYING
  1127.     && ( victim = d->character ) != NULL
  1128.     &&   !IS_NPC(victim)
  1129.     &&   victim->in_room != NULL
  1130.     &&   victim->in_room->area == ch->in_room->area
  1131.     &&   can_see( ch, victim ) )
  1132.     {
  1133. found = TRUE;
  1134. sprintf( buf, "%-28s %snr",
  1135.     victim->name, victim->in_room->name );
  1136. send_to_char( buf, ch );
  1137.     }
  1138. }
  1139. if ( !found )
  1140.     send_to_char( "Nonenr", ch );
  1141.     }
  1142.     else
  1143.     {
  1144. found = FALSE;
  1145. for ( victim = char_list; victim != NULL; victim = victim->next )
  1146. {
  1147.     if ( victim->in_room != NULL
  1148.     &&   victim->in_room->area == ch->in_room->area
  1149.     &&   !IS_AFFECTED(victim, AFF_HIDE)
  1150.     &&   !IS_AFFECTED(victim, AFF_SNEAK)
  1151.     &&   can_see( ch, victim )
  1152.     &&   is_name( arg, victim->name ) )
  1153.     {
  1154. found = TRUE;
  1155. sprintf( buf, "%-28s %snr",
  1156.     PERS(victim, ch), victim->in_room->name );
  1157. send_to_char( buf, ch );
  1158. break;
  1159.     }
  1160. }
  1161. if ( !found )
  1162.     act( "You didn't find any $T.", ch, NULL, arg, TO_CHAR );
  1163.     }
  1164.     return;
  1165. }
  1166. void do_consider( CHAR_DATA *ch, char *argument )
  1167. {
  1168.     char arg[MAX_INPUT_LENGTH];
  1169.     CHAR_DATA *victim;
  1170.     char *msg = '';
  1171.     char *buf = '';
  1172.     int diff;
  1173.     int hpdiff;
  1174.     one_argument( argument, arg );
  1175.     if ( arg[0] == '' )
  1176.     {
  1177. send_to_char( "Consider killing whom?nr", ch );
  1178. return;
  1179.     }
  1180.     if ( ( victim = get_char_room( ch, arg ) ) == NULL )
  1181.     {
  1182. send_to_char( "They're not here.nr", ch );
  1183. return;
  1184.     }
  1185.     if ( !IS_NPC( victim ) )
  1186.     {
  1187. send_to_char( "The gods do not accept this type of sacrafice.nr",
  1188.      ch );
  1189. return;
  1190.     }
  1191.     diff = victim->level - ch->level;
  1192.          if ( diff <= -10 ) msg = "You can kill $N naked and weaponless.";
  1193.     else if ( diff <=  -5 ) msg = "$N is no match for you.";
  1194.     else if ( diff <=  -2 ) msg = "$N looks like an easy kill.";
  1195.     else if ( diff <=   1 ) msg = "The perfect match!";
  1196.     else if ( diff <=   4 ) msg = "$N says 'Do you feel lucky, punk?'.";
  1197.     else if ( diff <=   9 ) msg = "$N laughs at you mercilessly.";
  1198.     else                    msg = "Death will thank you for your gift.";
  1199.     act( msg, ch, NULL, victim, TO_CHAR );
  1200.     /* additions by king@tinuviel.cs.wcu.edu */
  1201.     hpdiff = ( ch->hit - victim->hit );
  1202.     if ( ( ( diff >= 0) && ( hpdiff <= 0 ) )
  1203. || ( ( diff <= 0 ) && ( hpdiff >= 0 ) ) )
  1204.     {
  1205.         send_to_char( "Also,", ch );
  1206.     }
  1207.     else
  1208.     {
  1209.         send_to_char( "However,", ch );
  1210.     }
  1211.     if ( hpdiff >= 101 )
  1212.         buf = " you are currently much healthier than $E.";
  1213.     if ( hpdiff <= 100 )
  1214.         buf = " you are currently healthier than $E.";
  1215.     if ( hpdiff <= 50 ) 
  1216.         buf = " you are currently slightly healthier than $E.";
  1217.     if ( hpdiff <= 25 )
  1218.         buf = " you are a teensy bit healthier than $E.";
  1219.     if ( hpdiff <= 0 )
  1220.         buf = " $E is a teensy bit healthier than you.";
  1221.     if ( hpdiff <= -25 )
  1222.         buf = " $E is slightly healthier than you.";
  1223.     if ( hpdiff <= -50 )
  1224.         buf = " $E is healthier than you.";
  1225.     if ( hpdiff <= -100 )
  1226.         buf = " $E is much healthier than you.";
  1227.     act( buf, ch, NULL, victim, TO_CHAR );
  1228.     return;
  1229. }
  1230. void set_title( CHAR_DATA *ch, char *title )
  1231. {
  1232.     char buf[MAX_STRING_LENGTH];
  1233.     if ( IS_NPC(ch) )
  1234.     {
  1235. bug( "Set_title: NPC.", 0 );
  1236. return;
  1237.     }
  1238.     if ( isalpha(title[0]) || isdigit(title[0]) )
  1239.     {
  1240. buf[0] = ' ';
  1241. strcpy( buf+1, title );
  1242.     }
  1243.     else
  1244.     {
  1245. strcpy( buf, title );
  1246.     }
  1247.     free_string( ch->pcdata->title );
  1248.     ch->pcdata->title = str_dup( buf );
  1249.     return;
  1250. }
  1251. void do_title( CHAR_DATA *ch, char *argument )
  1252. {
  1253.     if ( IS_NPC(ch) )
  1254. return;
  1255.     if ( argument[0] == '' )
  1256.     {
  1257. send_to_char( "Change your title to what?nr", ch );
  1258. return;
  1259.     }
  1260.     if ( strlen(argument) > 50 )
  1261. argument[50] = '';
  1262.     smash_tilde( argument );
  1263.     set_title( ch, argument );
  1264.     send_to_char( "Ok.nr", ch );
  1265. }
  1266. void do_description( CHAR_DATA *ch, char *argument )
  1267. {
  1268.     char buf[MAX_STRING_LENGTH];
  1269.     if ( argument[0] != '' )
  1270.     {
  1271. buf[0] = '';
  1272. smash_tilde( argument );
  1273. if ( argument[0] == '+' )
  1274. {
  1275.     if ( ch->description != NULL )
  1276. strcat( buf, ch->description );
  1277.     argument++;
  1278.     while ( isspace(*argument) )
  1279. argument++;
  1280. }
  1281. if ( strlen(buf) + strlen(argument) >= MAX_STRING_LENGTH - 2 )
  1282. {
  1283.     send_to_char( "Description too long.nr", ch );
  1284.     return;
  1285. }
  1286. strcat( buf, argument );
  1287. strcat( buf, "nr" );
  1288. free_string( ch->description );
  1289. ch->description = str_dup( buf );
  1290.     }
  1291.     send_to_char( "Your description is:nr", ch );
  1292.     send_to_char( ch->description ? ch->description : "(None).nr", ch );
  1293.     return;
  1294. }
  1295. void do_report( CHAR_DATA *ch, char *argument )
  1296. {
  1297.     char buf[MAX_INPUT_LENGTH];
  1298.     sprintf( buf,
  1299. "You report: %d/%d hp %d/%d mana %d/%d mv %d xp.nr",
  1300. ch->hit,  ch->max_hit,
  1301. ch->mana, ch->max_mana,
  1302. ch->move, ch->max_move,
  1303. ch->exp   );
  1304.     send_to_char( buf, ch );
  1305.     sprintf( buf, "$n reports: %d/%d hp %d/%d mana %d/%d mv %d xp.",
  1306. ch->hit,  ch->max_hit,
  1307. ch->mana, ch->max_mana,
  1308. ch->move, ch->max_move,
  1309. ch->exp   );
  1310.     act( buf, ch, NULL, NULL, TO_ROOM );
  1311.     return;
  1312. }
  1313. void do_practice( CHAR_DATA *ch, char *argument )
  1314. {
  1315.     char buf[MAX_STRING_LENGTH];
  1316.     char buf1[MAX_STRING_LENGTH*2];
  1317.     int sn;
  1318.     if ( IS_NPC(ch) )
  1319. return;
  1320.     buf1[0] = '';
  1321.     if ( ch->level < 3 )
  1322.     {
  1323. send_to_char(
  1324.     "You must be third level to practice.  Go train instead!nr",
  1325.     ch );
  1326. return;
  1327.     }
  1328.     if ( argument[0] == '' )
  1329.     {
  1330. int col;
  1331. col    = 0;
  1332. for ( sn = 0; sn < MAX_SKILL; sn++ )
  1333. {
  1334.     if ( skill_table[sn].name == NULL )
  1335. break;
  1336.     if ( ch->level < skill_table[sn].skill_level[ch->class] )
  1337. continue;
  1338.     sprintf( buf, "%18s %3d%%  ",
  1339. skill_table[sn].name, ch->pcdata->learned[sn] );
  1340.     strcat( buf1, buf );
  1341.     if ( ++col % 3 == 0 )
  1342. strcat( buf1, "nr" );
  1343. }
  1344. if ( col % 3 != 0 )
  1345.     strcat( buf1, "nr" );
  1346. sprintf( buf, "You have %d practice sessions left.nr",
  1347.     ch->practice );
  1348. strcat( buf1, buf );
  1349. send_to_char( buf1, ch );
  1350.     }
  1351.     else
  1352.     {
  1353. CHAR_DATA *mob;
  1354. int adept;
  1355. if ( !IS_AWAKE(ch) )
  1356. {
  1357.     send_to_char( "In your dreams, or what?nr", ch );
  1358.     return;
  1359. }
  1360. for ( mob = ch->in_room->people; mob != NULL; mob = mob->next_in_room )
  1361. {
  1362.     if ( IS_NPC(mob) && IS_SET(mob->act, ACT_PRACTICE) )
  1363. break;
  1364. }
  1365. if ( mob == NULL )
  1366. {
  1367.     send_to_char( "You can't do that here.nr", ch );
  1368.     return;
  1369. }
  1370. if ( ch->practice <= 0 )
  1371. {
  1372.     send_to_char( "You have no practice sessions left.nr", ch );
  1373.     return;
  1374. }
  1375. if ( ( sn = skill_lookup( argument ) ) < 0
  1376. || ( !IS_NPC(ch)
  1377. &&   ch->level < skill_table[sn].skill_level[ch->class] ) )
  1378. {
  1379.     send_to_char( "You can't practice that.nr", ch );
  1380.     return;
  1381. }
  1382. adept = IS_NPC(ch) ? 100 : class_table[ch->class].skill_adept;
  1383. if ( ch->pcdata->learned[sn] >= adept )
  1384. {
  1385.     sprintf( buf, "You are already an adept of %s.nr",
  1386. skill_table[sn].name );
  1387.     send_to_char( buf, ch );
  1388. }
  1389. else
  1390. {
  1391.     ch->practice--;
  1392.     ch->pcdata->learned[sn] += int_app[get_curr_int(ch)].learn;
  1393.     if ( ch->pcdata->learned[sn] < adept )
  1394.     {
  1395. act( "You practice $T.",
  1396.     ch, NULL, skill_table[sn].name, TO_CHAR );
  1397. act( "$n practices $T.",
  1398.     ch, NULL, skill_table[sn].name, TO_ROOM );
  1399.     }
  1400.     else
  1401.     {
  1402. ch->pcdata->learned[sn] = adept;
  1403. act( "You are now an adept of $T.",
  1404.     ch, NULL, skill_table[sn].name, TO_CHAR );
  1405. act( "$n is now an adept of $T.",
  1406.     ch, NULL, skill_table[sn].name, TO_ROOM );
  1407.     }
  1408. }
  1409.     }
  1410.     return;
  1411. }
  1412. /*
  1413.  * 'Wimpy' originally by Dionysos.
  1414.  */
  1415. void do_wimpy( CHAR_DATA *ch, char *argument )
  1416. {
  1417.     char buf[MAX_STRING_LENGTH];
  1418.     char arg[MAX_INPUT_LENGTH];
  1419.     int wimpy;
  1420.     one_argument( argument, arg );
  1421.     if ( arg[0] == '' )
  1422. wimpy = ch->max_hit / 5;
  1423.     else
  1424. wimpy = atoi( arg );
  1425.     if ( wimpy < 0 )
  1426.     {
  1427. send_to_char( "Your courage exceeds your wisdom.nr", ch );
  1428. return;
  1429.     }
  1430.     if ( wimpy > ch->max_hit )
  1431.     {
  1432. send_to_char( "Such cowardice ill becomes you.nr", ch );
  1433. return;
  1434.     }
  1435.     ch->wimpy = wimpy;
  1436.     sprintf( buf, "Wimpy set to %d hit points.nr", wimpy );
  1437.     send_to_char( buf, ch );
  1438.     return;
  1439. }
  1440. void do_password( CHAR_DATA *ch, char *argument )
  1441. {
  1442.     char arg1[MAX_INPUT_LENGTH];
  1443.     char arg2[MAX_INPUT_LENGTH];
  1444.     char *pArg;
  1445.     char *pwdnew;
  1446.     char *p;
  1447.     char cEnd;
  1448.     if ( IS_NPC(ch) )
  1449. return;
  1450.     /*
  1451.      * Can't use one_argument here because it smashes case.
  1452.      * So we just steal all its code.  Bleagh.
  1453.      */
  1454.     pArg = arg1;
  1455.     while ( isspace(*argument) )
  1456. argument++;
  1457.     cEnd = ' ';
  1458.     if ( *argument == ''' || *argument == '"' )
  1459. cEnd = *argument++;
  1460.     while ( *argument != '' )
  1461.     {
  1462. if ( *argument == cEnd )
  1463. {
  1464.     argument++;
  1465.     break;
  1466. }
  1467. *pArg++ = *argument++;
  1468.     }
  1469.     *pArg = '';
  1470.     pArg = arg2;
  1471.     while ( isspace(*argument) )
  1472. argument++;
  1473.     cEnd = ' ';
  1474.     if ( *argument == ''' || *argument == '"' )
  1475. cEnd = *argument++;
  1476.     while ( *argument != '' )
  1477.     {
  1478. if ( *argument == cEnd )
  1479. {
  1480.     argument++;
  1481.     break;
  1482. }
  1483. *pArg++ = *argument++;
  1484.     }
  1485.     *pArg = '';
  1486.     if ( arg1[0] == '' || arg2[0] == '' )
  1487.     {
  1488. send_to_char( "Syntax: password <old> <new>.nr", ch );
  1489. return;
  1490.     }
  1491.     if ( strcmp( crypt( arg1, ch->pcdata->pwd ), ch->pcdata->pwd ) )
  1492.     {
  1493. WAIT_STATE( ch, 40 );
  1494. send_to_char( "Wrong password.  Wait 10 seconds.nr", ch );
  1495. return;
  1496.     }
  1497.     if ( strlen(arg2) < 5 )
  1498.     {
  1499. send_to_char(
  1500.     "New password must be at least five characters long.nr", ch );
  1501. return;
  1502.     }
  1503.     /*
  1504.      * No tilde allowed because of player file format.
  1505.      */
  1506.     pwdnew = crypt( arg2, ch->name );
  1507.     for ( p = pwdnew; *p != ''; p++ )
  1508.     {
  1509. if ( *p == '~' )
  1510. {
  1511.     send_to_char(
  1512. "New password not acceptable, try again.nr", ch );
  1513.     return;
  1514. }
  1515.     }
  1516.     free_string( ch->pcdata->pwd );
  1517.     ch->pcdata->pwd = str_dup( pwdnew );
  1518.     save_char_obj( ch );
  1519.     send_to_char( "Ok.nr", ch );
  1520.     return;
  1521. }
  1522. void do_socials( CHAR_DATA *ch, char *argument )
  1523. {
  1524.     char buf[MAX_STRING_LENGTH];
  1525.     int iSocial;
  1526.     int col;
  1527.  
  1528.     col = 0;
  1529.     for ( iSocial = 0; social_table[iSocial].name[0] != ''; iSocial++ )
  1530.     {
  1531. sprintf( buf, "%-12s", social_table[iSocial].name );
  1532. send_to_char( buf, ch );
  1533. if ( ++col % 6 == 0 )
  1534.     send_to_char( "nr", ch );
  1535.     }
  1536.  
  1537.     if ( col % 6 != 0 )
  1538. send_to_char( "nr", ch );
  1539.     return;
  1540. }
  1541. /*
  1542.  * Contributed by Alander.
  1543.  */
  1544. void do_commands( CHAR_DATA *ch, char *argument )
  1545. {
  1546.     char buf[MAX_STRING_LENGTH];
  1547.     char buf1[MAX_STRING_LENGTH];
  1548.     int cmd;
  1549.     int col;
  1550.  
  1551.     buf1[0] = '';
  1552.     col = 0;
  1553.     for ( cmd = 0; cmd_table[cmd].name[0] != ''; cmd++ )
  1554.     {
  1555.         if ( cmd_table[cmd].level <  LEVEL_HERO
  1556.         &&   cmd_table[cmd].level <= get_trust( ch ) )
  1557. {
  1558.     sprintf( buf, "%-12s", cmd_table[cmd].name );
  1559.     strcat( buf1, buf );
  1560.     if ( ++col % 6 == 0 )
  1561. strcat( buf1, "nr" );
  1562. }
  1563.     }
  1564.  
  1565.     if ( col % 6 != 0 )
  1566. strcat( buf1, "nr" );
  1567.     send_to_char( buf1, ch );
  1568.     return;
  1569. }
  1570. void do_channels( CHAR_DATA *ch, char *argument )
  1571. {
  1572.     char arg[MAX_INPUT_LENGTH];
  1573.     one_argument( argument, arg );
  1574.     if ( arg[0] == '' )
  1575.     {
  1576. if ( !IS_NPC(ch) && IS_SET(ch->act, PLR_SILENCE) )
  1577. {
  1578.     send_to_char( "You are silenced.nr", ch );
  1579.     return;
  1580. }
  1581. send_to_char( "Channels:", ch );
  1582. send_to_char( !IS_SET(ch->deaf, CHANNEL_AUCTION)
  1583.     ? " +AUCTION"
  1584.     : " -auction",
  1585.     ch );
  1586. send_to_char( !IS_SET(ch->deaf, CHANNEL_CHAT)
  1587.     ? " +CHAT"
  1588.     : " -chat",
  1589.     ch );
  1590. #if 0
  1591. send_to_char( !IS_SET(ch->deaf, CHANNEL_HACKER)
  1592.     ? " +HACKER"
  1593.     : " -hacker",
  1594.     ch );
  1595. #endif
  1596. if ( IS_HERO(ch) )
  1597. {
  1598.     send_to_char( !IS_SET(ch->deaf, CHANNEL_IMMTALK)
  1599. ? " +IMMTALK"
  1600. : " -immtalk",
  1601. ch );
  1602. }
  1603. send_to_char( !IS_SET(ch->deaf, CHANNEL_MUSIC)
  1604.     ? " +MUSIC"
  1605.     : " -music",
  1606.     ch );
  1607. send_to_char( !IS_SET(ch->deaf, CHANNEL_QUESTION)
  1608.     ? " +QUESTION"
  1609.     : " -question",
  1610.     ch );
  1611. send_to_char( !IS_SET(ch->deaf, CHANNEL_SHOUT)
  1612.     ? " +SHOUT"
  1613.     : " -shout",
  1614.     ch );
  1615. send_to_char( !IS_SET(ch->deaf, CHANNEL_YELL)
  1616.     ? " +YELL"
  1617.     : " -yell",
  1618.     ch );
  1619. send_to_char( ".nr", ch );
  1620.     }
  1621.     else
  1622.     {
  1623. bool fClear;
  1624. int bit;
  1625.      if ( arg[0] == '+' ) fClear = TRUE;
  1626. else if ( arg[0] == '-' ) fClear = FALSE;
  1627. else
  1628. {
  1629.     send_to_char( "Channels -channel or +channel?nr", ch );
  1630.     return;
  1631. }
  1632.      if ( !str_cmp( arg+1, "auction"  ) ) bit = CHANNEL_AUCTION;
  1633.         else if ( !str_cmp( arg+1, "chat"     ) ) bit = CHANNEL_CHAT;
  1634. #if 0
  1635. else if ( !str_cmp( arg+1, "hacker"   ) ) bit = CHANNEL_HACKER;
  1636. #endif
  1637. else if ( !str_cmp( arg+1, "immtalk"  ) ) bit = CHANNEL_IMMTALK;
  1638. else if ( !str_cmp( arg+1, "music"    ) ) bit = CHANNEL_MUSIC;
  1639. else if ( !str_cmp( arg+1, "question" ) ) bit = CHANNEL_QUESTION;
  1640. else if ( !str_cmp( arg+1, "shout"    ) ) bit = CHANNEL_SHOUT;
  1641. else if ( !str_cmp( arg+1, "yell"     ) ) bit = CHANNEL_YELL;
  1642. else
  1643. {
  1644.     send_to_char( "Set or clear which channel?nr", ch );
  1645.     return;
  1646. }
  1647. if ( fClear )
  1648.     REMOVE_BIT (ch->deaf, bit);
  1649. else
  1650.     SET_BIT    (ch->deaf, bit);
  1651. send_to_char( "Ok.nr", ch );
  1652.     }
  1653.     return;
  1654. }
  1655. /*
  1656.  * Contributed by Grodyn.
  1657.  */
  1658. void do_config( CHAR_DATA *ch, char *argument )
  1659. {
  1660.     char arg[MAX_INPUT_LENGTH];
  1661.     if ( IS_NPC(ch) )
  1662. return;
  1663.     one_argument( argument, arg );
  1664.     if ( arg[0] == '' )
  1665.     {
  1666.         send_to_char( "[ Keyword  ] Optionnr", ch );
  1667. send_to_char(  IS_SET(ch->act, PLR_AUTOEXIT)
  1668.             ? "[+AUTOEXIT ] You automatically see exits.nr"
  1669.     : "[-autoexit ] You don't automatically see exits.nr"
  1670.     , ch );
  1671. send_to_char(  IS_SET(ch->act, PLR_AUTOLOOT)
  1672.     ? "[+AUTOLOOT ] You automatically loot corpses.nr"
  1673.     : "[-autoloot ] You don't automatically loot corpses.nr"
  1674.     , ch );
  1675. send_to_char(  IS_SET(ch->act, PLR_AUTOSAC)
  1676.     ? "[+AUTOSAC  ] You automatically sacrifice corpses.nr"
  1677.     : "[-autosac  ] You don't automatically sacrifice corpses.nr"
  1678.     , ch );
  1679. send_to_char(  IS_SET(ch->act, PLR_BLANK)
  1680.     ? "[+BLANK    ] You have a blank line before your prompt.nr"
  1681.     : "[-blank    ] You have no blank line before your prompt.nr"
  1682.     , ch );
  1683. send_to_char(  IS_SET(ch->act, PLR_BRIEF)
  1684.     ? "[+BRIEF    ] You see brief descriptions.nr"
  1685.     : "[-brief    ] You see long descriptions.nr"
  1686.     , ch );
  1687.          
  1688. send_to_char(  IS_SET(ch->act, PLR_COMBINE)
  1689.     ? "[+COMBINE  ] You see object lists in combined format.nr"
  1690.     : "[-combine  ] You see object lists in single format.nr"
  1691.     , ch );
  1692. send_to_char(  IS_SET(ch->act, PLR_PROMPT)
  1693.     ? "[+PROMPT   ] You have a prompt.nr"
  1694.     : "[-prompt   ] You don't have a prompt.nr"
  1695.     , ch );
  1696. send_to_char(  IS_SET(ch->act, PLR_TELNET_GA)
  1697.     ? "[+TELNETGA ] You receive a telnet GA sequence.nr"
  1698.     : "[-telnetga ] You don't receive a telnet GA sequence.nr"
  1699.     , ch );
  1700. send_to_char(  IS_SET(ch->act, PLR_SILENCE)
  1701.     ? "[+SILENCE  ] You are silenced.nr"
  1702.     : ""
  1703.     , ch );
  1704. send_to_char( !IS_SET(ch->act, PLR_NO_EMOTE)
  1705.     ? ""
  1706.     : "[-emote    ] You can't emote.nr"
  1707.     , ch );
  1708. send_to_char( !IS_SET(ch->act, PLR_NO_TELL)
  1709.     ? ""
  1710.     : "[-tell     ] You can't use 'tell'.nr"
  1711.     , ch );
  1712.     }
  1713.     else
  1714.     {
  1715. bool fSet;
  1716. int bit;
  1717.      if ( arg[0] == '+' ) fSet = TRUE;
  1718. else if ( arg[0] == '-' ) fSet = FALSE;
  1719. else
  1720. {
  1721.     send_to_char( "Config -option or +option?nr", ch );
  1722.     return;
  1723. }
  1724.              if ( !str_cmp( arg+1, "autoexit" ) ) bit = PLR_AUTOEXIT;
  1725. else if ( !str_cmp( arg+1, "autoloot" ) ) bit = PLR_AUTOLOOT;
  1726. else if ( !str_cmp( arg+1, "autosac"  ) ) bit = PLR_AUTOSAC;
  1727. else if ( !str_cmp( arg+1, "blank"    ) ) bit = PLR_BLANK;
  1728. else if ( !str_cmp( arg+1, "brief"    ) ) bit = PLR_BRIEF;
  1729. else if ( !str_cmp( arg+1, "combine"  ) ) bit = PLR_COMBINE;
  1730.         else if ( !str_cmp( arg+1, "prompt"   ) ) bit = PLR_PROMPT;
  1731. else if ( !str_cmp( arg+1, "telnetga" ) ) bit = PLR_TELNET_GA;
  1732. else
  1733. {
  1734.     send_to_char( "Config which option?nr", ch );
  1735.     return;
  1736. }
  1737. if ( fSet )
  1738.     SET_BIT    (ch->act, bit);
  1739. else
  1740.     REMOVE_BIT (ch->act, bit);
  1741. send_to_char( "Ok.nr", ch );
  1742.     }
  1743.     return;
  1744. }
  1745. void do_wizlist ( CHAR_DATA *ch, char *argument )
  1746. {
  1747.     do_help ( ch, "wizlist" );
  1748.     return;
  1749. }
  1750. void do_spells ( CHAR_DATA *ch, char *argument )
  1751. {
  1752.     char buf [MAX_STRING_LENGTH];
  1753.     char buf1[MAX_STRING_LENGTH];
  1754.     int sn;
  1755.     int col;
  1756.     if ( ( !IS_NPC( ch ) &&
  1757.    !class_table[ch->class].fMana )
  1758.     ||  IS_NPC ( ch ) )
  1759.     {  
  1760.        send_to_char ( "You do not know how to cast spells!nr", ch );
  1761.        return;
  1762.     }
  1763.     buf1[0] = '';
  1764.     col = 0;
  1765.     for ( sn = 0; sn < MAX_SKILL; sn++ )
  1766.     {
  1767.         if ( skill_table[sn].name == NULL )
  1768.    break;
  1769. if ( ( ch->level < skill_table[sn].skill_level[ch->class] )
  1770. || ( skill_table[sn].skill_level[ch->class] > LEVEL_HERO ) )
  1771.    continue;
  1772. sprintf ( buf, "%18s %3dpts ",
  1773.            skill_table[sn].name, MANA_COST( ch, sn ) );
  1774. strcat( buf1, buf );
  1775. if ( ++col % 3 == 0 )
  1776.    strcat( buf1, "nr" );
  1777.     }
  1778.     if ( col % 3 != 0 )
  1779.       strcat( buf1, "nr" );
  1780.     send_to_char ( buf1, ch );
  1781.     return;
  1782. }
  1783. void do_slist ( CHAR_DATA *ch, char *argument )
  1784. {
  1785.     char buf [MAX_STRING_LENGTH];
  1786.     char buf1[MAX_STRING_LENGTH];
  1787.     int sn;
  1788.     int col;
  1789.     int level;
  1790.     bool pSpell;
  1791.     if ( ( !IS_NPC( ch ) &&
  1792.    !class_table[ch->class].fMana )
  1793.     ||  IS_NPC ( ch ) )
  1794.     {  
  1795.        send_to_char ( "You do not need any stinking spells!nr", ch );
  1796.        return;
  1797.     }
  1798.     buf1[0] = '';
  1799.     strcat ( buf1, "ALL Spells available for your class.nrnr" );
  1800.     strcat ( buf1, "Lv          Spellsnrnr" );
  1801.     for ( level = 1; level < LEVEL_IMMORTAL; level++ )
  1802.     {
  1803.       col = 0;
  1804.       pSpell = TRUE;
  1805.       for ( sn = 0; sn < MAX_SKILL; sn++ )
  1806.       {
  1807. if ( skill_table[sn].name == NULL )
  1808.   break;
  1809. if ( skill_table[sn].skill_level[ch->class] != level )
  1810.   continue;
  1811. if (pSpell)
  1812. {
  1813.   sprintf ( buf, "%2d:", level );
  1814.   strcat ( buf1, buf );
  1815.   pSpell = FALSE;
  1816. }
  1817. if ( ++col % 5 == 0 )
  1818.   strcat ( buf1, "   " );
  1819. sprintf ( buf, "%18s", skill_table[sn].name );
  1820. strcat ( buf1, buf );
  1821. if ( col % 4 == 0 )
  1822.   strcat ( buf1, "nr" );
  1823.       }
  1824.       if ( col % 4 != 0 )
  1825. strcat ( buf1, "nr" );
  1826.     }
  1827.     send_to_char( buf1, ch );
  1828.     return;
  1829. }
  1830. /* by passing the conf command - Kahn */
  1831. void do_autoexit ( CHAR_DATA *ch, char *argument )
  1832. {
  1833.     ( IS_SET ( ch->act, PLR_AUTOEXIT )
  1834.      ? do_config( ch, "-autoexit" )
  1835.      : do_config( ch, "+autoexit" ) );
  1836. }
  1837. void do_autoloot ( CHAR_DATA *ch, char *argument )
  1838. {
  1839.     ( IS_SET ( ch->act, PLR_AUTOLOOT )
  1840.      ? do_config( ch, "-autoloot" )
  1841.      : do_config( ch, "+autoloot" ) );
  1842. }
  1843. void do_autosac ( CHAR_DATA *ch, char *argument )
  1844. {
  1845.     ( IS_SET ( ch->act, PLR_AUTOSAC )
  1846.      ? do_config( ch, "-autosac" )
  1847.      : do_config( ch, "+autosac" ) );
  1848. }
  1849. void do_blank ( CHAR_DATA *ch, char *argument )
  1850. {
  1851.     ( IS_SET ( ch->act, PLR_BLANK )
  1852.      ? do_config( ch, "-blank" )
  1853.      : do_config( ch, "+blank" ) );
  1854. }
  1855. void do_brief ( CHAR_DATA *ch, char *argument )
  1856. {
  1857.     ( IS_SET ( ch->act, PLR_BRIEF )
  1858.      ? do_config( ch, "-brief" )
  1859.      : do_config( ch, "+brief" ) );
  1860. }
  1861. void do_combine ( CHAR_DATA *ch, char *argument )
  1862. {
  1863.     ( IS_SET ( ch->act, PLR_COMBINE )
  1864.      ? do_config( ch, "-combine" )
  1865.      : do_config( ch, "+combine" ) );
  1866. }
  1867.  
  1868. void do_pagelen ( CHAR_DATA *ch, char *argument )
  1869. {
  1870.     char buf[MAX_STRING_LENGTH];
  1871.     char arg[MAX_INPUT_LENGTH];
  1872.     int lines;
  1873.     one_argument( argument, arg );
  1874.     if ( arg[0] == '' )
  1875. lines = 20;
  1876.     else
  1877. lines = atoi( arg );
  1878.     if ( lines < 1 )
  1879.     {
  1880. send_to_char(
  1881. "Negative or Zero values for a page pause is not legal.nr",
  1882.      ch );
  1883. return;
  1884.     }
  1885.     ch->pcdata->pagelen = lines;
  1886.     sprintf( buf, "Page pause set to %d lines.nr", lines );
  1887.     send_to_char( buf, ch );
  1888.     return;
  1889. }
  1890. /* Do_prompt from Morgenes from Aldara Mud */
  1891. void do_prompt( CHAR_DATA *ch, char *argument )
  1892. {
  1893.    char buf[MAX_STRING_LENGTH];
  1894.    // Next line is the Sands fix
  1895.    ch = ( ch->desc->original != NULL ? ch->desc->original :
  1896.           ch->desc->character);
  1897.    if ( argument[0] == '' )
  1898.    {
  1899.        ( IS_SET ( ch->act, PLR_PROMPT )
  1900. ? do_config( ch, "-prompt" )
  1901. : do_config( ch, "+prompt" ) );
  1902.        return;
  1903.    }
  1904.    if( !strcmp( argument, "all" ) )
  1905.       strcpy( buf, "<%hhp %mm %vmv> ");
  1906.    else
  1907.    {
  1908.       if ( strlen(argument) > 50 )
  1909.          argument[50] = '';
  1910.       strcpy( buf, argument );
  1911.       smash_tilde( buf );
  1912.    }
  1913. // Sands erases this
  1914. //   free_string( ch->prompt );
  1915.    ch->prompt = str_dup( buf );
  1916.    send_to_char( "Ok.nr", ch );
  1917.    return;
  1918. void do_auto( CHAR_DATA *ch, char *argument )
  1919. {
  1920.     do_config( ch, "" );
  1921.     return;
  1922. }