/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * MudProgs has been completely rewritten by Zane. The only thing that * * remains the same is how triggers are handled. -Zane * * * * Original MobProgs by N'Atas-ha. * ***************************************************************************/ #include <sys/types.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include "merc.h" #include "mud_progs.h" extern void parse_command_var( char var, char *outbuf ); /* * MudProgs Command table. * * Format: { <proc name>, <proc pointer>, <arg type> }, * * Argtype can be one of: * * 'C' - Character Pointer (CHAR_DATA *) * 'O' - Object Pointer (OBJ_DATA *) * 'I' - Numeric Value * 'S' - String (char *) * 'N' - No args * * Execproc guarantees that the proper argument type is passed to avoid * crashes. If you specify the wrong argtype here and expect a different argtype * in your proc then you will crash. All arguments passed to these procs are of * type (void *) and need to be cast to the proper type before used. * * -Zane */ const struct mprog_cmd_type mprog_cmd_table[] = { {"alignment", mprog_alignment, 'C'}, {"clan", mprog_clan, 'C'}, {"class", mprog_class, 'C'}, {"crimethief", mprog_crimethief, 'C'}, {"fightinroom", mprog_fightinroom, 'N'}, {"getrand", mprog_getrand, 'I'}, {"goldamount", mprog_goldamount, 'C'}, {"hasmemory", mprog_hasmemory, 'N'}, {"hitpercent", mprog_hitpercent, 'C'}, {"hour", mprog_hour, 'N'}, {"immune", mprog_immune, 'C'}, {"isawake", mprog_isawake, 'C'}, {"ischarmed", mprog_ischarmed, 'C'}, {"isfight", mprog_isfight, 'C'}, {"isfollow", mprog_isfollow, 'C'}, {"isimmort", mprog_isimmort, 'C'}, {"isgood", mprog_isgood, 'C'}, {"isname", mprog_isname, 'S'}, {"isnpc", mprog_isnpc, 'C'}, {"ispc", mprog_ispc, 'C'}, {"level", mprog_level, 'C'}, {"memory", mprog_memory, 'C'}, {"mobvnum", mprog_mobvnum, 'C'}, {"objtype", mprog_objtype, 'O'}, {"objval0", mprog_objval0, 'O'}, {"objval1", mprog_objval1, 'O'}, {"objval2", mprog_objval2, 'O'}, {"objval3", mprog_objval3, 'O'}, {"objvnum", mprog_objvnum, 'O'}, {"position", mprog_position, 'C'}, {"rand", mprog_rand, 'I'}, {"roomvnum", mprog_roomvnum, 'N'}, {"sex", mprog_sex, 'C'}, {"sgetrand", mprog_sgetrand, 'I'}, {"sreset", mprog_sreset, 'N'}, {"faction", mprog_faction, 'S'}, {"isequal", mprog_isequal, 'S'}, /* * End of list. */ {"", 0, 0,} }; int mprog_alignment( void *vo ) { if ( !vo ) return FALSE; return ( ( CHAR_DATA * ) vo )->alignment; } int mprog_clan( void *vo ) { CHAR_DATA *ch = ( CHAR_DATA * ) vo; if ( !ch ) return FALSE; if ( IS_NPC( ch ) ) return FALSE; return ch->pcdata->clan; } int mprog_class( void *vo ) { if ( !vo ) return FALSE; return ( ( CHAR_DATA * ) vo )->Class; } int mprog_crimethief( void *vo ) { if ( !vo ) return FALSE; return IS_SET( ( ( CHAR_DATA * ) vo )->act, PLR_THIEF ); } int mprog_fightinroom( void *vo ) { CHAR_DATA *ch; if ( !ProgSource->in_room ) return FALSE; for ( ch = ProgSource->in_room->people; ch; ch = ch->next_in_room ) if ( ch->fighting ) return TRUE; return FALSE; } int mprog_getrand( void *vo ) { if ( !vo ) return FALSE; return number_range( 1, *( ( int * ) vo ) ); } int mprog_goldamount( void *vo ) { if ( !vo ) return FALSE; return ( ( CHAR_DATA * ) vo )->gold; } int mprog_hasmemory( void *vo ) { if ( ProgSource->memory ) return TRUE; else return FALSE; } int mprog_hitpercent( void *vo ) { CHAR_DATA *ch = ( CHAR_DATA * ) vo; if ( !vo ) return FALSE; return ( ch->hit / ch->max_hit ) * 100; } int mprog_hour( void *vo ) { return time_info.hour; } int mprog_immune( void *vo ) { if ( !vo ) return FALSE; return check_immune( ( CHAR_DATA * ) vo, attack_table[ProgObjectSource->value[3]].damage ); } int mprog_isawake( void *vo ) { if ( !vo ) return FALSE; return IS_AWAKE( ( ( CHAR_DATA * ) vo ) ); } int mprog_ischarmed( void *vo ) { if ( !vo ) return FALSE; return IS_SET( ( ( CHAR_DATA * ) vo )->affected_by, AFF_CHARM ); } int mprog_isfight( void *vo ) { if ( !vo ) return FALSE; if ( ( ( CHAR_DATA * ) vo )->fighting ) return TRUE; return FALSE; } int mprog_isfollow( void *vo ) { CHAR_DATA *ch = ( CHAR_DATA * ) vo; if ( !vo ) return FALSE; return ( ch->master != NULL && ch->master->in_room == ch->in_room ); } int mprog_isimmort( void *vo ) { if ( !vo ) return FALSE; return ( get_trust( ( CHAR_DATA * ) vo ) >= LEVEL_IMMORTAL ); } int mprog_isgood( void *vo ) { if ( !vo ) return FALSE; return IS_GOOD( ( ( CHAR_DATA * ) vo ) ); } int mprog_isnpc( void *vo ) { if ( !vo ) return FALSE; return ( IS_NPC( ( CHAR_DATA * ) vo ) ); } int mprog_ispc( void *vo ) { if ( !vo ) return FALSE; return ( !IS_NPC( ( CHAR_DATA * ) vo ) ); } int mprog_level( void *vo ) { if ( !vo ) return FALSE; return ( ( CHAR_DATA * ) vo )->level; } int mprog_memory( void *vo ) { if ( !vo ) return FALSE; if ( !ProgSource->memory || ProgSource->memory == ProgSource ) return FALSE; return ( ProgSource->memory == vo ); } int mprog_mobvnum( void *vo ) { CHAR_DATA *ch = ( CHAR_DATA * ) vo; if ( !vo ) return FALSE; if ( IS_NPC( ch ) ) return ch->pIndexData->vnum; return FALSE; } int mprog_objvnum( void *vo ) { OBJ_DATA *obj = ( OBJ_DATA * ) vo; if ( !vo ) return FALSE; return obj->pIndexData->vnum; } int mprog_objtype( void *vo ) { if ( !vo ) return FALSE; return ( ( OBJ_DATA * ) vo )->item_type; } int mprog_objval0( void *vo ) { if ( !vo ) return FALSE; return ( ( OBJ_DATA * ) vo )->value[0]; } int mprog_objval1( void *vo ) { if ( !vo ) return FALSE; return ( ( OBJ_DATA * ) vo )->value[1]; } int mprog_objval2( void *vo ) { if ( !vo ) return FALSE; return ( ( OBJ_DATA * ) vo )->value[2]; } int mprog_objval3( void *vo ) { if ( !vo ) return FALSE; return ( ( OBJ_DATA * ) vo )->value[3]; } int mprog_position( void *vo ) { if ( !vo ) return FALSE; return ( ( CHAR_DATA * ) vo )->position; } int mprog_rand( void *vo ) { if ( !vo ) return FALSE; return ( number_percent( ) <= *( ( int * ) vo ) ); } int mprog_roomvnum( void *vo ) { if ( !ProgSource->in_room ) return FALSE; return ProgSource->in_room->vnum; } int mprog_sex( void *vo ) { if ( !vo ) return FALSE; return ( ( CHAR_DATA * ) vo )->sex; } int mprog_sgetrand( void *vo ) { static int lastarg = 0; static int lastrand = 0; static int lastprogid = 0; int arg = *( ( int * ) vo ); if ( !vo ) return FALSE; if ( arg != lastarg || lastprogid != ExecMudProgID ) { lastrand = number_range( 1, arg ); lastprogid = ExecMudProgID; lastarg = arg; } return lastrand; } int mprog_sreset( void *vo ) { ExecMudProgID++; return TRUE; } int mprog_isequal( void *vo ) { char *argument = ( char * ) vo; char left[MAX_INPUT_LENGTH]; char *right; if ( argument == NULL ) return FALSE; /* The left argument must be a variable... */ if ( *argument == '$' ) parse_command_var( *( ++argument ), left ); else return FALSE; /* The right argument should be a string... */ strtok( argument, "," ); right = strtok( NULL, "," ); #ifdef WIN32 return !stricmp( left, right ); #else return !strcasecmp( left, right ); #endif } int mprog_faction( void *vo ) { FACTIONLIST_DATA *pFact; FACTIONPC_DATA *pFactPC; CHAR_DATA *victim; char *argument = ( char * ) vo; int vnum; if ( *argument == '$' ) { victim = mprog_get_actor( strtok( argument, "," ), 'C' ); if ( !victim ) { bug( "mprog_faction: Couldn't find victim %s", argument ); return 0; } } else { victim = get_char_world( ProgSource, strtok( argument, "," ) ); if ( !victim ) { bug( "mprog_faction: Couldn't find victim %s", argument ); return 0; } } argument += strlen( argument ) + 1; if ( !is_number( argument ) ) { bug( "mprog_faction: bad argument syntax '%s'.", argument ); return 0; } vnum = atoi( argument ); if ( IS_NPC( victim ) ) return 0; pFact = get_faction_by_vnum( ( sh_int ) vnum ); if ( !pFact ) { bug( "mprog_faction: No such faction vnum %s", argument ); return 0; } for ( pFactPC = victim->pcdata->faction_standings; pFactPC != NULL; pFactPC = pFactPC->next ) { if ( pFactPC->faction == pFact ) break; } if ( !pFactPC ) { return CFG_FACTION_INITIAL_VALUE; } return pFactPC->value; } int mprog_isname( void *vo ) { CHAR_DATA *victim; char *argument = ( char * ) vo; if ( *argument == '$' ) { victim = mprog_get_actor( strtok( argument, "," ), 'C' ); if ( !victim ) { bug( "mprog_isname: Couldn't find victim %s", argument ); return 0; } } else { victim = get_char_world( ProgSource, strtok( argument, "," ) ); if ( !victim ) { bug( "mprog_isname: Couldn't find victim %s", argument ); return 0; } } argument += strlen( argument ) + 1; if ( !( *argument ) ) { bug( "mprog_isname: Bad argument syntax." ); return 0; } return is_name( argument, victim->name ); }