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

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. /***************************************************************************
  18.  *  The MOBprograms have been contributed by N'Atas-ha.  Any support for   *
  19.  *  these routines should not be expected from Merc Industries.  However,  *
  20.  *  under no circumstances should the blame for bugs, etc be placed on     *
  21.  *  Merc Industries.  They are not guaranteed to work on all systems due   *
  22.  *  to their frequent use of strxxx functions.  They are also not the most *
  23.  *  efficient way to perform their tasks, but hopefully should be in the   *
  24.  *  easiest possible way to install and begin using. Documentation for     *
  25.  *  such installation can be found in INSTALL.  Enjoy........    N'Atas-Ha *
  26.  ***************************************************************************/
  27. #include <sys/types.h>
  28. #include <stdio.h>
  29. #include <string.h>
  30. #include <stdlib.h>
  31. #include "merc.h"
  32. /*
  33.  * Local functions.
  34.  */
  35. char * mprog_type_to_name args( ( int type ) );
  36. /* This routine transfers between alpha and numeric forms of the
  37.  *  mob_prog bitvector types. It allows the words to show up in mpstat to
  38.  *  make it just a hair bit easier to see what a mob should be doing.
  39.  */
  40. char *mprog_type_to_name( int type )
  41. {
  42.     switch ( type )
  43.     {
  44.     case IN_FILE_PROG:          return "in_file_prog";
  45.     case ACT_PROG:              return "act_prog";
  46.     case SPEECH_PROG:           return "speech_prog";
  47.     case RAND_PROG:             return "rand_prog";
  48.     case FIGHT_PROG:            return "fight_prog";
  49.     case HITPRCNT_PROG:         return "hitprcnt_prog";
  50.     case DEATH_PROG:            return "death_prog";
  51.     case ENTRY_PROG:            return "entry_prog";
  52.     case GREET_PROG:            return "greet_prog";
  53.     case ALL_GREET_PROG:        return "all_greet_prog";
  54.     case GIVE_PROG:             return "give_prog";
  55.     case BRIBE_PROG:            return "bribe_prog";
  56.     default:                    return "ERROR_PROG";
  57.     }
  58. }
  59. /* A trivial rehack of do_mstat.  This doesnt show all the data, but just
  60.  * enough to identify the mob and give its basic condition.  It does however,
  61.  * show the MOBprograms which are set.
  62.  */
  63. void do_mpstat( CHAR_DATA *ch, char *argument )
  64. {
  65.     char        buf[ MAX_STRING_LENGTH ];
  66.     char        arg[ MAX_INPUT_LENGTH  ];
  67.     MPROG_DATA *mprg;
  68.     CHAR_DATA  *victim;
  69.     one_argument( argument, arg );
  70.     if ( arg[0] == '' )
  71.     {
  72. send_to_char( "MobProg stat whom?nr", ch );
  73. return;
  74.     }
  75.     if ( ( victim = get_char_world( ch, arg ) ) == NULL )
  76.     {
  77. send_to_char( "They aren't here.nr", ch );
  78. return;
  79.     }
  80.     if ( !IS_NPC( victim ) )
  81.     {
  82. send_to_char( "Only Mobiles can have Programs!nr", ch);
  83. return;
  84.     }
  85.     if ( !( victim->pIndexData->progtypes ) )
  86.     {
  87. send_to_char( "That Mobile has no Programs set.nr", ch);
  88. return;
  89.     }
  90.     sprintf( buf, "Name: %s.  Vnum: %d.nr",
  91. victim->name, victim->pIndexData->vnum );
  92.     send_to_char( buf, ch );
  93.     sprintf( buf, "Short description: %s.nrLong  description: %s",
  94.     victim->short_descr,
  95.     victim->long_descr[0] != '' ?
  96.     victim->long_descr : "(none).nr" );
  97.     send_to_char( buf, ch );
  98.     sprintf( buf, "Hp: %d/%d.  Mana: %d/%d.  Move: %d/%d. nr",
  99. victim->hit,         victim->max_hit,
  100. victim->mana,        victim->max_mana,
  101. victim->move,        victim->max_move );
  102.     send_to_char( buf, ch );
  103.     sprintf( buf,
  104. "Lv: %d.  Class: %d.  Align: %d.  AC: %d.  Gold: %d.  Exp: %d.nr",
  105. victim->level,       victim->class,        victim->alignment,
  106. GET_AC( victim ),    victim->gold,         victim->exp );
  107.     send_to_char( buf, ch );
  108.     for ( mprg = victim->pIndexData->mobprogs; mprg != NULL;
  109.  mprg = mprg->next )
  110.     {
  111.       sprintf( buf, ">%s %snr%snr",
  112.       mprog_type_to_name( mprg->type ),
  113.       mprg->arglist,
  114.       mprg->comlist );
  115.       send_to_char( buf, ch );
  116.     }
  117.     return;
  118. }
  119. /* prints the argument to all the rooms aroud the mobile */
  120. void do_mpasound( CHAR_DATA *ch, char *argument )
  121. {
  122.   ROOM_INDEX_DATA *was_in_room;
  123.   int              door;
  124.     if ( !IS_NPC( ch ) )
  125.     {
  126.         send_to_char( "Huh?nr", ch );
  127.         return;
  128.     }
  129.     if ( argument[0] == '' )
  130.     {
  131.         bug( "Mpasound - No argument from vnum %d.", ch->pIndexData->vnum );
  132. return;
  133.     }
  134.     was_in_room = ch->in_room;
  135.     for ( door = 0; door <= 5; door++ )
  136.     {
  137.       EXIT_DATA       *pexit;
  138.       
  139.       if ( ( pexit = was_in_room->exit[door] ) != NULL
  140.   &&   pexit->to_room != NULL
  141.   &&   pexit->to_room != was_in_room )
  142.       {
  143. ch->in_room = pexit->to_room;
  144. MOBtrigger  = FALSE;
  145. act( argument, ch, NULL, NULL, TO_ROOM );
  146.       }
  147.     }
  148.   ch->in_room = was_in_room;
  149.   return;
  150. }
  151. /* lets the mobile kill any player or mobile without murder*/
  152. void do_mpkill( CHAR_DATA *ch, char *argument )
  153. {
  154.     char      arg[ MAX_INPUT_LENGTH ];
  155.     CHAR_DATA *victim;
  156.     if ( !IS_NPC( ch ) )
  157.     {
  158.         send_to_char( "Huh?nr", ch );
  159. return;
  160.     }
  161.     one_argument( argument, arg );
  162.     if ( arg[0] == '' )
  163.     {
  164. bug( "MpKill - No argument from vnum %d.",
  165. ch->pIndexData->vnum );
  166. return;
  167.     }
  168.     if ( ( victim = get_char_room( ch, arg ) ) == NULL )
  169.     {
  170. bug( "MpKill - Victim not in room from vnum %d.",
  171.     ch->pIndexData->vnum );
  172. return;
  173.     }
  174.     if ( victim == ch )
  175.     {
  176. bug( "MpKill - Bad victim to attack from vnum %d.",
  177.     ch->pIndexData->vnum );
  178. return;
  179.     }
  180.     if ( IS_AFFECTED( ch, AFF_CHARM ) && ch->master == victim )
  181.     {
  182. bug( "MpKill - Charmed mob attacking master from vnum %d.",
  183.     ch->pIndexData->vnum );
  184. return;
  185.     }
  186. #if 0 // @@@ Seems to be no need for this message...
  187.     if ( ch->position == POS_FIGHTING )
  188.     {
  189. bug( "MpKill - Already fighting from vnum %d",
  190.     ch->pIndexData->vnum );
  191. return;
  192.     }
  193. #endif
  194.     multi_hit( ch, victim, TYPE_UNDEFINED );
  195.     return;
  196. }
  197. /* lets the mobile destroy an object in its inventory
  198.    it can also destroy a worn object and it can destroy 
  199.    items using all.xxxxx or just plain all of them */
  200. void do_mpjunk( CHAR_DATA *ch, char *argument )
  201. {
  202.     char      arg[ MAX_INPUT_LENGTH ];
  203.     OBJ_DATA *obj;
  204.     OBJ_DATA *obj_next;
  205.     if ( !IS_NPC( ch ) )
  206.     {
  207.         send_to_char( "Huh?nr", ch );
  208. return;
  209.     }
  210.     one_argument( argument, arg );
  211.     if ( arg[0] == '')
  212.     {
  213.         bug( "Mpjunk - No argument from vnum %d.", ch->pIndexData->vnum );
  214. return;
  215.     }
  216.     if ( str_cmp( arg, "all" ) && str_prefix( "all.", arg ) )
  217.     {
  218.       if ( ( obj = get_obj_wear( ch, arg ) ) != NULL )
  219.       {
  220. unequip_char( ch, obj );
  221. extract_obj( obj );
  222. return;
  223.       }
  224.       if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
  225. return; 
  226.       extract_obj( obj );
  227.     }
  228.     else
  229.       for ( obj = ch->carrying; obj != NULL; obj = obj_next )
  230.       {
  231.         obj_next = obj->next_content;
  232.         if ( arg[3] == '' || is_name( &arg[4], obj->name ) )
  233.         {
  234.           if ( obj->wear_loc != WEAR_NONE)
  235.     unequip_char( ch, obj );
  236.           extract_obj( obj );
  237.         } 
  238.       }
  239.     return;
  240. }
  241. /* prints the message to everyone in the room other than the mob and victim */
  242. void do_mpechoaround( CHAR_DATA *ch, char *argument )
  243. {
  244.   char       arg[ MAX_INPUT_LENGTH ];
  245.   CHAR_DATA *victim;
  246.     if ( !IS_NPC( ch ) )
  247.     {
  248.        send_to_char( "Huh?nr", ch );
  249.        return;
  250.     }
  251.     argument = one_argument( argument, arg );
  252.     if ( arg[0] == '' )
  253.     {
  254.        bug( "Mpechoaround - No argument from vnum %d.", ch->pIndexData->vnum );
  255.        return;
  256.     }
  257.     if ( !( victim=get_char_room( ch, arg ) ) )
  258.     {
  259.         bug( "Mpechoaround - Victim does not exist from vnum %d.",
  260.     ch->pIndexData->vnum );
  261. return;
  262.     }
  263.     act( argument, ch, NULL, victim, TO_NOTVICT );
  264.     return;
  265. }
  266. /* prints the message to only the victim */
  267. void do_mpechoat( CHAR_DATA *ch, char *argument )
  268. {
  269.   char       arg[ MAX_INPUT_LENGTH ];
  270.   CHAR_DATA *victim;
  271.     if ( !IS_NPC( ch ) )
  272.     {
  273.        send_to_char( "Huh?nr", ch );
  274.        return;
  275.     }
  276.     argument = one_argument( argument, arg );
  277.     if ( arg[0] == '' || argument[0] == '' )
  278.     {
  279.        bug( "Mpechoat - No argument from vnum %d.",
  280.    ch->pIndexData->vnum );
  281.        return;
  282.     }
  283.     if ( !( victim = get_char_room( ch, arg ) ) )
  284.     {
  285.         bug( "Mpechoat - Victim does not exist from vnum %d.",
  286.     ch->pIndexData->vnum );
  287. return;
  288.     }
  289.     act( argument, ch, NULL, victim, TO_VICT );
  290.     return;
  291. }
  292. /* prints the message to the room at large */
  293. void do_mpecho( CHAR_DATA *ch, char *argument )
  294. {
  295.     if ( !IS_NPC(ch) )
  296.     {
  297.         send_to_char( "Huh?nr", ch );
  298.         return;
  299.     }
  300.     if ( argument[0] == '' )
  301.     {
  302.         bug( "Mpecho - Called w/o argument from vnum %d.",
  303.     ch->pIndexData->vnum );
  304.         return;
  305.     }
  306.     act( argument, ch, NULL, NULL, TO_ROOM );
  307.     return;
  308. }
  309. /* lets the mobile load an item or mobile.  All items
  310. are loaded into inventory.  you can specify a level with
  311. the load object portion as well. */
  312. void do_mpmload( CHAR_DATA *ch, char *argument )
  313. {
  314.     char            arg[ MAX_INPUT_LENGTH ];
  315.     MOB_INDEX_DATA *pMobIndex;
  316.     CHAR_DATA      *victim;
  317.     if ( !IS_NPC( ch ) )
  318.     {
  319.         send_to_char( "Huh?nr", ch );
  320. return;
  321.     }
  322.     one_argument( argument, arg );
  323.     if ( arg[0] == '' || !is_number(arg) )
  324.     {
  325. bug( "Mpmload - Bad vnum as arg from vnum %d.", ch->pIndexData->vnum );
  326. return;
  327.     }
  328.     if ( ( pMobIndex = get_mob_index( atoi( arg ) ) ) == NULL )
  329.     {
  330. bug( "Mpmload - Bad mob vnum from vnum %d.", ch->pIndexData->vnum );
  331. return;
  332.     }
  333.     victim = create_mobile( pMobIndex );
  334.     char_to_room( victim, ch->in_room );
  335.     return;
  336. }
  337. void do_mpoload( CHAR_DATA *ch, char *argument )
  338. {
  339.     char arg1[ MAX_INPUT_LENGTH ];
  340.     char arg2[ MAX_INPUT_LENGTH ];
  341.     OBJ_INDEX_DATA *pObjIndex;
  342.     OBJ_DATA       *obj;
  343.     int             level;
  344.     if ( !IS_NPC( ch ) )
  345.     {
  346.         send_to_char( "Huh?nr", ch );
  347. return;
  348.     }
  349.     argument = one_argument( argument, arg1 );
  350.     argument = one_argument( argument, arg2 );
  351.  
  352.     if ( arg1[0] == '' || !is_number( arg1 ) )
  353.     {
  354.         bug( "Mpoload - Bad syntax from vnum %d.",
  355.     ch->pIndexData->vnum );
  356.         return;
  357.     }
  358.  
  359.     if ( arg2[0] == '' )
  360.     {
  361. level = get_trust( ch );
  362.     }
  363.     else
  364.     {
  365. /*
  366.  * New feature from Alander.
  367.  */
  368.         if ( !is_number( arg2 ) )
  369.         {
  370.     bug( "Mpoload - Bad syntax from vnum %d.", ch->pIndexData->vnum );
  371.     return;
  372.         }
  373. level = atoi( arg2 );
  374. if ( level < 0 || level > get_trust( ch ) )
  375. {
  376.     bug( "Mpoload - Bad level from vnum %d.", ch->pIndexData->vnum );
  377.     return;
  378. }
  379.     }
  380.     if ( ( pObjIndex = get_obj_index( atoi( arg1 ) ) ) == NULL )
  381.     {
  382. bug( "Mpoload - Bad vnum arg from vnum %d.", ch->pIndexData->vnum );
  383. return;
  384.     }
  385.     obj = create_object( pObjIndex, level );
  386.     if ( CAN_WEAR(obj, ITEM_TAKE) )
  387.     {
  388. obj_to_char( obj, ch );
  389.     }
  390.     else
  391.     {
  392. obj_to_room( obj, ch->in_room );
  393.     }
  394.     return;
  395. }
  396. /* lets the mobile purge all objects and other npcs in the room,
  397.    or purge a specified object or mob in the room.  It can purge
  398.    itself, but this had best be the last command in the MOBprogram
  399.    otherwise ugly stuff will happen */
  400. void do_mppurge( CHAR_DATA *ch, char *argument )
  401. {
  402.     char       arg[ MAX_INPUT_LENGTH ];
  403.     CHAR_DATA *victim;
  404.     OBJ_DATA  *obj;
  405.     if ( !IS_NPC( ch ) )
  406.     {
  407.         send_to_char( "Huh?nr", ch );
  408. return;
  409.     }
  410.     one_argument( argument, arg );
  411.     if ( arg[0] == '' )
  412.     {
  413.         /* 'purge' */
  414.         CHAR_DATA *vnext;
  415.         OBJ_DATA  *obj_next;
  416. for ( victim = ch->in_room->people; victim != NULL; victim = vnext )
  417. {
  418.   vnext = victim->next_in_room;
  419.   if ( IS_NPC( victim ) && victim != ch )
  420.     extract_char( victim, TRUE );
  421. }
  422. for ( obj = ch->in_room->contents; obj != NULL; obj = obj_next )
  423. {
  424.   obj_next = obj->next_content;
  425.   extract_obj( obj );
  426. }
  427. return;
  428.     }
  429.     if ( ( victim = get_char_room( ch, arg ) ) == NULL )
  430.     {
  431. if ( ( obj = get_obj_here( ch, arg ) ) )
  432. {
  433.     extract_obj( obj );
  434. }
  435. else
  436. {
  437.     bug( "Mppurge - Bad argument from vnum %d.",
  438. ch->pIndexData->vnum );
  439. }
  440. return;
  441.     }
  442.     if ( !IS_NPC( victim ) )
  443.     {
  444. bug( "Mppurge - Purging a PC from vnum %d.", ch->pIndexData->vnum );
  445. return;
  446.     }
  447.     extract_char( victim, TRUE );
  448.     return;
  449. }
  450. /* lets the mobile goto any location it wishes that is not private */
  451. void do_mpgoto( CHAR_DATA *ch, char *argument )
  452. {
  453.     char             arg[ MAX_INPUT_LENGTH ];
  454.     ROOM_INDEX_DATA *location;
  455.     if ( !IS_NPC( ch ) )
  456.     {
  457.         send_to_char( "Huh?nr", ch );
  458. return;
  459.     }
  460.     one_argument( argument, arg );
  461.     if ( arg[0] == '' )
  462.     {
  463. bug( "Mpgoto - No argument from vnum %d.", ch->pIndexData->vnum );
  464. return;
  465.     }
  466.     if ( ( location = find_location( ch, arg ) ) == NULL )
  467.     {
  468. bug( "Mpgoto - No such location from vnum %d.", ch->pIndexData->vnum );
  469. return;
  470.     }
  471.     if ( ch->fighting != NULL )
  472. stop_fighting( ch, TRUE );
  473.     char_from_room( ch );
  474.     char_to_room( ch, location );
  475.     return;
  476. }
  477. /* lets the mobile do a command at another location. Very useful */
  478. void do_mpat( CHAR_DATA *ch, char *argument )
  479. {
  480.     char             arg[ MAX_INPUT_LENGTH ];
  481.     ROOM_INDEX_DATA *location;
  482.     ROOM_INDEX_DATA *original;
  483.     CHAR_DATA       *wch;
  484.     if ( !IS_NPC( ch ) )
  485.     {
  486.         send_to_char( "Huh?nr", ch );
  487. return;
  488.     }
  489.  
  490.     argument = one_argument( argument, arg );
  491.     if ( arg[0] == '' || argument[0] == '' )
  492.     {
  493. bug( "Mpat - Bad argument from vnum %d.", ch->pIndexData->vnum );
  494. return;
  495.     }
  496.     if ( ( location = find_location( ch, arg ) ) == NULL )
  497.     {
  498. bug( "Mpat - No such location from vnum %d.", ch->pIndexData->vnum );
  499. return;
  500.     }
  501.     original = ch->in_room;
  502.     char_from_room( ch );
  503.     char_to_room( ch, location );
  504.     interpret( ch, argument );
  505.     /*
  506.      * See if 'ch' still exists before continuing!
  507.      * Handles 'at XXXX quit' case.
  508.      */
  509.     for ( wch = char_list; wch != NULL; wch = wch->next )
  510.     {
  511. if ( wch == ch )
  512. {
  513.     char_from_room( ch );
  514.     char_to_room( ch, original );
  515.     break;
  516. }
  517.     }
  518.     return;
  519. }
  520.  
  521. /* lets the mobile transfer people.  the all argument transfers
  522.    everyone in the current room to the specified location */
  523. void do_mptransfer( CHAR_DATA *ch, char *argument )
  524. {
  525.     char             arg1[ MAX_INPUT_LENGTH ];
  526.     char             arg2[ MAX_INPUT_LENGTH ];
  527.     ROOM_INDEX_DATA *location;
  528.     DESCRIPTOR_DATA *d;
  529.     CHAR_DATA       *victim;
  530.     if ( !IS_NPC( ch ) )
  531.     {
  532. send_to_char( "Huh?nr", ch );
  533. return;
  534.     }
  535.     argument = one_argument( argument, arg1 );
  536.     argument = one_argument( argument, arg2 );
  537.     if ( arg1[0] == '' )
  538.     {
  539. bug( "Mptransfer - Bad syntax from vnum %d.", ch->pIndexData->vnum );
  540. return;
  541.     }
  542.     if ( !str_cmp( arg1, "all" ) )
  543.     {
  544. for ( d = descriptor_list; d != NULL; d = d->next )
  545. {
  546.     if ( d->connected == CON_PLAYING
  547.     &&   d->character != ch
  548.     &&   d->character->in_room != NULL
  549.     &&   can_see( ch, d->character ) )
  550.     {
  551. char buf[MAX_STRING_LENGTH];
  552. sprintf( buf, "%s %s", d->character->name, arg2 );
  553. do_transfer( ch, buf );
  554.     }
  555. }
  556. return;
  557.     }
  558.     /*
  559.      * Thanks to Grodyn for the optional location parameter.
  560.      */
  561.     if ( arg2[0] == '' )
  562.     {
  563. location = ch->in_room;
  564.     }
  565.     else
  566.     {
  567. if ( ( location = find_location( ch, arg2 ) ) == NULL )
  568. {
  569.     bug( "Mptransfer - No such location from vnum %d.",
  570.         ch->pIndexData->vnum );
  571.     return;
  572. }
  573. if ( room_is_private( location ) )
  574. {
  575.     bug( "Mptransfer - Private room from vnum %d.",
  576. ch->pIndexData->vnum );
  577.     return;
  578. }
  579.     }
  580.     if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
  581.     {
  582. bug( "Mptransfer - No such person from vnum %d.",
  583.     ch->pIndexData->vnum );
  584. return;
  585.     }
  586.     if ( victim->in_room == NULL )
  587.     {
  588. bug( "Mptransfer - Victim in Limbo from vnum %d.",
  589.     ch->pIndexData->vnum );
  590. return;
  591.     }
  592.     if ( victim->fighting != NULL )
  593. stop_fighting( victim, TRUE );
  594.     char_from_room( victim );
  595.     char_to_room( victim, location );
  596.     return;
  597. }
  598. /* lets the mobile force someone to do something.  must be mortal level
  599.    and the all argument only affects those in the room with the mobile */
  600. void do_mpforce( CHAR_DATA *ch, char *argument )
  601. {
  602.     char arg[ MAX_INPUT_LENGTH ];
  603.     if ( !IS_NPC( ch ) )
  604.     {
  605. send_to_char( "Huh?nr", ch );
  606. return;
  607.     }
  608.     argument = one_argument( argument, arg );
  609.     if ( arg[0] == '' || argument[0] == '' )
  610.     {
  611. bug( "Mpforce - Bad syntax from vnum %d.", ch->pIndexData->vnum );
  612. return;
  613.     }
  614.     if ( !str_cmp( arg, "all" ) )
  615.     {
  616.         CHAR_DATA *vch;
  617.         CHAR_DATA *vch_next;
  618. for ( vch = char_list; vch != NULL; vch = vch_next )
  619. {
  620.     vch_next = vch->next;
  621.     if ( vch->in_room == ch->in_room
  622. && get_trust( vch ) < get_trust( ch ) 
  623. && can_see( ch, vch ) )
  624.     {
  625. interpret( vch, argument );
  626.     }
  627. }
  628.     }
  629.     else
  630.     {
  631. CHAR_DATA *victim;
  632. if ( ( victim = get_char_room( ch, arg ) ) == NULL )
  633. {
  634.     bug( "Mpforce - No such victim from vnum %d.",
  635.    ch->pIndexData->vnum );
  636.     return;
  637. }
  638. if ( victim == ch )
  639.      {
  640.     bug( "Mpforce - Forcing oneself from vnum %d.",
  641.      ch->pIndexData->vnum );
  642.     return;
  643. }
  644. interpret( victim, argument );
  645.     }
  646.     return;
  647. }