/*************************************************************************** * 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. * * * * Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, David * * Love, Guilherme 'Willie' Arnold, and Mitchell Tse. * * * * In order to use any part of this Envy Diku Mud, you must comply with * * the original Diku license in 'license.doc', the Merc license in * * 'license.txt', as well as the Envy license in 'license.nvy'. * * In particular, you may not remove either of these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ #define unix 1 #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 <sys/stat.h> #include "merc.h" OBJ_DATA * get_bionic_char args(( CHAR_DATA *ch, int iWear )); void send_blip args(( CHAR_DATA *ch, bool fSpell )); bool can_use_cmd args( ( int cmd, CHAR_DATA *ch, int level ) ); char * crypt args( ( const char *key, const char *salt ) ); char * const where_name [] = { "&B<&Yu&Ws&Ye&Wd &Ya&Ws l&Yi&Wght&B> ", "&B<&zworn on finger&B> ", "&B<&zworn on finger&B> ", "&B<&zworn around neck&B> ", "&B<&zworn around neck&B> ", "&B<&zworn on body&B> ", "&B<&zworn on head&B> ", "&B<&zworn in eyes&B> ", "&B<&zworn on face&B> ", "&B<&Gorbiting&B> ", "&B<&Gorbiting&B> ", "&B<&zworn on legs&B> ", "&B<&zworn on feet&B> ", "&B<&zworn on hands&B> ", "&B<&zworn on arms&B> ", "&B<&zworn as shield&B> ", "&B<&zworn about body&B> ", "&B<&zworn about waist&B> ", "&B<&zworn around wrist&B> ", "&B<&zworn around wrist&B> ", "&B<&RW&ri&We&zl&Wd&re&Rd&B> ", "<&RD&ru&Wa&zl Wie&Wld&re&Rd&B> ", "&B<&Ph&pe&Pl&pd&B> ", "&B<&zworn on ear&B> ", "&B<&zworn on ear&B> ", "&B<&Pw&porn &Pa&pround &Pa&pnkle&B> ", "&B<&Pw&porn &Pa&pround &Pa&pnkle&B> ", "&B<&RT&rr&Wip&zle wi&Wel&rde&Rd&B> " }; char * const mech_where [] = { "&W<head> ", "&W<center torso> ", "&W<left torso> ", "&W<left torso> ", "&W<right torso> ", "&W<right torso> ", "&W<left arm> ", "&W<left arm> ", "&W<right arm> ", "&W<right arm> ", "&W<left leg> ", "&W<right leg> ", "&W<extra pod> ", "&W<extra pod> " }; char * const bionic_where [] = { "<bionic eye left> ", "<bionic eye right> ", "<bionic body> ", "<bionic arm left> ", "<bionic arm right> ", "<bionic hand left> ", "<bionic hand right> ", "<bionic leg left> ", "<bionic leg right> ", "<bionic implant> ", // 1 "<bionic implant> ", // 2 "<bionic implant> ", // 3 "<bionic implant> ", // 4 "<bionic implant> ", // 5 "<bionic implant> ", // 6 "<bionic implant> ", // 7 "<bionic implant> ", // 8 "<bionic implant> ", // 9 "<bionic implant> ", // 10 "<memory chip> ", // 1 "<memory chip> ", // 2 "<memory chip> ", // 3 "<memory chip> " // 4 }; /* * 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 ) ); /* void show_char_to_char_1 args( ( CHAR_DATA *victim, CHAR_DATA *ch ) ); */ void show_char_to_char_1 args( ( CHAR_DATA *victim, CHAR_DATA *ch, char *argument ) ); void show_char_to_char_2 args( ( CHAR_DATA *ch, CHAR_DATA *victim ) ); void show_char_to_char args( ( CHAR_DATA *list, CHAR_DATA *ch ) ); void do_scry_exits args( ( CHAR_DATA *ch, ROOM_INDEX_DATA *scryer ) ); char *format_obj_to_char( OBJ_DATA *obj, CHAR_DATA *ch, bool fShort ) { static char buf [ MAX_STRING_LENGTH ]; buf[0] = '\0'; if ( IS_OBJ_STAT( obj, ITEM_INVIS) ) strcat( buf, "&z(&WInvis&z) " ); if ( IS_AFFECTED( ch, AFF_DETECT_EVIL ) && IS_OBJ_STAT( obj, ITEM_EVIL ) ) strcat( buf, "&r(&RRed Aura&r)&w " ); if ( IS_AFFECTED( ch, AFF_DETECT_MAGIC ) && IS_OBJ_STAT( obj, ITEM_MAGIC ) ) strcat( buf, "&Y(&BMagical&Y)&w " ); if ( IS_OBJ_STAT( obj, ITEM_GLOW ) ) strcat( buf, "&W(G&zl&Bo&bw&Bi&zn&Wg)&B " ); if ( IS_OBJ_STAT( obj, ITEM_HUM ) ) strcat( buf, "&C(&PH&pu&Cmmi&pn&Pg&C) " ); if ( IS_OBJ_STAT( obj, ITEM_POISONED ) ) strcat( buf, "&G(&gP&Goisone&gd&G)&w " ); if ( IS_OBJ_STAT( obj, ITEM_FLAME ) ) strcat( buf, "&r(&RB&ru&Orni&rn&Rg&r)&w " ); if ( IS_OBJ_STAT( obj, ITEM_CHAOS ) ) strcat( buf, "&Y(&OC&Yhaoti&Oc&Y)&w " ); if ( IS_OBJ_STAT( obj, ITEM_ICY ) ) strcat( buf, "&B(&CF&cr&Co&cs&Ct&cy&B)&w " ); if ( fShort ) { if ( obj->short_descr ) strcat( buf, obj->short_descr ); } else { if ( obj->description ) strcat( buf, obj->description ); } 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 ) { OBJ_DATA *obj; char buf [ MAX_STRING_LENGTH ]; char **prgpstrShow; char *pstrShow; int *prgnShow; int *prgnType; int nShow; int iShow; int count; bool fCombine; if ( !ch->desc ) return; /* * Alloc space for output lines. */ count = 0; for ( obj = list; obj; obj = obj->next_content ) { if ( obj->deleted ) continue; count++; } prgpstrShow = alloc_mem( count * sizeof( char * ) ); prgnShow = alloc_mem( count * sizeof( int ) ); prgnType = alloc_mem( count * sizeof( int ) ); nShow = 0; /* * Format the list of objects. */ for ( obj = list; obj; obj = obj->next_content ) { if ( obj->wear_loc == WEAR_NONE && can_see_obj( ch, obj ) && !IS_SET(obj->extra_flags, ITEM_LOADED) && !IS_SET(obj->extra_flags, ITEM_BIONIC_EQPD)) { pstrShow = format_obj_to_char( obj, ch, fShort ); fCombine = FALSE; if ( IS_NPC( ch ) || IS_SET( ch->act, PLR_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 ); prgnType [nShow] = obj->item_type; prgnShow [nShow] = 1; nShow++; } } } /* * Output the formatted list. */ for ( iShow = 0; iShow < nShow; iShow++ ) { if ( IS_NPC( ch ) || IS_SET( ch->act, PLR_COMBINE ) ) { if ( prgnShow[iShow] != 1 ) { switch( prgnType[iShow] ) { default: sprintf( buf, "(%2d) ", prgnShow[iShow] ); send_to_char(AT_GREEN, buf, ch ); break; case ITEM_LIGHT: sprintf( buf, "(%2d) ", prgnShow[iShow] ); send_to_char(AT_WHITE, buf, ch ); break; case ITEM_FOOD: case ITEM_BERRY: case ITEM_PILL: sprintf( buf, "(%2d) ", prgnShow[iShow] ); send_to_char(AT_ORANGE, buf, ch ); break; case ITEM_FOUNTAIN: case ITEM_DRINK_CON: case ITEM_POTION: sprintf( buf, "(%2d) ", prgnShow[iShow] ); send_to_char(AT_BLUE, buf, ch ); break; case ITEM_MONEY: sprintf( buf, "(%2d) ", prgnShow[iShow] ); send_to_char(AT_YELLOW, buf, ch ); break; case ITEM_BLOOD: sprintf( buf, "(%2d) ", prgnShow[iShow] ); send_to_char(AT_RED, buf, ch ); break; } } else { send_to_char(C_DEFAULT, " ", ch ); } } switch( prgnType[iShow] ) { default: send_to_char(AT_GREEN, prgpstrShow[iShow], ch ); send_to_char(C_DEFAULT, "\n\r", ch ); break; /* case ITEM_MECH: break; */ case ITEM_LIGHT: send_to_char(AT_WHITE, prgpstrShow[iShow], ch ); send_to_char(C_DEFAULT, "\n\r", ch ); break; case ITEM_FOOD: case ITEM_PILL: send_to_char(AT_ORANGE, prgpstrShow[iShow], ch ); send_to_char(C_DEFAULT, "\n\r", ch ); break; case ITEM_FOUNTAIN: case ITEM_DRINK_CON: case ITEM_POTION: send_to_char(AT_BLUE, prgpstrShow[iShow], ch ); send_to_char(C_DEFAULT, "\n\r", ch ); break; case ITEM_MONEY: send_to_char(AT_YELLOW, prgpstrShow[iShow], ch ); send_to_char(C_DEFAULT, "\n\r", ch ); break; case ITEM_BLOOD: send_to_char(AT_RED, prgpstrShow[iShow], ch ); send_to_char(C_DEFAULT, "\n\r", ch ); break; } free_string( prgpstrShow[iShow] ); } if ( fShowNothing && nShow == 0 ) { if ( IS_NPC( ch ) || IS_SET( ch->act, PLR_COMBINE ) ) send_to_char(C_DEFAULT, " ", ch ); send_to_char(AT_DGREEN, "Nothing.\n\r", ch ); } /* * Clean up. */ free_mem( prgpstrShow, count * sizeof( char * ) ); free_mem( prgnShow, count * sizeof( int ) ); free_mem( prgnType, count * sizeof( int ) ); return; } void show_char_to_char_0( CHAR_DATA *victim, CHAR_DATA *ch ) { char buf [ MAX_STRING_LENGTH ]; char buf2 [MAX_STRING_LENGTH ]; buf[0] = '\0'; buf2[0] = '\0'; if (!victim->desc && !IS_NPC(victim)) strcat( buf, "(Link-dead) " ); if ( !IS_NPC( victim ) ) { if ( IS_SET( victim->act, PLR_AFK ) ) strcat( buf, "&z[&PA&z] " ); if ( IS_SET( victim->act, PLR_PKILLER ) ) strcat( buf, "&W[&RPK&W]&P " ); if ( IS_SET( victim->act, PLR_WIZINVIS ) ) { sprintf( buf2, "%s %d%s", "&w(Wizinvis", victim->wizinvis, ")&P " ); strcat( buf, buf2 ); } if ( IS_SET( victim->act, PLR_CLOAKED ) ) { sprintf( buf2, "%s %d%s", "&w(Cloaked", victim->cloaked, ")&P " ); strcat( buf, buf2 ); } if ( IS_SET( victim->act, PLR_QUEST ) ) strcat( buf, "&z[&YQ&z] " ); if ( IS_SET( victim->act, PLR_QUESTOR ) ) strcat( buf, "&z[&YQ&z] " ); } if ( victim->desc && victim->desc->editor != 0 && get_trust(ch) > LEVEL_IMMORTAL) strcat( buf, "&R<&BEDITING&R>&P " ); if ( IS_AFFECTED( victim, AFF_INVISIBLE ) ) strcat( buf, "(Invis) " ); if ( IS_AFFECTED( victim, AFF_HIDE ) ) strcat( buf, "(Hide) " ); if ( IS_AFFECTED( victim, AFF_CHARM ) && ( !IS_SET( victim->act, UNDEAD_TYPE( victim ) ) ) ) strcat( buf, "(Charmed) " ); if ( IS_AFFECTED( victim, AFF_PEACE ) ) strcat( buf, "(Peaceful) " ); if ( IS_AFFECTED( victim, AFF_PASS_DOOR ) ) strcat( buf, "(Translucent) "); if ( IS_AFFECTED( victim, AFF_FAERIE_FIRE ) ) strcat( buf, "(Pink Aura) " ); if ( is_affected( victim, gsn_drowfire ) ) strcat( buf, "&p(Purple Aura)&W " ); if ( IS_EVIL( victim ) && IS_AFFECTED( ch, AFF_DETECT_EVIL ) ) strcat( buf, "&r(Red Aura)&W " ); if ( IS_GOOD( victim ) && IS_AFFECTED( ch, AFF_DETECT_GOOD ) ) strcat( buf, "&B(Blue Aura)&W " ); if ( !IS_NPC( victim ) && IS_SET( victim->act, PLR_KILLER ) ) strcat( buf, "(KILLER) " ); if ( !IS_NPC( victim ) && IS_SET( victim->act, PLR_OUTCAST ) ) strcat( buf, "(OUTCAST) " ); if ( !IS_NPC( victim ) && IS_SET( victim->act, PLR_THIEF ) ) strcat( buf, "(THIEF) " ); if ( IS_NPC(victim ) && IS_SET( victim->act, UNDEAD_TYPE( victim ) ) ) strcat( buf, "(Undead) " ); if (IS_NPC(victim) && ch->questmob && victim == ch->questmob ) strcat( buf, "[TARGET] "); if ( victim->position == POS_STANDING && victim->long_descr[0] != '\0' ) { strcat( buf, victim->long_descr ); if ( !IS_NPC( victim ) ) if ( victim->pcdata->lname ) { if ( victim->pcdata->lname[0] != '\0' ) strcat( buf, " " ); strcat( buf, victim->pcdata->lname ); } send_to_char(AT_PINK, buf, ch ); } else { strcat( buf, PERS( victim, ch ) ); if ( !IS_NPC( victim ) ) if ( victim->pcdata->lname ) { if ( victim->pcdata->lname[0] != '\0' ) strcat( buf, " " ); strcat( buf, victim->pcdata->lname ); } if ( !IS_NPC( victim ) && !IS_SET( ch->act, PLR_BRIEF ) ) strcat( buf, victim->pcdata->title ); switch ( victim->position ) { case POS_DEAD: strcat( buf, " is DEAD!!" ); break; case POS_MORTAL: strcat( buf, " is mortally wounded." ); break; case POS_INCAP: strcat( buf, " is incapacitated." ); break; case POS_STUNNED: strcat( buf, " is lying here stunned." ); break; case POS_SLEEPING: strcat( buf, " is sleeping here." ); break; case POS_RESTING: strcat( buf, " is resting here." ); break; case POS_STANDING: strcat( buf, " is here." ); break; case POS_FIGHTING: strcat( buf, " is here, fighting " ); if ( !victim->fighting ) strcat( buf, "thin air??" ); else if ( victim->fighting == ch ) strcat( buf, "YOU!" ); else if ( victim->in_room == victim->fighting->in_room ) { strcat( buf, PERS( victim->fighting, ch ) ); strcat( buf, "." ); } else strcat( buf, "someone who left??" ); break; } strcat( buf, "\n\r" ); buf[0] = UPPER( buf[0] ); send_to_char(AT_PINK, buf, ch ); } buf2[0] = '\0'; if ( IS_AFFECTED( victim, AFF_SANCTUARY )) { strcat( buf2, " " ); strcat( buf2, PERS( victim, ch ) ); if ( !IS_NPC( victim ) ) if ( victim->pcdata->lname ) { if ( victim->pcdata->lname[0] != '\0' ) strcat( buf2, " " ); strcat( buf2, victim->pcdata->lname ); } strcat( buf2, "&W's body is veiled in a glowing white mist.\n\r" ); buf2[4] = UPPER( buf2[4] ); send_to_char ( AT_WHITE, buf2, ch ); buf2[0] = '\0'; } if ( IS_AFFECTED2( victim, AFF_GOLDEN )) { strcat( buf2, " " ); strcat( buf2, PERS( victim, ch ) ); if ( !IS_NPC( victim ) ) if ( victim->pcdata->lname ) { if ( victim->pcdata->lname[0] != '\0' ) strcat( buf2, " " ); strcat( buf2, victim->pcdata->lname ); } strcat( buf2, "&Y's body radiates a crisp golden aura.\n\r" ); buf2[4] = UPPER( buf2[4] ); send_to_char( AT_YELLOW, buf2, ch ); buf2[0] = '\0'; } if ( IS_AFFECTED2( victim, AFF_FIELD ) ) { strcat( buf2, " " ); strcat( buf2, PERS( victim, ch ) ); if ( !IS_NPC( victim ) ) if ( victim->pcdata->lname ) { if ( victim->pcdata->lname[0] != '\0' ) strcat( buf2, " " ); strcat( buf2, victim->pcdata->lname ); } strcat( buf2, "&z's body is enveloped in a black haze.\n\r" ); buf2[4] = UPPER( buf2[4] ); send_to_char( AT_DGREY, buf2, ch ); buf2[0] = '\0'; } if ( IS_AFFECTED( victim, AFF_FIRESHIELD )) { strcat( buf2, " " ); strcat( buf2, PERS( victim, ch ) ); if ( !IS_NPC( victim ) ) if ( victim->pcdata->lname ) { if ( victim->pcdata->lname[0] != '\0' ) strcat( buf2, " " ); strcat( buf2, victim->pcdata->lname ); } strcat( buf2, "&R's body is burning with unfelt heat.\n\r" ); buf2[4] = UPPER( buf2[4] ); send_to_char ( AT_RED, buf2, ch ); buf2[0] = '\0'; } if ( IS_AFFECTED( victim, AFF_SHOCKSHIELD )) { strcat( buf2, " " ); strcat( buf2, PERS( victim, ch ) ); if ( !IS_NPC( victim ) ) if ( victim->pcdata->lname ) { if ( victim->pcdata->lname[0] != '\0' ) strcat( buf2, " " ); strcat( buf2, victim->pcdata->lname ); } strcat( buf2, "&B's body is sparking with electricity.\n\r" ); buf2[4] = UPPER( buf2[4] ); send_to_char ( AT_BLUE, buf2, ch ); buf2[0] = '\0'; } if ( IS_AFFECTED( victim, AFF_ICESHIELD )) { strcat( buf2, " " ); strcat( buf2, PERS( victim, ch ) ); if ( !IS_NPC( victim ) ) if ( victim->pcdata->lname ) { if ( victim->pcdata->lname[0] != '\0' ) strcat( buf2, " " ); strcat( buf2, victim->pcdata->lname ); } strcat( buf2, "&C's body is covered in frost and ice.\n\r" ); buf2[4] = UPPER( buf2[4] ); send_to_char ( AT_LBLUE, buf2, ch ); buf2[0] = '\0'; } if ( IS_AFFECTED( victim, AFF_CHAOS )) { strcat( buf2, " " ); strcat( buf2, PERS( victim, ch ) ); if ( !IS_NPC( victim ) ) if ( victim->pcdata->lname ) { if ( victim->pcdata->lname[0] != '\0' ) strcat( buf2, " " ); strcat( buf2, victim->pcdata->lname ); } strcat( buf2, "&Y's body shimmers randomly with raw chaos.\n\r" ); buf2[4] = UPPER( buf2[4] ); send_to_char ( AT_YELLOW, buf2, ch ); buf2[0] = '\0'; } if ( IS_AFFECTED( victim, AFF_VIBRATING )) { strcat( buf2, " " ); strcat( buf2, PERS( victim, ch ) ); if ( !IS_NPC( victim ) ) if ( victim->pcdata->lname ) { if ( victim->pcdata->lname[0] != '\0' ) strcat( buf2, " " ); strcat( buf2, victim->pcdata->lname ); } strcat( buf2, "&w's body is vibrating rapidly.\n\r" ); buf2[4] = UPPER( buf2[4] ); send_to_char ( C_DEFAULT, buf2, ch ); buf2[0] = '\0'; } if ( IS_AFFECTED2( victim, AFF_BLADE ) ) { strcat( buf2, " " ); strcat( buf2, PERS( victim, ch ) ); if ( !IS_NPC( victim ) ) if ( victim->pcdata->lname ) { if ( victim->pcdata->lname[0] != '\0' ) strcat( buf2, " " ); strcat( buf2, victim->pcdata->lname ); } strcat( buf2, "&w is surrounded by thousands of spinning blades.\n\r" ); buf2[4] = UPPER( buf2[4] ); send_to_char( AT_GREY, buf2, ch ); buf2[0] = '\0'; } if ( IS_AFFECTED2( victim, AFF_DANCING ) ) { strcat( buf2, "&w " ); strcat( buf2, PERS( victim, ch ) ); if ( !IS_NPC( victim ) ) if ( victim->pcdata->lname ) { if ( victim->pcdata->lname[0] != '\0' ) strcat( buf2, "&w " ); strcat( buf2, victim->pcdata->lname ); } strcat( buf2, " &.is s&.urrounde&.d by &.thou&.sand&.s of &.danci&.ng l&.igh&.ts&w.\n\r" ); buf2[4] = UPPER( buf2[4] ); send_to_char( AT_GREY, buf2, ch ); buf2[0] = '\0'; } return; } void show_char_to_char_1( CHAR_DATA *victim, CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; char buf [ MAX_STRING_LENGTH ]; int iWear; int iWearFormat = 0; int percent; bool found; bool sendmount = FALSE; if ( ( can_see( victim, ch ) ) && ( argument[0] == '\0' ) ) { act(AT_GREY, "$n looks at you.", ch, NULL, victim, TO_VICT ); act(AT_GREY, "$n looks at $N.", ch, NULL, victim, TO_NOTVICT ); } /* Put the check here for argument = storage.. display their storage and then return w/o showing char stuff --Angi */ if ( ( !str_cmp( argument, "storage" ) ) && ( get_trust( ch ) > L_DIR ) ) { if ( IS_NPC( victim ) ) { send_to_char( AT_WHITE, "NPC's do not have items in storage.\n\r", ch ); } else { sprintf( buf, "%s's storage box contains:\n\r", victim->name ); send_to_char( AT_WHITE, buf, ch ); show_list_to_char( victim->pcdata->storage, ch, TRUE, TRUE ); } return; } if ( ( argument[0] != '\0' ) && ( get_trust( ch ) > L_DIR ) ) { if ( !( obj = get_obj_here( victim, argument ) ) ) { sprintf( buf, "%s is not carrying that item.\n\r", victim->name ); send_to_char(AT_WHITE, buf, ch ); return; } else { switch ( obj->item_type ) { default: send_to_char(AT_DGREEN, "That is not a container.\n\r", ch ); break; case ITEM_DRINK_CON: if ( obj->value[1] <= 0 ) { send_to_char(AT_BLUE, "It is empty.\n\r", ch ); oprog_look_in_trigger( obj, ch ); break; } sprintf( buf, "%s %s has is %s full of a %s liquid.\n\r", capitalize(obj->short_descr), victim->name, obj->value[1] < obj->value[0] / 4 ? "less than" : obj->value[1] < 3 * obj->value[0] / 4 ? "about" : "more than", liq_table[obj->value[2]].liq_color ); send_to_char(AT_BLUE, buf, ch ); oprog_look_in_trigger( obj, ch ); break; case ITEM_CONTAINER: case ITEM_CORPSE_NPC: case ITEM_CORPSE_PC: /* if ( IS_SET( obj->value[1], CONT_CLOSED ) ) { send_to_char(AT_GREEN, "It is closed.\n\r", ch ); break; } <so doesn't matter if its closed, look anyways> */ sprintf( buf, "%s %s has contains:\n\r", capitalize(obj->short_descr), victim->name ); send_to_char( AT_WHITE, buf, ch ); /* act(AT_WHITE, "$p contains:", ch, obj, NULL, TO_CHAR ); */ show_list_to_char( obj->contains, ch, TRUE, TRUE ); oprog_look_in_trigger( obj, ch ); break; } return; } } if ( victim->description[0] != '\0' ) { send_to_char(AT_GREEN, victim->description, ch ); } else { act(AT_GREY, "You see nothing special about $M.", ch, NULL, victim, TO_CHAR ); } if ( MAX_HIT(victim) > 0 ) percent = ( 100 * victim->hit ) / MAX_HIT(victim); else percent = -1; strcpy( buf, PERS( victim, ch ) ); if ( percent >= 100 ) strcat( buf, " is in perfect health.\n\r" ); else if ( percent >= 90 ) strcat( buf, " is slightly scratched.\n\r" ); else if ( percent >= 80 ) strcat( buf, " has a few bruises.\n\r" ); else if ( percent >= 70 ) strcat( buf, " has some cuts.\n\r" ); else if ( percent >= 60 ) strcat( buf, " has several wounds.\n\r" ); else if ( percent >= 50 ) strcat( buf, " has many nasty wounds.\n\r" ); else if ( percent >= 40 ) strcat( buf, " is bleeding freely.\n\r" ); else if ( percent >= 30 ) strcat( buf, " is covered in blood.\n\r" ); else if ( percent >= 20 ) strcat( buf, " is leaking guts.\n\r" ); else if ( percent >= 10 ) strcat( buf, " is almost dead.\n\r" ); else strcat( buf, " is DYING.\n\r" ); buf[0] = UPPER( buf[0] ); if ( percent >= 100 ) send_to_char( AT_WHITE, buf, ch ); else if ( percent >= 90 ) send_to_char( AT_WHITE, buf, ch ); else if ( percent >= 80 ) send_to_char( AT_WHITE, buf, ch ); else if ( percent >= 70 ) send_to_char( AT_BLUE, buf, ch ); else if ( percent >= 60 ) send_to_char( AT_BLUE, buf, ch ); else if ( percent >= 50 ) send_to_char( AT_BLUE, buf, ch ); else if ( percent >= 40 ) send_to_char( AT_RED, buf, ch ); else if ( percent >= 30 ) send_to_char( AT_RED, buf, ch ); else if ( percent >= 20 ) send_to_char( AT_RED, buf, ch ); else if ( percent >= 10 ) send_to_char( AT_BLOOD, buf, ch ); else send_to_char( (AT_BLOOD+AT_BLINK), buf, ch ); found = FALSE; if (check_for_worn( victim, 2457 )) { send_to_char( AT_GREY, "You see nothing but a shadowy figure.\n\r", ch ); return; } for ( iWear = 2; iWear < MAX_WEAR; iWear *= 2 ) { if ( !found ) { send_to_char(AT_GREY, "\n\r", ch ); act(AT_WHITE, "$N is using:", ch, NULL, victim, TO_CHAR ); found = TRUE; } if ( ( obj = get_eq_char( victim, iWear ) ) && can_see_obj( ch, obj ) ) { if ( obj->item_type == ITEM_PARMOR ) sendmount = TRUE; send_to_char(AT_GREEN, where_name[iWearFormat], ch ); send_to_char(AT_CYAN, format_obj_to_char( obj, ch, TRUE ), ch ); send_to_char(AT_CYAN, "\n\r", ch ); } iWearFormat += 1; } /* booger */ if ( sendmount ) { send_to_char(C_DEFAULT, "\n\r", ch ); send_to_char(AT_BLUE, "Mounted:\n\r", ch ); for ( obj = victim->carrying; obj; obj = obj->next_content ) { if ( IS_SET( obj->extra_flags, ITEM_LOADED ) ) { send_to_char(AT_CYAN, format_obj_to_char( obj, ch, TRUE ), ch ); send_to_char(C_DEFAULT, "\n\r", ch ); } } } if ( victim != ch && !IS_NPC( ch ) && ( number_percent( ) < ch->pcdata->learned[gsn_peek] || ( ch->race == RACE_HALFLING ) ) ) { if ( ( IS_IMMORTAL( victim ) ) && ( !IS_IMMORTAL( ch ) ) ) send_to_char( AT_WHITE, "\n\rYou cannot peek into an Immortal's inventory.\n\r", ch ); else { send_to_char(AT_WHITE, "\n\rYou peek at the inventory:\n\r", ch ); show_list_to_char( victim->carrying, ch, TRUE, TRUE ); } } return; } void show_char_to_char_2( CHAR_DATA *ch, CHAR_DATA *victim ) { char buf [MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; if( !IS_NPC(victim) ) { sprintf(buf, "%s%s%s%s is here.\n\r", IS_SET(victim->act, PLR_AFK) ? "&z[&PA&z] " : "", IS_SET(victim->act, PLR_QUEST) ? "&z[&YQ&z] " : "", IS_SET(victim->act, PLR_QUESTOR) ? "&z[&YQ&z] " : "", victim->pcdata->in_mech ); send_to_char(C_DEFAULT,buf,ch); sprintf(buf2, " ...You see %s inside.\n\r", victim->name); send_to_char(C_DEFAULT,buf2,ch); } return; } void show_char_to_char( CHAR_DATA *list, CHAR_DATA *ch ) { CHAR_DATA *rch; for ( rch = list; rch; rch = rch->next_in_room ) { if ( rch->deleted || rch == ch ) continue; if ( !(rch->desc) && !IS_NPC(rch) && get_trust( ch ) < L_APP ) continue; if ( !IS_NPC( rch ) && IS_SET( rch->act, PLR_WIZINVIS ) && get_trust( ch ) < rch->wizinvis ) continue; if ( rch->in_vehicle != NULL ) continue; if ( can_see( ch, rch ) ) { show_char_to_char_0( rch, ch ); } else if ( room_is_dark( ch->in_room ) && IS_AFFECTED( rch, AFF_INFRARED ) ) { send_to_char(AT_RED, "You see glowing red eyes watching YOU!\n\r", ch ); } } return; } bool check_blind( CHAR_DATA *ch ) { if ( !IS_NPC( ch ) && IS_SET( ch->act, PLR_HOLYLIGHT ) ) return TRUE; if ( IS_AFFECTED( ch, AFF_BLIND ) && ch->race != RACE_ILLITHID ) { send_to_char(AT_WHITE, "You can't see a thing!\n\r", ch ); return FALSE; } return TRUE; } void do_look( CHAR_DATA *ch, char *argument ) { OBJ_DATA *clip; OBJ_DATA *obj; CHAR_DATA *victim; EXIT_DATA *pexit; char buf [ MAX_STRING_LENGTH ]; char arg1 [ MAX_INPUT_LENGTH ]; char arg2 [ MAX_INPUT_LENGTH ]; char new_buf[MAX_INPUT_LENGTH]; char *pdesc; ROOM_INDEX_DATA *portroom; int door; CHAR_DATA *rch; extern OBJ_DATA *auc_obj; #ifdef NEW_MONEY extern MONEY_DATA auc_cost; #else extern int auc_cost; #endif if ( !IS_NPC( ch ) && !ch->desc ) return; if ( ch->position < POS_SLEEPING ) { send_to_char(AT_CYAN, "You can't see anything but stars!\n\r", ch ); return; } if ( ch->position == POS_SLEEPING ) { send_to_char(AT_CYAN, "You can't see anything, you're sleeping!\n\r", ch ); return; } if ( is_raffected( ch->in_room, gsn_globedark ) && !IS_SET( ch->act, PLR_HOLYLIGHT ) && ch->race != RACE_DROW ) { send_to_char(AT_DGREY, "It's completely and utterly black!\n\r", ch ); return; } if ( !check_blind( ch ) ) return; if ( !IS_NPC( ch ) && !IS_SET( ch->act, PLR_HOLYLIGHT ) && room_is_dark( ch->in_room ) && ( ch->race != RACE_ELF ) && ( ch->race != RACE_DWARF ) && ( ch->race != RACE_DROW ) && ( ch->race != RACE_DEMON ) && ( ch->race != RACE_TABAXI ) ) { send_to_char(AT_DGREY, "It is pitch black ... \n\r", ch ); show_char_to_char( ch->in_room->people, ch ); return; } argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( arg1[0] == '\0' || !str_cmp( arg1, "auto" ) ) { /* 'look' or 'look auto' */ send_to_char(AT_WHITE, ch->in_room->name, ch ); send_to_char(AT_WHITE, "\n\r", ch ); /* This is where the exits thing used to be (Ne was here) if ( !IS_NPC( ch ) && IS_SET( ch->act, PLR_AUTOEXIT ) ) do_exits( ch, "auto" ); */ if ( arg1[0] == '\0' || ( !IS_NPC( ch ) && !IS_SET( ch->act, PLR_BRIEF ) ) ) /* Thalador room color change */ send_to_char(ch->in_room->area->def_color, ch->in_room->description, ch ); if ( IS_SET( ch->act, PLR_AUTOEXIT ) ) do_exits( ch, "auto" ); show_list_to_char( ch->in_room->contents, ch, FALSE, FALSE ); show_char_to_char( ch->in_room->people, ch ); return; } if ( !str_prefix( arg1, "in" ) ) { /* 'look in' */ if ( arg2[0] == '\0' ) { send_to_char(AT_DGREEN, "Look in what?\n\r", ch ); return; } if ( !( obj = get_obj_here( ch, arg2 ) ) ) { if ( !str_prefix( arg2, "auction" ) ) { int objcount = 1; char buf[MAX_INPUT_LENGTH]; if ( !auc_obj ) { send_to_char(C_DEFAULT, "There is no object being auctioned.\n\r",ch); return; } obj_to_char( auc_obj, ch ); for ( obj = ch->carrying; obj; obj = obj->next ) { if ( obj == auc_obj ) break; objcount++; } sprintf(buf, "in %d.%s", objcount, auc_obj->name ); do_look(ch, buf ); obj_from_char(auc_obj); return; } send_to_char(AT_DGREEN, "You do not see that here.\n\r", ch ); return; } switch ( obj->item_type ) { default: send_to_char(AT_DGREEN, "That is not a container.\n\r", ch ); break; case ITEM_DRINK_CON: if ( obj->value[1] <= 0 ) { send_to_char(AT_BLUE, "It is empty.\n\r", ch ); oprog_look_in_trigger( obj, ch ); break; } sprintf( buf, "It's %s full of a %s liquid.\n\r", obj->value[1] < obj->value[0] / 4 ? "less than" : obj->value[1] < 3 * obj->value[0] / 4 ? "about" : "more than", liq_table[obj->value[2]].liq_color ); send_to_char(AT_BLUE, buf, ch ); oprog_look_in_trigger( obj, ch ); break; case ITEM_RANGED_WEAPON: act(AT_WHITE, "$p contains:", ch, obj, NULL, TO_CHAR ); show_list_to_char( obj->contains, ch, TRUE, TRUE ); oprog_look_in_trigger( obj, ch ); for ( clip = obj->contains; clip; clip = clip->next_content ) { if ( clip->item_type != ITEM_CLIP ) continue; if ( !clip->contains ) break; act(AT_WHITE, "You have:", ch, NULL, NULL, TO_CHAR ); show_list_to_char( clip->contains, ch, TRUE, TRUE ); act(AT_WHITE, " left in your clip.", ch, NULL, NULL, TO_CHAR ); break; } break; case ITEM_CLIP: act(AT_WHITE, "$p contains:", ch, obj, NULL, TO_CHAR ); show_list_to_char( obj->contains, ch, TRUE, TRUE ); oprog_look_in_trigger( obj, ch ); break; case ITEM_CONTAINER: case ITEM_CORPSE_NPC: case ITEM_CORPSE_PC: if ( IS_SET( obj->value[1], CONT_CLOSED ) ) { send_to_char(AT_GREEN, "It is closed.\n\r", ch ); break; } act(AT_WHITE, "$p contains:", ch, obj, NULL, TO_CHAR ); show_list_to_char( obj->contains, ch, TRUE, TRUE ); oprog_look_in_trigger( obj, ch ); break; case ITEM_PORTAL: if ( !( portroom = get_room_index( obj->value[0] ) ) ) { act(AT_WHITE, "You cannot see anything through $p", ch, obj, NULL, TO_CHAR ); break; } act(AT_GREEN, "You look into $p and see...", ch, obj, NULL, TO_CHAR ); act(AT_GREEN, "$n looks into $p.", ch, obj, NULL, TO_ROOM); send_to_char(AT_WHITE, portroom->name, ch ); send_to_char(AT_WHITE, "\n\r", ch ); if ( arg1[0] == '\0' || ( !IS_NPC( ch ) && !IS_SET( ch->act, PLR_BRIEF ) ) ) send_to_char(AT_CYAN, portroom->description, ch ); do_scry_exits( ch, portroom ); show_list_to_char( portroom->contents, ch, FALSE, FALSE ); show_char_to_char( portroom->people, ch ); oprog_look_in_trigger( obj, ch ); break; case ITEM_VEHICLE: if ( obj->driver == NULL && obj->gunner == NULL && obj->passengers > 1 ) { send_to_char(C_DEFAULT, "The vehicle is empty.\n\r", ch); return; } act(AT_GREEN, "You look into $p and see...", ch, obj, NULL, TO_CHAR); act(AT_GREEN, "$n looks into $p.", ch, obj, NULL, TO_ROOM); for ( rch = ch->in_room->people; rch; rch = rch->next_in_room ) { if ( rch->deleted || rch == ch ) continue; if ( rch->in_vehicle == obj ) { if ( obj->driver == rch ) { sprintf( new_buf, "Driving: %s\n", rch->name ); send_to_char(C_DEFAULT, new_buf, ch ); } else if (obj->gunner == rch) { sprintf( new_buf, "Gunner: %s\n", rch->name ); send_to_char(C_DEFAULT, new_buf, ch ); } else { sprintf( new_buf, "Passenger: %s\n", rch->name ); send_to_char(C_DEFAULT, new_buf, ch ); } } } break; } return; } if ( ( victim = get_char_room( ch, arg1 ) ) ) { /* show_char_to_char_1( victim, ch ); Changed arguments so you can look into char's storage (look victim storage) --Angi */ show_char_to_char_1( victim, ch, arg2 ); return; } for ( obj = ch->carrying; obj; obj = obj->next_content ) { if ( can_see_obj( ch, obj ) ) { pdesc = get_extra_descr( ch, arg1, obj->extra_descr ); if ( pdesc ) { send_to_char(AT_BLUE, pdesc, ch ); oprog_look_trigger( obj, ch ); return; } pdesc = get_extra_descr( ch, arg1, obj->pIndexData->extra_descr ); if ( pdesc ) { send_to_char(AT_BLUE, pdesc, ch ); oprog_look_trigger( obj, ch ); return; } } if ( is_name(ch, arg1, obj->name ) ) { send_to_char(AT_GREEN, obj->description, ch ); send_to_char(AT_GREEN, "\n\r", ch ); oprog_look_trigger( obj, ch ); return; } } for ( obj = ch->in_room->contents; obj; obj = obj->next_content ) { if ( can_see_obj( ch, obj ) ) { pdesc = get_extra_descr( ch, arg1, obj->extra_descr ); if ( pdesc ) { send_to_char(AT_GREEN, pdesc, ch ); oprog_look_trigger( obj, ch ); return; } pdesc = get_extra_descr( ch, arg1, obj->pIndexData->extra_descr ); if ( pdesc ) { send_to_char(AT_GREEN, pdesc, ch ); oprog_look_trigger( obj, ch ); return; } } if ( is_name(ch, arg1, obj->name ) ) { send_to_char(AT_GREEN, obj->description, ch ); send_to_char(AT_GREEN, "\n\r", ch ); oprog_look_trigger( obj, ch ); return; } } pdesc = get_extra_descr( ch, arg1, ch->in_room->extra_descr ); if ( pdesc ) { send_to_char(AT_WHITE, pdesc, ch ); return; } if ( !str_prefix( arg1, "north" ) ) door = 0; else if ( !str_prefix( arg1, "east" ) ) door = 1; else if ( !str_prefix( arg1, "south" ) ) door = 2; else if ( !str_prefix( arg1, "west" ) ) door = 3; else if ( !str_prefix( arg1, "up" ) ) door = 4; else if ( !str_prefix( arg1, "down" ) ) door = 5; else if ( !str_prefix( arg1, "auction" ) ) { char buf[MAX_STRING_LENGTH]; if ( !auc_obj ) { send_to_char( C_DEFAULT, "There is no object being auctioned.\n\r",ch); return; } sprintf( buf, "Object: %s\n\r", auc_obj->short_descr ); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "Type: %s Level: %d\n\r", item_type_name( auc_obj ), auc_obj->level ); send_to_char( AT_WHITE, buf, ch ); #ifdef NEW_MONEY sprintf( buf, "Value: %s Price: %s\n\r", money_string( &auc_obj->cost ), money_string( &auc_cost ) ); #else sprintf( buf, "Value: %d Price: %d\n\r", auc_obj->cost, auc_cost ); #endif send_to_char( AT_WHITE, buf, ch ); return; } else if ( !str_prefix( arg1, "arena" ) && !IS_ARENA(ch) ) { char buf[MAX_STRING_LENGTH]; if ( !arena.cch && !(arena.fch || arena.sch) ) { send_to_char( C_DEFAULT, "There is no challenge being offered.\n\r", ch ); return; } if ( arena.cch ) { sprintf(buf, "Challenger: %s, a level %d %s.\n\r", arena.cch->name, arena.cch->level, class_long( arena.cch ) ); sprintf(buf+strlen(buf), "CHALLENGING\n\r" ); if ( arena.och ) sprintf(buf+strlen(buf), "Challenged: %s, a level %d %s.\n\r", arena.och->name, arena.och->level, class_long( arena.och ) ); else sprintf(buf+strlen(buf), "Challenged: ANYONE\n\r" ); sprintf(buf+strlen(buf), "Award is %d coins.\n\r", arena.award); } else { int fp, sp; fp = (arena.fch->hit*100)/MAX_HIT(arena.fch); sp = (arena.sch->hit*100)/MAX_HIT(arena.sch); sprintf(buf, "Challenger: %s, a level %d %s.\n\r", arena.fch->name, arena.fch->level, class_long( arena.fch ) ); sprintf(buf+strlen(buf), "FIGHTING\n\r" ); sprintf(buf+strlen(buf), "Challenged: %s, a level %d %s.\n\r", arena.sch->name, arena.sch->level, class_long( arena.sch ) ); sprintf(buf+strlen(buf), "Award is %d coins.\n\r", arena.award ); send_to_char(AT_WHITE, buf, ch); if ( fp > sp ) sprintf(buf, "%s appears to be winning at the moment.\n\r", arena.fch->name); else if ( sp > fp ) sprintf(buf, "%s appears to be winning at the moment.\n\r", arena.sch->name); else strcpy(buf, "They appear to be evenly matched at the moment.\n\r"); } send_to_char(AT_WHITE, buf, ch); return; } else { send_to_char(AT_GREY, "You do not see that here.\n\r", ch ); return; } /* 'look direction' */ if ( !( pexit = ch->in_room->exit[door] ) || !pexit->to_room ) { send_to_char(AT_GREY, "Nothing special there.\n\r", ch ); return; } if ( pexit->description && pexit->description[0] != '\0' ) send_to_char(AT_GREY, pexit->description, ch ); else send_to_char(AT_GREY, "Nothing special there.\n\r", ch ); if ( ( IS_AFFECTED( ch, AFF_SCRY ) ) /*&& ( pexit->to_room->description[0] != '\0' )*/ ) { ROOM_INDEX_DATA *rid; if ( IS_SET( ch->in_room->room_flags, ROOM_NO_MAGIC ) || IS_SET( pexit->to_room->room_flags, ROOM_NOSCRY ) ) { send_to_char( AT_BLUE, "You failed.\n\r", ch ); return; } act( AT_BLUE, "You scry to the $T.", ch, NULL, dir_name[door], TO_CHAR ); /* send_to_char(AT_WHITE, pexit->to_room->name, ch ); send_to_char(AT_WHITE, "\n\r", ch ); if ( arg1[0] == '\0' || ( !IS_NPC( ch ) && !IS_SET( ch->act, PLR_BRIEF ) ) ) send_to_char(AT_YELLOW, pexit->to_room->description, ch ); do_scry_exits( ch, pexit->to_room ); show_list_to_char( pexit->to_room->contents, ch, FALSE, FALSE ); show_char_to_char( pexit->to_room->people, ch );*/ rid = ch->in_room; ch->in_room = pexit->to_room; do_look( ch, "" ); ch->in_room = rid; eprog_scry_trigger( pexit, ch->in_room, ch ); return; } if ( pexit->keyword && pexit->keyword[0] != '\0' && pexit->keyword[0] != ' ' ) { if ( IS_SET( pexit->exit_info, EX_BASHED ) ) act(AT_GREY, "The $d has been bashed from its hinges.", ch, NULL, pexit->keyword, TO_CHAR ); else if ( IS_SET( pexit->exit_info, EX_CLOSED ) ) act(AT_GREY, "The $d is closed.", ch, NULL, pexit->keyword, TO_CHAR ); else if ( IS_SET( pexit->exit_info, EX_ISDOOR ) ) act(AT_GREY, "The $d is open.", ch, NULL, pexit->keyword, TO_CHAR ); } eprog_look_trigger( pexit, ch->in_room, ch ); return; } void do_examine( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; char buf [ MAX_STRING_LENGTH ]; char arg [ MAX_INPUT_LENGTH ]; char msg [ MAX_INPUT_LENGTH ]; int brk; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char(AT_BLUE, "Examine what?\n\r", ch ); return; } do_look( ch, arg ); if ( ( obj = get_obj_here( ch, arg ) ) ) { switch ( obj->item_type ) { default: break; case ITEM_WEAPON: case ITEM_ARMOR: #ifdef NEW_MONEY if ( (obj->pIndexData->cost.gold > 0) || (obj->pIndexData->cost.silver > 0) || (obj->pIndexData->cost.copper > 0) ) brk = ( ( ( obj->cost.gold*C_PER_G + obj->cost.silver*S_PER_G + obj->cost.copper ) * 100 ) / ( obj->pIndexData->cost.gold*C_PER_G + obj->pIndexData->cost.silver*S_PER_G + obj->pIndexData->cost.copper ) ); /* if ( (obj->pIndexData->cost.gold + (obj->pIndexData->cost.silver/SILVER_PER_GOLD) + (obj->pIndexData->cost.copper/COPPER_PER_GOLD) ) > 0 ) brk = ( (obj->cost.gold + (obj->cost.silver/SILVER_PER_GOLD) + (obj->cost.copper/COPPER_PER_GOLD) ) * 100 ) / ( obj->pIndexData->cost.gold + (obj->pIndexData->cost.silver/SILVER_PER_GOLD) + (obj->pIndexData->cost.copper/COPPER_PER_GOLD) ); */ #else if ( obj->pIndexData->cost > 0 ) brk = (obj->cost * 100) / obj->pIndexData->cost; #endif else brk = 101; if ( brk == 0 ) strcpy( msg, "is utterly destroyed!" ); else if ( brk <= 10 ) strcpy( msg, "is almost useless." ); else if ( brk <= 20 ) strcpy( msg, "should be replaced soon." ); else if ( brk <= 30 ) strcpy( msg, "is in pretty bad shape." ); else if ( brk <= 40 ) strcpy( msg, "has seen better days." ); else if ( brk <= 50 ) strcpy( msg, "could use some repairs." ); else if ( brk <= 60 ) strcpy( msg, "is in average condition." ); else if ( brk <= 70 ) strcpy( msg, "has the odd dent." ); else if ( brk <= 80 ) strcpy( msg, "needs a bit of polishing." ); else if ( brk <= 90 ) strcpy( msg, "looks almost new." ); else if ( brk <=100 ) strcpy( msg, "is in perfect condition." ); else strcpy( msg, "looks almost indestructable!"); act(AT_WHITE,"Looking closer, you see that $p $T",ch,obj,msg, TO_CHAR); break; case ITEM_DRINK_CON: case ITEM_CONTAINER: case ITEM_CORPSE_NPC: case ITEM_CORPSE_PC: case ITEM_PORTAL: send_to_char(AT_WHITE, "When you look inside, you see:\n\r", ch ); sprintf( buf, "in %s", arg ); do_look( ch, buf ); } } return; } /* * Thanks to Zrin for auto-exit part. */ void do_scry_exits( CHAR_DATA *ch, ROOM_INDEX_DATA *scryer ) { EXIT_DATA *pexit; extern char * const dir_name [ ]; char buf [ MAX_STRING_LENGTH ]; int door; bool found; bool fAuto; fAuto = TRUE; strcpy( buf, "&z[&RExits&w:" ); found = FALSE; for ( door = 0; door <= 5; door++ ) { if ( ( pexit = scryer->exit[door] ) && pexit->to_room && !IS_SET( pexit->exit_info, EX_CLOSED ) ) { found = TRUE; if ( fAuto ) { strcat( buf, "&W " ); strcat( buf, dir_name[door] ); } } } if ( !found ) strcat( buf, "&WNone" ); if ( fAuto ) strcat( buf, "&z]\n\r" ); send_to_char(AT_WHITE, buf, ch ); return; } void do_exits( CHAR_DATA *ch, char *argument ) { EXIT_DATA *pexit; extern char * const dir_name [ ]; char buf [ MAX_STRING_LENGTH ]; char buf2 [ MAX_STRING_LENGTH ]; int door; bool found; bool fAuto; OBJ_DATA * obj; char arg1[ MAX_STRING_LENGTH ]; buf[0] = '\0'; fAuto = !str_cmp( argument, "auto" ); if ( argument[0] == '\0' || !str_cmp( argument, "auto")) { if ( !check_blind( ch ) ) return; strcpy( buf, fAuto ? "&z[&RExits&w:" : "&cObvious exits&w:\n\r" ); found = FALSE; for ( door = 0; door <= 5; door++ ) { if ( ( pexit = ch->in_room->exit[door] ) && pexit->to_room ) { if ( IS_SET (pexit->exit_info, EX_ISWALL ) || IS_SET (pexit->exit_info, EX_CLOSED ) || IS_SET (pexit->exit_info, EX_ISWINDOW )) continue; found = TRUE; if ( fAuto ) { strcat( buf, "&W " ); strcat( buf, dir_name[door] ); } else { sprintf( buf + strlen( buf ), "&W%-5s&w - &W%s\n\r", capitalize( dir_name[door] ), room_is_dark( pexit->to_room ) ? "&zToo dark to tell" : pexit->to_room->name ); } } } if ( !found ) strcat( buf, fAuto ? "&W none" : "&WNone.\n\r" ); if ( fAuto ) strcat( buf, "&z]\n\r" ); /* doors */ send_to_char(AT_WHITE, buf, ch ); strcpy( buf2, "&w[&BDoors&w:" ); found = FALSE; for (door=0;door<=5;door++) { if ((pexit=ch->in_room->exit[door]) && pexit->to_room && IS_SET(pexit->exit_info, EX_CLOSED)) { found = TRUE; strcat(buf2," &W" ); strcat(buf2, dir_name[door]); } } strcat( buf2, "&w]\n\r" ); if ( found ) send_to_char( C_DEFAULT, buf2, ch ); } else { if ( !( obj = get_obj_here( ch, argument ) ) ) { act(AT_WHITE, "You cannot exit that.", ch, NULL, NULL, TO_CHAR ); return; } if ( obj->item_type != ITEM_VEHICLE ) { send_to_char(AT_WHITE, "I hope you're not inside that!\n\r", ch ); return; } if ( obj->value[7] > 0 ) { send_to_char( C_DEFAULT, "It's locked.\n\r", ch); return; } if (obj->item_type == ITEM_VEHICLE && ch->in_vehicle == obj ) { --obj->passengers; ch->in_vehicle = NULL; if ( obj->driver == ch ) obj->driver = NULL; if ( obj->gunner == ch ) obj->gunner = NULL; act(C_DEFAULT,"You exit the $p.",ch,obj,NULL,TO_CHAR); act(C_DEFAULT,"$n steps out of the $p.",ch,obj,NULL,TO_ROOM); } return; } return; } void do_score( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; char buf1 [ MAX_STRING_LENGTH ]; buf1[0] = '\0'; if (IS_NPC(ch)) return; if ( !str_cmp( argument, "msg" ) && get_trust( ch ) >= LEVEL_IMMORTAL ) { send_to_char( AT_WHITE, "Your personalized messages are as follows:\n\r", ch ); sprintf( buf, "Bamfin&r: %s &w%s.\n\r", ch->name, ch->pcdata->bamfin ); send_to_char( AT_RED, buf, ch ); sprintf( buf, "Bamfout&r: %s &w%s.\n\r", ch->name, ch->pcdata->bamfout ); send_to_char( AT_RED, buf, ch ); sprintf( buf, "Bamfusee&r: You &w%s.\n\r", ch->pcdata->bamfusee ); send_to_char( AT_RED, buf, ch ); sprintf( buf, "Transto&r: Victim &w%s.\n\r", ch->pcdata->transto ); send_to_char( AT_RED, buf, ch ); sprintf( buf, "Transfrom&r: Victim &w%s.\n\r", ch->pcdata->transfrom ); send_to_char( AT_RED, buf, ch ); sprintf( buf, "Transvict&r: %s &w%s.\n\r", ch->name, ch->pcdata->transvict ); send_to_char( AT_RED, buf, ch ); sprintf( buf, "Slayusee&r: You &w%s.\n\r", ch->pcdata->slayusee ); send_to_char( AT_RED, buf, ch ); sprintf( buf, "Slayroom&r: %s &w%s.\n\r", ch->name, ch->pcdata->slayroom ); send_to_char( AT_RED, buf, ch ); sprintf( buf, "Slayvict&r: %s &w%s.\n\r", ch->name, ch->pcdata->slayvict ); send_to_char( AT_RED, buf, ch ); return; } sprintf( buf, "&BYou are:&r %s%s.\n\r", ch->name, IS_NPC( ch ) ? "" : ch->pcdata->title ); send_to_char( AT_CYAN, buf, ch ); if ( !IS_NPC(ch) ) { if ( ch->pcdata->empowerments && *ch->pcdata->empowerments ) sprintf( buf, "You have been empowered with %s.\n\r", ch->pcdata->empowerments ); if ( ch->pcdata->detractments && *ch->pcdata->detractments ) sprintf( buf, "You have been detracted from %s.\n\r", ch->pcdata->detractments ); } sprintf( buf, "&BRace: &r %s &B Age:&r %d&w(&r%dhrs&w)&B Vocation:&r%s\n\r", (get_race_data(ch->race))->race_full, get_age( ch ), (get_age( ch ) - 17 ) * 4 , class_long( ch ) ); send_to_char( AT_CYAN, buf, ch ); sprintf( buf, "&BLevel:&r %d &B Alignment:&r %d\n\r", ch->level, ch->alignment ); send_to_char( AT_CYAN, buf, ch ); send_to_char( D,"&B==========================================\n\r", ch); sprintf( buf, "&BStr:&w%d&B(&r%d&B) &BAutoExit :&w(%s&w) &BHit Pts: &w%d&G/&r%d\n\r", IS_NPC(ch) ? 13: ch->pcdata->perm_str, IS_NPC(ch) ? 13: get_curr_str( ch ), ( !IS_NPC( ch ) && IS_SET( ch->act, PLR_AUTOEXIT ) ) ? "&ryes&c" : "&Bno &c", ch->hit, MAX_HIT(ch) ); send_to_char( AT_CYAN, buf, ch ); sprintf( buf, "&BInt:&w%d&B(&r%d&B) &BAutoLoot :&w(%s&w) &BWill Power:&w%d&G/&r%d\n\r", IS_NPC(ch) ? 13: ch->pcdata->perm_int, IS_NPC(ch) ? 13: get_curr_int( ch ), ( !IS_NPC( ch ) && IS_SET( ch->act, PLR_AUTOEXIT ) ) ? "&ryes&C" : "&Bno &C", ch->mana, MAX_MANA(ch) ); send_to_char( AT_CYAN, buf, ch ); sprintf( buf, "&BWis:&w%d&B(&r%d&B) &BAutoSac :&w(%s&w) &BMove Pts: &w%d&G/&r%d\n\r", IS_NPC(ch) ? 13: ch->pcdata->perm_wis, IS_NPC(ch) ? 13: get_curr_wis( ch ), ( !IS_NPC( ch ) && IS_SET( ch->act, PLR_AUTOSAC ) ) ? "&ryes&C" : "&Bno &C", ch->move, MAX_MOVE(ch) ); send_to_char( AT_CYAN, buf, ch ); sprintf( buf, "&BDex:&w%d&B(&r%d&B) &BAutoCoins:&w(%s&w) \n\r", IS_NPC(ch) ? 13: ch->pcdata->perm_dex, IS_NPC(ch) ? 13: get_curr_dex( ch ), ( !IS_NPC( ch ) && IS_SET( ch->act, PLR_AUTOCOINS ) ) ? "&ryes&C" : "&Bno &C" ); send_to_char(AT_CYAN, buf, ch ); sprintf( buf, "&BCon:&w%d&B(&r%d&B) &BAutoSplit:&w(%s&w)\n\r", IS_NPC(ch) ? 13: ch->pcdata->perm_con, IS_NPC(ch) ? 13: get_curr_con( ch ), ( !IS_NPC( ch ) && IS_SET( ch->act, PLR_AUTOSPLIT ) ) ? "&ryes&C" : "&Bno &C"); send_to_char(AT_CYAN, buf, ch ); sprintf( buf, "&BCha:&w%d\n\r", IS_NPC(ch) ? 20 : ch->charisma ); send_to_char(AT_CYAN, buf, ch ); send_to_char( D,"&B==========================================\n\r", ch); send_to_char( AT_BLUE, "Class levels:\n\r", ch ); sprintf( buf, "&BOpr: &w%d &BMdc: &w%d &BRog: &w%d &BSdr: &w%d &BWth: &w%d\n\r", ch->class_level[0], ch->class_level[1], ch->class_level[2], ch->class_level[3], ch->class_level[4] ); send_to_char( C_DEFAULT, buf, ch); sprintf( buf, "&BAgt: &w%d &BPil: &w%d &BHck: &w%d &BTch: &w%d &BVam: &w%d\n\r", ch->class_level[5], ch->class_level[6], ch->class_level[7], ch->class_level[8], ch->class_level[9] ); send_to_char( C_DEFAULT, buf, ch ); send_to_char( D,"&B==========================================\n\r", ch); sprintf( buf, "&BItems: &r%d&G/&w(&B%d&w) &BWeight:&r%d&G/&w(&B%d&w)\n\r", ch->carry_number, can_carry_n( ch ), ch->carry_weight, can_carry_w( ch ) ); send_to_char(AT_CYAN, buf, ch ); sprintf( buf, "&BWar Pts: &w%d &BArenaW: &w%d &BArenaL: &w%d &BPkills: &w%d &BPkilled: &w%d\n\r", ch->warpts, ch->arenawon, ch->arenalost, ch->pkills, ch->pkilled); send_to_char(AT_CYAN, buf, ch ); #ifndef NEW_MONEY sprintf( buf, "&BCredits: &w%d\n\r", ch->gold ); send_to_char(AT_CYAN, buf, ch ); #endif send_to_char( D,"&B==========================================\n\r", ch); /* you do not have psition set up correctly if ( !IS_NPC( ch ) && ch->pcdata->condition[COND_DRUNK] > 10 ); send_to_char( AT_GREY, "You are drunk.\n\r", ch ); if ( !IS_NPC( ch ) && ch->pcdata->condition[COND_THIRST] == 0 && ch->level >= LEVEL_IMMORTAL ) send_to_char( AT_BLUE, "You are dying of thirst.\n\r", ch ); if ( !IS_NPC( ch ) && ch->pcdata->condition[COND_FULL] == 0 && ch->level >= LEVEL_IMMORTAL ) send_to_char( AT_ORANGE, "You are starving.\n\r", ch ); switch ( ch->position ) { case POS_DEAD: send_to_char( (AT_RED + AT_BLINK), "You are DEAD!!\n\r", ch ); break; case POS_MORTAL: send_to_char( AT_RED, "You are mortally wounded.\n\r", ch ); break; case POS_INCAP: send_to_char( AT_RED, "You are incapacitated.\n\r", ch ); break; case POS_STUNNED: send_to_char( AT_RED, "You are stunned.\n\r", ch ); break; case POS_SLEEPING: send_to_char( AT_LBLUE, "You are sleeping.\n\r", ch ); break; case POS_RESTING: send_to_char( AT_LBLUE, "You are resting.\n\r", ch ); break; case POS_STANDING: send_to_char( AT_GREEN, "You are standing.\n\r", ch ); break; case POS_FIGHTING: send_to_char( AT_BLOOD, "You are fighting.\n\r", ch ); break; } */ if ( ch->clan ) { CLAN_DATA *clan; clan = get_clan_index( ch->clan ); sprintf( buf, "You belong to the clan %s.\n\r", clan->name ); if ( ch->ctimer ) sprintf( buf + strlen(buf), "Clan skill timer: %d.\n\r", ch->ctimer ); send_to_char( AT_WHITE, buf, ch ); if ( ch->cquestpnts > 0 ) { sprintf( buf, "You currently have %d Clan Quest Points.\n\r", ch->cquestpnts ); send_to_char( AT_WHITE, buf, ch ); } } /* Edited out by Torann if ( get_trust( ch ) != ch->level ) { sprintf( buf, "You have been granted the powers of a level &R%d&W.\n\r", get_trust( ch ) ); send_to_char( AT_WHITE, buf, ch ); } if (!IS_NPC( ch )) sprintf( buf, "&RAfk Message: &r%s &W%s.\n\r", ch->name, ch->pcdata->afkchar ); send_to_char( AT_WHITE, buf, ch ); */ sprintf( buf, "Wimpy set to&w %d&B hit points.\n\r", ch->wimpy ); send_to_char( AT_BLUE, buf, ch ); if ( !IS_NPC( ch ) ) { sprintf( buf, "Page pausing set to %d lines of text.\n\r", ch->pcdata->pagelen ); send_to_char( AT_CYAN, buf, ch ); } /* Edited out by Torann if (ch->level >= 12) { sprintf( buf, "&BHitroll&R %d &B Damroll&R %d \n\r", GET_HITROLL( ch ), GET_DAMROLL( ch ) ); send_to_char( AT_CYAN, buf, ch); } if ( ch->level >= 20 ) { sprintf( buf, "AC: %d. ", GET_AC( ch ) ); send_to_char( AT_CYAN, buf, ch ); } send_to_char( AT_GREEN, "You are ", ch ); if ( GET_AC( ch ) >= 101 ) send_to_char( AT_GREEN, "WORSE than naked!\n\r", ch ); else if ( GET_AC( ch ) >= 20 ) send_to_char( AT_GREEN, "naked.\n\r" , ch ); else if ( GET_AC( ch ) >= 0 ) send_to_char( AT_GREEN, "wearing " "clothes.\n\r" , ch ); else if ( GET_AC( ch ) >= - 50 ) send_to_char( AT_GREEN, "slightly " "armored.\n\r", ch ); else if ( GET_AC( ch ) >= -100 ) send_to_char( AT_GREEN, "somewhat " "armored.\n\r", ch ); else if ( GET_AC( ch ) >= -250 ) send_to_char( AT_GREEN, "armored.\n\r" , ch ); else if ( GET_AC( ch ) >= -500 ) send_to_char( AT_GREEN, "well " "armored.\n\r" , ch ); else if ( GET_AC( ch ) >= -750 ) send_to_char( AT_GREEN, "strongly " "armored.\n\r", ch ); else if ( GET_AC( ch ) >= -1000 ) send_to_char( AT_GREEN, "heavily " "armored.\n\r" , ch ); else if ( GET_AC( ch ) >= -1200 ) send_to_char( AT_GREEN, "superbly " "armored.\n\r", ch ); else if ( GET_AC( ch ) >= -1400 ) send_to_char( AT_GREEN, "divinely " "armored.\n\r", ch ); else send_to_char( AT_GREEN, "invincible!\n\r", ch ); */ /* if ( ch->level >= 12 ) { sprintf( buf, "Hitroll: " ); send_to_char(AT_BLOOD, buf, ch ); sprintf( buf, "%d", GET_HITROLL( ch ) ); send_to_char(AT_RED, buf, ch); sprintf( buf, " Damroll: " ); send_to_char( AT_BLOOD, buf, ch ); sprintf( buf, "%d.\n\r", GET_DAMROLL( ch ) ); send_to_char( AT_RED, buf, ch ); } if ( ch->level >=50) { sprintf( buf, "Saving-Throw: &R%d&X.\n\r", ( ch->race != RACE_DWARF ) ? ch->saving_throw : ch->saving_throw + ch->saving_throw * 25 / 100 ); send_to_char( AT_CYAN, buf, ch ); } if ( ch->level >= 8 ) { sprintf( buf, "Alignment: %d. ", ch->alignment ); send_to_char( AT_CYAN, buf, ch ); } send_to_char( AT_CYAN, "", ch ); if ( ch->alignment > 900 ) send_to_char( AT_BLUE, "angelic.\n\r",ch ); else if ( ch->alignment > 700 ) send_to_char( AT_BLUE, "saintly.\n\r",ch ); else if ( ch->alignment > 350 ) send_to_char( AT_BLUE, "good.\n\r" ,ch ); else if ( ch->alignment > 100 ) send_to_char( AT_BLUE, "kind.\n\r" ,ch ); else if ( ch->alignment > -100 ) send_to_char( AT_YELLOW, "neutral.\n\r",ch ); else if ( ch->alignment > -350 ) send_to_char( AT_RED, "mean.\n\r" ,ch); else if ( ch->alignment > -700 ) send_to_char( AT_RED, "evil.\n\r" ,ch); else if ( ch->alignment > -900 ) send_to_char( AT_RED, "demonic.\n\r" ,ch); else send_to_char( AT_RED, "satanic.\n\r" ,ch); */ /* Edited out by Torann if ( !IS_NPC( ch ) && IS_IMMORTAL( ch ) ) { sprintf( buf, "WizInvis level: %d WizInvis is %s\n\r", ch->wizinvis, IS_SET( ch->act, PLR_WIZINVIS ) ? "ON" : "OFF" ); send_to_char( AT_YELLOW, buf, ch ); sprintf( buf, "Cloaked level: %d Cloaked is %s\n\r", ch->cloaked, IS_SET( ch->act, PLR_CLOAKED ) ? "ON" : "OFF" ); send_to_char( AT_YELLOW, buf, ch ); } */ /* if ( ch->affected ) { for ( paf = ch->affected; paf; paf = paf->next ) { if ( paf->deleted ) continue; if ( !printed ) { send_to_char( AT_CYAN, "You are affected by:\n\r", ch ); printed = TRUE; } sprintf( buf, "Spell: '%s'", skill_table[paf->type].name ); send_to_char( AT_WHITE, buf, ch ); if ( ch->level >= 20 ) { sprintf( buf, " modifies %s by %d for %d hours", affect_loc_name( paf->location ), paf->modifier, paf->duration ); send_to_char(AT_WHITE, buf, ch ); } send_to_char( AT_WHITE, ".\n\r", ch ); } } if ( ch->affected2 ) { for ( paf = ch->affected2; paf; paf = paf->next ) { if ( paf->deleted ) continue; if ( !printed ) { send_to_char( AT_CYAN, "You are affected by:\n\r", ch ); printed = TRUE; } sprintf( buf, "Spell: '%s'", skill_table[paf->type].name ); send_to_char( AT_WHITE, buf, ch ); if ( ch->level >= 20 ) { sprintf( buf, " modifies %s by %d for %d hours", affect_loc_name( paf->location ), paf->modifier, paf->duration ); send_to_char(AT_WHITE, buf, ch ); } send_to_char( AT_WHITE, ".\n\r", ch ); } }*/ return; } /* Edited out by Torann void do_affectedby( CHAR_DATA *ch, char *argument ) { AFFECT_DATA *paf; char buf [ MAX_STRING_LENGTH ]; char buf1 [ MAX_STRING_LENGTH ]; bool printed = FALSE; buf1[0] = '\0'; if ( IS_NPC( ch ) ) return; if ( !ch->affected && !ch->affected2 ) { send_to_char( AT_CYAN, "You are not affected by anything\n\r", ch); } if ( ch->affected ) { for ( paf = ch->affected; paf; paf = paf->next ) { if ( paf->deleted ) continue; if ( !printed ) { send_to_char( AT_CYAN, "You are affected by:\n\r", ch ); printed = TRUE; } sprintf( buf, "&BSpell&W: '&G%s&W'", skill_table[paf->type].name ); send_to_char( AT_WHITE, buf, ch ); if ( ch->level >= 20 ) { sprintf( buf, " &Wmodifies &G%s&W by %d for %d hours", affect_loc_name( paf->location ), paf->modifier, paf->duration ); send_to_char(AT_WHITE, buf, ch ); } send_to_char( AT_WHITE, ".\n\r", ch ); } } if ( ch->affected2 ) { for ( paf = ch->affected2; paf; paf = paf->next ) { if ( paf->deleted ) continue; if ( !printed ) { send_to_char( AT_CYAN, "You are affected by:\n\r", ch ); printed = TRUE; } sprintf( buf, "&BSpell&W: '&G%s&W'", skill_table[paf->type].name ); send_to_char( AT_WHITE, buf, ch ); if ( ch->level >= 20 ) { sprintf( buf, " &Wmodifies &G%s&W by %d for %d hours", affect_loc_name( paf->location ), paf->modifier, paf->duration ); send_to_char(AT_WHITE, buf, ch ); } send_to_char( AT_WHITE, ".\n\r", ch ); } } return; } */ char * const day_name [] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", }; char * const month_name [] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; void do_time( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; extern char str_boot_time[]; extern time_t exe_comp_time; extern char * exe_file; char *suf; int day; struct stat statis; 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, "It is %d o'clock %s on %s, %d%s the Month of %s.\n\r", ( time_info.hour % 12 == 0 ) ? 12 : time_info.hour % 12, time_info.hour >= 12 ? "pm" : "am", day_name[day % 7], day, suf, month_name[time_info.month] ); send_to_char(AT_YELLOW, buf, ch ); sprintf( buf, "The system started on %s\rThe system time is %s\r", str_boot_time, (char *) ctime( ¤t_time )); send_to_char(AT_RED, buf, ch ); if (IS_IMMORTAL( ch )) { sprintf( buf, "Running copy compiled at %s\r", (char *) ctime(&exe_comp_time) ); send_to_char(AT_RED, buf, ch ); if ( !stat( exe_file, &statis ) ) { sprintf( buf, "MUD compiled at %s\r", (char*)ctime(&statis.st_mtime ) ); send_to_char( AT_RED, buf, ch ); } else { if IS_IMMORTAL( ch ) send_to_char( AT_RED, "No executable available!!\r\n", ch ); } } return; } void do_weather( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; static char * const sky_look[ 4 ] = { "cloudless", "cloudy", "rainy", "lit by flashes of lightning" }; if ( !IS_OUTSIDE( ch ) ) { send_to_char(AT_BLUE, "You can't see the weather indoors.\n\r", ch ); return; } sprintf( buf, "The sky is %s and %s.\n\r", sky_look[weather_info.sky], weather_info.change >= 0 ? "a warm southerly breeze blows" : "a cold northern gust blows" ); send_to_char(AT_BLUE, buf, ch ); return; } void do_help( CHAR_DATA *ch, char *argument ) { HELP_DATA *pHelp; if ( argument[0] == '\0' ) argument = "summary"; for ( pHelp = help_first; pHelp; pHelp = pHelp->next ) { if ( pHelp->level > get_trust( ch ) ) continue; if ( is_name(ch, argument, pHelp->keyword ) ) { if ( pHelp->level >= 0 && str_cmp( argument, "imotd" ) && str_prefix( "advm_", argument ) && str_prefix( "demm_", argument ) ) { send_to_char(AT_GREY, pHelp->keyword, ch ); send_to_char(AT_GREY, "\n\r", ch ); } /* * Strip leading '.' to allow initial blanks. */ if ( pHelp->text[0] == '.' ) send_to_char(AT_GREY, pHelp->text+1, ch ); else send_to_char(AT_GREY, pHelp->text , ch ); return; } } send_to_char(AT_WHITE, "No help on that word.\n\r", ch ); return; } /* * New 'who' command originally by Alander of Rivers of Mud. */ /* * Newer 'who' command by YOU KNOW WHO ... Don't you? */ void do_who( CHAR_DATA *ch, char *argument ) { DESCRIPTOR_DATA *d; char arg1[ MAX_STRING_LENGTH ]; char buf [ MAX_STRING_LENGTH*3 ]; char buf2 [ MAX_STRING_LENGTH ]; char spacing[MAX_STRING_LENGTH]; char tailspace[MAX_STRING_LENGTH]; CLAN_DATA * tClan; int iClass; int iLevelLower; int iLevelUpper; int nNumber; int nMatch; bool rgfClass [ MAX_CLASS ]; bool fClassRestrict; bool fClanRestrict; /* bool fGuildRestrict; */ bool fImmortalOnly; bool fHeroOnly; bool fRaceRestrict; bool fNameRestrict; bool lng = FALSE; int iRace; int iClan; bool rgfClan [ MAX_CLAN ]; /* int iGuild; bool rgfGuild [ MAX_CLAN ]; */ bool rgfRace [ MAX_RACE ]; int num_of_imm = 0; int noclass[MAX_CLASS]; /* * Set default arguments. */ iLevelLower = 0; iLevelUpper = L_IMP; /*Used to be Max_level */ fClassRestrict = FALSE; fImmortalOnly = FALSE; fHeroOnly = FALSE; fRaceRestrict = FALSE; fNameRestrict = FALSE; fClanRestrict = FALSE; /* fGuildRestrict = FALSE; */ tClan = NULL; send_to_char( C_DEFAULT, "\n\r&z===============&G=&z=======&G=&z==============================&G=&z===========\n\r", ch); send_to_char( C_DEFAULT, "&z==&G=&z====== &GMachine &zWorld&G: Generations &z===&G=&z========&G==&z======&G=&z====\n\r" , ch ); send_to_char( C_DEFAULT, "&z===&G=&z========&G==&z===========================&G=&z========================\n\r", ch); send_to_char( C_DEFAULT, "\n\r" , ch ); for ( iClass = 0; iClass < MAX_CLASS; iClass++ ) noclass[iClass] = 0; for ( iClan = 0; iClan < MAX_CLAN; iClan++ ) rgfClan[iClan] = FALSE; for ( iRace = 0; iRace < MAX_RACE; iRace++ ) rgfRace[iRace] = FALSE; for ( iClass = 0; iClass < MAX_CLASS; iClass++ ) rgfClass[iClass] = FALSE; /* * Parse arguments. */ nNumber = 0; for ( ;; ) { char arg [ MAX_STRING_LENGTH ]; argument = one_argument( argument, arg ); if ( arg[0] == '\0' ) break; strcpy( arg1, arg ); if ( is_number( arg ) ) { switch ( ++nNumber ) { case 1: iLevelLower = atoi( arg ); break; case 2: iLevelUpper = atoi( arg ); break; default: send_to_char(AT_DGREEN, "Only two level numbers allowed.\n\r", ch ); return; } } else { int iClass; if ( strlen( arg ) < 3 ) { send_to_char(AT_DGREEN, "Classes must be longer than that.\n\r", ch ); return; } if ( strlen( arg ) > 3 ) lng = TRUE; /* * Look for classes to turn on. */ arg[3] = '\0'; if ( !str_cmp( arg, "imm" ) ) { fImmortalOnly = TRUE; } else if ( !str_cmp( arg, "chm" ) ) { fHeroOnly = TRUE; } else { fClassRestrict = TRUE; for ( iClass = 0; iClass < MAX_CLASS; iClass++ ) { if ( ( !str_cmp( arg, class_table[iClass].who_name ) && !lng ) || ( !str_cmp( arg1, class_table[iClass].who_long ) && lng ) ) { rgfClass[iClass] = TRUE; break; } } if ( iClass == MAX_CLASS ) { fClassRestrict = FALSE; fRaceRestrict = TRUE; for ( iRace = 0; iRace < MAX_RACE; iRace++ ) { if ( ( !str_cmp( arg, (get_race_data(iRace))->race_name ) && !lng ) || ( !str_cmp( arg1, (get_race_data(iRace))->race_full ) ) ) { rgfRace[iRace] = TRUE; break; } } if ( iRace == MAX_RACE ) { fRaceRestrict = FALSE; fClanRestrict = TRUE; for ( iClan = 0; iClan < MAX_CLAN; iClan++ ) { tClan = get_clan_index( iClan ); if ( !(tClan) ) continue; if ( !str_cmp( arg1, strip_color(tClan->name) ) ) { rgfClan[iClan] = TRUE; break; } } if ( iClan >= MAX_CLAN ) { fClanRestrict = FALSE; fNameRestrict = TRUE; } /* if ( iClan >= MAX_CLAN ) { fClanRestrict = FALSE; fGuildRestrict = TRUE; for ( iGuild = 0; guild_table[iGuild].name[0] != '\0'; iGuild++ ) { if ( !str_cmp( arg1, guild_table[iGuild].name ) ) { rgfGuild[iGuild] = TRUE; break; } } if ( guild_table[iGuild].name[0] == '\0' ) { fGuildRestrict = FALSE; fNameRestrict = TRUE; } } */ } } } } } /* * Now show matching chars. */ nMatch = 0; buf[0] = '\0'; rgfClan[0] = FALSE; if ( fNameRestrict ) send_to_char( C_DEFAULT, "\n\r\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\" "/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\n\r", ch ); for ( d = descriptor_list; d; d = d->next ) { CHAR_DATA *wch; CLAN_DATA *pClan; char const *class; char const *race; char clan[MAX_STRING_LENGTH]; wch = ( d->original ) ? d->original : d->character; /* * Check for match against restrictions. * Don't use trust as that exposes trusted mortals. */ if ( d->connected != CON_PLAYING || !is_who( ch, wch ) ) continue; if ( wch->level < iLevelLower || wch->level > iLevelUpper || ( fImmortalOnly && wch->level < LEVEL_IMMORTAL ) || ( fHeroOnly && wch->level < LEVEL_HERO ) || ( fHeroOnly && wch->level > L_CHAMP5 ) || ( fClassRestrict && !rgfClass[prime_class(wch)] ) || ( fRaceRestrict && !rgfRace[wch->race] ) || ( fNameRestrict && str_prefix( arg1, wch->name ) ) /* || ( fGuildRestrict && str_cmp( wch->guild->name, guild_table[iGuild].name ) ) */ || ( fClanRestrict && !rgfClan[wch->clan] ) ) continue; nMatch++; if ( wch->level >= LEVEL_IMMORTAL ) num_of_imm++; noclass[prime_class(wch)]++; /* * Figure out what to print for class. */ class = class_long( wch ); if ( wch->level >= LEVEL_HERO ) switch ( wch->level ) { default: break; case L_IMP: class = "&zImplement&Oo&zr"; break; case L_CON: class = "&cCoder"; break; case L_DIR: class = "&RGuardian"; break; case L_GOD: class = "&rBuilder"; break; case L_SEN: class = "&gBuilder"; break; case L_DEM: class = "&pBuilder";break; case L_JUN: class = "&OBuilder"; break; case L_APP: class = "&bWarlord"; break; case L_CHAMP5: case L_CHAMP4: case L_CHAMP3: case L_CHAMP2: case L_CHAMP1: case LEVEL_HERO: class = "&rCHAMPION"; break; } if ( wch->level >= L_APP && wch->pcdata->whotype && str_cmp( wch->pcdata->whotype, "!!!!!!!!!!!!" ) ) class = wch->pcdata->whotype; /* * Figure out what to print for race. */ race = (get_race_data(wch->race))->race_name; /* Clan Stuff */ if (wch->clan != 0) { pClan = get_clan_index(wch->clan); if ( IS_SET(pClan->settings, CLAN_PKILL) ) switch ( wch->clev ) { default: sprintf( clan, "-<%s>-", pClan->name ); break; case 0: sprintf( clan, "-<%s>-", pClan->name ); break; case 1: sprintf( clan, "-<Enforcer of %s>-", pClan->name ); break; case 2: sprintf( clan, "-<Council of %s>-", pClan->name ); break; case 3: sprintf( clan, "-<Leader of %s>-", pClan->name ); break; case 4: sprintf( clan, "-<Champion of %s>-", pClan->name ); break; case 5: sprintf( clan, "-<Deity of %s>-", pClan->name ); break; } else switch ( wch->clev ) { default: sprintf( clan, "(%s&C)", pClan->name ); break; case 0: sprintf( clan, "(%s&C)", pClan->name ); break; case 1: sprintf( clan, "(Centurion of %s&C)", pClan->name ); break; case 2: sprintf( clan, "(&GCouncil &zof %s&C)", pClan->name ); break; case 3: sprintf( clan, "(&GLeader &zof %s&C)", pClan->name ); break; case 4: sprintf( clan, "(&GGuardian of %s&C)", pClan->name ); break; case 5: sprintf( clan, "(Deity of %s&C)", pClan->name ); break; } } /* * Format it up. */ sprintf(spacing," "); if(class_long(wch) == "Techmage") sprintf(spacing," "); if(class_long(wch) == "Healer") sprintf(spacing," "); if(class_long(wch) == "Spy") sprintf(spacing," "); if(class_long(wch) == "Soldier") sprintf(spacing," "); if(class_long(wch) == "Psionicist") sprintf(spacing," "); if(class_long(wch) == "Cyborg") sprintf(spacing," "); if(class_long(wch) == "Pilot") sprintf(spacing," "); if(class_long(wch) == "Genemaster") sprintf(spacing," "); if(class_long(wch) == "Vampire") sprintf(spacing," "); if(wch->level < 10) sprintf(tailspace," "); else if(wch->level < 100) sprintf(tailspace," "); if ( wch->level < LEVEL_HERO ) { sprintf( buf + strlen(buf), "[%-11s%s Lvl %d%s] ", class, spacing, wch->level, tailspace); } else if ( wch->level >= LEVEL_HERO && wch->pcdata->whotype && !strcmp( class, wch->pcdata->whotype ) ) { int len = strlen_wo_col(wch->pcdata->whotype); int len2 = len; len = 11 - ( len/2 + ( len % 2 != 0 ) ); len2 = ( len2 %2 == 0 ) ? len - 1 : len; sprintf( buf + strlen(buf), "[%*s%-s%*s&W] ", len, "", class, len2, "" ); } else { int len = strlen_wo_col((char *)class); int len2 = len; len = 11 - ( len/2 + ( len % 2 != 0 ) ); len2 = ( len2 %2 == 0 ) ? len - 1 : len; sprintf( buf + strlen(buf), "[%*s%-s%*s&W] ", len, "", class, len2, "" ); } /* if (IS_SET(wch->act2, PLR_REMORT)) { switch ( wch->incarnations ) */ send_to_char( AT_WHITE, buf, ch ); if ( ( IS_SET( wch->act, PLR_SILENCE ) ) && ( ch->level >= L_DIR ) ) { send_to_char( AT_WHITE, "&z[&rSILENCED&z] ", ch ); } if ( IS_SET( wch->act, PLR_QUEST ) ) { send_to_char( AT_RED, "<QUEST> ", ch ); } if ( IS_SET( wch->act, PLR_QUESTOR ) ) send_to_char( AT_BLUE, "&z(&YQ&z) ", ch ); if(wch->guild != NULL) { buf[0] = '\0'; sprintf(buf+strlen(buf), "[%s", wch->guild->name); send_to_char(wch->guild->color, buf, ch); buf[0] = '\0'; switch(wch->guild_rank) { case 0: sprintf(buf+strlen(buf), "] "); break; case 1: sprintf(buf+strlen(buf), " %s] ", wch->sex == SEX_FEMALE ? "Lady" : "Lord" ); break; case 2: sprintf(buf+strlen(buf), " High %s] ", wch->sex == SEX_FEMALE ? "Lady" : "Lord" ); break; case 3: sprintf(buf+strlen(buf), " Over%s] ", wch->sex == SEX_FEMALE ? "lady" : "lord" ); break; case 4: sprintf(buf+strlen(buf), " Deity] " ); break; default: sprintf(buf+strlen(buf), "Bug] "); break; } send_to_char(wch->guild->color, buf, ch); } if ( IS_SET( wch->act, PLR_AFK ) ) send_to_char( AT_YELLOW, "&z[&PA&z] ", ch ); buf[0] = '\0'; if ( IS_SET( wch->act, PLR_PKILLER ) ) send_to_char( C_DEFAULT, "&z[&RPK&z] ", ch ); buf[0] = '\0'; if ( IS_SET( wch->act, PLR_WIZINVIS ) ) { sprintf( buf, "%s %d%s", "&w[&zWizin", wch->wizinvis, "&w] "); send_to_char( AT_WHITE, buf, ch ); } if ( IS_SET( wch->act, PLR_CLOAKED ) ) { sprintf( buf, "%s %d%s", "&w[&zCloak", wch->cloaked, "&w] "); send_to_char( AT_WHITE, buf, ch ); } if ( wch->desc && wch->desc->editor != 0 ) { if ( wch->desc->editor == 13 ) /* forging eq */ send_to_char( AT_DGREY, "&z[&OForging&z] ", ch ); else send_to_char( AT_WHITE, "&z[&CB&z] ", ch ); } if ( IS_SET( wch->act, PLR_THIEF ) ) send_to_char( AT_DGREY, "[>&z] ", ch ); buf[0] = '\0'; if ( wch->pcdata->lname ) sprintf( buf + strlen( buf ), "%s%s%s%s ", wch->name, ( wch->pcdata->lname[0] != '\0' ) ? " " : "", /* wch->name, ( *wch->pcdata->lname != 39 ) ? " " : "", */ wch->pcdata->lname, wch->pcdata->title ); else sprintf( buf + strlen( buf ), "%s%s ", wch->name, wch->pcdata->title ); send_to_char( AT_WHITE, buf, ch); buf[0] = '\0'; if (wch->clan != 0) sprintf( buf + strlen( buf ), "%s\n\r", clan ); else sprintf( buf, "\n\r" ); if (wch->clan != 0) { pClan=get_clan_index(wch->clan); if (IS_SET(pClan->settings,CLAN_PKILL)) send_to_char( AT_RED, buf, ch ); else send_to_char( AT_LBLUE, buf, ch ); } else send_to_char(C_DEFAULT, buf, ch ); buf[0] = '\0'; if ( fNameRestrict && !str_cmp( arg1, wch->name ) ) break; } if ( nMatch > 0 ) { if ( fNameRestrict ) send_to_char( C_DEFAULT, "\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/" "\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\\/\n\r", ch ); /* sprintf( buf2, "Mag&g[&G%d&g]&G Cle&g[&G%d&g]&G Thi&g[&G%d&g]&G " "War&g[&G%d&g]&G Psi&g[&G%d&g]&G Dru&g[&G%d&g]&G Rng&g[&G%d&g]&G " "Pal&g[&G%d&g]&G Brd&g[&G%d&g]&G Vam&g[&G%d&g]&G Nec&g[&G%d&g]&G\n\r", noclass[0], noclass[1], noclass[2], noclass[3], noclass[4], noclass[5], noclass[6], noclass[7], noclass[8], noclass[9], noclass[10] ); strcat( buf, buf2 ); send_to_char( AT_GREEN, buf, ch ); buf[0]=buf2[0]='\0'; sprintf( buf, "Wwf&g[&G%d&g] &GMnk&g[&G%d&g] ", noclass[11], noclass[12] ); */ send_to_char( AT_WHITE, buf, ch ); buf[0]=buf2[0]='\0'; send_to_char(C_DEFAULT , "\n\r&z==&G=&z============================================&G=&z================&G=&z=\n\r",ch ); send_to_char(C_DEFAULT, "&z====== &z[&PA&z]&Wfk &z[&RPK&z]&Willer &z[>&z]&Whief &z[&CB&z]&Wuilding &z[&YQ&z]&Wuesting &z======\n\r",ch); send_to_char(C_DEFAULT, "&z==&G=&z=========&G==&z===========&G=&z=======&G=&z==&G=&z======&G==&z========&G=&z========&G=&z===\n\r \n\r",ch); sprintf( buf, "&G[&z%d&G]&z &GImm&zo&Grtals&z.\n\r", num_of_imm ); sprintf( buf2, "&z[&G%d&z]&G &zTot&Ga&zl Player%s&G.\n\r", nMatch, nMatch == 1 ? "" : "s" ); strcat( buf, buf2 ); send_to_char(AT_GREEN, buf, ch ); if ( doubleexp() == TRUE) { sprintf( buf2, "Double experience is &YON!\n\r" ); send_to_char(AT_GREEN, buf2, ch ); } } else send_to_char( AT_GREEN, "There is no class/race/clan/person by that name in the game.\n\r", ch ); return; } /* Outdated by my changes to normal who ( besides, i'm too lazy to type whoi or whois :) - TRI Contributed by Kaneda void do_whois( CHAR_DATA *ch, char *argument ) { DESCRIPTOR_DATA *d; char buf [ MAX_STRING_LENGTH ]; char name [ MAX_INPUT_LENGTH ]; bool found; argument = one_argument( argument, name ); found = FALSE; if( name[0] == '\0' ) { send_to_char(AT_DGREEN, "Usage: whois <name>\n\r", ch ); return; } name[0] = UPPER( name[0] ); buf[0] = '\0'; for( d = descriptor_list ; d ; d = d->next ) { CHAR_DATA *wch; char const *class; char const *race; char clan[MAX_STRING_LENGTH]; CLAN_DATA *pClan; wch = ( d->original ) ? d->original : d->character; if( d->connected != CON_PLAYING || !can_see( ch, wch ) ) continue; if( str_prefix( name, wch->name ) ) continue; found = TRUE; class = class_table[ wch->class ].who_name; if( wch->level >= LEVEL_HERO ) switch( wch->level ) { case L_IMP: class = "STORM LORD"; break; case L_CON: class = " COUNCIL "; break; case L_DIR: class = " GUARDIAN "; break; case L_SEN: class = " CREATOR "; break; case L_GOD: if ( wch->sex == 2 ) class = " GODDESS "; else class = " GOD "; break; case L_DEM: class = " DEITY ";break; case L_JUN: class = " SAINT "; break; case L_APP: class = " AVATAR "; break; case LEVEL_HERO: class = " CHAMPION "; break; } race = (get_race_data(wch->race))->race_name; Clan Stuff if (wch->clan != 0) { pClan = get_clan_index(wch->clan); if IS_SET(pClan->settings, CLAN_PKILL) switch ( wch->clev ) { default: sprintf( clan, "-<%s>-", pClan->name ); break; case 0: sprintf( clan, "-<%s>-", pClan->name ); break; case 1: sprintf( clan, "-<Centurion of %s>-", pClan->name ); break; case 2: sprintf( clan, "-<Council of %s>-", pClan->name ); break; case 3: sprintf( clan, "-<Leader of %s>-", pClan->name ); break; case 4: sprintf( clan, "-<Champion of %s>-", pClan->name ); break; case 5: sprintf( clan, "-<Deity of %s>-", pClan->name ); break; } else switch ( wch->clev ) { default: sprintf( clan, "(%s)", pClan->name ); break; case 0: sprintf( clan, "(%s)", pClan->name ); break; case 1: sprintf( clan, "(Centurion of %s)", pClan->name ); break; case 2: sprintf( clan, "(Council of %s)", pClan->name ); break; case 3: sprintf( clan, "(Leader of %s)", pClan->name ); break; case 4: sprintf( clan, "(Champion of %s)", pClan->name ); break; case 5: sprintf( clan, "(Deity of %s)", pClan->name ); break; } } * * Format it up. * if ( wch->level < LEVEL_HERO ) sprintf( buf + strlen( buf ), "[%2d %s %s] ", wch->level, race, class ); else sprintf( buf + strlen( buf ), "[%s] ", class); send_to_char( AT_WHITE, buf, ch ); if(wch->guild != NULL) { buf[0] = '\0'; sprintf(buf+strlen(buf), "[%s", wch->guild->name); send_to_char(wch->guild->color, buf, ch); buf[0] = '\0'; switch(wch->guild_rank) { case 0: sprintf(buf+strlen(buf), "] "); break; case 1: sprintf(buf+strlen(buf), " Lord] "); break; case 2: sprintf(buf+strlen(buf), " High Lord] "); break; case 3: sprintf(buf+strlen(buf), " Overlord] "); break; cast 4: sprintf(buf+strlen(buf), " Diety] "); break; default: sprintf(buf+strlen(buf), "Bug] "); break; } send_to_char(wch->guild->color, buf, ch); } buf[0] = '\0'; if ( wch->pcdata->lname ) sprintf( buf + strlen( buf ), "%s%s%s%s. ", wch->name, ( wch->pcdata->lname[0] != '\0' ) ? " " : "", wch->pcdata->lname, wch->pcdata->title ); else sprintf( buf + strlen( buf ), "%s%s. ", wch->name, wch->pcdata->title ); send_to_char(AT_GREEN, buf, ch); buf[0] = '\0'; if (wch->clan != 0) sprintf( buf + strlen( buf ), "%s\n\r", clan ); else sprintf( buf, "\n\r" ); send_to_char( AT_RED, buf, ch ); buf[0] = '\0'; } if ( !found ) send_to_char(AT_DGREEN, "No one matches the given criteria.\n\r", ch ); return; } */ void do_inventory( CHAR_DATA *ch, char *argument ) { send_to_char(AT_WHITE, "You are carrying:\n\r", ch ); show_list_to_char( ch->carrying, ch, TRUE, TRUE ); return; } void do_bionic( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; int bionic; bool found; send_to_char( AT_RED, "Bionics Online:\n\r", ch); found = FALSE; for ( bionic = 0; bionic < MAX_BIONIC; bionic++ ) { if (!(obj = get_bionic_char( ch, bionic ))) continue; send_to_char( AT_BLUE, bionic_where[bionic], ch ); if ( can_see_obj( ch, obj )) { send_to_char( AT_WHITE, format_obj_to_char(obj, ch, TRUE), ch ); send_to_char( C_DEFAULT, "\n\r", ch ); }else{ send_to_char( AT_WHITE, "something\n\r", ch ); } found = TRUE; } if (!found) send_to_char(AT_WHITE, "nothing.\n\r", ch); return; } /* void do_equipment( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; int iWear; bool found; send_to_char(AT_WHITE, "You are using:\n\r", ch ); for ( iWear = 0; iWear < MAX_WEAR; iWear++ ) { if ( !( obj = get_eq_char( ch, iWear ) ) ) { continue; } send_to_char(AT_BLUE, where_name[iWear], ch ); if ( can_see_obj( ch, obj ) ) { send_to_char(AT_CYAN, format_obj_to_char( obj, ch, TRUE ), ch ); send_to_char(AT_CYAN, "\n\r", ch ); } else { send_to_char(AT_RED, "something.\n\r", ch ); } found = TRUE; } if ( !found ) send_to_char(AT_RED, "Nothing.\n\r", ch ); return; } */ void do_equipment( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; int iWear; int iWearFormat = 0; bool sendmount = FALSE; char buf[ MAX_INPUT_LENGTH ]; send_to_char(AT_WHITE, "You are using:\n\r", ch ); for ( iWear = 2; iWear != MAX_WEAR; iWear *= 2 ) { send_to_char(AT_GREEN, where_name[iWearFormat], ch ); iWearFormat += 1; if ( !( obj = get_eq_char( ch, iWear ) ) ) { send_to_char(AT_RED, "Nothing.\n\r", ch ); continue; } if ( can_see_obj( ch, obj ) ) { if ( obj->item_type == ITEM_PARMOR ) sendmount = TRUE; send_to_char(AT_CYAN, format_obj_to_char( obj, ch, TRUE ), ch ); send_to_char(AT_CYAN, "\n\r", ch ); } else { send_to_char(AT_RED, "something.\n\r", ch ); } } if ( sendmount ) { send_to_char(C_DEFAULT, "\n\r", ch ); send_to_char(AT_BLUE, "Mounted:\n\r", ch ); for ( obj = ch->carrying; obj; obj = obj->next_content ) { if ( IS_SET( obj->extra_flags, ITEM_LOADED ) ) { send_to_char(AT_CYAN, format_obj_to_char( obj, ch, TRUE ), ch ); send_to_char(C_DEFAULT, "\n\r", ch ); } } } return; } void do_compare( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj1; OBJ_DATA *obj2; char *msg; char arg1 [ MAX_INPUT_LENGTH ]; char arg2 [ MAX_INPUT_LENGTH ]; int value1; int value2; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( arg1[0] == '\0' ) { send_to_char(C_DEFAULT, "Compare what to what?\n\r", ch ); return; } if ( !( obj1 = get_obj_carry( ch, arg1 ) ) ) { send_to_char(C_DEFAULT, "You do not have that item.\n\r", ch ); return; } if ( arg2[0] == '\0' ) { for ( obj2 = ch->carrying; obj2; obj2 = obj2->next_content ) { if ( obj2->wear_loc != WEAR_NONE && can_see_obj( ch, obj2 ) && obj1->item_type == obj2->item_type && ( obj1->wear_flags & obj2->wear_flags & ~ITEM_TAKE) != 0 ) break; } if ( !obj2 ) { send_to_char(C_DEFAULT, "You aren't wearing anything comparable.\n\r", ch ); return; } } else { if ( !( obj2 = get_obj_carry( ch, arg2 ) ) ) { send_to_char(C_DEFAULT, "You do not have that item.\n\r", ch ); return; } } msg = NULL; value1 = 0; value2 = 0; if ( obj1 == obj2 ) { msg = "You compare $p to itself. It looks about the same."; } else if ( obj1->item_type != obj2->item_type ) { msg = "You can't compare $p and $P."; } else { switch ( obj1->item_type ) { default: msg = "You can't compare $p and $P."; break; case ITEM_ARMOR: value1 = obj1->value[0]; value2 = obj2->value[0]; break; case ITEM_WEAPON: value1 = obj1->value[1] + obj1->value[2]; value2 = obj2->value[1] + obj2->value[2]; break; } } if ( !msg ) { if ( value1 == value2 ) msg = "$p and $P look about the same."; else if ( value1 > value2 ) msg = "$p looks better than $P."; else msg = "$p looks worse than $P."; } act(C_DEFAULT, msg, ch, obj1, obj2, TO_CHAR ); return; } void do_credits( CHAR_DATA *ch, char *argument ) { do_help( ch, "diku" ); return; } void do_where( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; DESCRIPTOR_DATA *d; char buf [ MAX_STRING_LENGTH ]; char arg [ MAX_INPUT_LENGTH ]; bool found; if ( !check_blind( ch ) ) return; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char(AT_PURPLE, "Players near you:\n\r", ch ); found = FALSE; for ( d = descriptor_list; d; d = d->next ) { if ( d->connected == CON_PLAYING && ( victim = d->character ) && !IS_NPC( victim ) && victim->in_room && ( victim->in_room->area == ch->in_room->area || ch->level >= LEVEL_IMMORTAL ) && can_see( ch, victim ) ) { found = TRUE; if ( ch->level >= LEVEL_IMMORTAL ) sprintf( buf, "%-18s [%c][%5d] %s\n\r", victim->name, victim->fighting ? 'F' : (victim->desc && victim->desc->editor != 0) ? 'E' : (victim->desc && victim->desc->pString) ? 'W' : ' ', victim->in_room->vnum, victim->in_room->name ); else sprintf( buf, "%-28s %s\n\r", victim->name, victim->in_room->name ); send_to_char(AT_PINK, buf, ch ); } } if ( !found ) send_to_char(AT_PINK, "None\n\r", ch ); } else { found = FALSE; for ( victim = char_list; victim; victim = victim->next ) { if (( (!victim->in_room || IS_AFFECTED( victim, AFF_HIDE ) || IS_AFFECTED( victim, AFF_SNEAK ) || victim->race == RACE_HALFLING ) && ch->level < LEVEL_IMMORTAL) || (( ch->level >= LEVEL_IMMORTAL ) && (!victim->in_room)) ) continue; if (( ( victim->in_room->area == ch->in_room->area) || ( ch->level >= LEVEL_IMMORTAL )) && can_see( ch, victim ) && is_name(ch, arg, victim->name ) ) { found = TRUE; if ( ch->level >= LEVEL_IMMORTAL ) sprintf( buf, "%-18s [%c][%5d] %s\n\r", PERS( victim, ch ), victim->fighting ? 'F' : ( victim->desc && victim->desc->editor !=0 ) ? 'E' : ' ', victim->in_room->vnum, victim->in_room->name ); else sprintf( buf, "%-28s %s\n\r", PERS( victim, ch ), victim->in_room->name ); send_to_char(AT_PINK, buf, ch ); break; } } if ( !found ) act(AT_PINK, "You didn't find any $T.", ch, NULL, arg, TO_CHAR ); } return; } void do_consider( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char *msg = '\0'; char *buf = '\0'; char arg [ MAX_INPUT_LENGTH ]; int diff; int hpdiff; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char(C_DEFAULT, "Consider killing whom?\n\r", ch ); return; } if ( !( victim = get_char_room( ch, arg ) ) ) { send_to_char(C_DEFAULT, "They're not here.\n\r", ch ); return; } if ( !IS_NPC( victim ) ) { send_to_char(C_DEFAULT, "The gods do not accept this type of sacrifice.\n\r", ch ); return; } diff = victim->level - ch->level; if ( diff <= -50 ) msg = "$N almost died from your mere gaze!"; else if ( diff <= -25 ) msg = "$N is a complete wimp."; else if ( diff <= -15 ) msg = "You can kill $N naked and weaponless."; else if ( diff <= -5 ) msg = "$N is no match for you."; else if ( diff <= -2 ) msg = "$N looks like an easy kill."; else if ( diff <= 1 ) msg = "The perfect match!"; else if ( diff <= 4 ) msg = "$N says 'Do you feel lucky, punk?'."; else if ( diff <= 9 ) msg = "$N laughs at you mercilessly."; else if ( diff <= 12 ) msg = "Oh boy, this is gonna be tough."; else if ( diff <= 25 ) msg = "You got to be kidding!"; else msg = "&RDont try it, you WILL die!"; act(C_DEFAULT, msg, ch, NULL, victim, TO_CHAR ); /* additions by king@tinuviel.cs.wcu.edu */ hpdiff = ( ch->hit - victim->hit ); if ( ( ( diff >= 0) && ( hpdiff <= 0 ) ) || ( ( diff <= 0 ) && ( hpdiff >= 0 ) ) ) { send_to_char(C_DEFAULT, "Also,", ch ); } else { send_to_char(C_DEFAULT, "However,", ch ); } if ( hpdiff >= 2501 ) buf = " $E is of very fragile constitution."; if ( hpdiff <= 2500 ) buf = " you are currently much healthier than $E."; if ( hpdiff <= 500 ) buf = " you are currently healthier than $E."; if ( hpdiff <= 200 ) buf = " you are currently slightly healthier than $E."; if ( hpdiff <= 50 ) buf = " you are a teensy bit healthier than $E."; if ( hpdiff <= 0 ) buf = " $E is a teensy bit healthier than you."; if ( hpdiff <= -50 ) buf = " $E is slightly healthier than you."; if ( hpdiff <= -200 ) buf = " $E is healthier than you."; if ( hpdiff <= -500 ) buf = " $E is much healthier than you."; if ( hpdiff <= -2500 ) buf = " $E ridicules your hitpoints."; if ( hpdiff <= -10000 ) buf = " $E is built like a TANK!."; act(C_DEFAULT, buf, ch, NULL, victim, TO_CHAR ); return; } void set_title( CHAR_DATA *ch, char *title ) { char buf [ MAX_STRING_LENGTH ]; if ( IS_NPC( ch ) ) { bug( "Set_title: NPC.", 0 ); return; } buf[0] = '\0'; if ( !str_cmp( "none", title ) ) { free_string( ch->pcdata->title ); ch->pcdata->title = str_dup( " " ); 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 ) { if ( IS_NPC( ch ) ) return; if ( argument[0] == '\0' ) { send_to_char(C_DEFAULT, "Change your title to what?\n\r", ch ); return; } if ( strlen_wo_col( argument ) > 50 ) { send_to_char( C_DEFAULT, "Max title length is 50 excluding color codes.", ch ); return; } smash_tilde( argument ); set_title( ch, argument ); send_to_char(C_DEFAULT, "Ok.\n\r", ch ); } void do_description( CHAR_DATA *ch, char *argument ) { /* if ( argument[0] != '\0' ) { buf[0] = '\0'; smash_tilde( argument ); if ( argument[0] == '+' ) { if ( ch->description ) strcat( buf, ch->description ); argument++; while ( isspace( *argument ) ) argument++; } if ( strlen( buf ) + strlen( argument ) >= MAX_STRING_LENGTH - 2 ) { send_to_char(AT_CYAN, "Description too long.\n\r", ch ); return; } strcat( buf, argument ); strcat( buf, "\n\r" ); free_string( ch->description ); ch->description = str_dup( buf ); }*/ string_append( ch, &ch->description ); /* send_to_char(AT_CYAN, "Your description is:\n\r", ch ); send_to_char(AT_CYAN, ch->description ? ch->description : "(None).\n\r", ch );*/ return; } void do_report( CHAR_DATA *ch, char *argument ) { char buf [ MAX_INPUT_LENGTH ]; if ( !is_class( ch, CLASS_VAMPIRE ) ) sprintf( buf, "You report: %d/%d hp %d/%d wp %d/%d mv %d xp.\n\r", ch->hit, MAX_HIT(ch), ch->mana, MAX_MANA(ch), ch->move, MAX_MOVE(ch), ch->exp ); else sprintf( buf, "You report: %d/%d hp %d/%d bp %d/%d mv %d xp.\n\r", ch->hit, MAX_HIT(ch), ch->bp, MAX_BP(ch), ch->move, MAX_MOVE(ch), ch->exp ); send_to_char(AT_RED, buf, ch ); if ( !is_class( ch, CLASS_VAMPIRE ) ) sprintf( buf, "$n reports: %d/%d hp %d/%d wp %d/%d mv %d xp.", ch->hit, MAX_HIT(ch), ch->mana, MAX_MANA(ch), ch->move, MAX_MOVE(ch), ch->exp ); else sprintf( buf, "$n reports: %d/%d hp %d/%d bp %d/%d mv %d xp.", ch->hit, MAX_HIT(ch), ch->bp, MAX_BP(ch), ch->move, MAX_MOVE(ch), ch->exp ); act(AT_RED, buf, ch, NULL, NULL, TO_ROOM ); return; } void do_learn( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; char buf1 [ MAX_STRING_LENGTH*2 ]; int sn; int sklvl = 0; int cost; if ( IS_NPC( ch ) ) return; buf1[0] = '\0'; if ( argument[0] == '\0' ) { CHAR_DATA *mob; int col; for ( mob = ch->in_room->people; mob; mob = mob->next_in_room ) { if ( mob->deleted ) continue; if ( IS_NPC( mob ) && IS_SET( mob->act, ACT_PRACTICE ) ) break; } col = 0; for ( sn = 0; skill_table[sn].name[0] != '\0'; sn++ ) { if ( !skill_table[sn].name ) break; if ( ch->pcdata->learned[sn] > 0 ) continue; sklvl = (skill_table[sn].skill_level[ch->class[0]]); if ( sklvl < 1 || sklvl >= L_APP ) continue; if ( skill_table[sn].spell_fun != spell_null ) continue; if ( mob ) { sprintf( buf, "&W%21s &Y%3d", skill_table[sn].name, skill_table[sn].cost ); strcat( buf1, buf ); if ( ++col % 3 == 0 ) strcat( buf1, "\n\r" ); else strcat( buf1, " " ); } } if ( col % 3 != 0 ) strcat( buf1, "\n\r" ); sprintf( buf, "You have %d practice sessions left.\n\r", ch->practice ); strcat( buf1, buf ); send_to_char(C_DEFAULT, buf1, ch ); } else { CHAR_DATA *mob; int adept; sn = skill_lookup( argument ); if ( !IS_AWAKE( ch ) ) { send_to_char(C_DEFAULT, "In your dreams, or what?\n\r", ch ); return; } for ( mob = ch->in_room->people; mob; mob = mob->next_in_room ) { if ( mob->deleted ) continue; if ( IS_NPC( mob ) && IS_SET( mob->act, ACT_PRACTICE ) ) break; } if ( !mob ) { send_to_char(C_DEFAULT, "You can't do that here.\n\r", ch ); return; } if ( ch->practice < skill_table[sn].cost ) { send_to_char(C_DEFAULT, "You do not have enough practices.\n\r", ch ); return; } sklvl = (skill_table[sn].skill_level[ch->class[0]]); if ( sn < 0 || sklvl < 1 || sklvl >= L_APP ) { send_to_char(C_DEFAULT, "You can't learn that.\n\r", ch ); return; } if ( skill_table[sn].spell_fun != spell_null ) { send_to_char(C_DEFAULT, "You can't learn that.\n\r", ch ); return; } if ( IS_NPC( ch ) || ch->pcdata->learned[sn] > 0 ) { sprintf( buf, "&W%s tells you &c'&CYou've already learned %s&c'&w.\n\r", capitalize( mob->name ), skill_table[sn].name ); send_to_char( C_DEFAULT, buf, ch ); sprintf( buf, "&W%s tells you &c'&CTry practicing for more experience&c'&w.\n\r", capitalize( mob->name ) ); send_to_char( C_DEFAULT, buf, ch ); return; } cost = skill_table[sn].cost; ch->practice = ch->practice - cost; /* ch->practice--; COST HERE */ ch->pcdata->learned[sn] += int_app[get_curr_int( ch )].learn; act(C_DEFAULT, "You learn $T.", ch, NULL, skill_table[sn].name, TO_CHAR ); act(C_DEFAULT, "$n learns $T.", ch, NULL, skill_table[sn].name, TO_ROOM ); } return; } void do_practice( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; char buf1 [ MAX_STRING_LENGTH*2 ]; int sn; if ( IS_NPC( ch ) ) return; buf1[0] = '\0'; if ( argument[0] == '\0' ) { CHAR_DATA *mob; int col; for ( mob = ch->in_room->people; mob; mob = mob->next_in_room ) { if ( mob->deleted ) continue; if ( IS_NPC( mob ) && IS_SET( mob->act, ACT_PRACTICE ) ) break; } col = 0; for ( sn = 0; skill_table[sn].name[0] != '\0'; sn++ ) { if ( !skill_table[sn].name ) break; if ( !can_use_skpell( ch, sn ) ) continue; if ( ( mob ) || ( ch->pcdata->learned[sn] > 0 ) ) { sprintf( buf, "&W%21s &Y%3d%%", skill_table[sn].name, ch->pcdata->learned[sn] ); strcat( buf1, buf ); if ( ++col % 3 == 0 ) strcat( buf1, "\n\r" ); else strcat( buf1, " " ); } } if ( col % 3 != 0 ) strcat( buf1, "\n\r" ); sprintf( buf, "You have %d practice sessions left.\n\r", ch->practice ); strcat( buf1, buf ); send_to_char(C_DEFAULT, buf1, ch ); } else { CHAR_DATA *mob; int adept; if ( !IS_AWAKE( ch ) ) { send_to_char(C_DEFAULT, "In your dreams, or what?\n\r", ch ); return; } for ( mob = ch->in_room->people; mob; mob = mob->next_in_room ) { if ( mob->deleted ) continue; if ( IS_NPC( mob ) && IS_SET( mob->act, ACT_PRACTICE ) ) break; } if ( !mob ) { send_to_char(C_DEFAULT, "You can't do that here.\n\r", ch ); return; } if ( ch->practice <= 0 ) { send_to_char(C_DEFAULT, "You have no practice sessions left.\n\r", ch ); return; } if ( ( sn = skill_lookup( argument ) ) < 0 || ( IS_NPC( ch ) ) ) { send_to_char(C_DEFAULT, "You can't practice that.\n\r", ch ); return; } if (!can_use_skpell( ch, sn ) ) { send_to_char(C_DEFAULT, "You have not learned this skill yet.\n\r", ch ); send_to_char(C_DEFAULT, "Try using learn.\n\r", ch ); return; } /* Practice to approx 50% then use to learn */ if ( IS_NPC( ch ) || ch->pcdata->learned[sn] > 35 ) { sprintf( buf, "&W%s tells you &c'&CI've already trained you all I can in %s&c'&w.\n\r", capitalize( mob->name ), skill_table[sn].name ); send_to_char( C_DEFAULT, buf, ch ); sprintf( buf, "&W%s tells you &c'&CPractice in the real world for more experience&c'&w.\n\r", capitalize( mob->name ) ); send_to_char( C_DEFAULT, buf, ch ); return; } adept = IS_NPC( ch ) ? 100 : class_table[prime_class( ch )].skill_adept; if ( ch->pcdata->learned[sn] >= adept ) { sprintf( buf, "You are already an adept of %s.\n\r", skill_table[sn].name ); send_to_char(C_DEFAULT, buf, ch ); } else { ch->practice--; ch->pcdata->learned[sn] += int_app[get_curr_int( ch )].learn; /* ch->pcdata->learned[sn] += ( ( get_curr_int( ch ) * 4 ) / 3 );*/ if ( ch->pcdata->learned[sn] < adept ) { act(C_DEFAULT, "You practice $T.", ch, NULL, skill_table[sn].name, TO_CHAR ); act(C_DEFAULT, "$n practices $T.", ch, NULL, skill_table[sn].name, TO_ROOM ); } else { ch->pcdata->learned[sn] = adept; act(C_DEFAULT, "You are now an adept of $T.", ch, NULL, skill_table[sn].name, TO_CHAR ); act(C_DEFAULT, "$n is now an adept of $T.", ch, NULL, skill_table[sn].name, TO_ROOM ); } } } return; } /* * 'Wimpy' originally by Dionysos. */ void do_wimpy( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; char arg [ MAX_INPUT_LENGTH ]; int wimpy; one_argument( argument, arg ); if ( arg[0] == '\0' ) wimpy = MAX_HIT(ch) / 5; else wimpy = atoi( arg ); if ( wimpy < 0 ) { send_to_char(C_DEFAULT, "Your courage exceeds your wisdom.\n\r", ch ); return; } if ( wimpy > MAX_HIT(ch) ) { send_to_char(C_DEFAULT, "Such cowardice ill becomes you.\n\r", ch ); return; } ch->wimpy = wimpy; sprintf( buf, "Wimpy set to %d hit points.\n\r", wimpy ); send_to_char(C_DEFAULT, buf, ch ); return; } void do_password( CHAR_DATA *ch, char *argument ) { char *pArg; char *pwdnew; char *p; char arg1 [ MAX_INPUT_LENGTH ]; char arg2 [ MAX_INPUT_LENGTH ]; char cEnd; if ( IS_NPC( ch ) ) return; /* * 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 ( arg1[0] == '\0' || arg2[0] == '\0' ) { send_to_char(C_DEFAULT, "Syntax: password <old> <new>.\n\r", ch ); return; } if ( strcmp( crypt( arg1, ch->pcdata->pwd ), ch->pcdata->pwd ) ) { WAIT_STATE( ch, 40 ); send_to_char(C_DEFAULT, "Wrong password. Wait 10 seconds.\n\r", ch ); return; } if ( strlen( arg2 ) < 5 ) { send_to_char(C_DEFAULT, "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(C_DEFAULT, "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, FALSE ); send_to_char(C_DEFAULT, "Ok.\n\r", ch ); return; } void do_socials( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; char buf1 [ MAX_STRING_LENGTH ]; /* int iSocial;*/ int col; SOCIAL_DATA * pSocial; buf1[0] = '\0'; col = 0; /* for ( iSocial = 0; social_table[iSocial].name[0] != '\0';iSocial++)*/ for(pSocial = social_first;pSocial;pSocial = pSocial->next) { sprintf( buf, "%-12s", pSocial->name ); strcat( buf1, buf ); if ( ++col % 6 == 0 ) strcat( buf1, "\n\r" ); } if ( col % 6 != 0 ) strcat( buf1, "\n\r" ); send_to_char(C_DEFAULT, buf1, ch ); return; } void do_newbie( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; char buf1 [ MAX_STRING_LENGTH ]; int col; NEWBIE_DATA *pNewbie; buf1[0] = '\0'; col = 0; for( pNewbie = newbie_first; pNewbie; pNewbie = pNewbie->next ) { sprintf( buf, "%-12s", pNewbie->keyword ); strcat( buf1, buf ); if( ++col % 6 == 0 ) strcat( buf1, "\n\r" ); } if( col % 6 != 0 ) strcat( buf1, "\n\r" ); send_to_char( C_DEFAULT, buf1, ch ); return; } /* * Contributed by Alander. */ void do_commands( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; int cmd; int col = 0; int trust = get_trust(ch); for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ ) { if ( cmd_table[cmd].level < LEVEL_HERO && str_prefix("mp", cmd_table[cmd].name) && can_use_cmd(cmd, ch, trust) ) { sprintf( buf, "%-16s", cmd_table[cmd].name ); if ( ++col % 5 == 0 ) strcat( buf, "\n\r" ); send_to_char(C_DEFAULT, buf, ch); } } if ( col % 5 != 0 ) send_to_char(C_DEFAULT, "\n\r", ch); return; } void do_channels( CHAR_DATA *ch, char *argument ) { char arg [ MAX_INPUT_LENGTH ]; one_argument( argument, arg ); if ( arg[0] == '\0' ) { if ( !IS_NPC( ch ) && IS_SET( ch->act, PLR_SILENCE ) ) { send_to_char(AT_PURPLE, "You are silenced.\n\r", ch ); return; } send_to_char(AT_PURPLE, "Channels:", ch ); send_to_char(AT_PINK, !IS_SET( ch->deaf, CHANNEL_AUCTION ) ? " +AUCTION" : " -auction", ch ); send_to_char(AT_PINK, !IS_SET( ch->deaf, CHANNEL_CHAT ) ? " +CHAT" : " -chat", ch ); send_to_char(AT_PINK, !IS_SET( ch->deaf, CHANNEL_OOC ) ? " +OOC" : " -ooc", ch ); send_to_char(AT_PINK, !IS_SET( ch->deaf, CHANNEL_CLASS ) ? " +CLASS" : " -class", ch ); send_to_char(AT_PINK, !IS_SET( ch->deaf, CHANNEL_CLAN ) ? " +CLAN" : " -clan", ch ); /* if( ch->level > 2 ) send_to_char(AT_WHITE, !IS_SET( ch->deaf, CHANNEL_VENT ) ? " +VENT" : " -vent", ch ); */ if(IS_HERO(ch)) /* XOR */ { send_to_char(AT_PINK, !IS_SET(ch->deaf, CHANNEL_HERO) ? " +HERO" : " -hero", ch); } if ( IS_IMMORTAL( ch ) ) { send_to_char(AT_PINK, !IS_SET( ch->deaf, CHANNEL_IMMTALK ) ? " +IMMTALK" : " -immtalk", ch ); send_to_char(AT_PINK, !IS_SET( ch->deaf, CHANNEL_IMC ) ? " +IMC" : " -imc", ch ); } send_to_char(AT_PINK, !IS_SET( ch->deaf, CHANNEL_MUSIC ) ? " +MUSIC" : " -music", ch ); send_to_char(AT_PINK, !IS_SET( ch->deaf, CHANNEL_QUESTION ) ? " +QUESTION" : " -question", ch ); send_to_char(AT_PINK, !IS_SET( ch->deaf, CHANNEL_SHOUT ) ? " +SHOUT" : " -shout", ch ); send_to_char(AT_PINK, !IS_SET( ch->deaf, CHANNEL_YELL ) ? " +YELL" : " -yell", ch ); send_to_char( AT_LBLUE, !IS_SET(ch->deaf, CHANNEL_INFO) ? " +INFO" : " -info", ch ); send_to_char( AT_PURPLE, !IS_SET(ch->deaf, CHANNEL_CHALLENGE) ? " +CHALLENGE" : " -challenge", ch ); send_to_char( AT_RED, !IS_SET(ch->deaf, CHANNEL_ARENA) ? " +ARENA" : " -arena", ch ); /* * Log Channel Display. * Added by Altrag. */ if ( get_trust( ch ) >= L_APP ) { send_to_char(AT_DGREY, !IS_SET( ch->deaf, CHANNEL_LOG ) ? " +LOG" : " -log", ch ); } if ( get_trust( ch ) >= L_SEN ) { send_to_char(AT_DGREY, !IS_SET( ch->deaf, CHANNEL_BUILD ) ? " +BUILD" : " -build", ch ); } if ( get_trust( ch ) >= L_DIR ) { send_to_char(AT_DGREY, !IS_SET( ch->deaf, CHANNEL_GOD ) ? " +GOD" : " -god", ch ); } if ( get_trust( ch ) >= L_IMP ) { send_to_char(AT_DGREY, !IS_SET( ch->deaf, CHANNEL_GUARDIAN ) ? " +GUARD" : " -guard", ch ); } /* master channels added by Decklarean */ if ( get_trust( ch ) >= L_IMP ) { send_to_char(AT_DGREY, !IS_SET( ch->deaf, CHANNEL_CLASS_MASTER ) ? " +CLASSMASTER" : " -classmaster", ch ); } if ( get_trust( ch ) >= L_IMP ) { send_to_char(AT_DGREY, !IS_SET( ch->deaf, CHANNEL_CLAN_MASTER ) ? " +CLANMASTER" : " -clanmaster", ch ); } if ( get_trust( ch ) >= L_IMP ) { send_to_char(AT_DGREY, !IS_SET( ch->deaf, CHANNEL_GUILD_MASTER ) ? " +GUILDMASTER" : " -guildmaster", ch ); } send_to_char(AT_PINK, ".\n\r", ch ); } else { int bit; bool fClear; if ( arg[0] == '+' ) fClear = TRUE; else if ( arg[0] == '-' ) fClear = FALSE; else { send_to_char(AT_PURPLE, "Channels -channel or +channel?\n\r", ch ); return; } if ( !str_cmp( arg+1, "auction" ) ) bit = CHANNEL_AUCTION; else if ( !str_cmp( arg+1, "ooc" ) ) bit = CHANNEL_OOC; else if ( !str_cmp( arg+1, "class" ) ) bit = CHANNEL_CLASS; else if ( !str_cmp( arg+1, "chat" ) ) bit = CHANNEL_CHAT; else if ( !str_cmp( arg+1, "hero" ) ) bit = CHANNEL_HERO; else if ( !str_cmp( arg+1, "immtalk" ) ) bit = CHANNEL_IMMTALK; else if ( !str_cmp( arg+1, "imc" ) ) bit = CHANNEL_IMC; else if ( !str_cmp( arg+1, "music" ) ) bit = CHANNEL_MUSIC; else if ( !str_cmp( arg+1, "question" ) ) bit = CHANNEL_QUESTION; else if ( !str_cmp( arg+1, "shout" ) ) bit = CHANNEL_SHOUT; else if ( !str_cmp( arg+1, "yell" ) ) bit = CHANNEL_YELL; else if ( !str_cmp( arg+1, "log" ) ) bit = CHANNEL_LOG; else if ( !str_cmp( arg+1, "build" ) ) bit = CHANNEL_BUILD; else if ( !str_cmp( arg+1, "god" ) ) bit = CHANNEL_GOD; else if ( !str_cmp( arg+1, "guard" ) ) bit = CHANNEL_GUARDIAN; else if ( !str_cmp( arg+1, "info" ) ) bit = CHANNEL_INFO; else if ( !str_cmp( arg+1, "challenge") ) bit = CHANNEL_CHALLENGE; else if ( !str_cmp( arg+1, "clan" ) ) bit = CHANNEL_CLAN; /* else if ( !str_cmp( arg+1, "vent" ) ) bit = CHANNEL_VENT; */ else if ( !str_cmp( arg+1,"classmaster")) bit = CHANNEL_CLASS_MASTER; else if ( !str_cmp( arg+1,"clanmaster") ) bit = CHANNEL_CLAN_MASTER; else if ( !str_cmp( arg+1,"guildmaster")) bit = CHANNEL_GUILD_MASTER; else if ( !str_cmp( arg+1,"arena" ) ) bit = CHANNEL_ARENA; else if ( !str_cmp( arg+1, "all" ) ) bit = ~0; else { send_to_char(AT_PURPLE, "Set or clear which channel?\n\r", ch ); return; } if ( fClear ) REMOVE_BIT ( ch->deaf, bit ); else SET_BIT ( ch->deaf, bit ); send_to_char(AT_PURPLE, "Ok.\n\r", ch ); } return; } /* * Contributed by Grodyn. */ void do_config( CHAR_DATA *ch, char *argument ) { char arg [ MAX_INPUT_LENGTH ]; char buf [ MAX_STRING_LENGTH ]; int bit; bool fSet; if ( IS_NPC( ch ) ) return; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char(AT_BLOOD, "&w[&Y Keyword &w]&W Option\n\r", ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_AUTOEXIT ) ? "&w[&Y+AUTOEXIT &w]&W You automatically see exits.\n\r" : "&w[&Y-autoexit &w]&W You don't automatically see exits.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_AUTOCOINS ) ? "&w[&Y+AUTOCOINS &w]&W You automatically get coins from corpses.\n\r" : "&w[&Y-autocoins &w]&W You don't automatically get coins from corpses.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_AUTOSPLIT ) ? "&w[&Y+AUTOSPLIT &w]&W You automatically split coins with group members.\n\r" : "&w[&Y-autosplit &w]&W You don't automatically split coins with group members.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_AUTOLOOT ) ? "&w[&Y+AUTOLOOT &w]&W You automatically loot corpses.\n\r" : "&w[&Y-autoloot &w]&W You don't automatically loot corpses.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_AUTOSAC ) ? "&w[&Y+AUTOSAC &w]&W You automatically sacrifice corpses.\n\r" : "&w[&Y-autosac &w]&W You don't automatically sacrifice corpses.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_ANSI ) ? "&w[&Y+ANSI &w]&W You have ansi color enabled.\n\r" : "&w[&Y-ansi &w]&W You have ansi color disabled.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_BLANK ) ? "&w[&Y+BLANK &w]&W You have a blank line before your prompt.\n\r" : "&w[&Y-blank &w]&W You have no blank line before your prompt.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_BRIEF ) ? "&w[&Y+BRIEF &w]&W You see brief descriptions.\n\r" : "&w[&Y-brief &w]&W You see long descriptions.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_FULLNAME ) ? "&w[&Y+FULLNAME &w]&W You have name completion off.\n\r" : "&w[&Y-fullname &w]&W You are using name completion.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_COMBINE ) ? "&w[&Y+COMBINE &w]&W You see object lists in combined format.\n\r" : "&w[&Y-combine &w]&W You see object lists in single format.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_PROMPT ) ? "&w[&Y+PROMPT &w]&W You have a prompt.\n\r" : "&w[&Y-prompt &w]&W You don't have a prompt.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_TELNET_GA ) ? "&w[&Y+TELNETGA &w]&W You receive a telnet GA sequence.\n\r" : "&w[&Y-telnetga &w]&W You don't receive a telnet GA sequence.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_COMBAT ) ? "&w[&Y+COMBAT &w]&W You see all combat scroll.\n\r" : "&w[&Y-combat &w]&W You do not see dodge/parry/miss in combat.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act2, PLR_AUTOASSIST ) ? "&w[&Y+AUTOASSIST &w]&W You will now assist when needed.\n\r" : "&w[&Y-autoassist &w]&W You start your own fights.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act2, PLR_NOSUMMON ) ? "&w[&Y+NOSUMMON &w]&W You cannot be summoned.\n\r" : "&w[&Y-nosummon &w]&W You are summonable.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act2, PLR_NOFOLLOW ) ? "&w[&Y+NOFOLLOW &w]&W You do not accept followers.\n\r" : "&w[&Y-nofollow &w]&W You can be followed.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_SILENCE ) ? "&w[&Y+SILENCE &w]&W You are silenced.\n\r" : "" , ch ); send_to_char(AT_RED, !IS_SET( ch->act, PLR_NO_EMOTE ) ? "" : "&w[&Y-emote &w]&W You can't emote.\n\r" , ch ); send_to_char(AT_RED, !IS_SET( ch->act, PLR_NO_TELL ) ? "" : "&w[&Y-tell &w]&W You can't use 'tell'.\n\r" , ch ); } else { /* char buf [ MAX_STRING_LENGTH ]; int bit; bool fSet; */ if ( arg[0] == '+' ) fSet = TRUE; else if ( arg[0] == '-' ) fSet = FALSE; else { send_to_char(AT_BLOOD, "&WConfig &Y-&Woption or &Y+&Woption?\n\r", ch ); return; } if ( !str_cmp( arg+1, "autoexit" ) ) bit = PLR_AUTOEXIT; else if ( !str_cmp( arg+1, "autoloot" ) ) bit = PLR_AUTOLOOT; else if ( !str_cmp( arg+1, "autocoins") ) bit = PLR_AUTOCOINS; else if ( !str_cmp( arg+1, "autosplit") ) bit = PLR_AUTOSPLIT; else if ( !str_cmp( arg+1, "autosac" ) ) bit = PLR_AUTOSAC; else if ( !str_cmp( arg+1, "autosac" ) ) bit = PLR_AUTOCOINS; else if ( !str_cmp( arg+1, "blank" ) ) bit = PLR_BLANK; else if ( !str_cmp( arg+1, "brief" ) ) bit = PLR_BRIEF; else if ( !str_cmp( arg+1, "fullname" ) ) bit = PLR_FULLNAME; else if ( !str_cmp( arg+1, "combine" ) ) bit = PLR_COMBINE; else if ( !str_cmp( arg+1, "prompt" ) ) bit = PLR_PROMPT; else if ( !str_cmp( arg+1, "telnetga" ) ) bit = PLR_TELNET_GA; else if ( !str_cmp( arg+1, "ansi" ) ) bit = PLR_ANSI; else if ( !str_cmp( arg+1, "combat" ) ) bit = PLR_COMBAT; else if ( !str_cmp( arg+1, "autoassist")) bit = PLR_AUTOASSIST; else if ( !str_cmp( arg+1, "nosummon" ) ) bit = PLR_NOSUMMON; else if ( !str_cmp( arg+1, "nofollow" ) ) bit = PLR_NOFOLLOW; else { send_to_char(AT_BLOOD, "Config which option?\n\r", ch ); return; } if ( fSet ) { if ( !str_cmp( arg+1, "autoassist") || !str_cmp( arg+1, "nofollow") || !str_cmp( arg+1, "nosummon")) { SET_BIT ( ch->act2, bit ); sprintf( buf, "%s is now &YON&W.\n\r", arg+1 ); buf[0] = UPPER( buf[0] ); send_to_char(AT_WHITE, buf, ch ); } else { SET_BIT ( ch->act, bit ); sprintf( buf, "%s is now &YON&W.\n\r", arg+1 ); buf[0] = UPPER( buf[0] ); send_to_char(AT_WHITE, buf, ch ); } } else { if ( !str_cmp( arg+1, "autoassist") || !str_cmp( arg+1, "nosummon") || !str_cmp( arg+1, "nofollow")) { REMOVE_BIT ( ch->act2, bit ); sprintf( buf, "%s is now &YOFF&W.\n\r", arg+1 ); buf[0] = UPPER( buf[0] ); send_to_char(AT_WHITE, buf, ch ); } else { REMOVE_BIT ( ch->act, bit ); sprintf( buf, "%s is now &YOFF&W.\n\r", arg+1 ); buf[0] = UPPER( buf[0] ); send_to_char(AT_WHITE, buf, ch ); } } /* if (bit == PLR_AUTOASSIST || bit == PLR_NOSUMMON || bit == PLR_NOFOLLOW ) { if ( fSet ) { SET_BIT ( ch->act2, bit ); sprintf( buf, "%s is now &YON&W.\n\r", arg+1 ); buf[0] = UPPER( buf[0] ); send_to_char(AT_WHITE, buf, ch ); } else { REMOVE_BIT ( ch->act2, bit ); sprintf( buf, "%s is now &YOFF&W.\n\r", arg+1 ); buf[0] = UPPER( buf[0] ); send_to_char(AT_WHITE, buf, ch ); } } else } if ( fSet ) { SET_BIT ( ch->act, bit ); sprintf( buf, "%s is now &YON&W.\n\r", arg+1 ); buf[0] = UPPER( buf[0] ); send_to_char(AT_WHITE, buf, ch ); } else { REMOVE_BIT ( ch->act, bit ); sprintf( buf, "%s is now &YOFF&W.\n\r", arg+1 ); buf[0] = UPPER( buf[0] ); send_to_char(AT_WHITE, buf, ch ); } } */ } return; } /* do_immlist replaced this - Decklarean void do_wizlist ( CHAR_DATA *ch, char *argument ) { do_help ( ch, "wizlist" ); return; } */ void do_spells ( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; int sn; int col; if ( IS_NPC( ch ) || ( !IS_NPC( ch ) && !has_spells( ch ) ) ) { send_to_char ( AT_BLUE, "You do not know how to cast spells!\n\r", ch ); return; } col = 0; for ( sn = 0; skill_table[sn].name[0] != '\0'; sn++ ) { if ( !skill_table[sn].name ) break; if ( !can_use_skpell( ch, sn ) ) continue; sprintf( buf, "%18s %3dpts ", skill_table[sn].name, ( ch->race == RACE_ELF || ch->race == RACE_ELDER ) ? (int)(SPELL_COST( ch, sn ) * .75) : SPELL_COST( ch, sn ) ); send_to_char( AT_BLUE, buf, ch ); if ( ++col % 3 == 0 ) send_to_char( AT_BLUE, "\n\r", ch ); } if ( col % 3 != 0 ) send_to_char( AT_BLUE, "\n\r", ch ); return; } void do_slist ( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; int sn; int col; int level; int profession; int iClass; bool pSpell; bool onlyCl = FALSE; int classes = number_classes( ch ); bool was_printed[ MAX_SKILL ]; for ( iClass = 0; iClass < MAX_SKILL; iClass++ ) was_printed[iClass] = FALSE; profession = prime_class( ch ); for ( ;; ) { char arg [MAX_STRING_LENGTH]; argument = one_argument ( argument, arg ); if ( arg[0] == '\0' ) break; if (strlen(arg) < 3) { send_to_char(AT_GREEN, "That is not a class.\n\r", ch ); return; } arg[3] = '\0'; for (iClass = 0; iClass < MAX_CLASS; iClass++) { if (!str_cmp(arg,class_table[iClass].who_name)) { profession = iClass; onlyCl = TRUE; break; } } if (iClass == MAX_CLASS) { send_to_char(AT_GREEN, "That is not a class.\n\r", ch ); return; } } if ( IS_NPC( ch ) ) { send_to_char (AT_BLUE, "You do not need any stinking spells!\n\r", ch ); return; } send_to_char( AT_BLUE, " &CSpells/Skills\n\r\n\r", ch ); for ( level = 1; level <= L_CHAMP3; level++ ) { col = 0; pSpell = TRUE; for ( sn = 0; skill_table[sn].name[0] != '\0'; sn++ ) { if ( !skill_table[sn].name ) break; if ( skill_table[sn].spell_fun != spell_null ) continue; if ( ( onlyCl || classes == 1 ) && skill_table[sn].skill_level[profession] != level ) continue; if ( classes == 2 && skill_table[sn].skill_level[profession] != level && skill_table[sn].skill_level[ch->class[1]] != level ) continue; if ( classes == 3 && skill_table[sn].skill_level[profession] != level && skill_table[sn].skill_level[ch->class[1]] != level && skill_table[sn].skill_level[ch->class[2]] != level ) continue; if ( was_printed[sn] ) continue; was_printed[sn] = TRUE; if ( pSpell ) { /* sprintf ( buf, "&w%2d:", level ); send_to_char( AT_BLUE, buf, ch ); */ pSpell = FALSE; } if ( ++col % 4 == 0 ) send_to_char( AT_BLUE, " ", ch ); sprintf ( buf, "&C%24s", skill_table[sn].name ); send_to_char( AT_BLUE, buf, ch ); if ( col % 3 == 0 ) send_to_char(AT_BLUE, "\n\r", ch ); } if ( col % 3 != 0 ) send_to_char( AT_BLUE, "\n\r", ch ); } return; } /* bypassing the config command - Kahn */ void do_autoexit ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_AUTOEXIT ) ? sprintf( buf, "-autoexit" ) : sprintf( buf, "+autoexit" ) ); do_config( ch, buf ); return; } void do_autoloot ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_AUTOLOOT ) ? sprintf( buf, "-autoloot" ) : sprintf( buf, "+autoloot" ) ); do_config( ch, buf ); return; } void do_autoassist ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act2, PLR_AUTOASSIST ) ? sprintf( buf, "-autoassist" ) : sprintf( buf, "+autoassist" ) ); do_config( ch, buf ); return; } void do_nosummon ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act2, PLR_NOSUMMON ) ? sprintf( buf, "-nosummon" ) : sprintf( buf, "+nosummon" ) ); do_config( ch, buf ); return; } void do_nofollow ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act2, PLR_NOFOLLOW ) ? sprintf( buf, "-nofollow" ) : sprintf( buf, "+nofollow" ) ); do_config( ch, buf ); return; } void do_autosac ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_AUTOSAC ) ? sprintf( buf, "-autosac" ) : sprintf( buf, "+autosac" ) ); do_config( ch, buf ); return; } void do_blank ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_BLANK ) ? sprintf( buf, "-blank" ) : sprintf( buf, "+blank" ) ); do_config( ch, buf ); return; } void do_brief ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_BRIEF ) ? sprintf( buf, "-brief" ) : sprintf( buf, "+brief" ) ) ; do_config( ch, buf ); return; } void do_combine ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_COMBINE ) ? sprintf( buf, "-combine" ) : sprintf( buf, "+combine" ) ); do_config( ch, buf ); return; } void do_autosplit ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_AUTOSPLIT ) ? sprintf( buf, "-autosplit" ) : sprintf( buf, "+autosplit" ) ); do_config( ch, buf ); return; } void do_ansi ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_ANSI ) ? sprintf( buf, "-ansi" ) : sprintf( buf, "+ansi" ) ); do_config( ch, buf ); return; } void do_fullname ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_FULLNAME ) ? sprintf( buf, "-fullname" ) : sprintf( buf, "+fullname" ) ); do_config( ch, buf ); return; } void do_combat ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_COMBAT ) ? sprintf( buf, "-combat" ) : sprintf( buf, "+combat" ) ); do_config( ch, buf ); return; } void do_telnetga ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_TELNET_GA ) ? sprintf( buf, "-telnetga" ) : sprintf( buf, "+telnetga" ) ); do_config( ch, buf ); return; } 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' ) lines = 20; else lines = atoi( arg ); if ( lines < 1 ) { send_to_char(C_DEFAULT, "Negative or Zero values for a page pause are not legal.\n\r", ch ); return; } if ( lines > 60 ) { send_to_char(C_DEFAULT, "I don't know of a screen that is larger than 60 lines!\n\r", ch ); lines = 60; } ch->pcdata->pagelen = lines; sprintf( buf, "Page pause set to %d lines.\n\r", lines ); send_to_char(C_DEFAULT, buf, ch ); return; } /* Do_prompt from Morgenes from Aldara Mud */ void do_prompt( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; buf[0] = '\0'; ch = ( ch->desc->original ? ch->desc->original : ch->desc->character ); if ( argument[0] == '\0' ) { ( IS_SET ( ch->act, PLR_PROMPT ) ? sprintf( buf, "-prompt" ) : sprintf( buf, "+prompt" ) ); do_config( ch, buf ); return; } if( !strcmp( argument, "all" ) ) strcat( buf, "<%hhp %mm %vmv> "); else { if ( strlen( argument ) > 50 ) argument[50] = '\0'; smash_tilde( argument ); if ( strlen( argument ) < 2 ) sprintf( buf, "%s ", argument ); else strcat( buf, argument ); } free_string( ch->prompt ); ch->prompt = str_dup( buf ); send_to_char(C_DEFAULT, "Ok.\n\r", ch ); return; } void do_auto( CHAR_DATA *ch, char *argument ) { do_config( ch, "" ); return; } void do_irongrip( CHAR_DATA *ch, char *argument ) { AFFECT_DATA af; if ( IS_NPC( ch ) || number_percent( ) > ch->pcdata->learned[gsn_grip] ) { send_to_char( AT_WHITE, "You failed.\n\r", ch ); return; } if ( ch->position == POS_FIGHTING || is_affected( ch, gsn_grip ) ) return; af.type = gsn_grip; af.level = ch->level; af.duration = ch->level / 6; af.location = APPLY_ANTI_DIS; af.modifier = ch->level - ( ch->level / 4 ); af.bitvector = 0; affect_to_char( ch, &af ); send_to_char( AT_BLUE, "You grip your weapon tightly.\n\r", ch ); update_skpell( ch, gsn_grip ); return; } void do_induct( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_STRING_LENGTH]; char const *clname; char buf [MAX_STRING_LENGTH]; CLAN_DATA *pClan; buf[0] = '\0'; one_argument( argument, arg ); pClan=get_clan_index(ch->clan); if ( ( ch->clan == 0 ) || ( ch->clev < 1 ) ) return; if ( ((ch->clev == 1) && (!IS_SET(pClan->settings,CLAN_SECOND_INDUCT))) ||((ch->clev == 2) && (!IS_SET(pClan->settings,CLAN_FIRST_INDUCT) )) ||((ch->clev == 3) && (!IS_SET(pClan->settings,CLAN_LEADER_INDUCT))) ||((ch->clev == 4) && (!IS_SET(pClan->settings,CLAN_CHAMP_INDUCT) )) ) { send_to_char( AT_WHITE, "You can't induct in your current clan position.", ch); return; } if ( ! ( victim = get_char_room( ch, arg ) ) ) { send_to_char( AT_WHITE, "No such person is in the room.\n\r", ch ); return; } if IS_NPC(victim) return; if ( IS_SET ( victim->act, PLR_OUTCAST ) ) { send_to_char( AT_WHITE, "That person is an outcast.\n\r", ch ); return; } if ( victim->clan != 0 ) return; if ( !pClan ) return; pClan->members++; clname = pClan->name; sprintf( buf + strlen( buf ), "<%s>", clname ); act(AT_RED, "$n has been inducted into $T.", victim, NULL, buf, TO_ROOM); act(AT_RED, "You are now a member of $T.", victim, NULL, buf, TO_CHAR); act(AT_RED, "You have inducted $N.", ch, NULL, victim, TO_CHAR); victim->clan = ch->clan; victim->clev = 0; return; } void do_outcast( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_STRING_LENGTH]; char const *clname; char buf [MAX_STRING_LENGTH]; CLAN_DATA *pClan; buf[0] = '\0'; one_argument( argument, arg ); if ( ( ch->clan == 0 ) || ( ch->clev < 2 ) ) return; if ( !( victim = get_char_room( ch, arg ) ) ) { send_to_char( AT_WHITE, "No such person is in the room.\n\r", ch ); return; } if IS_NPC(victim) return; if ( ( victim->clan == 0 ) || ( victim->clan != ch->clan ) ) return; pClan=get_clan_index(ch->clan); if ( !pClan ) return; pClan->members--; clname = pClan->name; sprintf ( buf + strlen( buf ), "<%s>", clname ); act(AT_RED, "$n has been outcasted from $T.", victim, NULL, buf, TO_ROOM); act(AT_RED, "You are no longer a member of $T.", victim, NULL, buf, TO_CHAR); act(AT_RED, "You have outcasted $N.", ch, NULL, victim, TO_CHAR); victim->clan = 0; victim->clev = 0; if ( victim->cquestpnts > 0 ) /* delete player's Clan Quest points */ victim->cquestpnts = 0; SET_BIT( victim->act, PLR_OUTCAST ); return; } void do_setlev( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg1 [ MAX_INPUT_LENGTH ]; char arg2 [ MAX_INPUT_LENGTH ]; int level; CLAN_DATA *pClan; char const *cltitle; cltitle = "NONE"; /* init */ argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( ch->clev < 3 ) return; if ( arg1[0] == '\0' || arg2[0] == '\0' || !is_number( arg2 ) ) { send_to_char(AT_WHITE, "Syntax: &Bsetlev <char> <level>.\n\r", ch ); send_to_char(AT_WHITE, "Valid Levels are as follows\n\r", ch ); send_to_char(AT_WHITE, " 0 -> Regular member.\n\r", ch ); send_to_char(AT_WHITE, " 1 -> Centurion of Clan.\n\r", ch ); send_to_char(AT_WHITE, " 2 -> Council of Clan.\n\r", ch ); send_to_char(AT_WHITE, " 3 -> Leader of Clan.\n\r", ch ); send_to_char(AT_WHITE, " 4 -> Clan Champion.\n\r", ch ); return; } if ( !( victim = get_char_room( ch, arg1 ) ) ) { send_to_char(AT_WHITE, "That player is not here.\n\r", ch); return; } if ( IS_NPC( victim ) ) { send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch ); return; } if ( (ch->clan != victim->clan) || ( ch->clev < victim->clev ) ) return; level = atoi( arg2 ); if ( level > ch->clev ) { send_to_char(AT_WHITE, "Not above your own level.\n\r", ch); return; } if ( level < 0 || level > 4 ) { send_to_char(AT_WHITE, "Valid Levels are as follows\n\r", ch ); send_to_char(AT_WHITE, " 0 -> Regular member.\n\r", ch ); send_to_char(AT_WHITE, " 1 -> Centurion in command.\n\r", ch ); send_to_char(AT_WHITE, " 2 -> Council in command.\n\r", ch ); send_to_char(AT_WHITE, " 3 -> Leader of Clan.\n\r", ch ); send_to_char(AT_WHITE, " 4 -> Clan Champion.\n\r", ch ); return; } pClan=get_clan_index(ch->clan); /* Lower a player in the Clan */ switch ( victim->clev ) { case 0: break; case 1: pClan->issecond=FALSE; free_string( pClan->second ); pClan->second = str_dup( "EMPTY" ); break; case 2: pClan->isfirst=FALSE; free_string( pClan->first ); pClan->first= str_dup( "EMPTY" ); break; case 3: pClan->isleader=FALSE; free_string( pClan->leader ); pClan->leader=str_dup( "EMPTY" ); break; case 4: pClan->ischamp=FALSE; free_string( pClan->champ ); pClan->champ = str_dup( "EMPTY" ); break; default: break; } switch ( level ) { default: break; case 0: break; case 1: if (pClan->issecond) { send_to_char(AT_WHITE, "Clan already has a Centurion, defaulting to regular member", ch ); level = 0; break; } else { pClan->issecond=TRUE; pClan->second = str_dup( victim->name ); break; } case 2: if (pClan->isfirst) { send_to_char(AT_WHITE, "Clan already has a Council, defaulting to regular member", ch ); level = 0; break; } else { pClan->isfirst=TRUE; pClan->first = str_dup( victim->name ); break; } case 3: if (pClan->isleader) { send_to_char(AT_WHITE, "Clan already has a Leader, defaulting to regular member", ch ); level = 0; break; } else { pClan->isleader=TRUE; pClan->leader = str_dup( victim->name ); break; } case 4: if (pClan->ischamp) { send_to_char(AT_WHITE, "Clan already has a Champion, defaulting to regular member", ch ); level = 0; break; } else { pClan->ischamp=TRUE; pClan->champ = str_dup( victim->name ); break; } } if ( level <= victim->clev ) { char buf [MAX_STRING_LENGTH]; buf[0] = '\0'; switch( level ) { case 0 : cltitle = "<"; break; case 1 : cltitle = "<Centurion of"; break; case 2 : cltitle = "<Council of"; break; case 3 : cltitle = "<Leader of"; break; case 4 : cltitle = "<Hero of"; break; default: cltitle = "[bug rep to imm]"; break; } sprintf( buf + strlen(buf), "%s %s>", cltitle, pClan->name ); act(AT_BLUE, "You have been lowered to $T.", victim, NULL, buf, TO_CHAR ); act(AT_BLUE, "Lowering a players clan level.", ch, NULL, NULL, TO_CHAR ); act(AT_BLUE, "$n is now $T", victim, NULL, buf, TO_ROOM ); victim->clev = level; return; } else { char buf [MAX_STRING_LENGTH]; buf[0] = '\0'; switch( level ) { case 0 : cltitle = "<"; break; case 1 : cltitle = "<Centurion of"; break; case 2 : cltitle = "<Council of"; break; case 3 : cltitle = "<Leader of"; break; case 4 : cltitle = "<Hero of"; break; } sprintf( buf + strlen(buf), "%s %s>", cltitle, pClan->name ); act(AT_BLUE, "You have been raised to $T.", victim, NULL, buf, TO_CHAR ); act(AT_BLUE, "Raising a players clan level.", ch, NULL, NULL, TO_CHAR ); act(AT_BLUE, "$n is now $T", victim, NULL, buf, TO_ROOM ); victim->clev = level; return; } return; } void do_smash ( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; char buf [MAX_STRING_LENGTH]; char arg [MAX_INPUT_LENGTH]; CHAR_DATA *victim; char *name; if ( ch->clan != 5 ) { send_to_char(C_DEFAULT,"Huh?\n\r",ch); return; } if ( ch->ctimer ) { send_to_char(AT_BLUE, "You failed.\n\r",ch); return; } buf[0]='\0'; one_argument( argument, arg ); if ( !(obj = get_obj_carry( ch, arg ) ) ) { send_to_char(AT_WHITE, "You do not have that doll.\n\r", ch ); return; } name = obj->name; if ( !(victim = get_char_world(ch, name) ) || victim->in_room->area != ch->in_room->area ) { send_to_char( AT_WHITE, "That person's life cannot be sensed.\n\r", ch ); return; } if ( ch->level - victim->level > 8 || victim->level - ch->level > 8 ) { send_to_char(AT_BLUE, "The doll remains undamaged.\n\r",ch); return; } act(AT_RED, "You call down the Dark forces of Retribution on $N.", ch, NULL, victim, TO_CHAR); act( AT_RED, "$n smashes $p.", ch, obj, NULL, TO_ROOM ); if ( !victim->wait ) act( AT_RED, "You feel a wave of nausia come over you.", victim, NULL, NULL, TO_CHAR ); extract_obj(obj); ch->ctimer = 5; if ( victim->wait ) return; STUN_CHAR(victim, 10, STUN_TOTAL); victim->position = POS_STUNNED; update_pos( victim ); return; } void do_guild(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; if(argument[0] == '\0') { send_to_char(AT_WHITE, "Guild <char>\n\r", ch); return; } if(ch->guild == NULL) { send_to_char(AT_BLUE, "You must be in a guild to induct someone.\n\r", ch); return; } if(!is_name(NULL, ch->name, ch->guild->deity)) { send_to_char(AT_BLUE, "You are not the deity of this guild.\n\r", ch); return; } if((victim = get_char_world(ch, argument)) == NULL) { send_to_char(AT_BLUE, "Player not found.\n\r", ch); return; } if(IS_NPC(victim)) { send_to_char(AT_BLUE, "May guild PCs only.\n\r", ch); return; } if(victim->guild != NULL) { send_to_char(AT_BLUE, "That person is already guilded.\n\r", ch); } if ( IS_SET( victim->act, PLR_THIEF ) && !strcmp( ch->guild->name, "MERCENARY" ) ) { send_to_char(AT_BLUE, "That person has a thief flag!\n\r", ch ); return; } victim->guild = ch->guild; victim->guild_rank = 0; act(AT_BLUE, "You guild $N.", ch, NULL, victim, TO_CHAR); act(AT_BLUE, "$N guilds you.", victim, NULL, ch, TO_CHAR); return; } void do_unguild(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; if(argument[0] == '\0') { send_to_char(AT_WHITE, "Unguild <char>\n\r", ch); return; } if(ch->guild == NULL) { send_to_char(AT_BLUE, "You must be in a guild to unguild someone.\n\r", ch); return; } if(!is_name(NULL, ch->name, ch->guild->deity)) { send_to_char(AT_BLUE, "You are not the deity of this guild.\n\r", ch); return; } if((victim = get_char_world(ch, argument)) == NULL) { send_to_char(AT_BLUE, "Player not found.\n\r", ch); return; } if(victim->guild != ch->guild) { send_to_char(AT_BLUE, "That person is not in your guild.\n\r", ch); return; } victim->guild = NULL; act(AT_BLUE, "You unguild $N.", ch, NULL, victim, TO_CHAR); act(AT_BLUE, "$N unguilds you.", victim, NULL, ch, TO_VICT); return; } void do_setrank(CHAR_DATA *ch, char *argument) { char arg1 [MAX_INPUT_LENGTH]; CHAR_DATA *victim; int value; argument = one_argument(argument, arg1); value = is_number(argument) ? atoi(argument) : 0; if(arg1[0] == '\0') { send_to_char(AT_WHITE, "Setrank <char> <rank num>\n\r", ch); send_to_char(AT_WHITE, " rank num > 0 \n\r", ch); return; } if(ch->guild == NULL) { send_to_char(AT_BLUE, "You must be in a guild to induct someone.\n\r", ch); return; } if(!is_name(NULL, ch->name, ch->guild->deity)) { send_to_char(AT_BLUE, "You are not the deity of this guild.\n\r", ch); return; } if((victim = get_char_world(ch, arg1)) == NULL) { send_to_char(AT_BLUE, "Player not found.\n\r", ch); return; } if(victim->guild != ch->guild) { send_to_char(AT_BLUE, "That person is not in your guild.\n\r", ch); return; } victim->guild_rank = value; send_to_char(AT_BLUE, "Ok.\n\r", ch); return; } void do_guilds( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; char result [ MAX_STRING_LENGTH*2 ]; int cnt = 0; sprintf( result, "&z[&R%12s&z] [&R%20s&z]\n\r", "Guild Name","Deities" ); for ( cnt = 0; guild_table[cnt].name[0] != '\0'; cnt++ ) { sprintf( buf, "&z[&W%*s&z] [&W%*s&z]\n\r", 12 + strlen(guild_table[cnt].name) - strlen_wo_col(guild_table[cnt].name), guild_table[cnt].name, 20 + strlen(guild_table[cnt].deity) - strlen_wo_col(guild_table[cnt].deity), guild_table[cnt].deity ); strcat( result, buf ); } send_to_char( AT_WHITE, result, ch ); return; } void do_racelist( CHAR_DATA *ch, char *argument ) { RACE_DATA *pRace; char buf[MAX_STRING_LENGTH]; for ( pRace = first_race; pRace; pRace = pRace->next ) { sprintf( buf, "&z[&W%2d&z][&W%20s&z][&W%3s&z][&W%2d&z][&W%2d&z][&W%2d&z][&W%2d&z][&W%2d&z]\n\r", pRace->vnum, pRace->race_full, pRace->race_name, pRace->mstr, pRace->mint, pRace->mwis, pRace->mdex, pRace->mcon ); send_to_char( C_DEFAULT, buf, ch ); } } void do_clans( CHAR_DATA *ch, char *argument ) { CLAN_DATA *pClan; char buf[MAX_STRING_LENGTH]; char result [ MAX_STRING_LENGTH*2 ]; /* May need tweaking. */ if ( clan_first == NULL ) return; sprintf( result, "&z[&W%3s&z] [&W%18s&z] [&W%7s&z] [&W%6s&z] [&W%7s&z] [&W%6s&z]\n\r", "Num", "Clan Name", "Members", "Pkills", "Pkilled", "Mkills" ); for ( pClan = clan_first->next; pClan; pClan = pClan->next ) { sprintf( buf, "&z[&W%3d&z] [&W%*s&z] [&W%7d&z] [&r%6d&z] [&W%7d&z] [&R%6d&z]\n\r", pClan->vnum, 18 + strlen(pClan->name) - strlen_wo_col(pClan->name), pClan->name, pClan->members, pClan->pkills, pClan->pdeaths, pClan->mkills ); strcat( result, buf ); } send_to_char(AT_WHITE, result, ch ); return; } void do_cinfo( CHAR_DATA *ch, char *argument ) { CLAN_DATA *pClan; char buf[MAX_STRING_LENGTH]; int num; char arg1[MAX_INPUT_LENGTH]; OBJ_INDEX_DATA *pObjIndex; PLAYERLIST_DATA *pPlayer; argument = one_argument(argument, arg1); if (arg1[0] == '\0') { send_to_char(AT_WHITE, "Syntax: &Rcinfo <clan number>\n\r", ch ); send_to_char(AT_WHITE, "Syntax: &Rcinfo <clan name>\n\r", ch ); send_to_char(AT_WHITE, "Use the command clans to find a clan name or number.\n\r", ch ); return; } num = is_number( arg1 ) ? atoi( arg1 ) : -1; for ( pClan = clan_first->next; pClan; pClan = pClan->next ) { if ( !str_cmp( arg1, strip_color( pClan->name ) ) ) { num = pClan->vnum; break; } } if ( num == -1 ) { send_to_char( AT_WHITE, "No such clan exists, please try again.\n\r", ch ); send_to_char( AT_WHITE, "Type clans to see available clan names.\n\r", ch ); return; } if (!(pClan = get_clan_index(num))) { send_to_char( AT_WHITE, "Illegal clan number, please try again.\n\r", ch ); send_to_char( AT_WHITE, "Type clans to see available clan numbers.\n\r", ch ); return; } sprintf( buf, "&z------------------&WInformation on &w<&R%s&w>&z-----------------\n\r\n\r", pClan->name ); send_to_char(AT_WHITE, buf, ch ); sprintf( buf, "&cChampion&w: &z[&W%12s&z]&c%s&R%s\n\r", pClan->champ, IS_SET(pClan->settings, CLAN_LEADER_INDUCT) ? " Can induct." : "", pClan->ischamp ? "" : " Position open." ); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "&cLeader&w: &z[&W%12s&z]&c%s&R%s\n\r", pClan->leader, IS_SET(pClan->settings, CLAN_LEADER_INDUCT) ? " Can induct." : "", pClan->isleader ? "" : " Position open." ); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "&cCouncil&w: &z[&W%12s&z]&c%s&R%s\n\r", pClan->first, IS_SET(pClan->settings, CLAN_LEADER_INDUCT) ? " Can induct." : "", pClan->isfirst ? "" : " Position open." ); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "&cCenturion&w: &z[&W%12s&z]&c%s&R%s\n\r", pClan->second, IS_SET(pClan->settings, CLAN_LEADER_INDUCT) ? " Can induct." : "", pClan->issecond ? "" : " Position open." ); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "&cMembers&w: &z[&R%12d&z]\n\r", pClan->members ); send_to_char(AT_WHITE, buf, ch ); sprintf( buf, "&cCivil Pkill&w: &z[%12s&z]\n\r", IS_SET(pClan->settings, CLAN_CIVIL_PKILL) ? "&rYES" : "&CNO" ); send_to_char(AT_WHITE, buf, ch ); if IS_SET(pClan->settings, CLAN_PKILL) { sprintf( buf, "&cPkill&w: &z[ &rYES&z]\n\r" ); send_to_char(AT_RED, buf, ch ); sprintf( buf, "&cPkills&w: &z[&R%12d&z]\n\r", pClan->pkills ); send_to_char(AT_WHITE, buf, ch ); sprintf( buf, "&cPkilled&w: &z[&R%12d&z]\n\r", pClan->pdeaths ); send_to_char(AT_WHITE, buf, ch ); sprintf( buf, "&cMkills&w: &z[&R%12d&z]\n\r", pClan->mkills ); send_to_char(AT_WHITE, buf, ch ); sprintf( buf, "&cEquipment&w:\n\r" ); send_to_char(AT_WHITE, buf, ch ); } else { sprintf( buf, "&cPkill&w: &z[ &CNO&z]\n\r" ); send_to_char( AT_LBLUE, buf, ch ); sprintf( buf, "&cMkills&w: &z[&R%12d&z]\n\r", pClan->mkills ); send_to_char(AT_WHITE, buf, ch ); sprintf( buf, "&cEquipment&w:\n\r" ); send_to_char(AT_WHITE, buf, ch ); } sprintf( buf, "&cDescription&w:\n\r&W%s", pClan->description ); send_to_char( AT_WHITE, buf, ch ); send_to_char( C_DEFAULT, "&cCurrent Members:\n\r", ch ); for ( pPlayer = playerlist; pPlayer; pPlayer = pPlayer->next ) { if ( pPlayer->clan_name ) if ( !str_cmp(pPlayer->clan_name, pClan->name ) ) { sprintf( buf, "%s\n\r", pPlayer->name ); send_to_char( AT_WHITE, buf, ch ); } } return; } void do_questflag( CHAR_DATA *ch, char *argument ) { if (IS_NPC( ch ) ) { send_to_char( AT_WHITE, "Only PCs may do this.\n\r", ch ); return; } if (quest) { if ( ch->level < qmin ) { send_to_char( AT_WHITE, "You are too low of level for this quest.\n\r", ch ); return; } if ( ch->level > qmax ) { send_to_char( AT_WHITE, "You are too high of level for this quest.\n\r", ch ); return; } } if (!(quest) && !IS_SET( ch->act, PLR_QUESTOR ) ) { send_to_char( AT_WHITE, "There is currently no quest.\n\r", ch ); return; } if ( IS_SET( ch->act, PLR_QUEST ) && (quest) ) { send_to_char( AT_WHITE, "You must wait for an immortal to remove you from the quest.\n\r", ch ); return; } else if ( IS_SET( ch->act, PLR_QUEST ) ) { REMOVE_BIT( ch->act, PLR_QUEST ); send_to_char( AT_WHITE, "Ok, you are no longer questing.\n\r", ch ); return; } else { SET_BIT( ch->act, PLR_QUEST ); send_to_char( AT_WHITE, "Ok, you are now questing.\n\r", ch ); return; } return; } void do_autocoins( CHAR_DATA *ch, char *argument ) /*void do_autogold( CHAR_DATA *ch, char *argument ) */ { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_AUTOCOINS ) ? sprintf( buf, "-autocoins" ) : sprintf( buf, "+autocoins" ) ); do_config( ch, buf ); } /* void do_vsi( CHAR_DATA *ch ) { char limbm[MAX_STRING_LENGTH]; int limb; for ( limb = 1; limb <= 2; limb++ ) { switch( ch->arm[limb]->hp ) { case 1: sprintf( limbm, "&RYour fingers from your %s hand are missing, and they are %s\n\r", ( limb == 1 ) ? "left" : "right", bleedinglev( ch->arm[limb]->bl ); send_to_char( AT_WHITE, limbm, ch ); break; case 2: sprintf( limbm, "&RYour %s hand is missing, and it is %s\n\r", ( limb == 1 ) ? "left" : "right", bleedinglev( ch->arm[limb]->bl ); send_to_char( AT_WHITE, limbm, ch ); break; case 3: sprintf( limbm, "&RYour %s arm is missing past the elbow, and it is %s\n\r", ( limb == 1 ) ? "left" : "right", bleedinglev( ch->arm[limb]->bl ); send_to_char( AT_WHITE, limbm, ch ); break; case 4: sprintf( limbm, "&RYou &B*&RWHOLE&B*&R %s arm is missing!, and it is %s\n\r", ( limb == 1 ) ? "left" : "right", bleedinglev( ch->arm[limb]->bl ); send_to_char( AT_WHITE, limbm, ch ); break; default: break; } } switch( ch->neck->hp ) { case 1: sprintf( limbm, "&RYour neck is lightly hurt, and it is %s\n\r", bleedinglev( ch->neck->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 2: sprintf( limbm, "&RYour neck is severely hurt, and it is %s\n\r", bleedinglev( ch->neck->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 3: sprintf( limbm, "&RYour neck is broken!, and it is %s\n\r", bleedinglev( ch->neck->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 4: sprintf( limbm, "&RYour head is missing!, and your neck is %s\n\r", bleedinglev( ch->neck->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; default: break; } switch( ch->eyes->hp ) { case 1: sprintf( limbm, "&ROne of your eyes has been gouged out, and it is %s\n\r", bleedinglev( ch->eyes->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 2: sprintf( limbm, "&RBoth of your eyes have been gouged out!, they are %s\n\r", bleedinglev( ch->eyes->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; default: break; } switch( ch->torso->hp ) { case 1: sprintf( limbm, "&RYour torso is lightly wounded, and it is %s\n\r", bleedinglev( ch->torso->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 2: sprintf( limbm, "&RYour torso is badly wounded, and it is %s\n\r", bleedinglev( ch->torso->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 3: sprintf( limbm, "&RYour torso is severely wounded!, and it is %s\n\r", bleedinglev( ch->torso->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 4: sprintf( limbm, "&RYour bodyis missing halfway through your torso and down!,and it is %s\n\r", bleedintlev( ch->torso->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; default: break; } for ( limb = 1; limb <= 2; limb++ ) { switch( ch->leg[limb]->hp ) { case 1: sprintf( limbm, "&RYour %s foot is missing, and it is %s\n\r", ( limb == 1 ) ? "left" : "right", bleedinglev( ch->leg[limb]->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 2: sprintf( limbm, "&RYour %s leg is missing from the knee down, and it is %s\n\r", (limb == 1 ) ? "left" : "right", bleedinglev( ch->leg[limb]->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 3: sprintf( limbm, "&RYour whole %s leg is missing!, and it is %s\n\r", ( limb == 1 ) ? "left" : "right", bleedinglev( ch->leg[limb]->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; default: break; } } return; } */ /* char *bleedinglev( int blvl ) { switch( blvl ) { case 0: return "not bleeding."; case 1: return "bleeding lightly."; case 2: return "bleeding a lot."; case 3: return "bleeding severely!"; default: return ""; } return ""; } */ /* void do_farsight( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char target_name[MAX_STRING_LENGTH]; ROOM_INDEX_DATA *from_room; if (IS_NPC(ch)) return; if (ch->clan != 7 ) { send_to_char(C_DEFAULT, "Huh?\n\r", ch ); return; } one_argument( argument, target_name ); if ( !( victim = get_char_world( ch, target_name ) ) || IS_SET( victim->in_room->room_flags, ROOM_PRIVATE ) || IS_SET( victim->in_room->room_flags, ROOM_SOLITARY ) || IS_SET( victim->in_room->area->area_flags, AREA_PROTOTYPE ) || IS_AFFECTED( victim, AFF_NOASTRAL ) ) { send_to_char(AT_BLUE, "You failed.\n\r", ch ); return; } from_room = ch->in_room; if ( ch != victim ) { char_from_room( ch ); char_to_room( ch, victim->in_room ); } do_look( ch, "auto" ); if ( ch != victim ) { char_from_room( ch ); char_to_room( ch, from_room ); } return; } */ void do_worth( CHAR_DATA *ch, char *argument ) { if ( IS_NPC( ch ) ) return; if ( ch->level < L_CHAMP3 ) { sprintf( log_buf, "You have scored a total of %dxp, and are %dxp off from your" " next level.\n\r", ch->exp, xp_tolvl( ch ) - ch->exp ); send_to_char( AT_RED, log_buf, ch ); } else { send_to_char( AT_RED, "You perceive that you can level no higher by natural means.\n\r", ch ); } sprintf( log_buf, "Your current stats are:\n\r Str: %d. Wis: %d. Int: %d. Dex: %d. Con: %d. Cha: %d.\n\r", get_curr_str( ch ), get_curr_wis( ch ), get_curr_int( ch ), get_curr_dex( ch ), get_curr_con( ch ), ch->charisma ); send_to_char( AT_RED, log_buf, ch ); #ifdef NEW_MONEY sprintf( log_buf, "You are carrying %d gold, %d silver, and %d copper coins.\n\r", ch->money.gold, ch->money.silver, ch->money.copper ); #else sprintf( log_buf, "You are currently carrying %d credits.\n\r", ch->gold ); #endif send_to_char( AT_RED, log_buf, ch ); return; } /* * Finger routine written by Dman. */ void do_finger( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; char const *class; char const *race; one_argument( argument, arg ); /* if (get_trust(ch) < 215) { send_to_char(C_DEFAULT,"Finger is temporarily disabled.\n\r",ch); return; } */ if ( arg[0] == '\0' ) { send_to_char( AT_WHITE, "Finger whom?\n\r", ch ); return; } if ( !(victim = get_char_world(ch, arg))) { read_finger( ch, argument ); return; } if ( !can_see( ch, victim ) ) { send_to_char( AT_WHITE, "They aren't here.\n\r", ch ); return; } if ( IS_NPC( victim ) ) { send_to_char( AT_WHITE, "Not on NPC's.\n\r", ch ); return; } sprintf( buf, " Finger Info\n\r" ); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, " ------ ----\n\r\n\r" ); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "&CName: &W%-12s\n\r", victim->name); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "&CMud Age: &W%2d &CClan: &W%s\n\r", get_age( victim ), get_clan_index( victim->clan )->name ); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "&CLevel: &W%2d &CSex: &W%s\n\r", victim->level, victim->sex == SEX_MALE ? "male" : victim->sex == SEX_FEMALE ? "female" : "neutral" ); send_to_char( AT_WHITE, buf, ch ); class = class_short( victim ); race = (get_race_data(victim->race))->race_name; sprintf( buf, "&CClass: &W%-10s &CRace: &W%s\n\r", class,race ); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "&CThief: &W%s\n\r", IS_SET( victim->act, PLR_THIEF ) ? "Yes" : "No" ); if ( is_class( victim, CLASS_SPY ) ) send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "&CTitle: &W%s\n\r", victim->pcdata->title ); send_to_char( AT_WHITE, buf, ch ); /* sprintf( buf, "&CEmail: &W%s\n\r", victim->pcdata->email ); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "&CPlan: &W%s.\n\r", victim->pcdata->plan ); send_to_char( AT_WHITE, buf, ch ); */ sprintf( buf, "&CPkills: &W%d &CPkilled: &W%d\n\r", victim->pkills, victim->pkilled ); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "&CArena wins: &W%d &CArena losses: &W%d\n\r", victim->arenawon, victim->arenalost ); send_to_char( AT_WHITE, buf, ch ); sprintf( buf, "&CLast on: &W%s\n\r", (char *) ctime( &ch->logon ) ); send_to_char( AT_WHITE, buf, ch ); return; } void do_email( CHAR_DATA *ch, char *argument ) { CHAR_DATA *rch; char buf [ MAX_STRING_LENGTH ]; rch = get_char( ch ); if ( IS_NPC( ch ) ) return; if (argument[0] == '\0') { sprintf(buf,"Email:%s \n\r", ch->pcdata->email); send_to_char( AT_WHITE, buf, ch ); return; } if ( !IS_NPC( ch ) ) { if ( longstring( ch, argument ) ) return; smash_tilde( argument ); free_string( ch->pcdata->email ); ch->pcdata->email = str_dup( argument ); sprintf(buf,"Email now:%s \n\r",argument); send_to_char(AT_WHITE, buf, ch); } return; } /* void do_plan( CHAR_DATA *ch, char *argument ) { CHAR_DATA *rch; char buf [ MAX_STRING_LENGTH ]; rch = get_char( ch ); if ( IS_NPC( ch ) ) return; if (argument[0] == '\0') { sprintf(buf,"Plan:%s \n\r", ch->pcdata->plan); send_to_char(AT_WHITE, buf, ch); return; } if ( !IS_NPC( ch ) ) { if ( longstring( ch, argument ) ) return; smash_tilde( argument ); free_string( ch->pcdata->plan ); ch->pcdata->plan = str_dup( argument ); sprintf(buf,"Plan now:%s \n\r",argument); send_to_char(AT_WHITE, buf, ch); } return; } */ void do_afkmes( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; if ( !IS_NPC( ch ) ) { if ( argument[0] == '\0' ) { send_to_char( AT_WHITE, "Syntax:\n\r", ch ); send_to_char( AT_YELLOW, "afkmes <string>\n\r", ch ); sprintf( buf, "&YAFK Message: &W%s\n\r", ch->pcdata->afkchar ); send_to_char( AT_WHITE, buf, ch ); return; } if ( longstring( ch, argument ) ) return; smash_tilde( argument ); free_string( ch->pcdata->afkchar ); ch->pcdata->afkchar = str_dup( argument ); sprintf( buf, "&YAFK Message: &W%s\n\r", argument ); send_to_char( AT_WHITE, buf, ch ); } return; } #ifdef NEW_MONEY /* Money functions, for new money format gold/silver/copper --Angi */ MONEY_DATA *add_money( MONEY_DATA *a, MONEY_DATA *b ) { a->gold += b->gold; a->silver += b->silver; a->copper += b->copper; return a; } MONEY_DATA *sub_money( MONEY_DATA *a, MONEY_DATA *b ) { a->gold -= b->gold; a->silver -= b->silver; a->copper -= b->copper; return a; } MONEY_DATA *spend_money( MONEY_DATA *a, MONEY_DATA *b ) { /* a is how much money ch has, and *b is the cost of the item. Char can already afford, check done before, so just subtract. */ int tmp_gold, tmp_silver, tmp_copper; tmp_gold = b->gold; tmp_silver = b->silver; tmp_copper = b->copper; if ( a->gold <= b->gold ) { b->gold -= a->gold; a->gold = 0; } else { a->gold -= b->gold; b->gold = 0; } if ( a->silver <= b->silver ) { b->silver -= a->silver; a->silver = 0; } else { a->silver -= b->silver; b->silver = 0; } if ( a->copper <= b->copper ) { b->copper -= a->copper; a->copper = 0; } else { a->copper -= b->copper; b->copper = 0; } if ( b->gold > 0 ) { if ( a->silver * S_PER_G <= b->gold * C_PER_G ) /* if ( ( a->silver / SILVER_PER_GOLD ) <= b->gold )*/ { b->gold -= ( a->silver / SILVER_PER_GOLD ); a->silver %= SILVER_PER_GOLD; } else { a->silver -= ( b->gold * SILVER_PER_GOLD ); b->gold = 0; } if ( b->gold > 0 ) { if ( a->copper <= b->gold * C_PER_G ) /* if ( ( a->copper / COPPER_PER_GOLD ) <= b->gold ) */ { b->gold -= ( a->copper / COPPER_PER_GOLD ); a->copper %= COPPER_PER_GOLD; } else { a->copper -= ( b->gold * COPPER_PER_GOLD ); b->gold =0; } } } /* if b->gold != 0 now, then bug( etc.. ) */ if ( b->silver > 0 ) { if ( ( a->gold * SILVER_PER_GOLD ) <= b->silver ) { b->silver -= ( a->gold * SILVER_PER_GOLD ); a->gold = 0; } else { a->gold -= ( b->silver / SILVER_PER_GOLD ); b->silver %= SILVER_PER_GOLD; } if ( b->silver > 0 ) { if ( a->copper <= b->silver * S_PER_G ) /* if ( ( a->copper / COPPER_PER_SILVER ) <= b->silver ) */ { b->silver -= ( a->copper / COPPER_PER_SILVER ); a->copper %= COPPER_PER_SILVER; } else { a->copper -= ( b->silver * COPPER_PER_SILVER ); b->silver =0; } } } if ( b->copper > 0 ) { if ( ( a->silver * COPPER_PER_SILVER ) <= b->copper ) { b->copper -= ( a->silver * COPPER_PER_SILVER ); a->silver = 0; } else { a->silver -= ( b->copper / COPPER_PER_SILVER ); b->copper %= COPPER_PER_SILVER; } if ( b->copper > 0 ) { if ( ( a->gold * COPPER_PER_GOLD ) <= b->copper ) { b->copper -= ( a->gold * COPPER_PER_GOLD ); a->gold = 0; } else { a->gold -= ( b->copper / COPPER_PER_GOLD ); b->copper %= COPPER_PER_GOLD; } } } b->gold = tmp_gold; b->silver = tmp_silver; b->copper = tmp_copper; return a; } MONEY_DATA *take_money( CHAR_DATA *ch, int amt, char *type, char *verb ) { static MONEY_DATA new_money; new_money.gold = new_money.silver = new_money.copper = 0; if ( amt <= 0 ) { send_to_char( AT_WHITE, "Sorry, you can't do that.\n\r", ch ); return NULL; } if ( !str_cmp( type, "gold" ) ) { if ( ch->money.gold < amt ) return NULL; else new_money.gold = amt; } else if ( !str_cmp( type, "silver" ) ) { if ( ch->money.silver < amt ) return NULL; else new_money.silver = amt; } else if ( !str_cmp( type, "copper" ) ) { if ( ch->money.copper < amt ) return NULL; else new_money.copper = amt; } else { send_to_char( AT_WHITE, "There is no such kind of coin.\n\r", ch ); return NULL; } sub_money( &ch->money, &new_money ); return &new_money; } char *money_string( MONEY_DATA *money ) { static char buf [ MAX_STRING_LENGTH ]; char *bptr = buf; bool gold; bool silver; bool copper; gold = ( money->gold > 0 ); silver = ( money->silver > 0 ); copper = ( money->copper > 0 ); if ( gold ) { bptr += sprintf( bptr, "%d gold", money->gold ); if ( silver != copper ) { strcpy( bptr, " and " ); bptr += 5; } else if ( silver || copper ) { strcpy ( bptr, ", " ); bptr += 2; } else { strcpy( bptr, " coins." ); bptr += 7; } } if ( silver ) { bptr += sprintf( bptr, "%d silver", money->silver ); if ( copper ) { strcpy( bptr, " and " ); bptr += 5; } else { strcpy( bptr, " coins." ); bptr += 7; } } if ( copper ) bptr += sprintf( bptr, "%d copper coins.", money->copper ); if ( !gold && !silver && !copper ) { bptr += sprintf( bptr, "0 coins." ); } return buf; } #endif //* Kyrian -- Stolen Reflections *// //* Eleven -- Stolen Code! *// void do_immlist( CHAR_DATA *ch, char *argument ) { PLAYERLIST_DATA * player; int level; int col; char buf[MAX_STRING_LENGTH]; char buf1[MAX_STRING_LENGTH]; char *lvl213; char *lvl212; char *lvl211; char *lvl210; char *lvl209; char *lvl208; char *lvl207; char *lvl206; lvl213 = str_dup(" &z[213 - Im&Op&zleme&On&ztors]\n\r&W"); lvl212 = str_dup(" &z[212 - &OC&zouncil]\n\r&W"); lvl211 = str_dup(" &z[211 - Guardia&On&zs]\n\r&W"); lvl210 = str_dup(" &z[210 - A&Od&zvanced Builde&Or&zs]\n\r&W"); lvl209 = str_dup(" &z[209 - Inter&Om&zediat&Oe &zBu&Oi&zlders]\n\r&W"); lvl208 = str_dup(" &z[208 - No&Ov&zice Bui&Old&zers]\n\r&W"); lvl207 = str_dup(" &z[207 - &OB&zuil&Od&zer Tr&Oa&zin&Oe&zes]\n\r&W"); lvl206 = str_dup(" &z[206 - W&Oa&zrlo&Or&zds]\n\r&W"); send_to_char(C_DEFAULT,"&zThe L&Oe&zaders of &OR&zo&OE\n\r",ch); for ( level = MAX_LEVEL; level > LEVEL_MORTAL; level-- ) { buf1[0] = '\0'; // sprintf(buf,"&R\n\r=====================================[%d]=====================================\n\r&W",level); if ( level == 206) sprintf(buf,"\n\r%s",lvl206); else if ( level == 207) sprintf(buf,"\n\r%s",lvl207); else if ( level == 208) sprintf(buf,"\n\r%s",lvl208); else if ( level == 209) sprintf(buf,"\n\r%s",lvl209); else if ( level == 210) sprintf(buf,"\n\r%s",lvl210); else if ( level == 211) sprintf(buf,"\n\r%s",lvl211); else if ( level == 212) sprintf(buf,"\n\r%s",lvl212); else sprintf(buf,"\n\r%s",lvl213); strcat( buf1, buf ); col = 0; for ( player = playerlist; player; player = player->next ) { if ( player->level == level ) { sprintf( buf, "%-19s", player->name ); strcat( buf1, buf ); if ( ++col % 2 == 0 ) strcat( buf1, "\n\r" ); } } if ( col % 2 != 0 ) strcat( buf1, "\n\r" ); if ( col != 0 ) send_to_char( C_DEFAULT, buf1 , ch ); } } void do_champlist( CHAR_DATA *ch, char *argument ) { PLAYERLIST_DATA * player; int level; int col; char buf[MAX_STRING_LENGTH]; char buf1[MAX_STRING_LENGTH]; send_to_char( AT_BLUE, "\n\rChampions\n\r", ch ); for ( level = LEVEL_MORTAL; level >= LEVEL_HERO; level-- ) { buf1[0] = '\0'; sprintf(buf,"&c\n\r=====================================&C[%d]&c=====================================\n\r&W",level); strcat( buf1, buf ); col = 0; for ( player = playerlist; player; player = player->next ) { if ( player->level == level ) { sprintf( buf, "%-19s", player->name ); strcat( buf1, buf ); if ( ++col % 4 == 0 ) strcat( buf1, "\n\r" ); } } if ( col % 4 != 0 ) strcat( buf1, "\n\r" ); if ( col != 0 ) send_to_char( C_DEFAULT, buf1 , ch ); } } void do_playerlist( CHAR_DATA *ch, char *argument ) { PLAYERLIST_DATA * player; int level; int col; int counter = 0; char buf[MAX_STRING_LENGTH]; char buf1[MAX_STRING_LENGTH]; send_to_char( C_DEFAULT, "&B\n\rTHE STORM\n\r", ch ); for ( level = MAX_LEVEL; level; level-- ) { buf1[0] = '\0'; sprintf(buf,"&R\n\r=====================================[%3d]=====================================\n\r&W",level); strcat( buf1, buf ); col = 0; for ( player = playerlist; player; player = player->next ) { if ( player->level == level ) { counter++; sprintf( buf, "%-19s", player->name ); strcat( buf1, buf ); if ( ++col % 4 == 0 ) strcat( buf1, "\n\r" ); } } if ( col % 4 != 0 ) strcat( buf1, "\n\r" ); if ( col != 0 ) send_to_char( C_DEFAULT, buf1 , ch ); } sprintf(buf, "\n\r&WTOTAL: &R%d\n\r", counter); send_to_char(AT_GREEN, buf, ch); } void do_class( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; char arg1 [ MAX_INPUT_LENGTH ]; char arg2 [ MAX_INPUT_LENGTH ]; int iclass; int value = -1; bool canchange = TRUE; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( arg1[0] == '\0' ) { send_to_char(C_DEFAULT, "Syntax: class prerequisite\n\r", ch ); send_to_char(C_DEFAULT, " class change <class>\n\r", ch ); send_to_char(C_DEFAULT, "The cost to change class is 100 prac.\n\r", ch ); return; } if ( !str_cmp( arg1, "prerequisite" ) ) { send_to_char( C_DEFAULT, "Class: Opr Mdc Rog Sdr Wth Agt Pil Hck Tch Vam\n\r", ch ); for ( iclass = 0; iclass < MAX_CLASS; iclass++ ) { sprintf( buf, "%10s %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d\n\r", class_table[iclass].who_long, class_table[iclass].prereq[0], class_table[iclass].prereq[1], class_table[iclass].prereq[2], class_table[iclass].prereq[3], class_table[iclass].prereq[4], class_table[iclass].prereq[5], class_table[iclass].prereq[6], class_table[iclass].prereq[7], class_table[iclass].prereq[8], class_table[iclass].prereq[9] ); send_to_char( C_DEFAULT, buf, ch ); } return; } if ( !str_cmp( arg1, "change" )) { for ( iclass = 0; iclass < MAX_CLASS; iclass++ ) { if ( !str_prefix( arg2, class_table[iclass].who_long ) || !str_cmp( arg2, class_table[iclass].who_name ) ) { value = iclass; break; } } if ( value == -1 || value > MAX_CLASS || arg2[0] == '\0') { send_to_char(AT_WHITE, "Invalid class, valid classes are:\n\r", ch ); for ( iclass = 0; iclass < MAX_CLASS; iclass++ ) { sprintf( buf, "%s\n\r", class_table[iclass].who_long ); send_to_char( AT_WHITE, buf, ch ); } return; } /* if ( value != -1 && !class_table[value].races[ch->race] ) { sprintf( buf, "Your race (%s) does not allow class %s.\n\r", (get_race_data(ch->race))->race_full, class_table[value].who_long ); send_to_char( AT_WHITE, buf, ch ); return; } */ if ( value != -1 && is_class( ch, value ) ) { sprintf ( buf, "You are already a %s.", class_table[value].who_long ); send_to_char( AT_WHITE, buf, ch ); return; } if ( ch->practice < 100 ) { send_to_char( C_DEFAULT, "You do not have 100 practices.\n\r", ch ); return; } for ( iclass = 0; iclass < MAX_CLASS; iclass++ ) { if ( ch->class_level[iclass] < class_table[value].prereq[iclass] ) { canchange = FALSE; break; } } if ( canchange == FALSE ) { send_to_char(C_DEFAULT, "You do not meet the requirements of this class.\n\r", ch ); send_to_char(C_DEFAULT, "Type class prerequisite.\n\r", ch ); return; } ch->class[0] = value; ch->practice = ch->practice - 100; send_to_char(AT_WHITE, "Ok.\n\r", ch ); return; } return; }