/*--------------------------------------------------------------------------* * ** WolfPaw 3.0 ** * *--------------------------------------------------------------------------* * WolfPaw 3.0 (c) 1997 - 1999 by Dale Corse * *--------------------------------------------------------------------------* * The WolfPaw Coding Team is headed by: Greywolf * * With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag * * Scryn, Thoric, Justice, Tricops and Brogar. * *--------------------------------------------------------------------------* * Based on SMAUG 1.2a. Copyright 1994 - 1996 by Derek Snider * * SMAUG Coding Team: Thoric, Altrag, Blodkai, Narn, Haus, Scryn, Rennard, * * Swordbearer, Gorog, Grishnakh and Tricops. * *--------------------------------------------------------------------------* * Merc 2.1 Diku MUD Improvments (C) 1992 - 1993 by Michael Chastain, * * Michael Quan, and Michael Tse. * * Original Diku MUD (C) 1990 - 1991 by Sebastian Hammer, Michael Seifert, * * Hans Hendrik Strfeldt, Tom Madsen, and Katja Nyboe. * *--------------------------------------------------------------------------* * Misc Functions Module * *--------------------------------------------------------------------------*/ #include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdarg.h> #include <string.h> #include <time.h> #include <unistd.h> #include <sys/stat.h> #include <sys/dir.h> #include "mud.h" char *get_multi_command args((DESCRIPTOR_DATA *d,char *argument)); void syspanic args( ( void ) ); void show_mode args( ( DESCRIPTOR_DATA *d ) ); void write_memlog_line args( ( char *log ) ); void do_sever( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj; ZONE_DATA *zone; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char("Who are you going to rip in half?\n\r",ch); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } zone = find_zone(1); if(victim == ch) { send_to_char("You reach your neck fine, but cant' get your ankles.\n\r",ch); return; } if ( !IS_NPC(victim) ) { if(IS_SET(victim->pcdata->flags,PCFLAG_SEVERED)) { send_to_char("They have no legs to rip off!!!\n\r",ch); return; } } else { if (IS_SET(victim->acttwo,ACT2_SEVERED) ) { send_to_char("They have no legs to rip off!!!\n\r",ch); return; } } if(!IS_NPC(victim)) act(AT_CARNAGE,"$n picks you up and rips you in half! Oh Shit!",ch,NULL,victim,TO_VICT); act(AT_CARNAGE,"$n picks up $N and savagly rips $S legs off!",ch,NULL,victim,TO_NOTVICT); send_to_char("You rip them in half! *Cackle*\n\r",ch); obj = create_object( get_obj_index(OBJ_VNUM_LEGS,1), 0,zone ); obj->timer = 5; if(IS_NPC(victim)) sprintf(buf,"A pair of %s's legs are here,twitching.",victim->short_descr); else sprintf(buf,"A pair of %s's legs are here, twitching.",victim->name); STRFREE(obj->description); obj->description = STRALLOC( buf ); if(IS_NPC(victim)) sprintf(buf,"A pair of %s's legs",victim->short_descr); else sprintf(buf,"A pair of %s's legs",victim->name); STRFREE(obj->short_descr); obj->short_descr = STRALLOC( buf ); obj_to_char(obj,ch); victim->hit = -30000; victim->position = POS_STUNNED; update_pos(victim); if ( !IS_NPC(victim) ) SET_BIT(victim->pcdata->flags, PCFLAG_SEVERED); else SET_BIT(victim->acttwo,ACT2_SEVERED); return; } char *get_multi_command( DESCRIPTOR_DATA *d, char *argument ) { int counter, counter2; char leftover[MAX_INPUT_LENGTH]; extern char command[MSL]; command[0] = '\0'; for ( counter = 0; argument[counter] != '\0'; counter++ ) { if ( argument[counter] == ';' && argument[counter+1] != ';' ) { command[counter] = '\0'; counter++; for (counter2 = 0; argument[counter] != '\0'; counter2++,counter++) leftover[counter2] = argument[counter]; leftover[counter2] = '\0'; strcpy( d->incomm,leftover ); return (command); } else if (argument[counter] == ';' && argument[counter+1] == ';') for (counter2 = counter; argument[counter2] != '\0'; counter2++) argument[counter2] = argument[counter2+1]; command[counter] = argument[counter]; } d->incomm[0] = '\0'; command[counter] = '\0'; return (command); } void do_beep ( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; if (IS_NPC(ch)) return; argument = one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Beep who?\n\r", ch ); return; } if ( !( victim = get_char_world( ch, arg ) ) ) { send_to_char( "They are not here.\n\r", ch ); return; } if ( IS_NPC(victim)) { send_to_char( "They are not beepable.\n\r", ch ); return; } sprintf( buf, "\aYou beep %s.\n\r", victim->name ); send_to_char( buf, ch ); sprintf( buf, "\a%s has beeped you.\n\r", ch->name ); send_to_char( buf, victim ); return; } /* * Command used to test sections of the code that cannot be tested * in the usual running system enviroment --GW * make an arg, and setup the enviroment you need to test it. */ void do_test ( CHAR_DATA *ch, char *argument ) { char arg[MIL]; CHAR_DATA *victim=NULL; argument = one_argument( argument, arg ); if ( !str_cmp( arg, "syspanic" ) ) { syspanic( ); return; } if ( !str_cmp( arg, "crashgame" ) ) { send_to_char("blah",victim); victim->pcdata->flags = 1285; } if ( !str_cmp( arg, "dragondrop" ) ) { extern bool DRAGONS_RAN; extern bool FORCE_DRAGON_RUN; send_to_char("Testing Dragon Drop..\n\r",ch); FORCE_DRAGON_RUN = TRUE; DRAGONS_RAN = FALSE; dragon_update( ); FORCE_DRAGON_RUN = FALSE; return; } send_to_char("Not a Valid Choice, Current Choices are:\n\r",ch); send_to_char("syspanic - test the system panic code\n\r",ch); send_to_char("crashgame - crash the game\n\r",ch); send_to_char("\n\rWARNING: This command is only to be used by those who\n\r",ch); send_to_char("KNOW what these things do! --GW\n\r",ch); return; } bool is_ignoring(CHAR_DATA *ch, CHAR_DATA *victim) { int pos; if ( IS_NPC( ch ) || IS_NPC( victim ) ) return FALSE; if ( !ch || !victim ) return FALSE; if ( !ch->pcdata->ignore ) return FALSE; for (pos = 0; pos < MAX_IGNORE; pos++) { if ( !ch->pcdata->ignore[pos] ) break; if (!str_cmp(ch->pcdata->ignore[pos], victim->name)) return TRUE; } return FALSE; } void do_ignore(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim, *rch; char arg[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH]; int pos; one_argument(argument, arg); rch = ch; if (IS_NPC(rch)) return; if (arg[0] == '\0') { if ( rch->pcdata->ignore[0] == NULL ) { send_to_char("You arn't Ignoring anyone.\n\r",rch); return; } send_to_char("You are Ignroing:\n\r",rch); for (pos = 0; pos < MAX_IGNORE; pos++) { if (rch->pcdata->ignore[pos] == NULL) break; ch_printf(ch,"%s\n",capitalize(rch->pcdata->ignore[pos]) ); } send_to_char("\n\r",rch); return; } if ((victim = get_char_world(rch, argument)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("Ignore a mob? I don't think so.\n\r", ch); return; } if (ch == victim) { send_to_char("I don't think you really want to ignore yourself.\n\r",ch); return; } if ( IS_IMMORTAL(victim) ) { send_to_char("You cannot Ignore Immortals.\n\r",ch); return; } for (pos = 0; pos < MAX_IGNORE; pos++) { if (rch->pcdata->ignore[pos] == NULL) break; if (!str_cmp(victim->name, rch->pcdata->ignore[pos])) { STRFREE(rch->pcdata->ignore[pos]); rch->pcdata->ignore[pos] = NULL; sprintf(buf, "You stop ignoring %s.\n\r", victim->name); send_to_char(buf, ch); sprintf(buf, "%s stops ignoring you.\n\r", ch->name); send_to_char(buf, victim); return; } } if (pos >= MAX_IGNORE) { send_to_char("You can't ignore anymore people\n\r", ch); return; } rch->pcdata->ignore[pos] = STRALLOC(victim->name); sprintf(buf, "You now ignore %s.\n\r", victim->name); send_to_char(buf, ch); sprintf(buf, "%s ignores you.\n\r", ch->name); send_to_char(buf, victim); return; } /* * Write the Game Status to a Descriptor .. for the Menu --GW */ void show_mode( DESCRIPTOR_DATA *d ) { char buf[MSL]; char buf2[MSL]; bool fMatch = FALSE; extern bool EMAIL_AUTH; extern bool wizlock; extern bool ENABLE_DEATH_CRY; if ( !d ) return; if ( IS_NPC(d->character) ) return; if ( mudarg_scan('B') ) { set_char_color( AT_PLAIN,d->character); sprintf(buf,"\n\nPoints of Contact for this Port:\n\r"); write_to_buffer(d,buf,0); sprintf(buf,"================================\n\r"); write_to_buffer(d,buf,0); sprintf(buf,"Build Port Administrators: %s %s\n\r","Greywolf","Silvermoon"); write_to_buffer(d,buf,0); sprintf(buf,"Assigned Head Builders: %s\n\r","<NONE!?!>"); write_to_buffer(d,buf,0); } set_char_color( AT_PLAIN,d->character); strcpy(buf,"\nCurrent Game Settings:\n"); strcat(buf,"----------------------\n"); if ( chaos == 1 ) { sprintf(buf2,"[%s] Chaos Mode\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( doubleexp == 1 ) { sprintf(buf2,"[%s] Double Experiance Mode\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( war == 1 ) { sprintf(buf2,"[%s] War Mode\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( TURBO_FIGHT == TRUE ) { sprintf(buf2,"[%s] Turbo Fighting Mode\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( IS_SET( kombat->bits, KOMBAT_ON ) ) { sprintf(buf2,"[%s] Mortal Kombat Mode\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( noenforce == TRUE ) { sprintf(buf2,"[%s] In Town Law Enforcement Disabled\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( !sysdata.NO_NAME_RESOLVING ) { sprintf(buf2,"[%s] Hostname Resolving Enabled\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( WEBSERVER_STATUS == FALSE ) { sprintf(buf2,"[%s] Webserver Offline\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( !TOPTEN_ACTIVE ) { sprintf(buf2,"[%s] TonTen Disabled\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( !DRAGON_DROP ) { sprintf(buf2,"[%s] Dragon Drop Disbaled\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( CTF_ACTIVE ) { sprintf(buf2,"[%s] CTF Mode\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( EMAIL_AUTH ) { sprintf(buf2,"[%s] Email Authorization Enabled\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( mudarg_scan('L') ) { sprintf(buf2,"[%s] Limit Scan Disabled\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( mudarg_scan('B') ) { sprintf(buf2,"[%s] Game Configured as a Building Port\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( mudarg_scan('I') ) { sprintf(buf2,"[%s] Inter-MUD Chat offline\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( wizlock ) { sprintf(buf2,"[%s] Wizlock Enabled\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( !ENABLE_DEATH_CRY ) { sprintf(buf2,"[%s] Death Cry Disabled\n","Mud"); strcat(buf,buf2); fMatch = TRUE; } if ( !fMatch ) strcat(buf,"Default Game Mode\n"); strcat(buf,"\n\r"); write_to_buffer(d,buf,0); return; } /* * Used for Signing things .. */ void do_sign( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; char arg[MIL]; char buf[MSL]; buf[0] = '\0'; one_argument( argument, arg ); if ( IS_NPC(ch) ) return; obj = get_obj_list( ch, arg, ch->in_room->first_content ); if ( !obj || (obj->in_room->vnum != ch->in_room->vnum) ) { act( AT_PLAIN, "I see nothing signable here.", ch, NULL,NULL,TO_CHAR ); return; } if (obj->item_type != ITEM_PK_BOOK ) { send_to_char("I see nothing signable here..\n\r",ch); return; } else { act( AT_BLOOD,"$n signs $s name in blood! $n is now a Player Killer!",ch,NULL,NULL,TO_ROOM); act( AT_BLOOD,"You sign your name in the Book of Blood.",ch,NULL,NULL,TO_CHAR); SET_BIT( ch->pcdata->flags, PCFLAG_DEADLY ); SET_BIT( ch->pcdata->flagstwo, MOREPC_SIGNEDPKILL ); act( AT_BLOOD,"You are now a Player Killer!",ch,NULL,NULL,TO_CHAR); do_save(ch,""); sprintf(buf,"&w[&WFRESH MEAT&w]&R%s &wSigned the Book of Blood!",capitalize(ch->name)); echo_to_all(AT_PLAIN,buf,ECHOTAR_ALL); return; } } void send_system_busy_message( DESCRIPTOR_DATA *d ) { bool system_busy = FALSE; char buf[MSL]; if ( !system_busy ) return; sprintf( buf, "/n/r" "**************************************************************\n\r" "*** The System Is Currently Busy Doing Bootup Tasks ***\n\r" "**************************************************************\n\r" "**************************************************************\n\r" "*********************** PLEASE WAIT **************************\n\r" "**************************************************************\n\r" "**************************************************************\n\r" "\n\r"); return; } /* * Writes a Line to the MemLog, keeps tabs on how many lines * have been written, and flips over when needed --GW */ void write_memlog_line( char *log ) { FILE *fp; extern sh_int MemLogCount; extern sh_int MemLogMax; if ( MemLogCount < MemLogMax ) /* Not At Maximum */ { if ( ( fp=fopen( MEMLOG_FILE, "a" ) )==NULL ) { bug("UnAble to Open %s",MEMLOG_FILE); perror(MEMLOG_FILE); return; } MemLogCount++; fprintf( fp, log ); new_fclose(fp); } else /* flip and Write */ { MemLogCount = 0; if ( ( fp=fopen( MEMLOG_FILE, "w" ) )==NULL ) { bug("UnAble to Open %s",MEMLOG_FILE); perror(MEMLOG_FILE); return; } fprintf( fp, log ); new_fclose(fp); } return; } /* * Writes a Line to the RoomLog, keeps tabs on how many lines * have been written, and flips over when needed --GW * ADDED: accepts ags like sprintf does (vsprintf) Nov. 09/99 --GW */ void roomlog( char *log, ... ) { FILE *fp; extern sh_int RoomLogCount; extern sh_int RoomLogMax; char buf[MSL]; if ( RoomLogCount < RoomLogMax ) /* Not At Maximum */ { if ( ( fp=fopen( ROOMLOG_FILE, "a" ) )==NULL ) { bug("UnAble to Open %s",ROOMLOG_FILE); perror(ROOMLOG_FILE); return; } buf[0] = '\0'; { va_list param; va_start(param, log); vsprintf( buf + strlen(buf), log, param ); va_end(param); } RoomLogCount++; fprintf( fp, buf ); new_fclose(fp); } else /* flip and Write */ { RoomLogCount = 0; if ( ( fp=fopen( ROOMLOG_FILE, "w" ) )==NULL ) { bug("UnAble to Open %s",ROOMLOG_FILE); perror(ROOMLOG_FILE); return; } buf[0] = '\0'; { va_list param; va_start(param, log); vsprintf( buf + strlen(buf), log, param ); va_end(param); } fprintf( fp, buf ); new_fclose(fp); } return; } /* * Set the System Message --GW * this is to announce things .. cause no one reads MOTD's */ void do_sysmessage( CHAR_DATA *ch, char *argument ) { return; } /* Show it to the person --GW */ void show_sys_message( void ) { return; } /* Loading and Saving the Messages --GW */ void load_system_messages( void ) { return; } void save_system_messages( void ) { return; } void info ( char *txt ) { char buf[MSL]; DESCRIPTOR_DATA *d; sprintf(buf,"&B[&WINFO&B]&W %s\n\r", txt ); for( d = first_descriptor; d; d = d->next ) { if ( d->connected == CON_PLAYING && !IS_SET( d->character->pcdata->deaf, CHANNEL_INFO ) ) send_to_char_color( buf,d->character); } return; } /* * Mortal Command -- Allows you to set text BEFORE your name --GW */ void do_mname( CHAR_DATA *ch, char *argument ) { if ( IS_NPC(ch) ) return; if ( IS_SET( ch->pcdata->flags, PCFLAG_NOTITLE ) ) { send_to_char("The Gods Prohibit you from setting this!\n\r",ch); return; } if ( argument[0] == '\0' ) { REMOVE_BIT( ch->pcdata->flagstwo, MOREPC_NAME_SET); send_to_char("Pre-name turned off.\n\r",ch); return; } while(isspace(*argument)) argument++; if ( argument[0] == '\0' ) return; if ( ch->pcdata->name ) STRFREE( ch->pcdata->name ); SET_BIT( ch->pcdata->flagstwo, MOREPC_NAME_SET); ch->pcdata->name = STRALLOC(argument); send_to_char( "Pre-name turned on and set.\n\r",ch); return; } void show_version( CHAR_DATA *ch ) { extern char MUD_VERSION[MSL]; ch_printf(ch, "Currently Running: %s\n\r",MUD_VERSION ); return; } void show_boot_and_compile( CHAR_DATA *ch ) { extern char BOOTED_BY[MSL]; extern char BOOT_TIME[MSL]; extern char COMPILED_BY[MSL]; extern char COMPILED_TIME[MSL]; ch_printf(ch, "Booted by: %s", BOOTED_BY ); ch_printf(ch, "Boot Time: %s", BOOT_TIME ); ch_printf(ch, "Compiled by: %s", COMPILED_BY ); ch_printf(ch, "Compile Time: %s", COMPILED_TIME ); return; } /* Area Maps.. --GW */ void do_map( CHAR_DATA *ch, char *argument ) { char buf[MSL]; FILE *fp; if ( IS_NPC(ch) ) return; if ( ch->in_room && ch->in_room->area && ch->in_room->area->map_file ) { if ( ch->in_room->area->map_file == NULL || !str_cmp(ch->in_room->area->map_file, "None") ) { send_to_char("Hrmm.. You can't seem to find a Map for this place....\n\r",ch); return; } sprintf(buf,"%s%s",MAP_DIR,ch->in_room->area->map_file); if ( (fp=fopen(buf,"r"))==NULL) { send_to_char("Hrmm.. You can't seem to find a Map for this place....\n\r",ch); bug("do_map: filename specified does not exist! (%s)",ch->in_room->area->filename); return; } new_fclose(fp); show_file(ch,buf); return; } send_to_char("Hrmm.. You can't seem to find a Map for this place....\n\r",ch); return; }