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

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 <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <time.h>
  26. #include "merc.h"
  27. void do_wizhelp( CHAR_DATA *ch, char *argument )
  28. {
  29.     char buf[MAX_STRING_LENGTH];
  30.     char buf1[MAX_STRING_LENGTH];
  31.     int cmd;
  32.     int col;
  33.  
  34.     buf1[0] = '';
  35.     col = 0;
  36.     for ( cmd = 0; cmd_table[cmd].name[0] != ''; cmd++ )
  37.     {
  38.         if ( cmd_table[cmd].level >= LEVEL_HERO
  39.         &&   cmd_table[cmd].level <= get_trust( ch ) )
  40. {
  41.     sprintf( buf, "%-12s", cmd_table[cmd].name );
  42.     strcat( buf1, buf );
  43.     if ( ++col % 6 == 0 )
  44. strcat( buf1, "nr" );
  45. }
  46.     }
  47.  
  48.     if ( col % 6 != 0 )
  49. strcat( buf1, "nr" );
  50.     send_to_char( buf1, ch );
  51.     return;
  52. }
  53. void do_bamfin( CHAR_DATA *ch, char *argument )
  54. {
  55.     if ( !IS_NPC(ch) )
  56.     {
  57. smash_tilde( argument );
  58. free_string( ch->pcdata->bamfin );
  59. ch->pcdata->bamfin = str_dup( argument );
  60. send_to_char( "Ok.nr", ch );
  61.     }
  62.     return;
  63. }
  64. void do_bamfout( CHAR_DATA *ch, char *argument )
  65. {
  66.     if ( !IS_NPC(ch) )
  67.     {
  68. smash_tilde( argument );
  69. free_string( ch->pcdata->bamfout );
  70. ch->pcdata->bamfout = str_dup( argument );
  71. send_to_char( "Ok.nr", ch );
  72.     }
  73.     return;
  74. }
  75. void do_deny( CHAR_DATA *ch, char *argument )
  76. {
  77.     char arg[MAX_INPUT_LENGTH];
  78.     CHAR_DATA *victim;
  79.     one_argument( argument, arg );
  80.     if ( arg[0] == '' )
  81.     {
  82. send_to_char( "Deny whom?nr", ch );
  83. return;
  84.     }
  85.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  86.     {
  87. send_to_char( "They aren't here.nr", ch );
  88. return;
  89.     }
  90.     if ( IS_NPC(victim) )
  91.     {
  92. send_to_char( "Not on NPC's.nr", ch );
  93. return;
  94.     }
  95.     if ( get_trust( victim ) >= get_trust( ch ) )
  96.     {
  97. send_to_char( "You failed.nr", ch );
  98. return;
  99.     }
  100.     SET_BIT(victim->act, PLR_DENY);
  101.     send_to_char( "You are denied access!nr", victim );
  102.     send_to_char( "OK.nr", ch );
  103.     do_quit( victim, "" );
  104.     return;
  105. }
  106. void do_disconnect( CHAR_DATA *ch, char *argument )
  107. {
  108.     char arg[MAX_INPUT_LENGTH];
  109.     DESCRIPTOR_DATA *d;
  110.     CHAR_DATA *victim;
  111.     one_argument( argument, arg );
  112.     if ( arg[0] == '' )
  113.     {
  114. send_to_char( "Disconnect whom?nr", ch );
  115. return;
  116.     }
  117.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  118.     {
  119. send_to_char( "They aren't here.nr", ch );
  120. return;
  121.     }
  122.     if ( victim->desc == NULL )
  123.     {
  124. act( "$N doesn't have a descriptor.", ch, NULL, victim, TO_CHAR );
  125. return;
  126.     }
  127.     for ( d = descriptor_list; d != NULL; d = d->next )
  128.     {
  129. if ( d == victim->desc )
  130. {
  131.     close_socket( d );
  132.     send_to_char( "Ok.nr", ch );
  133.     return;
  134. }
  135.     }
  136.     bug( "Do_disconnect: desc not found.", 0 );
  137.     send_to_char( "Descriptor not found!nr", ch );
  138.     return;
  139. }
  140. void do_pardon( CHAR_DATA *ch, char *argument )
  141. {
  142.     char arg1[MAX_INPUT_LENGTH];
  143.     char arg2[MAX_INPUT_LENGTH];
  144.     CHAR_DATA *victim;
  145.     argument = one_argument( argument, arg1 );
  146.     argument = one_argument( argument, arg2 );
  147.     if ( arg1[0] == '' || arg2[0] == '' )
  148.     {
  149. send_to_char( "Syntax: pardon <character> <killer|thief>.nr", ch );
  150. return;
  151.     }
  152.     if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
  153.     {
  154. send_to_char( "They aren't here.nr", ch );
  155. return;
  156.     }
  157.     if ( IS_NPC(victim) )
  158.     {
  159. send_to_char( "Not on NPC's.nr", ch );
  160. return;
  161.     }
  162.     if ( !str_cmp( arg2, "killer" ) )
  163.     {
  164. if ( IS_SET(victim->act, PLR_KILLER) )
  165. {
  166.     REMOVE_BIT( victim->act, PLR_KILLER );
  167.     send_to_char( "Killer flag removed.nr", ch );
  168.     send_to_char( "You are no longer a KILLER.nr", victim );
  169. }
  170. return;
  171.     }
  172.     if ( !str_cmp( arg2, "thief" ) )
  173.     {
  174. if ( IS_SET(victim->act, PLR_THIEF) )
  175. {
  176.     REMOVE_BIT( victim->act, PLR_THIEF );
  177.     send_to_char( "Thief flag removed.nr", ch );
  178.     send_to_char( "You are no longer a THIEF.nr", victim );
  179. }
  180. return;
  181.     }
  182.     send_to_char( "Syntax: pardon <character> <killer|thief>.nr", ch );
  183.     return;
  184. }
  185. void do_echo( CHAR_DATA *ch, char *argument )
  186. {
  187.     DESCRIPTOR_DATA *d;
  188.     
  189.     if ( argument[0] == '' )
  190.     {
  191. send_to_char( "Echo what?nr", ch );
  192. return;
  193.     }
  194.     for ( d = descriptor_list; d; d = d->next )
  195.     {
  196. if ( d->connected == CON_PLAYING )
  197. {
  198.     send_to_char( argument, d->character );
  199.     send_to_char( "nr",   d->character );
  200. }
  201.     }
  202.     return;
  203. }
  204. void do_recho( CHAR_DATA *ch, char *argument )
  205. {
  206.     DESCRIPTOR_DATA *d;
  207.     
  208.     if ( argument[0] == '' )
  209.     {
  210. send_to_char( "Recho what?nr", ch );
  211. return;
  212.     }
  213.     for ( d = descriptor_list; d; d = d->next )
  214.     {
  215. if ( d->connected == CON_PLAYING
  216. &&   d->character->in_room == ch->in_room )
  217. {
  218.     send_to_char( argument, d->character );
  219.     send_to_char( "nr",   d->character );
  220. }
  221.     }
  222.     return;
  223. }
  224. ROOM_INDEX_DATA *find_location( CHAR_DATA *ch, char *arg )
  225. {
  226.     CHAR_DATA *victim;
  227.     OBJ_DATA *obj;
  228.     if ( is_number(arg) )
  229. return get_room_index( atoi( arg ) );
  230.     if ( ( victim = get_char_world( ch, arg ) ) != NULL )
  231. return victim->in_room;
  232.     if ( ( obj = get_obj_world( ch, arg ) ) != NULL )
  233. return obj->in_room;
  234.     return NULL;
  235. }
  236. void do_transfer( CHAR_DATA *ch, char *argument )
  237. {
  238.     char arg1[MAX_INPUT_LENGTH];
  239.     char arg2[MAX_INPUT_LENGTH];
  240.     ROOM_INDEX_DATA *location;
  241.     DESCRIPTOR_DATA *d;
  242.     CHAR_DATA *victim;
  243.     argument = one_argument( argument, arg1 );
  244.     argument = one_argument( argument, arg2 );
  245.     if ( arg1[0] == '' )
  246.     {
  247. send_to_char( "Transfer whom (and where)?nr", ch );
  248. return;
  249.     }
  250.     if ( !str_cmp( arg1, "all" ) )
  251.     {
  252. for ( d = descriptor_list; d != NULL; d = d->next )
  253. {
  254.     if ( d->connected == CON_PLAYING
  255.     &&   d->character != ch
  256.     &&   d->character->in_room != NULL
  257.     &&   can_see( ch, d->character ) )
  258.     {
  259. char buf[MAX_STRING_LENGTH];
  260. sprintf( buf, "%s %s", d->character->name, arg2 );
  261. do_transfer( ch, buf );
  262.     }
  263. }
  264. return;
  265.     }
  266.     /*
  267.      * Thanks to Grodyn for the optional location parameter.
  268.      */
  269.     if ( arg2[0] == '' )
  270.     {
  271. location = ch->in_room;
  272.     }
  273.     else
  274.     {
  275. if ( ( location = find_location( ch, arg2 ) ) == NULL )
  276. {
  277.     send_to_char( "No such location.nr", ch );
  278.     return;
  279. }
  280. if ( room_is_private( location ) )
  281. {
  282.     send_to_char( "That room is private right now.nr", ch );
  283.     return;
  284. }
  285.     }
  286.     if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
  287.     {
  288. send_to_char( "They aren't here.nr", ch );
  289. return;
  290.     }
  291.     if ( victim->in_room == NULL )
  292.     {
  293. send_to_char( "They are in limbo.nr", ch );
  294. return;
  295.     }
  296.     if ( victim->fighting != NULL )
  297. stop_fighting( victim, TRUE );
  298.     act( "$n disappears in a mushroom cloud.", victim, NULL, NULL, TO_ROOM );
  299.     char_from_room( victim );
  300.     char_to_room( victim, location );
  301.     act( "$n arrives from a puff of smoke.", victim, NULL, NULL, TO_ROOM );
  302.     if ( ch != victim )
  303. act( "$n has transferred you.", ch, NULL, victim, TO_VICT );
  304.     do_look( victim, "auto" );
  305.     send_to_char( "Ok.nr", ch );
  306. }
  307. void do_at( CHAR_DATA *ch, char *argument )
  308. {
  309.     char arg[MAX_INPUT_LENGTH];
  310.     ROOM_INDEX_DATA *location;
  311.     ROOM_INDEX_DATA *original;
  312.     CHAR_DATA *wch;
  313.     
  314.     argument = one_argument( argument, arg );
  315.     if ( arg[0] == '' || argument[0] == '' )
  316.     {
  317. send_to_char( "At where what?nr", ch );
  318. return;
  319.     }
  320.     if ( ( location = find_location( ch, arg ) ) == NULL )
  321.     {
  322. send_to_char( "No such location.nr", ch );
  323. return;
  324.     }
  325.     if ( room_is_private( location ) )
  326.     {
  327. send_to_char( "That room is private right now.nr", ch );
  328. return;
  329.     }
  330.     original = ch->in_room;
  331.     char_from_room( ch );
  332.     char_to_room( ch, location );
  333.     interpret( ch, argument );
  334.     /*
  335.      * See if 'ch' still exists before continuing!
  336.      * Handles 'at XXXX quit' case.
  337.      */
  338.     for ( wch = char_list; wch != NULL; wch = wch->next )
  339.     {
  340. if ( wch == ch )
  341. {
  342.     char_from_room( ch );
  343.     char_to_room( ch, original );
  344.     break;
  345. }
  346.     }
  347.     return;
  348. }
  349. void do_goto( CHAR_DATA *ch, char *argument )
  350. {
  351.     char arg[MAX_INPUT_LENGTH];
  352.     ROOM_INDEX_DATA *location;
  353.     one_argument( argument, arg );
  354.     if ( arg[0] == '' )
  355.     {
  356. send_to_char( "Goto where?nr", ch );
  357. return;
  358.     }
  359.     if ( ( location = find_location( ch, arg ) ) == NULL )
  360.     {
  361. send_to_char( "No such location.nr", ch );
  362. return;
  363.     }
  364.     if ( room_is_private( location ) )
  365.     {
  366. send_to_char( "That room is private right now.nr", ch );
  367. return;
  368.     }
  369.     if ( ch->fighting != NULL )
  370. stop_fighting( ch, TRUE );
  371.     if ( !IS_SET(ch->act, PLR_WIZINVIS) )
  372.     {
  373. act( "$n $T.", ch, NULL,
  374.     (ch->pcdata != NULL && ch->pcdata->bamfout[0] != '')
  375.     ? ch->pcdata->bamfout : "leaves in a swirling mist",  TO_ROOM );
  376.     }
  377.     char_from_room( ch );
  378.     char_to_room( ch, location );
  379.     if ( !IS_SET(ch->act, PLR_WIZINVIS) )
  380.     {
  381. act( "$n $T.", ch, NULL,
  382.     (ch->pcdata != NULL && ch->pcdata->bamfin[0] != '')
  383.     ? ch->pcdata->bamfin : "appears in a swirling mist", TO_ROOM );
  384.     }
  385.     do_look( ch, "auto" );
  386.     return;
  387. }
  388. void do_rstat( CHAR_DATA *ch, char *argument )
  389. {
  390.     char buf[MAX_STRING_LENGTH];
  391.     char buf1[MAX_STRING_LENGTH];
  392.     char arg[MAX_INPUT_LENGTH];
  393.     ROOM_INDEX_DATA *location;
  394.     OBJ_DATA *obj;
  395.     CHAR_DATA *rch;
  396.     int door;
  397.     one_argument( argument, arg );
  398.     location = ( arg[0] == '' ) ? ch->in_room : find_location( ch, arg );
  399.     if ( location == NULL )
  400.     {
  401. send_to_char( "No such location.nr", ch );
  402. return;
  403.     }
  404.     if ( ch->in_room != location && room_is_private( location ) )
  405.     {
  406. send_to_char( "That room is private right now.nr", ch );
  407. return;
  408.     }
  409.     buf1[0] = '';
  410.     sprintf( buf, "Name: '%s.'nrArea: '%s'.nr",
  411. location->name,
  412. location->area->name );
  413.     strcat( buf1, buf );
  414.     sprintf( buf,
  415. "Vnum: %d.  Sector: %d.  Light: %d.nr",
  416. location->vnum,
  417. location->sector_type,
  418. location->light );
  419.     strcat( buf1, buf );
  420.     sprintf( buf,
  421. "Room flags: %d.nrDescription:nr%s",
  422. location->room_flags,
  423. location->description );
  424.     strcat( buf1, buf );
  425.     if ( location->extra_descr != NULL )
  426.     {
  427. EXTRA_DESCR_DATA *ed;
  428. strcat( buf1, "Extra description keywords: '" );
  429. for ( ed = location->extra_descr; ed; ed = ed->next )
  430. {
  431.     strcat( buf1, ed->keyword );
  432.     if ( ed->next != NULL )
  433. strcat( buf1, " " );
  434. }
  435. strcat( buf1, "'.nr" );
  436.     }
  437.     strcat( buf1, "Characters:" );
  438.     for ( rch = location->people; rch; rch = rch->next_in_room )
  439.     {
  440. strcat( buf1, " " );
  441. one_argument( rch->name, buf );
  442. strcat( buf1, buf );
  443.     }
  444.     strcat( buf1, ".nrObjects:   " );
  445.     for ( obj = location->contents; obj; obj = obj->next_content )
  446.     {
  447. strcat( buf1, " " );
  448. one_argument( obj->name, buf );
  449. strcat( buf1, buf );
  450.     }
  451.     strcat( buf1, ".nr" );
  452.     for ( door = 0; door <= 5; door++ )
  453.     {
  454. EXIT_DATA *pexit;
  455. if ( ( pexit = location->exit[door] ) != NULL )
  456. {
  457.     sprintf( buf,
  458. "Door: %d.  To: %d.  Key: %d.  Exit flags: %d.nrKeyword: '%s'.  Description: %s",
  459. door,
  460. pexit->to_room != NULL ? pexit->to_room->vnum : 0,
  461.      pexit->key,
  462.      pexit->exit_info,
  463.      pexit->keyword,
  464.      pexit->description[0] != ''
  465.     ? pexit->description : "(none).nr" );
  466.     strcat( buf1, buf );
  467. }
  468.     }
  469.     send_to_char( buf1, ch );
  470.     return;
  471. }
  472. void do_ostat( CHAR_DATA *ch, char *argument )
  473. {
  474.     char buf[MAX_STRING_LENGTH];
  475.     char buf1[MAX_STRING_LENGTH];
  476.     char arg[MAX_INPUT_LENGTH];
  477.     AFFECT_DATA *paf;
  478.     OBJ_DATA *obj;
  479.     one_argument( argument, arg );
  480.     if ( arg[0] == '' )
  481.     {
  482. send_to_char( "Ostat what?nr", ch );
  483. return;
  484.     }
  485.     buf1[0] = '';
  486.     if ( ( obj = get_obj_world( ch, arg ) ) == NULL )
  487.     {
  488. send_to_char( "Nothing like that in hell, earth, or heaven.nr", ch );
  489. return;
  490.     }
  491.     sprintf( buf, "Name: %s.nr",
  492. obj->name );
  493.     strcat( buf1, buf );
  494.     sprintf( buf, "Vnum: %d.  Type: %s.nr",
  495. obj->pIndexData->vnum, item_type_name( obj ) );
  496.     strcat( buf1, buf );
  497.     sprintf( buf, "Short description: %s.nrLong description: %snr",
  498. obj->short_descr, obj->description );
  499.     strcat( buf1, buf );
  500.     sprintf( buf, "Wear bits: %d.  Extra bits: %s.nr",
  501. obj->wear_flags, extra_bit_name( obj->extra_flags ) );
  502.     strcat( buf1, buf );
  503.     sprintf( buf, "Number: %d/%d.  Weight: %d/%d.nr",
  504. 1,           get_obj_number( obj ),
  505. obj->weight, get_obj_weight( obj ) );
  506.     strcat( buf1, buf );
  507.     sprintf( buf, "Cost: %d.  Timer: %d.  Level: %d.nr",
  508. obj->cost, obj->timer, obj->level );
  509.     strcat( buf1, buf );
  510.     sprintf( buf,
  511. "In room: %d.  In object: %s.  Carried by: %s.  Wear_loc: %d.nr",
  512. obj->in_room    == NULL    ?        0 : obj->in_room->vnum,
  513. obj->in_obj     == NULL    ? "(none)" : obj->in_obj->short_descr,
  514. obj->carried_by == NULL    ? "(none)" : obj->carried_by->name,
  515. obj->wear_loc );
  516.     strcat( buf1, buf );
  517.     
  518.     sprintf( buf, "Values: %d %d %d %d.nr",
  519. obj->value[0], obj->value[1], obj->value[2], obj->value[3] );
  520.     strcat( buf1, buf );
  521.     if ( obj->extra_descr != NULL || obj->pIndexData->extra_descr != NULL )
  522.     {
  523. EXTRA_DESCR_DATA *ed;
  524. strcat( buf1, "Extra description keywords: '" );
  525. for ( ed = obj->extra_descr; ed != NULL; ed = ed->next )
  526. {
  527.     strcat( buf1, ed->keyword );
  528.     if ( ed->next != NULL )
  529. strcat( buf1, " " );
  530. }
  531. for ( ed = obj->pIndexData->extra_descr; ed != NULL; ed = ed->next )
  532. {
  533.     strcat( buf1, ed->keyword );
  534.     if ( ed->next != NULL )
  535. strcat( buf1, " " );
  536. }
  537. strcat( buf1, "'.nr" );
  538.     }
  539.     for ( paf = obj->affected; paf != NULL; paf = paf->next )
  540.     {
  541. sprintf( buf, "Affects %s by %d.nr",
  542.     affect_loc_name( paf->location ), paf->modifier );
  543. strcat( buf1, buf );
  544.     }
  545.     for ( paf = obj->pIndexData->affected; paf != NULL; paf = paf->next )
  546.     {
  547. sprintf( buf, "Affects %s by %d.nr",
  548.     affect_loc_name( paf->location ), paf->modifier );
  549. strcat( buf1, buf );
  550.     }
  551.     send_to_char( buf1, ch );
  552.     return;
  553. }
  554. /*
  555.  * Return ascii name of an act bit vector.
  556.  */
  557. char *act_bit_name( int vector )
  558. {
  559.     static char buf[512];
  560.     buf[0] = '';
  561.     if ( vector & ACT_IS_NPC    ) strcat( buf, " npc"           );
  562.     if ( vector & ACT_SENTINEL ) strcat( buf, " sentinel"      );
  563.     if ( vector & ACT_SCAVENGER ) strcat( buf, " scavenger"     );
  564.     if ( vector & ACT_AGGRESSIVE ) strcat( buf, " aggressive"    );
  565.     if ( vector & ACT_STAY_AREA ) strcat( buf, " stay-area"     );
  566.     if ( vector & ACT_WIMPY    ) strcat( buf, " wimpy"         );
  567.     if ( vector & ACT_PET    ) strcat( buf, " pet"           );
  568.     if ( vector & ACT_TRAIN    ) strcat( buf, " train"         );
  569.     if ( vector & ACT_PRACTICE ) strcat( buf, " practice"      );
  570.     return buf+1;
  571. }
  572. void do_mstat( CHAR_DATA *ch, char *argument )
  573. {
  574.     char buf[MAX_STRING_LENGTH];
  575.     char buf1[MAX_STRING_LENGTH];
  576.     char arg[MAX_INPUT_LENGTH];
  577.     AFFECT_DATA *paf;
  578.     CHAR_DATA *victim;
  579.     one_argument( argument, arg );
  580.     if ( arg[0] == '' )
  581.     {
  582. send_to_char( "Mstat whom?nr", ch );
  583. return;
  584.     }
  585.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  586.     {
  587. send_to_char( "They aren't here.nr", ch );
  588. return;
  589.     }
  590.     buf1[0] = '';
  591.     sprintf( buf, "Name: %s.nr",
  592. victim->name );
  593.     strcat( buf1, buf );
  594.     sprintf( buf, "Vnum: %d.  Sex: %s.  Room: %d.nr",
  595. IS_NPC(victim) ? victim->pIndexData->vnum : 0,
  596. victim->sex == SEX_MALE    ? "male"   :
  597. victim->sex == SEX_FEMALE  ? "female" : "neutral",
  598. victim->in_room == NULL    ?        0 : victim->in_room->vnum
  599. );
  600.     strcat( buf1, buf );
  601.     sprintf( buf, "Str: %d.  Int: %d.  Wis: %d.  Dex: %d.  Con: %d.nr",
  602. get_curr_str(victim),
  603. get_curr_int(victim),
  604. get_curr_wis(victim),
  605. get_curr_dex(victim),
  606. get_curr_con(victim) );
  607.     strcat( buf1, buf );
  608.     sprintf( buf, "Hp: %d/%d.  Mana: %d/%d.  Move: %d/%d.  Practices: %d.nr",
  609. victim->hit,         victim->max_hit,
  610. victim->mana,        victim->max_mana,
  611. victim->move,        victim->max_move,
  612. victim->practice );
  613.     strcat( buf1, buf );
  614.     sprintf( buf,
  615. "Lv: %d.  Class: %d.  Align: %d.  AC: %d.  Gold: %d.  Exp: %d.nr",
  616. victim->level,       victim->class,        victim->alignment,
  617. GET_AC(victim),      victim->gold,         victim->exp );
  618.     strcat( buf1, buf );
  619.     sprintf( buf, "Hitroll: %d.  Damroll: %d.  Position: %d.  Wimpy: %d.nr",
  620. GET_HITROLL(victim), GET_DAMROLL(victim),
  621. victim->position,    victim->wimpy );
  622.     strcat( buf1, buf );
  623.     if ( !IS_NPC( victim ) )
  624.     {
  625. sprintf( buf, "Page Lines: %d.nr", victim->pcdata->pagelen );
  626. strcat( buf1, buf );
  627.     }
  628.     sprintf( buf, "Fighting: %s.nr",
  629.     victim->fighting ? victim->fighting->name : "(none)" );
  630.     strcat( buf1, buf );
  631.     if ( !IS_NPC(victim) )
  632.     {
  633. sprintf( buf,
  634.     "Thirst: %d.  Full: %d.  Drunk: %d.  Saving throw: %d.nr",
  635.     victim->pcdata->condition[COND_THIRST],
  636.     victim->pcdata->condition[COND_FULL],
  637.     victim->pcdata->condition[COND_DRUNK],
  638.     victim->saving_throw );
  639. strcat( buf1, buf );
  640.     }
  641.     sprintf( buf, "Carry number: %d.  Carry weight: %d.nr",
  642. victim->carry_number, victim->carry_weight );
  643.     strcat( buf1, buf );
  644.     sprintf( buf, "Age: %d.  Played: %d.  Timer: %d.  Act: %s.nr",
  645.    get_age( victim ), (int) victim->played, victim->timer,
  646.    act_bit_name(victim->act) );
  647.     strcat( buf1, buf );
  648.     sprintf( buf, "Master: %s.  Leader: %s.  Affected by: %s.nr",
  649. victim->master      ? victim->master->name   : "(none)",
  650. victim->leader      ? victim->leader->name   : "(none)",
  651. affect_bit_name( victim->affected_by ) );
  652.     strcat( buf1, buf );
  653.     sprintf( buf, "Short description: %s.nrLong  description: %s",
  654. victim->short_descr,
  655. victim->long_descr[0] != '' ? victim->long_descr : "(none).nr" );
  656.     strcat( buf1, buf );
  657.     if ( IS_NPC(victim) && victim->spec_fun != 0 )
  658. strcat( buf1, "Mobile has spec fun.nr" );
  659.     for ( paf = victim->affected; paf != NULL; paf = paf->next )
  660.     {
  661. sprintf( buf,
  662.     "Spell: '%s' modifies %s by %d for %d hours with bits %s.nr",
  663.     skill_table[(int) paf->type].name,
  664.     affect_loc_name( paf->location ),
  665.     paf->modifier,
  666.     paf->duration,
  667.     affect_bit_name( paf->bitvector )
  668.     );
  669. strcat( buf1, buf );
  670.     }
  671.     send_to_char( buf1, ch );
  672.     return;
  673. }
  674. void do_mfind( CHAR_DATA *ch, char *argument )
  675. {
  676.     extern int top_mob_index;
  677.     char buf[2*MAX_STRING_LENGTH];
  678.     char buf1[2*MAX_STRING_LENGTH];
  679.     char arg[MAX_INPUT_LENGTH];
  680.     MOB_INDEX_DATA *pMobIndex;
  681.     int vnum;
  682.     int nMatch;
  683.     bool fAll;
  684.     bool found;
  685.     one_argument( argument, arg );
  686.     if ( arg[0] == '' )
  687.     {
  688. send_to_char( "Mfind whom?nr", ch );
  689. return;
  690.     }
  691.     buf1[0] = '';
  692.     fAll = !str_cmp( arg, "all" );
  693.     found = FALSE;
  694.     nMatch = 0;
  695.     /*
  696.      * Yeah, so iterating over all vnum's takes 10,000 loops.
  697.      * Get_mob_index is fast, and I don't feel like threading another link.
  698.      * Do you?
  699.      * -- Furey
  700.      */
  701.     for ( vnum = 0; nMatch < top_mob_index; vnum++ )
  702.     {
  703. if ( ( pMobIndex = get_mob_index( vnum ) ) != NULL )
  704. {
  705.     nMatch++;
  706.     if ( fAll || is_name( arg, pMobIndex->player_name ) )
  707.     {
  708. found = TRUE;
  709. sprintf( buf, "[%5d] %snr",
  710.     pMobIndex->vnum, capitalize( pMobIndex->short_descr ) );
  711.                 if (!fAll)
  712.                     strcat( buf1, buf );
  713.                 else
  714.                     send_to_char( buf, ch ); 
  715.     }
  716. }
  717.     }
  718.     if ( !found )
  719.     {
  720. send_to_char( "Nothing like that in hell, earth, or heaven.nr", ch );
  721. return;
  722.     }
  723.     if(!fAll)
  724.        send_to_char( buf1, ch );
  725.     return;
  726. }
  727. void do_ofind( CHAR_DATA *ch, char *argument )
  728. {
  729.     extern int top_obj_index;
  730.     char buf[2*MAX_STRING_LENGTH];
  731.     char buf1[2*MAX_STRING_LENGTH];
  732.     char arg[MAX_INPUT_LENGTH];
  733.     OBJ_INDEX_DATA *pObjIndex;
  734.     int vnum;
  735.     int nMatch;
  736.     bool fAll;
  737.     bool found;
  738.     one_argument( argument, arg );
  739.     if ( arg[0] == '' )
  740.     {
  741. send_to_char( "Ofind what?nr", ch );
  742. return;
  743.     }
  744.     buf1[0] = '';
  745.     fAll = !str_cmp( arg, "all" );
  746.     found = FALSE;
  747.     nMatch = 0;
  748.     /*
  749.      * Yeah, so iterating over all vnum's takes 10,000 loops.
  750.      * Get_obj_index is fast, and I don't feel like threading another link.
  751.      * Do you?
  752.      * -- Furey
  753.      */
  754.     for ( vnum = 0; nMatch < top_obj_index; vnum++ )
  755.     {
  756. if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL )
  757. {
  758.     nMatch++;
  759.     if ( fAll || is_name( arg, pObjIndex->name ) )
  760.     {
  761. found = TRUE;
  762. sprintf( buf, "[%5d] %snr",
  763.     pObjIndex->vnum, capitalize( pObjIndex->short_descr ) );
  764.                     if (!fAll)
  765.                         strcat( buf1, buf );
  766.                     else
  767.                         send_to_char( buf, ch ); 
  768. // strcat( buf1, buf );
  769.     }
  770. }
  771.     }
  772.     if ( !found )
  773.     {
  774. send_to_char( "Nothing like that in hell, earth, or heaven.nr", ch );
  775. return;
  776.     }
  777.     if(!fAll)
  778.        send_to_char( buf1, ch );
  779.     return;
  780. }
  781. void do_mwhere( CHAR_DATA *ch, char *argument )
  782. {
  783.     char buf[MAX_STRING_LENGTH];
  784.     char arg[MAX_INPUT_LENGTH];
  785.     CHAR_DATA *victim;
  786.     bool found;
  787.     one_argument( argument, arg );
  788.     if ( arg[0] == '' )
  789.     {
  790. send_to_char( "Mwhere whom?nr", ch );
  791. return;
  792.     }
  793.     found = FALSE;
  794.     for ( victim = char_list; victim != NULL; victim = victim->next )
  795.     {
  796. if ( IS_NPC(victim)
  797. &&   victim->in_room != NULL
  798. &&   is_name( arg, victim->name ) )
  799. {
  800.     found = TRUE;
  801.     sprintf( buf, "[%5d] %-28s [%5d] %snr",
  802. victim->pIndexData->vnum,
  803. victim->short_descr,
  804. victim->in_room->vnum,
  805. victim->in_room->name );
  806.     send_to_char(buf, ch);
  807. }
  808.     }
  809.     if ( !found )
  810.     {
  811. act( "You didn't find any $T.", ch, NULL, arg, TO_CHAR );
  812. return;
  813.     }
  814.     return;
  815. }
  816. // @@@
  817. void do_shoplist( CHAR_DATA *ch, char *argument )
  818. {
  819.     SHOP_DATA *pShop;
  820.     char buf[32768];
  821.     char buf1[MAX_STRING_LENGTH];
  822.     buf[0] = '';
  823.     for (pShop = shop_first; pShop; pShop = pShop->next)
  824.        {
  825.        sprintf(buf1, "%-20s opens at %2d closes at %2d buy %4d%% sell %4d%%nr",
  826.           get_mob_index( pShop->keeper )->short_descr, pShop->open_hour,
  827.           pShop->close_hour, pShop->profit_buy, pShop->profit_sell);
  828.        strcat( buf, buf1 );
  829.        }
  830.     send_to_char(buf, ch);
  831. }
  832. // @@@
  833. void do_orphans( CHAR_DATA *ch, char *argument )
  834. {
  835.     char buf[MAX_INPUT_LENGTH];
  836.     char buf1[32768]; // @@@ This is the limit to the response length...
  837.     OBJ_DATA *obj;
  838.     OBJ_DATA *in_obj;
  839.     bool found;
  840.     buf1[0] = ''; // @@@
  841.     found = FALSE;
  842.     for ( obj = object_list; obj != NULL; obj = obj->next )
  843.     {
  844. for ( in_obj = obj; in_obj->in_obj != NULL; in_obj = in_obj->in_obj )
  845.     ;
  846. if ( in_obj->carried_by == NULL  && in_obj->in_room == NULL)
  847. {
  848.             found = TRUE;
  849.     sprintf( buf, "%snr", obj->short_descr );
  850.             buf[0] = UPPER(buf[0]);
  851.             if (strlen(buf1) + strlen(buf) >= sizeof buf1 - 2) // @@@
  852.                break;
  853.             strcat(buf1, buf); // @@@
  854. }
  855.     }
  856.     if ( !found )
  857. send_to_char( "Nothing like that in hell, earth, or heaven.nr", ch );
  858.     else // @@@
  859.         send_to_char( buf1, ch ); // @@@
  860.     return;
  861. }
  862. void do_reboo( CHAR_DATA *ch, char *argument )
  863. {
  864.     send_to_char( "If you want to REBOOT, spell it out.nr", ch );
  865.     return;
  866. }
  867. void do_reboot( CHAR_DATA *ch, char *argument )
  868. {
  869.     char buf[MAX_STRING_LENGTH];
  870.     extern bool merc_down;
  871.     sprintf( buf, "Reboot by %s.", ch->name );
  872.     do_echo( ch, buf );
  873.     merc_down = TRUE;
  874.     return;
  875. }
  876. void do_shutdow( CHAR_DATA *ch, char *argument )
  877. {
  878.     send_to_char( "If you want to SHUTDOWN, spell it out.nr", ch );
  879.     return;
  880. }
  881. void do_shutdown( CHAR_DATA *ch, char *argument )
  882. {
  883.     char buf[MAX_STRING_LENGTH];
  884.     extern bool merc_down;
  885.     sprintf( buf, "Shutdown by %s.", ch->name );
  886.     append_file( ch, SHUTDOWN_FILE, buf );
  887.     strcat( buf, "nr" );
  888.     do_echo( ch, buf );
  889.     merc_down = TRUE;
  890.     return;
  891. }
  892. void do_snoop( CHAR_DATA *ch, char *argument )
  893. {
  894.     char arg[MAX_INPUT_LENGTH];
  895.     DESCRIPTOR_DATA *d;
  896.     CHAR_DATA *victim;
  897.     one_argument( argument, arg );
  898.     if ( arg[0] == '' )
  899.     {
  900. send_to_char( "Snoop whom?nr", ch );
  901. return;
  902.     }
  903.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  904.     {
  905. send_to_char( "They aren't here.nr", ch );
  906. return;
  907.     }
  908.     if ( victim->desc == NULL )
  909.     {
  910. send_to_char( "No descriptor to snoop.nr", ch );
  911. return;
  912.     }
  913.     if ( victim == ch )
  914.     {
  915. send_to_char( "Cancelling all snoops.nr", ch );
  916. for ( d = descriptor_list; d != NULL; d = d->next )
  917. {
  918.     if ( d->snoop_by == ch->desc )
  919. d->snoop_by = NULL;
  920. }
  921. return;
  922.     }
  923.     if ( victim->desc->snoop_by != NULL )
  924.     {
  925. send_to_char( "Busy already.nr", ch );
  926. return;
  927.     }
  928.     if ( get_trust( victim ) >= get_trust( ch ) )
  929.     {
  930. send_to_char( "You failed.nr", ch );
  931. return;
  932.     }
  933.     if ( ch->desc != NULL )
  934.     {
  935. for ( d = ch->desc->snoop_by; d != NULL; d = d->snoop_by )
  936. {
  937.     if ( d->character == victim || d->original == victim )
  938.     {
  939. send_to_char( "No snoop loops.nr", ch );
  940. return;
  941.     }
  942. }
  943.     }
  944.     victim->desc->snoop_by = ch->desc;
  945.     send_to_char( "Ok.nr", ch );
  946.     return;
  947. }
  948. void do_switch( CHAR_DATA *ch, char *argument )
  949. {
  950.     char arg[MAX_INPUT_LENGTH];
  951.     CHAR_DATA *victim;
  952.     one_argument( argument, arg );
  953.     
  954.     if ( arg[0] == '' )
  955.     {
  956. send_to_char( "Switch into whom?nr", ch );
  957. return;
  958.     }
  959.     if ( ch->desc == NULL )
  960. return;
  961.     
  962.     if ( ch->desc->original != NULL )
  963.     {
  964. send_to_char( "You are already switched.nr", ch );
  965. return;
  966.     }
  967.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  968.     {
  969. send_to_char( "They aren't here.nr", ch );
  970. return;
  971.     }
  972.     if ( victim == ch )
  973.     {
  974. send_to_char( "Ok.nr", ch );
  975. return;
  976.     }
  977.     /*
  978.      * Pointed out by Da Pub (What Mud)
  979.      */
  980.     if ( !IS_NPC( victim ) )
  981.     {
  982.         send_to_char( "You cannot switch into a player!nr", ch );
  983. return;
  984.     }
  985.     if ( victim->desc != NULL )
  986.     {
  987. send_to_char( "Character in use.nr", ch );
  988. return;
  989.     }
  990.     ch->desc->character = victim;
  991.     ch->desc->original  = ch;
  992.     victim->desc        = ch->desc;
  993.     ch->desc            = NULL;
  994.     send_to_char( "Ok.nr", victim );
  995.     return;
  996. }
  997. void do_return( CHAR_DATA *ch, char *argument )
  998. {
  999.     if ( ch->desc == NULL )
  1000. return;
  1001.     if ( ch->desc->original == NULL )
  1002.     {
  1003. send_to_char( "You aren't switched.nr", ch );
  1004. return;
  1005.     }
  1006.     send_to_char( "You return to your original body.nr", ch );
  1007.     ch->desc->character       = ch->desc->original;
  1008.     ch->desc->original        = NULL;
  1009.     ch->desc->character->desc = ch->desc; 
  1010.     ch->desc                  = NULL;
  1011.     return;
  1012. }
  1013. void do_mload( CHAR_DATA *ch, char *argument )
  1014. {
  1015.     char arg[MAX_INPUT_LENGTH];
  1016.     MOB_INDEX_DATA *pMobIndex;
  1017.     CHAR_DATA *victim;
  1018.     
  1019.     one_argument( argument, arg );
  1020.     if ( arg[0] == '' || !is_number(arg) )
  1021.     {
  1022. send_to_char( "Syntax: mload <vnum>.nr", ch );
  1023. return;
  1024.     }
  1025.     if ( ( pMobIndex = get_mob_index( atoi( arg ) ) ) == NULL )
  1026.     {
  1027. send_to_char( "No mob has that vnum.nr", ch );
  1028. return;
  1029.     }
  1030.     victim = create_mobile( pMobIndex );
  1031.     char_to_room( victim, ch->in_room );
  1032.     act( "$n has created $N!", ch, NULL, victim, TO_ROOM );
  1033.     send_to_char( "Ok.nr", ch );
  1034.     return;
  1035. }
  1036. void do_oload( CHAR_DATA *ch, char *argument )
  1037. {
  1038.     char arg1[MAX_INPUT_LENGTH];
  1039.     char arg2[MAX_INPUT_LENGTH];
  1040.     OBJ_INDEX_DATA *pObjIndex;
  1041.     OBJ_DATA *obj;
  1042.     int level;
  1043.  
  1044.     argument = one_argument( argument, arg1 );
  1045.     argument = one_argument( argument, arg2 );
  1046.  
  1047.     if ( arg1[0] == '' || !is_number( arg1 ) )
  1048.     {
  1049.         send_to_char( "Syntax: oload <vnum> <level>.nr", ch );
  1050.         return;
  1051.     }
  1052.  
  1053.     if ( arg2[0] == '' )
  1054.     {
  1055. level = get_trust( ch );
  1056.     }
  1057.     else
  1058.     {
  1059. /*
  1060.  * New feature from Alander.
  1061.  */
  1062.         if ( !is_number( arg2 ) )
  1063.         {
  1064.     send_to_char( "Syntax: oload <vnum> <level>.nr", ch );
  1065.     return;
  1066.         }
  1067.         level = atoi( arg2 );
  1068. if ( level < 0 || level > get_trust( ch ) )
  1069.         {
  1070.     send_to_char( "Limited to your trust level.nr", ch );
  1071.     return;
  1072.         }
  1073.     }
  1074.     if ( ( pObjIndex = get_obj_index( atoi( arg1 ) ) ) == NULL )
  1075.     {
  1076. send_to_char( "No object has that vnum.nr", ch );
  1077. return;
  1078.     }
  1079.     obj = create_object( pObjIndex, level );
  1080.     if ( CAN_WEAR(obj, ITEM_TAKE) )
  1081.     {
  1082. obj_to_char( obj, ch );
  1083.     }
  1084.     else
  1085.     {
  1086. obj_to_room( obj, ch->in_room );
  1087. act( "$n has created $p!", ch, obj, NULL, TO_ROOM );
  1088.     }
  1089.     send_to_char( "Ok.nr", ch );
  1090.     return;
  1091. }
  1092. void do_purge( CHAR_DATA *ch, char *argument )
  1093. {
  1094.     char arg[MAX_INPUT_LENGTH];
  1095.     CHAR_DATA *victim;
  1096.     OBJ_DATA *obj;
  1097.     one_argument( argument, arg );
  1098.     if ( arg[0] == '' )
  1099.     {
  1100. /* 'purge' */
  1101. CHAR_DATA *vnext;
  1102. OBJ_DATA  *obj_next;
  1103. for ( victim = ch->in_room->people; victim != NULL; victim = vnext )
  1104. {
  1105.     vnext = victim->next_in_room;
  1106.     if ( IS_NPC(victim) && victim != ch )
  1107. extract_char( victim, TRUE );
  1108. }
  1109. for ( obj = ch->in_room->contents; obj != NULL; obj = obj_next )
  1110. {
  1111.     obj_next = obj->next_content;
  1112.     extract_obj( obj );
  1113. }
  1114. act( "$n purges the room!", ch, NULL, NULL, TO_ROOM);
  1115. send_to_char( "Ok.nr", ch );
  1116. return;
  1117.     }
  1118.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  1119.     {
  1120. send_to_char( "They aren't here.nr", ch );
  1121. return;
  1122.     }
  1123.     if ( !IS_NPC(victim) )
  1124.     {
  1125. send_to_char( "Not on PC's.nr", ch );
  1126. return;
  1127.     }
  1128.     act( "$n purges $N.", ch, NULL, victim, TO_NOTVICT );
  1129.     extract_char( victim, TRUE );
  1130.     return;
  1131. }
  1132. void do_advance( CHAR_DATA *ch, char *argument )
  1133. {
  1134.     char arg1[MAX_INPUT_LENGTH];
  1135.     char arg2[MAX_INPUT_LENGTH];
  1136.     CHAR_DATA *victim;
  1137.     int level;
  1138.     int iLevel;
  1139.     argument = one_argument( argument, arg1 );
  1140.     argument = one_argument( argument, arg2 );
  1141.     if ( arg1[0] == '' || arg2[0] == '' || !is_number( arg2 ) )
  1142.     {
  1143. send_to_char( "Syntax: advance <char> <level>.nr", ch );
  1144. return;
  1145.     }
  1146.     if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
  1147.     {
  1148. send_to_char( "That player is not here.nr", ch);
  1149. return;
  1150.     }
  1151.     if ( IS_NPC(victim) )
  1152.     {
  1153. send_to_char( "Not on NPC's.nr", ch );
  1154. return;
  1155.     }
  1156.     if ( ( level = atoi( arg2 ) ) < 1 || level > 40 )
  1157.     {
  1158. send_to_char( "Level must be 1 to 40.nr", ch );
  1159. return;
  1160.     }
  1161.     if ( level > get_trust( ch ) )
  1162.     {
  1163. send_to_char( "Limited to your trust level.nr", ch );
  1164. return;
  1165.     }
  1166.     /*
  1167.      * Lower level:
  1168.      *   Reset to level 1.
  1169.      *   Then raise again.
  1170.      *   Currently, an imp can lower another imp.
  1171.      *   -- Swiftest
  1172.      */
  1173.     if ( level <= victim->level )
  1174.     {
  1175. int sn;
  1176. send_to_char( "Lowering a player's level!nr", ch );
  1177. send_to_char( "**** OOOOHHHHHHHHHH  NNNNOOOO ****nr", victim );
  1178. victim->level    = 1;
  1179. victim->exp      = 1000;
  1180. victim->max_hit  = 10;
  1181. victim->max_mana = 100;
  1182. victim->max_move = 100;
  1183. for ( sn = 0; sn < MAX_SKILL; sn++ )
  1184.     victim->pcdata->learned[sn] = 0;
  1185. victim->practice = 0;
  1186. victim->hit      = victim->max_hit;
  1187. victim->mana     = victim->max_mana;
  1188. victim->move     = victim->max_move;
  1189. advance_level( victim );
  1190.     }
  1191.     else
  1192.     {
  1193. send_to_char( "Raising a player's level!nr", ch );
  1194. send_to_char( "**** OOOOHHHHHHHHHH  YYYYEEEESSS ****nr", victim );
  1195.     }
  1196.     for ( iLevel = victim->level ; iLevel < level; iLevel++ )
  1197.     {
  1198. send_to_char( "You raise a level!!  ", victim );
  1199. victim->level += 1;
  1200. advance_level( victim );
  1201.     }
  1202.     victim->exp   = 1000 * UMAX( 1, victim->level );
  1203.     victim->trust = 0;
  1204.     return;
  1205. }
  1206. void do_trust( CHAR_DATA *ch, char *argument )
  1207. {
  1208.     char arg1[MAX_INPUT_LENGTH];
  1209.     char arg2[MAX_INPUT_LENGTH];
  1210.     CHAR_DATA *victim;
  1211.     int level;
  1212.     argument = one_argument( argument, arg1 );
  1213.     argument = one_argument( argument, arg2 );
  1214.     if ( arg1[0] == '' || arg2[0] == '' || !is_number( arg2 ) )
  1215.     {
  1216. send_to_char( "Syntax: trust <char> <level>.nr", ch );
  1217. return;
  1218.     }
  1219.     if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
  1220.     {
  1221. send_to_char( "That player is not here.nr", ch);
  1222. return;
  1223.     }
  1224.     if ( ( level = atoi( arg2 ) ) < 0 || level > 40 )
  1225.     {
  1226. send_to_char( "Level must be 0 (reset) or 1 to 40.nr", ch );
  1227. return;
  1228.     }
  1229.     if ( level > get_trust( ch ) )
  1230.     {
  1231. send_to_char( "Limited to your trust.nr", ch );
  1232. return;
  1233.     }
  1234.     victim->trust = level;
  1235.     return;
  1236. }
  1237. void do_restore( CHAR_DATA *ch, char *argument )
  1238. {
  1239.     char arg[MAX_INPUT_LENGTH];
  1240.     CHAR_DATA *victim;
  1241.     one_argument( argument, arg );
  1242.     if ( arg[0] == '' )
  1243.     {
  1244. send_to_char( "Restore whom?nr", ch );
  1245. return;
  1246.     }
  1247.     if ( !str_cmp( arg, "all" ) )
  1248.       {
  1249.     
  1250.         for ( victim = char_list; victim != NULL; victim = victim->next )
  1251.          
  1252.           {
  1253.             if ( !IS_NPC(victim) )
  1254.               {
  1255.                victim->hit  = victim->max_hit;
  1256.                victim->mana = victim->max_mana;
  1257.                victim->move = victim->max_move;
  1258.                update_pos( victim );
  1259.                act( "$n has restored you.", ch, NULL, victim, TO_VICT );
  1260.              }      
  1261.           }
  1262.        send_to_char( "Ok.nr", ch );
  1263.        return;     
  1264.       }
  1265.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  1266.     {
  1267. send_to_char( "They aren't here.nr", ch );
  1268. return;
  1269.     }
  1270.     victim->hit  = victim->max_hit;
  1271.     victim->mana = victim->max_mana;
  1272.     victim->move = victim->max_move;
  1273.     update_pos( victim );
  1274.     act( "$n has restored you.", ch, NULL, victim, TO_VICT );
  1275.     send_to_char( "Ok.nr", ch );
  1276.     return;
  1277. }
  1278. void do_freeze( CHAR_DATA *ch, char *argument )
  1279. {
  1280.     char arg[MAX_INPUT_LENGTH];
  1281.     CHAR_DATA *victim;
  1282.     one_argument( argument, arg );
  1283.     if ( arg[0] == '' )
  1284.     {
  1285. send_to_char( "Freeze whom?nr", ch );
  1286. return;
  1287.     }
  1288.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  1289.     {
  1290. send_to_char( "They aren't here.nr", ch );
  1291. return;
  1292.     }
  1293.     if ( IS_NPC(victim) )
  1294.     {
  1295. send_to_char( "Not on NPC's.nr", ch );
  1296. return;
  1297.     }
  1298.     if ( get_trust( victim ) >= get_trust( ch ) )
  1299.     {
  1300. send_to_char( "You failed.nr", ch );
  1301. return;
  1302.     }
  1303.     if ( IS_SET(victim->act, PLR_FREEZE) )
  1304.     {
  1305. REMOVE_BIT(victim->act, PLR_FREEZE);
  1306. send_to_char( "You can play again.nr", victim );
  1307. send_to_char( "FREEZE removed.nr", ch );
  1308.     }
  1309.     else
  1310.     {
  1311. SET_BIT(victim->act, PLR_FREEZE);
  1312. send_to_char( "You can't do ANYthing!nr", victim );
  1313. send_to_char( "FREEZE set.nr", ch );
  1314.     }
  1315.     save_char_obj( victim );
  1316.     return;
  1317. }
  1318. void do_log( CHAR_DATA *ch, char *argument )
  1319. {
  1320.     char arg[MAX_INPUT_LENGTH];
  1321.     CHAR_DATA *victim;
  1322.     one_argument( argument, arg );
  1323.     if ( arg[0] == '' )
  1324.     {
  1325. send_to_char( "Log whom?nr", ch );
  1326. return;
  1327.     }
  1328.     if ( !str_cmp( arg, "all" ) )
  1329.     {
  1330. if ( fLogAll )
  1331. {
  1332.     fLogAll = FALSE;
  1333.     send_to_char( "Log ALL off.nr", ch );
  1334. }
  1335. else
  1336. {
  1337.     fLogAll = TRUE;
  1338.     send_to_char( "Log ALL on.nr", ch );
  1339. }
  1340. return;
  1341.     }
  1342.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  1343.     {
  1344. send_to_char( "They aren't here.nr", ch );
  1345. return;
  1346.     }
  1347.     if ( IS_NPC(victim) )
  1348.     {
  1349. send_to_char( "Not on NPC's.nr", ch );
  1350. return;
  1351.     }
  1352.     /*
  1353.      * No level check, gods can log anyone.
  1354.      */
  1355.     if ( IS_SET(victim->act, PLR_LOG) )
  1356.     {
  1357. REMOVE_BIT(victim->act, PLR_LOG);
  1358. send_to_char( "LOG removed.nr", ch );
  1359.     }
  1360.     else
  1361.     {
  1362. SET_BIT(victim->act, PLR_LOG);
  1363. send_to_char( "LOG set.nr", ch );
  1364.     }
  1365.     return;
  1366. }
  1367. void do_noemote( CHAR_DATA *ch, char *argument )
  1368. {
  1369.     char arg[MAX_INPUT_LENGTH];
  1370.     CHAR_DATA *victim;
  1371.     one_argument( argument, arg );
  1372.     if ( arg[0] == '' )
  1373.     {
  1374. send_to_char( "Noemote whom?nr", ch );
  1375. return;
  1376.     }
  1377.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  1378.     {
  1379. send_to_char( "They aren't here.nr", ch );
  1380. return;
  1381.     }
  1382.     if ( IS_NPC(victim) )
  1383.     {
  1384. send_to_char( "Not on NPC's.nr", ch );
  1385. return;
  1386.     }
  1387.     if ( get_trust( victim ) >= get_trust( ch ) )
  1388.     {
  1389. send_to_char( "You failed.nr", ch );
  1390. return;
  1391.     }
  1392.     if ( IS_SET(victim->act, PLR_NO_EMOTE) )
  1393.     {
  1394. REMOVE_BIT(victim->act, PLR_NO_EMOTE);
  1395. send_to_char( "You can emote again.nr", victim );
  1396. send_to_char( "NO_EMOTE removed.nr", ch );
  1397.     }
  1398.     else
  1399.     {
  1400. SET_BIT(victim->act, PLR_NO_EMOTE);
  1401. send_to_char( "You can't emote!nr", victim );
  1402. send_to_char( "NO_EMOTE set.nr", ch );
  1403.     }
  1404.     return;
  1405. }
  1406. void do_notell( CHAR_DATA *ch, char *argument )
  1407. {
  1408.     char arg[MAX_INPUT_LENGTH];
  1409.     CHAR_DATA *victim;
  1410.     one_argument( argument, arg );
  1411.     if ( arg[0] == '' )
  1412.     {
  1413. send_to_char( "Notell whom?", ch );
  1414. return;
  1415.     }
  1416.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  1417.     {
  1418. send_to_char( "They aren't here.nr", ch );
  1419. return;
  1420.     }
  1421.     if ( IS_NPC(victim) )
  1422.     {
  1423. send_to_char( "Not on NPC's.nr", ch );
  1424. return;
  1425.     }
  1426.     if ( get_trust( victim ) >= get_trust( ch ) )
  1427.     {
  1428. send_to_char( "You failed.nr", ch );
  1429. return;
  1430.     }
  1431.     if ( IS_SET(victim->act, PLR_NO_TELL) )
  1432.     {
  1433. REMOVE_BIT(victim->act, PLR_NO_TELL);
  1434. send_to_char( "You can tell again.nr", victim );
  1435. send_to_char( "NO_TELL removed.nr", ch );
  1436.     }
  1437.     else
  1438.     {
  1439. SET_BIT(victim->act, PLR_NO_TELL);
  1440. send_to_char( "You can't tell!nr", victim );
  1441. send_to_char( "NO_TELL set.nr", ch );
  1442.     }
  1443.     return;
  1444. }
  1445. void do_silence( CHAR_DATA *ch, char *argument )
  1446. {
  1447.     char arg[MAX_INPUT_LENGTH];
  1448.     CHAR_DATA *victim;
  1449.     one_argument( argument, arg );
  1450.     if ( arg[0] == '' )
  1451.     {
  1452. send_to_char( "Silence whom?", ch );
  1453. return;
  1454.     }
  1455.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  1456.     {
  1457. send_to_char( "They aren't here.nr", ch );
  1458. return;
  1459.     }
  1460.     if ( IS_NPC(victim) )
  1461.     {
  1462. send_to_char( "Not on NPC's.nr", ch );
  1463. return;
  1464.     }
  1465.     if ( get_trust( victim ) >= get_trust( ch ) )
  1466.     {
  1467. send_to_char( "You failed.nr", ch );
  1468. return;
  1469.     }
  1470.     if ( IS_SET(victim->act, PLR_SILENCE) )
  1471.     {
  1472. REMOVE_BIT(victim->act, PLR_SILENCE);
  1473. send_to_char( "You can use channels again.nr", victim );
  1474. send_to_char( "SILENCE removed.nr", ch );
  1475.     }
  1476.     else
  1477.     {
  1478. SET_BIT(victim->act, PLR_SILENCE);
  1479. send_to_char( "You can't use channels!nr", victim );
  1480. send_to_char( "SILENCE set.nr", ch );
  1481.     }
  1482.     return;
  1483. }
  1484. void do_peace( CHAR_DATA *ch, char *argument )
  1485. {
  1486.     CHAR_DATA *rch;
  1487.     for ( rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room )
  1488.     {
  1489. if ( rch->fighting != NULL )
  1490.     stop_fighting( rch, TRUE );
  1491.     }
  1492.     send_to_char( "Ok.nr", ch );
  1493.     return;
  1494. }
  1495. BAN_DATA * ban_free;
  1496. BAN_DATA * ban_list;
  1497. void do_ban( CHAR_DATA *ch, char *argument )
  1498. {
  1499. #if 0
  1500.     char buf[MAX_STRING_LENGTH];
  1501.     char arg[MAX_INPUT_LENGTH];
  1502.     BAN_DATA *pban;
  1503.     if ( IS_NPC(ch) )
  1504. return;
  1505.     one_argument( argument, arg );
  1506.     if ( arg[0] == '' )
  1507.     {
  1508. strcpy( buf, "Banned sites:nr" );
  1509. for ( pban = ban_list; pban != NULL; pban = pban->next )
  1510. {
  1511.     strcat( buf, pban->name );
  1512.     strcat( buf, "nr" );
  1513. }
  1514. send_to_char( buf, ch );
  1515. return;
  1516.     }
  1517.     for ( pban = ban_list; pban != NULL; pban = pban->next )
  1518.     {
  1519. if ( !str_cmp( arg, pban->name ) )
  1520. {
  1521.     send_to_char( "That site is already banned!nr", ch );
  1522.     return;
  1523. }
  1524.     }
  1525.     if ( ban_free == NULL )
  1526.     {
  1527. pban = alloc_perm( sizeof(*pban) );
  1528.     }
  1529.     else
  1530.     {
  1531. pban = ban_free;
  1532. ban_free = ban_free->next;
  1533.     }
  1534.     pban->name = str_dup( arg );
  1535.     pban->next = ban_list;
  1536.     ban_list = pban;
  1537.     send_to_char( "Ok.nr", ch );
  1538.     return;
  1539. #else
  1540.    send_to_char( "Site banning has been disabled, as site checking at connect"
  1541.       " can lag the server.nr", ch);
  1542. #endif
  1543. }
  1544. void do_allow( CHAR_DATA *ch, char *argument )
  1545. {
  1546.     char arg[MAX_INPUT_LENGTH];
  1547.     BAN_DATA *prev;
  1548.     BAN_DATA *curr;
  1549.     one_argument( argument, arg );
  1550.     if ( arg[0] == '' )
  1551.     {
  1552. send_to_char( "Remove which site from the ban list?nr", ch );
  1553. return;
  1554.     }
  1555.     prev = NULL;
  1556.     for ( curr = ban_list; curr != NULL; prev = curr, curr = curr->next )
  1557.     {
  1558. if ( !str_cmp( arg, curr->name ) )
  1559. {
  1560.     if ( prev == NULL )
  1561. ban_list   = ban_list->next;
  1562.     else
  1563. prev->next = curr->next;
  1564.     free_string( curr->name );
  1565.     curr->next = ban_free;
  1566.     ban_free = curr;
  1567.     send_to_char( "Ok.nr", ch );
  1568.     return;
  1569. }
  1570.     }
  1571.     send_to_char( "Site is not banned.nr", ch );
  1572.     return;
  1573. }
  1574. void do_wizlock( CHAR_DATA *ch, char *argument )
  1575. {
  1576.     extern bool wizlock;
  1577.     wizlock = !wizlock;
  1578.     if ( wizlock )
  1579. send_to_char( "Game wizlocked.nr", ch );
  1580.     else
  1581. send_to_char( "Game un-wizlocked.nr", ch );
  1582.     return;
  1583. }
  1584. void do_slookup( CHAR_DATA *ch, char *argument )
  1585. {
  1586.     char buf[5*MAX_STRING_LENGTH];
  1587.     char buf1[5*MAX_STRING_LENGTH];
  1588.     char arg[MAX_INPUT_LENGTH];
  1589.     int sn;
  1590.     one_argument( argument, arg );
  1591.     if ( arg[0] == '' )
  1592.     {
  1593. send_to_char( "Slookup what?nr", ch );
  1594. return;
  1595.     }
  1596.     if ( !str_cmp( arg, "all" ) )
  1597.     {
  1598.         buf1[0] = '';
  1599. for ( sn = 0; sn < MAX_SKILL; sn++ )
  1600. {
  1601.     if ( skill_table[sn].name == NULL )
  1602. break;
  1603.     sprintf( buf, "Sn: %4d Slot: %4d Skill/spell: '%s'nr",
  1604. sn, skill_table[sn].slot, skill_table[sn].name );
  1605.     strcat( buf1, buf );
  1606. }
  1607. send_to_char( buf1, ch );
  1608.     }
  1609.     else
  1610.     {
  1611. if ( ( sn = skill_lookup( arg ) ) < 0 )
  1612. {
  1613.     send_to_char( "No such skill or spell.nr", ch );
  1614.     return;
  1615. }
  1616. sprintf( buf, "Sn: %4d Slot: %4d Skill/spell: '%s'nr",
  1617.     sn, skill_table[sn].slot, skill_table[sn].name );
  1618. send_to_char( buf, ch );
  1619.     }
  1620.     return;
  1621. }
  1622. void do_sset( CHAR_DATA *ch, char *argument )
  1623. {
  1624.     char arg1 [MAX_INPUT_LENGTH];
  1625.     char arg2 [MAX_INPUT_LENGTH];
  1626.     char arg3 [MAX_INPUT_LENGTH];
  1627.     CHAR_DATA *victim;
  1628.     int value;
  1629.     int sn;
  1630.     bool fAll;
  1631.     argument = one_argument( argument, arg1 );
  1632.     argument = one_argument( argument, arg2 );
  1633.     argument = one_argument( argument, arg3 );
  1634.     if ( arg1[0] == '' || arg2[0] == '' || arg3[0] == '' )
  1635.     {
  1636. send_to_char( "Syntax: sset <victim> <skill> <value>nr", ch );
  1637. send_to_char( "or:     sset <victim> all     <value>nr", ch );
  1638. send_to_char( "Skill being any skill or spell.nr", ch );
  1639. return;
  1640.     }
  1641.     if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
  1642.     {
  1643. send_to_char( "They aren't here.nr", ch );
  1644. return;
  1645.     }
  1646.     if ( IS_NPC(victim) )
  1647.     {
  1648. send_to_char( "Not on NPC's.nr", ch );
  1649. return;
  1650.     }
  1651.     fAll = !str_cmp( arg2, "all" );
  1652.     sn   = 0;
  1653.     if ( !fAll && ( sn = skill_lookup( arg2 ) ) < 0 )
  1654.     {
  1655. send_to_char( "No such skill or spell.nr", ch );
  1656. return;
  1657.     }
  1658.     /*
  1659.      * Snarf the value.
  1660.      */
  1661.     if ( !is_number( arg3 ) )
  1662.     {
  1663. send_to_char( "Value must be numeric.nr", ch );
  1664. return;
  1665.     }
  1666.     value = atoi( arg3 );
  1667.     if ( value < 0 || value > 100 )
  1668.     {
  1669. send_to_char( "Value range is 0 to 100.nr", ch );
  1670. return;
  1671.     }
  1672.     if ( fAll )
  1673.     {
  1674. for ( sn = 0; sn < MAX_SKILL; sn++ )
  1675. {
  1676.     if ( skill_table[sn].name != NULL )
  1677. victim->pcdata->learned[sn] = value;
  1678. }
  1679.     }
  1680.     else
  1681.     {
  1682. victim->pcdata->learned[sn] = value;
  1683.     }
  1684.     return;
  1685. }
  1686. void do_mset( CHAR_DATA *ch, char *argument )
  1687. {
  1688.     char arg1 [MAX_INPUT_LENGTH];
  1689.     char arg2 [MAX_INPUT_LENGTH];
  1690.     char arg3 [MAX_INPUT_LENGTH];
  1691.     char buf  [MAX_STRING_LENGTH];
  1692.     CHAR_DATA *victim;
  1693.     int value, max;
  1694.     smash_tilde( argument );
  1695.     argument = one_argument( argument, arg1 );
  1696.     argument = one_argument( argument, arg2 );
  1697.     strcpy( arg3, argument );
  1698.     if ( arg1[0] == '' || arg2[0] == '' || arg3[0] == '' )
  1699.     {
  1700. send_to_char( "Syntax: mset <victim> <field>  <value>nr", ch );
  1701. send_to_char( "or:     mset <victim> <string> <value>nr", ch );
  1702. send_to_char( "nr", ch );
  1703. send_to_char( "Field being one of:nr", ch );
  1704. send_to_char( "  str int wis dex con sex class levelnr", ch );
  1705. send_to_char( "  gold hp mana move practice alignnr", ch );
  1706. send_to_char( "  thirst drunk full race", ch );
  1707. send_to_char( "nr", ch );
  1708. send_to_char( "String being one of:nr", ch );
  1709. send_to_char( "  name short long description title specnr", ch );
  1710. return;
  1711.     }
  1712.     if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
  1713.     {
  1714. send_to_char( "They aren't here.nr", ch );
  1715. return;
  1716.     }
  1717.     /*
  1718.      * Snarf the value (which need not be numeric).
  1719.      */
  1720.     value = is_number( arg3 ) ? atoi( arg3 ) : -1;
  1721.     /*
  1722.      * Set something.
  1723.      */
  1724.     if ( !str_cmp( arg2, "str" ) )
  1725.     {
  1726. if ( IS_NPC(victim) )
  1727. {
  1728.     send_to_char( "Not on NPC's.nr", ch );
  1729.     return;
  1730. }
  1731. if ( class_table[ch->class].attr_prime == APPLY_STR )
  1732.     max = 25;
  1733. else
  1734.     max = 18;
  1735. if ( value < 3 || value > max )
  1736. {
  1737.     sprintf( buf, "Strength range is 3 to %d.nr", max );
  1738.     send_to_char( buf, ch );
  1739.     return;
  1740. }
  1741. victim->pcdata->perm_str = value;
  1742. return;
  1743.     }
  1744.     if ( !str_cmp( arg2, "int" ) )
  1745.     {
  1746. if ( IS_NPC(victim) )
  1747. {
  1748.     send_to_char( "Not on NPC's.nr", ch );
  1749.     return;
  1750. }
  1751. if ( class_table[ch->class].attr_prime == APPLY_INT )
  1752.     max = 25;
  1753. else
  1754.     max = 18;
  1755. if ( value < 3 || value > max )
  1756. {
  1757.     sprintf( buf, "Intelligence range is 3 to %d.nr", max );
  1758.     send_to_char( buf, ch );
  1759.     return;
  1760. }
  1761. victim->pcdata->perm_int = value;
  1762. return;
  1763.     }
  1764.     if ( !str_cmp( arg2, "wis" ) )
  1765.     {
  1766. if ( IS_NPC(victim) )
  1767. {
  1768.     send_to_char( "Not on NPC's.nr", ch );
  1769.     return;
  1770. }
  1771. if ( class_table[ch->class].attr_prime == APPLY_WIS )
  1772.     max = 25;
  1773. else
  1774.     max = 18;
  1775. if ( value < 3 || value > max )
  1776. {
  1777.     sprintf( buf, "Wisdom range is 3 to %d.nr", max );
  1778.     send_to_char( buf, ch );
  1779.     return;
  1780. }
  1781. victim->pcdata->perm_wis = value;
  1782. return;
  1783.     }
  1784.     if ( !str_cmp( arg2, "dex" ) )
  1785.     {
  1786. if ( IS_NPC(victim) )
  1787. {
  1788.     send_to_char( "Not on NPC's.nr", ch );
  1789.     return;
  1790. }
  1791. if ( class_table[ch->class].attr_prime == APPLY_DEX )
  1792.     max = 25;
  1793. else
  1794.     max = 18;
  1795. if ( value < 3 || value > max )
  1796. {
  1797.     sprintf( buf, "Dexterity range is 3 to %d.nr", max );
  1798.     send_to_char( buf, ch );
  1799.     return;
  1800. }
  1801. victim->pcdata->perm_dex = value;
  1802. return;
  1803.     }
  1804.     if ( !str_cmp( arg2, "con" ) )
  1805.     {
  1806. if ( IS_NPC(victim) )
  1807. {
  1808.     send_to_char( "Not on NPC's.nr", ch );
  1809.     return;
  1810. }
  1811. if ( class_table[ch->class].attr_prime == APPLY_CON )
  1812.     max = 25;
  1813. else
  1814.     max = 18;
  1815. if ( value < 3 || value > max )
  1816. {
  1817.     sprintf( buf, "Constitution range is 3 to %d.nr", max );
  1818.     send_to_char( buf, ch );
  1819.     return;
  1820. }
  1821. victim->pcdata->perm_con = value;
  1822. return;
  1823.     }
  1824.     if ( !str_cmp( arg2, "sex" ) )
  1825.     {
  1826. if ( value < 0 || value > 2 )
  1827. {
  1828.     send_to_char( "Sex range is 0 to 2.nr", ch );
  1829.     return;
  1830. }
  1831. victim->sex = value;
  1832. return;
  1833.     }
  1834.     if ( !str_cmp( arg2, "class" ) )
  1835.     {
  1836. if ( value < 0 || value >= MAX_CLASS )
  1837. {
  1838.     char buf[MAX_STRING_LENGTH];
  1839.     sprintf( buf, "Class range is 0 to %d.n", MAX_CLASS-1 );
  1840.     send_to_char( buf, ch );
  1841.     return;
  1842. }
  1843. victim->class = value;
  1844. return;
  1845.     }
  1846.     if ( !str_cmp( arg2, "race" ) )
  1847.     {
  1848. if ( value < 0 || value >= MAX_RACE )
  1849. {
  1850.     char buf[MAX_STRING_LENGTH];
  1851.     sprintf( buf, "Race range is 0 to %d.n", MAX_RACE-1 );
  1852.     send_to_char( buf, ch );
  1853.     return;
  1854. }
  1855. victim->race = value;
  1856. return;
  1857.     }
  1858.     if ( !str_cmp( arg2, "level" ) )
  1859.     {
  1860. if ( !IS_NPC(victim) )
  1861. {
  1862.     send_to_char( "Not on PC's.nr", ch );
  1863.     return;
  1864. }
  1865. if ( value < 0 || value > 50 )
  1866. {
  1867.     send_to_char( "Level range is 0 to 50.nr", ch );
  1868.     return;
  1869. }
  1870. victim->level = value;
  1871. return;
  1872.     }
  1873.     if ( !str_cmp( arg2, "gold" ) )
  1874.     {
  1875. victim->gold = value;
  1876. return;
  1877.     }
  1878.     if ( !str_cmp( arg2, "hp" ) )
  1879.     {
  1880. if ( value < -10 || value > 30000 )
  1881. {
  1882.     send_to_char( "Hp range is -10 to 30,000 hit points.nr", ch );
  1883.     return;
  1884. }
  1885. victim->max_hit = value;
  1886. return;
  1887.     }
  1888.     if ( !str_cmp( arg2, "mana" ) )
  1889.     {
  1890. if ( value < 0 || value > 30000 )
  1891. {
  1892.     send_to_char( "Mana range is 0 to 30,000 mana points.nr", ch );
  1893.     return;
  1894. }
  1895. victim->max_mana = value;
  1896. return;
  1897.     }
  1898.     if ( !str_cmp( arg2, "move" ) )
  1899.     {
  1900. if ( value < 0 || value > 30000 )
  1901. {
  1902.     send_to_char( "Move range is 0 to 30,000 move points.nr", ch );
  1903.     return;
  1904. }
  1905. victim->max_move = value;
  1906. return;
  1907.     }
  1908.     if ( !str_cmp( arg2, "practice" ) )
  1909.     {
  1910. if ( value < 0 || value > 100 )
  1911. {
  1912.     send_to_char( "Practice range is 0 to 100 sessions.nr", ch );
  1913.     return;
  1914. }
  1915. victim->practice = value;
  1916. return;
  1917.     }
  1918.     if ( !str_cmp( arg2, "align" ) )
  1919.     {
  1920. if ( value < -1000 || value > 1000 )
  1921. {
  1922.     send_to_char( "Alignment range is -1000 to 1000.nr", ch );
  1923.     return;
  1924. }
  1925. victim->alignment = value;
  1926. return;
  1927.     }
  1928.     if ( !str_cmp( arg2, "thirst" ) )
  1929.     {
  1930. if ( IS_NPC(victim) )
  1931. {
  1932.     send_to_char( "Not on NPC's.nr", ch );
  1933.     return;
  1934. }
  1935. if ( value < 0 || value > 100 )
  1936. {
  1937.     send_to_char( "Thirst range is 0 to 100.nr", ch );
  1938.     return;
  1939. }
  1940. victim->pcdata->condition[COND_THIRST] = value;
  1941. return;
  1942.     }
  1943.     if ( !str_cmp( arg2, "drunk" ) )
  1944.     {
  1945. if ( IS_NPC(victim) )
  1946. {
  1947.     send_to_char( "Not on NPC's.nr", ch );
  1948.     return;
  1949. }
  1950. if ( value < 0 || value > 100 )
  1951. {
  1952.     send_to_char( "Drunk range is 0 to 100.nr", ch );
  1953.     return;
  1954. }
  1955. victim->pcdata->condition[COND_DRUNK] = value;
  1956. return;
  1957.     }
  1958.     if ( !str_cmp( arg2, "full" ) )
  1959.     {
  1960. if ( IS_NPC(victim) )
  1961. {
  1962.     send_to_char( "Not on NPC's.nr", ch );
  1963.     return;
  1964. }
  1965. if ( value < 0 || value > 100 )
  1966. {
  1967.     send_to_char( "Full range is 0 to 100.nr", ch );
  1968.     return;
  1969. }
  1970. victim->pcdata->condition[COND_FULL] = value;
  1971. return;
  1972.     }
  1973.     if ( !str_cmp( arg2, "name" ) )
  1974.     {
  1975. if ( !IS_NPC(victim) )
  1976. {
  1977.     send_to_char( "Not on PC's.nr", ch );
  1978.     return;
  1979. }
  1980. free_string( victim->name );
  1981. victim->name = str_dup( arg3 );
  1982. return;
  1983.     }
  1984.     if ( !str_cmp( arg2, "short" ) )
  1985.     {
  1986. free_string( victim->short_descr );
  1987. victim->short_descr = str_dup( arg3 );
  1988. return;
  1989.     }
  1990.     if ( !str_cmp( arg2, "long" ) )
  1991.     {
  1992. free_string( victim->long_descr );
  1993. victim->long_descr = str_dup( arg3 );
  1994. return;
  1995.     }
  1996.     if ( !str_cmp( arg2, "title" ) )
  1997.     {
  1998. if ( IS_NPC(victim) )
  1999. {
  2000.     send_to_char( "Not on NPC's.nr", ch );
  2001.     return;
  2002. }
  2003. set_title( victim, arg3 );
  2004. return;
  2005.     }
  2006.     if ( !str_cmp( arg2, "spec" ) )
  2007.     {
  2008. if ( !IS_NPC(victim) )
  2009. {
  2010.     send_to_char( "Not on PC's.nr", ch );
  2011.     return;
  2012. }
  2013. if ( ( victim->spec_fun = spec_lookup( arg3 ) ) == 0 )
  2014. {
  2015.     send_to_char( "No such spec fun.nr", ch );
  2016.     return;
  2017. }
  2018. return;
  2019.     }
  2020.     /*
  2021.      * Generate usage message.
  2022.      */
  2023.     do_mset( ch, "" );
  2024.     return;
  2025. }
  2026. void do_oset( CHAR_DATA *ch, char *argument )
  2027. {
  2028.     char arg1 [MAX_INPUT_LENGTH];
  2029.     char arg2 [MAX_INPUT_LENGTH];
  2030.     char arg3 [MAX_INPUT_LENGTH];
  2031.     OBJ_DATA *obj;
  2032.     int value;
  2033.     smash_tilde( argument );
  2034.     argument = one_argument( argument, arg1 );
  2035.     argument = one_argument( argument, arg2 );
  2036.     strcpy( arg3, argument );
  2037.     if ( arg1[0] == '' || arg2[0] == '' || arg3[0] == '' )
  2038.     {
  2039. send_to_char( "Syntax: oset <object> <field>  <value>nr", ch );
  2040. send_to_char( "or:     oset <object> <string> <value>nr", ch );
  2041. send_to_char( "nr", ch );
  2042. send_to_char( "Field being one of:nr", ch );
  2043. send_to_char( "  value0 value1 value2 value3nr", ch );
  2044. send_to_char( "  extra wear level weight cost timernr", ch );
  2045. send_to_char( "nr", ch );
  2046. send_to_char( "String being one of:nr", ch );
  2047. send_to_char( "  name short long ednr", ch );
  2048. return;
  2049.     }
  2050.     if ( ( obj = get_obj_world( ch, arg1 ) ) == NULL )
  2051.     {
  2052. send_to_char( "Nothing like that in hell, earth, or heaven.nr", ch );
  2053. return;
  2054.     }
  2055.     /*
  2056.      * Snarf the value (which need not be numeric).
  2057.      */
  2058.     value = atoi( arg3 );
  2059.     /*
  2060.      * Set something.
  2061.      */
  2062.     if ( !str_cmp( arg2, "value0" ) || !str_cmp( arg2, "v0" ) )
  2063.     {
  2064. obj->value[0] = value;
  2065. return;
  2066.     }
  2067.     if ( !str_cmp( arg2, "value1" ) || !str_cmp( arg2, "v1" ) )
  2068.     {
  2069. obj->value[1] = value;
  2070. return;
  2071.     }
  2072.     if ( !str_cmp( arg2, "value2" ) || !str_cmp( arg2, "v2" ) )
  2073.     {
  2074. obj->value[2] = value;
  2075. return;
  2076.     }
  2077.     if ( !str_cmp( arg2, "value3" ) || !str_cmp( arg2, "v3" ) )
  2078.     {
  2079. obj->value[3] = value;
  2080. return;
  2081.     }
  2082.     if ( !str_cmp( arg2, "extra" ) )
  2083.     {
  2084. obj->extra_flags = value;
  2085. return;
  2086.     }
  2087.     if ( !str_cmp( arg2, "wear" ) )
  2088.     {
  2089. obj->wear_flags = value;
  2090. return;
  2091.     }
  2092.     if ( !str_cmp( arg2, "level" ) )
  2093.     {
  2094. obj->level = value;
  2095. return;
  2096.     }
  2097.     if ( !str_cmp( arg2, "weight" ) )
  2098.     {
  2099. obj->weight = value;
  2100. return;
  2101.     }
  2102.     if ( !str_cmp( arg2, "cost" ) )
  2103.     {
  2104. obj->cost = value;
  2105. return;
  2106.     }
  2107.     if ( !str_cmp( arg2, "timer" ) )
  2108.     {
  2109. obj->timer = value;
  2110. return;
  2111.     }
  2112.     if ( !str_cmp( arg2, "name" ) )
  2113.     {
  2114. free_string( obj->name );
  2115. obj->name = str_dup( arg3 );
  2116. return;
  2117.     }
  2118.     if ( !str_cmp( arg2, "short" ) )
  2119.     {
  2120. free_string( obj->short_descr );
  2121. obj->short_descr = str_dup( arg3 );
  2122. return;
  2123.     }
  2124.     if ( !str_cmp( arg2, "long" ) )
  2125.     {
  2126. free_string( obj->description );
  2127. obj->description = str_dup( arg3 );
  2128. return;
  2129.     }
  2130.     if ( !str_cmp( arg2, "ed" ) )
  2131.     {
  2132. EXTRA_DESCR_DATA *ed;
  2133. argument = one_argument( argument, arg3 );
  2134. if ( argument == NULL )
  2135. {
  2136.     send_to_char( "Syntax: oset <object> ed <keyword> <string>nr",
  2137. ch );
  2138.     return;
  2139. }
  2140. if ( extra_descr_free == NULL )
  2141. {
  2142.     ed = alloc_perm( sizeof(*ed) );
  2143. }
  2144. else
  2145. {
  2146.     ed = extra_descr_free;
  2147.     extra_descr_free = extra_descr_free->next;
  2148. }
  2149. ed->keyword = str_dup( arg3     );
  2150. ed->description = str_dup( argument );
  2151. ed->next = obj->extra_descr;
  2152. obj->extra_descr = ed;
  2153. return;
  2154.     }
  2155.     /*
  2156.      * Generate usage message.
  2157.      */
  2158.     do_oset( ch, "" );
  2159.     return;
  2160. }
  2161. void do_rset( CHAR_DATA *ch, char *argument )
  2162. {
  2163.     char arg1 [MAX_INPUT_LENGTH];
  2164.     char arg2 [MAX_INPUT_LENGTH];
  2165.     char arg3 [MAX_INPUT_LENGTH];
  2166.     ROOM_INDEX_DATA *location;
  2167.     int value;
  2168.     smash_tilde( argument );
  2169.     argument = one_argument( argument, arg1 );
  2170.     argument = one_argument( argument, arg2 );
  2171.     strcpy( arg3, argument );
  2172.     if ( arg1[0] == '' || arg2[0] == '' || arg3[0] == '' )
  2173.     {
  2174. send_to_char( "Syntax: rset <location> <field> valuenr", ch );
  2175. send_to_char( "nr", ch );
  2176. send_to_char( "Field being one of:nr", ch );
  2177. send_to_char( "  flags sectornr", ch );
  2178. return;
  2179.     }
  2180.     if ( ( location = find_location( ch, arg1 ) ) == NULL )
  2181.     {
  2182. send_to_char( "No such location.nr", ch );
  2183. return;
  2184.     }
  2185.     /*
  2186.      * Snarf the value.
  2187.      */
  2188.     if ( !is_number( arg3 ) )
  2189.     {
  2190. send_to_char( "Value must be numeric.nr", ch );
  2191. return;
  2192.     }
  2193.     value = atoi( arg3 );
  2194.     /*
  2195.      * Set something.
  2196.      */
  2197.     if ( !str_cmp( arg2, "flags" ) )
  2198.     {
  2199. location->room_flags = value;
  2200. return;
  2201.     }
  2202.     if ( !str_cmp( arg2, "sector" ) )
  2203.     {
  2204. location->sector_type = value;
  2205. return;
  2206.     }
  2207.     /*
  2208.      * Generate usage message.
  2209.      */
  2210.     do_rset( ch, "" );
  2211.     return;
  2212. }
  2213. #ifndef WIN32
  2214. void do_users( CHAR_DATA *ch, char *argument )
  2215. {
  2216.     char buf[MAX_STRING_LENGTH];
  2217.     char buf2[MAX_STRING_LENGTH];
  2218.     DESCRIPTOR_DATA *d;
  2219.     int count;
  2220.     count = 0;
  2221.     buf[0] = '';
  2222.     buf2[0]     = '';
  2223.     for ( d = descriptor_list; d != NULL; d = d->next )
  2224.     {
  2225. if ( d->character != NULL && can_see( ch, d->character ) )
  2226. {
  2227.     count++;
  2228.     sprintf( buf + strlen(buf), "[%3d %2d] %s (" /*"%s@"*/ "%s)nr",
  2229. d->descriptor,
  2230. d->connected,
  2231. d->original  ? d->original->name  :
  2232. d->character ? d->character->name : "(none)",
  2233. /*d->host_and_name->username,*/ d->host
  2234. );
  2235. }
  2236.     }
  2237.     sprintf( buf2, "%d user%snr", count, count == 1 ? "" : "s" );
  2238.     strcat( buf, buf2 );
  2239.     send_to_char( buf, ch );
  2240.     return;
  2241. }
  2242. #endif
  2243. /*
  2244.  * Thanks to Grodyn for pointing out bugs in this function.
  2245.  */
  2246. void do_force( CHAR_DATA *ch, char *argument )
  2247. {
  2248.     char arg[MAX_INPUT_LENGTH];
  2249.     int trust;
  2250.     int cmd;
  2251.     argument = one_argument( argument, arg );
  2252.     if ( arg[0] == '' || argument[0] == '' )
  2253.     {
  2254. send_to_char( "Force whom to do what?nr", ch );
  2255. return;
  2256.     }
  2257.     /*
  2258.      * Look for command in command table.
  2259.      */
  2260.     trust = get_trust( ch );
  2261.     for ( cmd = 0; cmd_table[cmd].name[0] != ''; cmd++ )
  2262.     {
  2263. if ( argument[0] == cmd_table[cmd].name[0]
  2264.     &&   !str_prefix( argument, cmd_table[cmd].name )
  2265.     &&   ( cmd_table[cmd].level > trust 
  2266.   && cmd_table[cmd].level != 41 ) )
  2267. {
  2268.   send_to_char( "You cant even do that yourself!nr", ch );
  2269.   return;
  2270. }
  2271.     }
  2272.     if ( !str_cmp( arg, "all" ) )
  2273.     {
  2274. CHAR_DATA *vch;
  2275. CHAR_DATA *vch_next;
  2276. for ( vch = char_list; vch != NULL; vch = vch_next )
  2277. {
  2278.     vch_next = vch->next;
  2279.     if ( !IS_NPC(vch) && get_trust( vch ) < get_trust( ch ) )
  2280.     {
  2281.         MOBtrigger = FALSE;
  2282. act( "$n forces you to '$t'.", ch, argument, vch, TO_VICT );
  2283. interpret( vch, argument );
  2284.     }
  2285. }
  2286.     }
  2287.     else
  2288.     {
  2289. CHAR_DATA *victim;
  2290. if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  2291. {
  2292.     send_to_char( "They aren't here.nr", ch );
  2293.     return;
  2294. }
  2295. if ( victim == ch )
  2296. {
  2297.     send_to_char( "Aye aye, right away!nr", ch );
  2298.     return;
  2299. }
  2300. if ( get_trust( victim ) >= get_trust( ch ) )
  2301. {
  2302.     send_to_char( "Do it yourself!nr", ch );
  2303.     return;
  2304. }
  2305. MOBtrigger = FALSE;
  2306. act( "$n forces you to '$t'.", ch, argument, victim, TO_VICT );
  2307. interpret( victim, argument );
  2308.     }
  2309.     send_to_char( "Ok.nr", ch );
  2310.     return;
  2311. }
  2312. /*
  2313.  * New routines by Dionysos.
  2314.  */
  2315. void do_invis( CHAR_DATA *ch, char *argument )
  2316. {
  2317.     if ( IS_NPC(ch) )
  2318. return;
  2319.     if ( IS_SET(ch->act, PLR_WIZINVIS) )
  2320.     {
  2321. REMOVE_BIT(ch->act, PLR_WIZINVIS);
  2322. act( "$n slowly fades into existence.", ch, NULL, NULL, TO_ROOM );
  2323. send_to_char( "You slowly fade back into existence.nr", ch );
  2324.     }
  2325.     else
  2326.     {
  2327. SET_BIT(ch->act, PLR_WIZINVIS);
  2328. act( "$n slowly fades into thin air.", ch, NULL, NULL, TO_ROOM );
  2329. send_to_char( "You slowly vanish into thin air.nr", ch );
  2330.     }
  2331.     return;
  2332. }
  2333. void do_holylight( CHAR_DATA *ch, char *argument )
  2334. {
  2335.     if ( IS_NPC(ch) )
  2336. return;
  2337.     if ( IS_SET(ch->act, PLR_HOLYLIGHT) )
  2338.     {
  2339. REMOVE_BIT(ch->act, PLR_HOLYLIGHT);
  2340. send_to_char( "Holy light mode off.nr", ch );
  2341.     }
  2342.     else
  2343.     {
  2344. SET_BIT(ch->act, PLR_HOLYLIGHT);
  2345. send_to_char( "Holy light mode on.nr", ch );
  2346.     }
  2347.     return;
  2348. }
  2349. /* Wizify and Wizbit sent in by M. B. King */
  2350. void do_wizify( CHAR_DATA *ch, char *argument )
  2351. {
  2352.     char arg1[MAX_INPUT_LENGTH];
  2353.     CHAR_DATA *victim;
  2354.   
  2355.     argument = one_argument( argument, arg1  );
  2356.     if ( arg1[0] == '' )
  2357.     {
  2358. send_to_char( "Syntax: wizify <name>nr" , ch );
  2359. return;
  2360.     }
  2361.     if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
  2362.     {
  2363. send_to_char( "They aren't here.nr" , ch );
  2364. return;
  2365.     }
  2366.     if ( IS_NPC( victim ) )
  2367.     {
  2368. send_to_char( "Not on mobs.nr", ch );
  2369. return;
  2370.     }
  2371.     victim->wizbit = !victim->wizbit;
  2372.     if ( victim->wizbit ) 
  2373.     {
  2374. act( "$N wizified.nr", ch, NULL, victim, TO_CHAR );
  2375. act( "$n has wizified you!nr", ch, NULL, victim, TO_VICT );
  2376.     }
  2377.     else
  2378.     {
  2379. act( "$N dewizzed.nr", ch, NULL, victim, TO_CHAR );
  2380. act( "$n has dewizzed you!nr", ch, NULL, victim, TO_VICT ); 
  2381.     }
  2382.     do_save( victim, "");
  2383.     return;
  2384. }
  2385. #if 0
  2386. /* Idea from Talen of Vego's do_where command */
  2387. void do_owhere( CHAR_DATA *ch, char *argument )
  2388. {
  2389.     char buf[MAX_STRING_LENGTH];
  2390.     char arg[MAX_INPUT_LENGTH];
  2391.     bool found = FALSE;
  2392.     OBJ_DATA *obj;
  2393.     OBJ_DATA *in_obj;
  2394.     int obj_counter = 1;
  2395.     one_argument( argument, arg );
  2396.     if( arg[0] == '' )
  2397.     {
  2398. send_to_char( "Syntax:  owhere <object>.nr", ch );
  2399. return;
  2400.     }
  2401.     else
  2402.     {
  2403. for ( obj = object_list; obj != NULL; obj = obj->next )
  2404. {
  2405.     if ( !can_see_obj( ch, obj ) || !is_name( arg, obj->name ) )
  2406.         continue;
  2407.     found = TRUE;
  2408.     for ( in_obj = obj; in_obj->in_obj != NULL;
  2409.  in_obj = in_obj->in_obj )
  2410.         ;
  2411.     if ( in_obj->carried_by != NULL )
  2412.     {
  2413. sprintf( buf, "[%2d] %s carried by %s.nr", obj_counter,
  2414. obj->short_descr, PERS( in_obj->carried_by, ch ) );
  2415.     }
  2416.     else
  2417.     {
  2418. sprintf( buf, "[%2d] %s in %s.nr", obj_counter,
  2419. obj->short_descr, ( in_obj->in_room == NULL ) ?
  2420. "somewhere" : in_obj->in_room->name );
  2421.     }
  2422.     obj_counter++;
  2423.     buf[0] = UPPER( buf[0] );
  2424.     send_to_char( buf, ch );
  2425. }
  2426.     }
  2427.     if ( !found )
  2428. send_to_char(
  2429. "Nothing like that in hell, earth, or heaven.nr" , ch );
  2430.     return;
  2431. }
  2432. #else
  2433. /* Idea from Talen of Vego's do_where command */
  2434.  /*
  2435.   * Modified combination of Merc 2.2, Dalton, and Zavod's  "owhere" commands
  2436.   */
  2437. void do_owhere( CHAR_DATA *ch, char *argument )
  2438. {
  2439.     char buf[MAX_STRING_LENGTH];
  2440.     char arg[MAX_INPUT_LENGTH];
  2441.     bool found = FALSE;
  2442.     OBJ_DATA *obj;
  2443.     OBJ_DATA *in_obj;
  2444.     int obj_counter = 1;
  2445.  
  2446.     one_argument( argument, arg );
  2447.  
  2448.     if( arg[0] == '' )
  2449.       {
  2450.         send_to_char( "Syntax:  owhere <object>.nr", ch );
  2451.         return;
  2452.       }
  2453.     
  2454.     for ( obj = object_list; obj != NULL; obj = obj->next )
  2455.       {
  2456.         if ( !can_see_obj( ch, obj ) || !is_name( arg, obj->name ) )
  2457.             continue;
  2458.  
  2459.         found = TRUE;
  2460.  
  2461.         for ( in_obj = obj; in_obj->in_obj != NULL;
  2462.                 in_obj = in_obj->in_obj ) ;
  2463.  
  2464.         if ( in_obj->carried_by != NULL )
  2465.   {
  2466.         
  2467.             sprintf( buf, "%3d [%4d] %-30s [%4d] %snr", 
  2468.                 obj_counter,
  2469.                 obj->pIndexData->vnum,
  2470.                 obj->short_descr,
  2471. in_obj->carried_by->in_room == NULL ? 0 : in_obj->carried_by->in_room->vnum,
  2472.                 PERS( in_obj->carried_by, ch ) );
  2473.  
  2474.   }
  2475.         else
  2476.   {
  2477.  
  2478.             sprintf( buf, "%3d [%4d] %-30s [%4d] %snr",
  2479.                 obj_counter,
  2480.                 obj->pIndexData->vnum,
  2481.                 obj->short_descr,
  2482.                 in_obj->in_room == NULL ? 0 : in_obj->in_room->vnum,
  2483.                 in_obj->in_room == NULL ? "somewhere" : in_obj->in_room->name );
  2484.   }
  2485.             
  2486.         obj_counter++;
  2487.         send_to_char( buf, ch );
  2488.       }
  2489.  
  2490.     if ( !found )
  2491.         send_to_char(
  2492.                 "Nothing like that in hell, earth, or heaven.nr" , ch );
  2493.     return;
  2494.  
  2495. }
  2496. #endif