/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * ROM 2.4 is copyright 1993-1995 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@pacinfo.com) * * Gabrielle Taylor (gtaylor@pacinfo.com) * * Brian Moore (rom@rom.efn.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * ***************************************************************************/ /*************************************************************************** * ROT 1.4 is copyright 1996-1997 by Russ Walsh * * By using this code, you have agreed to follow the terms of the * * ROT license, in the file doc/rot.license * ***************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #include <sys/time.h> #endif #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #include "merc.h" #include "magic.h" #include "recycle.h" #include "tables.h" #include "lookup.h" #include "db.h" char *const where_name[] = { "{R<{yused as light {R:{x", "{R<{yworn on finger {R:{x", "{R<{yworn on finger {R:{x", "{R<{yworn around neck {R:{x", "{R<{yworn around neck {R:{x", "{R<{yworn on torso {R:{x", "{R<{yworn on head {R:{x", "{R<{yworn on legs {R:{x", "{R<{yworn on feet {R:{x", "{R<{yworn on hands {R:{x", "{R<{yworn on arms {R:{x", "{R<{yworn as shield {R:{x", "{R<{yworn about body {R:{x", "{R<{yworn about waist {R:{x", "{R<{yworn around wrist {R:{x", "{R<{yworn around wrist {R:{x", "{R<{yprimary wield {R:{x", "{R<{yheld {R:{x", "{R<{yfloating nearby {R:{x", "{R<{ysecondary wield {R:{x", "{R<{yworn on face {R:{x", "{R<{yworn on the ankle {R:{x", "{R<{yworn on the ankle {R:{x", "{R<{yworn as tattoo {R:{x", "{R<{yworn as aura {R:{x", "{R<{yworn on left ear {R:{x", "{R<{yworn on right ear {R:{x", "{R<{yworn as clan tattoo {R:{x" }; sh_int const where_order[] = { /* 1, 2, 3, 4, 5, 25, 26, 6, 20, 7, 8, 9, 21, 22, 10, 11, 23, 12, 13, 14, 15, 16, 19, 17, 18, 24, 0*/ 6, 25, 26, 20, 3, 4, 10, 14, 15, 9, 1, 2, 16, 19, 11, 17, 0, 5, 12, 13, 7, 21, 22, 8, 18, 24, 23, 27 }; /* for do_count */ int max_on = 0; bool is_pm = FALSE; char *format_obj_to_char ( OBJ_DATA * obj, CHAR_DATA * ch, bool fShort ) { static char buf[MAX_STRING_LENGTH]; buf[0] = '\0'; if ( ( fShort && ( obj->short_descr == NULL || obj->short_descr[0] == '\0' ) ) || ( obj->description == NULL || obj->description[0] == '\0' ) ) return buf; if ( !IS_SET ( ch->comm, COMM_LONG ) ) { strcat ( buf, "{x[{y.{R.{B.{M.{Y.{W.{G.{x]" ); if ( IS_OBJ_STAT ( obj, ITEM_INVIS ) ) buf[5] = 'V'; if ( IS_AFFECTED ( ch, AFF_DETECT_EVIL ) && IS_OBJ_STAT ( obj, ITEM_EVIL ) ) buf[8] = 'E'; if ( IS_AFFECTED ( ch, AFF_DETECT_GOOD ) && IS_OBJ_STAT ( obj, ITEM_BLESS ) ) buf[11] = 'B'; if ( IS_AFFECTED ( ch, AFF_DETECT_MAGIC ) && IS_OBJ_STAT ( obj, ITEM_MAGIC ) ) buf[14] = 'M'; if ( IS_OBJ_STAT ( obj, ITEM_GLOW ) ) buf[17] = 'G'; if ( IS_OBJ_STAT ( obj, ITEM_HUM ) ) buf[20] = 'H'; if ( IS_OBJ_STAT ( obj, ITEM_QUEST ) ) buf[23] = 'Q'; if ( !str_cmp ( buf, "{x[{y.{R.{B.{M.{Y.{W.{G.{x]" ) ) buf[0] = '\0'; } else { if ( IS_OBJ_STAT ( obj, ITEM_INVIS ) ) strcat ( buf, "({yInvis{x)" ); if ( IS_OBJ_STAT ( obj, ITEM_DARK ) ) strcat ( buf, "({DHidden{x)" ); if ( IS_AFFECTED ( ch, AFF_DETECT_EVIL ) && IS_OBJ_STAT ( obj, ITEM_EVIL ) ) strcat ( buf, "({RRed Aura{x)" ); if ( IS_AFFECTED ( ch, AFF_DETECT_GOOD ) && IS_OBJ_STAT ( obj, ITEM_BLESS ) ) strcat ( buf, "({BBlue Aura{x)" ); if ( IS_AFFECTED ( ch, AFF_DETECT_MAGIC ) && IS_OBJ_STAT ( obj, ITEM_MAGIC ) ) strcat ( buf, "({yMagical{x)" ); if ( IS_OBJ_STAT ( obj, ITEM_GLOW ) ) strcat ( buf, "({YGlowing{x)" ); if ( IS_OBJ_STAT ( obj, ITEM_HUM ) ) strcat ( buf, "({yHumming{x)" ); if ( IS_OBJ_STAT ( obj, ITEM_QUEST ) ) strcat ( buf, "({GQuest{x)" ); if ( !IS_NPC ( ch ) && ( ch->pcdata->questobj > 0 ) && ( obj->pIndexData->vnum == ch->pcdata->questobj ) ) strcat ( buf, "{W[{RT{rARGE{RT{W]{x" ); } if ( buf[0] != '\0' ) { strcat ( buf, " " ); } if ( fShort ) { if ( obj->short_descr != NULL ) strcat ( buf, obj->short_descr ); } else { if ( obj->description != NULL ) strcat ( buf, obj->description ); } if ( strlen ( buf ) <= 0 ) strcat ( buf, "This object has no description. Please inform the IMP." ); return buf; } /* * Show a list to a character. * Can coalesce duplicated items. */ BUFFER *show_list_to_char ( OBJ_DATA * list, CHAR_DATA * ch, bool fShort, bool fShowNothing ) { char buf[MAX_STRING_LENGTH]; BUFFER *output; char **prgpstrShow; int *prgnShow; char *pstrShow; OBJ_DATA *obj; int nShow; int iShow; int count; bool fCombine; /* * Alloc space for output lines. */ output = new_buf ( ); count = 0; for ( obj = list; obj != NULL; obj = obj->next_content ) count++; prgpstrShow = alloc_mem ( count * sizeof ( char * ) ); prgnShow = alloc_mem ( count * sizeof ( int ) ); nShow = 0; /* * Format the list of objects. */ for ( obj = list; obj != NULL; obj = obj->next_content ) { if ( obj->wear_loc == WEAR_NONE && can_see_obj ( ch, obj ) ) { pstrShow = format_obj_to_char ( obj, ch, fShort ); fCombine = FALSE; if ( IS_NPC ( ch ) || IS_SET ( ch->comm, COMM_COMBINE ) ) { /* * Look for duplicates, case sensitive. * Matches tend to be near end so run loop backwords. */ for ( iShow = nShow - 1; iShow >= 0; iShow-- ) { if ( !str_cmp ( prgpstrShow[iShow], pstrShow ) ) { prgnShow[iShow]++; fCombine = TRUE; break; } } } /* * Couldn't combine, or didn't want to. */ if ( !fCombine ) { prgpstrShow[nShow] = str_dup ( pstrShow ); prgnShow[nShow] = 1; nShow++; } } } /* * Output the formatted list. */ for ( iShow = 0; iShow < nShow; iShow++ ) { if ( prgpstrShow[iShow][0] == '\0' ) { free_string ( prgpstrShow[iShow] ); continue; } if ( IS_NPC ( ch ) || IS_SET ( ch->comm, COMM_COMBINE ) ) { if ( prgnShow[iShow] != 1 ) { sprintf ( buf, "(%2d) ", prgnShow[iShow] ); add_buf ( output, buf ); } else { add_buf ( output, " " ); } } add_buf ( output, prgpstrShow[iShow] ); add_buf ( output, "\n\r" ); free_string ( prgpstrShow[iShow] ); } if ( fShowNothing && nShow == 0 ) { if ( IS_NPC ( ch ) || IS_SET ( ch->comm, COMM_COMBINE ) ) send_to_char ( " ", ch ); send_to_char ( "Nothing.\n\r", ch ); } /* * Clean up. */ free_mem ( prgpstrShow, count * sizeof ( char * ) ); free_mem ( prgnShow, count * sizeof ( int ) ); return output; } void show_char_to_char_0 ( CHAR_DATA * victim, CHAR_DATA * ch ) { char buf[MAX_STRING_LENGTH], message[MAX_STRING_LENGTH]; int vict_condition; buf[0] = '\0'; if ( victim->max_hit > 0 ) vict_condition = victim->hit * 100 / victim->max_hit; else vict_condition = -1; if ( !IS_SET ( ch->comm, COMM_LONG ) ) { strcat ( buf, "{x[{y.{D.{c.{b.{w.{C.{r.{B.{g.{m.{R.{Y.{W.{G.{x]" ); if ( IS_SHIELDED ( victim, SHD_INVISIBLE ) ) buf[5] = 'V'; if ( IS_AFFECTED ( victim, AFF_HIDE ) || IS_AFFECTED ( victim, AFF_SNEAK ) ) buf[8] = 'H'; if ( IS_AFFECTED ( victim, AFF_CHARM ) ) buf[11] = 'C'; if ( IS_AFFECTED ( victim, AFF_PASS_DOOR ) ) buf[14] = 'T'; if ( IS_AFFECTED ( victim, AFF_FAERIE_FIRE ) ) buf[17] = 'P'; if ( IS_SHIELDED ( victim, SHD_ICE ) ) buf[20] = 'I'; if ( IS_SHIELDED ( victim, SHD_FIRE ) ) buf[23] = 'F'; if ( IS_SHIELDED ( victim, SHD_SHOCK ) ) buf[26] = 'L'; if ( IS_SHIELDED ( victim, SHD_ACID ) ) buf[29] = 'A'; if ( IS_SHIELDED ( victim, SHD_POISON ) ) buf[32] = 'P'; if ( IS_EVIL ( victim ) && IS_AFFECTED ( ch, AFF_DETECT_EVIL ) ) buf[35] = 'E'; if ( IS_GOOD ( victim ) && IS_AFFECTED ( ch, AFF_DETECT_GOOD ) ) buf[38] = 'G'; if ( IS_SHIELDED ( victim, SHD_SANCTUARY ) ) buf[41] = 'S'; if ( victim->on_quest ) buf[44] = 'Q'; if ( !str_cmp ( buf, "{x[{y.{D.{c.{b.{w.{C.{r.{B.{R.{Y.{W.{G.{x]" ) ) buf[0] = '\0'; if ( IS_SET ( victim->comm, COMM_AFK ) ) strcat ( buf, "[{yAFK{x]" ); if ( victim->invis_level >= LEVEL_ANCIENT ) strcat ( buf, "({WWizi{x)" ); if ( vict_condition < 33 ) strcat ( buf, "{R(Wounded){x " ); if ( !IS_NPC ( victim ) && !victim->desc ) strcat ( buf, "{G({cLinkdead{G){x" ); if ( !IS_NPC ( ch ) && IS_NPC ( victim ) && ( ch->pcdata->questmob > 0 ) && ( victim->pIndexData->vnum == ch->pcdata->questmob ) ) strcat ( buf, "{W[{RT{rARGE{RT{x{W]{x" ); } else { if ( IS_SET ( victim->comm, COMM_AFK ) ) strcat ( buf, "[{yAFK{x]" ); if ( IS_SHIELDED ( victim, SHD_INVISIBLE ) ) strcat ( buf, "({yInvis{x)" ); if ( victim->invis_level >= LEVEL_ANCIENT ) strcat ( buf, "({WWizi{x)" ); if ( IS_AFFECTED ( victim, AFF_HIDE ) ) strcat ( buf, "({DHide{x)" ); if ( IS_AFFECTED ( victim, AFF_CHARM ) ) strcat ( buf, "({cCharmed{x)" ); if ( IS_AFFECTED ( victim, AFF_PASS_DOOR ) ) strcat ( buf, "({bTranslucent{x)" ); if ( IS_AFFECTED ( victim, AFF_FAERIE_FIRE ) ) strcat ( buf, "({wPink Aura{x)" ); if ( IS_SHIELDED ( victim, SHD_ICE ) ) strcat ( buf, "({CI{DS{x)" ); if ( IS_SHIELDED ( victim, SHD_FIRE ) ) strcat ( buf, "({rF{DS{x)" ); if ( IS_SHIELDED ( victim, SHD_SHOCK ) ) strcat ( buf, "({BS{DS{x)" ); if ( IS_SHIELDED ( victim, SHD_ACID ) ) strcat ( buf, "({GA{DS{x)" ); if ( IS_SHIELDED ( victim, SHD_POISON ) ) strcat ( buf, "({MP{DS{x)" ); if ( IS_SHIELDED ( victim, SHD_BRIAR ) ) strcat ( buf, "({gT{DS{x)" ); if ( IS_EVIL ( victim ) && IS_AFFECTED ( ch, AFF_DETECT_EVIL ) ) strcat ( buf, "({RRed Aura{x)" ); if ( IS_GOOD ( victim ) && IS_AFFECTED ( ch, AFF_DETECT_GOOD ) ) strcat ( buf, "({YGolden Aura{x)" ); if ( IS_SHIELDED ( victim, SHD_SANCTUARY ) ) strcat ( buf, "({WWhite Aura{x)" ); if ( victim->on_quest ) strcat ( buf, "({GQuest{x)" ); if ( vict_condition < 33 ) strcat ( buf, "{R(Wounded){x " ); if ( !IS_NPC ( victim ) && !victim->desc ) strcat ( buf, "{G({cLinkdead{G){x" ); if ( !IS_NPC ( ch ) && IS_NPC ( victim ) && ( ch->pcdata->questmob > 0 ) && ( victim->pIndexData->vnum == ch->pcdata->questmob ) ) strcat ( buf, "{W[{RT{rARGE{RT{x{W]{x" ); if ( IS_SHIELDED ( victim, SHD_WARD ) ) strcat ( buf, "({WWard{x)" ); } if ( !IS_NPC ( victim ) && IS_SET ( victim->act, PLR_TWIT ) ) strcat ( buf, "({rTWIT{x)" ); // make sure victim is an NPC - M. /* if (!IS_NPC(ch) && is_gqmob(ch, victim->pIndexData->vnum) != -1) { strcat(buf, "(Gquest) "); } */ if ( buf[0] != '\0' ) { strcat ( buf, " " ); } if ( victim->position == victim->start_pos && victim->long_descr[0] != '\0' ) { strcat ( buf, victim->long_descr ); send_to_char ( buf, ch ); return; } strcat ( buf, PERS ( victim, ch ) ); if ( !IS_NPC ( victim ) && !IS_SET ( ch->comm, COMM_BRIEF ) && victim->position == POS_STANDING && ch->on == NULL ) 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: if ( victim->on != NULL ) { if ( IS_SET ( victim->on->value[2], SLEEP_AT ) ) { sprintf ( message, " is sleeping at %s.", victim->on->short_descr ); strcat ( buf, message ); } else if ( IS_SET ( victim->on->value[2], SLEEP_ON ) ) { sprintf ( message, " is sleeping on %s.", victim->on->short_descr ); strcat ( buf, message ); } else { sprintf ( message, " is sleeping in %s.", victim->on->short_descr ); strcat ( buf, message ); } } else strcat ( buf, " is sleeping here." ); break; case POS_RESTING: if ( victim->on != NULL ) { if ( IS_SET ( victim->on->value[2], REST_AT ) ) { sprintf ( message, " is resting at %s.", victim->on->short_descr ); strcat ( buf, message ); } else if ( IS_SET ( victim->on->value[2], REST_ON ) ) { sprintf ( message, " is resting on %s.", victim->on->short_descr ); strcat ( buf, message ); } else { sprintf ( message, " is resting in %s.", victim->on->short_descr ); strcat ( buf, message ); } } else strcat ( buf, " is resting here." ); break; case POS_SITTING: if ( victim->on != NULL ) { if ( IS_SET ( victim->on->value[2], SIT_AT ) ) { sprintf ( message, " is sitting at %s.", victim->on->short_descr ); strcat ( buf, message ); } else if ( IS_SET ( victim->on->value[2], SIT_ON ) ) { sprintf ( message, " is sitting on %s.", victim->on->short_descr ); strcat ( buf, message ); } else { sprintf ( message, " is sitting in %s.", victim->on->short_descr ); strcat ( buf, message ); } } else strcat ( buf, " is sitting here." ); break; case POS_STANDING: if ( victim->on != NULL ) { if ( IS_SET ( victim->on->value[2], STAND_AT ) ) { sprintf ( message, " is standing at %s.", victim->on->short_descr ); strcat ( buf, message ); } else if ( IS_SET ( victim->on->value[2], STAND_ON ) ) { sprintf ( message, " is standing on %s.", victim->on->short_descr ); strcat ( buf, message ); } else { sprintf ( message, " is standing in %s.", victim->on->short_descr ); strcat ( buf, message ); } } else strcat ( buf, " is here." ); break; case POS_FIGHTING: strcat ( buf, " is here, fighting " ); if ( victim->fighting == NULL ) 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 ( buf, ch ); return; } void show_char_to_char_1 ( CHAR_DATA * victim, CHAR_DATA * ch ) { char buf[MAX_STRING_LENGTH]; OBJ_DATA *obj; BUFFER *output; BUFFER *outlist; int iWear; int oWear; int percent; bool found; if ( can_see ( victim, ch ) && get_trust ( victim ) >= ch->ghost_level ) { if ( ch == victim ) act ( "$n looks at $mself.", ch, NULL, NULL, TO_ROOM ); else { act ( "$n looks at you.", ch, NULL, victim, TO_VICT ); act ( "$n looks at $N.", ch, NULL, victim, TO_NOTVICT ); } } output = new_buf ( ); if ( victim->description[0] != '\0' ) { sprintf ( buf, "{C%s{x", victim->description ); } else { sprintf ( buf, "{CYou see nothing special about %s{x\n\r", victim->name ); } add_buf ( output, buf ); if ( victim->max_hit > 0 ) percent = ( 100 * victim->hit ) / victim->max_hit; else percent = -1; buf[0] = '\0'; strcpy ( buf, PERS ( victim, ch ) ); if ( percent >= 100 ) strcat ( buf, " {fis in excellent condition.{x\n\r" ); else if ( percent >= 90 ) strcat ( buf, " {fhas a few scratches.{x\n\r" ); else if ( percent >= 75 ) strcat ( buf, " {fhas some small wounds and bruises.{x\n\r" ); else if ( percent >= 50 ) strcat ( buf, " {fhas quite a few wounds.{x\n\r" ); else if ( percent >= 30 ) strcat ( buf, " {fhas some big nasty wounds and scratches.{x\n\r" ); else if ( percent >= 15 ) strcat ( buf, " {flooks pretty hurt.{x\n\r" ); else if ( percent >= 0 ) strcat ( buf, " {fis in awful condition.{x\n\r" ); else strcat ( buf, " {fis bleeding to death.{x\n\r" ); buf[0] = UPPER ( buf[0] ); add_buf ( output, buf ); if ( IS_SHIELDED ( victim, SHD_ICE ) ) { sprintf ( buf, "%s is surrounded by an {Cicy{x shield.\n\r", PERS ( victim, ch ) ); buf[0] = UPPER ( buf[0] ); add_buf ( output, buf ); } if ( IS_SHIELDED ( victim, SHD_FIRE ) ) { sprintf ( buf, "%s is surrounded by a {Rfiery{x shield.\n\r", PERS ( victim, ch ) ); buf[0] = UPPER ( buf[0] ); add_buf ( output, buf ); } if ( IS_SHIELDED ( victim, SHD_SHOCK ) ) { sprintf ( buf, "%s is surrounded by a {Bcrackling{x shield.\n\r", PERS ( victim, ch ) ); buf[0] = UPPER ( buf[0] ); add_buf ( output, buf ); } if ( IS_SHIELDED ( victim, SHD_ACID ) ) { sprintf ( buf, "%s is surrounded by a {GA{gcidic{x shield.\n\r", PERS ( victim, ch ) ); buf[0] = UPPER ( buf[0] ); add_buf ( output, buf ); } if ( IS_SHIELDED ( victim, SHD_POISON ) ) { sprintf ( buf, "%s is surrounded by a {MP{moisonous{x shield.\n\r", PERS ( victim, ch ) ); buf[0] = UPPER ( buf[0] ); add_buf ( output, buf ); } if ( IS_SHIELDED ( victim, SHD_BRIAR ) ) { sprintf ( buf, "%s is surrounded by a {gt{yh{go{yr{gn{yy shield.\n\r", PERS ( victim, ch ) ); buf[0] = UPPER ( buf[0] ); add_buf ( output, buf ); } found = FALSE; for ( oWear = 0; oWear < MAX_WEAR; oWear++ ) { iWear = where_order[oWear]; if ( ( obj = get_eq_char ( victim, iWear ) ) != NULL && can_see_obj ( ch, obj ) ) { if ( !found ) { sprintf ( buf, "\n\r" ); add_buf ( output, buf ); sprintf ( buf, "{G%s is using:{x\n\r", victim->name ); add_buf ( output, buf ); found = TRUE; } sprintf ( buf, "%s%s\n\r", where_name[iWear], format_obj_to_char ( obj, ch, TRUE ) ); add_buf ( output, buf ); } } if ( victim != ch && !IS_NPC ( ch ) && number_percent ( ) < get_skill ( ch, gsn_peek ) && IS_SET ( ch->act, PLR_AUTOPEEK ) ) { sprintf ( buf, "\n\r{GYou peek at the inventory:{x\n\r" ); add_buf ( output, buf ); check_improve ( ch, gsn_peek, TRUE, 4 ); outlist = show_list_to_char ( victim->carrying, ch, TRUE, TRUE ); add_buf ( output, buf_string ( outlist ) ); free_buf ( outlist ); } page_to_char ( buf_string ( output ), ch ); free_buf ( output ); return; } void show_char_to_char ( CHAR_DATA * list, CHAR_DATA * ch ) { CHAR_DATA *rch; for ( rch = list; rch != NULL; rch = rch->next_in_room ) { if ( rch == ch ) continue; if ( get_trust ( ch ) < rch->invis_level ) continue; if ( get_trust ( ch ) < rch->ghost_level ) 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 ( "You see {Rglowing red{x eyes watching YOU!\n\r", ch ); } } return; } CH_CMD ( do_peek ) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; BUFFER *output; BUFFER *outlist; CHAR_DATA *victim; one_argument ( argument, arg ); if ( IS_NPC ( ch ) ) return; if ( arg[0] == '\0' ) { send_to_char ( "Peek at who?\n\r", ch ); return; } if ( ( victim = get_char_room ( ch, arg ) ) == NULL ) { send_to_char ( "They aren't here.\n\r", ch ); return; } if ( victim == ch ) { do_inventory ( ch, "" ); return; } if ( can_see ( victim, ch ) && get_trust ( victim ) >= ch->ghost_level ) { act ( "$n peers intently at you.", ch, NULL, victim, TO_VICT ); act ( "$n peers intently at $N.", ch, NULL, victim, TO_NOTVICT ); } output = new_buf ( ); if ( number_percent ( ) < get_skill ( ch, gsn_peek ) ) { sprintf ( buf, "\n\r{GYou peek at the inventory:{x\n\r" ); add_buf ( output, buf ); check_improve ( ch, gsn_peek, TRUE, 4 ); outlist = show_list_to_char ( victim->carrying, ch, TRUE, TRUE ); add_buf ( output, buf_string ( outlist ) ); free_buf ( outlist ); } else { sprintf ( buf, "{RYou fail to see anything.{x\n\r" ); add_buf ( output, buf ); check_improve ( ch, gsn_peek, FALSE, 2 ); } page_to_char ( buf_string ( output ), ch ); free_buf ( output ); 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 ) ) { send_to_char ( "You can't see a thing!\n\r", ch ); return FALSE; } return TRUE; } /* changes your scroll */ CH_CMD ( do_scroll ) { char arg[MAX_INPUT_LENGTH]; char buf[100]; int lines; one_argument ( argument, arg ); if ( arg[0] == '\0' ) { if ( ch->lines == 0 ) send_to_char ( "You do not page long messages.\n\r", ch ); else { sprintf ( buf, "You currently display %d lines per page.\n\r", ch->lines + 2 ); send_to_char ( buf, ch ); } return; } if ( !is_number ( arg ) ) { send_to_char ( "You must provide a number.\n\r", ch ); return; } lines = atoi ( arg ); if ( lines == 0 ) { send_to_char ( "Paging disabled.\n\r", ch ); ch->lines = 0; return; } if ( lines < 10 || lines > 100 ) { send_to_char ( "You must provide a reasonable number.\n\r", ch ); return; } sprintf ( buf, "Scroll set to %d lines.\n\r", lines ); send_to_char ( buf, ch ); ch->lines = lines - 2; } /* RT does socials */ CH_CMD ( do_socials ) { char buf[MAX_STRING_LENGTH]; int iSocial; int col; col = 0; for ( iSocial = 0; social_table[iSocial].name[0] != '\0'; iSocial++ ) { sprintf ( buf, "%-12s", social_table[iSocial].name ); send_to_char ( buf, ch ); if ( ++col % 6 == 0 ) send_to_char ( "\n\r", ch ); } if ( col % 6 != 0 ) send_to_char ( "\n\r", ch ); return; } /* RT Commands to replace news, motd, imotd, etc from ROM */ CH_CMD ( do_motd ) { do_help ( ch, "motd" ); } CH_CMD ( do_imotd ) { do_help ( ch, "imotd" ); } CH_CMD ( do_rules ) { do_help ( ch, "rules" ); } CH_CMD ( do_story ) { do_help ( ch, "story" ); } /* RT this following section holds all the auto commands from ROM, as well as replacements for config */ CH_CMD ( do_autolist ) { /* lists most player flags */ if ( IS_NPC ( ch ) ) return; send_to_char ( " {cOption {YS{Dtatus\n\r", ch ); send_to_char ( "{B=={b--{B=={b--{B=={b--{B=={b--{B=={b--{B=={x\n\r", ch ); send_to_char ( "{cautoassist{x: ", ch ); if ( IS_SET ( ch->act, PLR_AUTOASSIST ) ) send_to_char ( "{YON{x\n\r", ch ); else send_to_char ( "{DOFF{x\n\r", ch ); send_to_char ( "{cautoexit{x: ", ch ); if ( IS_SET ( ch->act, PLR_AUTOEXIT ) ) send_to_char ( "{YON{x\n\r", ch ); else send_to_char ( "{DOFF{x\n\r", ch ); send_to_char ( "{cautogold{x: ", ch ); if ( IS_SET ( ch->act, PLR_AUTOGOLD ) ) send_to_char ( "{YON{x\n\r", ch ); else send_to_char ( "{DOFF{x\n\r", ch ); send_to_char ( "{cautoloot{x: ", ch ); if ( IS_SET ( ch->act, PLR_AUTOLOOT ) ) send_to_char ( "{YON{x\n\r", ch ); else send_to_char ( "{DOFF{x\n\r", ch ); send_to_char ( "{cautosac{x: ", ch ); if ( IS_SET ( ch->act, PLR_AUTOSAC ) ) send_to_char ( "{YON{x\n\r", ch ); else send_to_char ( "{DOFF{x\n\r", ch ); send_to_char ( "{cautosplit{x: ", ch ); if ( IS_SET ( ch->act, PLR_AUTOSPLIT ) ) send_to_char ( "{YON{x\n\r", ch ); else send_to_char ( "{DOFF{x\n\r", ch ); send_to_char ( "{cautopeek{x: ", ch ); if ( IS_SET ( ch->act, PLR_AUTOPEEK ) ) send_to_char ( "{YON{x\n\r", ch ); else send_to_char ( "{DOFF{x\n\r", ch ); send_to_char ( "{cautostore{x: ", ch ); if ( IS_SET ( ch->comm, COMM_STORE ) ) send_to_char ( "{YON{x\n\r", ch ); else send_to_char ( "{DOFF{x\n\r", ch ); send_to_char ( "{ccompact mode{x: ", ch ); if ( IS_SET ( ch->comm, COMM_COMPACT ) ) send_to_char ( "{YON{x\n\r", ch ); else send_to_char ( "{DOFF{x\n\r", ch ); send_to_char ( "{cprompt{x: ", ch ); if ( IS_SET ( ch->comm, COMM_PROMPT ) ) send_to_char ( "{YON{x\n\r", ch ); else send_to_char ( "{DOFF{x\n\r", ch ); send_to_char ( "{ccombine items{x: ", ch ); if ( IS_SET ( ch->comm, COMM_COMBINE ) ) send_to_char ( "{YON{x\n\r", ch ); else send_to_char ( "{DOFF{x\n\r", ch ); send_to_char ( "{clong flags{x: ", ch ); if ( IS_SET ( ch->comm, COMM_LONG ) ) send_to_char ( "{YON{x\n\r", ch ); else send_to_char ( "{DOFF{x\n\r", ch ); if ( !IS_SET ( ch->act, PLR_CANLOOT ) ) send_to_char ( "{cCorpse{x:{Y No Loot{x\n\r", ch ); else send_to_char ( "{cCorpse{x: {D Loot{x\n\r", ch ); if ( IS_SET ( ch->act, PLR_NOSUMMON ) ) send_to_char ( "{cSummonable{x: {D No{x\n\r", ch ); else send_to_char ( "{cSummonable{x: {Y Yes\n\r", ch ); if ( IS_SET ( ch->act, PLR_NOFOLLOW ) ) send_to_char ( "{cFollowers{x: {D No\n\r", ch ); else send_to_char ( "{cFollowers{x: {Y Yes{x\n\r", ch ); } CH_CMD ( do_autoassist ) { if ( IS_NPC ( ch ) ) return; if ( IS_SET ( ch->act, PLR_AUTOASSIST ) ) { send_to_char ( "Autoassist removed.\n\r", ch ); REMOVE_BIT ( ch->act, PLR_AUTOASSIST ); } else { send_to_char ( "You will now assist when needed.\n\r", ch ); SET_BIT ( ch->act, PLR_AUTOASSIST ); } } CH_CMD ( do_autoexit ) { if ( IS_NPC ( ch ) ) return; if ( IS_SET ( ch->act, PLR_AUTOEXIT ) ) { send_to_char ( "Exits will no longer be displayed.\n\r", ch ); REMOVE_BIT ( ch->act, PLR_AUTOEXIT ); } else { send_to_char ( "Exits will now be displayed.\n\r", ch ); SET_BIT ( ch->act, PLR_AUTOEXIT ); } } CH_CMD ( do_autogold ) { if ( IS_NPC ( ch ) ) return; if ( IS_SET ( ch->act, PLR_AUTOGOLD ) ) { send_to_char ( "Autogold removed.\n\r", ch ); REMOVE_BIT ( ch->act, PLR_AUTOGOLD ); } else { send_to_char ( "Automatic gold looting set.\n\r", ch ); SET_BIT ( ch->act, PLR_AUTOGOLD ); } } CH_CMD ( do_autoloot ) { if ( IS_NPC ( ch ) ) return; if ( IS_SET ( ch->act, PLR_AUTOLOOT ) ) { send_to_char ( "Autolooting removed.\n\r", ch ); REMOVE_BIT ( ch->act, PLR_AUTOLOOT ); } else { send_to_char ( "Automatic corpse looting set.\n\r", ch ); SET_BIT ( ch->act, PLR_AUTOLOOT ); } } CH_CMD ( do_autosac ) { if ( IS_NPC ( ch ) ) return; if ( IS_SET ( ch->act, PLR_AUTOSAC ) ) { send_to_char ( "Autosacrificing removed.\n\r", ch ); REMOVE_BIT ( ch->act, PLR_AUTOSAC ); } else { send_to_char ( "Automatic corpse sacrificing set.\n\r", ch ); SET_BIT ( ch->act, PLR_AUTOSAC ); } } CH_CMD ( do_autosplit ) { if ( IS_NPC ( ch ) ) return; if ( IS_SET ( ch->act, PLR_AUTOSPLIT ) ) { send_to_char ( "Autosplitting removed.\n\r", ch ); REMOVE_BIT ( ch->act, PLR_AUTOSPLIT ); } else { send_to_char ( "Automatic gold splitting set.\n\r", ch ); SET_BIT ( ch->act, PLR_AUTOSPLIT ); } } CH_CMD ( do_autopeek ) { if ( IS_NPC ( ch ) ) return; if ( IS_SET ( ch->act, PLR_AUTOPEEK ) ) { send_to_char ( "Autopeek removed.\n\r", ch ); REMOVE_BIT ( ch->act, PLR_AUTOPEEK ); } else { send_to_char ( "Automatic peek set.\n\r", ch ); SET_BIT ( ch->act, PLR_AUTOPEEK ); } } CH_CMD ( do_brief ) { if ( IS_SET ( ch->comm, COMM_BRIEF ) ) { send_to_char ( "Full descriptions activated.\n\r", ch ); REMOVE_BIT ( ch->comm, COMM_BRIEF ); } else { send_to_char ( "Short descriptions activated.\n\r", ch ); SET_BIT ( ch->comm, COMM_BRIEF ); } } CH_CMD ( do_compact ) { if ( IS_SET ( ch->comm, COMM_COMPACT ) ) { send_to_char ( "Compact mode removed.\n\r", ch ); REMOVE_BIT ( ch->comm, COMM_COMPACT ); } else { send_to_char ( "Compact mode set.\n\r", ch ); SET_BIT ( ch->comm, COMM_COMPACT ); } } CH_CMD ( do_long ) { if ( !IS_SET ( ch->comm, COMM_LONG ) ) { send_to_char ( "Long flags activated.\n\r", ch ); SET_BIT ( ch->comm, COMM_LONG ); } else { send_to_char ( "Short flags activated.\n\r", ch ); REMOVE_BIT ( ch->comm, COMM_LONG ); } } CH_CMD ( do_show ) { if ( IS_SET ( ch->comm, COMM_SHOW_AFFECTS ) ) { send_to_char ( "Affects will no longer be shown in score.\n\r", ch ); REMOVE_BIT ( ch->comm, COMM_SHOW_AFFECTS ); } else { send_to_char ( "Affects will now be shown in score.\n\r", ch ); SET_BIT ( ch->comm, COMM_SHOW_AFFECTS ); } } CH_CMD ( do_prompt ) { char buf[MAX_STRING_LENGTH]; if ( argument[0] == '\0' ) { if ( IS_SET ( ch->comm, COMM_PROMPT ) ) { send_to_char ( "You will no longer see prompts.\n\r", ch ); REMOVE_BIT ( ch->comm, COMM_PROMPT ); } else { send_to_char ( "You will now see prompts.\n\r", ch ); SET_BIT ( ch->comm, COMM_PROMPT ); } return; } if ( !str_cmp ( argument, "all" ) ) strcpy ( buf, "{W<{r%h{W/{R%H{whp {m%m{W/{M%M{wm {y%v{W/{Y%V{wmv {g({B%X{wtnl{g){W>{x" ); else if ( !str_cmp ( argument, "all2" ) ) strcpy ( buf, "{c({r%h{c/{R%H{chp {b%m{c/{B%M{cm {y%v{c/{Y%V{cmv{C ({g%X{ctnl{C){c>{x" ); else if ( !str_cmp ( argument, "imm" ) ) { if ( !IS_IMMORTAL ( ch ) ) { return; } else { strcpy ( buf, "{Y({x%z{Y)({x%r{Y)({x%e{Y){x%c{Y({r%h{Y/{R%H{Dhp{Y){x" ); } } else if ( !str_cmp ( argument, "imm2" ) ) { if ( !IS_IMMORTAL ( ch ) ) { return; } else { strcpy ( buf, "{g({x%z{g)({x%r{g){x%c{g({r%h{g/{R%H {Dhp{b %m{g/{B%M {Dmn{g){x" ); } } else { if ( strlen ( argument ) > 50 ) argument[50] = '\0'; strcpy ( buf, argument ); smash_tilde ( buf ); if ( str_suffix ( "%c", buf ) ) strcat ( buf, "{x " ); } free_string ( ch->prompt ); ch->prompt = str_dup ( buf ); sprintf ( buf, "Prompt set to %s\n\r", ch->prompt ); send_to_char ( buf, ch ); return; } CH_CMD ( do_combine ) { if ( IS_SET ( ch->comm, COMM_COMBINE ) ) { send_to_char ( "Long inventory selected.\n\r", ch ); REMOVE_BIT ( ch->comm, COMM_COMBINE ); } else { send_to_char ( "Combined inventory selected.\n\r", ch ); SET_BIT ( ch->comm, COMM_COMBINE ); } } CH_CMD ( do_noloot ) { if ( IS_NPC ( ch ) ) return; if ( IS_SET ( ch->act, PLR_CANLOOT ) ) { send_to_char ( "Your corpse is now safe from thieves.\n\r", ch ); REMOVE_BIT ( ch->act, PLR_CANLOOT ); } else { send_to_char ( "Your corpse may now be looted.\n\r", ch ); SET_BIT ( ch->act, PLR_CANLOOT ); } } CH_CMD ( do_nofollow ) { if ( IS_NPC ( ch ) ) return; if ( IS_SET ( ch->act, PLR_NOFOLLOW ) ) { send_to_char ( "You now accept followers.\n\r", ch ); REMOVE_BIT ( ch->act, PLR_NOFOLLOW ); } else { send_to_char ( "You no longer accept followers.\n\r", ch ); SET_BIT ( ch->act, PLR_NOFOLLOW ); die_follower ( ch ); } } CH_CMD ( do_nosummon ) { if ( IS_NPC ( ch ) ) { if ( IS_SET ( ch->imm_flags, IMM_SUMMON ) ) { send_to_char ( "You are no longer immune to summon.\n\r", ch ); REMOVE_BIT ( ch->imm_flags, IMM_SUMMON ); } else { send_to_char ( "You are now immune to summoning.\n\r", ch ); SET_BIT ( ch->imm_flags, IMM_SUMMON ); } } else { if ( IS_SET ( ch->act, PLR_NOSUMMON ) ) { send_to_char ( "You are no longer immune to summon.\n\r", ch ); REMOVE_BIT ( ch->act, PLR_NOSUMMON ); } else { send_to_char ( "You are now immune to summoning.\n\r", ch ); SET_BIT ( ch->act, PLR_NOSUMMON ); } } } CH_CMD ( do_notran ) { if ( IS_NPC ( ch ) ) { return; } else { if ( IS_SET ( ch->act, PLR_NOTRAN ) ) { send_to_char ( "You are no longer immune to transport.\n\r", ch ); REMOVE_BIT ( ch->act, PLR_NOTRAN ); } else { send_to_char ( "You are now immune to transport.\n\r", ch ); SET_BIT ( ch->act, PLR_NOTRAN ); } } } CH_CMD ( do_look ) { char buf[MAX_STRING_LENGTH * 100]; char arg1[MAX_INPUT_LENGTH * 100]; char arg2[MAX_INPUT_LENGTH * 100]; char arg3[MAX_INPUT_LENGTH * 100]; BUFFER *outlist; EXIT_DATA *pexit; CHAR_DATA *victim; OBJ_DATA *obj; char *pdesc; int door; int number, count; if ( ch->desc == NULL ) return; if ( ch->position < POS_SLEEPING ) { send_to_char ( "You can't see anything but stars!\n\r", ch ); return; } if ( ch->position == POS_SLEEPING ) { send_to_char ( "You can't see anything, you're sleeping!\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 ) ) { send_to_char ( "{xIt is pitch {Dblack{x ... \n\r", ch ); show_char_to_char ( ch->in_room->people, ch ); return; } argument = one_argument ( argument, arg1 ); argument = one_argument ( argument, arg2 ); number = number_argument ( arg1, arg3 ); count = 0; if ( arg1[0] == '\0' || !str_cmp ( arg1, "auto" ) ) { /* 'look' or 'look auto' */ send_to_char ( "{w", ch ); send_to_char ( ch->in_room->name, ch ); send_to_char ( "{x", ch ); if ( IS_IMMORTAL ( ch ) && ( IS_NPC ( ch ) || IS_SET ( ch->act, PLR_HOLYLIGHT ) ) ) { sprintf ( buf, " [Room %ld]", ch->in_room->vnum ); send_to_char ( buf, ch ); } send_to_char ( "\n\r", ch ); if ( arg1[0] == '\0' || ( !IS_NPC ( ch ) && !IS_SET ( ch->comm, COMM_BRIEF ) ) ) { send_to_char ( " ", ch ); send_to_char ( ch->in_room->description, ch ); if ( ch->in_room->vnum == chain ) { send_to_char ( "A huge black iron chain as thick as a tree trunk is drifting above the ground\n\r", ch ); send_to_char ( "here.\n\r", ch ); } } if ( !IS_NPC ( ch ) && IS_SET ( ch->act, PLR_AUTOEXIT ) ) { send_to_char ( "\n\r", ch ); do_exits ( ch, "auto" ); } outlist = show_list_to_char ( ch->in_room->contents, ch, FALSE, FALSE ); page_to_char ( buf_string ( outlist ), ch ); free_buf ( outlist ); show_char_to_char ( ch->in_room->people, ch ); return; } if ( !str_cmp ( arg1, "i" ) || !str_cmp ( arg1, "in" ) || !str_cmp ( arg1, "on" ) ) { /* 'look in' */ if ( arg2[0] == '\0' ) { send_to_char ( "Look in what?\n\r", ch ); return; } if ( ( obj = get_obj_here ( ch, arg2 ) ) == NULL ) { send_to_char ( "You do not see that here.\n\r", ch ); return; } switch ( obj->item_type ) { default: send_to_char ( "That is not a container.\n\r", ch ); break; case ITEM_DRINK_CON: if ( obj->value[1] <= 0 ) { send_to_char ( "It is empty.\n\r", ch ); break; } sprintf ( buf, "It's %sfilled with a %s liquid.\n\r", obj->value[1] < obj->value[0] / 4 ? "less than half-" : obj->value[1] < 3 * obj->value[0] / 4 ? "about half-" : "more than half-", liq_table[obj->value[2]].liq_color ); send_to_char ( buf, ch ); break; case ITEM_CONTAINER: case ITEM_PIT: case ITEM_CORPSE_NPC: case ITEM_CORPSE_PC: if ( IS_SET ( obj->value[1], CONT_CLOSED ) ) { send_to_char ( "It is closed.\n\r", ch ); break; } act ( "$p holds:", ch, obj, NULL, TO_CHAR ); outlist = show_list_to_char ( obj->contains, ch, TRUE, TRUE ); page_to_char ( buf_string ( outlist ), ch ); free_buf ( outlist ); break; } return; } if ( ( victim = get_char_room ( ch, arg1 ) ) != NULL ) { show_char_to_char_1 ( victim, ch ); return; } for ( obj = ch->carrying; obj != NULL; obj = obj->next_content ) { if ( can_see_obj ( ch, obj ) ) { /* player can see object */ pdesc = get_extra_descr ( arg3, obj->extra_descr ); if ( pdesc != NULL ) { if ( ++count == number ) { send_to_char ( pdesc, ch ); return; } else continue; } pdesc = get_extra_descr ( arg3, obj->pIndexData->extra_descr ); if ( pdesc != NULL ) { if ( ++count == number ) { send_to_char ( pdesc, ch ); return; } else continue; } if ( is_name ( arg3, obj->name ) ) if ( ++count == number ) { send_to_char ( obj->description, ch ); send_to_char ( "\n\r", ch ); return; } } } for ( obj = ch->in_room->contents; obj != NULL; obj = obj->next_content ) { if ( can_see_obj ( ch, obj ) ) { pdesc = get_extra_descr ( arg3, obj->extra_descr ); if ( pdesc != NULL ) if ( ++count == number ) { send_to_char ( pdesc, ch ); return; } pdesc = get_extra_descr ( arg3, obj->pIndexData->extra_descr ); if ( pdesc != NULL ) if ( ++count == number ) { send_to_char ( pdesc, ch ); return; } if ( is_name ( arg3, obj->name ) ) if ( ++count == number ) { send_to_char ( obj->description, ch ); send_to_char ( "\n\r", ch ); return; } } } pdesc = get_extra_descr ( arg3, ch->in_room->extra_descr ); if ( pdesc != NULL ) { if ( ++count == number ) { send_to_char ( pdesc, ch ); return; } } if ( count > 0 && count != number ) { if ( count == 1 ) sprintf ( buf, "You only see one %s here.\n\r", arg3 ); else sprintf ( buf, "You only see %d of those here.\n\r", count ); send_to_char ( buf, ch ); return; } if ( !str_cmp ( arg1, "n" ) || !str_cmp ( arg1, "north" ) ) door = 0; else if ( !str_cmp ( arg1, "e" ) || !str_cmp ( arg1, "east" ) ) door = 1; else if ( !str_cmp ( arg1, "s" ) || !str_cmp ( arg1, "south" ) ) door = 2; else if ( !str_cmp ( arg1, "w" ) || !str_cmp ( arg1, "west" ) ) door = 3; else if ( !str_cmp ( arg1, "u" ) || !str_cmp ( arg1, "up" ) ) door = 4; else if ( !str_cmp ( arg1, "d" ) || !str_cmp ( arg1, "down" ) ) door = 5; else { send_to_char ( "You do not see that here.\n\r", ch ); return; } /* 'look direction' */ if ( ( ch->alignment < 0 ) && ( pexit = ch->in_room->exit[door + 6] ) != NULL ) door += 6; if ( ( pexit = ch->in_room->exit[door] ) == NULL ) { send_to_char ( "Nothing special there.\n\r", ch ); return; } if ( pexit->description != NULL && pexit->description[0] != '\0' ) send_to_char ( pexit->description, ch ); else send_to_char ( "Nothing special there.\n\r", ch ); if ( pexit->keyword != NULL && pexit->keyword[0] != '\0' && pexit->keyword[0] != ' ' ) { if ( IS_SET ( pexit->exit_info, EX_CLOSED ) ) { act ( "The $d is closed.", ch, NULL, pexit->keyword, TO_CHAR ); } else if ( IS_SET ( pexit->exit_info, EX_ISDOOR ) ) { act ( "The $d is open.", ch, NULL, pexit->keyword, TO_CHAR ); } } return; } /* RT added back for the hell of it */ CH_CMD ( do_read ) { do_look ( ch, argument ); } CH_CMD ( do_examine ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; one_argument ( argument, arg ); if ( arg[0] == '\0' ) { send_to_char ( "Examine what?\n\r", ch ); return; } do_look ( ch, arg ); if ( ( obj = get_obj_here ( ch, arg ) ) != NULL ) { switch ( obj->item_type ) { default: break; case ITEM_JUKEBOX: do_play ( ch, "list" ); break; case ITEM_MONEY: if ( obj->value[0] == 0 ) { if ( obj->value[1] == 0 ) sprintf ( buf, "Odd...there's no coins in the pile.\n\r" ); else if ( obj->value[1] == 1 ) sprintf ( buf, "Wow. One gold coin.\n\r" ); else sprintf ( buf, "There are %ld gold coins in the pile.\n\r", obj->value[1] ); } else if ( obj->value[1] == 0 ) { if ( obj->value[0] == 1 ) sprintf ( buf, "Wow. One silver coin.\n\r" ); else sprintf ( buf, "There are %ld silver coins in the pile.\n\r", obj->value[0] ); } else sprintf ( buf, "There are %ld gold and %ld silver coins in the pile.\n\r", obj->value[1], obj->value[0] ); send_to_char ( buf, ch ); break; case ITEM_DRINK_CON: case ITEM_CONTAINER: case ITEM_PIT: case ITEM_CORPSE_NPC: case ITEM_CORPSE_PC: sprintf ( buf, "in %s", argument ); do_look ( ch, buf ); } } return; } CH_CMD ( do_lore ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; AFFECT_DATA *paf; OBJ_DATA *obj; if ( !IS_NPC ( ch ) && ch->level < skill_table[gsn_lore].skill_level[ch->class] ) { send_to_char ( "You would like to what?\n\r", ch ); return; } one_argument ( argument, arg ); if ( arg[0] == '\0' ) { send_to_char ( "What Would you like to know more about?\n\r", ch ); return; } if ( ( obj = get_obj_carry ( ch, arg ) ) == NULL ) { send_to_char ( "You cannot lore that because you do not have that.\n\r", ch ); return; } if ( number_percent ( ) < get_skill ( ch, gsn_lore ) ) { send_to_char ( "You learn more about this object:\n\r", ch ); check_improve ( ch, gsn_lore, TRUE, 4 ); sprintf ( buf, "Name(s): %s\n\r", obj->name ); send_to_char ( buf, ch ); sprintf ( buf, "Short description: %s\n\rLong description: %s\n\r", obj->short_descr, obj->description ); send_to_char ( buf, ch ); // sprintf( buf, "Wear bits: %s\n\rExtra bits: %s\n\r", sprintf ( buf, "Extra Flags: %s\n\r", // wear_bit_name(obj->wear_flags), extra_bit_name ( obj->extra_flags ) ); send_to_char ( buf, ch ); sprintf ( buf, "Weight: %d\n\r", obj->weight / 10 ); send_to_char ( buf, ch ); sprintf ( buf, "Level: %d Cost: %d\n\r", obj->level, obj->cost ); send_to_char ( buf, ch ); /* now give out vital statistics as per identify */ switch ( obj->item_type ) { case ITEM_SCROLL: case ITEM_POTION: case ITEM_PILL: sprintf ( buf, "Level %ld spells of:", obj->value[0] ); send_to_char ( buf, ch ); if ( obj->value[1] >= 0 && obj->value[1] < MAX_SKILL ) { send_to_char ( " '", ch ); send_to_char ( skill_table[obj->value[1]].name, ch ); send_to_char ( "'", ch ); } if ( obj->value[2] >= 0 && obj->value[2] < MAX_SKILL ) { send_to_char ( " '", ch ); send_to_char ( skill_table[obj->value[2]].name, ch ); send_to_char ( "'", ch ); } if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL ) { send_to_char ( " '", ch ); send_to_char ( skill_table[obj->value[3]].name, ch ); send_to_char ( "'", ch ); } if ( obj->value[4] >= 0 && obj->value[4] < MAX_SKILL ) { send_to_char ( " '", ch ); send_to_char ( skill_table[obj->value[4]].name, ch ); send_to_char ( "'", ch ); } send_to_char ( ".\n\r", ch ); break; case ITEM_WAND: case ITEM_STAFF: sprintf ( buf, "Has %ld(%ld) charges of level %ld", obj->value[1], obj->value[2], obj->value[0] ); send_to_char ( buf, ch ); if ( obj->value[3] >= 0 && obj->value[3] < MAX_SKILL ) { send_to_char ( " '", ch ); send_to_char ( skill_table[obj->value[3]].name, ch ); send_to_char ( "'", ch ); } send_to_char ( ".\n\r", ch ); break; case ITEM_DRINK_CON: sprintf ( buf, "It holds %s-colored %s.\n\r", liq_table[obj->value[2]].liq_color, liq_table[obj->value[2]].liq_name ); send_to_char ( buf, ch ); break; case ITEM_WEAPON: send_to_char ( "Weapon type is ", ch ); switch ( obj->value[0] ) { case ( WEAPON_EXOTIC ): send_to_char ( "exotic\n\r", ch ); break; case ( WEAPON_SWORD ): send_to_char ( "sword\n\r", ch ); break; case ( WEAPON_DAGGER ): send_to_char ( "dagger\n\r", ch ); break; case ( WEAPON_SPEAR ): send_to_char ( "spear/staff\n\r", ch ); break; case ( WEAPON_MACE ): send_to_char ( "mace/club\n\r", ch ); break; case ( WEAPON_AXE ): send_to_char ( "axe\n\r", ch ); break; case ( WEAPON_FLAIL ): send_to_char ( "flail\n\r", ch ); break; case ( WEAPON_WHIP ): send_to_char ( "whip\n\r", ch ); break; case ( WEAPON_POLEARM ): send_to_char ( "polearm\n\r", ch ); break; default: send_to_char ( "unknown\n\r", ch ); break; } if ( obj->pIndexData->new_format ) sprintf ( buf, "Damage is %ldd%ld (average %ld)\n\r", obj->value[1], obj->value[2], ( 1 + obj->value[2] ) * obj->value[1] / 2 ); else sprintf ( buf, "Damage is %ld to %ld (average %ld)\n\r", obj->value[1], obj->value[2], ( obj->value[1] + obj->value[2] ) / 2 ); send_to_char ( buf, ch ); /* sprintf(buf,"Weapon type is %s.\n\r", (obj->value[3] > 0 && obj->value[3] < MAX_DAMAGE_MESSAGE) ? attack_table[obj->value[3]].noun : "undefined"); send_to_char(buf,ch); */ if ( obj->value[4] ) /* weapon flags */ { sprintf ( buf, "Weapons flags: %s\n\r", weapon_bit_name ( obj->value[4] ) ); send_to_char ( buf, ch ); } break; case ITEM_ARMOR: sprintf ( buf, "Armor class is %ld pierce, %ld bash, %ld slash, and %ld vs. magic\n\r", obj->value[0], obj->value[1], obj->value[2], obj->value[3] ); send_to_char ( buf, ch ); break; case ITEM_CONTAINER: sprintf ( buf, "Capacity: %ld# Maximum weight: %ld# flags: %s\n\r", obj->value[0], obj->value[3], cont_bit_name ( obj->value[1] ) ); send_to_char ( buf, ch ); if ( obj->value[4] != 100 ) { sprintf ( buf, "Weight multiplier: %ld%%\n\r", obj->value[4] ); send_to_char ( buf, ch ); } break; } if ( obj->extra_descr != NULL || obj->pIndexData->extra_descr != NULL ) { EXTRA_DESCR_DATA *ed; send_to_char ( "Extra description keywords: '", ch ); for ( ed = obj->extra_descr; ed != NULL; ed = ed->next ) { send_to_char ( ed->keyword, ch ); if ( ed->next != NULL ) send_to_char ( " ", ch ); } for ( ed = obj->pIndexData->extra_descr; ed != NULL; ed = ed->next ) { send_to_char ( ed->keyword, ch ); if ( ed->next != NULL ) send_to_char ( " ", ch ); } send_to_char ( "'\n\r", ch ); } for ( paf = obj->affected; paf != NULL; paf = paf->next ) { sprintf ( buf, "Affects %s by %d, level %d", affect_loc_name ( paf->location ), paf->modifier, paf->level ); send_to_char ( buf, ch ); if ( paf->duration > -1 ) sprintf ( buf, ", %d hours.\n\r", paf->duration ); else sprintf ( buf, ".\n\r" ); send_to_char ( buf, ch ); if ( paf->bitvector ) { switch ( paf->where ) { case TO_AFFECTS: sprintf ( buf, "Adds %s affect.\n", affect_bit_name ( paf->bitvector ) ); break; case TO_WEAPON: sprintf ( buf, "Adds %s weapon flags.\n", weapon_bit_name ( paf->bitvector ) ); break; case TO_OBJECT: sprintf ( buf, "Adds %s object flag.\n", extra_bit_name ( paf->bitvector ) ); break; case TO_IMMUNE: sprintf ( buf, "Adds immunity to %s.\n", imm_bit_name ( paf->bitvector ) ); break; case TO_RESIST: sprintf ( buf, "Adds resistance to %s.\n\r", imm_bit_name ( paf->bitvector ) ); break; case TO_VULN: sprintf ( buf, "Adds vulnerability to %s.\n\r", imm_bit_name ( paf->bitvector ) ); break; default: sprintf ( buf, "Unknown bit %d: %ld\n\r", paf->where, paf->bitvector ); break; } send_to_char ( buf, ch ); } } if ( !obj->enchanted ) for ( paf = obj->pIndexData->affected; paf != NULL; paf = paf->next ) { sprintf ( buf, "Affects %s by %d, level %d.\n\r", affect_loc_name ( paf->location ), paf->modifier, paf->level ); send_to_char ( buf, ch ); if ( paf->bitvector ) { switch ( paf->where ) { case TO_AFFECTS: sprintf ( buf, "Adds %s affect.\n", affect_bit_name ( paf->bitvector ) ); break; case TO_OBJECT: sprintf ( buf, "Adds %s object flag.\n", extra_bit_name ( paf->bitvector ) ); break; case TO_IMMUNE: sprintf ( buf, "Adds immunity to %s.\n", imm_bit_name ( paf->bitvector ) ); break; case TO_RESIST: sprintf ( buf, "Adds resistance to %s.\n\r", imm_bit_name ( paf->bitvector ) ); break; case TO_VULN: sprintf ( buf, "Adds vulnerability to %s.\n\r", imm_bit_name ( paf->bitvector ) ); break; default: sprintf ( buf, "Unknown bit %d: %ld\n\r", paf->where, paf->bitvector ); break; } send_to_char ( buf, ch ); } } } return; } /* * Thanks to Zrin for auto-exit part. */ CH_CMD ( do_exits ) { char buf[MAX_STRING_LENGTH * 100]; EXIT_DATA *pexit; bool found; bool round; bool fAuto; int door; int outlet; fAuto = !str_cmp ( argument, "auto" ); if ( !check_blind ( ch ) ) return; if ( fAuto ) sprintf ( buf, "[Exits:" ); else if ( IS_IMMORTAL ( ch ) ) sprintf ( buf, "Obvious exits from room %ld:\n\r", ch->in_room->vnum ); else sprintf ( buf, "Obvious exits:\n\r" ); found = FALSE; for ( door = 0; door < 6; door++ ) { round = FALSE; outlet = door; if ( ( ch->alignment < 0 ) && ( pexit = ch->in_room->exit[door + 6] ) != NULL ) outlet += 6; if ( ( pexit = ch->in_room->exit[outlet] ) != NULL && pexit->u1.to_room != NULL && can_see_room ( ch, pexit->u1.to_room ) && !IS_SET ( pexit->exit_info, EX_CLOSED ) ) { found = TRUE; round = TRUE; if ( fAuto ) { strcat ( buf, " " ); strcat ( buf, dir_name[outlet] ); } else { sprintf ( buf + strlen ( buf ), "%-5s{x - %s", capitalize ( dir_name[outlet] ), room_is_dark ( pexit->u1. to_room ) ? "Too dark to tell" : pexit->u1.to_room->name ); if ( IS_IMMORTAL ( ch ) ) sprintf ( buf + strlen ( buf ), " (room %ld)\n\r", pexit->u1.to_room->vnum ); else sprintf ( buf + strlen ( buf ), "\n\r" ); } } if ( !round ) { OBJ_DATA *portal; ROOM_INDEX_DATA *to_room; portal = get_obj_exit ( dir_name[door], ch->in_room->contents ); if ( portal != NULL ) { found = TRUE; round = TRUE; if ( fAuto ) { strcat ( buf, " " ); strcat ( buf, dir_name[door] ); } else { to_room = get_room_index ( portal->value[0] ); sprintf ( buf + strlen ( buf ), "%-5s {x- %s", capitalize ( dir_name[door] ), room_is_dark ( to_room ) ? "Too dark to tell" : to_room->name ); if ( IS_IMMORTAL ( ch ) ) sprintf ( buf + strlen ( buf ), " (room %ld)\n\r", to_room->vnum ); else sprintf ( buf + strlen ( buf ), "\n\r" ); } } } } if ( !found ) strcat ( buf, fAuto ? " none" : "None.\n\r" ); if ( fAuto ) strcat ( buf, "]\n\r" ); send_to_char ( buf, ch ); return; } CH_CMD ( do_worth ) { char buf[MAX_STRING_LENGTH]; if ( IS_NPC ( ch ) ) { sprintf ( buf, "{yYou have {C%ld {yplatinum, {Y%ld{y gold and {W%ld{y silver.{x\n\r", ch->platinum, ch->gold, ch->silver ); send_to_char ( buf, ch ); return; } sprintf ( buf, "{yYou have {C%ld{y platinum, {Y%ld {ygold, {W%ld{y silver.\n\r{yYou have {G%ld{y experience.{W({G%ld{y exp to level{W){y\n\r{yYour bank balance is {C%ld{y platinum.{x\n\r{yYou have {W%ld{y quest points.{x\n\r", ch->platinum, ch->gold, ch->silver, ch->exp, ( ch->level + 1 ) * exp_per_level ( ch, ch->pcdata->points ) - ch->exp, ch->pcdata->balance, ch->pcdata->questpoints ); send_to_char ( buf, ch ); return; } CH_CMD ( do_charinfo ) { int i; printf_to_char ( ch, "\n\r Character Info{x\n\r" ); printf_to_char ( ch, "{W-------------------------------------------------------------------------{x\n\r" ); printf_to_char ( ch, "{W| {GStats{x\n\r" "{W| {RCon{x:{b %d{y({B%d{y) {RInt:{b %d{y({B%d{y) {RWis{x:{b %d{y({B%d{y){x" "{RDex{x:{b %d{y({B%d{y) {RStr{x:{b %d{y({B%d{y){x\n\r", ch->perm_stat[STAT_CON], get_curr_stat ( ch, STAT_CON ), ch->perm_stat[STAT_INT], get_curr_stat ( ch, STAT_INT ), ch->perm_stat[STAT_WIS], get_curr_stat ( ch, STAT_WIS ), ch->perm_stat[STAT_DEX], get_curr_stat ( ch, STAT_DEX ), ch->perm_stat[STAT_STR], get_curr_stat ( ch, STAT_STR ) ); printf_to_char ( ch, "{W|\n\r{W| {G Armor{x\n\r" ); if ( ch->level >= 1 ) { printf_to_char ( ch, "{W| {RPierce{x:{B %d{R Bash{x:{B %d{x {RSlash {x:{B %d{R Magic{x:{B %d{x\n\r", GET_AC ( ch, AC_PIERCE ), GET_AC ( ch, AC_BASH ), GET_AC ( ch, AC_SLASH ), GET_AC ( ch, AC_EXOTIC ) ); } for ( i = 0; i < 4; i++ ) { char *temp; switch ( i ) { case ( AC_PIERCE ): temp = "piercing"; break; case ( AC_BASH ): temp = "bashing"; break; case ( AC_SLASH ): temp = "slashing"; break; case ( AC_EXOTIC ): temp = "magic"; break; default: temp = "error"; break; } } printf_to_char ( ch, "{W---------------------------------------------------------------------------{x\n\r" ); } /* New score function copyright of Loki of Death Rising. If you use this score you must leave this header intact.*/ CH_CMD ( do_score_loki ) { int i; printf_to_char ( ch, "\n\r{Y=============================================================================={x\n\r" ); printf_to_char ( ch, "{Y| {b %s%s{x\n\r", ch->name, IS_NPC ( ch ) ? ", the mobile." : ch->pcdata->title ); printf_to_char ( ch, "{Y+-----------------------------------------------------------------------------{x\n\r" ); printf_to_char ( ch, "{Y| {cRace {x:{g %-9s{Y| {cAQP{x :{g %-8ld{Y| {cHP{x :{g %-6ld{x/{G%ld\n\r" "{Y| {cAge {x:{g %-9d{Y| {cIQP{x :{g %-8d{Y| {cMN{x :{g %-6ld{x/{G%ld\n\r" "{Y| {cSex {x:{g %-9s{Y| {cDamr{x:{g %-8d{Y| {cMV{x :{g %-6ld{x/{G%ld\n\r" "{Y| {cLevel{x:{g %-9d{Y| {cHitr{x:{g %-8d{Y| {cItems{x :{g %-6d{x/{G%d\n\r" "{Y| {cClass{x:{g %-9s{Y| {cPlat{x:{g %-8ld{Y| {cWeight{x :{g %-6ld{x/{G%d\n\r" "{Y| {cAlign{x:{g %-9d{Y| {cGold{x:{g %-8ld{Y| {cSaves{x :{g %-6d{x\n\r" "{Y| {cWimpy{x:{g %-9d{Y| {cSilv{x:{g %-8ld{Y| {cBalance{x:{g %ld{x\n\r", IS_NPC ( ch ) ? "mobile" : race_table[ch->race].name, ch->pcdata->questpoints, ch->hit, ch->max_hit, get_age ( ch ), ch->qps, ch->mana, ch->max_mana, ch->sex == 0 ? "sexless" : ch->sex == 1 ? "male" : "female", GET_DAMROLL ( ch ), ch->move, ch->max_move, ch->level, GET_HITROLL ( ch ), ch->carry_number, can_carry_n ( ch ), class_table[ch->class].name, ch->platinum, get_carry_weight ( ch ) / 10, can_carry_w ( ch ) / 10, ch->alignment, ch->gold, ch->saving_throw, ch->wimpy, ch->silver, ch->pcdata->balance ); /*stats*/ printf_to_char ( ch, "{Y+-----------------------------------------------------------------------------{x\n\r" ); printf_to_char ( ch, "{Y| {cStr{x:{g %d{x({G%d{x) {cInt{x: {g%d{x({G%d{x) {cWis{x: {g%d{x({G%d{x) {cDex{x: {g%d{x({G%d{x) {cCon{x: {g%d{x({G%d{x)\n\r", ch->perm_stat[STAT_STR], get_curr_stat ( ch, STAT_STR ), ch->perm_stat[STAT_INT], get_curr_stat ( ch, STAT_INT ), ch->perm_stat[STAT_WIS], get_curr_stat ( ch, STAT_WIS ), ch->perm_stat[STAT_DEX], get_curr_stat ( ch, STAT_DEX ), ch->perm_stat[STAT_CON], get_curr_stat ( ch, STAT_CON ) ); /*AC*/ if ( ch->level >= 1 ) { printf_to_char ( ch, "{Y| {cPierce{x:{g %d{c Bash{x:{g %d{x {cSlash {x:{g %d{c Magic{x:{g %d{x\n\r", GET_AC ( ch, AC_PIERCE ), GET_AC ( ch, AC_BASH ), GET_AC ( ch, AC_SLASH ), GET_AC ( ch, AC_EXOTIC ) ); } for ( i = 0; i < 4; i++ ) { char *temp; switch ( i ) { case ( AC_PIERCE ): temp = "piercing"; break; case ( AC_BASH ): temp = "bashing"; break; case ( AC_SLASH ): temp = "slashing"; break; case ( AC_EXOTIC ): temp = "magic"; break; default: temp = "error"; break; } } printf_to_char ( ch, "{Y+-----------------------------------------------------------------------------{x\n\r" ); /* RT wizinvis and holy light */ if ( IS_IMMORTAL ( ch ) ) { printf_to_char ( ch, "{Y| {cHoly Light{x: " ); if ( IS_SET ( ch->act, PLR_HOLYLIGHT ) ) printf_to_char ( ch, "{Gon{x" ); else printf_to_char ( ch, "{goff{x" ); } if ( IS_IMMORTAL ( ch ) ) { printf_to_char ( ch, "{c Invis{x:{g %d {cIncognito{x: %d {cGhost{x:{g %d\n\r", ch->invis_level, ch->incog_level, ch->ghost_level ); printf_to_char ( ch, "{Y+-----------------------------------------------------------------------------{x\n\r" ); } if ( !IS_NPC ( ch ) ) { printf_to_char ( ch, "{Y| {c[{gArena Stats{c]{c Wins{x:{g %d {cLosses{x:{g %d{x\n\r", ch->pcdata->awins, ch->pcdata->alosses ); if ( ch->challenger != NULL ) { printf_to_char ( ch, "{Y| {c[{gArena{c]{c You have been challenged by{r %s{c.{x\n\r", ch->challenger->name ); } if ( ch->gladiator != NULL ) { printf_to_char ( ch, "{Y| {c[{gArena bet{c]{c You have a {Y%d gold{c bet on %s.{x\n\r", ch->pcdata->plr_wager, ch->gladiator->name ); } } if ( !IS_NPC ( ch ) ) { printf_to_char ( ch, "{Y| {c[{gPK stats{c]{R Kills{x: %ld {DDeaths{x: %ld\n\r", ch->pcdata->pkkills, ch->pcdata->pkdeaths ); } if ( is_clan ( ch ) ) { printf_to_char ( ch, "{Y| {cClan{x: %s {cRank{x: %s{x, %s {x\n\r", clan_table[ch->clan].who_name, clan_rank_table[ch->clan_rank].title_of_rank[ch-> sex], is_pkill ( ch ) ? "{RPkill{c.{x" : "{mNon-Pkill{c.{x" ); } if ( ch->invited ) { printf_to_char ( ch, "{Y| {RYou have been invited to join clan {x[{%s%s{x]\n\r", clan_table[ch->invited].pkill ? "B" : "M", clan_table[ch->invited].who_name ); } if ( !IS_NPC ( ch ) ) { int rcnt = roomcount ( ch ); int arcnt = areacount ( ch ); double rooms = top_room, percent = ( double ) rcnt / ( rooms / 100 ); double arooms = ( double ) ( arearooms ( ch ) ), apercent = ( double ) arcnt / ( arooms / 100 ); printf_to_char ( ch, "{Y| {cExplored: {g%4d{c/{G%4d{c rooms. ({W%5.2f%%{c of the world) ({W%5.2f%%{c of current area)\n\r{x", rcnt, top_room, percent, apercent ); } printf_to_char ( ch, "{Y=============================================================================={x\n\r" ); if ( IS_SET ( ch->comm, COMM_SHOW_AFFECTS ) ) do_affects ( ch, "" ); } /* This is NEW score listing for The Mage's Lair */ CH_CMD ( do_lscore ) { char buf[MAX_STRING_LENGTH]; int i; if ( IS_NPC ( ch ) ) { send_to_char ( "Use the OLD score function\n\r", ch ); return; } send_to_char ( "{Y------------------------------------------------------------------{x\n\r", ch ); printf_to_char ( ch, "{cYou are {W%s%s{c, level {W%d{c, {W%d {cyears old ({W%d{c hours).\n\r", ch->name, IS_NPC ( ch ) ? "" : ch->pcdata->title, ch->level, get_age ( ch ), ( ch->played + ( int ) ( current_time - ch->logon ) ) / 3600 ); if ( get_trust ( ch ) != ch->level ) { printf_to_char ( ch, "{cYou are trusted at level {W%d{c.\n\r", get_trust ( ch ) ); } printf_to_char ( ch, "{cRace: {W%s {cSex: {W%s {cClass: {W%s\n\r", race_table[ch->race].name, ch->sex == 0 ? "sexless" : ch->sex == 1 ? "male" : "female", IS_NPC ( ch ) ? "mobile" : class_table[ch->class].name ); if ( ch->clan ) { printf_to_char ( ch, "{cClan:{x %s {cRank:{x %s\n\r", clan_table[ch->clan].who_name, clan_rank_table[ch->clan_rank].title_of_rank[ch-> sex] ); } printf_to_char ( ch, "{cStr: {W%d(%d) {cInt: {W%d(%d) {cWis: {W%d(%d) {cDex: {W%d(%d) {cCon: {W%d(%d)\n\r", ch->perm_stat[STAT_STR], get_curr_stat ( ch, STAT_STR ), ch->perm_stat[STAT_INT], get_curr_stat ( ch, STAT_INT ), ch->perm_stat[STAT_WIS], get_curr_stat ( ch, STAT_WIS ), ch->perm_stat[STAT_DEX], get_curr_stat ( ch, STAT_DEX ), ch->perm_stat[STAT_CON], get_curr_stat ( ch, STAT_CON ) ); if ( ch->level >= 15 ) { printf_to_char ( ch, "{cToHit: {W%-9d {cToDam: {W%d\n\r", GET_HITROLL ( ch ), GET_DAMROLL ( ch ) ); } printf_to_char ( ch, "{cHP: {W%5ld/%-5ld {cPracs: {W%d \n\r", ch->hit, ch->max_hit, ch->practice ); printf_to_char ( ch, "{cMANA: {W%5ld/%-5ld {cTrains: {W%d \n\r", ch->mana, ch->max_mana, ch->train ); printf_to_char ( ch, "{cMOVE: {W%5ld/%-5ld {cItems: {W%d/%d \n\r", ch->move, ch->max_move, ch->carry_number, can_carry_n ( ch ) ); printf_to_char ( ch, "{cAQP: {W%-9ld {cWeight: {W%ld/%d \n\r", ch->pcdata->questpoints, get_carry_weight ( ch ) / 10, can_carry_w ( ch ) / 10 ); /* * This section (exp, gold, balance and shares) was written by * The Maniac from Mythran Mud */ if ( IS_NPC ( ch ) ) /* NPC's have no bank balance and shares */ { /* and don't level !! -- Maniac -- */ printf_to_char ( ch, "You have scored %ld exp, and have %ld gold coins\n\r", ch->exp, ch->gold ); } if ( !IS_NPC ( ch ) ) /* PC's do level and can have bank accounts */ { /* HERO's don't level anymore */ printf_to_char ( ch, "{cExp: {W%-6ld {cTNL: {W%-7ld {cWimpy: {W%d\n\r", ch->exp, IS_HERO ( ch ) ? ( 1 ) : ( ch->level + 1 ) * exp_per_level ( ch, ch-> pcdata-> points ) - ch->exp, ch->wimpy ); printf_to_char ( ch, "{cGold: {W%-6ld {cPlat: {W%-7ld {cBank: {W%-7ld {cSilver: {W%ld\n\r", ch->gold, ch->platinum, ch->pcdata->balance, ch->silver ); if ( ch->pcdata->shares ) { printf_to_char ( ch, "You have %ld plat invested in %ld shares (%d each).\n\r", ( ch->pcdata->shares * share_value ), ch->pcdata->shares, share_value ); } } send_to_char ( "{cCONDITION(S): ", ch ); if ( !IS_NPC ( ch ) && ch->pcdata->condition[COND_DRUNK] > 10 ) send_to_char ( "{WDRUNK ", ch ); if ( !IS_NPC ( ch ) && ch->pcdata->condition[COND_THIRST] == 0 ) send_to_char ( "{WTHIRSTY ", ch ); if ( !IS_NPC ( ch ) && ch->pcdata->condition[COND_HUNGER] == 0 ) send_to_char ( "{WHUNGRY{x", ch ); send_to_char ( ".\n\r", ch ); send_to_char ( "{cPOSITION: ", ch ); switch ( ch->position ) { case POS_DEAD: send_to_char ( "{RDEAD{x!!\n\r", ch ); break; case POS_MORTAL: send_to_char ( "{WMortally wounded{x.\n\r", ch ); break; case POS_INCAP: send_to_char ( "{WIncapacitated{x.\n\r", ch ); break; case POS_STUNNED: send_to_char ( "{Wstunned{x.\n\r", ch ); break; case POS_SLEEPING: send_to_char ( "{WSleeping{x.\n\r", ch ); break; case POS_RESTING: send_to_char ( "{WResting{x.\n\r", ch ); break; case POS_SITTING: send_to_char ( "{WSitting{x.\n\r", ch ); break; case POS_STANDING: send_to_char ( "{WStanding{x.\n\r", ch ); break; case POS_FIGHTING: send_to_char ( "{WFighting{x.\n\r", ch ); break; } /* print AC values */ if ( ch->level >= 25 ) { printf_to_char ( ch, "{cArmor: pierce: {W%d {cbash: {W%d {cslash: {W%d {cmagic: {W%d\n\r", GET_AC ( ch, AC_PIERCE ), GET_AC ( ch, AC_BASH ), GET_AC ( ch, AC_SLASH ), GET_AC ( ch, AC_EXOTIC ) ); } else { for ( i = 0; i < 4; i++ ) { char *temp; switch ( i ) { case ( AC_PIERCE ): temp = "piercing"; break; case ( AC_BASH ): temp = "bashing"; break; case ( AC_SLASH ): temp = "slashing"; break; case ( AC_EXOTIC ): temp = "magic"; break; default: temp = "error"; break; } send_to_char ( "You are ", ch ); if ( GET_AC ( ch, i ) >= 101 ) sprintf ( buf, "hopelessly vulnerable to %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= 80 ) sprintf ( buf, "defenseless against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= 60 ) sprintf ( buf, "barely protected from %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= 40 ) sprintf ( buf, "slightly armored against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= 20 ) sprintf ( buf, "somewhat armored against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= 0 ) sprintf ( buf, "armored against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= -20 ) sprintf ( buf, "well-armored against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= -40 ) sprintf ( buf, "very well-armored against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= -60 ) sprintf ( buf, "heavily armored against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= -80 ) sprintf ( buf, "superbly armored against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= -100 ) sprintf ( buf, "almost invulnerable to %s.\n\r", temp ); else sprintf ( buf, "divinely armored against %s.\n\r", temp ); send_to_char ( buf, ch ); } } /* RT wizinvis and holy light */ if ( IS_IMMORTAL ( ch ) ) { send_to_char ( "{cHoly Light: ", ch ); if ( IS_SET ( ch->act, PLR_HOLYLIGHT ) ) send_to_char ( "{WON", ch ); else send_to_char ( "{WOFF", ch ); if ( ch->invis_level ) { sprintf ( buf, " {c Invisible: level {W%d", ch->invis_level ); send_to_char ( buf, ch ); } if ( ch->incog_level ) { sprintf ( buf, " {cIncognito: level {W%d", ch->incog_level ); send_to_char ( buf, ch ); } send_to_char ( "\n\r", ch ); } if ( ch->level >= 10 ) { printf_to_char ( ch, "{cAlignment: {W%d. ", ch->alignment ); } send_to_char ( "You are ", ch ); if ( ch->alignment > 900 ) send_to_char ( "angelic.\n\r", ch ); else if ( ch->alignment > 700 ) send_to_char ( "saintly.\n\r", ch ); else if ( ch->alignment > 350 ) send_to_char ( "good.\n\r", ch ); else if ( ch->alignment > 100 ) send_to_char ( "kind.\n\r", ch ); else if ( ch->alignment > -100 ) send_to_char ( "neutral.\n\r", ch ); else if ( ch->alignment > -350 ) send_to_char ( "mean.\n\r", ch ); else if ( ch->alignment > -700 ) send_to_char ( "evil.\n\r", ch ); else if ( ch->alignment > -900 ) send_to_char ( "demonic.\n\r", ch ); else send_to_char ( "satanic.\n\r", ch ); send_to_char ( "{Y------------------------------------------------------------------{x\n\r", ch ); if ( IS_SET ( ch->comm, COMM_SHOW_AFFECTS ) ) { do_affects ( ch, "" ); send_to_char ( "{Y------------------------------------------------------------------{x\n\r", ch ); } } CH_CMD ( do_score_new ) { char buf[MAX_STRING_LENGTH]; BUFFER *output; /* int i; */ output = new_buf ( ); sprintf ( buf, "\n\r" ); add_buf ( output, buf ); sprintf ( buf, " %s: %s\n\r", ch->name, IS_NPC ( ch ) ? ", the mobile." : ch->pcdata->title ); add_buf ( output, buf ); sprintf ( buf, "\n\r" ); add_buf ( output, buf ); sprintf ( buf, " Level: %-14dAge: %-14dSex: %-10s\n\r", ch->level, get_age ( ch ), ch->sex == 0 ? "sexless" : ch->sex == 1 ? "male" : "female" ); add_buf ( output, buf ); sprintf ( buf, " Race: %-28s Class: %-10s\n\r", race_table[ch->race].name, class_table[ch->class].name ); add_buf ( output, buf ); sprintf ( buf, " Platinum: %-13ldGold: %-11ldSilver: %-12ld\n\r", ch->platinum, ch->gold, ch->silver ); add_buf ( output, buf ); sprintf ( buf, " HP: %ld/%ld Mana: %ld/%ld MV: %ld/%ld\n\r", ch->hit, ch->max_hit, ch->mana, ch->max_mana, ch->move, ch->max_move ); add_buf ( output, buf ); sprintf ( buf, " Hitroll: %-12dWimpy: %-10dDamroll: %-11d\n\r", GET_HITROLL ( ch ), ch->wimpy, GET_DAMROLL ( ch ) ); add_buf ( output, buf ); sprintf ( buf, " AQP: %-32ldImmQP: %-13d\n\r", ch->pcdata->questpoints, ch->qps ); add_buf ( output, buf ); page_to_char ( buf_string ( output ), ch ); free_buf ( output ); if ( IS_SET ( ch->comm, COMM_SHOW_AFFECTS ) ) do_affects ( ch, "" ); } CH_CMD ( do_score ) { char buf[MAX_STRING_LENGTH]; BUFFER *output; int i; output = new_buf ( ); sprintf ( buf, "{WYou are {G%s{x%s{x\n\r", ch->name, IS_NPC ( ch ) ? ", the mobile." : ch->pcdata->title ); add_buf ( output, buf ); sprintf ( buf, "{WLevel {B%d{W, {B%d{W years old.{x\n\r", ch->level, get_age ( ch ) ); add_buf ( output, buf ); if ( get_trust ( ch ) != ch->level ) { sprintf ( buf, "{WYou are trusted at level {B%d{x.\n\r", get_trust ( ch ) ); add_buf ( output, buf ); } sprintf ( buf, "{WRace{x: {M%s{W Sex{x: {M%s{W Class{x: {M%s{x\n\r", race_table[ch->race].name, ch->sex == 0 ? "sexless" : ch->sex == 1 ? "male" : "female", IS_NPC ( ch ) ? "mobile" : class_table[ch->class].name ); add_buf ( output, buf ); sprintf ( buf, "{WYou have {r%ld{W/{R%ld{W hitpoints, {b%ld{W/{B%ld{W mana, {y%ld{W/{Y%ld{W movement.{x\n\r", ch->hit, ch->max_hit, ch->mana, ch->max_mana, ch->move, ch->max_move ); add_buf ( output, buf ); sprintf ( buf, "{WYou have {y%d{W practices and {y%d{W training sessions.{x\n\r", ch->practice, ch->train ); add_buf ( output, buf ); /* if (is_clan(ch)) { sprintf( buf, "{xYou are in the [{G%s{x] clan, which is a %s clan.\n\r", clan_table[ch->clan].who_name, is_pkill(ch) ? "{RPkill{x" : "{WNon-Pkill{x"); add_buf(output,buf); } */ sprintf ( buf, "{WYou are carrying {g%d{x/{G%d{W items with weight {g%ld{x/{G%d{W pounds.{x\n\r", ch->carry_number, can_carry_n ( ch ), get_carry_weight ( ch ) / 10, can_carry_w ( ch ) / 10 ); add_buf ( output, buf ); sprintf ( buf, "{WStr{x: {Y%d{x({D%d{x) {WInt{x: {Y%d{x({D%d{x) {WWis{x: {Y%d{x({D%d{x){W Dex{x: {Y%d{x({D%d{x){W Con{x: {Y%d{x({D%d{x)\n\r", ch->perm_stat[STAT_STR], get_curr_stat ( ch, STAT_STR ), ch->perm_stat[STAT_INT], get_curr_stat ( ch, STAT_INT ), ch->perm_stat[STAT_WIS], get_curr_stat ( ch, STAT_WIS ), ch->perm_stat[STAT_DEX], get_curr_stat ( ch, STAT_DEX ), ch->perm_stat[STAT_CON], get_curr_stat ( ch, STAT_CON ) ); add_buf ( output, buf ); sprintf ( buf, "{WYou have {Y%ld{W platinum, {Y%ld{W gold and {Y%ld{W silver coins.\n\r", ch->platinum, ch->gold, ch->silver ); add_buf ( output, buf ); if ( !IS_NPC ( ch ) && ch->level == LEVEL_ANCIENT ) { sprintf ( buf, "{WYou have scored {c%ld exp{x.\n\r", ch->exp ); add_buf ( output, buf ); } else if ( !IS_NPC ( ch ) && ch->level < LEVEL_ANCIENT ) { sprintf ( buf, "{WYou have scored {c%ld exp{W. You need {C%ld exp{W to level.{x\n\r", ch->exp, ( ( ch->level + 1 ) * exp_per_level ( ch, ch->pcdata->points ) - ch->exp ) ); add_buf ( output, buf ); } if ( ch->wimpy ) { sprintf ( buf, "{WWimpy set to{r %d{W hit points.{x\n\r", ch->wimpy ); add_buf ( output, buf ); } if ( !IS_NPC ( ch ) && ch->pcdata->condition[COND_DRUNK] > 10 ) { sprintf ( buf, "{cYou are drunk.{x\n\r" ); add_buf ( output, buf ); } if ( !IS_NPC ( ch ) && ch->pcdata->condition[COND_THIRST] == 0 ) { sprintf ( buf, "{cYou are thirsty.{x\n\r" ); add_buf ( output, buf ); } if ( !IS_NPC ( ch ) && ch->pcdata->condition[COND_HUNGER] == 0 ) { sprintf ( buf, "{cYou are hungry.{x\n\r" ); add_buf ( output, buf ); } switch ( ch->position ) { case POS_DEAD: sprintf ( buf, "{RYou are DEAD!!{x\n\r" ); add_buf ( output, buf ); break; case POS_MORTAL: sprintf ( buf, "{RYou are mortally wounded.{x\n\r" ); add_buf ( output, buf ); break; case POS_INCAP: sprintf ( buf, "{RYou are incapacitated.{x\n\r" ); add_buf ( output, buf ); break; case POS_STUNNED: sprintf ( buf, "{RYou are stunned.{x\n\r" ); add_buf ( output, buf ); break; case POS_SLEEPING: sprintf ( buf, "{BYou are sleeping.{x\n\r" ); add_buf ( output, buf ); break; case POS_RESTING: sprintf ( buf, "{BYou are resting.{x\n\r" ); add_buf ( output, buf ); break; case POS_STANDING: sprintf ( buf, "{BYou are standing.{x\n\r" ); add_buf ( output, buf ); break; case POS_FIGHTING: sprintf ( buf, "{RYou are fighting.{x\n\r" ); add_buf ( output, buf ); break; } /* print AC values */ if ( ch->level >= 25 ) { sprintf ( buf, "{WArmor{x:{W Pierce{x: {D%d{W Bash{x: {D%d{W Slash{x: {D%d{W Magic{x: {M%d{x\n\r", GET_AC ( ch, AC_PIERCE ), GET_AC ( ch, AC_BASH ), GET_AC ( ch, AC_SLASH ), GET_AC ( ch, AC_EXOTIC ) ); add_buf ( output, buf ); } for ( i = 0; i < 4; i++ ) { char *temp; switch ( i ) { case ( AC_PIERCE ): temp = "piercing"; break; case ( AC_BASH ): temp = "bashing"; break; case ( AC_SLASH ): temp = "slashing"; break; case ( AC_EXOTIC ): temp = "magic"; break; default: temp = "error"; break; } sprintf ( buf, "{xYou are " ); add_buf ( output, buf ); if ( GET_AC ( ch, i ) >= 101 ) sprintf ( buf, "{Rhopelessly vulnerable{x to %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= 80 ) sprintf ( buf, "{Rdefenseless{x against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= 60 ) sprintf ( buf, "{Rbarely protected{x from %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= 40 ) sprintf ( buf, "{yslightly armored{x against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= 20 ) sprintf ( buf, "{ysomewhat armored{x against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= 0 ) sprintf ( buf, "{yarmored{x against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= -20 ) sprintf ( buf, "{ywell-armored{x against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= -40 ) sprintf ( buf, "{yvery well-armored{x against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= -60 ) sprintf ( buf, "{Bheavily armored{x against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= -80 ) sprintf ( buf, "{Bsuperbly armored{x against %s.\n\r", temp ); else if ( GET_AC ( ch, i ) >= -100 ) sprintf ( buf, "{Balmost invulnerable{x to %s.\n\r", temp ); else sprintf ( buf, "{Wdivinely armored{x against %s.\n\r", temp ); add_buf ( output, buf ); } /* RT wizinvis and holy light */ if ( IS_IMMORTAL ( ch ) ) { sprintf ( buf, "Holy Light: " ); add_buf ( output, buf ); if ( IS_SET ( ch->act, PLR_HOLYLIGHT ) ) sprintf ( buf, "on" ); else sprintf ( buf, "off" ); add_buf ( output, buf ); if ( ch->invis_level ) { sprintf ( buf, " Invisible: level %d", ch->invis_level ); add_buf ( output, buf ); } if ( ch->incog_level ) { sprintf ( buf, " Incognito: level %d", ch->incog_level ); add_buf ( output, buf ); } sprintf ( buf, "\n\r" ); add_buf ( output, buf ); } if ( ch->level >= 15 ) { sprintf ( buf, "{WHitroll: {G%d{W Damroll: {G%d{x.\n\r", GET_HITROLL ( ch ), GET_DAMROLL ( ch ) ); add_buf ( output, buf ); } if ( is_clan ( ch ) ) { sprintf ( buf, "{YYou are in the {w[%s{w]{Y clan, which is a %s clan.{x\n\r", clan_table[ch->clan].who_name, is_pkill ( ch ) ? "{RPkill{x" : "{WNon-Pkill{x" ); add_buf ( output, buf ); } if ( !IS_NPC ( ch ) ) { sprintf ( buf, "{w[{RPK {gstats{w] {WKills:{x {R%ld{W Deaths: {r%ld{x\n\r", ch->pcdata->pkkills, ch->pcdata->pkdeaths ); add_buf ( output, buf ); } if ( ch->level >= 10 ) { sprintf ( buf, "{xAlignment: {B%d{x. ", ch->alignment ); add_buf ( output, buf ); } sprintf ( buf, "{xYou are " ); add_buf ( output, buf ); if ( ch->alignment > 900 ) sprintf ( buf, "{Wangelic{x.\n\r" ); else if ( ch->alignment > 700 ) sprintf ( buf, "{Wsaintly{x.\n\r" ); else if ( ch->alignment > 350 ) sprintf ( buf, "{wgood{x.\n\r" ); else if ( ch->alignment > 100 ) sprintf ( buf, "{ykind.\n\r" ); else if ( ch->alignment > -100 ) sprintf ( buf, "{yneutral.\n\r" ); else if ( ch->alignment > -350 ) sprintf ( buf, "{ymean.\n\r" ); else if ( ch->alignment > -700 ) sprintf ( buf, "{revil{x.\n\r" ); else if ( ch->alignment > -900 ) sprintf ( buf, "{Rdemonic{x.\n\r" ); else sprintf ( buf, "{Rsatanic{x.\n\r" ); add_buf ( output, buf ); if ( ch->qps ) { if ( ch->qps == 1 ) sprintf ( buf, "{WYou have {M%d{W quest point.{x\n\r", ch->qps ); else sprintf ( buf, "{WYou have {M%d{W quest points.{x\n\r", ch->qps ); add_buf ( output, buf ); } if ( ch->invited ) { sprintf ( buf, "{RYou have been invited to join clan {x[{%s%s{x]\n\r", clan_table[ch->invited].pkill ? "B" : "M", clan_table[ch->invited].who_name ); add_buf ( output, buf ); } page_to_char ( buf_string ( output ), ch ); free_buf ( output ); if ( IS_SET ( ch->comm, COMM_SHOW_AFFECTS ) ) do_affects ( ch, "" ); } CH_CMD ( do_affects ) { AFFECT_DATA *paf, *paf_last = NULL; char buf[MAX_STRING_LENGTH]; char *buf4; char buf3[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; bool found = FALSE; long cheat = 0; long filter; long printme; BUFFER *buffer; OBJ_DATA *obj; int iWear; buffer = new_buf ( ); cheat = ch->affected_by; if ( ch->affected != NULL ) { send_to_char ( "{Y==============================================================================\n\r{x", ch ); add_buf ( buffer, "{cYou are affected by the following spells:{x\n\r" ); for ( paf = ch->affected; paf != NULL; paf = paf->next ) { if ( paf_last != NULL && paf->type == paf_last->type ) { if ( ch->level >= 20 ) sprintf ( buf, " " ); else continue; } else sprintf ( buf, "{cSpell: {g%-19s{x", skill_table[paf->type].name ); add_buf ( buffer, buf ); if ( IS_SET ( cheat, paf->bitvector ) ) cheat -= paf->bitvector; if ( ch->level >= 20 ) { sprintf ( buf, "{c: modifies {g%-16s {cby {g%-6d{x ", affect_loc_name ( paf->location ), paf->modifier ); add_buf ( buffer, buf ); if ( paf->duration == -1 ) sprintf ( buf, "{cpermanently{x" ); else sprintf ( buf, "{cfor{g %-4d {chours{x", paf->duration ); add_buf ( buffer, buf ); } add_buf ( buffer, "\n\r" ); paf_last = paf; } found = TRUE; add_buf ( buffer, "\n\r" ); } if ( race_table[ch->race].aff != 0 && IS_AFFECTED ( ch, race_table[ch->race].aff ) ) { add_buf ( buffer, "{Y------------------------------------------------------------------------------{x\n\r" ); add_buf ( buffer, "{cYou are affected by the following racial abilities:{x\n\r" ); if ( IS_SET ( cheat, race_table[ch->race].aff ) ); cheat -= race_table[ch->race].aff; strcpy ( buf3, affect_bit_name ( race_table[ch->race].aff ) ); buf4 = buf3; buf4 = one_argument ( buf4, buf2 ); while ( buf2[0] ) { sprintf ( buf, "{cSpell: {g%-19s{x", buf2 ); add_buf ( buffer, buf ); add_buf ( buffer, "\n\r" ); buf4 = one_argument ( buf4, buf2 ); } found = TRUE; add_buf ( buffer, "\n\r" ); } if ( ch->affected_by != 0 && ( ch->affected_by != race_table[ch->race].aff ) ) { bool print = FALSE; for ( iWear = 0; iWear < MAX_WEAR; iWear++ ) { if ( ( obj = get_eq_char ( ch, iWear ) ) != NULL ) { for ( paf = obj->affected; paf != NULL; paf = paf->next ) { if ( !IS_SET ( ch->affected_by, paf->bitvector ) ) continue; if ( paf->where != TO_AFFECTS ) continue; filter = paf->bitvector; filter &= ch->affected_by; printme = filter; filter &= cheat; cheat -= filter; if ( !print ) { add_buf ( buffer, "{Y------------------------------------------------------------------------------{x\n\r" ); add_buf ( buffer, "{cYou are affected by the following equipment spells:{x\n\r" ); print = TRUE; } strcpy ( buf3, affect_bit_name ( printme ) ); buf4 = buf3; buf4 = one_argument ( buf4, buf2 ); while ( buf2[0] ) { sprintf ( buf, "{cSpell: {g%-19s{c:{x %s", buf2, obj->short_descr ); add_buf ( buffer, buf ); add_buf ( buffer, "\n\r" ); buf4 = one_argument ( buf4, buf2 ); } } if ( !obj->enchanted ) { for ( paf = obj->pIndexData->affected; paf != NULL; paf = paf->next ) { if ( !IS_SET ( ch->affected_by, paf->bitvector ) ) continue; if ( paf->where != TO_AFFECTS ) continue; filter = paf->bitvector; filter &= ch->affected_by; printme = filter; filter &= cheat; cheat -= filter; if ( !print ) { add_buf ( buffer, "{cYou are affected by the following equipment spells:{x\n\r" ); print = TRUE; } strcpy ( buf3, affect_bit_name ( printme ) ); buf4 = buf3; buf4 = one_argument ( buf4, buf2 ); while ( buf2[0] ) { sprintf ( buf, "{cSpell: {g%-19s:{x %s", buf2, obj->short_descr ); add_buf ( buffer, buf ); add_buf ( buffer, "\n\r" ); buf4 = one_argument ( buf4, buf2 ); } } } } } found = TRUE; if ( print ) add_buf ( buffer, "\n\r" ); } /* if (cheat != 0) { add_buf(buffer,"{Y------------------------------------------------------------------------------{x\n\r"); add_buf(buffer,"{cYou are affected by the following immortal abilities:{x\n\r"); strcpy(buf3,affect_bit_name(cheat)); buf4=buf3; buf4= one_argument(buf4, buf2); while (buf2[0]) { sprintf( buf, "{cSpell: {W%-19s{x",buf2); add_buf(buffer, buf ); add_buf(buffer,"\n\r"); buf4 = one_argument(buf4,buf2); } found=TRUE; add_buf(buffer,"\n\r"); } */ if ( !found ) send_to_char ( "{cYou are not affected by any spells.{x\n\r", ch ); else { page_to_char ( buf_string ( buffer ), ch ); free_buf ( buffer ); } return; } char *const day_name[] = { "the Moon", "the Bull", "Deception", "Thunder", "Freedom", "the Great Gods", "the Sun" }; char *const month_name[] = { "Winter", "the Winter Wolf", "the Frost Giant", "the Old Forces", "the Grand Struggle", "the Spring", "Nature", "Futility", "the Dragon", "the Sun", "the Heat", "the Battle", "the Dark Shades", "the Shadows", "the Long Shadows", "the Ancient Darkness", "the Great Evil" }; CH_CMD ( do_time ) { char buf[MAX_STRING_LENGTH]; char *suf; int day; day = time_info.day + 1; if ( day > 4 && day < 20 ) suf = "th"; else if ( day % 10 == 1 ) suf = "st"; else if ( day % 10 == 2 ) suf = "nd"; else if ( day % 10 == 3 ) suf = "rd"; else suf = "th"; sprintf ( buf, "{cIt is {W%d{c o'clock {W%s{c, Day of {W%s{c,{W %d%s{c the Month of{W %s{c.{x\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 ( buf, ch ); sprintf ( buf, "{cDeath Rising started up at {W%s{x\n\r{cThe system time is {W%s{x\n\r", str_boot_time, ( char * ) ctime ( ¤t_time ) ); send_to_char ( buf, ch ); return; } CH_CMD ( do_weather ) { 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 ( "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 ( buf, ch ); return; } /* void do_help( CHAR_DATA *ch, char *argument ) { HELP_DATA *pHelp; char argall[MAX_INPUT_LENGTH],argone[MAX_INPUT_LENGTH]; char nohelp[MAX_STRING_LENGTH]; strcpy(nohelp, argument); if ( argument[0] == '\0' ) argument = "summary"; argall[0] = '\0'; while (argument[0] != '\0' ) { argument = one_argument(argument,argone); if (argall[0] != '\0') strcat(argall," "); strcat(argall,argone); } for ( pHelp = help_first; pHelp != NULL; pHelp = pHelp->next ) { if ( pHelp->level > get_trust( ch ) ) continue; if ( is_name( argall, pHelp->keyword ) ) { if ( pHelp->level >= 0 && str_cmp( argall, "imotd" ) ) { send_to_char( pHelp->keyword, ch ); send_to_char( "\n\r", ch ); } if ( pHelp->text[0] == '.' ) page_to_char( pHelp->text+1 ,ch ); else page_to_char( pHelp->text , ch ); return; } } send_to_char( "No help on that word.\n\r", ch ); append_file( ch, HELP_FILE, nohelp ); return; } */ CH_CMD ( do_help ) { HELP_DATA *pHelp; char argall[MAX_INPUT_LENGTH], argone[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH], part[MAX_STRING_LENGTH]; char nohelp[MAX_STRING_LENGTH]; char *output; int skill; bool fRegular = FALSE; if ( argument[0] == '\0' ) argument = "summary"; strcpy ( nohelp, argument ); /* this parts handles help a b so that it returns help 'a b' */ argall[0] = '\0'; while ( argument[0] != '\0' ) { argument = one_argument ( argument, argone ); if ( argall[0] != '\0' ) strcat ( argall, " " ); strcat ( argall, argone ); } for ( pHelp = help_first; pHelp != NULL; pHelp = pHelp->next ) { if ( pHelp->level > get_trust ( ch ) ) continue; if ( is_name ( argall, pHelp->keyword ) ) { if ( pHelp->level >= 0 ) { one_argument ( pHelp->keyword, part ); if ( ( skill = skill_lookup ( part ) ) != -1 ) { if ( skill_table[skill].spell_fun == spell_null ) { send_to_char ( "{D<{GS{gkill{D>{x", ch ); } else { int gn, sn; send_to_char ( "{D<{GS{gpell{D>{x", ch ); for ( gn = 0; gn < MAX_GROUP; gn++ ) for ( sn = 0; sn < MAX_IN_GROUP; sn++ ) { if ( group_table[gn].spells[sn] == NULL ) break; if ( !str_cmp ( part, group_table[gn].spells[sn] ) ) { sprintf ( buf, " {D<{GG{group{D: {G%s{D>", capitalize ( group_table[gn]. name ) ); send_to_char ( buf, ch ); } } } } else { send_to_char ( pHelp->keyword, ch ); } send_to_char ( "\n\r", ch ); fRegular = TRUE; } else if ( pHelp->level != -2 /*str_cmp(argall,"motd") && str_cmp(argall,"imotd") */ ) { send_to_char ( "{D<{GG{general {Gi{gnformation{D>{x\n\r", ch ); fRegular = TRUE; } output = malloc ( strlen ( pHelp->text ) + 200 ); strcpy ( output, "" ); if ( fRegular ) strcat ( output, "\n\r{D========================================================================================\n\r{x" ); /* * Strip leading '.' to allow initial blanks. */ /*if ( pHelp->text[0] == '.' ) page_to_char( pHelp->text+1, ch ); else page_to_char( pHelp->text , ch ); */ if ( pHelp->text[0] == '.' ) strcat ( output, pHelp->text + 1 ); else strcat ( output, pHelp->text ); if ( fRegular ) strcat ( output, "\n\r{D========================================================================================{x\n\r{x" ); page_to_char ( output, ch ); free ( output ); return; } } send_to_char ( "No help on that word.\n\r", ch ); append_file ( ch, HELP_FILE, nohelp ); return; } /* whois command */ CH_CMD ( do_whois ) { char arg[MAX_INPUT_LENGTH]; BUFFER *output; char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char clandat[MAX_STRING_LENGTH]; DESCRIPTOR_DATA *d; bool found = FALSE; one_argument ( argument, arg ); if ( arg[0] == '\0' ) { send_to_char ( "You must provide a name.\n\r", ch ); return; } output = new_buf ( ); for ( d = descriptor_list; d != NULL; d = d->next ) { CHAR_DATA *wch; char class[MAX_STRING_LENGTH]; if ( d->connected != CON_PLAYING || !can_see ( ch, d->character ) ) continue; wch = ( d->original != NULL ) ? d->original : d->character; if ( !can_see ( ch, wch ) ) continue; if ( !str_prefix ( arg, wch->name ) ) { found = TRUE; /* work out the printing */ sprintf ( buf2, "%3d", wch->level ); switch ( wch->level ) { case MAX_LEVEL - 0: sprintf ( buf2, "{WIMP{x" ); break; case MAX_LEVEL - 1: sprintf ( buf2, "{GCRE{x" ); break; case MAX_LEVEL - 2: sprintf ( buf2, "{GSUP{x" ); break; case MAX_LEVEL - 3: sprintf ( buf2, "{GDEI{x" ); break; case MAX_LEVEL - 4: sprintf ( buf2, "{GGOD{x" ); break; case MAX_LEVEL - 5: sprintf ( buf2, "{GIMM{x" ); break; case MAX_LEVEL - 6: sprintf ( buf2, "{GDEM{x" ); break; case MAX_LEVEL - 7: sprintf ( buf2, "{CKNI{x" ); break; case MAX_LEVEL - 8: sprintf ( buf2, "{CSQU{x" ); break; case MAX_LEVEL - 9: sprintf ( buf2, "{RA{rnc{x" ); break; case MAX_LEVEL - 10: sprintf ( buf2, "{CH{cro{x" ); break; } if ( IS_SET ( class_table[wch->class].tier, TIER_03 ) ) { sprintf ( class, "{R%c{r%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2] ); } else if ( IS_SET ( class_table[wch->class].tier, TIER_02 ) ) { sprintf ( class, "{Y%c{y%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2] ); } else if ( IS_SET ( class_table[wch->class].tier, TIER_04 ) ) { sprintf ( class, "{B%c{b%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2] ); } else { sprintf ( class, "{G%c{g%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2] ); } /* a little formatting */ if ( !is_clan ( wch ) ) { sprintf ( clandat, "%s", clan_table[wch->clan].who_name ); } else { if ( clan_table[wch->clan].independent ) { sprintf ( clandat, "{W[%s{W]{x ", clan_table[wch->clan].who_name ); } else if ( is_clead ( wch ) && is_pkill ( wch ) ) { sprintf ( clandat, "{R[{W<{GL{W>{x%s{R]{x ", clan_table[wch->clan].who_name ); } else if ( is_clead ( wch ) && !is_pkill ( wch ) ) { sprintf ( clandat, "{M[{W<{GL{W>{x%s{M]{x ", clan_table[wch->clan].who_name ); } else if ( is_pkill ( wch ) ) { sprintf ( clandat, "{R[{x%s{R]{x ", clan_table[wch->clan].who_name ); } else { sprintf ( clandat, "{M[%s{M]{x ", clan_table[wch->clan].who_name ); } } sprintf ( buf, "{c<{C<{x%s %-6s %s{C>{c>{x %s%s%s%s%s%s%s%s\n\r", buf2, wch->race < MAX_PC_RACE ? pc_race_table[wch->race]. who_name : " ", class, // ON_GQUEST(wch) ? "(GQuest)" : "", ( ( wch->ghost_level >= LEVEL_ANCIENT ) && ( ch->level >= wch->level ) ) ? "(Ghost) " : "", wch->incog_level >= LEVEL_ANCIENT ? "(Incog) " : "", wch->invis_level >= LEVEL_ANCIENT ? "(Wizi) " : "", clandat, IS_SET ( wch->comm, COMM_AFK ) ? "[{yAFK{x] " : "", IS_SET ( wch->act, PLR_TWIT ) ? "({RTWIT{x) " : "", wch->name, IS_NPC ( wch ) ? "" : wch->pcdata->title ); add_buf ( output, buf ); } } if ( !found ) { send_to_char ( "No one of that name is playing.\n\r", ch ); return; } page_to_char ( buf_string ( output ), ch ); free_buf ( output ); } /* * New 'who' command originally by Alander of Rivers of Mud. */ CH_CMD ( do_who ) { char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char clandat[MAX_STRING_LENGTH]; char questdat[MAX_STRING_LENGTH]; BUFFER *output; BUFFER *outputimm; DESCRIPTOR_DATA *d; int iClass; int iRace; int iClan; int iLevelLower; int iLevelUpper; int nNumber; int nMatch; bool rgfClass[MAX_CLASS]; bool rgfRace[MAX_PC_RACE]; bool rgfClan[MAX_CLAN]; bool fClassRestrict = FALSE; bool fClanRestrict = FALSE; bool fClan = FALSE; bool fRaceRestrict = FALSE; bool fImmortalOnly = FALSE; int count; int countimm; int hour; /* * Set default arguments. */ iLevelLower = 0; iLevelUpper = MAX_LEVEL; for ( iClass = 0; iClass < MAX_CLASS; iClass++ ) rgfClass[iClass] = FALSE; for ( iRace = 0; iRace < MAX_PC_RACE; iRace++ ) rgfRace[iRace] = FALSE; for ( iClan = 0; iClan < MAX_CLAN; iClan++ ) rgfClan[iClan] = FALSE; /* * Parse arguments. */ count = 0; countimm = 0; nNumber = 0; for ( ;; ) { char arg[MAX_STRING_LENGTH]; argument = one_argument ( argument, arg ); if ( arg[0] == '\0' ) break; if ( is_number ( arg ) ) { switch ( ++nNumber ) { case 1: iLevelLower = atoi ( arg ); break; case 2: iLevelUpper = atoi ( arg ); break; default: send_to_char ( "Only two level numbers allowed.\n\r", ch ); return; } } else { /* * Look for classes to turn on. */ if ( !str_prefix ( arg, "immortals" ) ) { fImmortalOnly = TRUE; } else { iClass = class_lookup ( arg ); if ( iClass == -1 ) { iRace = race_lookup ( arg ); if ( iRace == 0 || iRace >= MAX_PC_RACE ) { if ( !str_prefix ( arg, "clan" ) ) fClan = TRUE; else { iClan = clan_lookup ( arg ); if ( iClan ) { fClanRestrict = TRUE; rgfClan[iClan] = TRUE; } else { send_to_char ( "That's not a valid race, class, or clan.\n\r", ch ); return; } } } else { fRaceRestrict = TRUE; rgfRace[iRace] = TRUE; } } else { fClassRestrict = TRUE; rgfClass[iClass] = TRUE; } } } } /* * Now show matching chars. */ nMatch = 0; buf[0] = '\0'; output = new_buf ( ); outputimm = new_buf ( ); add_buf ( outputimm, "{W[{bIMM{BORT{bALS{W]{x\n\r" ); add_buf ( output, "{W[{rMOR{RT{rALS{W]{x\n\r" ); for ( d = descriptor_list; d != NULL; d = d->next ) { CHAR_DATA *wch; char class[MAX_STRING_LENGTH]; /* * Check for match against restrictions. * Don't use trust as that exposes trusted mortals. */ if ( d->connected != CON_PLAYING || !can_see ( ch, d->character ) ) continue; wch = ( d->original != NULL ) ? d->original : d->character; if ( !can_see ( ch, wch ) && IS_SHIELDED ( wch, SHD_INVISIBLE ) ) continue; if ( !can_see ( ch, wch ) && wch->level >= SQUIRE && ch->level < wch->level ) continue; if ( !IS_IMMORTAL ( wch ) ) continue; if ( wch->level < iLevelLower || wch->level > iLevelUpper || ( fImmortalOnly && wch->level < LEVEL_IMMORTAL ) || ( fClassRestrict && !rgfClass[wch->class] ) || ( fRaceRestrict && !rgfRace[wch-> race] ) || ( fClan && !is_clan ( wch ) ) || ( fClanRestrict && !rgfClan[wch->clan] ) ) continue; countimm++; nMatch++; /* * Figure out what to print for class. */ sprintf ( buf2, "%3d", wch->level ); switch ( wch->level ) { default: break; { case MAX_LEVEL - 0: sprintf ( buf2, "{WIMP{x" ); break; case MAX_LEVEL - 1: sprintf ( buf2, "{GCRE{x" ); break; case MAX_LEVEL - 2: sprintf ( buf2, "{GSUP{x" ); break; case MAX_LEVEL - 3: sprintf ( buf2, "{GDEI{x" ); break; case MAX_LEVEL - 4: sprintf ( buf2, "{GGOD{x" ); break; case MAX_LEVEL - 5: sprintf ( buf2, "{GIMM{x" ); break; case MAX_LEVEL - 6: sprintf ( buf2, "{GDEM{x" ); break; case MAX_LEVEL - 7: sprintf ( buf2, "{CKNI{x" ); break; case MAX_LEVEL - 8: sprintf ( buf2, "{CSQU{x" ); break; } } if ( IS_SET ( class_table[wch->class].tier, TIER_03 ) ) { sprintf ( class, "{R%c{r%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2] ); } else if ( IS_SET ( class_table[wch->class].tier, TIER_04 ) ) { sprintf ( class, "{B%c{b%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2] ); } else { sprintf ( class, "{G%c{g%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2] ); } /* * Format it up. */ if ( !wch->on_quest ) { questdat[0] = '\0'; } else { sprintf ( questdat, "[{GQ{x] " ); } if ( !is_clan ( wch ) ) { sprintf ( clandat, "%s", clan_table[wch->clan].who_name ); } else { if ( clan_table[wch->clan].independent ) { sprintf ( clandat, "[%s{x] ", clan_table[wch->clan].who_name ); } else if ( is_clead ( wch ) && is_pkill ( wch ) ) { sprintf ( clandat, "{R[{W<{GL{W>{x%s{R]{x ", clan_table[wch->clan].who_name ); } else if ( is_clead ( wch ) && !is_pkill ( wch ) ) { sprintf ( clandat, "{M[{W<{GL{W>{x%s{M]{x ", clan_table[wch->clan].who_name ); } else if ( is_pkill ( wch ) ) { sprintf ( clandat, "{R[{x%s{R]{x ", clan_table[wch->clan].who_name ); } else { sprintf ( clandat, "{M[{x%s{M]{x ", clan_table[wch->clan].who_name ); } } if ( wch->pcdata->who_descr[0] != '\0' ) { sprintf ( buf, "{b<{B<{x%s %s{B>{b>{x %s%s%s%s%s%s%s%s%s%s%s{x\n\r", buf2, wch->pcdata->who_descr, questdat, // ON_GQUEST(wch) ? "(GQuest)" : "", clandat, IS_SET ( wch->act2, PLR2_CHALLENGED ) ? "{W[{RARENA{W]{x " : "", IS_SET ( wch->act2, PLR2_CHALLENGER ) ? "{W[{RARENA{W]{x " : "", ( ( wch->ghost_level >= LEVEL_ANCIENT ) && ( ch->level >= wch->level ) ) ? "({bGhost{x){x " : "", wch->incog_level >= LEVEL_ANCIENT ? "({DIncog{x) " : "", wch->invis_level >= LEVEL_ANCIENT ? "({WWizi{x) " : "", IS_SET ( wch->comm, COMM_AFK ) ? "[{yA{YF{yK{x] " : "", IS_SET ( wch->act, PLR_TWIT ) ? "({RTWIT{x) " : "", wch->name, IS_NPC ( wch ) ? "" : wch->pcdata->title ); } else { sprintf ( buf, "{b<{B<{x%s %-6s %s{B>{b>{x %s%s%s%s%s%s%s%s%s%s%s\n\r", buf2, wch->race < MAX_PC_RACE ? pc_race_table[wch->race]. who_name : " ", class, questdat, // ON_GQUEST(wch) ? "(GQuest)" : "", IS_SET ( wch->act2, PLR2_CHALLENGED ) ? "{W[{RARENA{W]{x " : "", IS_SET ( wch->act2, PLR2_CHALLENGER ) ? "{W[{RARENA{W]{x " : "", clandat, ( ( wch->ghost_level >= LEVEL_ANCIENT ) && ( ch->level >= wch->level ) ) ? "({bGhost{x) " : "", wch->incog_level >= LEVEL_ANCIENT ? "({DIncog{x) " : "", wch->invis_level >= LEVEL_ANCIENT ? "({WWizi{x) " : "", IS_SET ( wch->comm, COMM_AFK ) ? "[{yA{YF{yK{x] " : "", IS_SET ( wch->act, PLR_TWIT ) ? "({RTWIT{x) " : "", wch->name, IS_NPC ( wch ) ? "" : wch->pcdata->title ); } add_buf ( outputimm, buf ); } add_buf ( outputimm, "\n\r" ); buf[0] = '\0'; for ( d = descriptor_list; d != NULL; d = d->next ) { CHAR_DATA *wch; char class[MAX_STRING_LENGTH]; /* * Check for match against restrictions. * Don't use trust as that exposes trusted mortals. */ if ( d->connected != CON_PLAYING || !can_see ( ch, d->character ) ) continue; wch = ( d->original != NULL ) ? d->original : d->character; if ( !can_see ( ch, wch ) && IS_SHIELDED ( wch, SHD_INVISIBLE ) ) continue; if ( !can_see ( ch, wch ) && wch->level >= SQUIRE && ch->level < wch->level ) continue; if ( IS_IMMORTAL ( wch ) ) continue; count++; if ( ( wch->in_room->vnum == ROOM_VNUM_CORNER ) && ( !IS_IMMORTAL ( ch ) ) ) continue; if ( wch->level < iLevelLower || wch->level > iLevelUpper || ( fImmortalOnly && wch->level < LEVEL_IMMORTAL ) || ( fClassRestrict && !rgfClass[wch->class] ) || ( fRaceRestrict && !rgfRace[wch-> race] ) || ( fClan && !is_clan ( wch ) ) || ( fClanRestrict && !rgfClan[wch->clan] ) ) continue; nMatch++; /* * Figure out what to print for class. */ sprintf ( buf2, "%3d", wch->level ); switch ( wch->level ) { default: break; { case MAX_LEVEL - 9: sprintf ( buf2, "{RA{rnc{x" ); break; case MAX_LEVEL - 10: sprintf ( buf2, "{CH{cro{x" ); break; } } if ( IS_SET ( class_table[wch->class].tier, TIER_03 ) ) { sprintf ( class, "{R%c{r%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2] ); } else if ( IS_SET ( class_table[wch->class].tier, TIER_02 ) ) { sprintf ( class, "{Y%c{y%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2] ); } else if ( IS_SET ( class_table[wch->class].tier, TIER_04 ) ) { sprintf ( class, "{B%c{b%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2] ); } else { sprintf ( class, "{G%c{g%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2] ); } /* if (wch->class < MAX_CLASS/2) { sprintf(class, "{G%c{g%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2]); } else { sprintf(class, "{Y%c{y%c%c{x", class_table[wch->class].who_name[0], class_table[wch->class].who_name[1], class_table[wch->class].who_name[2]); }*/ /* * Format it up. */ if ( !wch->on_quest ) { questdat[0] = '\0'; } else { sprintf ( questdat, "[{GQ{x] " ); } if ( !is_clan ( wch ) ) { sprintf ( clandat, "%s", clan_table[wch->clan].who_name ); } else { if ( clan_table[wch->clan].independent ) { sprintf ( clandat, "[%s{x] ", clan_table[wch->clan].who_name ); } else if ( is_clead ( wch ) && is_pkill ( wch ) ) { sprintf ( clandat, "{R[{W<{GL{W>{x%s{R]{x ", clan_table[wch->clan].who_name ); } else if ( is_clead ( wch ) && !is_pkill ( wch ) ) { sprintf ( clandat, "{M[{W<{GL{W>{x%s{M] ", clan_table[wch->clan].who_name ); } else if ( is_pkill ( wch ) ) { sprintf ( clandat, "{R[{x%s{R]{x ", clan_table[wch->clan].who_name ); } else { sprintf ( clandat, "{M[%s{M]{x ", clan_table[wch->clan].who_name ); } } if ( wch->pcdata->who_descr[0] != '\0' ) { sprintf ( buf, "{r<{R<{x%s %s{R>{r>{x %s%s%s%s%s%s%s%s%s%s%s{x\n\r", buf2, wch->pcdata->who_descr, questdat, // ON_GQUEST(wch) ? "(GQuest)" : "", IS_SET ( wch->act2, PLR2_CHALLENGED ) ? "{W[{RARENA{W]{x " : "", IS_SET ( wch->act2, PLR2_CHALLENGER ) ? "{W[{RARENA{W]{x " : "", clandat, ( ( wch->ghost_level >= LEVEL_ANCIENT ) && ( ch->level >= wch->level ) ) ? "({bGhost{x) " : "", wch->incog_level >= LEVEL_ANCIENT ? "({DIncog{x) " : "", wch->invis_level >= LEVEL_ANCIENT ? "({WWizi{x) " : "", IS_SET ( wch->comm, COMM_AFK ) ? "[{yA{YF{yK{x] " : "", IS_SET ( wch->act, PLR_TWIT ) ? "({RTWIT{x) " : "", wch->name, IS_NPC ( wch ) ? "" : wch->pcdata->title ); } else { sprintf ( buf, "{r<{R<{x%s %-6s %s{R>{r>{x %s%s%s%s%s%s%s%s%s%s%s{x\n\r", buf2, wch->race < MAX_PC_RACE ? pc_race_table[wch->race]. who_name : " ", class, questdat, //ON_GQUEST(wch) ? "(GQuest)" : "", IS_SET ( wch->act2, PLR2_CHALLENGED ) ? "{W[{RARENA{W]{x " : "", IS_SET ( wch->act2, PLR2_CHALLENGER ) ? "{W[{RARENA{W]{x " : "", clandat, ( ( wch->ghost_level >= LEVEL_ANCIENT ) && ( ch->level >= wch->level ) ) ? "({bGhost{x) " : "", wch->incog_level >= LEVEL_ANCIENT ? "({DIncog{x) " : "", wch->invis_level >= LEVEL_ANCIENT ? "({WWizi{x) " : "", IS_SET ( wch->comm, COMM_AFK ) ? "[{yA{YF{yK{x] " : "", IS_SET ( wch->act, PLR_TWIT ) ? "({RTWIT{x) " : "", wch->name, IS_NPC ( wch ) ? "" : wch->pcdata->title ); } add_buf ( output, buf ); } count += countimm; hour = ( int ) ( struct tm * ) localtime ( ¤t_time )->tm_hour; if ( hour < 12 ) { if ( is_pm ) { is_pm = FALSE; max_on = 0; expire_notes ( ); randomize_entrances ( ROOM_VNUM_CLANS ); } } else { is_pm = TRUE; } max_on = UMAX ( count, max_on ); if ( global_quest ) { sprintf ( buf2, "\n\r{RThe global quest flag is {Won.{x{x" ); add_buf ( output, buf2 ); } /* if (!ON_GQUEST(ch) && gquest_info.minlevel < ch->level && gquest_info.maxlevel > ch->level) add_buf(output, "{WThere is a Global {MQuest {Wrunning you can join.{x\n\r"); */ if ( double_qp ) { sprintf ( buf2, "\n\r{WThe double qp flag is {Yon.{x{x" ); add_buf ( output, buf2 ); } if ( double_exp ) { sprintf ( buf2, "\n\r{WThe double exp flag is {Yon.{x{x" ); add_buf ( output, buf2 ); } if ( nMatch != count ) { sprintf ( buf2, "\n\r{RMatches found: {W%d{x\n\r", nMatch ); add_buf ( output, buf2 ); } else { sprintf ( buf2, "\n\r{WPlayers found{x : {Y%d\n\r{WImmortals found{x :{Y %d\n\r{WMost on today{x : {Y%d{x\n\r", count, countimm, max_on ); add_buf ( output, buf2 ); } if ( countimm >= 1 ) { add_buf ( outputimm, buf_string ( output ) ); page_to_char ( buf_string ( outputimm ), ch ); } else { page_to_char ( buf_string ( output ), ch ); } free_buf ( output ); free_buf ( outputimm ); return; } CH_CMD ( do_count ) { int count; int hour; DESCRIPTOR_DATA *d; char buf[MAX_STRING_LENGTH]; count = 0; hour = ( int ) ( struct tm * ) localtime ( ¤t_time )->tm_hour; if ( hour < 12 ) { if ( is_pm ) { is_pm = FALSE; max_on = 0; expire_notes ( ); randomize_entrances ( ROOM_VNUM_CLANS ); } } else { is_pm = TRUE; } for ( d = descriptor_list; d != NULL; d = d->next ) if ( d->connected == CON_PLAYING && can_see ( ch, d->character ) ) count++; max_on = UMAX ( count, max_on ); if ( max_on == count ) sprintf ( buf, "{BThere are {W%d {Bcharacters on, the most so far today.{x\n\r", count ); else sprintf ( buf, "{BThere are {W%d {Bcharacters on, the most on today was {W%d{x.\n\r", count, max_on ); send_to_char ( buf, ch ); } CH_CMD ( do_inventory ) { BUFFER *outlist; send_to_char ( "You are carrying:\n\r", ch ); outlist = show_list_to_char ( ch->carrying, ch, TRUE, TRUE ); page_to_char ( buf_string ( outlist ), ch ); free_buf ( outlist ); return; } CH_CMD ( do_equipment ) { OBJ_DATA *obj; int iWear; int oWear; bool found; send_to_char ( "You are using:\n\r", ch ); found = FALSE; for ( oWear = 0; oWear < MAX_WEAR; oWear++ ) { iWear = where_order[oWear]; send_to_char ( where_name[iWear], ch ); if ( ( obj = get_eq_char ( ch, iWear ) ) == NULL ) { send_to_char ( "{W[{BE{bmpt{By{W]{x\n\r", ch ); } else if ( can_see_obj ( ch, obj ) ) { send_to_char ( format_obj_to_char ( obj, ch, TRUE ), ch ); send_to_char ( "\n\r", ch ); } else { send_to_char ( "something.\n\r", ch ); } found = TRUE; } if ( !found ) send_to_char ( "Nothing.\n\r", ch ); return; } CH_CMD ( do_compare ) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; OBJ_DATA *obj1; OBJ_DATA *obj2; int value1; int value2; char *msg; argument = one_argument ( argument, arg1 ); argument = one_argument ( argument, arg2 ); if ( arg1[0] == '\0' ) { send_to_char ( "Compare what to what?\n\r", ch ); return; } if ( ( obj1 = get_obj_carry ( ch, arg1 ) ) == NULL ) { send_to_char ( "You do not have that item.\n\r", ch ); return; } if ( arg2[0] == '\0' ) { for ( obj2 = ch->carrying; obj2 != NULL; 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 == NULL ) { send_to_char ( "You aren't wearing anything comparable.\n\r", ch ); return; } } else if ( ( obj2 = get_obj_carry ( ch, arg2 ) ) == NULL ) { send_to_char ( "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: if ( obj1->clan ) { value1 = apply_ac ( ch->level, obj1, WEAR_HOLD, 0 ); value1 += apply_ac ( ch->level, obj1, WEAR_HOLD, 1 ); value1 += apply_ac ( ch->level, obj1, WEAR_HOLD, 2 ); } else { value1 = obj1->value[0] + obj1->value[1] + obj1->value[2]; } if ( obj2->clan ) { value2 = apply_ac ( ch->level, obj2, WEAR_HOLD, 0 ); value2 += apply_ac ( ch->level, obj2, WEAR_HOLD, 1 ); value2 += apply_ac ( ch->level, obj2, WEAR_HOLD, 2 ); } else { value2 = obj2->value[0] + obj2->value[1] + obj2->value[2]; } break; case ITEM_WEAPON: if ( obj1->clan ) { value1 = 4 * ( ch->level / 3 ); } else { if ( obj1->pIndexData->new_format ) value1 = ( 1 + obj1->value[2] ) * obj1->value[1]; else value1 = obj1->value[1] + obj1->value[2]; } if ( obj2->clan ) { value2 = 4 * ( ch->level / 3 ); } else { if ( obj2->pIndexData->new_format ) value2 = ( 1 + obj2->value[2] ) * obj2->value[1]; else value2 = obj2->value[1] + obj2->value[2]; } break; } } if ( msg == NULL ) { 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 ( msg, ch, obj1, obj2, TO_CHAR ); return; } CH_CMD ( do_credits ) { do_help ( ch, "diku" ); return; } CH_CMD ( do_where ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; DESCRIPTOR_DATA *d; bool found; one_argument ( argument, arg ); if ( arg[0] == '\0' ) { send_to_char ( "Players near you:\n\r", ch ); found = FALSE; for ( d = descriptor_list; d; d = d->next ) { if ( d->connected == CON_PLAYING && ( victim = d->character ) != NULL && !IS_NPC ( victim ) && victim->in_room != NULL && !IS_SET ( victim->in_room->room_flags, ROOM_NOWHERE ) && ( is_room_owner ( ch, victim->in_room ) || !room_is_private ( ch, victim->in_room ) ) && victim->in_room->area == ch->in_room->area && get_trust ( ch ) >= victim->ghost_level && can_see ( ch, victim ) ) { found = TRUE; sprintf ( buf, "%-28s %s\n\r", victim->name, victim->in_room->name ); send_to_char ( buf, ch ); } } if ( !found ) send_to_char ( "None\n\r", ch ); } else { found = FALSE; for ( victim = char_list; victim != NULL; victim = victim->next ) { if ( victim->in_room != NULL && victim->in_room->area == ch->in_room->area && !IS_AFFECTED ( victim, AFF_HIDE ) && !IS_AFFECTED ( victim, AFF_SNEAK ) && get_trust ( ch ) >= victim->ghost_level && can_see ( ch, victim ) && is_name ( arg, victim->name ) ) { found = TRUE; sprintf ( buf, "%-28s %s\n\r", PERS ( victim, ch ), victim->in_room->name ); send_to_char ( buf, ch ); break; } } if ( !found ) act ( "You didn't find any $T.", ch, NULL, arg, TO_CHAR ); } return; } CH_CMD ( do_track ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; EXIT_DATA *pexit; ROOM_INDEX_DATA *in_room; long track_vnum; int door, move, chance, track; one_argument ( argument, arg ); if ( ( chance = get_skill ( ch, gsn_track ) ) == 0 ) { send_to_char ( "You don't know how to track.\n\r", ch ); return; } if ( arg[0] == '\0' ) { send_to_char ( "Track whom?\n\r", ch ); return; } in_room = ch->in_room; track_vnum = in_room->vnum; move = movement_loss[UMIN ( SECT_MAX - 1, in_room->sector_type )]; if ( ch->move < move ) { send_to_char ( "You are too exhausted.\n\r", ch ); return; } if ( number_percent ( ) < ( 100 - chance ) ) { sprintf ( buf, "You can find no recent tracks for %s.\n\r", arg ); send_to_char ( buf, ch ); check_improve ( ch, gsn_track, FALSE, 1 ); WAIT_STATE ( ch, 1 ); ch->move -= move / 2; return; } for ( victim = char_list; victim != NULL; victim = victim->next ) { if ( victim->in_room != NULL && !IS_NPC ( victim ) && can_see ( ch, victim ) && is_name ( arg, victim->name ) ) { if ( victim->in_room->vnum == track_vnum ) { act ( "The tracks end right under $S feet.", ch, NULL, victim, TO_CHAR ); return; } for ( track = 0; track < MAX_TRACK; track++ ) { if ( victim->track_from[track] == track_vnum ) { for ( door = 0; door < 12; door++ ) { if ( ( pexit = in_room->exit[door] ) != NULL ) { if ( pexit->u1.to_room->vnum == victim->track_to[track] ) { sprintf ( buf, "Some tracks lead off to the %s.\n\r", dir_name[door] ); send_to_char ( buf, ch ); check_improve ( ch, gsn_track, TRUE, 1 ); WAIT_STATE ( ch, 1 ); ch->move -= move; return; } } } act ( "$N seems to have vanished here.", ch, NULL, victim, TO_CHAR ); check_improve ( ch, gsn_track, TRUE, 1 ); WAIT_STATE ( ch, 1 ); ch->move -= move; return; } } act ( "You can find no recent tracks for $N.", ch, NULL, victim, TO_CHAR ); check_improve ( ch, gsn_track, FALSE, 1 ); WAIT_STATE ( ch, 1 ); ch->move -= move / 2; return; } } for ( victim = char_list; victim != NULL; victim = victim->next ) { if ( ( victim->in_room != NULL ) && IS_NPC ( victim ) && can_see ( ch, victim ) && ( victim->in_room->area == ch->in_room->area ) && is_name ( arg, victim->name ) ) { if ( victim->in_room->vnum == track_vnum ) { act ( "The tracks end right under $S feet.", ch, NULL, victim, TO_CHAR ); return; } for ( track = 0; track < MAX_TRACK; track++ ) { if ( victim->track_from[track] == track_vnum ) { for ( door = 0; door < 12; door++ ) { if ( ( pexit = in_room->exit[door] ) != NULL ) { if ( pexit->u1.to_room->vnum == victim->track_to[track] ) { sprintf ( buf, "Some tracks lead off to the %s.\n\r", dir_name[door] ); send_to_char ( buf, ch ); check_improve ( ch, gsn_track, TRUE, 1 ); WAIT_STATE ( ch, 1 ); ch->move -= move; return; } } } act ( "$N seems to have vanished here.", ch, NULL, victim, TO_CHAR ); check_improve ( ch, gsn_track, TRUE, 1 ); WAIT_STATE ( ch, 1 ); ch->move -= move; return; } } } } sprintf ( buf, "You can find no recent tracks for %s.\n\r", arg ); send_to_char ( buf, ch ); check_improve ( ch, gsn_track, FALSE, 1 ); WAIT_STATE ( ch, 1 ); ch->move -= move / 2; return; } CH_CMD ( do_consider ) { // BUFFER *output; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; char *msg; int diff, vac, cac; char buf[MAX_STRING_LENGTH]; one_argument ( argument, arg ); if ( arg[0] == '\0' ) { send_to_char ( "Consider killing whom?\n\r", ch ); return; } if ( ( victim = get_char_room ( ch, arg ) ) == NULL ) { send_to_char ( "They're not here.\n\r", ch ); return; } if ( is_safe ( ch, victim ) ) { send_to_char ( "Don't even think about it.\n\r", ch ); return; } diff = ( ( victim->hit / 50 ) - ( ch->hit / 50 ) ); vac = -( GET_AC ( victim, AC_PIERCE ) + GET_AC ( victim, AC_BASH ) + GET_AC ( victim, AC_SLASH ) + GET_AC ( victim, AC_EXOTIC ) ); cac = -( GET_AC ( ch, AC_PIERCE ) + GET_AC ( ch, AC_BASH ) + GET_AC ( ch, AC_SLASH ) + GET_AC ( ch, AC_EXOTIC ) ); diff += ( vac - cac ); diff += ( GET_DAMROLL ( victim ) - GET_DAMROLL ( ch ) ); diff += ( GET_HITROLL ( victim ) - GET_HITROLL ( ch ) ); diff += ( get_curr_stat ( victim, STAT_STR ) - get_curr_stat ( ch, STAT_STR ) ); if ( diff <= -110 ) msg = "You can kill $N naked and weaponless."; else if ( diff <= -70 ) msg = "$N is no match for you."; else if ( diff <= -20 ) msg = "$N looks like an easy kill."; else if ( diff <= 20 ) msg = "$N can hold $S own against you."; else if ( diff <= 70 ) msg = "$N says '{aDo you feel lucky, punk?{x'."; else if ( diff <= 110 ) msg = "$N laughs at you mercilessly."; else msg = "Death will thank you for your gift."; act ( msg, ch, NULL, victim, TO_CHAR ); sprintf ( buf, "Hp: %ld/%ld Mana: %ld/%ld Lv: %d Align: %d\n\r", victim->hit, victim->max_hit, victim->mana, victim->max_mana, victim->level, victim->alignment ); send_to_char ( buf, ch ); if ( victim->imm_flags ) { sprintf ( buf, "Immune: %s\n\r", imm_bit_name ( victim->imm_flags ) ); send_to_char ( buf, ch ); } if ( victim->res_flags ) { sprintf ( buf, "Resist: %s\n\r", imm_bit_name ( victim->res_flags ) ); send_to_char ( buf, ch ); } if ( victim->vuln_flags ) { sprintf ( buf, "Vulnerable: %s\n\r", imm_bit_name ( victim->vuln_flags ) ); send_to_char ( buf, ch ); } return; } void set_title ( CHAR_DATA * ch, char *title ) { char buf[MAX_STRING_LENGTH]; if ( IS_NPC ( ch ) ) { bug ( "Set_title: NPC.", 0 ); return; } if ( title[0] != '.' && title[0] != ',' && title[0] != '!' && title[0] != '?' ) { buf[0] = ' '; strcpy ( buf + 1, title ); } else { strcpy ( buf, title ); } free_string ( ch->pcdata->title ); ch->pcdata->title = str_dup ( buf ); return; } CH_CMD ( do_title ) { int value; if ( IS_NPC ( ch ) ) return; if ( IS_SET ( ch->act, PLR_NOTITLE ) ) return; if ( ( ch->in_room->vnum == ROOM_VNUM_CORNER ) && ( !IS_IMMORTAL ( ch ) ) ) { send_to_char ( "Just keep your nose in the corner like a good little player.\n\r", ch ); return; } if ( argument[0] == '\0' ) { send_to_char ( "Change your title to what?\n\r", ch ); return; } if ( strlen ( argument ) > 45 ) { argument[45] = '{'; argument[46] = 'x'; argument[47] = '\0'; } else { value = strlen ( argument ); argument[value] = '{'; argument[value + 1] = 'x'; argument[value + 2] = '\0'; } smash_tilde ( argument ); set_title ( ch, argument ); send_to_char ( "Ok.\n\r", ch ); } CH_CMD ( do_description ) { char buf[MAX_STRING_LENGTH]; if ( argument[0] != '\0' ) { buf[0] = '\0'; smash_tilde ( argument ); if ( argument[0] == '-' ) { int len; bool found = FALSE; if ( ch->description == NULL || ch->description[0] == '\0' ) { send_to_char ( "No lines left to remove.\n\r", ch ); return; } strcpy ( buf, ch->description ); for ( len = strlen ( buf ); len > 0; len-- ) { if ( buf[len] == '\r' ) { if ( !found ) /* back it up */ { if ( len > 0 ) len--; found = TRUE; } else /* found the second one */ { buf[len + 1] = '\0'; free_string ( ch->description ); ch->description = str_dup ( buf ); send_to_char ( "Your description is:\n\r", ch ); send_to_char ( ch->description ? ch-> description : "(None).\n\r", ch ); return; } } } buf[0] = '\0'; free_string ( ch->description ); ch->description = str_dup ( buf ); send_to_char ( "Description cleared.\n\r", ch ); return; } if ( argument[0] == '+' ) { if ( ch->description != NULL ) strcat ( buf, ch->description ); argument++; while ( isspace ( *argument ) ) argument++; } if ( strlen ( buf ) + strlen ( argument ) >= MAX_STRING_LENGTH - 2 ) { send_to_char ( "Description too long.\n\r", ch ); return; } strcat ( buf, argument ); strcat ( buf, "\n\r" ); free_string ( ch->description ); ch->description = str_dup ( buf ); } send_to_char ( "Your description is:\n\r", ch ); send_to_char ( ch->description ? ch->description : "(None).\n\r", ch ); return; } CH_CMD ( do_report ) { char buf[MAX_INPUT_LENGTH]; sprintf ( buf, "You say '{SI have %ld/%ld hp %ld/%ld mana %ld/%ld mv %ld xp.{x'\n\r", ch->hit, ch->max_hit, ch->mana, ch->max_mana, ch->move, ch->max_move, ch->exp ); send_to_char ( buf, ch ); sprintf ( buf, "$n says '{SI have %ld/%ld hp %ld/%ld mana %ld/%ld mv %ld xp.{x'", ch->hit, ch->max_hit, ch->mana, ch->max_mana, ch->move, ch->max_move, ch->exp ); act ( buf, ch, NULL, NULL, TO_ROOM ); return; } CH_CMD ( do_practice ) { char buf[MAX_STRING_LENGTH]; int sn; if ( IS_NPC ( ch ) ) return; if ( argument[0] == '\0' ) { int col; col = 0; for ( sn = 0; sn < MAX_SKILL; sn++ ) { if ( skill_table[sn].name == NULL ) break; if ( ch->level < skill_table[sn].skill_level[ch->class] || ch->pcdata->learned[sn] < 1 /* skill is not known */ ) continue; sprintf ( buf, "{g%4d%%{w: {W%-17s{w|", ch->pcdata->learned[sn], skill_table[sn].name ); /*skill_table[sn].name, ch->pcdata->learned[sn] ); */ send_to_char ( buf, ch ); if ( ++col % 3 == 0 ) send_to_char ( "\n\r", ch ); } if ( col % 3 != 0 ) send_to_char ( "\n\r", ch ); sprintf ( buf, "{xYou have {R%d{x practice sessions left.\n\r", ch->practice ); send_to_char ( buf, ch ); } else { CHAR_DATA *mob; int adept; if ( !IS_AWAKE ( ch ) ) { send_to_char ( "In your dreams, or what?\n\r", ch ); return; } for ( mob = ch->in_room->people; mob != NULL; mob = mob->next_in_room ) { if ( IS_NPC ( mob ) && IS_SET ( mob->act, ACT_PRACTICE ) ) break; } if ( mob == NULL ) { send_to_char ( "You can't do that here.\n\r", ch ); return; } if ( ch->practice <= 0 ) { send_to_char ( "You have no practice sessions left.\n\r", ch ); return; } if ( ( sn = find_spell ( ch, argument ) ) < 0 || ( !IS_NPC ( ch ) && ( ch->level < skill_table[sn].skill_level[ch->class] || ch->pcdata->learned[sn] < 1 /* skill is not known */ || skill_table [sn]. rating [ch-> class] == 0 ) ) ) { send_to_char ( "You can't practice that.\n\r", ch ); return; } adept = IS_NPC ( ch ) ? 100 : class_table[ch->class].skill_adept; if ( ch->pcdata->learned[sn] >= adept ) { sprintf ( buf, "You are already learned at %s.\n\r", skill_table[sn].name ); send_to_char ( buf, ch ); } else { ch->practice--; ch->pcdata->learned[sn] += int_app[get_curr_stat ( ch, STAT_INT )].learn / skill_table[sn].rating[ch->class]; if ( ch->pcdata->learned[sn] < adept ) { act ( "You practice $T.", ch, NULL, skill_table[sn].name, TO_CHAR ); act ( "$n practices $T.", ch, NULL, skill_table[sn].name, TO_ROOM ); } else { ch->pcdata->learned[sn] = adept; act ( "You are now learned at $T.", ch, NULL, skill_table[sn].name, TO_CHAR ); act ( "$n is now learned at $T.", ch, NULL, skill_table[sn].name, TO_ROOM ); } } } return; } /* * 'Wimpy' originally by Dionysos. */ CH_CMD ( do_wimpy ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; int wimpy; one_argument ( argument, arg ); if ( arg[0] == '\0' ) wimpy = ch->max_hit / 5; else wimpy = atoi ( arg ); if ( wimpy < 0 ) { send_to_char ( "Your courage exceeds your wisdom.\n\r", ch ); return; } if ( wimpy > ch->max_hit / 2 ) { send_to_char ( "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 ( buf, ch ); return; } CH_CMD ( do_password ) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char *pArg; char *pwdnew; char *p; 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 ( "Syntax: password <old> <new>.\n\r", ch ); return; } if ( str_cmp ( crypt ( arg1, ch->pcdata->pwd ), ch->pcdata->pwd ) ) { WAIT_STATE ( ch, 40 ); send_to_char ( "Wrong password. Wait 10 seconds.\n\r", ch ); return; } if ( strlen ( arg2 ) < 5 ) { send_to_char ( "New password must be at least five characters long.\n\r", ch ); return; } /* * No tilde allowed because of player file format. */ pwdnew = crypt ( arg2, ch->name ); for ( p = pwdnew; *p != '\0'; p++ ) { if ( *p == '~' ) { send_to_char ( "New password not acceptable, try again.\n\r", ch ); return; } } free_string ( ch->pcdata->pwd ); ch->pcdata->pwd = str_dup ( pwdnew ); save_char_obj ( ch ); send_to_char ( "Ok.\n\r", ch ); return; } CH_CMD ( do_autoall ) { if ( IS_NPC ( ch ) ) return; SET_BIT ( ch->act, PLR_AUTOASSIST ); SET_BIT ( ch->act, PLR_AUTOEXIT ); SET_BIT ( ch->act, PLR_AUTOGOLD ); SET_BIT ( ch->act, PLR_AUTOLOOT ); SET_BIT ( ch->act, PLR_AUTOSAC ); SET_BIT ( ch->act, PLR_AUTOSPLIT ); send_to_char ( "All autos turned on.\n\r", ch ); } CH_CMD ( do_omni ) { char buf[MAX_STRING_LENGTH * 100]; char buf2[MAX_STRING_LENGTH * 100]; BUFFER *output; DESCRIPTOR_DATA *d; int immmatch; int mortmatch; int hptemp; /* * Initalize Variables. */ immmatch = 0; mortmatch = 0; buf[0] = '\0'; output = new_buf ( ); /* * Count and output the IMMs. */ sprintf ( buf, "{D-{w={D-{w={D-{w={D-{w={D-{w={D-{W>{RImmortals{W<{D-{w={D-{w={D-{w={D-{w={D-{w={D-{x\n\r" ); add_buf ( output, buf ); sprintf ( buf, "{GName {YLevel {WWiz {rIncog {w[{RVnum{w]{x\n\r" ); add_buf ( output, buf ); for ( d = descriptor_list; d != NULL; d = d->next ) { CHAR_DATA *wch; if ( d->connected != CON_PLAYING || !can_see ( ch, d->character ) ) continue; wch = ( d->original != NULL ) ? d->original : d->character; if ( !can_see ( ch, wch ) || wch->level < 203 ) continue; immmatch++; sprintf ( buf, "{G%-14s {Y%-3d {W%-3d {r%-3d{w [{R%-6ld{w]{x\n\r", wch->name, wch->level, wch->invis_level, wch->incog_level, wch->in_room->vnum ); add_buf ( output, buf ); } /* * Count and output the Morts. */ sprintf ( buf, "\n\r{D-{w={D-{w={D-{w={D-{w={D-{w={D-{W>{RMortals{W<{w-{D={w-{D={w-{D={w-{D={w-{D={w-\n\r" ); add_buf ( output, buf ); sprintf ( buf, "{GName {DRace{w/{YClass {gPosition {mLevel {R%%hps {w[{yVnum{w]{x\n\r" ); add_buf ( output, buf ); hptemp = 0; for ( d = descriptor_list; d != NULL; d = d->next ) { CHAR_DATA *wch; char const *class; if ( d->connected != CON_PLAYING || !can_see ( ch, d->character ) ) continue; wch = ( d->original != NULL ) ? d->original : d->character; if ( !can_see ( ch, wch ) || wch->level > ch->level || wch->level > 202 ) continue; mortmatch++; if ( ( wch->max_hit != wch->hit ) && ( wch->hit > 0 ) ) hptemp = ( wch->hit * 100 ) / wch->max_hit; else if ( wch->max_hit == wch->hit ) hptemp = 100; else if ( wch->hit < 0 ) hptemp = 0; class = class_table[wch->class].who_name; sprintf ( buf, "{G%-14s {D%6s{w/{Y%3s {g%-15s {m%-3d {R%3d%% {w[{y%ld{w]{x\n\r", wch->name, wch->race < MAX_PC_RACE ? pc_race_table[wch->race].who_name : " ", class, capitalize ( position_table[wch->position].name ), wch->level, hptemp, wch->in_room->vnum ); add_buf ( output, buf ); } /* * Tally the counts and send the whole list out. */ sprintf ( buf2, "\n\r{RIMMs {wfound{x: {M%d{x\n\r", immmatch ); add_buf ( output, buf2 ); sprintf ( buf2, "{BMorts {wfound{x: {M%d{x\n\r", mortmatch ); add_buf ( output, buf2 ); page_to_char ( buf_string ( output ), ch ); free_buf ( output ); return; } CH_CMD ( do_anew ) { char buf[MAX_STRING_LENGTH]; char result[MAX_STRING_LENGTH * 2]; AREA_DATA *pArea; sprintf ( result, "{m[{W%-9s{m] {m({W%-27s{m ){W %-10s{x\n\r\n\r", "Lvl Range", "Area Name", "Credits" ); //sprintf( result,"{c************************************************************{x\n\r"); for ( pArea = area_first; pArea; pArea = pArea->next ) { sprintf ( buf, "{m[{W%-9s{m] {m({W%-29.29s{m){W %-10.10s{x\n\r", "Lvl Range", pArea->name, pArea->builders ); strcat ( result, buf ); } // sprintf( result,"{c************************************************************{x\n\r"); send_to_char ( result, ch ); return; }