/*************************************************************************** * 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 <malloc.h> #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 "newclan.h" #include "newquest.h" #include "global_mods.h" long obj_points(OBJ_INDEX_DATA * obj); long obj_balance(OBJ_INDEX_DATA * obj); /* command procedures needed */ DECLARE_DO_FUN (do_exits); DECLARE_DO_FUN (do_look); DECLARE_DO_FUN (do_help); DECLARE_DO_FUN (do_affects); DECLARE_DO_FUN (do_play); DECLARE_DO_FUN (do_inventory); DECLARE_DO_FUN (do_mstat); DECLARE_DO_FUN (do_sense); int focus_dam(CHAR_DATA *ch); int focus_ac(CHAR_DATA *ch); int focus_hit(CHAR_DATA *ch); int tier_level_bonus(CHAR_DATA *ch); char * total_length(char *input, int length); char * get_descr_form(CHAR_DATA *ch,CHAR_DATA *looker, bool get_long); char * escape_colours(char *argument); int tier_wear_limit(CHAR_DATA *ch, OBJ_DATA *obj); char * const where_name[] = { "{G<{Cused as light{G>{x ", "{G<{Cworn on finger{G>{x ", "{G<{Cworn on finger{G>{x ", "{G<{Cworn around neck{G>{x ", "{G<{Cworn around neck{G>{x ", "{G<{Cworn on torso{G>{x ", "{G<{Cworn on head{G>{x ", "{G<{Cworn on legs{G>{x ", "{G<{Cworn on feet{G>{x ", "{G<{Cworn on hands{G>{x ", "{G<{Cworn on arms{G>{x ", "{G<{Cworn as shield{G>{x ", "{G<{Cworn about body{G>{x ", "{G<{Cworn about waist{G>{x ", "{G<{Cworn around wrist{G>{x ", "{G<{Cworn around wrist{G>{x ", "{G<{Cprimary wield{G>{x ", "{G<{Cheld{G>{x ", "{G<{Cfloating nearby{G>{x ", "{G<{Csecondary wield{G>{x ", "{G<{Cworn on face{G>{x ", "{G<{Cworn on ears{G>{x ", "{G<{Cworn on {!bug{G>{x ", "{G<{Cworn on ankle{G>{x ", "{G<{Cworn on ankle{G>{x ", "{G<{Cclan patch{G>{x ", "{G<{Creligion patch{G>{x ", "{G<{Cchest patch{G>{x ", "{G<{Cworn on back{G>{x " }; sh_int const where_order[] = { 1, 2, 3, 4, 5, 6, 20, 7, 23, 24, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19, 17, 18, 21, 22, 28, 0, 25, 26, 27 }; /* for do_count */ int max_on = 0; bool is_pm = FALSE; /* * Local functions. */ char *format_obj_to_char(OBJ_DATA * obj, CHAR_DATA * ch, bool fShort); BUFFER * show_list_to_char(OBJ_DATA * list, CHAR_DATA * ch, bool fShort, bool fShowNothing); void show_char_to_char_0(CHAR_DATA * victim, CHAR_DATA * ch); void show_char_to_char_1(CHAR_DATA * victim, CHAR_DATA * ch); void show_char_to_char(CHAR_DATA * list, CHAR_DATA * ch); bool check_blind(CHAR_DATA * ch); 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)) if ((obj->tier_level > tier_level_bonus(ch)) && (obj->tier_level < tier_level_bonus(ch) + 10)) buf[20] = 'h'; else if ((obj->tier_level >= tier_level_bonus(ch) + 10) && (obj->tier_level < tier_level_bonus(ch) + 25)) buf[20] = 'H'; else if ((obj->tier_level >= tier_level_bonus(ch) + 25) && (obj->tier_level < tier_level_bonus(ch) + 50)) buf[20] = 'v'; else if (obj->tier_level >= (tier_level_bonus(ch) + 50) ) buf[20] = 'V'; if (IS_OBJ_STAT (obj, ITEM_QUEST)) buf[23] = 'Q'; if (!strcmp(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 ((obj->tier_level > tier_level_bonus(ch)) && (obj->tier_level < tier_level_bonus(ch) + 10)) strcat(buf, "({yHumming{x)"); else if ((obj->tier_level >= tier_level_bonus(ch) + 10) && (obj->tier_level < tier_level_bonus(ch) + 25)) strcat(buf, "({YHumming{x)"); else if ((obj->tier_level >= tier_level_bonus(ch) + 25) && (obj->tier_level < tier_level_bonus(ch) + 50)) strcat(buf, "({yBuzzing{x)"); else if (obj->tier_level >= (tier_level_bonus(ch) + 50) ) strcat(buf, "({YBuzzing{x)"); if (IS_OBJ_STAT (obj, ITEM_QUEST)) strcat(buf, "({GQuest{x)"); if (obj->owner != NULL && ch->name != NULL && !str_cmp(obj->owner, ch->name)) strcat(buf, "({#Emblazoned{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 Tas."); 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) { BUFFER *final = new_buf(); char buf[MAX_STRING_LENGTH]; char **prgpstrShow; int *prgnShow; char *pstrShow; OBJ_DATA *obj; int nShow; int iShow; int count = 0; bool fCombine; for (obj = list; obj != NULL; obj = obj->next_content) { if (++count >= 8500) { add_buf(final, "{RToo many objects found.{x\n\r"); return final; } } prgpstrShow = alloc_mem(count * sizeof(char *)); prgnShow = alloc_mem(count * sizeof(int)); nShow = 0; 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 (!strcmp(prgpstrShow[iShow], pstrShow)) { prgnShow[iShow]++; fCombine = TRUE; break; } } } /* * Couldn't combine, or didn't want to. */ if (!fCombine) { prgpstrShow[nShow] = str_dup(pstrShow); prgnShow[nShow] = 1; nShow++; } } } /* * Output the formatted list. */ for (iShow = 0; iShow < nShow; iShow++) { if (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(final, buf); } else { add_buf(final, " "); } } add_buf(final, prgpstrShow[iShow]); add_buf(final, "\n\r"); free_string(prgpstrShow[iShow]); } if (fShowNothing && nShow == 0) { if (IS_NPC(ch) || IS_SET( ch->comm, COMM_COMBINE )) add_buf(final, " "); add_buf(final, "{WNothing.{x\n\r"); } /* * Clean up. */ free_mem(prgpstrShow, count * sizeof(char *)); free_mem(prgnShow, count * sizeof(int)); return final; } void show_char_to_char_0(CHAR_DATA * victim, CHAR_DATA * ch) { char buf[MAX_STRING_LENGTH], message[MAX_STRING_LENGTH]; buf[0] = '\0'; if (!IS_SET (ch->comm, COMM_LONG)) { strcat(buf, "{x[{y.{D.{c.{b.{w.{C.{r.{B.{D.{R.{Y.{W.{G.{x]"); if (IS_SHIELDED (victim, SHD_INVISIBLE)) buf[5] = 'V'; if (IS_AFFECTED (victim, AFF_HIDE)) 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_DEATH)) buf[29] = 'D'; if (IS_EVIL (victim) && IS_AFFECTED (ch, AFF_DETECT_EVIL)) buf[32] = 'E'; if (IS_GOOD (victim) && IS_AFFECTED (ch, AFF_DETECT_GOOD)) buf[35] = 'G'; if (IS_SHIELDED (victim, SHD_SANCTUARY)) buf[38] = 'S'; if (victim->on_quest) { if (!IS_NPC (victim) || IS_IMMORTAL (ch)) buf[41] = 'Q'; } if (!str_cmp(buf, "{x[{y.{D.{c.{b.{w.{C.{r.{B.{D.{R.{Y.{W.{G.{x]")) buf[0] = '\0'; if (IS_SET (victim->plyr, PLAYER_GHOST)) strcat(buf, "[{7G{wH{7O{wS{7T{x]"); if (IS_SET (victim->comm, COMM_AFK)) strcat(buf, "[{yAFK{x]"); if (victim->invis_level >= LEVEL_HERO) strcat(buf, "({WWizi{x)"); } else { if (IS_SET (victim->plyr, PLAYER_GHOST)) strcat(buf, "[{7G{wH{7O{wS{7T{x]"); 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_HERO) 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, "({DGrey Aura{x)"); if (IS_SHIELDED (victim, SHD_FIRE)) strcat(buf, "({rOrange Aura{x)"); if (IS_SHIELDED (victim, SHD_SHOCK)) strcat(buf, "({BBlue Aura{x)"); if (IS_SHIELDED (victim, SHD_DEATH)) strcat(buf, "({DBlack Aura{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) { if (!IS_NPC (victim) || IS_IMMORTAL (ch)) strcat(buf, "({GQuest{x)"); } } if (!IS_NPC (victim) && IS_SET (victim->act, PLR_TWIT)) strcat(buf, "({rTWIT{x)"); if (IS_NPC (victim) && ch->qstate == QSTATE_MOB && victim->pIndexData->vnum == ch->qtarget) strcat(buf, "{R[TARGET]{x "); if ((victim->long_descr[0] != '\0') || (victim->morph_form[0] != 0)) { strcat(buf, get_descr_form(victim, ch, TRUE)); send_to_char(buf, ch); return; } if (!IS_NPC (victim) && !IS_SET (ch->comm, COMM_BRIEF) && victim->position == POS_STANDING && ch->on == NULL && victim->morph_form[0] == 0) strcat(buf, victim->pcdata->pretit); if (buf[0] != '\0') { strcat(buf, " "); } strcat(buf, get_descr_form(victim, ch, FALSE)); if (!IS_NPC (victim) && !IS_SET (ch->comm, COMM_BRIEF) && victim->position == POS_STANDING && ch->on == NULL && victim->morph_form[0] == 0) 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; int iWear; int oWear; int percent; bool found; CHAR_DATA *tch; /* 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); } } */ if (ch == victim) { for (tch = ch->in_room->people; tch != NULL; tch = tch->next_in_room) { if (can_see(tch, ch) && (ch != victim) && (tch != ch) && get_trust( victim) >= ch->ghost_level) act("$n looks at $mself.", ch, NULL, tch, TO_VICT); } } else { if (can_see(victim, ch) && get_trust(victim) >= ch->ghost_level) act("$n looks at you.", ch, NULL, victim, TO_VICT ); for (tch = ch->in_room->people; tch != NULL; tch = tch->next_in_room) { if (can_see(tch, ch) && (tch != victim) && get_trust(victim) >= ch->ghost_level) { sprintf(buf, "$n looks at %s.", get_descr_form(victim, tch, FALSE)); act(buf, ch, NULL, tch, TO_VICT); } } } if (!IS_IMMORTAL(ch) && !is_same_clan(ch, victim) && (is_affected(victim, gsn_conceal) || is_affected(victim, gsn_conceal2) || is_affected(victim, gsn_concealClan1) || is_affected(victim, gsn_concealClan2))) { send_to_char( "The figure is buried deep within a dark green colored cloak.\n\r", ch); } else if (victim->description[0] != '\0') { sprintf(buf, "{C%s{x", victim->description); send_to_char(buf, ch); } else { act("{CYou see nothing special about $M.{x", ch, NULL, victim, TO_CHAR ); } if (victim->max_hit > 0) percent = (100 * victim->hit) / victim->max_hit; else percent = -1; buf[0] = '\0'; strcpy(buf, get_descr_form(victim, ch, FALSE)); if (percent >= 100) strcat(buf, " {(is in excellent condition.{x\n\r"); else if (percent >= 90) strcat(buf, " {(has a few scratches.{x\n\r"); else if (percent >= 75) strcat(buf, " {(has small wounds and bruises.{x\n\r"); else if (percent >= 50) strcat(buf, " {(has quite a few wounds.{x\n\r"); else if (percent >= 30) strcat(buf, " {(has some big nasty wounds and scratches.{x\n\r"); else if (percent >= 15) strcat(buf, " {(is pretty hurt.{x\n\r"); else if (percent >= 0) strcat(buf, " {(is in awful condition.{x\n\r"); else strcat(buf, " {(is beyond dead...{x\n\r"); buf[0] = UPPER (buf[0]); send_to_char(buf, ch); 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]); send_to_char(buf, ch); } 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]); send_to_char(buf, ch); } 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]); send_to_char(buf, ch); } if (IS_SHIELDED (victim, SHD_DEATH)) { sprintf(buf, "%s is surrounded by a {Ddeath{x shield.\n\r", PERS (victim, ch)); buf[0] = UPPER (buf[0]); send_to_char(buf, ch); } if (!IS_IMMORTAL(ch) && !is_same_clan(ch, victim) && (is_affected(victim, gsn_conceal) || is_affected(victim, gsn_conceal2) || is_affected(victim, gsn_concealClan1) || is_affected(victim, gsn_concealClan2))) ; else // if (!is_affected(victim, gsn_conceal) || IS_IMMORTAL(ch) || (is_affected( // victim, gsn_conceal) && is_same_clan(ch, victim))) { 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) { send_to_char("\n\r", ch); sprintf(buf, "{G%s is using:{x\n\r", victim->name); send_to_char(buf, ch); found = TRUE; } sprintf(buf, "%s%s\n\r", where_name[iWear], format_obj_to_char( obj, ch, TRUE)); send_to_char(buf, ch); } } } if (victim != ch && !IS_NPC (ch) && number_percent() < get_skill(ch, gsn_peek) && IS_SET (ch->act, PLR_AUTOPEEK)) { BUFFER *output = show_list_to_char(victim->carrying, ch, TRUE, TRUE ); send_to_char("\n\r{GYou peek at the inventory:{x\n\r", ch); check_improve(ch, gsn_peek, TRUE, 4); page_to_char(output->string, 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 ((!str_cmp(rch->long_descr, "{x\n\r")) && IS_NPC(rch)) continue; if (get_trust(ch) < rch->ghost_level) continue; /* if(ch->long_descr == "") 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; } void do_peek(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; 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); } if (number_percent() < get_skill(ch, gsn_peek)) { BUFFER *output = show_list_to_char(victim->carrying, ch, TRUE, TRUE ); send_to_char("\n\r{GYou peek at the inventory:{x\n\r", ch); check_improve(ch, gsn_peek, TRUE, 4); page_to_char(output->string, ch); free_buf(output); } else { send_to_char("{RYou fail to see anything.{x\n\r", ch); check_improve(ch, gsn_peek, FALSE, 2); } 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 */ void do_scroll(CHAR_DATA * ch, char *argument) { 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 */ void do_socials(CHAR_DATA * ch, char *argument) { 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 */ void do_motd(CHAR_DATA * ch, char *argument) { do_help(ch, "motd"); } void do_imotd(CHAR_DATA * ch, char *argument) { do_help(ch, "imotd"); } void do_rules(CHAR_DATA * ch, char *argument) { do_help(ch, "rules"); } void do_story(CHAR_DATA * ch, char *argument) { do_help(ch, "story"); } /* RT this following section holds all the auto commands from ROM, as well as replacements for config */ void do_autolist(CHAR_DATA *ch, char *argument) { /* lists most player flags */ if (IS_NPC(ch)) return; send_to_char("{! ____________________________________ \n\r", ch); send_to_char("{!| {!|\n\r", ch); send_to_char("{!| {@action {@status {!|\n\r", ch); send_to_char("{!| {!|\n\r", ch); send_to_char("{!| {6newlook ", ch); if (IS_SET(ch->plyr, PLAYER_NEWLOOK)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6autoassist ", ch); if (IS_SET(ch->act,PLR_AUTOASSIST)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6autoexit ", ch); if (IS_SET(ch->act,PLR_AUTOEXIT)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6autogold ", ch); if (IS_SET(ch->act,PLR_AUTOGOLD)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6autoloot ", ch); if (IS_SET(ch->act,PLR_AUTOLOOT)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6autosac ", ch); if (IS_SET(ch->act,PLR_AUTOSAC)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6autosplit ", ch); if (IS_SET(ch->act,PLR_AUTOSPLIT)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6autopeek ", ch); if (IS_SET(ch->act,PLR_AUTOPEEK)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6autostore ", ch); if (IS_SET(ch->comm,COMM_STORE)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6compact mode ", ch); if (IS_SET(ch->comm,COMM_COMPACT)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6prompt ", ch); if (IS_SET(ch->comm,COMM_PROMPT)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6combine items", ch); if (IS_SET(ch->comm,COMM_COMBINE)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6long flags ", ch); if (IS_SET(ch->comm,COMM_LONG)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); send_to_char("{!| {6noevolve ", ch); if (IS_SET (ch->act,PLR_NOEVOLVE)) send_to_char(" {@ON {!|{x\n\r", ch); else send_to_char(" {!OFF {!|{x\n\r", ch); if (!IS_SET(ch->act,PLR_CANLOOT)) send_to_char("{!| {$Your corpse is harder to loot. {!|{x\n\r", ch); else send_to_char("{!| {$Your corpse is fully lootable {!|\n\r", ch); if (IS_SET(ch->act,PLR_NOSUMMON)) send_to_char("{!| {$You cannot be summoned. {!|\n\r", ch); else send_to_char("{!| {$You can be summoned. {!|\n\r", ch); if (IS_SET(ch->act,PLR_NOFOLLOW)) send_to_char("{!| {$You do not welcome followers. {!|\n\r", ch); else send_to_char("{!| {$You accept followers. {!|\n\r", ch); if (IS_SET (ch->act, PLR_NOCANCEL)) send_to_char("{!| {$You are immune to cancel. {!|\n\r", ch); else send_to_char("{!| {$Cancel can be cast upon you. {!|\n\r", ch); if (IS_SET (ch->act, PLR_NOTRAN)) send_to_char("{!| {$You are immune to transport. {!|\n\r", ch); else send_to_char("{!| {$You can be transported. {!|\n\r", ch); if (IS_SET (ch->plyr, PLAYER_SUBDUE)) send_to_char("{!| {$You subdue your victims. {!|\n\r", ch); else send_to_char("{!| {$You kill your victims. {!|\n\r", ch); send_to_char("{!| {!|\n\r", ch); send_to_char("{!|____________________________________|{x\n\r", ch); } void do_autoassist(CHAR_DATA * ch, char *argument) { 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); } } void do_autoexit(CHAR_DATA * ch, char *argument) { 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); } } void do_autogold(CHAR_DATA * ch, char *argument) { 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); } } void do_autoloot(CHAR_DATA * ch, char *argument) { 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); } } void do_autosac(CHAR_DATA * ch, char *argument) { 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); } } void do_autosplit(CHAR_DATA * ch, char *argument) { 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); } } void do_autopeek(CHAR_DATA * ch, char *argument) { 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); } } void do_brief(CHAR_DATA * ch, char *argument) { 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); } } void do_short(CHAR_DATA * ch, char *argument) { if (IS_SET (ch->act, PLR_SHORT_COMBAT)) { send_to_char("Short combat disabled.\n\r", ch); REMOVE_BIT (ch->act, PLR_SHORT_COMBAT); } else { send_to_char("Short combat activated.\n\r", ch); SET_BIT (ch->act, PLR_SHORT_COMBAT); } } void do_compact(CHAR_DATA * ch, char *argument) { 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); } } void do_long(CHAR_DATA * ch, char *argument) { 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); } } void do_show(CHAR_DATA * ch, char *argument) { 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); } } void do_prompt(CHAR_DATA * ch, char *argument) { 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); } send_to_char("Note: use the 'all' argument to set the default prompt, and the 'info' argument to see what your prompt currently is.\r\n", ch); return; } if (!strcmp(argument, "all")) strcpy(buf, "<%hhp %mm %vmv> "); else if (!strcmp(argument, "info")) { send_to_char("Your prompt is currently set to:\r\n", ch); send_to_char(escape_colours(ch->prompt), ch); send_to_char("\r\n", ch); return; } else { if (strlen(argument) > 100) 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); send_to_char("Prompt set to:\r\n", ch); send_to_char(escape_colours(ch->prompt), ch); send_to_char("\r\n", ch); return; } void do_combine(CHAR_DATA * ch, char *argument) { 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); } } void do_noevolve(CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (IS_SET (ch->act, PLR_NOEVOLVE)) { send_to_char("You now have the possibility of evolving.\n\r", ch); REMOVE_BIT (ch->act, PLR_NOEVOLVE); } else { send_to_char("You will no longer evolve.\n\r", ch); SET_BIT (ch->act, PLR_NOEVOLVE); } } void do_nofalcon(CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (IS_SET (ch->plyr, PLAYER_NOFALCON)) { send_to_char("You now have the help of your falcon.\n\r", ch); REMOVE_BIT (ch->plyr, PLAYER_NOFALCON); } else { send_to_char("You will no longer have the help of your falcon.\n\r", ch); SET_BIT (ch->plyr, PLAYER_NOFALCON); } } void do_noloot(CHAR_DATA * ch, char *argument) { extern bool NOLOOT; CHAR_DATA *wch; if (IS_NPC (ch)) return; if (ch->level >= 109) { if (NOLOOT) { send_to_char("Corpse Looting now allowed.\n\r", ch); NOLOOT = FALSE; for (wch = char_list; wch != NULL; wch = wch->next) { send_to_char( "Global Loot Flag On: Your corpse may now be looted.\n\r", wch); } } else if (!NOLOOT) { send_to_char("Corpse Looting now NOT allowed.\n\r", ch); NOLOOT = TRUE; for (wch = char_list; wch != NULL; wch = wch->next) { send_to_char( "Global Loot Flag Off: Your corpse is safe from thieves.\n\r", wch); } } } else { if (IS_SET (ch->act, PLR_CANLOOT)) { send_to_char("Your corpse is harder to loot.\n\r", ch); REMOVE_BIT (ch->act, PLR_CANLOOT); } else { send_to_char("Your corpse is fully lootable.\n\r", ch); SET_BIT (ch->act, PLR_CANLOOT); } } return; } void do_nofollow(CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) return; if (IS_SET(ch->affected_by,AFF_CHARM)) { send_to_char("I don't think so.\n\r", 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); } } void do_nosummon(CHAR_DATA * ch, char *argument) { 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); } } } void do_notran(CHAR_DATA * ch, char *argument) { 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); } } } void do_nogoto(CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) { return; } else { if (IS_SET (ch->act, PLR_NOGOTO)) { send_to_char("You are no longer immune to goto.\n\r", ch); REMOVE_BIT (ch->act, PLR_NOGOTO); } else { send_to_char("You are now immune to goto.\n\r", ch); SET_BIT (ch->act, PLR_NOGOTO); } } } void do_noviolate(CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) { return; } else { if (IS_SET (ch->act, PLR_NOVIOLATE)) { send_to_char("You are no longer immune to violate.\n\r", ch); REMOVE_BIT (ch->act, PLR_NOVIOLATE); } else { send_to_char("You are now immune to violate.\n\r", ch); SET_BIT (ch->act, PLR_NOVIOLATE); } } } void do_nocancel(CHAR_DATA * ch, char *argument) { if (IS_NPC (ch)) { return; } else { if (IS_SET (ch->act, PLR_NOCANCEL)) { send_to_char("You are no longer immune to cancellation.\n\r", ch); REMOVE_BIT (ch->act, PLR_NOCANCEL); } else { send_to_char("You are now immune to cancellation.\n\r", ch); SET_BIT (ch->act, PLR_NOCANCEL); } } } void do_look(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; 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("It is pitch black ... \n\r", ch); show_char_to_char(ch->in_room->people, ch); return; } argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); number = number_argument(arg1, arg3); count = 0; if (arg1[0] == '\0' || !str_cmp(arg1, "auto") || !str_cmp(arg1, "vnum")) { BUFFER *output; ROOM_INDEX_DATA *room; if (!str_cmp(arg1, "vnum")) room = get_room_index(atoi(arg2)); else room = ch->in_room; if (!IS_NPC(ch) && IS_SET(ch->plyr, PLAYER_NEWLOOK)) { #define ROOM_CHECK(Direction, Letter) \ (room->exit[Direction] != NULL \ && room->exit[Direction]->u1.to_room \ && can_see_room(ch, room->exit[Direction]->u1.to_room) \ ? (IS_SET(room->exit[Direction]->exit_info, EX_CLOSED) ? "{y#" : "{Y"Letter) \ : ".") sprintf(buf, "{D..%s{D.%s {C%s{x", ROOM_CHECK(DIR_NORTH, "N"), ROOM_CHECK(DIR_UP, "U"), room->name); if (IS_IMMORTAL(ch)) { char room_vnum[MAX_STRING_LENGTH]; sprintf(room_vnum, " {B[{wRoom {G%d{w in{G %s{B]", room->vnum, room->area->name); strcat(buf, room_vnum); } send_to_char(buf, ch); sprintf(buf, "\r\n{D%s{D.{RX{D.%s {B=====================================================================\r\n", ROOM_CHECK(DIR_WEST, "W"), ROOM_CHECK(DIR_EAST, "E")); send_to_char(buf, ch); sprintf(buf, "{D%s{D.%s{D.. {w", ROOM_CHECK(DIR_DOWN, "D"), ROOM_CHECK(DIR_SOUTH, "S")); send_to_char(buf, ch); if (!IS_NPC (ch) && IS_SET (ch->act, PLR_AUTOEXIT)) { if (str_cmp(arg1, "vnum")) //Just make sure it isn't vnum do_exits(ch, "auto"); else { sprintf(buf, "vnum %s", arg2); do_exits(ch, buf); } } else send_to_char("\r\n", ch); send_to_char("{x", ch); } else { /* 'look' or 'look auto' */ send_to_char("{<", ch); //send_to_char(ch->in_room->name, ch); send_to_char(room->name, ch); send_to_char("{x", ch); if ((IS_IMMORTAL (ch) && (IS_NPC (ch) || IS_SET (ch->act, PLR_HOLYLIGHT))) || IS_BUILDER (ch, room->area)) { sprintf(buf, " [Room %d]", 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)) || (!str_cmp(arg1, "vnum"))) { send_to_char(" ", ch); send_to_char(room->description, ch); send_to_char("{x", ch); if (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_SET(room->affected_by, ROOM_AFF_FAERIE)) send_to_char("This room contains a purple haze.\n\r", ch); } if (IS_SET(room->affected_by, ROOM_AFF_FIRES)) send_to_char( "\n\rThe {!f{1i{!r{1e{!s{x of {r-{RT{Dor{rM{Den{Rt{r-{x burn brightly in the room.\n\r", ch); if (IS_SET(room->affected_by, ROOM_AFF_OVERGROWN)) send_to_char( "\n\rA magical {GF{go{Gre{gs{Gt{x has sprouted in this room.\n\r", ch); if (!IS_NPC (ch) && !IS_SET(ch->plyr, PLAYER_NEWLOOK) && IS_SET (ch->act, PLR_AUTOEXIT)) { send_to_char("\n\r", ch); if (!str_cmp(arg1, "vnum")) sprintf(buf, "vnum %s", arg2); else strcpy(buf, "auto"); do_exits(ch, buf); } output = show_list_to_char(room->contents, ch, FALSE, FALSE); send_to_char(output->string, ch); free_buf(output); show_char_to_char(room->people, ch); return; } if (!str_cmp(arg1, "auto1")) { send_to_char("{<", ch); send_to_char(ch->in_room->name, ch); send_to_char("{x\n\r", ch); return; } if (!str_cmp(arg1, "i") || !str_cmp(arg1, "in") || !str_cmp(arg1, "on")) { BUFFER *final; /* '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); final = show_list_to_char(obj->contains, ch, TRUE, TRUE); send_to_char(final->string, ch); free_buf(final); 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 */ void do_read(CHAR_DATA * ch, char *argument) { do_look(ch, argument); } void do_examine(CHAR_DATA * ch, char *argument) { 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 %d 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 %d silver coins in the pile.\n\r", obj->value[0]); } else sprintf( buf, "There are %d gold and %d 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; } /* * Thanks to Zrin for auto-exit part. */ void do_exits(CHAR_DATA * ch, char *argument) { extern char * const dir_name[]; char buf[MAX_STRING_LENGTH]; char arg1[MSL]; char arg2[MSL]; EXIT_DATA *pexit; bool found; bool round; bool fAuto; int door; int outlet; ROOM_INDEX_DATA *room; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); fAuto = ((!str_cmp(arg1, "auto")) || (!str_cmp(arg1, "vnum"))); if (!str_cmp(arg1, "vnum")) { room = get_room_index(atoi(arg2)); } else { room = ch->in_room; } if (!check_blind(ch)) return; if (fAuto) sprintf(buf, "[Exits:"); else if (IS_IMMORTAL (ch)) sprintf(buf, "Obvious exits from room %d:\n\r", 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 = room->exit[door + 6]) != NULL) outlet += 6; if ((pexit = room->exit[outlet]) != NULL && pexit->u1.to_room != NULL && can_see_room(ch, pexit->u1.to_room)) { found = TRUE; round = TRUE; if (fAuto) { if (!IS_SET(pexit->exit_info,EX_HIDDEN)) { strcat(buf, " "); if (IS_SET (pexit->exit_info, EX_CLOSED ) && !IS_SET(pexit->exit_info,EX_HIDDEN)) strcat(buf, "<"); strcat(buf, dir_name[outlet]); if (IS_SET (pexit->exit_info, EX_CLOSED) && !IS_SET(pexit->exit_info,EX_HIDDEN)) strcat(buf, ">"); } } else { sprintf(buf + strlen(buf), "%-5s - %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 %d)\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], 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 - %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 %d)\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; } void do_worth(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; if (IS_NPC (ch)) { sprintf(buf, "You have %ld platinum, %ld gold and %ld silver.\n\r", ch->platinum, ch->gold, ch->silver); send_to_char(buf, ch); return; } send_to_char("{y___________________________________________\n\r", ch); sprintf(buf, "{y| {WPlatinum{8: {W%-12ld {y|\n\r", ch->platinum); send_to_char(buf, ch); sprintf(buf, "{y| {WGold{8: {Y%-12ld {y|\n\r", ch->gold); send_to_char(buf, ch); sprintf(buf, "{y| {WSilver{8: {w%-12ld {y|\n\r", ch->silver); send_to_char(buf, ch); sprintf(buf, "{y| {WExp{8: {x%8ld (%8ld Exp to level) {y|\n\r", ch->exp, (ch->level + 1) * exp_per_level(ch, ch->pcdata->points) - ch->exp); send_to_char(buf, ch); send_to_char("{y___________________________________________\n\r", ch); sprintf(buf, "{y| {WQuest Points{8: {X%-12d {y|\n\r", ch->questpoints); send_to_char(buf, ch); /*sprintf (buf, "{y| {WBank Balance{8: {W%-12d {y|\n\r", ch->balance[bank]); send_to_char (buf, ch);*/ send_to_char("{y___________________________________________{x\n\r", ch); return; } /* * do_score modifications by Vengeance and Artema */ void do_score(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; int i; if (IS_NPC (ch)) { do_mstat(ch, "self"); return; } sprintf(buf, "{xYou are {G%s{x%s{x\n\r", ch->name, ch->pcdata->title); send_to_char(buf, ch); if (IS_IMMORTAL(ch)) { sprintf(buf, "{xLevel {B%d{x, {B%d{x years old.\n\r", ch->level, get_age( ch)); } else { sprintf(buf, "{xLevel {B%d{x, {B%d{x years old.\n\r", ch->level + tier_level_bonus(ch), get_age(ch)); } send_to_char(buf, ch); if (get_trust(ch) != ch->level) { sprintf(buf, "{xYou are trusted at level {B%d{x.\n\r", get_trust(ch)); send_to_char(buf, ch); } sprintf(buf, "{xRace: {M%s{x Sex: {M%s{x Class: {M%s{x Size: {M%s{x\n\r", race_table[ch->race].name, ch->sex == 0 ? "sexless" : ch->sex == 1 ? "male" : "female", class_table[ch->class].name, size_table[ch->size].name); send_to_char(buf, ch); sprintf( buf, "{xYou have {G%d{x/{B%d{x hit, {G%d{x/{B%d{x mana, {G%d{x/{B%d{x movement.\n\r", ch->hit, ch->max_hit, ch->mana, ch->max_mana, ch->move, ch->max_move); send_to_char(buf, ch); sprintf( buf, "{xYou have {M%d{x practice%s and {Y%d{x train%s\n\r", ch->practice, ch->practice == 1 ? "" : "s", ch->train, ch->train == 1 ? "" : "s"); send_to_char(buf, ch); if (is_clan(ch)) { CLAN_DATA *clan = get_clan_by_ch(ch); sprintf(buf, "{xYou are in the [{G%s{x] clan, which is a %s clan.\n\r", clan->c_name, clan->pkill ? "{RPkill{x" : "{WNon-Pkill{x"); send_to_char(buf, ch); /* if (is_pkill(ch)) { sprintf( buf, "{xPk Rank: {R%d {xArena Rank: {R%d{x\n\r", ch->pcdata->prank, ch->pcdata->arank); send_to_char(buf,ch); } */ } if (!IS_NPC (ch)) { if (ch->challenger != NULL) { sprintf(buf, "[{garena{x] You have been {rchallenged{x by {b%s{x.\n\r", ch->challenger->name); send_to_char(buf, ch); } if (ch->challenged != NULL) { sprintf(buf, "[{garena{x] You have {rchallenged{x {b%s{x.\n\r", ch->challenged->name); send_to_char(buf, ch); } if (ch->gladiator != NULL) { sprintf(buf, "[{garena bet{x] You have a {y%d{x gold bet on {b%s{x\n\r", ch->pcdata->plr_wager, ch->gladiator->name); send_to_char(buf, ch); } } sprintf( buf, "{xYou are carrying {G%d{x/{B%d{x items with weight {G%ld{x/{B%d{x pounds.\n\r", ch->carry_number, can_carry_n(ch), get_carry_weight (ch) / 10, can_carry_w(ch) / 10); send_to_char(buf, ch); sprintf( buf, "{xStr: {R%d{x({r%d{x) Int: {R%d{x({r%d{x) Wis: {R%d{x({r%d{x) Dex: {R%d{x({r%d{x) Con: {R%d{x({r%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)); send_to_char(buf, ch); sprintf( buf, "{xYou have {W%ld platinum{x, {Y%ld gold{x and {w%ld silver{x coins.\n\r", ch->platinum, ch->gold, ch->silver); send_to_char(buf, ch); if (!IS_NPC (ch) && ch->level == LEVEL_HERO) { sprintf(buf, "{xYou have scored {C%ld exp{x.\n\r", ch->exp); send_to_char(buf, ch); } else if (!IS_NPC (ch) && ch->level < LEVEL_HERO) { sprintf( buf, "{xYou have scored {C%ld exp{x. You need {C%ld exp{x to level.\n\r", ch->exp, ((ch->level + 1) * exp_per_level(ch, ch->pcdata->points) - ch->exp)); send_to_char(buf, ch); } if (ch->wimpy) { sprintf(buf, "Wimpy set to %d hit points.\n\r", ch->wimpy); send_to_char(buf, ch); } if (!IS_NPC (ch) && ch->pcdata->condition[COND_DRUNK] > 10) { sprintf(buf, "{yYou are drunk.{x\n\r"); send_to_char(buf, ch); } if (!IS_NPC (ch) && ch->pcdata->condition[COND_THIRST] == 0) { sprintf(buf, "{yYou are thirsty.{x\n\r"); send_to_char(buf, ch); } if (!IS_NPC (ch) && ch->pcdata->condition[COND_HUNGER] == 0) { sprintf(buf, "{yYou are hungry.{x\n\r"); send_to_char(buf, ch); } switch (ch->position) { case POS_DEAD: sprintf(buf, "{RYou are DEAD!!{x\n\r"); send_to_char(buf, ch); break; case POS_MORTAL: sprintf(buf, "{RYou are mortally wounded.{x\n\r"); send_to_char(buf, ch); break; case POS_INCAP: sprintf(buf, "{RYou are incapacitated.{x\n\r"); send_to_char(buf, ch); break; case POS_STUNNED: sprintf(buf, "{RYou are stunned.{x\n\r"); send_to_char(buf, ch); break; case POS_SLEEPING: sprintf(buf, "{BYou are sleeping.{x\n\r"); send_to_char(buf, ch); break; case POS_RESTING: sprintf(buf, "{BYou are resting.{x\n\r"); send_to_char(buf, ch); break; case POS_STANDING: sprintf(buf, "{BYou are standing.{x\n\r"); send_to_char(buf, ch); break; case POS_FIGHTING: sprintf(buf, "{RYou are fighting.{x\n\r"); send_to_char(buf, ch); break; } /* print AC values */ if (ch->level >= 25) { sprintf( buf, "{xArmor: pierce: {G%d{x bash: {G%d{x slash: {G%d{x exotic: {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)); send_to_char(buf, ch); } 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 = "exotic"; break; default: temp = "error"; break; } sprintf(buf, "{xYou are "); send_to_char(buf, ch); 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) >= -100) sprintf(buf, "{Bsuperbly armored{x against %s.\n\r", temp); else if (GET_AC (ch, i) >= -200) sprintf(buf, "{Ynear invulnerable{x to %s.\n\r", temp); else if (GET_AC (ch, i) >= -300) sprintf(buf, "{Yalmost invulnerable{x to %s.\n\r", temp); else sprintf(buf, "{Wdivinely armored{x against %s.\n\r", temp); send_to_char(buf, ch); } /* RT wizinvis and holy light */ if (IS_IMMORTAL (ch)) { sprintf(buf, "Holy Light: "); send_to_char(buf, ch); if (IS_SET (ch->act, PLR_HOLYLIGHT)) sprintf(buf, "{Won{x"); else sprintf(buf, "{Roff{x"); send_to_char(buf, ch); if (ch->invis_level) { sprintf(buf, " Invisible: level {W%d{x", ch->invis_level); send_to_char(buf, ch); } if (ch->incog_level) { sprintf(buf, " Incognito: level {W%d{x", ch->incog_level); send_to_char(buf, ch); } if (ch->ghost_level) { sprintf(buf, " Ghost: level {W%d{x", ch->ghost_level); send_to_char(buf, ch); } sprintf(buf, "\n\r"); send_to_char(buf, ch); } if (ch->level >= 15) { sprintf(buf, "{xHitroll: {G%d{x Damroll: {G%d{x Saves: {G%d{x.\n\r", GET_HITROLL (ch), GET_DAMROLL (ch), ch->saving_throw); send_to_char(buf, ch); } if (ch->level >= 10) { sprintf(buf, "{xAlignment: {B%d{x. ", ch->alignment); send_to_char(buf, ch); } sprintf(buf, "{xYou are "); send_to_char(buf, ch); if (ch->alignment > 900) sprintf(buf, "{&O{7di{&n{x's chosen{x.\n\r"); else if (ch->alignment > 700) sprintf(buf, "{&O{7di{&n{x's servant{x.\n\r"); else if (ch->alignment > 500) sprintf(buf, "{wsaintly{x.\n\r"); else if (ch->alignment > 350) sprintf(buf, "{wgood{x.\n\r"); else if (ch->alignment > 225) sprintf(buf, "{ykind{x.\n\r"); else if (ch->alignment > 100) sprintf(buf, "{ynice{x.\n\r"); else if (ch->alignment > -100) sprintf(buf, "{yneutral{x.\n\r"); else if (ch->alignment > -225) sprintf(buf, "{yunkind{x.\n\r"); else if (ch->alignment > -350) sprintf(buf, "{ymean{x.\n\r"); else if (ch->alignment > -500) sprintf(buf, "{revil{x.\n\r"); else if (ch->alignment > -700) sprintf(buf, "{rdemonic{x.\n\r"); else if (ch->alignment > -900) sprintf(buf, "{!H{1e{!l{x's servant{x.\n\r"); else sprintf(buf, "{!H{1e{!l{x's chosen{x.\n\r"); send_to_char(buf, ch); /* 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); send_to_char(buf,ch); } */ if (IS_SET (ch->comm, COMM_SHOW_AFFECTS)) do_affects(ch, ""); } void do_abilities(CHAR_DATA *ch, char *argument) { int count = 0; if (IS_NPC(ch)) return; send_to_char("{D ._______________________________________________.{x\n\r", ch); send_to_char( "{D / {y[{cABILITIES{y] {D\\{x\n\r", ch); send_to_char( "{D| {D|{x\n\r", ch); if (ch->class == CLASS_SHADE || ch->class == CLASS_LICH || ch->class == CLASS_FADE || ch->class == CLASS_BANSHEE) { count = (count == 1 ? 1 : count + 1); send_to_char("{D| {mNightstalker{w:", ch); if (IS_SET( ch->ability_lich, ABILITY_LICH_NIGHTSTALKER )) send_to_char(" {GON {D|{x\n\r", ch); else send_to_char(" {ROFF {D|{x\n\r", ch); } /*if ( ch->class == CLASS_CRUSADER ) { count = ( count == 1 ? 1 : count + 1 ); send_to_char("{D| {mSunder{w:",ch); if ( IS_SET( ch->ability_crusader, ABILITY_CRUSADER_SUNDER ) ) send_to_char(" {GON {D|{x \n\r",ch); else send_to_char(" {ROFF {D|{x\n\r",ch); } */ if (count == 0) send_to_char( "{D| {RTHERE ARE NONE {D|{x\n\r", ch); else send_to_char( "{D| {D|{x\n\r", ch); send_to_char( "{D|___________________________________________________|{x\n\r", ch); } void do_affects(CHAR_DATA * ch, char *argument) { AFFECT_DATA *paf, *paf_last = NULL; char buf[MAX_STRING_LENGTH]; if (ch->affected_by) { sprintf(buf, "Affected by %s\n\r", affect_bit_name(ch->affected_by)); send_to_char(buf, ch); } if (ch->shielded_by) { sprintf(buf, "Shielded by %s\n\r", shield_bit_name(ch->shielded_by)); send_to_char(buf, ch); } if (ch->affected != NULL) { sprintf(buf, "You are affected by the following spells:\n\r"); send_to_char(buf, ch); if (ch->class == 25) { sprintf( buf, "{WF{waith{x Modifies: {BH{bitroll {R%d, {BD{bamroll {R%d, {BS{btrength {R%d, {BD{bexterity {R%d{x\n\r", (ch->alignment * ch->level) / 2000, (ch->alignment * ch->level) / 2000, ch->alignment / 300, ch->alignment / 300); send_to_char(buf, ch); } if (ch->class == CLASS_MONK) { sprintf(buf, "{WC{whi{x Modifies: DamRoll %d HitRoll %d.\n\r", ch->pcdata->power[0] / 10 + ch->pcdata->power[1] / 10, ch->pcdata->power[0] / 10); send_to_char(buf, ch); } for (paf = ch->affected; paf != NULL; paf = paf->next) { if (paf_last != NULL && paf->type == paf_last->type) sprintf(buf, " "); else sprintf(buf, "Spell: {W%-15s{x", skill_table[paf->type].name); send_to_char(buf, ch); sprintf(buf, ": modifies {R%s{x by {G%d{x ", affect_loc_name( paf->location), paf->modifier); send_to_char(buf, ch); if (paf->duration == -1) sprintf(buf, "{Bpermanently{x"); else sprintf(buf, "for {B%d hours{x", paf->duration); send_to_char(buf, ch); sprintf(buf, "\n\r"); send_to_char(buf, ch); paf_last = paf; } } else { sprintf(buf, "You are not affected by any spells.\n\r"); send_to_char(buf, ch); if (ch->class == 25) { sprintf( buf, "{WF{waith{x Modifies: {BH{bitroll {R%d, {BD{bamroll {R%d, {BS{btrength {R%d, {BD{bexterity {R%d{x\n\r", ch->alignment / 100, ch->alignment / 100, ch->alignment / 300, ch->alignment / 300); send_to_char(buf, ch); } } return; } /* void do_cooldowns(CHAR_DATA * ch, char *argument) { COOLDOWN_DATA *pcd = NULL; char buf[MAX_STRING_LENGTH]; if (ch->cooldowns != NULL) { sprintf(buf, "Cooldowns:\n\r"); send_to_char(buf, ch); for (pcd = ch->cooldowns; pcd != NULL; pcd = pcd->next) { sprintf(buf, "{W%-15s{x: {B%d rounds{x\n\r", skill_table[pcd->type].name, pcd->duration); send_to_char(buf, ch); } } else { sprintf(buf, "Nothing is on cooldown.\n\r"); send_to_char(buf, ch); } return; } */ char * const day_name[] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; char * const month_name[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" /* , "the Dark Shades", "the Shadows", "the Long Shadows", "the Ancient Darkness", "the Great Evil" */ }; void do_time(CHAR_DATA * ch, char *argument) { extern char str_boot_time[]; char buf[MAX_STRING_LENGTH]; char *suf; int day; day = time_info.day + 1; if (day > 4 && day < 20) suf = "th"; else if (day % 10 == 1) suf = "st"; else if (day % 10 == 2) suf = "nd"; else if (day % 10 == 3) suf = "rd"; else suf = "th"; sprintf(buf, "It is %d o'clock %s, Day of %s, %d%s the Month of %s.\n\r", (time_info.hour % 12 == 0) ? 12 : time_info.hour % 12, time_info.hour >= 12 ? "pm" : "am", day_name[day % 7], day, suf, month_name[time_info.month]); send_to_char(buf, ch); sprintf( buf, GAME_COL_NAME" started up at %s\n\rThe system time is %s\n\r", str_boot_time, (char *) ctime(¤t_time)); send_to_char(buf, ch); send_to_char("Use the {Ggamestatus{x command to see more details.\r\n", ch); } void do_weather(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; static char * const sky_look[4] = { "cloudless", "cloudy", "rainy", "lit by flashes of lightning" }; if (!IS_OUTSIDE (ch)) { send_to_char("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; } /* Old help, won't do anything at the moment */ /*void do_help (CHAR_DATA * ch, char *argument) { HELP_DATA *pHelp; char argall[MAX_INPUT_LENGTH], argone[MAX_INPUT_LENGTH]; if (argument[0] == '\0') argument = "summary"; if(is_racename(argument)) { do_racehelp(ch,argument); } 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); if (ch->desc != NULL && ch->desc->connected != CON_PLAYING && ch->desc->connected != CON_GEN_GROUPS) break; return; } } send_to_char ("No help on that word, use the nohelp command to log it.\n\r", ch); return; }*/ void do_classstat(CHAR_DATA *ch, char *argument) { /* ClassHelps -- Skyntil */ if (is_classname(argument)) { do_classhelp(ch, argument); return; } send_to_char("That is not a valid class.\n\r", ch); return; } void do_oldhelp(CHAR_DATA *ch, char *argument) { HELP_DATA *pHelp; bool found = FALSE; char argall[MAX_INPUT_LENGTH], argone[MAX_INPUT_LENGTH]; int level; if (argument[0] == '\0') argument = "summary"; /* 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) { level = (pHelp->level < 0) ? -1 * pHelp->level - 1 : pHelp->level; if (level > get_trust(ch)) continue; if (is_name(argall, pHelp->keyword)) { /* add seperator if found */ if (found) send_to_char( "\n\r============================================================\n\r\n\r", ch); if (pHelp->level >= 0 && str_cmp(argall, "imotd")) { send_to_char(pHelp->keyword, ch); send_to_char("\n\r", ch); } /* * Strip leading '.' to allow initial blanks. */ if (pHelp->text[0] == '.') send_to_char(pHelp->text + 1, ch); else send_to_char(pHelp->text, ch); found = TRUE; /* small hack :) */ if (ch->desc != NULL && ch->desc->connected != CON_PLAYING && ch->desc->connected != CON_GEN_GROUPS) break; } } if (!found) send_to_char("No help on that word.\n\r", ch); return; } /* whois command */ void do_whois(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; BUFFER *output; char buf[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]; char sex[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 (wch->pcdata->pretit == '\0') wch->pcdata->pretit = "{x"; if (IS_NPC (wch)) continue; if (!str_prefix(arg, wch->name)) { found = TRUE; if (wch->pcdata->tier == 1) { 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 (wch->pcdata->tier == 2) { 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 if (wch->pcdata->tier >= 3) { 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->sex == 1) { sprintf(sex, "{#M{x"); } else if (wch->sex == 2) { sprintf(sex, "{#F{x"); } else if (wch->sex == 0) { sprintf(sex, "{#N{x"); } CLAN_DATA *clan = get_clan_by_ch( wch ); ROSTER_DATA *roster; GET_ROSTER( wch, roster ); /* a little formatting */ sprintf( buf, "[%-3d %-12s %s %s{x] %s %s %s%s%s%s%s%s%s%s%s%s%s{x", wch->level < 102 ? wch->level + tier_level_bonus(wch) : wch->level + 100, wch->race < MAX_PC_RACE ? pc_race_table[wch->race].who_name : " ", class, sex, end_string( clan->c_name, MAX_CLAN_WHO_LENGTH ), (!roster || is_indep(wch)) ? "---" : clan->r_who[get_r_rank_index( roster )], ((wch->ghost_level >= LEVEL_HERO) && (ch->level >= wch->level)) ? "(Ghost) " : "", wch->incog_level >= LEVEL_HERO ? "({^Incog{x) " : "", wch->invis_level >= LEVEL_HERO ? "({&Wizi{x) " : "", IS_SET (wch->plyr, PLAYER_GHOST) ? "({7G{wH{7O{wS{7T{x) " : "", IS_SET (wch->comm, COMM_QUIET) ? "({@Quiet{x) " : "", IS_SET (wch->comm, COMM_AFK) ? "{3[{#AFK{3]{x " : "", IS_SET (wch->act, PLR_TWIT) ? "({RTWIT{x) " : "", (roster && IS_SET (roster->flags, ROST_NEWBIE)) ? "{Y{{{Rn00b{Y}{x " : "", wch->pcdata->pretit, wch->name, IS_NPC (wch) ? "" : wch->pcdata->title); add_buf(output, buf); PKILL_DATA *pkdata; if (roster && (pkdata = roster->pkilldata)) { float ratio; sprintf(buf, "\n\r{wKill Points: {Y%ld\r\n", pkdata->kPoints); add_buf(output, buf); ratio = ((float)pkdata->kills)/UMAX((float)pkdata->deaths, 1.0f); sprintf(buf, "{wKills/Deaths: {G%d{w/{R%d {w(Ratio: {%c%.2f{w)\r\n", pkdata->kills, pkdata->deaths, (ratio >= 1 ? 'G' : 'r'), ratio); add_buf(output, buf); ratio = ((float)pkdata->wins)/UMAX((float)pkdata->losses, 1.0f); sprintf(buf, "{wWins/Losses: {G%d{w/{R%d {w(Ratio: {%c%.2f{w){x\r\n", pkdata->wins, pkdata->losses, (ratio >= 1 ? 'G' : 'r'), ratio); add_buf(output, buf); } sprintf(buf, "{C%s{x", wch->description); 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. */ void do_who(CHAR_DATA * ch, char *argument) { FILE *fp; char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char questdat[MAX_STRING_LENGTH]; char whodesc[MAX_STRING_LENGTH]; char race[MAX_STRING_LENGTH]; char sex[MAX_STRING_LENGTH]; char level[MAX_STRING_LENGTH]; char clan[MAX_STRING_LENGTH]; char rank[MAX_STRING_LENGTH]; char *mplayer_name = ""; char *immplayer_name = ""; BUFFER *output; BUFFER *outputimm; BUFFER *ftier; BUFFER *stier; BUFFER *ttier; DESCRIPTOR_DATA *d; int iClass; int iRace; int iLevelLower; int iLevelUpper; int nNumber; int nMatch; bool rgfClass[MAX_CLASS]; bool rgfRace[MAX_PC_RACE]; bool fClassRestrict = FALSE; bool fClanRestrict = FALSE; bool fClan = FALSE; bool fRaceRestrict = FALSE; bool fImmortalOnly = FALSE; bool fPkillOnly = FALSE; bool fArenaOnly = FALSE; bool fMCCPOnly = FALSE; int count; int countimm; int hour; int most_ever = 0; int most_hours = 0; int immost_hours = 0; CLAN_DATA *iClan = NULL, *wchClan; ROSTER_DATA *wchRoster; /* * 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; /* * 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 if (!str_prefix(arg, "pkill")) { fPkillOnly = TRUE; } else if (!str_prefix(arg, "arena")) { fArenaOnly = TRUE; } else if (!str_prefix(arg, "mccp")) { fMCCPOnly = 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; } 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(); ftier = new_buf(); stier = new_buf(); ttier = new_buf(); add_buf(outputimm, "\n\r{xVisible {GImmortals{x:\n\r"); add_buf(ftier, "\n\r{xVisible {GMortals{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; wchClan = get_clan_by_ch( wch ); GET_ROSTER( wch, wchRoster ); /* Assassins don't show up */ // if(is_affected(wch,gsn_conceal) && ch != wch) // continue; if (wch->pcdata->pretit == '\0') wch->pcdata->pretit = "{x"; if (fPkillOnly) continue; if (fArenaOnly) 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 && iClan != wchClan) || (fMCCPOnly && !d->out_compress)) continue; countimm++; nMatch++; strcpy( clan, end_string( wchClan->c_name, MAX_CLAN_WHO_LENGTH ) ); sprintf( rank, " %s", is_indep(wch) ? "---" : wchClan->r_who[get_r_rank_index( wchRoster )] ); /* * Figure out what to print for class. */ if (wch->pcdata->who_descr[0] == '\0') { sprintf(level, "%-3d ", wch->level); if (wch->pcdata->tier == 1) { 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 (wch->pcdata->tier == 2) { 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 if (wch->pcdata->tier >= 3) { 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->sex == 1) { sprintf(sex, " {#M{x"); } else if (wch->sex == 2) { sprintf(sex, " {#F{x"); } else if (wch->sex == 0) { sprintf(sex, " {#N{x"); } if (wch->race < MAX_PC_RACE) { sprintf(race, "%-7s", pc_race_table[wch->race].who_name); } else { sprintf(race, " "); } sprintf(whodesc, "%s%s%s%s %s%s", level, race, class, sex, clan, rank); } else sprintf (whodesc, "%s %s%s", end_string(wch->pcdata->who_descr, 16), clan, rank); /* * Format it up. */ if (!wch->on_quest) { questdat[0] = '\0'; } else { sprintf(questdat, "[{GQ{x] "); } sprintf(buf, "[%s] %s%s%s%s%s%s%s%s%s%s%s%s%s{x\n\r", whodesc, questdat, ((wch->ghost_level >= LEVEL_HERO) && (ch->level >= wch->level)) ? "(Ghost) " : "", wch->incog_level >= LEVEL_HERO ? "(Incog) " : "", wch->invis_level >= LEVEL_HERO ? "(Wizi) " : "", IS_SET (wch->plyr, PLAYER_GHOST) ? "({7G{wH{7O{wS{7T{x) " : "", IS_SET (wch->comm, COMM_QUIET) ? "({@Quiet{x)" : "", IS_SET (wch->comm, COMM_AFK) ? "[{yAFK{x] " : "", IS_SET (wch->act, PLR_TWIT) ? "({RTWIT{x) " : "", (wchRoster && IS_SET (wchRoster->flags, ROST_NEWBIE)) ? "{Y{{{Rn00b{Y}{x " : "", is_enemy(ch, wch) ? "{Y-{RENEMY{Y-{x" : "", wch->pcdata->pretit, wch->name, IS_NPC (wch) ? "" : wch->pcdata->title); if ((wch->played / 3600) > immost_hours) { immplayer_name = wch->name; immost_hours = (wch->played / 3600); } 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; wchClan = get_clan_by_ch( wch ); GET_ROSTER( wch, wchRoster ); if (!can_see(ch, wch) && IS_SHIELDED (wch, SHD_INVISIBLE)) continue; // if(is_affected(wch,gsn_conceal) && ch != wch && !IS_IMMORTAL(ch)) // continue; if (!can_see(ch, wch) && wch->level >= SQUIRE && ch->level < wch->level) continue; if (wch->pcdata->pretit == '\0') wch->pcdata->pretit = "{x"; if (IS_IMMORTAL (wch)) continue; if (fPkillOnly) { //NEWBIE INSERT if (!is_pkill(ch) && !IS_SET (wch->act, PLR_TWIT)) continue; if (IS_SET (wch->act, PLR_TWIT)) break; if (!is_pkill(wch)) continue; if (ch->level > wch->level + 10) continue; if (ch->level < wch->level - 10) continue; if (((ch->pcdata->tier == 3) && (wch->pcdata->tier == 1)) || ((ch->pcdata->tier == 1) && (wch->pcdata->tier == 3))) continue; /*if ( ch->pcdata->prank > (wch->pcdata->prank + 200) ) continue; if ( ch->pcdata->prank < (wch->pcdata->prank - 200) ) continue;*/ /* if ((ch->pcdata->tier == 2) && (wch->pcdata->tier == 1)) continue; if ((ch->pcdata->tier == 1) && (wch->pcdata->tier == 2)) continue; */ /* if (wch->clan == ch->clan && clan_table[ch->clan].name != "LONER") 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 && iClan != wchClan) || (fMCCPOnly && !d->out_compress)) continue; nMatch++; /* * Figure out what to print for class. */ if (wch->sex == 1) { sprintf(sex, " {#M{x"); } else if (wch->sex == 2) { sprintf(sex, " {#F{x"); } else if (wch->sex == 0) { sprintf(sex, " {#N{x"); } if (wch->level == MAX_LEVEL - 9) { if (wch->pcdata->tier >= 3) { sprintf(level, "{#LGD{x "); } else if (wch->pcdata->tier == 2) { sprintf(level, "{!HRO{x "); } else { sprintf(level, "{@LDR{x "); } } else { sprintf(level, "%-3d ", wch->level); } strcpy( clan, end_string( wchClan->c_name, MAX_CLAN_WHO_LENGTH ) ); sprintf( rank, " %s", is_indep(wch) ? "---" : wchClan->r_who[get_r_rank_index( wchRoster )] ); if (wch->pcdata->who_descr[0] == '\0') { if (wch->pcdata->tier == 1) { 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 (wch->pcdata->tier == 2) { 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->race < MAX_PC_RACE) { sprintf(race, "%-7s", pc_race_table[wch->race].who_name); } else { sprintf(race, " "); } sprintf(whodesc, "%s%s%s%s %s%s", level, race, class, sex, clan, rank); } else sprintf(whodesc, "%s%s%s %s%s", level, end_string(wch->pcdata->who_descr, 12), sex, clan, rank); /* * Format it up. */ if (!wch->on_quest) { questdat[0] = '\0'; } else { sprintf(questdat, "[{GQ{x] "); } sprintf(buf, "[%s{x] %s%s%s%s%s%s%s%s%s%s%s%s%s%s{x\n\r", whodesc, questdat, ((wch->ghost_level >= LEVEL_HERO) && (ch->level >= wch->level)) ? "(Ghost) " : "", wch->incog_level >= LEVEL_HERO ? "(Incog) " : "", wch->invis_level >= LEVEL_HERO ? "(Wizi) " : "", IS_SET (wch->plyr, PLAYER_GHOST) ? "({7G{wH{7O{wS{7T{x) " : "", IS_SET (wch->comm, COMM_QUIET) ? "({@Quiet{x)" : "", IS_SET (wch->comm, COMM_AFK) ? "[{yAFK{x] " : "", IS_SET (wch->act, PLR_TWIT) ? "({RTWIT{x) " : "", (wchRoster && IS_SET (wchRoster->flags, ROST_NEWBIE)) ? "{Y{{{Rn00b{Y}{x " : "", "", is_enemy(ch, wch) ? "(ENEMY)" : "", wch->pcdata->pretit, wch->name, IS_NPC (wch) ? "" : wch->pcdata->title); if (wch->pcdata->tier == 1) add_buf(ftier, buf); else if (wch->pcdata->tier == 2) add_buf(stier, buf); else if (wch->pcdata->tier == 3) add_buf(ttier, buf); else add_buf(output, buf); if ((wch->played / 3600) > most_hours) { mplayer_name = wch->name; most_hours = (wch->played / 3600); } } count += countimm; hour = (int) (struct tm *) localtime(¤t_time)->tm_hour; if (hour < 12) { if (is_pm) { is_pm = FALSE; /* Wipe Most-on today count at midnight */ max_on = 0; fp = fopen(MAX_FILE, "w"); fprintf(fp, "%d", max_on); fclose(fp); //expire_notes (); randomize_entrances(ROOM_VNUM_CLANS); } } else { is_pm = TRUE; } if ((fp = fopen(MOST_FILE, "r")) != NULL) { most_ever = fread_number(fp); fclose(fp); } if ((fp = fopen(MAX_FILE, "r")) != NULL) { max_on = fread_number(fp); fclose(fp); } if (count > max_on) { max_on = UMAX (count, max_on); fp = fopen(MAX_FILE, "w"); fprintf(fp, "%d", max_on); fclose(fp); } if (max_on > most_ever) { most_ever = UMAX (max_on, most_ever); fp = fopen(MOST_FILE, "w"); fprintf(fp, "%d", most_ever); fclose(fp); } if (global_quest) { sprintf(buf2, "\n\r{GThe global quest flag is on.{x"); add_buf(output, buf2); } int i; bool found = FALSE; sprintf(buf2, "\r\n{BActive modifiers: "); add_buf(output, buf2); for (i = GMOD_FIRST; i < GMOD_MAX; i++) { float mult = gmod_get_mult(i); if (mult > 1.0f) { if (found) add_buf(output, "{B, "); sprintf(buf2, "{W%s{B({G%.2f{Wx{B)", gmod_get_name(i), mult); add_buf(output, buf2); found = TRUE; } } if (!found) add_buf(output, "{Wnone"); add_buf(output, "{B.{x"); if (nMatch != count) { sprintf(buf2, "\n\r{BMatches found: {W%d{x\n\r", nMatch); add_buf(output, buf2); } else { sprintf( buf2, "\n\r{BPlayers found: {W%d {BMost on today: {W%d {BMost on ever: {W%d{x\n\r", count, max_on, most_ever); add_buf(output, buf2); if (countimm >= 1) { sprintf(buf2, "{BImmortal - Most Hours: {W%s {B- {W%d {BHours.{x\n\r", immplayer_name, immost_hours); add_buf(output, buf2); } sprintf(buf2, "{BMortal - Most Hours: {W%s {B- {W%d {BHours.{x\n\r", mplayer_name, most_hours); add_buf(output, buf2); } add_buf(ftier, buf_string(stier)); add_buf(ftier, buf_string(ttier)); add_buf(ftier, buf_string(output)); add_buf( ftier, "{BPlease {WVOTE{x {Bfor us at:\r\n{Y> {Rhttp://www.mudconnect.com/mud-bin/vote_rank.cgi?mud=Asgard {Y<{x\r\n"); if (countimm >= 1) { add_buf(outputimm, buf_string(ftier)); page_to_char(buf_string(outputimm), ch); } else page_to_char(buf_string(ftier), ch); free_buf(output); free_buf(outputimm); free_buf(ftier); free_buf(stier); free_buf(ttier); return; } void do_count(CHAR_DATA * ch, char *argument) { FILE *fp; 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; /* Wipe Most-on today count at midnight */ max_on = 0; fp = fopen(MAX_FILE, "w"); fprintf(fp, "%d", max_on); fclose(fp); //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++; if (count > max_on) { max_on = UMAX (count, max_on); fp = fopen(MAX_FILE, "w"); fprintf(fp, "%d", max_on); fclose(fp); } 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); } void do_inventory(CHAR_DATA * ch, char *argument) { BUFFER *final = show_list_to_char(ch->carrying, ch, TRUE, TRUE); send_to_char("You are carrying:\n\r", ch); page_to_char(final->string, ch); free_buf(final); return; } void do_equipment(CHAR_DATA * ch, char *argument) { OBJ_DATA *obj; int iWear; int oWear; bool found, showEmpty = FALSE; char buf[MSL]; send_to_char("You are using:\n\r", ch); found = FALSE; if (argument[0] != '\0' && !str_prefix(argument, "empty")) showEmpty = TRUE; for (oWear = 0; oWear < MAX_WEAR; oWear++) { iWear = where_order[oWear]; if ((obj = get_eq_char(ch, iWear)) == NULL) { if (showEmpty) { send_to_char(where_name[iWear], ch); send_to_char("Nothing.\r\n", ch); } continue; } send_to_char(where_name[iWear], ch); 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); if ((ch->level >= LEVEL_HERO) && (found)) { sprintf(buf, "You are currently using %d/50 equipment bonus levels.\n\r", tier_wear_limit(ch, NULL)); send_to_char(buf, ch); } if (!showEmpty) send_to_char("Use the argument \"empty\" to see empty slots\r\n", ch); return; } void do_compare(CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; OBJ_DATA *obj1; OBJ_DATA *obj2; float value1; float 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->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 { value1 = obj_balance(obj1->pIndexData); value2 = obj_balance(obj2->pIndexData); } if (msg == NULL) { if (value2 == 0) value2 = 1; 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; } void do_credits(CHAR_DATA * ch, char *argument) { do_help(ch, "diku"); return; } void do_where(CHAR_DATA * ch, char *argument) { 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') { sprintf(buf, "Players near you in %s:\n\r", ch->in_room->area->name); send_to_char(buf, ch); found = FALSE; for (d = descriptor_list; d; d = d->next) { char name_buf[MIL]; 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) && victim->level < 180) { found = TRUE; if (is_affected(victim, gsn_conceal) || is_affected(victim, gsn_conceal2) || is_affected(victim, gsn_concealClan1) || is_affected(victim, gsn_concealClan2)) { if (!is_same_clan(ch, victim) && !IS_IMMORTAL(ch)) sprintf(buf, "%-28s %s\n\r", get_pers(victim, NULL), victim->in_room->name); else /* (IS_IMMORTAL(ch)) */ sprintf(buf, "(%s) %-28s %s\n\r", get_name(victim, NULL, name_buf), victim->name, victim->in_room->name); send_to_char(buf, ch); } else { 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 && !IS_SET (victim->in_room->room_flags, ROOM_NOWHERE) && can_see(ch, victim) && victim->level < 180) { found = TRUE; if (is_affected(victim, gsn_conceal) && number_percent() > 25 && (!str_prefix(arg, "green") || !str_prefix(arg, "cloaked"))) { sprintf(buf, "%-28s %s\n\r", get_pers(victim, NULL), victim->in_room->name); send_to_char(buf, ch); break; } else if (is_name(arg, victim->name) && !is_affected(victim, gsn_conceal)) { sprintf(buf, "%-28s %s\n\r", //MORPH BREE WHERE 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; } void do_track(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; EXIT_DATA *pexit; ROOM_INDEX_DATA *in_room; sh_int 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; } void do_consider(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; char *msg; int lvldiff, hpdiff, manadiff; 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; } msg = "$N"; act(msg, ch, NULL, victim, TO_CHAR); send_to_char("----------\n\r", ch); lvldiff = victim->level - ch->level; send_to_char("Level: ", ch); if (lvldiff <= 0) msg = "you wouldn't waste your time with them."; else if (lvldiff <= 5) msg = "$N is no match for you."; else if (lvldiff <= 10) msg = "$N cowers in fear from you."; else if (lvldiff <= 15) msg = "$N smiles nervously at you."; else if (lvldiff == 20) msg = "the perfect match!"; else if (lvldiff <= 25) msg = "$N says '{_Do you feel lucky, punk?{x'."; else if (lvldiff <= 30) msg = "$N backs you into a corner."; else if (lvldiff <= 35) msg = "$N says ' Bring a friend'"; else if (lvldiff >= 50) msg = "eats players like you for breakfast."; else msg = "this is not supposed to be seen."; act(msg, ch, NULL, victim, TO_CHAR); hpdiff = (ch->hit - victim->hit); send_to_char("Health:", ch); if (hpdiff >= 150) msg = " you are currently much healthier than $E."; else if (hpdiff >= 50) msg = " you are currently healthier than $E."; else if (hpdiff >= 25) msg = " you are currently slightly healthier than $E."; else if (hpdiff >= 1) msg = " you are a teensy bit healthier than $E."; else if (hpdiff == 0) msg = " $E is a perfect match for you."; else if (hpdiff <= -1) msg = " $E is a teensy bit healthier than you."; else if (hpdiff <= -25) msg = " $E is slightly healthier than you."; else if (hpdiff <= -50) msg = " $E is healthier than you."; else if (hpdiff <= -150) msg = " $E is much healthier than you."; else msg = " this is not supposed to be seen."; act(msg, ch, NULL, victim, TO_CHAR); manadiff = (ch->mana - victim->mana); send_to_char("Magic:", ch); if (manadiff >= 150) msg = " you are currently much more powerful than $E."; else if (manadiff >= 50) msg = " you are currently more powerful than $E."; else if (manadiff >= 25) msg = " you are currently slightly more powerful than $E."; else if (manadiff >= 1) msg = " you are a teensy bit more powerful than $E."; else if (manadiff == 0) msg = " $E is a perfect match for you."; else if (manadiff <= -1) msg = " $E is a teensy bit more powerful than you."; else if (manadiff <= -25) msg = " $E is slightly more powerful than you."; else if (manadiff <= -50) msg = " $E is more powerful than you."; else if (manadiff <= -150) msg = " $E is much more powerful than you."; else msg = " this is not supposed to be seen."; act(msg, ch, NULL, victim, TO_CHAR); return; } void set_title(CHAR_DATA * ch, char *title) { char buf[MAX_STRING_LENGTH]; if (IS_NPC (ch)) { printf_debug("Set_title: NPC."); 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); ch->pcdata->usr_ttl = TRUE; return; } void do_title(CHAR_DATA * ch, char *argument) { 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] == '{' && argument[1] == '\0') return; if (argument[0] == '\0') { send_to_char("Change your title to what?\n\r", ch); return; } if (strlen(argument) > 45) total_length(argument, 45); smash_tilde(argument); set_title(ch, argument); send_to_char("Ok.\n\r", ch); } void do_description(CHAR_DATA * ch, char *argument) { 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; } void do_report(CHAR_DATA * ch, char *argument) { char buf[MAX_INPUT_LENGTH]; sprintf(buf, "You say '{SI have %d/%d hp %d/%d mana %d/%d 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 %d/%d hp %d/%d mana %d/%d 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; } void do_practice(CHAR_DATA * ch, char *argument) { 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 < ch->pcdata->learnlvl[sn] || ch->pcdata->learned[sn] < 1 /* skill is not known */) continue; sprintf(buf, "{&%-18s{x {$%3d%%{x ", 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, "You have {&%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 < ch->pcdata->learnlvl[sn] || ch->pcdata->learned[sn] < 1))) { 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) { sprintf(buf, "You practice $T.{@({&%d{@){x", ch->pcdata->learned[sn]); act(buf, 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. */ void do_wimpy(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; int wimpy; one_argument(argument, arg); if (arg[0] == '\0') wimpy = 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; } void do_password(CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char *pArg; char *pwdnew; char *p; char cEnd; if (IS_NPC (ch)) return; /* * 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 (strcmp(crypt(arg1, ch->pcdata->pwd), ch->pcdata->pwd)) { WAIT_STATE (ch, 40) ; send_to_char ("Wrong password. Wait 10 seconds.\n\r", ch); return; } if (strlen (arg2) < 5) { send_to_char ( "New password must be at least five characters long.\n\r", ch); return; } /* * No tilde allowed because of player file format. */ pwdnew = crypt (arg2, ch->name); for (p = pwdnew; *p != '\0'; p++) { if (*p == '~') { send_to_char ( "New password not acceptable, try again.\n\r", ch); return; } } free_string (ch->pcdata->pwd); ch->pcdata->pwd = str_dup (pwdnew); save_char_obj (ch); send_to_char ("Ok.\n\r", ch); return; } void do_nscore(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH], buf2[256]; BUFFER *output = new_buf(); CLAN_DATA *clan = get_clan_by_ch( ch ); ROSTER_DATA *roster; GET_ROSTER( ch, roster ); if (IS_NPC (ch)) sprintf(buf, "\n\r%s\n\r", ch->name); else sprintf(buf, "\n\r%s%s%s\n\r", ch->pcdata->pretit, ch->name, ch->pcdata->title); add_buf(output, buf); buf[0] = '\0'; sprintf( buf, "{y______________________________________________________________________________{x\n\r"); add_buf(output, buf); sprintf( buf, "{y|\\___________________________________________________________________________/|{x\n\r"); add_buf(output, buf); sprintf( buf, "{y||{WLevel{x: %-3d {WAge{x: %-3d {WRace{x: %-13s {WGender{x: %-6s {WClass{x: %-12s{y||{x\n\r", ch->level + tier_level_bonus(ch), get_age(ch), race_table[ch->race].name, ch->sex == 0 ? "none" : ch->sex == 1 ? "male" : "female", IS_NPC (ch) ? "mobile" : class_table[ch->class].name); add_buf(output, buf); if (get_trust(ch) > LEVEL_HERO) { sprintf( buf, "{y||{WTrust{x: %-3d {WHoly Light{x: %-3s {WWizInvis Level{x: %-3d {WIncognito Level{x: %-3d {y||{x\n\r", get_trust(ch), IS_SET (ch->act, PLR_HOLYLIGHT) ? "on" : "off", ch->invis_level, ch->incog_level); add_buf(output, buf); } if (!IS_NPC (ch)) { sprintf( buf, "{y||{WPractices{x: %-5d {WTrains{x: %-5d {WExperience{x: %-9ld {WNeeded to level{x: %-5ld{y||{x\n\r", ch->practice, ch->train, ch->exp, IS_HERO (ch) ? (0) : ((ch->level + 1) * exp_per_level(ch, ch->pcdata->points) - ch->exp)); add_buf(output, buf); } sprintf( buf, "{y||___________________________________________________________________________||{x\n\r"); add_buf(output, buf); sprintf( buf, "{y|/___________________________________________________________________________\\|{x\n\r"); add_buf(output, buf); sprintf( buf, "{y|\\_______________________________/| |\\_______________________________________/|{x\n\r"); add_buf(output, buf); sprintf( buf, "{y||{x{WStr{x: {Y%-2d{x({C%2d{x) {WHit{x: %-2d {WDam{x: %-2d {y|| ||{x {WHit Points{x: %5d/%5d {WSaves: %5d {y||\n\r", ch->perm_stat[STAT_STR], get_curr_stat(ch, STAT_STR), str_app[get_curr_stat(ch, STAT_STR)].tohit, str_app[get_curr_stat( ch, STAT_STR)].todam, ch->hit, ch->max_hit, ch->saving_throw); add_buf(output, buf); sprintf( buf, "{y||{x{WInt{x: {Y%-2d{x({C%2d{x) {WLearn{x: %-2d%% {y|| ||{x {WMana{x: %5d/%5d {WMove{x: %5d/%5d {y||{x\n\r", ch->perm_stat[STAT_INT], get_curr_stat(ch, STAT_INT), int_app[get_curr_stat(ch, STAT_INT)].learn, ch->mana, ch->max_mana, ch->move, ch->max_move); add_buf(output, buf); sprintf( buf, "{y||{x{WWis{x: {Y%-2d{x({C%2d{x) {WPracs{x: %-2d {y|| ||{x {WHitroll{x: %-3d {WDamroll{x: %-3d {y||{x\n\r", ch->perm_stat[STAT_WIS], get_curr_stat(ch, STAT_WIS), wis_app[get_curr_stat(ch, STAT_WIS)].practice, GET_HITROLL (ch), GET_DAMROLL (ch)); add_buf(output, buf); sprintf( buf, "{y||{x{WDex{x: {Y%-2d{x({C%2d{x) {WACmod{x: %-4d {y|| ||{x {WACpierce{x: %-5d {WACbash{x: %-5d {y||{x\n\r", ch->perm_stat[STAT_DEX], get_curr_stat(ch, STAT_DEX), dex_app[get_curr_stat(ch, STAT_DEX)].defensive, GET_AC (ch, AC_PIERCE), GET_AC (ch, AC_BASH)); add_buf(output, buf); sprintf( buf, "{y||{x{WCon{x: {Y%-2d{x({C%2d{x) {WHP{x: %-2d {WSS{x: %-3d%% {y|| ||{x {WACslash{x: %-8d {WACexotic{x: %-5d {y||{x\n\r", ch->perm_stat[STAT_CON], get_curr_stat(ch, STAT_CON), con_app[get_curr_stat(ch, STAT_CON)].hitp, con_app[get_curr_stat( ch, STAT_CON)].shock, GET_AC (ch, AC_SLASH), GET_AC (ch, AC_EXOTIC)); add_buf(output, buf); sprintf( buf, "{y||_______________________________|| ||_______________________________________||{x\n\r"); add_buf(output, buf); sprintf( buf, "{y|/_______________________________\\| |/_______________________________________\\|{x\n\r"); add_buf(output, buf); sprintf( buf, "{y|\\___________________________________________________________________________/|{x\n\r"); add_buf(output, buf); sprintf( buf, "{y||{WPlatinum{x: %-7ld {WGold{x: %-7ld {WSilver{x: %-7ld {WYour Deity{x: %-9s {y||{x\n\r{y||{WItems{x: %4d/%4d {WWeight{x: %7ld/%7d {WAlign{x: %-5d {y||{x\n\r", ch->platinum, ch->gold, ch->silver, (god_table[ch->god].name), ch->carry_number, can_carry_n(ch), get_carry_weight (ch) / 10, can_carry_w(ch) / 10, ch->alignment); add_buf(output, buf); /* if ( ch->alignment > 900 ) send_to_char( "{&O{7di{&n{x's chosen {x{y||{x\n\r", ch ); else if ( ch->alignment > 700 ) send_to_char( "{&O{7di{&n{x's servant {y||{x\n\r", ch ); else if ( ch->alignment > 350 ) send_to_char( "{Ygood{x {y||{x\n\r", ch ); else if ( ch->alignment > 100 ) send_to_char( "kind {y||{x\n\r", ch ); else if ( ch->alignment > -100 ) send_to_char( "neutral {y||{x\n\r", ch ); else if ( ch->alignment > -350 ) send_to_char( "mean {y||{x\n\r", ch ); else if ( ch->alignment > -700 ) send_to_char( "{Revil {x {y||{x\n\r", ch ); else if ( ch->alignment > -900 ) send_to_char( "{!H{1e{!l{x's servant {x{y||{x\n\r", ch ); else send_to_char( "{!H{1e{!l{x's chosen {x{y||{x\n\r", ch ); */ sprintf( buf, "{y||{WSize:{x %-11s {WWimpy:{x %-5d {WQuest Points:{x %-14d {y||{x\n\r", size_table[ch->size].name, ch->wimpy, ch->questpoints); add_buf(output, buf); if (!IS_NPC(ch)) { if (clan) { sprintf(buf, "{WCLAN:{x %-30s - {WA %-13s {Wclan. {x", end_string(clan->c_name, MAX_CLAN_WHO_LENGTH ), clan->pkill ? "{RPkill {x" : "{WNon-Pkill {x"); sprintf(buf2, "{y||%-76s{y||{x\n\r", buf); add_buf(output, buf2); sprintf (buf, "{y||{W%s Points:{x %-6ld {WHours: {x%-5d {y||{x\n\r", clan->pkill ? "Pkill" : "Arena", roster->pkilldata->kPoints, ch->played/3600); add_buf(output,buf); } if (ch->challenger != NULL) { sprintf( buf, "{y||{x{3[{^Arena{3]{x You have been {rchallenged{x by {b%-10s{x {y||{x\n\r", ch->challenger->name); add_buf(output, buf); } if (ch->challenged != NULL) { sprintf( buf, "{y||{3[{^Arena{3]{x You have {rchallenged{x {b%-10s{x {y||{x\n\r", ch->challenged->name); add_buf(output, buf); } if (ch->gladiator != NULL) { sprintf( buf, "{y||{3[{{^Arena Bet{3]{x You have a {y%-8d{x gold bet on {b%-10s{x {y||\n\r", ch->pcdata->plr_wager, ch->gladiator->name); add_buf(output, buf); } } if (!IS_NPC (ch) && ch->pcdata->condition[COND_DRUNK] > 10) { sprintf( buf, "{y|| {xYou are {ydrunk.{x {y||{x\n\r"); add_buf(output, buf); } if (!IS_NPC (ch) && ch->pcdata->condition[COND_THIRST] == 0) { sprintf( buf, "{y|| {xYou are {^thirsty.{x {y||{x\n\r"); add_buf(output, buf); } if (!IS_NPC (ch) && ch->pcdata->condition[COND_HUNGER] == 0) { sprintf( buf, "{y|| {xYou are {#hungry.{x {y||{x\n\r"); add_buf(output, buf); } if (IS_SET(ch->plyr,PLAYER_GHOST) && ch->ghost_timer > 0) { sprintf( buf, "{y|| {xYou are a {7G{wH{7O{wS{7T{x for %d more ticks. {y||{x\n\r", ch->ghost_timer); add_buf(output, buf); } if (ch->fight_timer > 0) { sprintf( buf, "{y|| {xYou have ({R%2d{x) ticks left on your fight timer. {y||{x\n\r", ch->fight_timer); add_buf(output, buf); } switch (ch->position) { case POS_DEAD: sprintf( buf, "{y||{x You are {z{!DEAD!!{x {y||{x\n\r"); add_buf(output, buf); break; case POS_MORTAL: sprintf( buf, "{y||{x You are {%mortally wounded!!{x {y||{x\n\r"); add_buf(output, buf); break; case POS_INCAP: sprintf( buf, "{y||{x You are {1incapacitated.{x {y||{x\n\r"); add_buf(output, buf); break; case POS_STUNNED: sprintf( buf, "{y||{x You are {@stunned.{x {y||{x\n\r"); add_buf(output, buf); break; case POS_SLEEPING: sprintf( buf, "{y||{x You are {$sleeping.{x {y||{x\n\r"); add_buf(output, buf); break; case POS_RESTING: sprintf( buf, "{y||{x You are {4resting.{x {y||{x\n\r"); add_buf(output, buf); break; case POS_STANDING: sprintf( buf, "{y||{x You are {5standing.{x {y||{x\n\r"); add_buf(output, buf); break; case POS_FIGHTING: sprintf( buf, "{y||{x You are {&fighting.{x {y||{x\n\r"); add_buf(output, buf); break; } sprintf( buf, "{y||{WHp Regen Rate: {R%-3d{x {W:: Mana Regen Rate: {R%-3d{x {y||{x\n\r", ch->regen_rate, ch->mana_regen_rate); add_buf(output, buf); sprintf( buf, "{y||___________________________________________________________________________||{x\n\r"); add_buf(output, buf); sprintf( buf, "{y|/___________________________________________________________________________\\|{x\n\r"); add_buf(output, buf); page_to_char(buf_string(output), ch); if (IS_SET (ch->comm, COMM_SHOW_AFFECTS)) do_affects(ch, ""); } void do_gods(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; int god; int blank; blank = 0; if (IS_NPC (ch)) return; send_to_char(" ", ch); for (god = 0; god < MAX_GOD; god++) { if ((god_table[god].pc_evil && ch->alignment <= -200) || (god_table[god].pc_neutral && ch->alignment == 0) || (god_table[god].pc_good && ch->alignment >= 200)) { if ((god_table[god].pc_mage && ch->class == 0) || (god_table[god].pc_cleric && ch->class == 1) || (god_table[god].pc_thief && ch->class == 2) || (god_table[god].pc_warrior && ch->class == 3) || (god_table[god].pc_ranger && ch->class == 4) || (god_table[god].pc_druid && ch->class == 5) || (god_table[god].pc_vampire && ch->class == 6) || (god_table[god].pc_wizard && ch->class == 7) || (god_table[god].pc_priest && ch->class == 8) || (god_table[god].pc_mercenary && ch->class == 9) || (god_table[god].pc_gladiator && ch->class == 10) || (god_table[god].pc_strider && ch->class == 11) || (god_table[god].pc_sage && ch->class == 12) || (god_table[god].pc_lich && ch->class == 13) || (god_table[god].pc_forsaken && ch->class == 14) || (god_table[god].pc_conjurer && ch->class == 15) || (god_table[god].pc_archmage && ch->class == 16) || (god_table[god].pc_voodan && ch->class == 17) || (god_table[god].pc_monk && ch->class == 18) || (god_table[god].pc_saint && ch->class == 19) || (god_table[god].pc_assassin && ch->class == 20) || (god_table[god].pc_ninja && ch->class == 21) || (god_table[god].pc_bard && ch->class == 22) || (god_table[god].pc_barbarian && ch->class == 23) || (god_table[god].pc_swashbuckler && ch->class == 24) || (god_table[god].pc_crusader && ch->class == 25) || (god_table[god].pc_darkpaladin && ch->class == 26) || (god_table[god].pc_hunter && ch->class == 27) || (god_table[god].pc_paladin && ch->class == 28) || (god_table[god].pc_warlock && ch->class == 29) || (god_table[god].pc_alchemist && ch->class == 30) || (god_table[god].pc_shaman && ch->class == 31) || (god_table[god].pc_fade && ch->class == 32) || (god_table[god].pc_banshee && ch->class == 33)) { sprintf(buf, "%-10s ", god_table[god].name); send_to_char(buf, ch); } if (++blank % 3 == 0) send_to_char("\n\r ", ch); } } return; } void do_identify(CHAR_DATA * ch, char *argument) { OBJ_DATA *obj; CHAR_DATA *rch; if ((obj = get_obj_carry(ch, argument)) == NULL) { send_to_char("You are not carrying that.\n\r", ch); return; } for (rch = ch->in_room->people; rch != NULL; rch = rch->next_in_room) if (IS_NPC (rch) && rch->pIndexData->vnum == MOB_VNUM_SAGE) break; if (!rch) { send_to_char("No one here seems to know much about that.\n\r", ch); return; } if (IS_IMMORTAL (ch)) act("$n cackles and comps you!\n\r", rch, obj, ch, TO_VICT); else if (ch->gold < obj->level * 100 + 50 && ch->platinum < obj->level * .25) { act("$n resumes tossing bones without looking at $p.", rch, obj, 0, TO_ROOM); return; } else if (ch->gold > obj->level * 100 + 50) { ch->gold -= obj->level * 100 + 50; send_to_char("Your purse feels lighter.\n\r", ch); } else if (ch->platinum > obj->level * .25) { ch->platinum -= obj->level * .25; send_to_char("Your purse feels lighter.\n\r", ch); } act("$n fondles $p and tosses some chicken bones to the ground.", rch, obj, 0, TO_ROOM); spell_identify(100, 0, ch, obj, 0); } void do_subdue(CHAR_DATA *ch, char *argument) { if (IS_NPC(ch)) return; if (IS_SET(ch->plyr, PLAYER_SUBDUE)) { send_to_char("You will now Kill your victims.\n\r", ch); REMOVE_BIT(ch->plyr,PLAYER_SUBDUE); } else { send_to_char("You will now subdue your victims.\n\r", ch); SET_BIT(ch->plyr,PLAYER_SUBDUE); } } const struct l_form look_form[] = { { " ", " " }, // MORPH_CONCEAL { "a {Dg{wr{We{Dy{X {Dshadow{X", "A {Dg{wr{We{wy{X {Dshadow{X is standing here. \n\r" }, // MORPH_BAT { "a bat", "A huge bat is flying here.\n\r" }, // MORPH_WOLF { "a wolf", "A large grey wolf stands here.\n\r" }, // MORPH_BEAR { "a bear", "A large, mean looking bear is standing here.\n\r" }, // MORPH_RED { "a red dragon", "A red dragon is here breathing plumes of smoke.\n\r" }, // MORPH_BLACK { "a black dragon", "A black dragon is here spitting burning acids.\n\r" }, // MORPH_GREEN { "a green dragon", "A green dragon is here breathing noxious poison.\n\r" }, // MORPH_WHITE { "a white dragon", "A white dragon sends out blasts of freezing air at you.\n\r" }, // MORPH_GOLD { "a gold dragon", "A gold dragon gazes down at you here.\n\r" }, // MORPH_MORPH { "an odd", "An odd-looking person stands here.\n\r" }, // MORPH_CONCEAL2 { "a giant wolf", "A giant wolf is here, growling.\n\r" }, // MORPH_CONCEAL3 { "a gaseous cloud", "A cloud of boiling gasses is here.\n\r" }, { "a cloaked figure", "A cloaked figure stands here.\n\r" }, { "a shrouded figure", "A shrouded figure stands here.\n\r" }, { "a cloaked figure", "A cloaked figure stands here.\n\r" }, { "a goat headed", "A goat headed person stands here.\n\r" }, { "a lion headed", "A lion headed person stands here.\n\r" }, { "a dragon headed", "A dragon headed person stands here.\n\r" }, { "", "" } }; /* Morph Stuff */ char * get_descr_form(CHAR_DATA *ch, CHAR_DATA *looker, bool get_long) { char buf[MAX_STRING_LENGTH]; char *buf2; buf[0] = '\0'; buf2 = ""; if (get_long) { if (ch->morph_form[0] == 0 || ch->morph_form[0] == MORPH_MORPH) return ch->long_descr; else return look_form[UMAX(ch->morph_form[0], 0)].long_descr; } else { if (ch->morph_form[0] == 0) return PERS(ch, looker); else if (ch->morph_form[0] < MORPH_MORPH) return look_form[ch->morph_form[0]].short_descr; else if (ch->morph_form[0] == MORPH_MORPH) return ch->morph; else if (ch->sex == SEX_MALE) sprintf(buf, "%s %s", look_form[ch->morph_form[0]].short_descr, "man"); else if (ch->sex == SEX_FEMALE) sprintf(buf, "%s %s", look_form[ch->morph_form[0]].short_descr, "woman"); else sprintf(buf, "%s %s", look_form[ch->morph_form[0]].short_descr, "creature"); buf2 = buf; return buf2; } if (get_long) return ch->long_descr; return PERS(ch,looker); } /* void update_ranklist(CHAR_DATA *ch) { #define RANK_SHOW 20 ARANK_DATA *arank; PRANK_DATA *prank; Linear Sort for (count = 0; count < RANK_SHOW; count++) { x = count; for (index = count + 1; index < RANK_SHOW; index++) if (data[index] > data[x]) x = index; if (x > count) swap(data[x], data[count]); } } */ void do_unghost(CHAR_DATA *ch) { if (IS_NPC (ch)) return; if (!IS_SET(ch->plyr,PLAYER_GHOST)) { send_to_char("You aren't a ghost.\n\r", ch); return; } else { ch->ghost_timer = 0; REMOVE_BIT(ch->plyr,PLAYER_GHOST); act("You feel more real.", ch, NULL, NULL, TO_CHAR); act("$n fades into reality.", ch, NULL, NULL, TO_ROOM); } } /*void do_sunder( CHAR_DATA *ch, char *argument ) { if ( IS_NPC( ch ) || ch->class != CLASS_CRUSADER ) { send_to_char("{wIf you want sunder, then go Crusader!\n\r{x",ch); return; } if ( IS_SET(ch->ability_crusader, ABILITY_CRUSADER_SUNDER ) ) { send_to_char( "{cYou will no longer have the ability to {wsunder{c your opponent.{x\n\r",ch); REMOVE_BIT( ch->ability_crusader, ABILITY_CRUSADER_SUNDER ); } else { if ( ch->mana < ch->level/2 ) { send_to_char("{rYou do not have enough money to turn on this ability!{x\n\r",ch); return; } send_to_char( "{mYou will now have the ability to {wsunder{m your opponent.{x\n\r",ch); SET_BIT( ch->ability_crusader, ABILITY_CRUSADER_SUNDER ); ch->mana -= ch->mana / 4; } } */ void do_nightstalker(CHAR_DATA *ch, char *argument) { // int count; if ((ch->class == CLASS_SHADE || ch->class == CLASS_LICH || ch->class == CLASS_FADE || ch->class == CLASS_BANSHEE) && !IS_NPC(ch)) { // count = 1; } else { send_to_char("{wYou can already don't get harmed by sunlight!\n\r{x", ch); return; } if (IS_SET( ch->ability_lich, ABILITY_LICH_NIGHTSTALKER )) { // if (time_info.hour >= 16 && time_info.hour <= 18) // { send_to_char( "{cYou will no longer feel the harmful effects of sunlight, or feel the power of the night.{x\n\r", ch); REMOVE_BIT( ch->ability_lich, ABILITY_LICH_NIGHTSTALKER ); // } // else // { // send_to_char( // "{rYou must wait until the dusk of the evening to relinquish the {DNightstalker{r!{x\n\r", // ch); // return; // } } else { // if (time_info.hour >= 4 && time_info.hour <= 6) // { send_to_char( "{mYou can now bask in the power of the night, but dread the harmful ray of sunlight!{x\n\r", ch); SET_BIT( ch->ability_lich, ABILITY_LICH_NIGHTSTALKER ); ch->mana = ch->mana / 2; WAIT_STATE(ch,48) ; act("{R$n {renters a deep trance as they are consumed by the {DNightstalker{r!{x",ch,NULL,NULL,TO_ROOM); // } // else // { // send_to_char( "{rYou must wait until the dawn of a new day to decide to invoke the {DNightstalker{r!{x\n\r",ch); // return; // } } } //VoOdan sense vitality by fesdor, works with sense vitality spell. void do_sense(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; char hp[MAX_STRING_LENGTH]; char mana[MSL]; char move[MSL]; char buf[MSL]; int temp = 0; if (ch->class != CLASS_VOODAN || get_skill(ch, gsn_sense) == 0) { send_to_char("You do not know how to sense vitals.\n\r", ch); return; } if (argument[0] == '\0') { send_to_char("Sense who?\n\r", ch); return; } victim = get_char_world(ch, argument); if (victim == NULL || victim->level > LEVEL_HERO) { send_to_char("You Failed.\n\r", ch); return; } if (saves_spell(ch->level + 5, victim, DAM_OTHER)) { send_to_char("You Failed.\n\r", ch); return; } if (!is_affected(ch, gsn_sense)) { send_to_char("You are not sensing anyone right now!\n\r", ch); return; } else if (!is_affected(victim, gsn_sense)) { send_to_char("You are not attuned to that player's vitals!\n\r", ch); return; } else { BUFFER *final; final = new_buf(); if (victim->max_move > 0) temp = (100 * victim->move) / victim->max_move; else temp = 0; if (temp >= 68) { sprintf(move, "{G%d{x", temp); } else if (temp >= 34) { sprintf(move, "{Y%d{x", temp); } else if (temp <= 33) { sprintf(move, "{R%d{x", temp); } else sprintf(move, "{R%d{x", temp); if (victim->max_hit > 0) temp = (100 * victim->hit) / victim->max_hit; else temp = 0; if (temp >= 68) { sprintf(hp, "{G%d{x", temp); } else if (temp >= 34) { sprintf(hp, "{Y%d{x", temp); } else if (temp <= 33) { sprintf(hp, "{R%d{x", temp); } else sprintf(hp, "{R%d{x", temp); if (victim->max_mana > 0) temp = (100 * victim->mana) / victim->max_mana; else temp = 0; if (temp >= 68) { sprintf(mana, "{G%d{x", temp); } else if (temp >= 34) { sprintf(mana, "{Y%d{x", temp); } else if (temp <= 33) { sprintf(mana, "{R%d{x", temp); } else sprintf(mana, "{R%d{x", temp); sprintf(buf, "You sense %s's vitals: %s{c%%hp %s{c%%mp %s{c%%mv{x", victim->name, hp, mana, move); add_buf(final, buf); page_to_char(buf_string(final), ch); free_buf(final); WAIT_STATE(ch, 6) ; return; } return; } void do_newlook(CHAR_DATA *ch, char *argument) { if (IS_NPC(ch)) return; if (IS_SET(ch->plyr, PLAYER_NEWLOOK)) send_to_char("New look disabled.\r\n", ch); else send_to_char("New look enabled.\r\n", ch); TOGGLE_BIT(ch->plyr, PLAYER_NEWLOOK); } void do_gamestatus(CHAR_DATA *ch, char *argument) { BUFFER *output = new_buf(); char tbuf[MAX_STRING_LENGTH], vbuf[MAX_STRING_LENGTH], format_buf[MAX_STRING_LENGTH]; extern char str_boot_time[]; extern time_t startup_time; int day = time_info.day + 1; GMOD_TICKET *ticket; #define PBUF(Key, Value, ...) \ sprintf(tbuf, "%s", end_string(Key, 16)); \ sprintf(vbuf, Value, ## __VA_ARGS__); \ sprintf(format_buf, "| {W%s {w%s {B|\r\n", \ tbuf, end_string(vbuf, 24)); \ add_buf(output, format_buf); add_buf(output, "{B+--------------- {GGame Status{B ---------------+\r\n"); PBUF("Startup time:", "%s", str_boot_time); PBUF("Current time:", "%s", (char*)ctime(¤t_time)); int days, hours, mins, secs; secs = current_time-startup_time; mins = secs/60; hours = mins/60; days = hours/24; PBUF("Uptime:", "%dd %dh %dm %ds", days, hours % 24, mins % 60, secs % 60); PBUF("Mud time:", "%d%2s %3s %3s %d", time_info.hour % 12, time_info.hour >= 12 ? "PM" : "AM", day_name[day % 7], month_name[time_info.month], day); PBUF("XP modifier:", "%.2fx", gmod_get_mult(GMOD_XP)); for (ticket = gmod_tickets; ticket != NULL; ticket = ticket->next) { if (ticket->type != GMOD_XP) continue; sprintf(format_buf, " +%.2fx ticket:", ticket->multiplier); PBUF(format_buf, "%ld minutes left", (ticket->expiry_time-current_time)/60); } PBUF("QR modifier:", "%.2fx", gmod_get_mult(GMOD_QP)); for (ticket = gmod_tickets; ticket != NULL; ticket = ticket->next) { if (ticket->type != GMOD_QP) continue; sprintf(format_buf, " +%.2fx ticket:", ticket->multiplier); PBUF(format_buf, "%ld minutes left", (ticket->expiry_time-current_time)/60); } if (IS_IMMORTAL(ch)) { extern bool wizlock, newlock; PBUF("Wizlocked:", "%s", wizlock ? "YES" : "NO"); PBUF("Newlocked:", "%s", newlock ? "YES" : "NO"); } add_buf(output, "+-------------------------------------------+{x\r\n"); page_to_char(output->string, ch); free_buf(output); }