diff -i smaug14/src/mud_prog.c  smaug18/src/mud_prog.c
8c8
<  * Tricops and Fireblade                                      |             *
---
>  * Tricops, Fireblade, Edmond, Conran                         |             *
29a30
> 
80,86c81
< #define MAX_IFS     20        /* should always be generous */
< #define IN_IF        0
< #define IN_ELSE      1
< #define DO_IF        2
< #define DO_ELSE      3
< 
< #define MAX_PROG_NEST   20
---
> /* Moved these to mud.h as I needed two of them for mpsleep -rkb */
89c84
<       OBJ_DATA * obj, void *vo, CHAR_DATA * rndm, bool ignore, bool ignore_ors );
---
>       OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target, CHAR_DATA * rndm, bool ignore, bool ignore_ors );
98a94,100
> /* 
>  * Global variables to handle sleeping mud progs. 
>  */
> MPSLEEP_DATA *first_mpsleep = NULL;
> MPSLEEP_DATA *last_mpsleep = NULL;
> MPSLEEP_DATA *current_mpsleep = NULL;
> 
107c109
<               CHAR_DATA * actor, OBJ_DATA * obj, void *vo, CHAR_DATA * rndm ) );
---
>               CHAR_DATA * actor, OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target, CHAR_DATA * rndm ) );
109c111
<               CHAR_DATA * actor, OBJ_DATA * obj, void *vo, CHAR_DATA * rndm ) );
---
>               CHAR_DATA * actor, OBJ_DATA * obj, CHAR_DATA * vict, OBJ_DATA * v_obj, CHAR_DATA * rndm ) );
111c113
<               CHAR_DATA * actor, OBJ_DATA * obj, void *vo, bool single_step ) );
---
>               CHAR_DATA * actor, OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target, bool single_step ) );
116,117c118,119
< void oprog_wordlist_check( char *arg, CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, void *vo, int type,
<       OBJ_DATA * iobj );
---
> bool oprog_wordlist_check( char *arg, CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, CHAR_DATA * victim,
>       OBJ_DATA * target, int type, OBJ_DATA * iobj );
119,122c121,126
< bool oprog_percent_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, void *vo, int type );
< void rprog_percent_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, void *vo, int type );
< void rprog_wordlist_check( char *arg, CHAR_DATA * mob, CHAR_DATA * actor,
<       OBJ_DATA * obj, void *vo, int type, ROOM_INDEX_DATA * room );
---
> bool oprog_percent_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target,
>       int type );
> void rprog_percent_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target,
>       int type );
> bool rprog_wordlist_check( char *arg, CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, CHAR_DATA * victim,
>       OBJ_DATA * target, int type, ROOM_INDEX_DATA * room );
259c263,264
< int mprog_do_ifcheck( char *ifcheck, CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, void *vo, CHAR_DATA * rndm )
---
> int mprog_do_ifcheck( char *ifcheck, CHAR_DATA * mob, CHAR_DATA * actor,
>       OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target, CHAR_DATA * rndm )
307c312
<               while ( *p == '$' || isalnum( *p ) )
---
>               while ( *p == '$' || isalnum( *p ) || *p == ':' )
375c380
<                               chkchar = ( CHAR_DATA * ) vo;
---
>                               chkchar = victim;
384c389
<                               chkobj = ( OBJ_DATA * ) vo;
---
>                               chkobj = target;
431c436
<               if ( vnum < 1 || vnum > 32767 )
---
>               if ( vnum < 1 || vnum > MAX_VNUM )
476c481
<               if ( vnum < 1 || vnum > 32767 )
---
>               if ( vnum < 1 || vnum > MAX_VNUM )
502c507
<               if ( vnum < 1 || vnum > 32767 )
---
>               if ( vnum < 1 || vnum > MAX_VNUM )
539a545,573
> 
>       if ( !str_cmp( chck, "objinworld" ) )
>       {
>               int vnum = atoi( cvar );
>               int lhsvl;
>               OBJ_INDEX_DATA *p_index;
> 
>               if ( vnum < 1 || vnum > MAX_VNUM )
>               {
>                       progbug( "Bad vnum to 'objinworld'", mob );
>                       return BERR;
>               }
> 
>               p_index = ( get_obj_index( vnum ) );
> 
>               if ( !p_index )
>                       lhsvl = 0;
>               else
>                       lhsvl = p_index->count;
> 
>               rhsvl = atoi( rval );
> 
>               if ( rhsvl < 0 )
>                       rhsvl = 0;
>               if ( !*opr )
>                       strcpy( opr, "==" );
>               return mprog_veval( lhsvl, opr, rhsvl, mob );
>       }
> 
545c579
<               if ( vnum < 1 || vnum > 32767 )
---
>               if ( vnum < 1 || vnum > MAX_VNUM )
605c639
<               if ( vnum < 1 || vnum > 32767 )
---
>               if ( vnum < 1 || vnum > MAX_VNUM )
658c692
<               if ( vnum < 1 || vnum > 32767 )
---
>               if ( vnum < 1 || vnum > MAX_VNUM )
709c743
<               if ( vnum < 1 || vnum > 32767 )
---
>               if ( vnum < 1 || vnum > MAX_VNUM )
761c795
<               if ( vnum < 1 || vnum > 32767 )
---
>               if ( vnum < 1 || vnum > MAX_VNUM )
814a849,852
>               if ( !str_cmp( chck, "stopscript" ) )
>               {
>                       return ( IS_NPC( chkchar ) && xIS_SET( chkchar->act, ACT_STOP_SCRIPT ) );
>               }
822a861,870
>               if ( !str_cmp( chck, "drunk" ) )
>               {
>                       return ( !IS_NPC( chkchar ) ?
>                               mprog_veval( chkchar->pcdata->condition[COND_DRUNK], opr, atoi( rval ), mob ) : FALSE );
>               }
>               if ( !str_cmp( chck, "darrek" ) )       /* Teehee -- Blod */
>               {
>                       return ( !IS_NPC( chkchar ) ?
>                               mprog_veval( chkchar->pcdata->condition[COND_DRUNK], opr, atoi( rval ), mob ) : FALSE );
>               }
834a883,889
>               if ( !str_cmp( chck, "isriding" ) )
>               {
>                       if ( chkchar->mount == mob )
>                               return TRUE;
>                       else
>                               return FALSE;
>               }
873a929,932
>               if ( !str_cmp( chck, "inarena" ) )
>               {
>                       return in_arena( chkchar ) ? TRUE : FALSE;
>               }
908c967,974
<                       return IS_AFFECTED( chkchar, AFF_CHARM ) ? TRUE : FALSE;
---
>                       if ( IS_AFFECTED( chkchar, AFF_CHARM ) || IS_AFFECTED( chkchar, AFF_POSSESS ) )
>                               return TRUE;
>                       else
>                               return FALSE;
>               }
>               if ( !str_cmp( chck, "ispossesed" ) )
>               {
>                       return IS_AFFECTED( chkchar, AFF_POSSESS ) ? TRUE : FALSE;
947c1013
<                       return mprog_veval( chkchar->hit / chkchar->max_hit, opr, atoi( rval ), mob );
---
>                       return mprog_veval( ( chkchar->hit * 100 ) / chkchar->max_hit, opr, atoi( rval ), mob );
958a1025,1049
>               if ( !str_cmp( chck, "indoors" ) )
>               {
>                       return ( ( IS_OUTSIDE( chkchar ) && chkchar->in_room->sector_type != SECT_INSIDE ) ? FALSE : TRUE );
>               }
>               if ( !str_cmp( chck, "nomagic" ) )
>               {
>                       return xIS_SET( chkchar->in_room->room_flags, ROOM_NO_MAGIC ) ? TRUE : FALSE;
>               }
>               if ( !str_cmp( chck, "safe" ) )
>               {
>                       return xIS_SET( chkchar->in_room->room_flags, ROOM_SAFE ) ? TRUE : FALSE;
>               }
> 
>               if ( !str_cmp( chck, "nosummon" ) )
>               {
>                       return xIS_SET( chkchar->in_room->room_flags, ROOM_NO_SUMMON ) ? TRUE : FALSE;
>               }
>               if ( !str_cmp( chck, "noastral" ) )
>               {
>                       return xIS_SET( chkchar->in_room->room_flags, ROOM_NO_ASTRAL ) ? TRUE : FALSE;
>               }
>               if ( !str_cmp( chck, "nosupplicate" ) )
>               {
>                       return xIS_SET( chkchar->in_room->room_flags, ROOM_NOSUPPLICATE ) ? TRUE : FALSE;
>               }
961c1052
<                       return IS_SET( chkchar->in_room->room_flags, ROOM_NO_RECALL ) ? TRUE : FALSE;
---
>                       return xIS_SET( chkchar->in_room->room_flags, ROOM_NO_RECALL ) ? TRUE : FALSE;
1003a1095,1113
>               if ( !str_cmp( chck, "areamulti" ) )
>               {
>                       CHAR_DATA *ch;
>                       int lhsvl = 0;
> 
>                       for ( ch = first_char; ch; ch = ch->next )
>                               if ( !IS_NPC( chkchar ) && !IS_NPC( ch )
>                                       && ch->in_room
>                                       && chkchar->in_room
>                                       && ch->in_room->area == chkchar->in_room->area
>                                       && ch->desc && chkchar->desc && QUICKMATCH( ch->desc->host, chkchar->desc->host ) )
>                                       lhsvl++;
>                       rhsvl = atoi( rval );
>                       if ( rhsvl < 0 )
>                               rhsvl = 0;
>                       if ( !*opr )
>                               strcpy( opr, "==" );
>                       return mprog_veval( lhsvl, opr, rhsvl, mob );
>               }
1182a1293,1361
> 
>               if ( !str_cmp( chck, "isflagged" ) )
>               {
>                       VARIABLE_DATA *vd;
>                       int vnum = mob->pIndexData->vnum;
>                       int flag = 0;
>                       char *p;
> 
>                       if ( argc < 3 )
>                       {
>                               return BERR;
>                       }
>                       if ( argc > 3 )
>                               flag = atoi( argv[3] );
>                       if ( ( p = strchr( argv[2], ':' ) ) != NULL )
>                       {
>                               *p++ = '\0';
>                               vnum = atoi( p );
>                       }
>                       if ( ( vd = get_tag( chkchar, argv[2], vnum ) ) == NULL )
>                               return FALSE;
> 
>                       flag = abs( flag ) % MAX_BITS;
>                       switch ( vd->type )
>                       {
>                               case vtSTR:
>                               case vtINT:
>                                       return FALSE;
>                               case vtXBIT:
>                                       return xIS_SET( *( EXT_BV * ) vd->data, flag ) ? TRUE : FALSE;
>                       }
>                       return FALSE;
>               }
> 
>               if ( !str_cmp( chck, "istagged" ) )
>               {
>                       VARIABLE_DATA *vd;
>                       int vnum = mob->pIndexData->vnum;
>                       char *p;
> 
>                       if ( argc < 3 )
>                       {
>                               return BERR;
>                       }
>                       if ( argc > 3 )
>                               vnum = atoi( argv[3] );
>                       if ( ( p = strchr( argv[2], ':' ) ) != NULL )
>                       {
>                               *p++ = '\0';
>                               vnum = atoi( p );
>                       }
>                       if ( ( vd = get_tag( chkchar, argv[2], vnum ) ) == NULL )
>                               return FALSE;
> 
>                       if ( !*opr && !*rval )
>                               return TRUE;
>                       switch ( vd->type )
>                       {
>                               case vtSTR:
>                                       return mprog_seval( vd->data, opr, rval, mob );
>                               case vtINT:
>                                       return mprog_veval( ( int ) vd->data, opr, atoi( rval ), mob );
>                               case vtXBIT:
>                                       return FALSE;   /* for now */
>                       }
>                       return FALSE;
>               }
> 
> 
1188a1368,1371
>               if ( !str_cmp( chck, "pkadrenalized" ) )
>               {
>                       return mprog_veval( get_timer( chkchar, TIMER_RECENTFIGHT ), opr, atoi( rval ), mob );
>               }
1335a1519,1525
>       if ( !str_cmp( chck, "inarea" ) )
>       {
>               if ( chkchar )
>                       return mprog_seval( chkchar->in_room->area->filename, opr, rval, mob );
>               return FALSE;
>       }
> 
1429c1619,1620
< void mprog_translate( char ch, char *t, CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, void *vo, CHAR_DATA * rndm )
---
> void mprog_translate( char ch, char *t, CHAR_DATA * mob, CHAR_DATA * actor,
>       OBJ_DATA * obj, CHAR_DATA * vict, OBJ_DATA * v_obj, CHAR_DATA * rndm )
1434,1435d1624
<       CHAR_DATA *vict = ( CHAR_DATA * ) vo;
<       OBJ_DATA *v_obj = ( OBJ_DATA * ) vo;
1437,1440c1626,1635
< /* Fix crash bug :)  SHADDAI */
<       if ( v_obj && v_obj->serial )
<               vict = NULL;
<       else
---
> // This is all moot now since the void *vo is goooone yay!
> // -- Alty
> #if 0
> /* Fix crash bug :)  SHADDAI
> if ( v_obj && v_obj->serial )
>   vict = NULL;
> else
>   v_obj = NULL; */
> 
>       if ( vict && vict->max_hit )    /* max_hit being a stat that can never be 0 */
1441a1637,1639
>       else
>               vict = NULL;
> #endif
1524c1722
<                                               strcat( t, " " );
---
> //       strcat( t, " " );
1559c1757
<                                               strcat( t, " " );
---
> //       strcat( t, " " );
1767c1965,1966
< void mprog_driver( char *com_list, CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, void *vo, bool single_step )
---
> void mprog_driver( char *com_list, CHAR_DATA * mob, CHAR_DATA * actor,
>       OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target, bool single_step )
1774a1974
>       int count2 = 0;
1778a1979,1981
>       MPSLEEP_DATA *mpsleep = NULL;
>       char arg[MAX_INPUT_LENGTH];
>       bool oldMPSilent;
1780,1781c1983,1984
<       if IS_AFFECTED
<               ( mob, AFF_CHARM ) return;
---
>       if ( IS_AFFECTED( mob, AFF_CHARM ) || IS_AFFECTED( mob, AFF_POSSESS ) )
>               return;
1839a2043,2061
> 
> /* mpsleep - Restore the environment -rkb */
>       if ( current_mpsleep )
>       {
>               ignorelevel = current_mpsleep->ignorelevel;
>               iflevel = current_mpsleep->iflevel;
> 
>               if ( single_step )
>                       mob->mpscriptpos = 0;
> 
>               for ( count = 0; count < MAX_IFS; count++ )
>               {
>                       for ( count2 = 0; count2 < DO_ELSE; count2++ )
>                               ifstate[count][count2] = current_mpsleep->ifstate[count][count2];
>               }
> 
>               current_mpsleep = NULL;
>       }
> 
1852a2075,2077
>       oldMPSilent = MPSilent;
>       MPSilent = FALSE;
> 
1878a2104,2170
>                       MPSilent = oldMPSilent;
>                       return;
>               }
> 
> /* mpsleep - Check if we should sleep -rkb */
>               if ( !str_prefix( "mpsleep", cmnd ) )
>               {
>                       CREATE( mpsleep, MPSLEEP_DATA, 1 );
> 
>                       /*
>                        * State variables 
>                        */
>                       mpsleep->ignorelevel = ignorelevel;
>                       mpsleep->iflevel = iflevel;
> 
>                       for ( count = 0; count < MAX_IFS; count++ )
>                       {
>                               for ( count2 = 0; count2 < DO_ELSE; count2++ )
>                               {
>                                       mpsleep->ifstate[count][count2] = ifstate[count][count2];
>                               }
>                       }
> 
>                       /*
>                        * Driver arguments 
>                        */
>                       mpsleep->com_list = STRALLOC( command_list );
>                       mpsleep->mob = mob;
>                       mpsleep->actor = actor;
>                       mpsleep->obj = obj;
>                       mpsleep->victim = victim;
>                       mpsleep->target = target;
>                       mpsleep->single_step = single_step;
> 
>                       /*
>                        * Time to sleep 
>                        */
>                       cmnd = one_argument( cmnd, arg );
>                       cmnd = one_argument( cmnd, arg );
>                       if ( arg[0] == '\0' )
>                               mpsleep->timer = 4;
>                       else
>                               mpsleep->timer = atoi( arg );
> 
>                       if ( mpsleep->timer < 1 )
>                       {
>                               progbug( "mpsleep - bad arg, using default", mob );
>                               mpsleep->timer = 4;
>                       }
> 
> /* Save type of prog, room, object or mob */
>                       if ( mpsleep->mob->pIndexData->vnum == 3 )
>                       {
>                               if ( !str_prefix( "Room", mpsleep->mob->description ) )
>                               {
>                                       mpsleep->type = MP_ROOM;
>                                       mpsleep->room = mpsleep->mob->in_room;
>                               }
>                               else if ( !str_prefix( "Object", mpsleep->mob->description ) )
>                                       mpsleep->type = MP_OBJ;
>                       }
>                       else
>                               mpsleep->type = MP_MOB;
> 
>                       LINK( mpsleep, first_mpsleep, last_mpsleep, next, prev );
>                       --prog_nest;
>                       MPSilent = oldMPSilent;
1885c2177
<               result = mprog_do_command( cmnd, mob, actor, obj, vo, rndm,
---
>               result = mprog_do_command( cmnd, mob, actor, obj, victim, target, rndm,
1895a2188
>                       MPSilent = oldMPSilent;
1927a2221
>                                       MPSilent = oldMPSilent;
1948a2243
>                                       MPSilent = oldMPSilent;
1966a2262
>                                       MPSilent = oldMPSilent;
1985a2282
>                                       MPSilent = oldMPSilent;
2008a2306
>                                       MPSilent = oldMPSilent;
2014a2313
>                                       MPSilent = oldMPSilent;
2039a2339
>                                       MPSilent = oldMPSilent;
2064a2365
>                                       MPSilent = oldMPSilent;
2077a2379
>                                       MPSilent = oldMPSilent;
2083a2386
>                                       MPSilent = oldMPSilent;
2093a2397
>                               MPSilent = oldMPSilent;
2098a2403
>       MPSilent = oldMPSilent;
2108c2413
<       OBJ_DATA * obj, void *vo, CHAR_DATA * rndm, bool ignore, bool ignore_ors )
---
>       OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target, CHAR_DATA * rndm, bool ignore, bool ignore_ors )
2133c2438
<                       validif = mprog_do_ifcheck( ifcheck, mob, actor, obj, vo, rndm );
---
>                       validif = mprog_do_ifcheck( ifcheck, mob, actor, obj, victim, target, rndm );
2153c2458
<                       validif = mprog_do_ifcheck( ifcheck, mob, actor, obj, vo, rndm );
---
>                       validif = mprog_do_ifcheck( ifcheck, mob, actor, obj, victim, target, rndm );
2193a2499,2504
>       if ( !str_cmp( firstword, "silent" ) )
>       {
>               MPSilent = TRUE;
>               cmnd = one_argument( cmnd, firstword );
>       }
> 
2209c2520
<               mprog_translate( *str, tmp, mob, actor, obj, vo, rndm );
---
>               mprog_translate( *str, tmp, mob, actor, obj, victim, target, rndm );
2218a2530,2531
>       MPSilent = FALSE;
> 
2235a2549,2617
> 
> /* See if there's any mud programs waiting to be continued -rkb */
> void mpsleep_update(  )
> {
>       MPSLEEP_DATA *mpsleep;
>       MPSLEEP_DATA *tmpMpsleep;
>       bool delete_it;
> 
>       mpsleep = first_mpsleep;
>       while ( mpsleep )
>       {
>               delete_it = FALSE;
> 
>               if ( mpsleep->mob )
>                       delete_it = char_died( mpsleep->mob );
> 
>               if ( mpsleep->actor && !delete_it )
>                       delete_it = char_died( mpsleep->actor );
> 
>               if ( mpsleep->obj && !delete_it )
>                       delete_it = obj_extracted( mpsleep->obj );
> 
>               if ( delete_it )
>               {
>                       log_string( "mpsleep_update - Deleting expired prog." );
> 
>                       tmpMpsleep = mpsleep;
>                       mpsleep = mpsleep->next;
>                       STRFREE( tmpMpsleep->com_list );
>                       UNLINK( tmpMpsleep, first_mpsleep, last_mpsleep, next, prev );
>                       DISPOSE( tmpMpsleep );
> 
>                       continue;
>               }
> 
>               mpsleep = mpsleep->next;
>       }
> 
>       mpsleep = first_mpsleep;
>       while ( mpsleep )       /* Find progs to continue */
>       {
>               if ( --mpsleep->timer <= 0 )
>               {
>                       current_mpsleep = mpsleep;
> 
>                       if ( mpsleep->type == MP_ROOM )
>                               rset_supermob( mpsleep->room );
>                       else if ( mpsleep->type == MP_OBJ )
>                               set_supermob( mpsleep->obj );
> 
>                       mprog_driver( mpsleep->com_list, mpsleep->mob, mpsleep->actor,
>                               mpsleep->obj, mpsleep->victim, mpsleep->target, mpsleep->single_step );
> 
>                       release_supermob(  );
> 
>                       tmpMpsleep = mpsleep;
>                       mpsleep = mpsleep->next;
>                       STRFREE( tmpMpsleep->com_list );
>                       UNLINK( tmpMpsleep, first_mpsleep, last_mpsleep, next, prev );
>                       DISPOSE( tmpMpsleep );
> 
>                       continue;
>               }
> 
>               mpsleep = mpsleep->next;
>       }
> }
> 
> 
2284c2666,2667
< void mprog_wordlist_check( char *arg, CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, void *vo, int type )
---
> bool mprog_wordlist_check( char *arg, CHAR_DATA * mob, CHAR_DATA * actor,
>       OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target, int type )
2295a2679,2680
>       bool executed = FALSE;
> 
2316c2701,2702
<                                               mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
---
>                                               mprog_driver( mprg->comlist, mob, actor, obj, victim, target, FALSE );
>                                               executed = TRUE;
2331c2717,2718
<                                                       mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
---
>                                                       mprog_driver( mprg->comlist, mob, actor, obj, victim, target, FALSE );
>                                                       executed = TRUE;
2339c2726
<       return;
---
>       return executed;
2343c2730,2732
< void mprog_percent_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, void *vo, int type )
---
> 
> void mprog_percent_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj,
>       CHAR_DATA * victim, OBJ_DATA * target, int type )
2350,2351c2739,2741
<                       mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
<                       if ( type != GREET_PROG && type != ALL_GREET_PROG )
---
>                       mprog_driver( mprg->comlist, mob, actor, obj, victim, target, FALSE );
>                       if ( type != GREET_PROG && type != ALL_GREET_PROG && type != LOGIN_PROG && type != VOID_PROG && type != GREET_IN_FIGHT_PROG )   /* added this line for login/void
>                                                                               * triggers */
2354d2743
< 
2356d2744
< 
2359c2747,2748
< void mprog_time_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, void *vo, int type )
---
> void mprog_time_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj,
>       CHAR_DATA * victim, OBJ_DATA * target, int type )
2378c2767
<                       mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
---
>                       mprog_driver( mprg->comlist, mob, actor, obj, victim, target, FALSE );
2407c2796,2797
< void mprog_act_trigger( char *buf, CHAR_DATA * mob, CHAR_DATA * ch, OBJ_DATA * obj, void *vo )
---
> void mprog_act_trigger( char *buf, CHAR_DATA * mob, CHAR_DATA * ch,
>       OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target )
2444c2834,2835
<               mob->mpact->vo = vo;
---
>               mob->mpact->victim = victim;
>               mob->mpact->target = target;
2455c2846
<       MPROG_DATA *mprg;
---
>       MPROG_DATA *mprg, *tprg = NULL;
2478,2479c2869,2875
<                               mprog_driver( mprg->comlist, mob, ch, obj, NULL, FALSE );
<                               break;
---
>                               if ( tprg )
>                               {
>                                       if ( atoi( tprg->arglist ) < atoi( mprg->arglist ) )
>                                               tprg = mprg;
>                               }
>                               else
>                                       tprg = mprg;
2480a2877,2880
> 
>               if ( tprg )
>                       mprog_driver( tprg->comlist, mob, ch, obj, NULL, NULL, FALSE );
> 
2492c2892
<               mprog_percent_check( mob, killer, NULL, NULL, DEATH_PROG );
---
>               mprog_percent_check( mob, killer, NULL, NULL, NULL, DEATH_PROG );
2498a2899,2954
> /* login and void mob triggers by Edmond */
> void mprog_login_trigger( CHAR_DATA * ch )
> {
>       CHAR_DATA *vmob, *vmob_next;
> 
> #ifdef DEBUG
>       char buf[MAX_STRING_LENGTH];
> 
>       sprintf( buf, "mprog_login_trigger -> %s", ch->name );
>       log_string( buf );
> #endif
> 
>       for ( vmob = ch->in_room->first_person; vmob; vmob = vmob_next )
>       {
>               vmob_next = vmob->next_in_room;
>               if ( !IS_NPC( vmob ) || !can_see( vmob, ch ) || vmob->fighting || !IS_AWAKE( vmob ) )
>                       continue;
> 
>               if ( IS_NPC( ch ) && ch->pIndexData == vmob->pIndexData )
>                       continue;
> 
>               if ( HAS_PROG( vmob->pIndexData, LOGIN_PROG ) )
>                       mprog_percent_check( vmob, ch, NULL, NULL, NULL, LOGIN_PROG );
>       }
>       return;
> 
> }
> 
> void mprog_void_trigger( CHAR_DATA * ch )
> {
>       CHAR_DATA *vmob, *vmob_next;
> 
> #ifdef DEBUG
>       char buf[MAX_STRING_LENGTH];
> 
>       sprintf( buf, "mprog_void_trigger -> %s", ch->name );
>       log_string( buf );
> #endif
> 
>       for ( vmob = ch->in_room->first_person; vmob; vmob = vmob_next )
>       {
>               vmob_next = vmob->next_in_room;
>               if ( !IS_NPC( vmob ) || !can_see( vmob, ch ) || vmob->fighting || !IS_AWAKE( vmob ) )
>                       continue;
> 
>               if ( IS_NPC( ch ) && ch->pIndexData == vmob->pIndexData )
>                       continue;
> 
>               if ( HAS_PROG( vmob->pIndexData, VOID_PROG ) )
>                       mprog_percent_check( vmob, ch, NULL, NULL, NULL, VOID_PROG );
>       }
>       return;
> }
> 
> 
> 
2502c2958
<               mprog_percent_check( mob, NULL, NULL, NULL, ENTRY_PROG );
---
>               mprog_percent_check( mob, NULL, NULL, NULL, NULL, ENTRY_PROG );
2510c2966
<               mprog_percent_check( mob, ch, NULL, NULL, FIGHT_PROG );
---
>               mprog_percent_check( mob, ch, NULL, NULL, NULL, FIGHT_PROG );
2535c2991,3022
<                               mprog_driver( mprg->comlist, mob, ch, obj, NULL, FALSE );
---
>                               mprog_driver( mprg->comlist, mob, ch, obj, NULL, NULL, FALSE );
>                               break;
>                       }
>               }
>       }
>       return;
> }
> 
> void mprog_sell_trigger( CHAR_DATA * mob, CHAR_DATA * ch, OBJ_DATA * obj )
> {
>       char buf[MAX_STRING_LENGTH];
>       int s_vnum;
>       MPROG_DATA *mprg;
> 
>       if ( IS_NPC( mob ) && can_see( mob, ch ) && HAS_PROG( mob->pIndexData, SELL_PROG ) )
>       {
> 
>               if ( IS_NPC( ch ) && ch->pIndexData == mob->pIndexData )
>                       return;
> 
>               for ( mprg = mob->pIndexData->mudprogs; mprg; mprg = mprg->next )
>               {
>                       one_argument( mprg->arglist, buf );
> 
>                       if ( !is_number( buf ) )
>                               continue;
> 
>                       s_vnum = atoi( buf );
> 
>                       if ( mprg->type == SELL_PROG && ( ( s_vnum == obj->pIndexData->vnum ) || ( s_vnum == 0 ) ) )
>                       {
>                               mprog_driver( mprg->comlist, mob, ch, obj, NULL, NULL, FALSE );
2542a3030,3039
> 
> /* Greet_progs holding an mpat command are executed twice.  The real problem
>    is the script engine ( an hack of another hack etc. itself ) does not
>    tolerate the script's owner moving to the end of the room's mob list.
>    The script engine would really use a rewrite from scratch.  Will be
>    scheduled for, say, autumn 2010. In the meantime this fix will suffice,
>    a room with more than 1024 scripted mobs should not be common :P - Luc 09/2000 */
> 
> #define MAX_MOB_ROOM 1024
> 
2545c3042,3045
<       CHAR_DATA *vmob, *vmob_next;
---
>       CHAR_DATA *vmob;
>       int cmob, mnum = 0;
>       EXTRACT_CHAR_DATA *deadmark, *epnt;
>       CHAR_DATA *script[MAX_MOB_ROOM];
2554c3054
<       for ( vmob = ch->in_room->first_person; vmob; vmob = vmob_next )
---
>       for ( vmob = ch->in_room->first_person; vmob && mnum < MAX_MOB_ROOM; vmob = vmob->next_in_room )
2556,2557c3056,3057
<               vmob_next = vmob->next_in_room;
<               if ( !IS_NPC( vmob ) || !can_see( vmob, ch ) || vmob->fighting || !IS_AWAKE( vmob ) )
---
>               if ( !IS_NPC( vmob ) || !can_see( vmob, ch )
>                       || ( vmob->fighting && !HAS_PROG( vmob->pIndexData, GREET_IN_FIGHT_PROG ) ) || !IS_AWAKE( vmob ) )
2559d3058
< 
2565a3065,3072
>               if ( HAS_PROG( vmob->pIndexData, GREET_PROG )
>                       || HAS_PROG( vmob->pIndexData, ALL_GREET_PROG ) || HAS_PROG( vmob->pIndexData, GREET_IN_FIGHT_PROG ) )
>                       script[mnum++] = vmob;
>       }
> 
>       if ( vmob && mnum == MAX_MOB_ROOM )
>       {
>               char msg[100];
2567,2570c3074,3075
<               if ( HAS_PROG( vmob->pIndexData, GREET_PROG ) )
<                       mprog_percent_check( vmob, ch, NULL, NULL, GREET_PROG );
<               else if ( HAS_PROG( vmob->pIndexData, ALL_GREET_PROG ) )
<                       mprog_percent_check( vmob, ch, NULL, NULL, ALL_GREET_PROG );
---
>               sprintf( msg, "Greet_prog: too many mobs in room %d.", ch->in_room->vnum );
>               log_string( msg );
2572d3076
<       return;
2573a3078,3093
>       deadmark = extracted_char_queue;
>       for ( cmob = 0; cmob < mnum; cmob++ )
>       {
>               vmob = script[cmob];
>               for ( epnt = extracted_char_queue; epnt != deadmark; epnt = epnt->next )
>                       if ( epnt->ch == vmob )
>                               break;
>               if ( epnt == deadmark )
>               {
>                       if ( vmob->fighting )
>                               mprog_percent_check( vmob, ch, NULL, NULL, NULL, GREET_IN_FIGHT_PROG );
>                       else
>                               mprog_percent_check( vmob, ch, NULL, NULL, NULL,
>                                       HAS_PROG( vmob->pIndexData, GREET_PROG ) ? GREET_PROG : ALL_GREET_PROG );
>               }
>       }
2575a3096
> 
2585c3106
<                               mprog_driver( mprg->comlist, mob, ch, NULL, NULL, FALSE );
---
>                               mprog_driver( mprg->comlist, mob, ch, NULL, NULL, NULL, FALSE );
2595c3116
<               mprog_percent_check( mob, NULL, NULL, NULL, RAND_PROG );
---
>               mprog_percent_check( mob, NULL, NULL, NULL, NULL, RAND_PROG );
2601c3122
<               mprog_time_check( mob, NULL, NULL, NULL, TIME_PROG );
---
>               mprog_time_check( mob, NULL, NULL, NULL, NULL, TIME_PROG );
2607c3128
<               mprog_time_check( mob, NULL, NULL, NULL, HOUR_PROG );
---
>               mprog_time_check( mob, NULL, NULL, NULL, NULL, HOUR_PROG );
2620c3141,3156
<                       mprog_wordlist_check( txt, vmob, actor, NULL, NULL, SPEECH_PROG );
---
>                       mprog_wordlist_check( txt, vmob, actor, NULL, NULL, NULL, SPEECH_PROG );
>               }
>       }
> }
> 
> void mprog_tell_trigger( char *txt, CHAR_DATA * actor )
> {
>       CHAR_DATA *vmob;
> 
>       for ( vmob = actor->in_room->first_person; vmob; vmob = vmob->next_in_room )
>       {
>               if ( IS_NPC( vmob ) && HAS_PROG( vmob->pIndexData, TELL_PROG ) )
>               {
>                       if ( IS_NPC( actor ) && actor->pIndexData == vmob->pIndexData )
>                               continue;
>                       mprog_wordlist_check( txt, vmob, actor, NULL, NULL, NULL, TELL_PROG );
2624a3161,3177
> bool mprog_command_trigger( CHAR_DATA * actor, char *txt )
> {
>       CHAR_DATA *vmob;
> 
>       for ( vmob = actor->in_room->first_person; vmob; vmob = vmob->next_in_room )
>       {
>               if ( IS_NPC( vmob ) && HAS_PROG( vmob->pIndexData, CMD_PROG ) )
>               {
>                       if ( IS_NPC( actor ) && actor->pIndexData == vmob->pIndexData )
>                               continue;
>                       if ( mprog_wordlist_check( txt, vmob, actor, NULL, NULL, NULL, CMD_PROG ) )
>                               return TRUE;
>               }
>       }
>       return FALSE;
> }
> 
2633c3186
<                               mprog_driver( mprg->comlist, mob, NULL, NULL, NULL, TRUE );
---
>                               mprog_driver( mprg->comlist, mob, NULL, NULL, NULL, NULL, TRUE );
2647c3200
<                                       mprog_driver( mprg->comlist, supermob, NULL, NULL, NULL, TRUE );
---
>                                       mprog_driver( mprg->comlist, supermob, NULL, NULL, NULL, NULL, TRUE );
2666c3219
<                                       mprog_driver( mprg->comlist, supermob, NULL, NULL, NULL, TRUE );
---
>                                       mprog_driver( mprg->comlist, supermob, NULL, NULL, NULL, NULL, TRUE );
2736c3289,3290
< bool oprog_percent_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, void *vo, int type )
---
> bool oprog_percent_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj,
>       CHAR_DATA * victim, OBJ_DATA * target, int type )
2745c3299
<                       mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
---
>                       mprog_driver( mprg->comlist, mob, actor, obj, victim, target, FALSE );
2765c3319
<       oprog_percent_check( supermob, ch, obj, NULL, ACT_PROG );
---
>       oprog_percent_check( supermob, ch, obj, NULL, NULL, ACT_PROG );
2782c3336
<                       oprog_percent_check( supermob, ch, vobj, NULL, GREET_PROG );
---
>                       oprog_percent_check( supermob, ch, vobj, NULL, NULL, GREET_PROG );
2796c3350
<                       oprog_wordlist_check( txt, supermob, ch, vobj, NULL, SPEECH_PROG, vobj );
---
>                       oprog_wordlist_check( txt, supermob, ch, vobj, NULL, NULL, SPEECH_PROG, vobj );
2800a3355,3370
> bool oprog_command_trigger( CHAR_DATA * ch, char *txt )
> {
>       OBJ_DATA *vobj;
> 
>       /*
>        * supermob is set and released in oprog_wordlist_check 
>        */
>       for ( vobj = ch->in_room->first_content; vobj; vobj = vobj->next_content )
>               if ( HAS_PROG( vobj->pIndexData, CMD_PROG ) )
>                       if ( oprog_wordlist_check( txt, supermob, ch, vobj, NULL, NULL, CMD_PROG, vobj ) )
>                               return TRUE;
> 
>       return FALSE;
> }
> 
> 
2811c3381
<               oprog_percent_check( supermob, NULL, obj, NULL, RAND_PROG );
---
>               oprog_percent_check( supermob, NULL, obj, NULL, NULL, RAND_PROG );
2825c3395
<               oprog_percent_check( supermob, ch, obj, NULL, WEAR_PROG );
---
>               oprog_percent_check( supermob, ch, obj, NULL, NULL, WEAR_PROG );
2839,2842c3409
<                       if ( vict )
<                               executed = oprog_percent_check( supermob, ch, obj, vict, USE_PROG );
<                       else
<                               executed = oprog_percent_check( supermob, ch, obj, targ, USE_PROG );
---
>                       executed = oprog_percent_check( supermob, ch, obj, vict, targ, USE_PROG );
2845c3412
<                       executed = oprog_percent_check( supermob, ch, obj, NULL, USE_PROG );
---
>                       executed = oprog_percent_check( supermob, ch, obj, NULL, NULL, USE_PROG );
2861c3428
<               oprog_percent_check( supermob, ch, obj, NULL, REMOVE_PROG );
---
>               oprog_percent_check( supermob, ch, obj, NULL, NULL, REMOVE_PROG );
2875c3442
<               oprog_percent_check( supermob, ch, obj, NULL, SAC_PROG );
---
>               oprog_percent_check( supermob, ch, obj, NULL, NULL, SAC_PROG );
2889c3456
<               oprog_percent_check( supermob, ch, obj, NULL, GET_PROG );
---
>               oprog_percent_check( supermob, ch, obj, NULL, NULL, GET_PROG );
2902c3469
<               oprog_percent_check( supermob, ch, obj, NULL, DAMAGE_PROG );
---
>               oprog_percent_check( supermob, ch, obj, NULL, NULL, DAMAGE_PROG );
2915c3482
<               oprog_percent_check( supermob, ch, obj, NULL, REPAIR_PROG );
---
>               oprog_percent_check( supermob, ch, obj, NULL, NULL, REPAIR_PROG );
2929c3496
<               oprog_percent_check( supermob, ch, obj, NULL, DROP_PROG );
---
>               oprog_percent_check( supermob, ch, obj, NULL, NULL, DROP_PROG );
2942c3509
<               oprog_percent_check( supermob, ch, obj, NULL, EXA_PROG );
---
>               oprog_percent_check( supermob, ch, obj, NULL, NULL, EXA_PROG );
2956c3523
<               oprog_percent_check( supermob, ch, obj, NULL, ZAP_PROG );
---
>               oprog_percent_check( supermob, ch, obj, NULL, NULL, ZAP_PROG );
2970c3537
<               oprog_percent_check( supermob, ch, obj, NULL, PULL_PROG );
---
>               oprog_percent_check( supermob, ch, obj, NULL, NULL, PULL_PROG );
2984c3551
<               oprog_percent_check( supermob, ch, obj, NULL, PUSH_PROG );
---
>               oprog_percent_check( supermob, ch, obj, NULL, NULL, PUSH_PROG );
2990c3557,3558
< void oprog_act_trigger( char *buf, OBJ_DATA * mobj, CHAR_DATA * ch, OBJ_DATA * obj, void *vo )
---
> void oprog_act_trigger( char *buf, OBJ_DATA * mobj, CHAR_DATA * ch,
>       OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target )
3006c3574,3575
<               mobj->mpact->vo = vo;
---
>               mobj->mpact->victim = victim;
>               mobj->mpact->target = target;
3012,3013c3581,3582
< void oprog_wordlist_check( char *arg, CHAR_DATA * mob, CHAR_DATA * actor,
<       OBJ_DATA * obj, void *vo, int type, OBJ_DATA * iobj )
---
> bool oprog_wordlist_check( char *arg, CHAR_DATA * mob, CHAR_DATA * actor,
>       OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target, int type, OBJ_DATA * iobj )
3023a3593,3594
>       bool executed = FALSE;
> 
3045c3616,3617
<                                               mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
---
>                                               mprog_driver( mprg->comlist, mob, actor, obj, victim, target, FALSE );
>                                               executed = TRUE;
3062c3634,3635
<                                                       mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
---
>                                                       mprog_driver( mprg->comlist, mob, actor, obj, victim, target, FALSE );
>                                                       executed = TRUE;
3071c3644
<       return;
---
>       return executed;
3108c3681,3682
< void rprog_percent_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, void *vo, int type )
---
> void rprog_percent_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj,
>       CHAR_DATA * victim, OBJ_DATA * target, int type )
3118c3692
<                       mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
---
>                       mprog_driver( mprg->comlist, mob, actor, obj, victim, target, FALSE );
3134c3708,3709
< void rprog_act_trigger( char *buf, ROOM_INDEX_DATA * room, CHAR_DATA * ch, OBJ_DATA * obj, void *vo )
---
> void rprog_act_trigger( char *buf, ROOM_INDEX_DATA * room, CHAR_DATA * ch,
>       OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target )
3150c3725,3726
<               room->mpact->vo = vo;
---
>               room->mpact->victim = victim;
>               room->mpact->target = target;
3166c3742
<               rprog_percent_check( supermob, ch, NULL, NULL, LEAVE_PROG );
---
>               rprog_percent_check( supermob, ch, NULL, NULL, NULL, LEAVE_PROG );
3170a3747,3766
> /* login and void room triggers by Edmond */
> void rprog_login_trigger( CHAR_DATA * ch )
> {
>       if ( HAS_PROG( ch->in_room, LOGIN_PROG ) )
>       {
>               rset_supermob( ch->in_room );
>               rprog_percent_check( supermob, ch, NULL, NULL, NULL, LOGIN_PROG );
>               release_supermob(  );
>       }
> }
> 
> void rprog_void_trigger( CHAR_DATA * ch )
> {
>       if ( HAS_PROG( ch->in_room, VOID_PROG ) )
>       {
>               rset_supermob( ch->in_room );
>               rprog_percent_check( supermob, ch, NULL, NULL, NULL, VOID_PROG );
>               release_supermob(  );
>       }
> }
3176c3772,3782
<               rprog_percent_check( supermob, ch, NULL, NULL, ENTER_PROG );
---
>               rprog_percent_check( supermob, ch, NULL, NULL, NULL, ENTER_PROG );
>               release_supermob(  );
>       }
> }
> 
> void rprog_imminfo_trigger( CHAR_DATA * ch )
> {
>       if ( HAS_PROG( ch->in_room, IMMINFO_PROG ) )
>       {
>               rset_supermob( ch->in_room );
>               rprog_percent_check( supermob, ch, NULL, NULL, NULL, IMMINFO_PROG );
3186c3792
<               rprog_percent_check( supermob, ch, NULL, NULL, SLEEP_PROG );
---
>               rprog_percent_check( supermob, ch, NULL, NULL, NULL, SLEEP_PROG );
3196c3802
<               rprog_percent_check( supermob, ch, NULL, NULL, REST_PROG );
---
>               rprog_percent_check( supermob, ch, NULL, NULL, NULL, REST_PROG );
3206c3812
<               rprog_percent_check( supermob, ch, NULL, NULL, RFIGHT_PROG );
---
>               rprog_percent_check( supermob, ch, NULL, NULL, NULL, RFIGHT_PROG );
3216c3822
<               rprog_percent_check( supermob, ch, NULL, NULL, RDEATH_PROG );
---
>               rprog_percent_check( supermob, ch, NULL, NULL, NULL, RDEATH_PROG );
3228c3834
<               rprog_wordlist_check( txt, supermob, ch, NULL, NULL, SPEECH_PROG, ch->in_room );
---
>               rprog_wordlist_check( txt, supermob, ch, NULL, NULL, NULL, SPEECH_PROG, ch->in_room );
3231a3838,3850
> bool rprog_command_trigger( CHAR_DATA * ch, char *txt )
> {
>       if ( HAS_PROG( ch->in_room, CMD_PROG ) )
>       {
>               /*
>                * supermob is set and released in rprog_wordlist_check 
>                */
>               if ( rprog_wordlist_check( txt, supermob, ch, NULL, NULL, NULL, CMD_PROG, ch->in_room ) )
>                       return TRUE;
>       }
>       return FALSE;
> }
> 
3237c3856
<               rprog_percent_check( supermob, ch, NULL, NULL, RAND_PROG );
---
>               rprog_percent_check( supermob, ch, NULL, NULL, NULL, RAND_PROG );
3242,3243c3861,3862
< void rprog_wordlist_check( char *arg, CHAR_DATA * mob, CHAR_DATA * actor,
<       OBJ_DATA * obj, void *vo, int type, ROOM_INDEX_DATA * room )
---
> bool rprog_wordlist_check( char *arg, CHAR_DATA * mob, CHAR_DATA * actor,
>       OBJ_DATA * obj, CHAR_DATA * victim, OBJ_DATA * target, int type, ROOM_INDEX_DATA * room )
3254a3874
>       bool executed = FALSE;
3279c3899,3900
<                                               mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
---
>                                               mprog_driver( mprg->comlist, mob, actor, obj, victim, target, FALSE );
>                                               executed = TRUE;
3296c3917,3918
<                                                       mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
---
>                                                       mprog_driver( mprg->comlist, mob, actor, obj, victim, target, FALSE );
>                                                       executed = TRUE;
3304c3926
<       return;
---
>       return executed;
3307c3929
< void rprog_time_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, void *vo, int type )
---
> void rprog_time_check( CHAR_DATA * mob, CHAR_DATA * actor, OBJ_DATA * obj, ROOM_INDEX_DATA * room, int type )
3309d3930
<       ROOM_INDEX_DATA *room = ( ROOM_INDEX_DATA * ) vo;
3327c3948
<                       mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
---
>                       mprog_driver( mprg->comlist, mob, actor, obj, NULL, NULL, FALSE );
3411c4032,4033
<                               rprog_wordlist_check( mpact->buf, supermob, mpact->ch, mpact->obj, mpact->vo, ACT_PROG, room );
---
>                               rprog_wordlist_check( mpact->buf, supermob, mpact->ch, mpact->obj,
>                                       mpact->victim, mpact->target, ACT_PROG, room );
3447c4069,4070
<                       oprog_wordlist_check( mpact->buf, supermob, mpact->ch, mpact->obj, mpact->vo, ACT_PROG, obj );
---
>                       oprog_wordlist_check( mpact->buf, supermob, mpact->ch, mpact->obj,
>                               mpact->victim, mpact->target, ACT_PROG, obj );