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 );