/*~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- ~ 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. ~ ~ ~ ~ Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley ~ ~ ACK!MUD is modified Merc2.0/2.1/2.2 code (c)Stephen Zepp 1998 Ver: 4.3 ~ ~ Test ~ ~ 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', and the Ack!Mud license in 'ack_license.txt'.~ ~ In particular, you may not remove any of these copyright notices. ~ ~ ~ ~ _______ _____ ~ ~ / __ /\ / ___ \ 222222 PA_MUD by Amnon Kruvi ~ ~ /______/ / / /___\ \ 2 PA_MUD is modified ~ ~ / _______/ / _______ \ 2 Ack!Mud, v4.3 ~ ~ /_/ /_/ \_\ 2 ~ ~ 2 ~ ~ 2222222 ~ ~ ~ ~ ~ ~ Years of work have been invested to create DIKU, Merc, Ack and PA. ~ ~ Please show your respect by following the licenses, and issuing ~ ~ credits where due. ~ ~ ~ ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-*/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h> #include "ack.h" #include "tables.h" #include "cursor.h" #include <math.h> #include "mapper.h" char * const where_name [] = { "@@GH@@re@@Wa@@rd@@e: ", "@@GE@@ry@@We@@rs@@e: ", "@@GF@@ra@@Wc@@re@@e: ", "@@GS@@rho@@Wuld@@rer@@Gs@@e: ", "@@GA@@rr@@Wm@@rs@@e: ", /* 15 */ "@@GH@@re@@Wl@@rd@@d-> @@aLeft@@e: ", "@@GH@@re@@Wl@@rd@@d-> @@aRight@@e: ", "@@GW@@ra@@Wi@@rs@@Gt@@e: ", /* 25 */ "@@GB@@ro@@Wd@@ry@@e: ", "@@GL@@re@@Wg@@rs@@e: ", /* 30 */ "@@GF@@re@@We@@rt@@e: ", }; /* * Local functions. */ char * format_obj_to_char args( ( OBJ_DATA *obj, CHAR_DATA *ch, bool fShort ) ); void show_list_to_char args( ( OBJ_DATA *list, CHAR_DATA *ch, bool fShort, bool fShowNothing ) ); void show_char_to_char_0 args( ( CHAR_DATA *victim, CHAR_DATA *ch, bool truncate ) ); void show_char_to_char_1 args( ( CHAR_DATA *victim, CHAR_DATA *ch ) ); void show_char_to_char args( ( CHAR_DATA *list, CHAR_DATA *ch ) ); void r_help args( ( CHAR_DATA *ch, int i ) ); char *format_obj_to_char( OBJ_DATA *obj, CHAR_DATA *ch, bool fShort ) { static char buf[MAX_STRING_LENGTH]; sprintf( buf, "%s", color_string( ch, "objects" ) ); if ( obj->pIndexData->image && ch->desc->mxp && IS_SET(ch->config,CONFIG_IMAGE) ) { char buf1[MAX_STRING_LENGTH]; sprintf( buf1, "\e[1z" ); sprintf( buf1+strlen(buf1), MXPTAG(ch->desc,"IMAGE %s ALIGN=Bottom"), obj->pIndexData->image ); sprintf( buf1+strlen(buf1), " " ); safe_strcat(MAX_STRING_LENGTH, buf, buf1 ); } if ( fShort ) { if ( obj->short_descr != NULL ) safe_strcat(MAX_STRING_LENGTH, buf, capitalize(obj->short_descr) ); } else { if ( obj->description != NULL ) safe_strcat(MAX_STRING_LENGTH, buf, obj->description ); } safe_strcat( MAX_STRING_LENGTH, buf, color_string( ch, "normal" ) ); return buf; } /* * Show a list to a character. * Can coalesce duplicated items. */ void show_list_to_char( OBJ_DATA *list, CHAR_DATA *ch, bool fShort, bool fShowNothing ) { char buf[MAX_STRING_LENGTH]; char **prgpstrShow; int *prgnShow; char *pstrShow; OBJ_DATA *obj; int nShow; int iShow; int count; bool fCombine; if ( ch->desc == NULL ) return; buf[0] = '\0'; /* * Alloc space for output lines. */ count = 0; for ( obj = list; obj != NULL; obj = obj->next_in_carry_list ) count++; prgpstrShow = qgetmem( count * sizeof(char *) ); prgnShow = qgetmem( count * sizeof(int) ); nShow = 0; /* * Format the list of objects. */ for ( obj = list; obj != NULL; obj = obj->next_in_carry_list ) { if ( obj->wear_loc == WEAR_NONE && can_see_obj( ch, obj ) ) { pstrShow = format_obj_to_char( obj, ch, fShort ); fCombine = FALSE; if ( IS_SET(ch->config, CONFIG_COMBINE) ) { /* * Look for duplicates, case sensitive. * Matches tend to be near end so run loop backwords. */ for ( iShow = nShow - 1; iShow >= 0; iShow-- ) { if ( !strcmp( prgpstrShow[iShow], pstrShow ) ) { prgnShow[iShow]++; fCombine = TRUE; break; } } } /* * Couldn't combine, or didn't want to. */ if ( !fCombine ) { prgpstrShow [nShow] = str_dup( pstrShow ); prgnShow [nShow] = 1; nShow++; } } } /* * Output the formatted list. */ for ( iShow = 0; iShow < nShow; iShow++ ) { if ( IS_SET(ch->config, CONFIG_COMBINE) ) { if ( prgnShow[iShow] != 1 ) { sprintf( buf, "(%2d) ", prgnShow[iShow] ); send_to_char( buf, ch ); } else { send_to_char( " ", ch ); } } send_to_char( prgpstrShow[iShow], ch ); send_to_char( "\n\r", ch ); free_string( prgpstrShow[iShow] ); } if ( fShowNothing && nShow == 0 ) { if ( IS_NPC(ch) || IS_SET(ch->config, CONFIG_COMBINE) ) send_to_char( " ", ch ); send_to_char( "Nothing.\n\r", ch ); } /* * Clean up. */ qdispose( prgpstrShow, count * sizeof(char *) ); qdispose( prgnShow, count * sizeof(int) ); return; } void show_room_list_to_char( OBJ_DATA *list, CHAR_DATA *ch, bool fShort, bool fShowNothing ) { char buf[MAX_STRING_LENGTH]; char **prgpstrShow; int *prgnShow; char *pstrShow; OBJ_DATA *obj; VEHICLE_DATA *vhc; int nShow; int iShow; int count; bool fCombine; bool blank = TRUE; extern OBJ_DATA *map_obj[MAX_MAPS][MAX_MAPS]; if ( ch->desc == NULL ) return; buf[0] = '\0'; /* * Alloc space for output lines. */ count = 0; for ( obj = list; obj != NULL; obj = obj->next_in_room ) count++; prgpstrShow = qgetmem( count * sizeof(char *) ); prgnShow = qgetmem( count * sizeof(int) ); nShow = 0; /* First, show vehicles */ for ( vhc = map_vhc[ch->x][ch->y][ch->z];vhc;vhc = vhc->next_in_room ) { if ( !vhc ) continue; if ( (vhc->driving && vhc->driving == ch) || vhc->in_vehicle ) continue; buf[0] = '\0'; if ( IS_SET(vhc->flags,VEHICLE_FLOATS) ) sprintf( buf+strlen(buf), "@@c(@@aFLO@@WAT@@aING@@c)@@N " ); sprintf( buf+strlen(buf), "@@l(@@aInside: @@c%s@@l)@@N %s\n\r", (vhc->driving) ? vhc->driving->name : "EMPTY", vhc->desc ); send_to_char( buf, ch ); } if ( ch->in_vehicle ) return; /* * Format the list of objects. */ for ( obj = map_obj[ch->x][ch->y]; obj != NULL; obj = obj->next_in_room ) { if ( (NOT_IN_ROOM(ch,obj) || obj->carried_by ) ) continue; if ( obj->wear_loc == WEAR_NONE && can_see_obj( ch, obj ) && str_cmp( obj->description, "" ) ) { pstrShow = format_obj_to_char( obj, ch, fShort ); fCombine = FALSE; blank = FALSE; if ( IS_SET(ch->config, CONFIG_COMBINE) ) { /* * Look for duplicates, case sensitive. * Matches tend to be near end so run loop backwords. */ for ( iShow = nShow - 1; iShow >= 0; iShow-- ) { if ( !strcmp( prgpstrShow[iShow], pstrShow ) ) { prgnShow[iShow]++; fCombine = TRUE; break; } } } /* * Couldn't combine, or didn't want to. */ if ( !fCombine ) { prgpstrShow [nShow] = str_dup( pstrShow ); prgnShow [nShow] = 1; nShow++; } } } /* * Output the formatted list. */ for ( iShow = 0; iShow < nShow; iShow++ ) { if ( ( IS_NPC(ch) || IS_SET(ch->config, CONFIG_COMBINE) ) && str_cmp( prgpstrShow[iShow], "" ) ) { if ( prgnShow[iShow] != 1 ) { sprintf( buf, "(%2d) ", prgnShow[iShow] ); send_to_char( buf, ch ); } else { send_to_char( " ", ch ); } } send_to_char( prgpstrShow[iShow], ch ); send_to_char( "\n\r", ch ); free_string( prgpstrShow[iShow] ); } if ( fShowNothing && nShow == 0 ) { if ( IS_SET(ch->config, CONFIG_COMBINE) ) send_to_char( " ", ch ); send_to_char( "Nothing.\n\r", ch ); } if ( blank && !IS_SET(ch->config,CONFIG_CLIENT) ) send_to_char("\n\r", ch ); /* * Clean up. */ qdispose( prgpstrShow, count * sizeof(char *)); qdispose( prgnShow, count * sizeof(int) ); return; } void show_char_to_char_0( CHAR_DATA *victim, CHAR_DATA *ch, bool truncate) { char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; sprintf( buf, "%s", color_string( ch, "mobiles" ) ); buf2[0] = '\0'; if ( IS_BUSY( victim ) ) { sprintf( buf2, " @@d(@@eBUSY@@d)@@N" ); safe_strcat(MSL, buf, buf2 ); } if ( victim->position == POS_BUILDING ) { sprintf( buf2, " @@d(@@eBUILDING@@d)@@N" ); safe_strcat(MSL, buf, buf2 ); } /* strcat to buf *linkdead* if not connected? */ if ( (victim->desc) == NULL && !victim->fake ) safe_strcat( MAX_STRING_LENGTH, buf, "@@g(@@dL@@WINK@@dD@@WEAD@@g)@@N " ); if ( IS_SET(victim->pcdata->pflags, PFLAG_AFK) ) safe_strcat( MSL, buf, "@@p(@@mA@@pF@@mK@@p)@@N " ); if ( sysdata.pikamod ) { char nbuf[MSL]; sprintf( nbuf, "@@yA Pikachu, looking like @@W%s@@y, is here.@@N", victim->name ); safe_strcat(MAX_STRING_LENGTH, buf, nbuf ); } else { bool nukem = (victim->z == Z_PAINTBALL && victim->x == 2 && victim->y == 2 ); safe_strcat(MAX_STRING_LENGTH, buf, victim->name ); if ( victim->position == POS_HACKING ) safe_strcat(MSL,buf, " is here, messing with a computer." ); else if ( nukem && victim->first_carry ) safe_strcat(MSL,buf," has the @@ynuke@@N!!" ); else safe_strcat(MAX_STRING_LENGTH, buf, " is here." ); } /* buf[0] = UPPER(buf[0]); */ safe_strcat( MAX_STRING_LENGTH, buf, color_string( ch, "normal" ) ); safe_strcat( MAX_STRING_LENGTH, buf, "\n\r" ); send_to_char( buf, ch ); return; } void show_char_to_char_1( CHAR_DATA *victim, CHAR_DATA *ch ) { char buf[MAX_STRING_LENGTH]; OBJ_DATA *obj; int iWear; int pct; bool found; buf[0] = '\0'; if ( can_see( victim, ch ) ) { act( "$n looks at you.", ch, NULL, victim, TO_VICT ); act( "$n looks at $N.", ch, NULL, victim, TO_NOTVICT ); } act( "Isn't 'You see nothing special about $M' a bit boring?.", ch, NULL, victim, TO_CHAR ); if ( victim->max_hit > 0 ) pct = ( 100 * victim->hit ) / victim->max_hit; else pct = -1; strcpy( buf, victim->name ); sprintf( buf, "%s", victim->name ); if ( pct >= 100 ) safe_strcat(MAX_STRING_LENGTH, buf, " is ready for battle!\n\r" ); else if ( pct >= 90 ) safe_strcat(MAX_STRING_LENGTH, buf, " has some wounds here and there.\n\r" ); else if ( pct >= 80 ) safe_strcat(MAX_STRING_LENGTH, buf, " has a few bullet holes.\n\r" ); else if ( pct >= 70 ) safe_strcat(MAX_STRING_LENGTH, buf, " has a face full of blood.\n\r" ); else if ( pct >= 60 ) safe_strcat(MAX_STRING_LENGTH, buf, " is covered in sweat and blood.\n\r" ); else if ( pct >= 50 ) safe_strcat(MAX_STRING_LENGTH, buf, " has one leg in the grave.\n\r" ); else if ( pct >= 40 ) safe_strcat(MAX_STRING_LENGTH, buf, " is falling apart!\n\r" ); else if ( pct >= 30 ) safe_strcat(MAX_STRING_LENGTH, buf, " is missing an arm or two.\n\r" ); else if ( pct >= 20 ) safe_strcat(MAX_STRING_LENGTH, buf, " is having trouble living.\n\r" ); else if ( pct >= 10 ) safe_strcat(MAX_STRING_LENGTH, buf, " is ready to drop!\n\r" ); else safe_strcat(MAX_STRING_LENGTH, buf, " is DYING.\n\r" ); buf[0] = UPPER(buf[0]); send_to_char( buf, ch ); found = FALSE; for ( iWear = 0; iWear < MAX_WEAR; iWear++ ) { if ( ( obj = get_eq_char( victim, iWear ) ) != NULL && can_see_obj( ch, obj ) ) { if ( !found ) { send_to_char( "\n\r", ch ); act( "$N is using:", ch, NULL, victim, TO_CHAR ); found = TRUE; } send_to_char( where_name[iWear], ch ); send_to_char( format_obj_to_char( obj, ch, TRUE ), ch ); send_to_char( "\n\r", ch ); } } if ( victim != ch ) { send_to_char( "\n\rYou peek at the inventory:\n\r", ch ); show_list_to_char( victim->first_carry, ch, TRUE, TRUE ); } return; } void show_char_to_char( CHAR_DATA *list, CHAR_DATA *ch ) { CHAR_DATA *rch; if ( list == NULL ) return; for ( rch = list; rch != NULL; rch = rch->next_in_room ) { if ( rch->next_in_room == rch ) rch->next_in_room = NULL; if ( rch == ch ) continue; if ( rch->next_in_room && rch->next_in_room == rch ) extract_char(rch->next_in_room , TRUE); if ( NOT_IN_ROOM(ch, rch) ) continue; if ( !can_see(ch,rch) ) continue; if ( rch->in_vehicle != NULL ) continue; show_char_to_char_0( rch, ch, FALSE ); } return; } void do_look( CHAR_DATA *ch, char *argument ) { char buf [MAX_STRING_LENGTH]; char arg1 [MAX_INPUT_LENGTH]; char arg2 [MAX_INPUT_LENGTH]; char out [MAX_STRING_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj; extern OBJ_DATA *map_obj[MAX_MAPS][MAX_MAPS]; VEHICLE_DATA *vhc; bool base = FALSE; buf[0] = '\0'; out[0] = '\0'; if ( ch->desc == NULL ) return; if ( IS_SET(ch->effect,EFFECT_BLIND) ) { if ( number_percent() < 20 || !blind_combat_check(ch) ) { send_to_char( "You can't see a thing!\n\r", ch ); return; } } argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( !str_cmp(arg1,"outside")) base = TRUE; if ( arg1[0] == '\0' || !str_cmp( arg1, "auto" ) || base ) { /* 'look' or 'look auto' */ if ( sysdata.pikamod ) send_to_char( "\n\r@@yPika Mod @@bO@@yN@@bL@@yI@@bN@@yE@@b!@@N\n\r", ch ); if ( sysdata.killfest ) send_to_char( "\n\r@@2@@aKILLFEST!@@N mode on!\n\r", ch ); if ( ch->in_vehicle != NULL && !IS_SET(ch->config,CONFIG_BLIND) ) { char buf[MSL]; VEHICLE_DATA *vhc; sprintf( buf, "\n@@ySTATUS: @@RHEALTH: @@e%d @@cFUEL: %s%d@@N @@dAMMO: @@g%d@@N\n\r", ch->in_vehicle->hit, ( ch->in_vehicle->fuel <= 10 ) ? "@@e@@f" : "@@a", ch->in_vehicle->fuel, ch->in_vehicle->ammo ); send_to_char( buf, ch ); if ( ( vhc = get_vehicle_from_vehicle(ch->in_vehicle) ) != NULL ) { sprintf( buf, "Inside: %s\n\r", vhc->desc ); send_to_char( buf, ch ); } } if ( IS_SET(ch->config,CONFIG_NOMAP) ) return; if ( IS_SET(ch->config, CONFIG_NOCOLORS) && !IS_SET(ch->config, CONFIG_COLOR) ) SET_BIT(ch->config, CONFIG_COLOR); if ( !base ) do_mapper( ch, "" ); else do_mapper( ch, "996" ); if ( IS_SET(ch->config, CONFIG_NOCOLORS) && IS_SET(ch->config, CONFIG_COLOR) ) REMOVE_BIT(ch->config, CONFIG_COLOR); show_char_to_char( map_ch[ch->x][ch->y][ch->z], ch ); show_room_list_to_char( map_obj[ch->x][ch->y], ch, FALSE, FALSE ); return; } else if ( !str_prefix(arg1,"ground") && ch->z == Z_AIR ) { move(ch,ch->x,ch->y,Z_GROUND); do_mapper(ch,""); move(ch,ch->x,ch->y,Z_AIR); return; } else if ( !str_cmp( arg1, "board" ) || !str_cmp( arg2, "board" ) ) { /*int bnum;*/ if ( ( obj = get_obj_here( ch, "board" ) ) == NULL ) { send_to_char( "You do not see that here.\n\r", ch ); return; } do_show_contents( ch, obj ); return; } if (( vhc = get_vehicle_char( ch, arg1 ) ) != NULL ) { VEHICLE_DATA *vhc2; sprintf( buf, "%s is driven by %s.\n\r", vhc->desc, ( vhc->driving == NULL ) ? "nobody" : ( vhc->driving == ch ) ? "you" : vhc->driving->name ); send_to_char( buf, ch ); sprintf( buf, "%s has: %d%% HP, %d %s-type Ammunition and %d gallons of Fuel. Its speed is %d.\n\r", vhc->desc, (((100000 / vhc->max_hit) * vhc->hit) / 1000), vhc->ammo, (vhc->ammo_type>1&&vhc->ammo_type<MAX_AMMO)?clip_table[vhc->ammo_type].name:"None", vhc->fuel, vhc->speed ); send_to_char( buf, ch ); if ( vhc && ( vhc2 = get_vehicle_from_vehicle(vhc) ) != NULL ) { sprintf( buf, "\n\rIt's carrying %s inside.\n\r", vhc2->desc ); send_to_char( buf, ch ); } act( "$n looks at $T.", ch, NULL, vhc->desc, TO_ROOM ); return; } if ( ( victim = get_char_room( ch, arg1 ) ) != NULL ) { if ( victim->in_vehicle ) { VEHICLE_DATA *vhc2; vhc = victim->in_vehicle; sprintf( buf, "%s is driven by %s.\n\r", vhc->desc, ( !vhc->driving ) ? "nobody" : ( vhc->driving == ch ) ? "you" : vhc->driving->name ); send_to_char( buf, ch ); sprintf( buf, "%s has: %d%% HP, %d %s-type Ammunition and %d gallons of Fuel. Its speed is %d.\n\r", vhc->desc, (((100000 / vhc->max_hit) * vhc->hit) / 1000), vhc->ammo, (vhc->ammo_type<0)?"null":clip_table[vhc->ammo_type].name, vhc->fuel, vhc->speed ); send_to_char( buf, ch ); if ( ( vhc2 = get_vehicle_from_vehicle(vhc) ) != NULL ) { sprintf( buf, "\nIt's carrying %s inside.\n\r", vhc2->desc ); send_to_char( buf, ch ); } act( "$n looks at $T.", ch, NULL, vhc->desc, TO_ROOM ); return; } show_char_to_char_1( victim, ch ); return; } if ( (obj=get_obj_carry(ch,arg1) ) == NULL ) if ( (obj=get_obj_room(ch,arg1,map_obj[ch->x][ch->y]) ) == NULL ) { send_to_char( "You don't see that here.\n\r", ch ); return; } if ( obj->item_type == ITEM_TOKEN && (obj->value[0] == 2 || obj->value[0] == 3)) { int m =ch->map; ch->map = obj->value[1]; if ( obj->value[0] == 2) do_mapper(ch,"995"); else do_mapper(ch,"994"); ch->map = m; return; } send_to_char( obj->description, ch ); return; } void do_examine( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; buf[0] = '\0'; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Examine what?\n\r", ch ); return; } do_look( ch, arg ); if ( ( obj = get_obj_here( ch, arg ) ) != NULL ) { switch ( obj->item_type ) { default: break; case ITEM_BOMB: if ( obj->value[1] != 0 ) sprintf( buf, "It is set to explode in %d seconds!\n\r", obj->value[0] ); else sprintf( buf, "It is not armed.\n\r" ); send_to_char( buf, ch ); break; case ITEM_ARMOR: sprintf( buf, "%s has %d damage. It appears to be good against %s.", capitalize(obj->short_descr), obj->value[1], ( obj->value[0] == DAMAGE_BULLETS ) ? "bullet damage" : (obj->value[0] == DAMAGE_BLAST) ? "blast damage" : (obj->value[0] == DAMAGE_ACID) ? "acid damage" : (obj->value[0] == DAMAGE_LASER) ? "laser damage" : (obj->value[0] == DAMAGE_FLAME) ? "Fire damage" : "general damage" ); send_to_char( buf, ch); break; case ITEM_COMPUTER: sprintf( buf, "It has %d more uses of battery life.\n\r", obj->value[1] ); send_to_char( buf, ch); break; } } return; } void do_score( CHAR_DATA *ch, char *argument ) { if ( IS_SET(ch->config,CONFIG_BLIND) || !str_cmp(argument,"old")) display_details_old(ch,ch); else display_details(ch,ch); return; } void display_details( CHAR_DATA * viewer, CHAR_DATA *ch ) { char buf[MSL]; char namebuf[MSL]; char mccp_buf[MSL]; bool mccp = FALSE; int hours,minutes; extern char * const poison_name[]; buf[0] = '\0'; sprintf(namebuf, "%s %s", ch->name, ch->pcdata->title ); if ( ch->desc && ch->desc->out_compress ) { sprintf(mccp_buf, " MCCP%d Support", (ch->desc->compressing==85)?1:2 ); mccp = TRUE; } else { sprintf(mccp_buf, "No MCCP Support" ); mccp = FALSE; } hours = my_get_hours(ch,FALSE); minutes = my_get_minutes(ch,FALSE) - (hours * 60); sprintf( buf+strlen(buf),"\n\r%s\n\r", center_text(namebuf,75) ); sprintf(buf+strlen(buf),"@@d _ __\n\r" ); sprintf(buf+strlen(buf),"@@d /\\ _ ___ /\\ _ ___/ \\_ ___/\\ __/ \\ \n\r" ); sprintf(buf+strlen(buf),"@@d| \\_/ \\ __/ \\_/ \\ / \\_ __/ \\__ __/ \\__ __/ \\ \n\r" ); sprintf(buf+strlen(buf),"@@d| \\/ \\___/ \\/ \\_/ \\___/ @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d|@@g Play Time: @@W%5d.%-2d Hours @@g( @@W%4d@@g Total) (%s%-15s@@g) @@d|\n\r", hours, minutes, my_get_hours(ch,TRUE), mccp?"@@a":"@@e", mccp_buf ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); if ( ch->pcdata->alliance >= 0 ) sprintf(buf+strlen(buf),"@@d| @@W%*s @@d|\n\r", (strlen(alliance_table[ch->pcdata->alliance].name) - nocol_strlen(alliance_table[ch->pcdata->alliance].name) ) + 40, center_text(alliance_table[ch->pcdata->alliance].name,40) ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); if ( !IS_IMMORTAL(ch) ) sprintf(buf+strlen(buf),"@@d|@@g You are currently at rank @@W%4d@@g. @@d|\n\r",get_rank(ch) ); else sprintf(buf+strlen(buf),"@@d|@@g You are trusted at level @@W%2d@@g. @@d|\n\r", get_trust(ch) ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d|@@a Player Statistics PK Statistics @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d|@@g Health:@@W %-5d/%-5d @@g Kills:@@W %-6d @@g(@@W%-6d@@g Total) @@d|\n\r", ch->hit, ch->max_hit, ch->pcdata->pkills, ch->pcdata->tpkills ); sprintf(buf+strlen(buf),"@@d|@@g Class:@@W %-15s @@g B. Kills:@@W %-6d @@g(@@W%-6d@@g Total) @@d|\n\r", class_table[ch->class].name, ch->pcdata->bkills, ch->pcdata->tbkills ); sprintf(buf+strlen(buf),"@@d|@@g Money:@@W $%-7ld @@g Deaths:@@W %-6d @@d|\n\r", ch->money, ch->pcdata->deaths ); sprintf(buf+strlen(buf),"@@d|@@g Exp:@@W %-11d @@g B. Lost:@@W %-6d @@d|\n\r", ch->pcdata->experience, ch->pcdata->blost ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d|@@a Points Paintball Statistics @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d|@@g Quest:@@W %-5d @@gKills:@@W %-6d @@d|\n\r", ch->quest_points, ch->pcdata->pbhits ); sprintf(buf+strlen(buf),"@@d|@@g Game:@@W %-5d @@gLosses:@@W %-6d @@d|\n\r", ch->game_points, ch->pcdata->pbdeaths ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d|@@a Timers Nukem Statistics @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d|@@g Combat:@@W %-5d Seconds @@gWins:@@W %-6d @@d|\n\r", ch->fighttimer / PULSE_PER_SECOND, ch->pcdata->nukemwins ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d|@@a Items @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d|@@g Carry:@@W %6d/%-4d @@d|\n\r",ch->carry_number, can_carry_n(ch) ); sprintf(buf+strlen(buf),"@@d|@@g Weight:@@W %6.2f/%-4d @@d|\n\r",ch->carry_weight, can_carry_w(ch) ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); if ( IS_SET(ch->effect,EFFECT_CONFUSE) ) sprintf( buf+strlen(buf),"| @@gAffected by:@@W Confusion @@d|\n\r" ); if ( IS_SET(ch->effect,EFFECT_BLIND) ) sprintf( buf+strlen(buf),"| @@gAffected by:@@W Blindness @@d|\n\r" ); if ( IS_SET(ch->effect,EFFECT_SLOW) ) sprintf( buf+strlen(buf),"| @@gAffected by:@@W Slow @@d|\n\r" ); if ( IS_SET(ch->effect,EFFECT_ENCRYPTION) ) sprintf( buf+strlen(buf),"| @@gAffected by:@@W Encryption @@d|\n\r" ); if ( IS_SET(ch->effect,EFFECT_RESOURCEFUL) ) sprintf( buf+strlen(buf),"| @@gAffected by:@@W Resourceful @@d|\n\r" ); if ( IS_SET(ch->effect,EFFECT_BOMBER) ) sprintf( buf+strlen(buf),"| @@gAffected by:@@W Bomber @@d|\n\r" ); if ( IS_SET(ch->effect,EFFECT_POSTAL) ) sprintf( buf+strlen(buf),"| @@gAffected by:@@W Postal @@d|\n\r" ); if ( IS_SET(ch->effect,EFFECT_WULFSKIN) ) sprintf( buf+strlen(buf),"| @@gAffected by:@@W Wulfskin @@d|\n\r" ); if ( IS_SET(ch->effect,EFFECT_DRUNK) ) sprintf( buf+strlen(buf),"| @@gAffected by:@@W Drunk @@d|\n\r" ); if ( IS_SET(ch->effect,EFFECT_EVADE) ) sprintf( buf+strlen(buf),"| @@gAffected by:@@W Evade @@d|\n\r" ); if ( ch->effect2 > 0 ) sprintf( buf+strlen(buf),"| @@gAffected by:@@W %-12s @@gFor:@@W %2d Minute(s) @@d|\n\r", (ch->effect2/100==EFFECT2_CONSTITUTION)?"Constitution":(ch->effect2/100==EFFECT2_SPEED)?"Speed":(ch->effect2/100==EFFECT2_SMART)?"Brilliance":(ch->effect2/100==EFFECT2_RAGE)?"Rage":(ch->effect2/100==EFFECT2_REGENERATION)?"Regeneration":"Unknown", ch->effect2 % 100 ); if ( ch->poison > 0 ) sprintf( buf+strlen(buf),"| @@gAffected by:@@W %-12s @@gFor:@@W %2d Minute(s) @@d|\n\r", poison_name[ch->poison/100], ch->poison % 100 ); sprintf(buf+strlen(buf),"@@d| @@d|\n\r" ); sprintf(buf+strlen(buf),"@@d|_________________________________________________________________________|\n\r" ); send_to_char(buf,viewer); return; } void do_time( CHAR_DATA *ch, char *argument ) { extern char str_boot_time[]; char buf[MAX_STRING_LENGTH]; char *suf; int day; day = time_info.day + 1; if ( day > 4 && day < 20 ) suf = "th"; else if ( day % 10 == 1 ) suf = "st"; else if ( day % 10 == 2 ) suf = "nd"; else if ( day % 10 == 3 ) suf = "rd"; else suf = "th"; sprintf( buf, "@@cIt is @@a%d @@co'clock @@a%s@@c Game Time.@@N\n\r@@WAssault @@cstarted up at @@a%s@@N\r@@cThe system time is @@a%s@@N\r", (time_info.hour % 12 == 0) ? 12 : time_info.hour % 12, time_info.hour >= 12 ? "pm" : "am", str_boot_time, (char *) ctime( ¤t_time ) ); if ( sysdata.qpmode > 0 ) sprintf(buf+strlen(buf),"@@cQPMode is enabled for @@a%d@@c more minutes!@@N\n\r", sysdata.qpmode / 4 ); if ( sysdata.xpmode > 0 ) sprintf(buf+strlen(buf),"@@cXPMode is enabled for @@a%d@@c more minutes!@@N\n\r", sysdata.xpmode / 4 ); send_to_char( buf, ch ); return; } void do_bhelp( CHAR_DATA *ch, char *argument ) { if ( !IS_SET(ch->config,CONFIG_CLIENT) ) { send_to_char("Huh?\n\r", ch ); return; } show_building_info(ch,atoi(argument)); return; } void do_help( CHAR_DATA *ch, char *argument ) { HELP_DATA *pHelp; bool building = FALSE; bool sep = FALSE; char buf2[MSL]; buf2[0] = '\0'; if ( argument[0] == '\0' ) argument = "help"; { int i; if ( !str_cmp(argument,"hq") ) { show_building_info(ch,BUILDING_HQ); return; } for ( i = 1;i<MAX_BUILDING;i++ ) { if ( build_table[i].rank > 9999 || build_table[i].disabled ) continue; if ( !str_cmp(build_table[i].name,argument) || !str_cmp(build_table[i].symbol,argument)) { show_building_info(ch,i); building = TRUE; return; } } } for ( pHelp = first_help; pHelp != NULL; pHelp = pHelp->next ) { if ( pHelp->level-1 > get_trust( ch ) ) continue; if ( is_name( argument, pHelp->keyword ) || !str_cmp(argument,pHelp->keyword) ) { if ( sep ) { sprintf( buf2+strlen(buf2), "@@C%s, ", pHelp->keyword ); // send_to_char("\n\r---------------------------------------------------------------\n\r\n\r", ch ); continue; } /* if ( pHelp->level >= 0 && str_cmp( argument, "imotd" ) && !building ) { send_to_char( pHelp->keyword, ch ); send_to_char( "\n\r", ch ); }*/ /* * Strip leading '.' to allow initial blanks. */ if ( pHelp->text[0] == '.' ) send_to_char( pHelp->text+1, ch ); else send_to_char( pHelp->text , ch ); sep = TRUE; return; } else { /* if ( !str_infix(argument,pHelp->keyword) ) { one_argument(pHelp->keyword,help); sprintf( buf2+strlen(buf2), "@@C%s, ", help ); }*/ } } if ( !sep ) { send_to_char( "No help on that word.\n\r", ch ); append_file( ch, HELP_FILE, argument ); if ( buf2[0] != '\0' ) { send_to_char( "\n\r\n\rMaybe you are looking for one of these:\n\r",ch); send_to_char(buf2,ch); send_to_char( "@@N\n\r", ch ); } return; } if ( buf2[0] != '\0' ) { send_to_char( "Maybe you are looking for one of these:\n\r",ch); send_to_char(buf2,ch); } { OBJ_DATA *obj; char buf[MSL]; if ( ( obj = get_obj_carry(ch,argument) ) != NULL ) { sprintf( buf, "\n\r@@NIf you're looking for help about %s, you can try to ""identify"" it (Not all objects can be identified)", obj->short_descr ); send_to_char( buf, ch ); } } return; } void do_helplist( CHAR_DATA *ch, char *argument ) { HELP_DATA *pHelp; char buf[MSL]; char buf2[MSL]; if ( argument[0] == '\0' ) argument = "summary"; buf[0] = '\0'; send_to_char( "A list of all the helps:\n\r", ch ); for ( pHelp = first_help; pHelp != NULL; pHelp = pHelp->next ) { if ( pHelp->level > get_trust( ch ) ) continue; sprintf( buf2, "%s\n\r", pHelp->keyword ); safe_strcat( MSL, buf, buf2 ); } send_to_char( buf, ch ); return; } void do_who( CHAR_DATA *ch, char *argument ) { // DESCRIPTOR_DATA *d; char buf[MSL]; int true_cnt; int hidden_cnt = 0; int g_rank=0,rank,type; extern int max_players; extern int max_players_ever; char n_buf[MSL]; char s_buf[MSL]; char h_buf[MSL]; CHAR_DATA *wch; bool blind = FALSE; bool blind_all = FALSE; bool tmc = FALSE; if ( IS_SET(ch->config,CONFIG_BLIND) ) blind = TRUE; if ( argument[0] != '\0' ) { char arg[MSL]; argument = one_argument(argument,arg); if ( !str_cmp(arg,"setmax") && is_number(argument) && (!ch || IS_IMMORTAL(ch) ) ) { max_players = atoi(argument); if ( ch ) send_to_char("Max players set.\n\r", ch ); set_max_ever(1); return; } else if ( !str_cmp(arg,"tmc_wholist") ) { tmc = TRUE; } else if ( !str_cmp(arg,"rank") && is_number(argument) ) { g_rank = atoi(argument); } else if ( blind && !str_prefix(arg,"all") ) blind_all = TRUE; } send_to_char( "\n\r", ch ); if ( blind ) sprintf( buf, "Visible players online:\n\r" ); else if ( !IS_SET(ch->config,CONFIG_MINCOLORS) ) sprintf( buf, "@@c|@@g===============================================================================@@N\n\r" ); // sprintf( buf, "@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@G*@@r~@@N\n\r" ); else sprintf( buf, "@@g|===============================================================================@@N\n\r" ); // sprintf( buf, "@@G~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~@@N\n\r" ); send_to_char( buf, ch ); if ( !blind ) { send_to_char("@@c|@@W Rank @@d| @@WFlags @@d| @@WS @@d| @@WPlayer@@N\n\r", ch ); sprintf( h_buf, "@@c|@@g ? | | ? | Hidden Player\n\r" ); } if ( !IS_SET(ch->config,CONFIG_MINCOLORS) ) { sprintf( n_buf, "@@y N@@be@@yw@@yb@@bi@@ye@@N " ); sprintf( s_buf, "@@b (@@yS@@bT@@yA@@bF@@yF@@b)@@N " ); } else { sprintf( n_buf, "@@y Newbie @@N " ); sprintf( s_buf, "@@b (STAFF) @@N" ); } true_cnt = 0; for ( type=1;type<=2;type++ ) { if ( !blind ) { if ( type == 1 ) { send_to_char( "@@c|@@g===================================== @@aStaff @@g===================================\n\r", ch ); } else if ( type == 2 ) { send_to_char( "@@c|@@g==================================== @@aPlayers @@g==================================\n\r", ch ); if ( tmc ) { send_to_char( "@@c|@@g 30 | | M | @ Qiller\n\r", ch ); send_to_char( "@@c|@@g 38 | | M | @ Noma\n\r", ch ); } } } for ( wch = first_char;wch;wch = wch->next ) { if ( (type == 1 && !IS_IMMORTAL(wch) ) || (type == 2 && IS_IMMORTAL(wch) ) ) continue; /* if ( tmc && wch->next && wch->next == ch ) { send_to_char( "@@c|@@g 1 | | M | @ Godlike\n\r", ch ); }*/ true_cnt++; if ( !can_see(ch,wch) || (IS_LINKDEAD(wch) && ch->trust < 84) ) { true_cnt--; hidden_cnt++; continue; } rank = get_rank(wch) ; if ( rank < g_rank ) continue; if ( blind ) { if ( blind_all ) sprintf( buf, "%s, %s, Rank %d%s\n\r", wch->name, wch->pcdata->title, rank, IS_NEWBIE(wch)?" (Newbie)":"" ); else sprintf( buf, "%s%s\n\r", wch->name , IS_NEWBIE(wch)?" (Newbie)" : ""); } else { sprintf( buf, "@@c| %s%4d@@g |%-9s@@g| %s |", (get_trust(wch) <= 1)?"@@g":(get_trust(wch)==79)?"@@W":"@@y", rank, IS_SET(wch->act,PLR_WIZINVIS) ? "@@m(@@p(I@@mN@@pV@@mI@@pS)@@m)@@N" : IS_SET( wch->pcdata->pflags, PFLAG_AFK ) ? "AFK" : wch->timer > 5 ? "IDLE" : !wch->fake && wch->desc && wch->desc->connected != CON_PLAYING ? "DEAD" : ( wch->trust == 90 ) ? "@@B(@@l(@@aO@@cw@@an@@ce@@ar@@l)@@B)@@N" : ( wch->trust == 89 ) ? "@@B{@@l(@@aC@@co@@aO@@cw@@an@@l)@@B)@@N" : ( wch->trust >= LEVEL_IMMORTAL ) ? s_buf : (IS_NEWBIE(wch)) ? n_buf : ( str_cmp(wch->pcdata->who_name,"off") ) ? wch->pcdata->who_name : " ", (wch->sex == 1) ? "M" : "F" ); } if ( wch->in_building && wch->in_building->type == BUILDING_CLUB && complete(wch->in_building) && wch != ch ) sprintf( buf+strlen(buf)," *" ); if ( IS_LINKDEAD(wch) ) sprintf(buf+strlen(buf)," @" ); if ( !blind ) sprintf( buf+strlen(buf), " %s%s%s \n\r", wch->name, (wch->pcdata->title[0] != '@') ? "" : " ", wch->pcdata->title ); send_to_char( buf, ch ); } } hidden_cnt += sysdata.showhidden; if ( IS_SET(ch->pcdata->pflags,PLR_ASS) ) hidden_cnt = 0; for ( type=0;type<hidden_cnt;type++) send_to_char(h_buf,ch); if ( true_cnt + hidden_cnt > max_players ) max_players = true_cnt + hidden_cnt; if ( max_players > max_players_ever ) { max_players_ever=max_players; set_max_ever(1); } if ( true_cnt + hidden_cnt != web_data.num_players ) { char plr[4]; sprintf( plr, "%d", true_cnt+hidden_cnt ); update_web_data(WEB_DATA_NUM_PLAYERS,plr); } if ( blind ) { sprintf( buf, "\n\rTotal Players: %d\n\rHidden: %d\n\rMax this Reboot: %d\n\rMax Ever: %d\n\r", true_cnt+hidden_cnt, hidden_cnt, max_players, max_players_ever ); send_to_char(buf,ch); return; } sprintf( buf, "@@c|@@g===============================================================================@@N\n\r" ); sprintf( buf+strlen(buf), "@@c| @@c(@@W%d T@@gotal Player%s@@c) (@@W%d H@@gidden@@c) (@@W%d M@@gax This Reboot@@c) (@@W%d M@@gax Ever@@c)\n\r@@N", true_cnt+hidden_cnt, ( true_cnt+hidden_cnt > 1 ) ? "s" : "", hidden_cnt, max_players,max_players_ever ); sprintf( buf+strlen(buf), "@@c| @@eASSAULT: 3.0\n\r" ); safe_strcat( MAX_STRING_LENGTH, buf, "@@c|@@g===============================================================================@@N\n\r" ); send_to_char( buf, ch ); send_to_char( color_string( ch, "normal" ), ch ); return; } void do_changes( CHAR_DATA *ch, char *argument ) { send_to_char("@@eChanges:\r\n", ch); send_to_char("Description Date\r\n", ch); do_pipe(ch, "tail -n 20 ../changelog"); send_to_char("@@n", ch); return; } void do_inventory( CHAR_DATA *ch, char *argument ) { char buf[MSL]; if ( IS_SET(ch->effect,EFFECT_BLIND) ) { send_to_char( "You can't see a thing!\n\r", ch ); return; } send_to_char( "You are carrying:\n\r", ch ); show_list_to_char( ch->first_carry, ch, TRUE, TRUE ); sprintf(buf,"\n\rYou have $%ld in cash.\n\r", ch->money ); send_to_char(buf,ch); return; } void do_equipment( CHAR_DATA *ch, char *argument ) { do_wear( ch, argument ); return; } void do_credits( CHAR_DATA *ch, char *argument ) { do_help( ch, "credits" ); return; } void set_title( CHAR_DATA *ch, char *title ) { char buf[MAX_STRING_LENGTH]; buf[0] = '\0'; if ( IS_NPC(ch) ) { bug( "Set_title: NPC.", 0 ); return; } if ( isalpha(title[0]) || isdigit(title[0]) ) { buf[0] = ' '; strcpy( buf+1, title ); } else { strcpy( buf, title ); } free_string( ch->pcdata->title ); ch->pcdata->title = str_dup( buf ); return; } void do_title( CHAR_DATA *ch, char *argument ) { /* Changed this to limit title length, and to remove and brackets. -S- */ char buf[MAX_STRING_LENGTH]; int cnt; bool changed; buf[0] = '\0'; if ( IS_NPC(ch) ) return; if ( argument[0] == '\0' ) { send_to_char( "Change your title to what?\n\r", ch ); return; } changed = FALSE; for ( cnt = 0; cnt < strlen(argument); cnt++ ) { if ( argument[cnt] == '[' || argument[cnt] == ']' ) { changed = TRUE; argument[cnt] = ( argument[cnt] == ']' ) ? '>' : '<'; } } if ( changed ) send_to_char( "You used either [ or ] in your title. They have been removed!\n\r", ch ); /* my_strlen handles color codes as zero length */ if ( my_strlen(argument) > 49 ) { send_to_char( "Title too long. Please try again.\n\r", ch ); return; } smash_tilde( argument ); set_title( ch, argument ); sprintf( buf, "You are now: %s%s.\n\r", ch->name, ch->pcdata->title ); send_to_char( buf, ch ); } void do_password( CHAR_DATA *ch, char *argument ) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char *pArg; char *pwdnew; char *p; char cEnd; if ( IS_NPC(ch) ) return; arg1[0] = '\0'; arg2[0] = '\0'; /* * Can't use one_argument here because it smashes case. * So we just steal all its code. Bleagh. */ pArg = arg1; while ( isspace(*argument) ) argument++; cEnd = ' '; if ( *argument == '\'' || *argument == '"' ) cEnd = *argument++; while ( *argument != '\0' ) { if ( *argument == cEnd ) { argument++; break; } *pArg++ = *argument++; } *pArg = '\0'; pArg = arg2; while ( isspace(*argument) ) argument++; cEnd = ' '; if ( *argument == '\'' || *argument == '"' ) cEnd = *argument++; while ( *argument != '\0' ) { if ( *argument == cEnd ) { argument++; break; } *pArg++ = *argument++; } *pArg = '\0'; if ( ( ch->pcdata->pwd != '\0' ) && ( arg1[0] == '\0' || arg2[0] == '\0' ) ) { send_to_char( "Syntax: password <old> <new>.\n\r", ch ); return; } if ( ( ch->pcdata->pwd != '\0' ) && ( strcmp( crypt( arg1, ch->pcdata->pwd ), ch->pcdata->pwd ) ) ) { WAIT_STATE( ch, 40 ); send_to_char( "Wrong password. Wait 10 seconds.\n\r", ch ); return; } if ( strlen(arg2) < 5 ) { send_to_char( "New password must be at least five characters long.\n\r", ch ); return; } /* * No tilde allowed because of player file format. */ pwdnew = crypt( arg2, ch->name ); for ( p = pwdnew; *p != '\0'; p++ ) { if ( *p == '~' ) { send_to_char( "New password not acceptable, try again.\n\r", ch ); return; } } free_string( ch->pcdata->pwd ); ch->pcdata->pwd = str_dup( pwdnew ); save_char_obj( ch ); send_to_char( "Ok.\n\r", ch ); return; } void do_socials( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; char out[MAX_STRING_LENGTH*2]; int iSocial; int col; buf[0] = '\0'; col = 0; out[0] = '\0'; for ( iSocial = 0; social_table[iSocial].name[0] != '\0'; iSocial++ ) { sprintf( buf, "%-12s", social_table[iSocial].name ); safe_strcat(MAX_STRING_LENGTH, out, buf ); if ( ++col % 6 == 0 ) safe_strcat(MAX_STRING_LENGTH, out, "\n\r" ); } if ( col % 6 != 0 ) safe_strcat(MAX_STRING_LENGTH, out, "\n\r" ); send_to_char( out, ch ); return; } struct show_cmds { char buf[MSL]; sh_int col; }; static char * const cmd_group_names [] = { "@@WMisc", "@@aCommunication", "@@mConfiguration", "@@eInformation", "@@rActions", "@@dItem Manipulation" , "@@cAlliance Commands", "@@yImm", "" }; void do_commands( CHAR_DATA *ch, char *argument ) { static struct show_cmds show_table[8]; char buf[MAX_STRING_LENGTH]; char buf1[MAX_STRING_LENGTH]; char arg1[MSL]; int cmd; int col = 0; sh_int show_only = -1; buf[0] = '\0'; buf1[0] = '\0'; /* NOTE: This is better coded via a build_tab.c style lookup, but this is quicker to code right now :) Zen */ argument = one_argument( argument, arg1 ); if ( arg1[0] != '\0' ) { if ( !str_prefix( arg1, "miscellaneous" )) show_only = 0; else if ( !str_prefix( arg1, "communication" )) show_only = 1; else if ( !str_prefix( arg1, "configuration" )) show_only = 2; else if ( !str_prefix( arg1, "information" )) show_only = 3; else if ( !str_prefix( arg1, "actions" )) show_only = 4; else if ( !str_prefix( arg1, "objects" ) || !str_prefix( arg1, "manipulation") ) show_only = 5; else if ( !str_prefix( arg1, "alliance" )) show_only = C_TYPE_ALLI; else if ( !str_prefix( arg1, "imm" )) show_only = C_TYPE_IMM; } for ( col = 0; col < 8; col++ ) { sprintf( show_table[col].buf, "%s:\n\r", cmd_group_names[col] ); show_table[col].col = 0; } col = 0; for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ ) { if ( cmd_table[cmd].level <= L_GOD && cmd_table[cmd].level <= get_trust( ch ) ) { if ( cmd_table[cmd].show == C_SHOW_NEVER ) continue; sprintf( buf, "%-12s", cmd_table[cmd].name ); safe_strcat( MSL, show_table[cmd_table[cmd].type ].buf, buf ); if ( ++show_table[cmd_table[cmd].type].col % 6 == 0 ) safe_strcat(MSL, show_table[cmd_table[cmd].type].buf, "\n\r" ); } } send_to_char( buf1, ch ); for ( col = 0; col < 8; col++ ) { if ( ( show_only > -1 ) && ( show_only != col ) ) continue; safe_strcat(MAX_STRING_LENGTH, show_table[col].buf, "@@N\n\r" ); send_to_char( show_table[col].buf, ch ); } return; } struct chan_type channels[] = { { CHANNEL_GOSSIP, 0, "gossip", "@@r[ @@a+GOSSIP @@r] @@GYou hear general gossip.\n\r", "@@d[ @@c-gossip @@d] @@GYou do not hear general gossip.\n\r" }, { CHANNEL_MUSIC, 0, "music", "@@r[ @@a+MUSIC @@r] @@GYou hear people's music quotes.\n\r", "@@d[ @@c-music @@d] @@GYou don't hear people's music quotes.\n\r" }, { CHANNEL_IMMTALK, LEVEL_HERO, "immtalk", "@@r[ @@a+IMMTALK @@r] @@GYou hear what other immortals have to say.\n\r", "@@d[ @@a-immtalk @@d] @@GYou don't hear what other immortals have to say.\n\r" }, { CHANNEL_LOG,0, "log", "", ""}, { CHANNEL_NEWBIE, 0, "newbie", "@@r[ @@a+NEWBIE @@r] @@GYou hear newbie's chit-chat.\n\r", "@@d[ @@c-newbie @@d] @@GYou don't hear newbie's chit-chat.\n\r" }, { CHANNEL_QUESTION, 0, "question", "@@r[ @@a+QUESTION @@r] @@GYou hear player's questions & answers.\n\r", "@@d[ @@c-question @@d] @@GYou don't hear player's questions & answers.\n\r"}, { CHANNEL_GAME,0, "game", "@@r[ @@a+GAME @@r] @@GYou hear players participating in games.\n\r", "@@d[ @@c-game @@d] @@GYou no longer hear people playing games.\n\r"}, { CHANNEL_FLAME,0, "flame", "@@r[ @@a+FLAME @@r] @@GYou hear players flaming each other.\n\r", "@@d[ @@c-flame @@d] @@GYou don't hear players flaming each other.\n\r"}, { CHANNEL_INFO,0, "info", "@@r[ @@a+INFO @@r] @@GYou hear information about deaths, etc.\n\r", "@@d[ @@c-info @@d] @@GYou don't hear information about deaths, etc.\n\r"}, { CHANNEL_CREATOR, 85, "creator", "@@r[ @@a+CREATOR @@r] @@GYou hear Creators discussing Mud matters.\n\r", "@@d[ @@c-creator @@d] @@GYou don't hear Creators discussing Mud matters\n\r" }, { CHANNEL_HERMIT, 0, "hermit", "@@r[ @@a+HERMIT @@r] @@GYou are NOT ignoring all channels.\n\r", "@@d[ @@c-hermit @@d] @@GYOU ARE IGNORING ALL CHANNELS!\n\r" }, { CHANNEL_BEEP, 0, "beep", "@@r[ @@a+BEEP @@r] @@GYou accept 'beeps' from other players.\n\r", "@@d[ @@c-beep @@d] @@GYou are ignoring 'beeps' from other players.\n\r" }, { CHANNEL_ALLALLI, 80, "allalli", "@@r[ @@a+ALLALLI @@r] @@GYou hear ALL alliance channels.\n\r", "@@d[ @@c-allalli @@d] @@GYou don't hear ALL alliance channels.\n\r" }, { CHANNEL_OOC, 0, "ooc", "@@r[ @@a+OOC @@r] @@GYou hear non-roleplaying chit-chat.\n\r", "@@d[ @@c-ooc @@d] @@GYou ignore those boring non-roleplaying fools!\n\r" }, { CHANNEL_POLITICS, 0, "politics", "@@r[ @@a+POLITICS @@r] @@GYou hear people talk about RL politics stuff... booring!.\n\r", "@@d[ @@c-POLITICS @@d] @@GYou don't care about RL politics!\n\r" }, { CHANNEL_CODE, 0, "code", "@@r[ @@a+CODE @@r] @@GYou hear people talking about coding issues.\r\n", "@@d[ @@a-code @@d] @@GYou ignore talk about coding issues.\r\n" }, { CHANNEL_ALLIANCE, 0, "alliance", "@@r[ @@a+ALLIANCE @@r] @@GYou hear alliance talk.\n\r", "@@d[ @@c-alliance @@d] @@GYou do not hear alliance talk.\n\r" }, { 0,0, NULL, NULL } }; void do_channels( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; char buffer[MAX_STRING_LENGTH]; int a,trust,i=1; bool tog = FALSE; one_argument( argument, arg ); if ( arg[0] == '\0' ) { if ( !IS_NPC(ch) && IS_SET(ch->act, PLR_SILENCE) ) { send_to_char( "You are silenced.\n\r", ch ); return; } trust=get_trust(ch); buffer[0]='\0'; safe_strcat( MAX_STRING_LENGTH, buffer, "@@aChannels@@c:\n\r"); for (a=0; channels[a].bit != 0; a++) { if (trust >= channels[a].min_level) { char colbuf[10]; colbuf[0] = '\0'; if ( IS_SET(ch->deaf, channels[a].bit) ) { if ( !IS_NPC( ch ) ) { sprintf( colbuf, "@@%c", ch->pcdata->dimcol ); safe_strcat( MSL, buffer, colbuf ); } safe_strcat( MAX_STRING_LENGTH, buffer, channels[a].off_string); } else { if ( !IS_NPC( ch ) ) { sprintf( colbuf, "@@%c", ch->pcdata->hicol ); safe_strcat( MSL, buffer, colbuf ); } safe_strcat( MAX_STRING_LENGTH, buffer, channels[a].on_string); } } safe_strcat( MAX_STRING_LENGTH, buffer,"@@N"); } send_to_char( buffer, ch ); } else { bool fClear=TRUE; int bit; if ( arg[0] == '+' ) fClear = TRUE; else if ( arg[0] == '-' ) fClear = FALSE; else { // send_to_char( "Channels -channel or +channel?\n\r", ch ); // return; tog = TRUE; i=0; } bit = 0; for ( a = 0; channels[a].bit != 0; a++ ) { if ( channels[a].min_level > get_trust( ch ) ) continue; if ( !str_prefix( arg+i, channels[a].name ) ) { bit = channels[a].bit; break; } } if ( ( bit == 0 ) ) { send_to_char( "Set or clear which channel?\n\r", ch ); return; } if ( tog ) fClear = IS_SET(ch->deaf,bit)?TRUE:FALSE; if ( fClear ) { REMOVE_BIT (ch->deaf, bit); } else { SET_BIT (ch->deaf, bit); } send_to_char( "Ok.\n\r", ch ); } return; } /* * Contributed by Grodyn. */ void do_config( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; char buf[MSL]; bool rev = FALSE; if ( IS_NPC(ch) ) return; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "@@r[ @@aKeyword @@r] @@GOption\n\r", ch ); send_to_char( "\n\r@@W[@@R--------@@eGeneral Options@@R--------@@W]\n\r", ch ); send_to_char( IS_SET(ch->config, CONFIG_PUBMAIL) ? "@@r[@@a+PUBMAIL @@r] @@GOther people can see your email address.\n\r" : "@@d[@@c-pubmail @@d] @@GOther people can NOT see your email address.\n\r" , ch ); send_to_char( IS_SET(ch->config, CONFIG_TELNET_GA) ? "@@r[@@a+TELNETGA @@r] @@GYou receive a telnet GA sequence.\n\r" : "@@d[@@c-telnetga @@d] @@GYou don't receive a telnet GA sequence.\n\r" , ch ); send_to_char( IS_SET(ch->config, CONFIG_FULL_ANSI) ? "@@r[@@a+FULLANSI @@r] @@GYour client supports FULL ANSI.\n\r" : "@@d[@@c-fullansi @@d] @@GYour client does not support full ANSI (GMUD).\n\r" , ch ); send_to_char( IS_SET(ch->config, CONFIG_ECHAN ) ? "@@r[@@a+ECHAN @@r] @@GYour title shows when you use channels.\r\n" : "@@d[@@c-echan @@d] @@GYour title does NOT show when you use channels.\r\n" , ch ); send_to_char( "\n\r@@W[@@R-------@@eGame-play Options@@R-------@@W]\n\r", ch ); send_to_char( IS_SET(ch->config, CONFIG_NOFOLLOW ) ? "@@r[@@a+NOFOLLOW @@r] @@GYou do not allow people to follow you.\r\n" : "@@d[@@c-nofollow @@d] @@GYou allow people to follow you.\r\n" , ch ); send_to_char( "\n\r@@W[@@R--------@@eDisplay Options@@R--------@@W]\n\r", ch ); send_to_char( IS_SET(ch->config, CONFIG_COMBINE) ? "@@r[@@a+COMBINE @@r] @@GYou see object lists in combined format.\n\r" : "@@d[@@c-combine @@d] @@GYou see object lists in single format.\n\r" , ch ); send_to_char( IS_SET(ch->config, CONFIG_PROMPT) ? "@@r[@@a+PROMPT @@r] @@GYou have a prompt.\n\r" : "@@d[@@c-prompt @@d] @@GYou don't have a prompt.\n\r" , ch ); send_to_char( IS_SET(ch->config, CONFIG_EXITS ) ? "@@r[@@a+EXITS @@r] @@GYou see building exits at the bottom.\r\n" : "@@d[@@c-exits @@d] @@GYou do not see building exits at the bottom.\r\n" , ch ); send_to_char( IS_SET(ch->config, CONFIG_BRIEF ) ? "@@r[@@a+BRIEF @@r] @@GYou don't see buildings' descriptions.\r\n" : "@@d[@@c-brief @@d] @@GYou see buildings' descriptions.\r\n" , ch ); send_to_char( "\n\r@@W[@@R---------@@eColor Options@@R---------@@W]\n\r", ch ); send_to_char( IS_SET( ch->config, CONFIG_COLOR ) ? "@@r[@@a+COLOR @@r] @@GYou recieve 'ANSI' color.\n\r" : "@@d[@@c-color @@d] @@GYou don't receive 'ANSI' color.\n\r" , ch ); send_to_char( IS_SET(ch->config, CONFIG_NOCOLORS ) ? "@@r[@@a+NOCOLORS @@r] @@GYou see only map colors.\r\n" : "@@d[@@c-nocolors @@d] @@GYou see everything in colors (Turn this on to only see the map in color).\r\n" , ch ); send_to_char( IS_SET(ch->config, CONFIG_MINCOLORS ) ? "@@r[@@a+MINCOLORS@@r] @@GYou see minimal colors.\r\n" : "@@d[@@c-mincolors@@d] @@GYou see full colors (Turn this on to see less colors in the game).\r\n" , ch ); send_to_char( IS_SET(ch->config, CONFIG_NOBLACK ) ? "@@r[@@a+NOBLACK @@r] @@GYou do not see the color Black.\r\n" : "@@d[@@c-noblack @@d] @@GYou can see black text.\r\n" , ch ); send_to_char( "\n\r@@W[@@R----------@@eMap Options@@R----------@@W]\n\r", ch ); send_to_char( IS_SET(ch->config, CONFIG_INVERSE ) ? "@@r[@@a+INVERSE @@r] @@GYou see inversed map colors.\r\n" : "@@d[@@c-inverse @@d] @@GYou do not see inversed map colors.\r\n" , ch ); send_to_char( "\n\r@@W[@@R---------@@eEnhancements@@R----------@@W]\n\r", ch ); send_to_char( IS_SET(ch->config, CONFIG_SOUND) ? "@@r[@@a+SOUND @@r] @@GYou hear sounds sent by the mud.\n\r" : "@@d[@@c-sound @@d] @@GYou do not hear sounds sent by the mud.\n\r" , ch ); send_to_char( IS_SET(ch->config, CONFIG_IMAGE ) ? "@@r[@@a+IMAGE @@r] @@GYour client supports the IMAGE MXP tag.\n\r" : "@@d[@@c-image @@d] @@GYour client does not support the IMAGE MXP tag.\n\r" , ch ); send_to_char( "\n\r@@W[@@R--------@@eMisc. Settings@@R---------@@W]\n\r", ch ); send_to_char( IS_SET(ch->act, PLR_SILENCE) ? "@@r[@@a+SILENCE @@r] @@GYou are silenced.\n\r" : "" , ch ); send_to_char( !IS_SET(ch->act, PLR_NO_EMOTE) ? "" : "@@r[@@a+NOEMOTE @@r] @@GYou can't emote.\n\r" , ch ); send_to_char( !IS_SET(ch->act, PLR_NO_TELL) ? "" : "@@r[@@a+NOTELL @@r] @@GYou can't use 'tell'.\n\r" , ch ); send_to_char( IS_SET(ch->config, CONFIG_CLIENT) ? "@@r[@@a+CLIENT @@r] @@GYou are using the ASSAULT Client.\n\r" : "" , ch ); sprintf( buf, "@@aTerminal set to@@d @@c%i @@aRows@@d, @@c%i @@aColumns@@d.@@N\n\r", ch->pcdata->term_rows, ch->pcdata->term_columns ); send_to_char( buf, ch ); } else { bool fSet = FALSE; int bit,i=1; bool config_var= TRUE; if ( arg[0] == '+' ) fSet = TRUE; else if ( arg[0] == '-' ) fSet = FALSE; else { rev = TRUE; i=0; // send_to_char( "Config -option or +option?\n\r", ch ); // return; } if ( !str_cmp( arg+i, "combine" ) ) bit = CONFIG_COMBINE; else if ( !str_cmp( arg+i, "prompt" ) ) bit = CONFIG_PROMPT; else if ( !str_cmp( arg+i, "telnetga" ) ) bit = CONFIG_TELNET_GA; else if ( !str_cmp( arg+i, "color" ) ) bit = CONFIG_COLOR; else if ( !str_cmp( arg+i, "fullansi" ) ) bit = CONFIG_FULL_ANSI; else if ( !str_cmp( arg+i, "pubmail" ) ) bit = CONFIG_PUBMAIL; else if ( !str_cmp( arg+i, "sound" ) ) bit = CONFIG_SOUND; else if ( !str_cmp( arg+i, "echan" ) ) bit = CONFIG_ECHAN; else if ( !str_cmp( arg+i, "blind" ) ) bit = CONFIG_BLIND; else if ( !str_cmp( arg+i, "exits" ) ) bit = CONFIG_EXITS; else if ( !str_cmp( arg+i, "nocolors" ) ) bit = CONFIG_NOCOLORS; else if ( !str_cmp( arg+i, "mincolors" ) ) bit = CONFIG_MINCOLORS; else if ( !str_cmp( arg+i, "nofollow" ) ) bit = CONFIG_NOFOLLOW; else if ( !str_cmp( arg+i, "nomap" ) ) bit = CONFIG_NOMAP; else if ( !str_cmp( arg+i, "client" ) ) bit = CONFIG_CLIENT; else if ( !str_cmp( arg+i, "brief" ) ) bit = CONFIG_BRIEF; else if ( !str_cmp( arg+i, "image" ) ) bit = CONFIG_IMAGE; else if ( !str_cmp( arg+i, "noblack" ) ) bit = CONFIG_NOBLACK; else if ( !str_cmp( arg+i, "inverse" ) ) bit = CONFIG_INVERSE; else if ( !str_cmp( arg+i, "NOLEGEND" ) ) bit = CONFIG_NOLEGEND; else if ( !str_cmp(arg+i,"skipnewbie") ) { if ( IS_NEWBIE(ch) ) ch->played_tot = 5*3600; return; } else if ( !str_prefix("rows", arg+i ) ) { char arg1[MSL]; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg1 ); if ( !is_number( arg1 ) ) { send_to_char( "That is not a number.\n\r", ch ); return; } ch->pcdata->term_rows = URANGE( 10, atoi( arg1 ), 80 ); return; } else { send_to_char( "Config which option?\n\r", ch ); return; } if ( rev ) { fSet = !IS_SET(ch->config,bit); } if ( fSet ) { if(config_var) SET_BIT(ch->config, bit); else SET_BIT(ch->act, bit); // SET_BIT(config_var?ch->config:ch->act, bit); if ( bit != CONFIG_NOMAP ) send_to_char( "@@dEnabled.@@N\n\r", ch ); if ( bit == CONFIG_FULL_ANSI ) { char scrollbuf[MSL]; sprintf( scrollbuf, "%s%s%s%i;%ir%s%i;%iH", CRS_RESET, CRS_CLS, CRS_CMD, 0, ch->pcdata->term_rows - 12, CRS_CMD, ch->pcdata->term_rows - 13, 0 ); send_to_char( scrollbuf, ch ); } } else { if(config_var) REMOVE_BIT(ch->config, bit); else REMOVE_BIT(ch->act, bit); // REMOVE_BIT(config_var?ch->config:ch->act, bit); if ( bit != CONFIG_NOMAP ) send_to_char( "@@dDisabled.@@N\n\r", ch ); if ( bit == CONFIG_FULL_ANSI ) { send_to_char( CRS_RESET, ch ); send_to_char( "Done.\n\r", ch ); } if ( bit == CONFIG_SOUND ) send_to_char("!!MUSIC(off)\n\r", ch ); } if ( bit == CONFIG_NOMAP && !IS_SET(ch->config,CONFIG_NOMAP) ) do_look(ch,""); if ( IS_SET(ch->config,CONFIG_BLIND) ) { send_to_char( "Note: To see the details of the buildings around you, type \"buildings\". You may also specify the specific player you want to display.\n\r", ch ); sprintf(buf,"%s turned CONFIG_BLIND on.",ch->name); log_f(buf); } else if (bit == CONFIG_BLIND) { sprintf(buf,"%s turned CONFIG_BLIND off.",ch->name); log_f(buf); } } save_char_obj(ch); return; } void do_wizlist ( CHAR_DATA *ch, char *argument ) { do_help ( ch, "wizlist" ); return; } void do_gptrade ( CHAR_DATA *ch, char *argument ) { do_help (ch, "gptrade" ); return; } void do_pubmail ( CHAR_DATA *ch, char *argument ) { ( IS_SET ( ch->config, CONFIG_PUBMAIL ) ? do_config( ch, "-pubmail" ) : do_config( ch, "+pubmail" ) ); } void do_sound ( CHAR_DATA *ch, char *argument ) { ( IS_SET ( ch->config, CONFIG_SOUND ) ? do_config( ch, "-sound" ) : do_config( ch, "+sound") ); } void do_combine ( CHAR_DATA *ch, char *argument ) { ( IS_SET ( ch->config, CONFIG_COMBINE ) ? do_config( ch, "-combine" ) : do_config( ch, "+combine" ) ); } void do_pagelen ( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; int lines; one_argument( argument, arg ); if ( arg[0] == '\0' ) { sprintf( buf, "Your page length is %d.\n\r", ch->pcdata->pagelen ); send_to_char(buf,ch); return; } else lines = atoi( arg ); if ( lines < 1 ) { send_to_char( "Negative or Zero values for a page pause is not legal.\n\r", ch ); return; } ch->pcdata->pagelen = lines; sprintf( buf, "Page pause set to %d lines.\n\r", lines ); send_to_char( buf, ch ); return; } void do_prompt( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; buf[0] = '\0'; if ( argument[0] == '\0' || !str_cmp(argument,"off") ) { ( IS_SET ( ch->config, CONFIG_PROMPT ) ? do_config( ch, "-prompt" ) : do_config( ch, "+prompt" ) ); return; } if ( !str_cmp(argument,"all") ) strcpy( buf, "@@e%h/%Hhp @@G>@@N " ); else if ( !str_cmp(argument,"newbie") ) strcpy( buf, "@@W(@@c%C-%s@@W) @@W[@@gExits:%E@@W] @@W[@@GCash:@@r %$@@W] @@e%h/%H@@Rhp @@N> "); else if ( !str_cmp(argument,"cool") ) strcpy( buf, "@@c[%q] @@e[@@r%h@@G/@@r%H@@Ghp @@r%T@@Gft @@y%Q@@Gqp@@e] @@cV: @@a%v@@c/@@a%V@@chp @@a%f@@c/@@a%F@@cmv @@a%m@@c/@@a%M@@cam (%C)@@N " ); else if ( !str_cmp(argument,"riune") ) strcpy( buf, "@@W[@@G%C@@W|@@N%s@@W] [HP: @@e%h@@W] [T: @@e%T@@W] [@@e%E@@W] [Cash: @@G%$@@W]@@N " ); else { if ( strlen(argument) > 200 ) argument[200] = '\0'; strcpy( buf, argument ); smash_tilde( buf ); } free_string( ch->prompt ); ch->prompt = str_dup( buf ); send_to_char( "Ok.\n\r", ch ); return; } void do_auto( CHAR_DATA *ch, char *argument ) { do_config( ch, argument ); return; } void do_diagnose( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; int pct; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Diagnose whom?\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They're not here.\n\r", ch ); return; } if ( can_see( ch, victim ) ) { act( "$n gives you the once-over.", ch, NULL, victim, TO_VICT ); act( "$n gives $N the once-over.", ch, NULL, victim, TO_NOTVICT ); } else { send_to_char( "They're not here.\n\r", ch ); return; } if ( victim->max_hit > 0 ) pct = ( 100 * victim->hit ) / victim->max_hit; else pct = -1; strcpy( buf, PERS(victim, ch) ); if ( pct >= 100 ) safe_strcat(MAX_STRING_LENGTH, buf, " -- [5] 4 3 2 1 \n\r" ); else if ( pct >= 80 ) safe_strcat(MAX_STRING_LENGTH, buf, " -- 5 [4] 3 2 1 \n\r" ); else if ( pct >= 60 ) safe_strcat(MAX_STRING_LENGTH, buf, " -- 5 4 [3] 2 1 \n\r" ); else if ( pct >= 40 ) safe_strcat(MAX_STRING_LENGTH, buf, " -- 5 4 3 [2] 1 \n\r" ); else safe_strcat(MAX_STRING_LENGTH, buf, " -- 5 4 3 2 [1] \n\r" ); buf[0] = UPPER(buf[0]); send_to_char( buf, ch ); return; } void do_color( CHAR_DATA *ch, char *argument ) { if ( IS_SET(ch->config,CONFIG_COLOR) ) do_config(ch,"-color"); else do_config(ch,"+color"); return; } /* A simple, return the char sequence, function -S- */ char * color_string( CHAR_DATA *ch, char *argument ) { int cnt; int num; /* if we don't want to send the string, return "" */ /* argument should be the string to find, eg "say" */ if ( IS_NPC( ch ) || argument[0] == '\0' ) return( "" ); if ( !IS_SET( ch->config, CONFIG_COLOR ) ) return( "" ); if ( !str_cmp( argument, "normal" ) ) return( "\x1b[0m" ); /* By here, ch is a PC and wants color */ num = -1; for ( cnt = 0; cnt < MAX_color; cnt ++ ) if ( !str_cmp( argument, color_table[cnt].name ) ) num = cnt; if ( num == -1 ) /* bug report? */ return( "" ); return( ansi_table[ch->pcdata->color[num]].value ); } void do_whois( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; if ( ( victim = get_char_world( ch, argument ) ) == NULL ) { send_to_char( "No such player found.\n\r", ch ); return; } if ( !can_see( ch, victim ) ) { send_to_char( "No such player found.\n\r", ch ); return; } /* Ok, so now show the details! */ sprintf( buf, "@@r+@@G-=-=-=-=-=-=-=-=-=-=- @@c%11s @@G-=-=-=-=-=-=-=-=-=-=-@@r+@@N\n\r", victim->name ); if ( IS_IMMORTAL( victim ) ) { sprintf( buf+strlen(buf), " @@r[ %3s @@r]@@N\n\r", victim->pcdata->who_name ); } if ( IS_GUIDE ( victim ) ) { sprintf( buf+strlen(buf), " @@r[ NEWBIE HELPER @@r]@@N\n\r" ); } sprintf( buf+strlen(buf), "@@GRank@@d: @@r%d@@G Play Time@@d: @@r%d Hours (%d Total)\n\r", get_rank(victim), my_get_hours(victim,FALSE), my_get_hours(victim,TRUE) ); sprintf( buf+strlen(buf), "@@ePK Statistics\n\r" ); sprintf( buf+strlen(buf), "@@bPlayers Killed@@d: @@y%d@@b (@@y%d@@b).\n\r", victim->pcdata->pkills, victim->pcdata->tpkills ); sprintf( buf+strlen(buf), "@@bBuildings Destroyed@@d: @@y%d@@b (@@y%d@@b).\n\r", victim->pcdata->bkills, victim->pcdata->tbkills ); sprintf( buf+strlen(buf), "@@bDeaths@@d: @@y%d@@b.\n\r", victim->pcdata->deaths ); if ( victim->pcdata->blost <= 30000 ) sprintf( buf+strlen(buf), "@@bBuildings Lost@@d: @@y%d@@b.\n\r\n\r", victim->pcdata->blost ); else sprintf( buf+strlen(buf), "@@bBuildings Lost@@d: @@yOver 30,000@@b.\n\r\n\r" ); sprintf( buf+strlen(buf), "@@eMinigame Statistics\n\r" ); sprintf( buf+strlen(buf), "@@cPaintball: @@dHits: @@W%d @@dLosses: @@W%d\n\r", victim->pcdata->pbhits, victim->pcdata->pbdeaths ); sprintf( buf+strlen(buf), "@@cNUKEM: @@dWins: @@W%d\n\r", victim->pcdata->nukemwins ); if ( IS_SET ( victim->config, CONFIG_PUBMAIL ) ) sprintf(buf+strlen(buf), "\n\r@@WEmail: %s@@N\n\r", victim->pcdata->email_address ); sprintf( buf+strlen(buf), "@@r+@@G-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-@@r+@@N\n\r"); send_to_char(buf,ch); return; } void do_afk( CHAR_DATA *ch, char *argument ) { int value; if ( ch->fighttimer > 0 ) { send_to_char( "Excuse me? While in combat? I don't think so.\n\r", ch ); return; } value = PFLAG_AFK; if ( IS_SET( ch->pcdata->pflags, value ) ) { REMOVE_BIT( ch->pcdata->pflags, value ); send_to_char( "AFK flag turned off.\n\r", ch ); } else { SET_BIT( ch->pcdata->pflags, value ); send_to_char( "AFK flag turned on. Remember, you are AFK at your own risk - People CAN come and attack you!\n\r", ch ); } return; } void do_colist( CHAR_DATA *ch, char *argument ) { int col, n; char buf[MAX_STRING_LENGTH]; if IS_NPC( ch ) return; send_to_char( "@@WColor Codes: @@yTo use color codes within a string, use the following\n\r", ch ); send_to_char( "characters in sequence: @@@@<letter>.@@N\n\r\n\r", ch ); n = 0; for ( col = 0; col < MAX_ANSI; col++ ) { if ( col >= 29 ) continue; sprintf( buf, "%c - %s%-14s@@N ", ansi_table[col].letter, IS_SET( ch->config, CONFIG_COLOR ) ? ansi_table[col].value : "", ansi_table[col].name ); send_to_char( buf, ch ); if ( ++n % 3 == 0 ) send_to_char( "\n\r", ch ); } if ( n % 3 != 0 ) send_to_char( "\n\r", ch ); send_to_char( "\n\r", ch ); return; } void do_highscores( CHAR_DATA *ch, char *argument ) { int i,max,j, leng; char buf[MSL]; int order[100]; bool appears[100]; for ( i = 0;i<100;i++ ) { order[i] = -1; appears[i] = FALSE; } // order[0] = 0; for ( j = 0;j < 100;j++ ) { max = -1; for ( i=0;i<100;i++ ) { if ( score_table[i].kills == 0 && score_table[i].buildings == 0 && score_table[i].time == 0 ) continue; if ( appears[i] ) continue; if ( j >= 99 ) break; if ( (( score_table[max].kills < score_table[i].kills || ( score_table[i].kills == score_table[max].kills && score_table[i].buildings > score_table[max].buildings ) || ( score_table[max].kills == score_table[i].kills && score_table[max].buildings == score_table[i].buildings && score_table[max].time < score_table[i].time ) ) && !appears[i] )) { max = i; } } if ( !appears[max] ) { order[j] = max; appears[max] = TRUE; } } leng = 30; if ( argument[0] != '\0' && is_number(argument) ) leng = atoi(argument); if ( leng > 100 || leng <= 0 ) { send_to_char( "Length must be from 1 to 100.\n\r", ch ); return; } send_to_char( "\n\r@@G @@d| @@GName @@d| @@GKills @@d| @@GBuildings @@d| @@GHours @@d| @@GKilled By\n\r", ch ); sprintf( buf, "@@r------------------------------------------------------------------------------\n\r" ); for ( i=0;i<leng;i++ ) { if ( order[i] == -1 || score_table[i].name == NULL ) break; sprintf( buf+strlen(buf), "@@W%2d@@d| @@a%-12s @@d| @@e%4d @@d| @@b%4d @@d| @@c%2d @@d| @@y%-13s\n\r", i+1, score_table[order[i]].name, score_table[order[i]].kills, score_table[order[i]].buildings, score_table[order[i]].time, score_table[order[i]].killedby ); if ( i == leng / 2 ) { send_to_char( buf, ch ); buf[0] = '\0'; } } send_to_char( buf, ch ); send_to_char( "@@r------------------------------------------------------------------------------@@N\n\r", ch ); return; } void do_highranks( CHAR_DATA *ch, char *argument ) { int i,max,j, leng; char buf[MSL]; int order[30]; bool appears[30]; for ( i = 0;i<30;i++ ) { order[i] = -1; appears[i] = FALSE; } for ( j = 0;j < 30;j++ ) { max = -1; for ( i=0;i<30;i++ ) { if ( j >= 30 ) break; if ( rank_table[i].rank <= 1 || rank_table[i].name == NULL || appears[i] ) continue; if ( max == -1 || rank_table[i].rank > rank_table[max].rank ) max = i; } if ( !appears[max] ) { order[j] = max; appears[max] = TRUE; } } leng = 10; if ( argument[0] != '\0' && is_number(argument) ) leng = atoi(argument); if ( leng > 30 || leng <= 0 ) { send_to_char( "Length must be from 1 to 30.\n\r", ch ); return; } send_to_char( "\n\r@@G @@d| @@GName @@d| @@GRank\n\r", ch ); sprintf( buf, "@@r----------------------------------------\n\r" ); for ( i=0;i<leng;i++ ) { if ( order[i] == -1 || rank_table[order[i]].name == NULL ) { sprintf( buf+strlen(buf), "End of list.\n\r" ); break; } sprintf( buf+strlen(buf), "@@W%2d@@d| @@a%-12s @@d| @@e%4d\n\r", i+1, rank_table[order[i]].name, rank_table[order[i]].rank ); if ( i == leng / 2 ) { send_to_char( buf, ch ); buf[0] = '\0'; } } send_to_char( buf, ch ); sprintf( buf, "@@r----------------------------------------\n\r" ); return; } void do_map( CHAR_DATA *ch, char *argument ) { if ( !str_cmp(argument,"legend") || !str_cmp(argument,"legand")) { int i; float s; char buf[MSL]; for ( i=0;i<SECT_MAX;i++ ) { s = (float)(wildmap_table[i].speed)/PULSE_PER_SECOND; sprintf( buf, "%s%s @@N- %-20s @@dRun Time: @@g%5.2f Seconds, @@cFuel: @@a%-3d\n\r",wildmap_table[i].color,wildmap_table[i].mark, wildmap_table[i].name, s, wildmap_table[i].fuel ); send_to_char(buf,ch); } return; } else if ( is_number(argument) ) { if ( atoi(argument) < 3 || atoi(argument) > 25 ) { send_to_char( "Invalid value.\n\r", ch ); return; } ch->map = atoi(argument); send_to_char( "Map size set.\n\r", ch); save_char_obj(ch); return; } else { do_look(ch,"outside"); return; } return; } void do_alias( CHAR_DATA *ch, char *argument ) { char arg[MSL]; char arg2[MSL]; int i; argument = one_argument(argument,arg); argument = one_argument(argument,arg2); if ( arg[0] == '\0' || arg2[0] == '\0' || !is_number(arg) || is_number(arg2) ) { char buf[MSL]; for (i=0;i<30;i++) { if ( str_cmp(ch->alias[i],"") ) { sprintf( buf, "%d. %s -> %s\n\r", i+1,ch->alias[i],ch->alias_command[i]); send_to_char( buf, ch); } } return; } i = atoi(arg); if ( i < 1 || i > 30 ) { send_to_char( "1 - 30 Please.\n\r", ch); return; } i--; free_string(ch->alias[i]); free_string(ch->alias_command[i]); if ( !str_cmp(arg2,"remove") ) { ch->alias[i] = str_dup(""); ch->alias_command[i] = str_dup(""); } else { ch->alias[i] = str_dup(arg2); ch->alias_command[i] = str_dup(argument); } send_to_char( "Ok.\n\r", ch); return; } void do_quest( CHAR_DATA *ch, char *argument ) { char buf[MSL]; char rbuf[MSL]; char borderbuf[MSL]; int i = 0,x; bool planet = FALSE; OBJ_INDEX_DATA *pObj; if ( !str_prefix(argument,"planet") && argument[0] != 0 ) planet = TRUE; if ( argument[0] == '\0' || planet ) { x = 0; send_to_char("\n\r", ch ); sprintf( borderbuf, "@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@W-@@g-@@N\n\r" ); if ( !IS_SET(ch->config,CONFIG_BLIND) ) send_to_char( borderbuf, ch ); for ( i=0;i<MAX_QUESTS;i++ ) { if ( quest_table[i].type == 1 ) { pObj = get_obj_index(quest_table[i].reward); if (!pObj) continue; sprintf(rbuf,"%s", pObj->short_descr ); } else sprintf(rbuf,"$%d", quest_table[i].reward ); if ( quest_table[i].target && !can_see(ch,quest_table[i].target) ) continue; if ( quest_table[i].bld ) { if ( IS_SET(ch->config,CONFIG_BLIND) ) sprintf(buf,"%2d. Target: %-8s's %-10s. Reward: %s. Time: %d Seconds\n\r", i+1,quest_table[i].target->name, quest_table[i].bld->name, rbuf, quest_table[i].time ); else sprintf(buf,"@@W| %2d. @@N%-8s's %-10s [%s] [Time: %d Seconds]\n\r", i+1,quest_table[i].target->name, quest_table[i].bld->name, rbuf, quest_table[i].time ); send_to_char(buf,ch); x++; } else if ( quest_table[i].target ) { if ( IS_SET(ch->config,CONFIG_BLIND) ) sprintf(buf,"%2d. Target: %-20s. Reward: %s. Time: %d Seconds\n\r", i+1,quest_table[i].target->name,rbuf, quest_table[i].time ); else sprintf(buf,"@@W| %2d. @@N%-20s [%s] [Time: %d Seconds]\n\r", i+1,quest_table[i].target->name,rbuf, quest_table[i].time ); send_to_char(buf,ch); x++; } } if ( x == 0 ) { send_to_char( "@@W| @@NNo quests found.\n\r", ch ); } if ( !IS_SET(ch->config,CONFIG_BLIND) ) send_to_char( borderbuf, ch ); // send_to_char( "\n\r@@eType Quest <quest number> to see the clue. (Quest 1, for example)\n\r", ch ); return; } else if (is_number(argument) ) { bool found = FALSE; i = atoi(argument); if ( i < 1 || i > MAX_QUESTS ) { send_to_char( "That is not a valid quest number.\n\r", ch); return; } i--; if ( !found ) { send_to_char( "That is not a valid quest number.\n\r", ch); return; } send_to_char( "Invalid selection.\n\r", ch ); } return; } void do_identify( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; char buf[MSL]; int val; if ( ( obj = get_obj_carry(ch,argument) ) == NULL ) { send_to_char( "You do not possess that.\n\r", ch ); return; } if ( obj->item_type == ITEM_ARMOR ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); send_to_char( buf, ch ); sprintf( buf, "Rarity/Quality: %d%%\n\r", obj->level ); send_to_char( buf, ch ); sprintf( buf, "Heat Addition: %d\n\r", obj->heat ); send_to_char(buf,ch); sprintf( buf, "Equipment Damage: %d\n\r\n\r", obj->value[1] ); send_to_char(buf,ch); sprintf( buf, "\n\rDamage Absorption:\n\r" ); val = 2; if ( obj->value[val] != 0 ) sprintf(buf+strlen(buf), "%s vs. General Damage: %d%%\n\r", (obj->value[val]<0)?"Weak":"Strong", obj->value[val]); val = 3; if ( obj->value[val] != 0 ) sprintf(buf+strlen(buf), "%s vs. Bullet Damage: %d%%\n\r", (obj->value[val]<0)?"Weak":"Strong", obj->value[val]); val = 4; if ( obj->value[val] != 0 ) sprintf(buf+strlen(buf), "%s vs. Blast Damage: %d%%\n\r", (obj->value[val]<0)?"Weak":"Strong", obj->value[val] ); val = 5; if ( obj->value[val] != 0 ) sprintf(buf+strlen(buf), "%s vs. Acid Damage: %d%%\n\r", (obj->value[val]<0)?"Weak":"Strong", obj->value[val] ); val = 6; if ( obj->value[val] != 0 ) sprintf(buf+strlen(buf), "%s vs. Fire Damage: %d%%\n\r", (obj->value[val]<0)?"Weak":"Strong", obj->value[val] ); val = 7; if ( obj->value[val] != 0 ) sprintf(buf+strlen(buf), "%s vs. Laser Damage: %d%%\n\r", (obj->value[val]<0)?"Weak":"Strong", obj->value[val]); val = 8; if ( obj->value[val] != 0 ) sprintf(buf+strlen(buf), "%s vs. Sound Damage: %d%%\n\r", (obj->value[val]<0)?"Weak":"Strong", obj->value[val]); send_to_char( buf, ch ); if ( obj->pIndexData->building != -1 ) { sprintf( buf, "Generates in: %s\n\r", build_table[obj->pIndexData->building].name ); send_to_char( buf, ch ); } } else if ( obj->item_type == ITEM_WEAPON ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); send_to_char( buf, ch ); sprintf( buf, "Rarity: %d%%\n\r", obj->level ); send_to_char( buf, ch ); sprintf( buf, "Ammo: %d/%d\n\r", obj->value[0], obj->value[1] ); send_to_char( buf, ch ); sprintf( buf, "Range: %d Rooms\n\r", obj->value[4] + 1 ); send_to_char( buf, ch ); sprintf( buf, "Scope: %d\n\r", obj->value[6] ); send_to_char( buf, ch ); sprintf( buf, "Ammo Type: %s\n\r", clip_table[obj->value[2]].name ); send_to_char( buf, ch ); sprintf( buf, "Damage: %d\n\r", clip_table[obj->value[2]].dam + obj->value[7] ); send_to_char( buf, ch ); sprintf( buf, "Building Damage: %d\n\r", clip_table[obj->value[2]].builddam + obj->value[8] ); send_to_char( buf, ch ); sprintf( buf, "Hit Chance: %d%%\n\r", clip_table[obj->value[2]].miss + obj->value[10] ); send_to_char( buf, ch ); sprintf( buf, "Explodes: %s\n\r", ( clip_table[obj->value[2]].explode == TRUE ) ? "Yes (50% of double building damage)" : "No" ); send_to_char( buf, ch ); sprintf( buf, "Delay: %d\n\r\n\r", clip_table[obj->value[2]].speed + obj->value[9] ); if ( obj->pIndexData->building != -1 ) { sprintf( buf+strlen(buf), "Generates in: %s\n\r", build_table[obj->pIndexData->building].name ); send_to_char( buf, ch ); } if ( IS_SET(obj->value[3],WEAPON_CONFUSING) ) send_to_char( "* Special Effect: Confusion\n\r", ch ); if ( IS_SET(obj->value[3],WEAPON_ALCOHOL) ) send_to_char( "* Special Effect: Alcohol\n\r", ch ); if ( IS_SET(obj->value[3],WEAPON_BLINDING) ) send_to_char( "* Special Effect: Blindness\n\r", ch ); if ( IS_SET(obj->value[3],WEAPON_HITS_AIR) ) send_to_char( "\n\r* This weapon can hit airborn targets.\n\r", ch ); } else if ( obj->item_type == ITEM_INSTALLATION ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); if ( obj->value[1] != 0 ) sprintf( buf+strlen(buf), "Installs in: %s\n\r", ( obj->value[1] == -1 ) ? "All Buildings" : build_table[obj->value[1]].name ); if ( obj->value[2] > 0 ) sprintf( buf+strlen(buf), "Installs in: %s\n\r", build_table[obj->value[2]].name ); if ( obj->value[3] > 0 ) sprintf( buf+strlen(buf), "Installs in: %s\n\r", build_table[obj->value[3]].name ); if ( obj->value[4] > 0 ) sprintf( buf+strlen(buf), "Installs in: %s\n\r", build_table[obj->value[4]].name ); sprintf( buf+strlen(buf),"\n\r" ); if ( obj->pIndexData->building != -1 ) { sprintf( buf+strlen(buf), "Generates in: %s\n\r", build_table[obj->pIndexData->building].name ); send_to_char( buf, ch ); } } else if ( obj->item_type == ITEM_WEAPON_UP ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); sprintf( buf+strlen(buf), "Weapon installation: Install using the command @@eWInstall@@N.\n\r" ); sprintf( buf+strlen(buf), "No further info...\n\r" ); send_to_char( buf, ch ); } else if ( obj->item_type == ITEM_VEHICLE_UP ) { int i; sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); sprintf( buf+strlen(buf), "Vehicle Addon: Install using the command @@eVInstall@@N.\n\r" ); for ( i=2;i<10;i++ ) { if ( i > 0 && i < MAX_VEHICLE ) sprintf( buf+strlen(buf), "Installs on: %s.\n\r", vehicle_desc[obj->value[i]] ); } send_to_char( buf, ch ); } else if ( obj->item_type == ITEM_BOMB ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); sprintf( buf+strlen(buf), "Timer Set to: %d\n\r", obj->value[0] ); sprintf( buf+strlen(buf), "Armed: %s\n\r", (obj->value[1] != 0)?"Yes":"No"); sprintf( buf+strlen(buf), "Weight: %d\n\r", get_obj_weight(obj) ); sprintf( buf+strlen(buf), "Damage Modifier: %d\n\r", obj->value[2] ); sprintf( buf+strlen(buf), "Damage Range: %d - %d\n\r", (obj->weight*obj->value[2]/2), obj->weight * obj->value[2] ); sprintf( buf+strlen(buf), "Dud Chance: %d%%\n\r", obj->value[4] ); if ( obj->value[3] == 1 ) sprintf( buf+strlen(buf), "\n\r* Nuclear\n\r" ); if ( obj->pIndexData->vnum == OBJ_VNUM_GRANADE ) sprintf( buf+strlen(buf), "\n\r* Grenade\n\r" ); if ( obj->pIndexData->vnum == OBJ_VNUM_FLASH_GRENADE ) sprintf( buf+strlen(buf), "\n\r* Flash Grenade - Only damages people\n\r" ); if ( obj->pIndexData->vnum == OBJ_VNUM_SMOKE_BOMB ) sprintf( buf+strlen(buf), "\n\r* Smoke Bomb - Only damages people\n\r" ); if ( CAN_WEAR( obj, ITEM_WEAR_BODY ) ) sprintf( buf+strlen(buf), "\n\r* Deadman Switch - Explodes when you die if worn\n\r" ); send_to_char( buf, ch ); } else if ( obj->item_type == ITEM_BLUEPRINT ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); sprintf( buf+strlen(buf), "Upgrades: %s\n\r", build_table[obj->value[0]].name ); if ( obj->value[1] == 0 ) sprintf( buf+strlen(buf), "Upgrades to level: %d\n\r", obj->level ); else sprintf( buf+strlen(buf), "Upgrades into: %s\n\r", build_table[obj->value[1]].name ); send_to_char( buf, ch ); } else if ( obj->item_type == ITEM_MEDPACK ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); sprintf( buf+strlen(buf), "Quality: %d\n\r", obj->value[0] ); sprintf( buf+strlen(buf), "\n\rNote: Use the @@eHeal@@N command to use. Some types of medpacks can be poisonous.\n\r" ); send_to_char( buf, ch ); } else if ( obj->item_type == ITEM_COMPUTER ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); sprintf( buf+strlen(buf), "Range: %d\n\rBattery: %d\n\r", obj->value[0], obj->value[1] ); send_to_char( buf, ch ); } else if ( obj->item_type == ITEM_TOOLKIT ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); sprintf( buf+strlen(buf),"Quality: %d\n\r", obj->level ); send_to_char( buf, ch ); } else if ( obj->item_type == ITEM_DISK ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); sprintf( buf+strlen(buf), "Version: %d.%d\n\r", obj->value[1]/10,obj->value[1]%10 ); send_to_char( buf, ch ); } else if ( obj->item_type == ITEM_SCAFFOLD ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); sprintf( buf+strlen(buf), "Scaffold Item - Drop outside to make it open into a building.\n\r" ); sprintf(buf+strlen(buf), "Building: %s\n\r", build_table[obj->value[0]].name ); sprintf(buf+strlen(buf), "Level: %d\n\r", obj->level ); send_to_char( buf, ch ); } else if ( obj->item_type == ITEM_SUIT ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); sprintf( buf+strlen(buf), "Type: %s\n\r", (obj->value[0]==0)?"Jammer - Causes invisiblity against players and defenses":(obj->value[0]==0)?"Nullification - Removes bad effects instantly":"Unknown" ); sprintf( buf+strlen(buf), "Quality: %d\n\r", obj->value[1] ); send_to_char( buf, ch ); } else if ( obj->item_type == ITEM_ORE ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); sprintf( buf+strlen(buf), "Unprocessed Ore - @@eResearch@@N in space to create an item!\n\r" ); sprintf( buf+strlen(buf), "Research Time: %d Seconds (About %d minutes)\n\r", obj->value[0], obj->value[0]/60 ); send_to_char( buf, ch ); } else if ( obj->item_type == ITEM_BIOTUNNEL ) { sprintf( buf, "Statistics for: %s\n\r", capitalize(obj->short_descr) ); sprintf( buf+strlen(buf), "BioTunnel - Transports items from a Transmitting tunnel to Receiving using the SETTUNNEL command.\n\r" ); sprintf( buf+strlen(buf), "Type: %s\n\r", (obj->value[0]==1)?"Transmitting":"Receiving"); if ( obj->value[0] == 1 ) sprintf( buf+strlen(buf), "Range: %d\n\r", obj->value[1]); send_to_char( buf, ch ); } else send_to_char( "You cannot identify this type of item.\n\r", ch ); sprintf( buf, "\n\rItem type: %s\n\r", item_type_name(obj) ); send_to_char(buf,ch); return; } void do_skills( CHAR_DATA *ch, char *argument ) { char buf[MSL]; char cbuf[MSL]; int i; sprintf( cbuf, "\n\r @@rProficiencies:@@N\n\r@@g-------------------------------------------------------------------------------\n\r" ); send_to_char( "\n\r @@rNormal Skills:@@N\n\r@@g-------------------------------------------------------------------------------\n\r", ch ); for ( i = 0;skill_table[i].gsn != -1;i++ ) { if ( skill_table[i].prof ) { sprintf( cbuf+strlen(cbuf), "@@g| @@c%25s @@g| @@c%-40s @@g| %3d @@g|\n\r", skill_table[i].name, skill_table[i].desc, ch->pcdata->skill[skill_table[i].gsn] ); continue; } sprintf( buf, "@@g| @@c%25s @@g| @@c%-40s @@g| %3d%% @@g|\n\r", skill_table[i].name, skill_table[i].desc, ch->pcdata->skill[skill_table[i].gsn] ); send_to_char( buf, ch ); } send_to_char("-------------------------------------------------------------------------------\n\r", ch ); send_to_char(cbuf,ch); send_to_char("-------------------------------------------------------------------------------\n\r", ch ); send_to_char("\n\r",ch); for ( i=0;ability_table[i].economics != -1;i++ ) { if ( has_ability(ch,i) ) { sprintf(buf,"@@gYou have unlocked: @@x%s@@g (%s)!\n\r",ability_table[i].name,ability_table[i].desc); send_to_char(buf,ch); } } return; } void do_classes( CHAR_DATA *ch, char *argument ) { int i; char buf[MSL]; char buf2[MSL]; int rank = get_rank(ch); sprintf( buf, "\n\r@@NClasses available to you:\n\r\n\r" ); sprintf( buf2, "\n\r@@dClasses not available to you yet (At rank %d):\n\r\n\r", rank ); for ( i=0;i<MAX_CLASS;i++ ) { if ( class_table[i].rank <= rank ) sprintf( buf+strlen(buf), "%s%s - %s: %s\n\r", ( class_table[i].rec ) ? "@@a" : "@@c", class_table[i].who_name, class_table[i].name, class_table[i].desc ); else sprintf( buf2+strlen(buf2), "%s (Requires rank %d)\n\r", class_table[i].name, class_table[i].rank ); } send_to_char( buf2, ch ); send_to_char( buf, ch ); send_to_char( "\n\rClasses in @@alight cyan@@c (For people with color) are recommended for new players.\n\r", ch ); return; } void do_status( CHAR_DATA *ch, char *argument ) { if ( IS_SET(ch->config,CONFIG_BLIND) ) { do_vehicle_status(ch,argument); return; } do_a_build(ch,"report"); return; } void do_info( CHAR_DATA *ch, char *argument ) { char arg[MSL]; int x,y,hp,shield; BUILDING_DATA *bld; char buf[MSL]; argument = one_argument(argument,arg); if ( !is_number(arg) || !is_number(argument) ) { send_to_char( "Syntax: info <x> <y>\n\r", ch ); return; } x = atoi(arg); y = atoi(argument); if ( INVALID_COORDS(x,y) ) { send_to_char( "Invalid coords.\n\r", ch ); return; } if (( !IS_BETWEEN(x,ch->x-ch->map,ch->x+ch->map) || !IS_BETWEEN(y,ch->y-ch->map,ch->y+ch->map)) && !IS_IMMORTAL(ch) ) { send_to_char( "You can't see that far.\n\r", ch ); return; } if ( ( bld = get_building(x,y,ch->z) ) == NULL ) { send_to_char( "You don't see a building there.\n\r", ch ); return; } if ( bld->type == BUILDING_DUMMY && (bld->value[0] < 1 || bld->value[0] >= MAX_BUILDING )) bld->value[0] = BUILDING_TURRET; shield = 0; hp = 0; if ( bld->maxhp > 0 ) hp = ((10000/(bld->maxhp))*bld->hp)/100; if ( bld->maxshield > 0 ) shield = ((10000/(bld->maxshield))*bld->shield)/100; sprintf( buf, "Building: %s.\n\rOwned By: %s.\n\rHP: %d%% Shield: %d%%\n\r", (bld->type != BUILDING_DUMMY) ? bld->name : build_table[bld->value[0]].name , bld->owned,hp,shield ); if ( !complete(bld) ) sprintf(buf+strlen(buf),"\n\r@@eINCOMPLETE BUILDING@@N\n\r" ); send_to_char(buf,ch); if ( ch->class == CLASS_SPY ) { buf[0] = '\0'; send_to_char("\n\rYour spies report the following:\n\r", ch ); sprintf( buf+strlen(buf), "\n\rHP: @@e%d/@@R%d@@N Shield: @@y%d@@b/%d@@N Level: @@c%d@@N\n\r", bld->hp, bld->maxhp, bld->shield, bld->maxshield, bld->level ); sprintf( buf+strlen(buf), "\n\rYou can enter the building from the:" ); if ( bld->exit[DIR_NORTH] ) safe_strcat(MSL,buf," @@gNorth"); if ( bld->exit[DIR_SOUTH] ) safe_strcat(MSL,buf," @@bSouth"); if ( bld->exit[DIR_EAST] ) safe_strcat(MSL,buf," @@cEast"); if ( bld->exit[DIR_WEST] ) safe_strcat(MSL,buf," @@RWest"); safe_strcat(MSL,buf,"@@N.\n\r"); if ( bld->type == BUILDING_DUMMY ) safe_strcat(MSL,buf,"\n\r* This building is a dummy trap!\n\r" ); send_to_char(buf,ch); } return; } void set_max_ever( int max ) { FILE * fp; extern int max_players; extern int max_players_ever; fclose( fpReserve ); // max_players_ever = max; if ( ( fp = fopen( MAX_PLAYERS_FILE, "w" ) ) == NULL ) { bug( "Set Max Ever: fopen", 0 ); perror( "failed open of max_players_file in set_max_ever" ); } else { fprintf(fp,"%d\n%d",max_players_ever,(max)?0:max_players); } fflush(fp); fclose(fp); fpReserve = fopen( NULL_FILE, "r" ); return; } void show_building_info(CHAR_DATA *ch, int i) { int j; bool ter[SECT_MAX]; char buf[MSL]; extern char *building_title[MAX_BUILDING_TYPES]; if ( i<0 || i >= MAX_BUILDING ) return; for ( j=0;j<SECT_MAX;j++ ) ter[j] = FALSE; if ( IS_SET(ch->config,CONFIG_CLIENT) ) { REMOVE_BIT(ch->config,CONFIG_COLOR); send_to_char("\4",ch); } sprintf( buf, "@@dBuilding Information:\n\r@@aName:@@c %s %s\n\r@@aHP:@@c %d @@aShield:@@c %d\n\r@@aType:@@c %s\n\r@@aMax Allowed: @@c%d\n\r@@aCost: @@c%d.\n\r", build_table[i].name, build_table[i].symbol, build_table[i].hp, build_table[i].shield, building_title[build_table[i].act], build_table[i].max, build_table[i].cost); if ( !IS_SET(ch->config,CONFIG_CLIENT) ) { if ( build_table[i].requirements > 0 ) { sprintf(buf+strlen(buf),"@@aRequires: @@c%s", build_table[build_table[i].requirements].name ); if ( build_table[i].requirements_l > 1 ) sprintf(buf+strlen(buf), " Level %d", build_table[i].requirements_l ); } send_to_char( buf, ch ); if ( build_table[i].rank > 0 ) sprintf( buf, " and Rank %d.\n\r", build_table[i].rank ); else sprintf( buf, "\n\r" ); send_to_char(buf,ch); for ( j = 0;j<MAX_BUILDING;j++ ) if ( build_table[j].requirements == i && build_table[j].rank <= 0 && !build_table[j].disabled ) { sprintf( buf, "@@aRequired for:@@c %-20s", build_table[j].name ); if ( build_table[j].requirements_l > 1 ) sprintf(buf+strlen(buf)," (Level %d)", build_table[j].requirements_l ); sprintf(buf+strlen(buf),"\n\r" ); send_to_char( buf, ch ); } for ( j=0;j<MAX_BUILDON;j++ ) if (build_table[i].buildon[j] < SECT_MAX) ter[build_table[i].buildon[j]] = TRUE; sprintf( buf, "@@aBuild on:@@c " ); if ( ter[0] ) { sprintf(buf+strlen(buf), "Anywhere (Scaffold)" ); } else { for ( j=0;j<SECT_MAX;j++ ) if ( ter[j] ) sprintf( buf+strlen(buf), "%s%s ", wildmap_table[j].color, wildmap_table[j].name ); } sprintf( buf+strlen(buf), "\n\r\n\r@@c" ); send_to_char( buf, ch ); if ( ch->build_vnum == i ) { int j; sprintf(buf,"\n\r@@aTick: @@c%d (%d Seconds)\n\r", build_table[i].tick, build_table[i].tick * (PULSE_ROOMS / PULSE_PER_SECOND) ); send_to_char(buf,ch); send_to_char( "@@aDesc:@@N\n\r", ch ); send_to_char( build_table[i].desc, ch ); sprintf(buf,"\n\r\n\r" ); for (j=0;j<11;j++ ) sprintf(buf+strlen(buf),"@@aV%-2d:@@c %-5d%s", j,build_table[i].value[j],((j+1)%5==0)?"\n\r":" "); send_to_char(buf,ch); send_to_char( "\n\r\n\r@@aHelp:@@c\n\r", ch ); } } else send_to_char(buf,ch); send_to_char( build_help_table[i].help, ch ); if (build_table[i].military == FALSE) send_to_char("\n\r@@yThe building has no internal defenses.\n\r", ch ); if ( IS_SET(ch->config,CONFIG_CLIENT) ) { send_to_char("\1",ch); SET_BIT(ch->config,CONFIG_COLOR); } else send_to_char( "\n\r@@N", ch ); return; } void do_ammo( CHAR_DATA *ch, char *argument) { OBJ_DATA *weapon; char buf[MSL]; if ( ( weapon = get_eq_char( ch, WEAR_HOLD_HAND_L ) ) == NULL || weapon->item_type != ITEM_WEAPON ) { if ( ( weapon = get_eq_char( ch, WEAR_HOLD_HAND_R ) ) == NULL || weapon->item_type != ITEM_WEAPON ) { send_to_char( "You are not holding a weapon!\n\r", ch ); return; } } sprintf( buf, "You have %d ammo (out of %d).\n\r", weapon->value[0], weapon->value[1] ); send_to_char(buf,ch); return; } void do_vehicle_status( CHAR_DATA *ch, char *argument ) { VEHICLE_DATA *vhc = ch->in_vehicle; char buf[MSL]; if ( !vhc ) { send_to_char( "You are not in a vehicle.\n\r", ch ); return; } sprintf( buf, "Vehicle Status:\n\rHealth: %d/%d, Fuel: %d/%d, Ammo: %d/%d\n\r", vhc->hit, vhc->max_hit, vhc->fuel, vhc->max_fuel, vhc->ammo, vhc->max_ammo ); send_to_char(buf,ch); return; } void display_details_old( CHAR_DATA * viewer, CHAR_DATA *ch ){ char buf[MSL]; char c_buf[MSL]; c_buf[0] = '\0'; if ( ch->desc && ch->desc->out_compress ) sprintf(c_buf,"%d",(ch->desc->compressing==85)?1:2); sprintf( buf, "@@g%11s%-29s\n\r", ch->name, ch->pcdata->title ); sprintf( buf+strlen(buf), "@@dPlay Time: @@c%5d Hours @@a(@@c%d Total@@a) (%sMCCP%s support@@a)@@N\n\r", my_get_hours( ch, FALSE ), my_get_hours( ch, TRUE ), !ch->desc ? "Unknown" : ch->desc->out_compress ? "" : "@@eNO ", c_buf); sprintf( buf+strlen(buf), "@@eHP: @@W%-5d/%-5d @@aQPs: @@W%d\n\r", ch->hit, ch->max_hit, ch->quest_points ); sprintf( buf+strlen(buf), "@@dClass: @@c%s\n\r", class_table[ch->class].name ); sprintf( buf+strlen(buf), "@@dAlliance: @@c%s\n\r", (ch->pcdata->alliance == -1) ? "None" : alliance_table[ch->pcdata->alliance].name ); if ( get_trust( ch ) != ch->level ) sprintf( buf+strlen(buf), "@@aYou are trusted at level @@W%2d@@a.@@N\n\r", get_trust(ch) ); send_to_char( buf, viewer ); sprintf( buf, "@@ePK Statistics\n\r" ); send_to_char( buf, viewer ); sprintf( buf, "@@dKills: @@W%d (%d) ", ch->pcdata->pkills, ch->pcdata->tpkills ); send_to_char( buf, viewer ); sprintf( buf, "@@dDeaths: @@W%d ", ch->pcdata->deaths ); send_to_char( buf, viewer ); sprintf( buf, "@@dBuildings: @@W%d (%d)\n\r", ch->pcdata->bkills, ch->pcdata->tbkills ); send_to_char( buf, viewer ); sprintf( buf, "@@dExperience Points: @@W%d \n\r", ch->pcdata->experience ); send_to_char( buf, viewer ); send_to_char( "@@eMinigame Statistics@@N\n\r", viewer ); sprintf( buf, "@@cPaintball: @@dHits: @@W%d @@dLosses: @@W%d\n\r", ch->pcdata->pbhits, ch->pcdata->pbdeaths ); send_to_char( buf, viewer ); sprintf( buf, "@@cNUKEM: @@dWins: @@W%d\n\r", ch->pcdata->nukemwins ); send_to_char( buf, viewer ); sprintf( buf, "@@W%d@@d/@@W%d @@ditems @@a<->@@W%6.2f@@d/@@W%d @@dweight\n\r@@N", ch->carry_number, can_carry_n(ch), ch->carry_weight, can_carry_w(ch) ); send_to_char( buf, viewer ); if ( IS_SET(ch->effect,EFFECT_BLIND) ) send_to_char( "Affected by: Blindness\n\r", viewer ); if ( IS_SET(ch->effect,EFFECT_CONFUSE) ) send_to_char( "Affected by: Confusion\n\r", viewer ); if ( IS_SET(ch->effect,EFFECT_BARIN) ) send_to_char( "Affected by: Bar Invisibility\n\r", viewer ); if ( IS_SET(ch->effect,EFFECT_SLOW) ) send_to_char( "Affected by: Slow\n\r", viewer ); if ( IS_SET(ch->effect,EFFECT_ENCRYPTION) ) send_to_char( "Affected by: Encryption\n\r", viewer ); return;} void do_records( CHAR_DATA *ch, char *argument) { char linbuf[MSL]; int order[30], i, j, appears[30], max; RECORD_DATA records; for ( i = 0;i<30;i++ ) { order[i] = -1; appears[i] = FALSE; } for ( j = 0;j < 30;j++ ) { max = -1; for ( i=0;i<30;i++ ) { if ( j >= 30 ) break; if ( rank_table[i].rank <= 1 || rank_table[i].name == NULL || appears[i] ) continue; if ( max == -1 || rank_table[i].rank > rank_table[max].rank ) max = i; } if ( !appears[max] ) { order[j] = max; appears[max] = TRUE; } } if(ch==NULL) return; send_to_char("Not yet @@eimplemented@@n.\r\n", ch); send_to_char("@@W*--------+---------------+---------------*\r\n", ch); send_to_char("| @@eRecord@@W | @@eName@@W | @@eValue@@W |\r\n", ch); send_to_char("*--------+---------------+---------------*\r\n", ch); sprintf(linbuf, "| @@eRanks@@W | @@e%-13s@@W | @@e%-13d@@W |\r\n", rank_table[order[0]].name, rank_table[order[0]].rank); send_to_char(linbuf, ch); send_to_char("*--------+---------------+---------------*\r\n", ch); return; } void do_fuel(CHAR_DATA *ch, char *argument) { char buf[256]; if(ch == NULL) return; if(ch->in_vehicle == NULL) { send_to_char("You are not in a vehicle!", ch); return; } sprintf(buf, "\r\nYou have %d fuel left.\r\n", ch->in_vehicle->fuel); send_to_char(buf, ch); return; }