/* ************************************************************************ * File: act.informative.c Part of CircleMUD * * Usage: Player-level commands of an informative nature * * * * All rights reserved. See license.doc for complete information. * * * * Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University * * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * ************************************************************************ */ #include "conf.h" #include "sysdep.h" #include "structs.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "spells.h" #include "screen.h" #include "constants.h" #include "dg_scripts.h" /* extern variables */ extern int top_of_helpt; extern struct help_index_element *help_table; extern char *help; extern struct time_info_data time_info; extern const char *weekdays[]; extern const char *month_name[]; extern struct room_data *world; extern struct descriptor_data *descriptor_list; extern struct char_data *character_list; extern struct obj_data *object_list; extern int top_of_world; extern char *credits; extern char *news; extern char *info; extern char *motd; extern char *imotd; extern char *wizlist; extern char *immlist; extern char *policies; extern char *handbook; extern struct spell_entry spells[]; extern char *class_abbrevs[]; /* extern functions */ ACMD(do_action); long find_class_bitvector(char arg); long long level_exp(int chclass, long long level); char *title_male(int chclass, int level); char *title_female(int chclass, int level); extern struct help_index_element *help_table; struct time_info_data *real_time_passed(time_t t2, time_t t1); /* local functions */ void print_object_location(int num, struct obj_data * obj, struct char_data * ch, int recur); void show_obj_to_char(struct obj_data * object, struct char_data * ch, int mode); void list_obj_to_char(struct obj_data * list, struct char_data * ch, int mode, int show); ACMD(do_look); ACMD(do_examine); ACMD(do_gold); ACMD(do_score); ACMD(do_inventory); ACMD(do_equipment); ACMD(do_time); ACMD(do_weather); ACMD(do_pushup); ACMD(do_situp); ACMD(do_help); ACMD(do_who); ACMD(do_finger); ACMD(do_users); ACMD(do_gen_ps); void perform_mortal_where(struct char_data * ch, char *arg); void perform_immort_where(struct char_data * ch, char *arg); ACMD(do_where); ACMD(do_levels); ACMD(do_consider); ACMD(do_diagnose); ACMD(do_affects); ACMD(do_color); ACMD(do_toggle); void sort_commands(void); ACMD(do_commands); void diag_char_to_char(struct char_data * i, struct char_data * ch); void look_at_char(struct char_data * i, struct char_data * ch); void list_one_char(struct char_data * i, struct char_data * ch); void list_char_to_char(struct char_data * list, struct char_data * ch); void do_auto_exits(struct char_data * ch); ACMD(do_exits); void look_in_direction(struct char_data * ch, int dir); void look_in_obj(struct char_data * ch, char *arg); char *find_exdesc(char *word, struct extra_descr_data * list); void look_at_target(struct char_data * ch, char *arg); /* * This function screams bitvector... -gg 6/45/98 */ void show_obj_to_char(struct obj_data * object, struct char_data * ch, int mode) { bool found; *buf = '\0'; if ((mode == 0) && object->description) strcpy(buf, object->description); else if (object->short_description && ((mode == 1) || (mode == 2) || (mode == 3) || (mode == 4))) strcpy(buf, object->short_description); else if (mode == 5) { if (GET_OBJ_TYPE(object) == ITEM_NOTE) { if (object->action_description) { strcpy(buf, "There is something written upon it:\r\n\r\n"); strcat(buf, object->action_description); page_string(ch->desc, buf, 1); } else act("It's blank.", FALSE, ch, 0, 0, TO_CHAR); return; } else if (GET_OBJ_TYPE(object) != ITEM_DRINKCON) { strcpy(buf, "You see nothing special.."); } else /* ITEM_TYPE == ITEM_DRINKCON||FOUNTAIN */ strcpy(buf, "It looks like a drink container."); } if (mode != 3) { found = FALSE; if (IS_OBJ_STAT(object, ITEM_INVISIBLE)) { strcat(buf, " (invisible)"); found = TRUE; } if (IS_OBJ_STAT(object, ITEM_ZANZOKEN) && AFF_FLAGGED(ch, AFF_DETECT_ALIGN)) { strcat(buf, " ..It glows blue!"); found = TRUE; } if (IS_OBJ_STAT(object, ITEM_MAGIC) && AFF_FLAGGED(ch, AFF_DETECT_MAGIC)) { strcat(buf, " ..It glows yellow!"); found = TRUE; } if (IS_OBJ_STAT(object, ITEM_GLOW)) { strcat(buf, " (&03Glowing&00)"); found = TRUE; } if (IS_OBJ_STAT(object, ITEM_HUM)) { strcat(buf, " (&05Humming&00)"); found = TRUE; } } strcat(buf, "\r\n"); page_string(ch->desc, buf, TRUE); } void list_obj_to_char(struct obj_data * list, struct char_data * ch, int mode, int show) { struct obj_data *i; bool found; found = FALSE; for (i = list; i; i = i->next_content) { if (CAN_SEE_OBJ(ch, i)) { show_obj_to_char(i, ch, mode); found = TRUE; } } if (!found && show) send_to_char(" Nothing.\r\n", ch); } void diag_char_to_char(struct char_data * i, struct char_data * ch) { int percent; if (GET_MAX_HIT(i) > 0) percent = (100 * GET_HIT(i)) / GET_MAX_HIT(i); else percent = -1; /* How could MAX_HIT be < 1?? */ strcpy(buf, PERS(i, ch)); CAP(buf); if (percent >= 100) strcat(buf, " is in excellent condition.\r\n"); else if (percent >= 90) strcat(buf, " has a few scratches.\r\n"); else if (percent >= 75) strcat(buf, " has some small wounds and bruises.\r\n"); else if (percent >= 50) strcat(buf, " has quite a few wounds.\r\n"); else if (percent >= 30) strcat(buf, " has some big nasty wounds and scratches.\r\n"); else if (percent >= 15) strcat(buf, " looks pretty hurt.\r\n"); else if (percent >= 0) strcat(buf, " is in awful condition.\r\n"); else strcat(buf, " is bleeding awfully from big wounds.\r\n"); send_to_char(buf, ch); } void look_at_char(struct char_data * i, struct char_data * ch) { int j, found; struct obj_data *tmp_obj; if (!ch->desc) return; if (i->player.description) send_to_char(i->player.description, ch); else act("You see nothing special about $m.", FALSE, i, 0, ch, TO_VICT); diag_char_to_char(i, ch); found = FALSE; for (j = 0; !found && j < NUM_WEARS; j++) if (GET_EQ(i, j) && CAN_SEE_OBJ(ch, GET_EQ(i, j))) found = TRUE; if (found) { act("\r\n$n is using:", FALSE, i, 0, ch, TO_VICT); for (j = 0; j < NUM_WEARS; j++) if (GET_EQ(i, j) && CAN_SEE_OBJ(ch, GET_EQ(i, j))) { send_to_char(where[j], ch); show_obj_to_char(GET_EQ(i, j), ch, 1); } } if (ch != i && (IS_icer(ch) || GET_LEVEL(ch) >= LVL_IMMORT)) { found = FALSE; act("\r\nYou attempt to peek at $s inventory:", FALSE, i, 0, ch, TO_VICT); for (tmp_obj = i->carrying; tmp_obj; tmp_obj = tmp_obj->next_content) { if (CAN_SEE_OBJ(ch, tmp_obj) && (number(0, 20) < GET_LEVEL(ch))) { show_obj_to_char(tmp_obj, ch, 1); found = TRUE; } } if (!found) send_to_char("You can't see anything.\r\n", ch); } } void list_one_char(struct char_data * i, struct char_data * ch) { struct player_special_data; const char *positions[] = { " is lying here, dead.", " is lying here, mortally wounded.", " is lying here, incapacitated.", " is lying here, stunned.", " is sleeping here.", " is resting here.", " is sitting here.", "!FIGHTING!", " is standing here." }; if (IS_NPC(i) && i->player.long_descr && GET_POS(i) == GET_DEFAULT_POS(i)) { if (AFF_FLAGGED(i, AFF_INVISIBLE)) strcpy(buf, "*"); else *buf = '\0'; if (AFF_FLAGGED(ch, AFF_DETECT_ALIGN)) { if (IS_EVIL(i)) strcat(buf, "(Red Aura) "); else if (IS_GOOD(i)) strcat(buf, "(Blue Aura) "); } strcat(buf, i->player.long_descr); send_to_char(buf, ch); if (AFF_FLAGGED(i, AFF_BARRIER)) act("&12...$e is engulfed in a globe of energy.&00", FALSE, i, 0, ch, TO_VICT); if (AFF_FLAGGED(i, AFF_SOLAR_FLARE)) act("...$e is groping around blindly!", FALSE, i, 0, ch, TO_VICT); return; } if (IS_NPC(i)) { strcpy(buf, i->player.short_descr); CAP(buf); } else sprintf(buf, "&15A %s %s &15with %s &15eyes and %s %s &15hair", genders[(int) i->player.sex], class_abbrevs[(int) i->player.chclass], eyes[(int) i->player.eye], hl[(int) i->player.hairl], hc[(int) i->player.hairc] ); if (AFF_FLAGGED(i, AFF_INVISIBLE)) strcat(buf, " (invisible)"); if (AFF_FLAGGED(i, AFF_HIDE)) strcat(buf, " (hidden)"); if (!IS_NPC(i) && !i->desc) strcat(buf, " (linkless)"); if (PLR_FLAGGED(i, PLR_WRITING)) strcat(buf, " (writing)"); if (GET_POS(i) != POS_FIGHTING) strcat(buf, positions[(int) GET_POS(i)]); else { if (FIGHTING(i)) { strcat(buf, " is here, fighting "); if (FIGHTING(i) == ch) strcat(buf, "YOU!"); else { if (i->in_room == FIGHTING(i)->in_room) strcat(buf, PERS(FIGHTING(i), ch)); else strcat(buf, "someone who has already left"); strcat(buf, "!"); } } else /* NIL fighting pointer */ strcat(buf, " is here struggling with thin air."); } if (AFF_FLAGGED(ch, AFF_DETECT_ALIGN)) { if (IS_EVIL(i)) strcat(buf, " (Red Aura)"); else if (IS_GOOD(i)) strcat(buf, " (Blue Aura)"); } strcat(buf, "\r\n"); send_to_char(buf, ch); if (AFF_FLAGGED(i, AFF_BARRIER)) act("&12...$e is engulfed in a globe of energy.&00", FALSE, i, 0, ch, TO_VICT); } void list_char_to_char(struct char_data * list, struct char_data * ch) { struct char_data *i; for (i = list; i; i = i->next_in_room) if (ch != i) { if (CAN_SEE(ch, i)) list_one_char(i, ch); else if (IS_DARK(ch->in_room) && !CAN_SEE_IN_DARK(ch) && AFF_FLAGGED(i, AFF_INFRAVISION)) send_to_char("You see a pair of glowing red eyes looking your way.\r\n", ch); } } void do_auto_exits(struct char_data * ch) { int door; *buf = '\0'; for (door = 0; door < NUM_OF_DIRS; door++) if (EXIT(ch, door) && EXIT(ch, door)->to_room != NOWHERE && !EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED)) { if (GET_LEVEL(ch) >= LVL_IMMORT) sprintf(buf2, "%-5s &09- &10[&11%5d&10 ] &15%s&15\r\n", dirs[door], GET_ROOM_VNUM(EXIT(ch, door)->to_room), world[EXIT(ch, door)->to_room].name); else { sprintf(buf2, "%-5s&00 &09-&15 ", dirs[door]); if (IS_DARK(EXIT(ch, door)->to_room) && !CAN_SEE_IN_DARK(ch)) strcat(buf2, ""); else { strcat(buf2, world[EXIT(ch, door)->to_room].name); strcat(buf2, "\r\n"); } } strcat(buf, CAP(buf2)); } send_to_char("&15Obvious exits:&15\r\n", ch); if (*buf) send_to_char(buf, ch); else send_to_char(" &15None.&00\r\n", ch); } ACMD(do_exits) { int door; *buf = '\0'; if (AFF_FLAGGED(ch, AFF_SOLAR_FLARE)) { send_to_char("You can't see a damned thing, you're SOLAR_FLARE!\r\n", ch); return; } for (door = 0; door < NUM_OF_DIRS; door++) if (EXIT(ch, door) && EXIT(ch, door)->to_room != NOWHERE && !EXIT_FLAGGED(EXIT(ch, door), EX_CLOSED)) { if (GET_LEVEL(ch) >= LVL_IMMORT) sprintf(buf2, "%-5s - [%5d] %s\r\n", dirs[door], GET_ROOM_VNUM(EXIT(ch, door)->to_room), world[EXIT(ch, door)->to_room].name); else { sprintf(buf2, "%-5s - ", dirs[door]); if (IS_DARK(EXIT(ch, door)->to_room) && !CAN_SEE_IN_DARK(ch)) strcat(buf2, "Too dark to tell\r\n"); else { strcat(buf2, world[EXIT(ch, door)->to_room].name); strcat(buf2, "\r\n"); } } strcat(buf, CAP(buf2)); } send_to_char("Obvious exits:\r\n", ch); if (*buf) send_to_char(buf, ch); else send_to_char(" None.\r\n", ch); } void look_at_room(struct char_data * ch, int ignore_brief) { if (!ch->desc) return; if (IS_DARK(ch->in_room) && !CAN_SEE_IN_DARK(ch)) { send_to_char("It is pitch black...\r\n", ch); return; } else if (AFF_FLAGGED(ch, AFF_SOLAR_FLARE)) { send_to_char("You see nothing but infinite darkness...\r\n", ch); return; } send_to_char(CCCYN(ch, C_NRM), ch); if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_ROOMFLAGS)) { sprintbit(ROOM_FLAGS(ch->in_room), room_bits, buf); sprintf(buf2, "[%5d] %s [ %s]", GET_ROOM_VNUM(IN_ROOM(ch)), world[ch->in_room].name, buf); send_to_char(buf2, ch); } else send_to_char(world[ch->in_room].name, ch); send_to_char(CCNRM(ch, C_NRM), ch); send_to_char("\r\n", ch); if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV10)) { send_to_char("&15Gravity:&11 10 times normal gravity.&00\r\n", ch); } else if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV100)) { send_to_char("&15Gravity:&11 100 times normal gravity.&00\r\n", ch); } else if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV200)) { send_to_char("&15Gravity:&11 200 times normal gravity.&00\r\n", ch); } else if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV300)) { send_to_char("&15Gravity:&11 300 times normal gravity.&00\r\n", ch); } else if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV400)) { send_to_char("&15Gravity:&11 400 times normal gravity.&00\r\n", ch); } else if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_SPIRIT)) { send_to_char("&15Gravity: Unknown&00\r\n", ch); } else send_to_char("&15Gravity:&11 Normal&00\r\n", ch); if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_HVLOW)) { send_to_char("&15Room Height:&11 Very low&00\r\n", ch); } else if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_HLOW)) { send_to_char("&15Room Height:&11 Low&00\r\n", ch); } else if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_HMED)) { send_to_char("&15Room Height:&11 Medium&00\r\n", ch); } else if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_HHIGH)) { send_to_char("&15Room Height:&11 High&00\r\n", ch); } else if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_HVHIGH)) { send_to_char("&15Room Height:&11 Very High&00\r\n", ch); } else if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_HNOLIM)) { send_to_char("&15Room Height:&11 Limitless&00\r\n", ch); } else send_to_char("&15Room Height:&11 Medium&00\r\n", ch); if ((!IS_NPC(ch) && !PRF_FLAGGED(ch, PRF_BRIEF)) || ignore_brief || ROOM_FLAGGED(ch->in_room, ROOM_DEATH)) send_to_char(world[ch->in_room].description, ch); /* autoexits */ if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_AUTOEXIT)) do_auto_exits(ch); /* now list characters & objects */ send_to_char(CCGRN(ch, C_NRM), ch); list_obj_to_char(world[ch->in_room].contents, ch, 0, FALSE); send_to_char(CCYEL(ch, C_NRM), ch); list_char_to_char(world[ch->in_room].people, ch); send_to_char(CCNRM(ch, C_NRM), ch); } void look_in_direction(struct char_data * ch, int dir) { if (EXIT(ch, dir)) { if (EXIT(ch, dir)->general_description) send_to_char(EXIT(ch, dir)->general_description, ch); else send_to_char("You don't see anything special.\r\n", ch); if (EXIT_FLAGGED(EXIT(ch, dir), EX_CLOSED) && EXIT(ch, dir)->keyword) { sprintf(buf, "The %s is closed.\r\n", fname(EXIT(ch, dir)->keyword)); send_to_char(buf, ch); } else if (EXIT_FLAGGED(EXIT(ch, dir), EX_ISDOOR) && EXIT(ch, dir)->keyword) { sprintf(buf, "The %s is open.\r\n", fname(EXIT(ch, dir)->keyword)); send_to_char(buf, ch); } } else send_to_char("Nothing special there...\r\n", ch); } void look_in_obj(struct char_data * ch, char *arg) { struct obj_data *obj = NULL; struct char_data *dummy = NULL; int amt, bits; if (!*arg) send_to_char("Look in what?\r\n", ch); else if (!(bits = generic_find(arg, FIND_OBJ_INV | FIND_OBJ_ROOM | FIND_OBJ_EQUIP, ch, &dummy, &obj))) { sprintf(buf, "There doesn't seem to be %s %s here.\r\n", AN(arg), arg); send_to_char(buf, ch); } else if ((GET_OBJ_TYPE(obj) != ITEM_DRINKCON) && (GET_OBJ_TYPE(obj) != ITEM_FOUNTAIN) && (GET_OBJ_TYPE(obj) != ITEM_CONTAINER)) send_to_char("There's nothing inside that!\r\n", ch); else { if (GET_OBJ_TYPE(obj) == ITEM_CONTAINER) { if (OBJVAL_FLAGGED(obj, CONT_CLOSED)) send_to_char("It is closed.\r\n", ch); else { send_to_char(fname(obj->name), ch); switch (bits) { case FIND_OBJ_INV: send_to_char(" (carried): \r\n", ch); break; case FIND_OBJ_ROOM: send_to_char(" (here): \r\n", ch); break; case FIND_OBJ_EQUIP: send_to_char(" (used): \r\n", ch); break; } list_obj_to_char(obj->contains, ch, 2, TRUE); } } else { /* item must be a fountain or drink container */ if (GET_OBJ_VAL(obj, 1) <= 0) send_to_char("It is empty.\r\n", ch); else { if (GET_OBJ_VAL(obj,0) <= 0 || GET_OBJ_VAL(obj,1)>GET_OBJ_VAL(obj,0)) { sprintf(buf, "Its contents seem somewhat murky.\r\n"); /* BUG */ } else { amt = (GET_OBJ_VAL(obj, 1) * 3) / GET_OBJ_VAL(obj, 0); sprinttype(GET_OBJ_VAL(obj, 2), color_liquid, buf2); sprintf(buf, "It's %sfull of a %s liquid.\r\n", fullness[amt], buf2); } send_to_char(buf, ch); } } } } char *find_exdesc(char *word, struct extra_descr_data * list) { struct extra_descr_data *i; for (i = list; i; i = i->next) if (isname(word, i->keyword)) return (i->description); return NULL; } /* * Given the argument "look at <target>", figure out what object or char * matches the target. First, see if there is another char in the room * with the name. Then check local objs for exdescs. */ /* * BUG BUG: If fed an argument like '2.bread', the extra description * search will fail when it works on 'bread'! * -gg 6/24/98 (I'd do a fix, but it's late and non-critical.) */ void look_at_target(struct char_data * ch, char *arg) { int bits, found = FALSE, j; struct char_data *found_char = NULL; struct obj_data *obj = NULL, *found_obj = NULL; char *desc; if (!ch->desc) return; if (!*arg) { send_to_char("Look at what?\r\n", ch); return; } bits = generic_find(arg, FIND_OBJ_INV | FIND_OBJ_ROOM | FIND_OBJ_EQUIP | FIND_CHAR_ROOM, ch, &found_char, &found_obj); /* Is the target a character? */ if (found_char != NULL) { look_at_char(found_char, ch); if (ch != found_char) { if (CAN_SEE(found_char, ch)) act("$n looks at you.", TRUE, ch, 0, found_char, TO_VICT); act("$n looks at $N.", TRUE, ch, 0, found_char, TO_NOTVICT); } return; } /* Does the argument match an extra desc in the room? */ if ((desc = find_exdesc(arg, world[ch->in_room].ex_description)) != NULL) { page_string(ch->desc, desc, FALSE); return; } /* Does the argument match an extra desc in the char's equipment? */ for (j = 0; j < NUM_WEARS && !found; j++) if (GET_EQ(ch, j) && CAN_SEE_OBJ(ch, GET_EQ(ch, j))) if ((desc = find_exdesc(arg, GET_EQ(ch, j)->ex_description)) != NULL) { send_to_char(desc, ch); found = TRUE; } /* Does the argument match an extra desc in the char's inventory? */ for (obj = ch->carrying; obj && !found; obj = obj->next_content) { if (CAN_SEE_OBJ(ch, obj)) if ((desc = find_exdesc(arg, obj->ex_description)) != NULL) { send_to_char(desc, ch); found = TRUE; } } /* Does the argument match an extra desc of an object in the room? */ for (obj = world[ch->in_room].contents; obj && !found; obj = obj->next_content) if (CAN_SEE_OBJ(ch, obj)) if ((desc = find_exdesc(arg, obj->ex_description)) != NULL) { send_to_char(desc, ch); found = TRUE; } /* If an object was found back in generic_find */ if (bits) { if (!found) show_obj_to_char(found_obj, ch, 5); /* Show no-description */ else show_obj_to_char(found_obj, ch, 6); /* Find hum, glow etc */ } else if (!found) send_to_char("You do not see that here.\r\n", ch); } ACMD(do_look) { char arg2[MAX_INPUT_LENGTH]; int look_type; if (!ch->desc) return; if (GET_POS(ch) < POS_SLEEPING) send_to_char("You can't see anything but stars!\r\n", ch); else if (AFF_FLAGGED(ch, AFF_SOLAR_FLARE)) send_to_char("You can't see a damned thing, you're blind!\r\n", ch); else if (IS_DARK(ch->in_room) && !CAN_SEE_IN_DARK(ch)) { send_to_char("It is pitch black...\r\n", ch); list_char_to_char(world[ch->in_room].people, ch); /* glowing red eyes */ } else { half_chop(argument, arg, arg2); if (subcmd == SCMD_READ) { if (!*arg) send_to_char("Read what?\r\n", ch); else look_at_target(ch, arg); return; } if (!*arg) /* "look" alone, without an argument at all */ look_at_room(ch, 1); else if (is_abbrev(arg, "in")) look_in_obj(ch, arg2); /* did the char type 'look <direction>?' */ else if ((look_type = search_block(arg, dirs, FALSE)) >= 0) look_in_direction(ch, look_type); else if (is_abbrev(arg, "at")) look_at_target(ch, arg2); else look_at_target(ch, arg); } } ACMD(do_examine) { int bits; struct char_data *tmp_char; struct obj_data *tmp_object; one_argument(argument, arg); if (!*arg) { send_to_char("Examine what?\r\n", ch); return; } look_at_target(ch, arg); bits = generic_find(arg, FIND_OBJ_INV | FIND_OBJ_ROOM | FIND_CHAR_ROOM | FIND_OBJ_EQUIP, ch, &tmp_char, &tmp_object); if (tmp_object) { if ((GET_OBJ_TYPE(tmp_object) == ITEM_DRINKCON) || (GET_OBJ_TYPE(tmp_object) == ITEM_FOUNTAIN) || (GET_OBJ_TYPE(tmp_object) == ITEM_CONTAINER)) { send_to_char("When you look inside, you see:\r\n", ch); look_in_obj(ch, arg); } } } ACMD(do_gold) { if (GET_GOLD(ch) == 0) send_to_char("You're broke!\r\n", ch); else if (GET_GOLD(ch) == 1) send_to_char("You have one miserable little gold coin.\r\n", ch); else { sprintf(buf, "You have %d gold coins.\r\n", GET_GOLD(ch)); send_to_char(buf, ch); } } ACMD(do_score) { sprintf(buf, "%s&15o&12------------------------------------------------------------&15o&00\r\n", buf); sprintf(buf, " &12Information for:&00 &10%s&00\r\n", GET_NAME(ch)); sprintf(buf, "%s&15o&12------------------------------------------------------------&15o&00\r\n", buf); sprintf(buf, "%s&10Race:&00 %s &10Sex:&00 ", buf, CLASS_ABBR(ch)); switch (GET_SEX(ch)) { case SEX_MALE: strcat(buf, "&12Male&00\r\n"); break; case SEX_FEMALE: strcat(buf, "&13Female&00\r\n"); break; default: strcat(buf, "Neutral\r\n"); break; } sprintf(buf, "%s&15Eye Color:&00 ", buf); switch (GET_EYE(ch)) { case EYE_BLACK: strcat(buf, "Black\r\n"); break; case EYE_WHITE: strcat(buf, "&15White&00\r\n"); break; case EYE_BLUE: strcat(buf, "&12Blue&00\r\n"); break; case EYE_GREEN: strcat(buf, "&10Green&00\r\n"); break; case EYE_BROWN: strcat(buf, "&03Brown&00\r\n"); break; case EYE_PURPLE: strcat(buf, "&13Purple&00\r\n"); break; case EYE_RED: strcat(buf, "&09Red&00\r\n"); break; case EYE_YELLOW: strcat(buf, "&11Yellow&00\r\n"); break; default: strcat(buf, "NULL\r\n"); break; } sprintf(buf, "%s&15Hair Lenght:&00 ", buf); switch (GET_HAIRL(ch)) { case HAIRL_V_SHORT: strcat(buf, "Very Short\r\n"); break; case HAIRL_SHORT: strcat(buf, "Short\r\n"); break; case HAIRL_MEDIUM: strcat(buf, "Medium\r\n"); break; case HAIRL_LONG: strcat(buf, "Long\r\n"); break; case HAIRL_V_LONG: strcat(buf, "Very Long\r\n"); break; default: strcat(buf, "NULL\r\n"); break; } sprintf(buf, "%s&15Hair Color:&00 ", buf); switch (GET_HAIRC(ch)) { case HAIRC_BLACK: strcat(buf, "Black\r\n"); break; case HAIRC_WHITE: strcat(buf, "&15White&00\r\n"); break; case HAIRC_BLUE: strcat(buf, "&12Blue&00\r\n"); break; case HAIRC_GREEN: strcat(buf, "&10Green&00\r\n"); break; case HAIRC_BROWN: strcat(buf, "&03Brown&00\r\n"); break; case HAIRC_PURPLE: strcat(buf, "&13Purple&00\r\n"); break; case HAIRC_RED: strcat(buf, "&09Red&00\r\n"); break; case HAIRC_YELLOW: strcat(buf, "&11Yellow&00\r\n"); break; default: strcat(buf, "NULL\r\n"); break; } sprintf(buf, "%s&15o&12------------------------------------------------------------&15o&00\r\n", buf); sprintf(buf, "%s&09H&10ealth:&09 %d&15/&00&01%d&00 &09E&10nergy:&10 %d&15/&00&02%d&00 &09K&10i:&14 %d&15/&00&06%d&00\r\n\r\n", buf, GET_HIT(ch), GET_MAX_HIT(ch), GET_MOVE(ch), GET_MAX_MOVE(ch), GET_MANA(ch), GET_MAX_MANA(ch)); sprintf(buf, "%s&12Physical Strength:&00 &13%d&00 &12Intellect:&00 &13%d&00 &12Wisdom:&00 &13%d&00\r\n&12Speed:&00 &13%d&00 &12Constitution:&00 &13%d&00 &12Charisma:&00 &13%d&00\r\n", buf, GET_STR(ch), GET_INT(ch), GET_WIS(ch), GET_DEX(ch), GET_CON(ch), GET_CHA(ch)); sprintf(buf, "%s&15o&12------------------------------------------------------------&15o&00\r\n", buf); sprintf(buf, "%s&11Accuracy:&00 &12%d&00 &11Inner Strength:&00 &12%d&00\r\n", buf, (ch)->points.hitroll, (ch)->points.damroll); sprintf(buf, "%s&15Armor Class:&00 &12%d&00\r\n", buf, GET_AC(ch)); sprintf(buf, "%s&15Zenni Carried:&00 &11%d zenni&00\r\n", buf, GET_GOLD(ch)); sprintf(buf, "%s&15Zenni In bank:&00 &11%d zenni&00\r\n", buf, GET_BANK_GOLD(ch)); sprintf(buf, "%s&15Experience :&00 &12%Ld&00\r\n", buf, GET_EXP(ch)); sprintf(buf, "%s&15Experience TNL:&00 &12%Ld&00\r\n", buf, GET_LEVEL(ch)*2000-GET_EXP(ch)); sprintf(buf, "%s&15Alignment:&00 &12%d&00\r\n", buf, GET_ALIGNMENT(ch)); sprintf(buf, "%s&15o&12------------------------------------------------------------&15o&00\r\n", buf); sprintf(buf, "%s&09Power Level:&00 &15%Ld&00\r\n", buf, GET_STR(ch)*2+GET_MANA(ch)/4*GET_LEVEL(ch)+GET_DAMROLL(ch)); sprintf(buf, "%s&12Rage&00 &15%d&00\r\n", buf, GET_RAGE(ch)); sprintf(buf, "%s&12Upper Body Strength:&00 &15%d&00\r\n", buf, GET_UBS(ch)); sprintf(buf, "%s&12Lower Body Strenght:&00 &15%d&00\r\n", buf, GET_LBS(ch)); sprintf(buf, "%s&15o&12------------------------------------------------------------&15o&00\r\n", buf); sprintf(buf, "%s&14Status:&00 ", buf); switch (GET_POS(ch)) { case POS_DEAD: strcat(buf, "Dead.\r\n"); break; case POS_MORTALLYW: strcat(buf, "Mortally wounded.\r\n"); break; case POS_INCAP: strcat(buf, "Incapacitated.\r\n"); break; case POS_STUNNED: strcat(buf, "Stunned.\r\n"); break; case POS_SLEEPING: strcat(buf, "Sleeping.\r\n"); break; case POS_RESTING: strcat(buf, "Resting.\r\n"); break; case POS_SITTING: strcat(buf, "Sitting.\r\n"); break; case POS_FIGHTING: strcat(buf, "Fighting.\r\n"); break; case POS_STANDING: strcat(buf, "Standing.\r\n"); break; default: strcat(buf, "Floating.\r\n"); break; } sprintf(buf, "%s&14Effects:&00 ", buf); if (IS_AFFECTED(ch, AFF_SOLAR_FLARE)) strcat(buf, "Blinded "); if (IS_AFFECTED(ch, AFF_INVISIBLE)) strcat(buf, "Invisible "); if (IS_AFFECTED(ch, AFF_DETECT_INVIS)) strcat(buf, "Detect Invis "); if (IS_AFFECTED(ch, AFF_BARRIER)) strcat(buf, "BARRIER "); if (IS_AFFECTED(ch, AFF_POISON)) strcat(buf, "Poison "); if (IS_AFFECTED(ch, AFF_INFRAVISION)) strcat(buf, "Infravision "); strcat(buf, "\r\n"); if (GET_COND(ch, DRUNK) > 10) strcat(buf, "You are intoxicated.\r\n"); if (GET_COND(ch, FULL) == 0) strcat(buf, "You are hungry.\r\n"); if (GET_COND(ch, THIRST) == 0) strcat(buf, "You are thirsty.\r\n"); send_to_char(buf, ch); } ACMD(do_inventory) { send_to_char("&15You are carrying:&00\r\n", ch); list_obj_to_char(ch->carrying, ch, 1, TRUE); } ACMD(do_equipment) { int i, found = 0; send_to_char("&15You are using:&00\r\n", ch); for (i = 0; i < NUM_WEARS; i++) { if (GET_EQ(ch, i)) { if (CAN_SEE_OBJ(ch, GET_EQ(ch, i))) { send_to_char(where[i], ch); show_obj_to_char(GET_EQ(ch, i), ch, 1); found = TRUE; } else { send_to_char(where[i], ch); send_to_char("Something.\r\n", ch); found = TRUE; } } } if (!found) { send_to_char(" Nothing.\r\n", ch); } } ACMD(do_time) { const char *suf; int weekday, day; sprintf(buf, "It is %d o'clock %s, on ", ((time_info.hours % 12 == 0) ? 12 : ((time_info.hours) % 12)), ((time_info.hours >= 12) ? "pm" : "am")); /* 35 days in a month */ weekday = ((35 * time_info.month) + time_info.day + 1) % 7; strcat(buf, weekdays[weekday]); strcat(buf, "\r\n"); send_to_char(buf, ch); day = time_info.day + 1; /* day in [1..35] */ if (day == 1) suf = "st"; else if (day == 2) suf = "nd"; else if (day == 3) suf = "rd"; else if (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, "The %d%s Day of the %s, Year %d.\r\n", day, suf, month_name[(int) time_info.month], time_info.year); send_to_char(buf, ch); } ACMD(do_weather) { const char *sky_look[] = { "cloudless", "cloudy", "rainy", "lit by flashes of lightning" }; if (OUTSIDE(ch)) { sprintf(buf, "The sky is %s and %s.\r\n", sky_look[weather_info.sky], (weather_info.change >= 0 ? "you feel a warm wind from south" : "your foot tells you bad weather is due")); send_to_char(buf, ch); } else send_to_char("You have no feeling about the weather at all.\r\n", ch); } struct help_index_element *find_help(char *keyword) { int i; for (i = 0; i < top_of_helpt; i++) if (isname(keyword, help_table[i].keywords)) return (help_table + i); return NULL; } ACMD(do_help) { struct help_index_element *this_help; char entry[MAX_STRING_LENGTH]; if (!ch->desc) return; skip_spaces(&argument); if (!*argument) { page_string(ch->desc, help, 0); return; } if (!help_table) { send_to_char("No help available.\r\n", ch); return; } if (!(this_help = find_help(argument))) { send_to_char("There is no help on that word.\r\n", ch); sprintf(buf, "HELP: %s tried to get help on %s", GET_NAME(ch), argument); log(buf); return; } if (this_help->min_level > GET_LEVEL(ch)) { send_to_char("There is no help on that word.\r\n", ch); return; } sprintf(entry, "%s\r\n%s", this_help->keywords, this_help->entry); page_string(ch->desc, entry, 0); } /* * * This hardly deserves it's own function, but I see future * * expansion capabilities... * * TR 8-18-98 * * Fixed: 8-25-98 */ int show_on_who_list(struct descriptor_data *d) { if ((STATE(d) != CON_PLAYING) && (STATE(d) != CON_MEDIT) && (STATE(d) != CON_OEDIT) && (STATE(d) != CON_REDIT) && (STATE(d) != CON_SEDIT) && (STATE(d) != CON_ZEDIT) && (STATE(d) != CON_HEDIT) && (STATE(d) != CON_AEDIT) && (STATE(d) != CON_TEXTED) && (STATE(d) != CON_TRIGEDIT)) return 0; else return 1; } #define WHO_FORMAT \ "format: who [minlev[-maxlev]] [-n name] [-c classlist] [-s] [-o] [-q] [-r] [-z]\r\n" ACMD(do_who) { struct descriptor_data *d; struct char_data *tch; char name_search[MAX_INPUT_LENGTH]; char mode; size_t i; int low = 0, high = LVL_IMPL, localwho = 0, questwho = 0; int showclass = 0, short_list = 0, outlaws = 0, num_can_see = 0; int who_room = 0; skip_spaces(&argument); strcpy(buf, argument); name_search[0] = '\0'; while (*buf) { half_chop(buf, arg, buf1); if (isdigit(*arg)) { sscanf(arg, "%d-%d", &low, &high); strcpy(buf, buf1); } else if (*arg == '-') { mode = *(arg + 1); /* just in case; we destroy arg in the switch */ switch (mode) { case 'o': case 'k': outlaws = 1; strcpy(buf, buf1); break; case 'z': localwho = 1; strcpy(buf, buf1); break; case 'q': questwho = 1; strcpy(buf, buf1); break; case 'l': half_chop(buf1, arg, buf); sscanf(arg, "%d-%d", &low, &high); break; case 'n': half_chop(buf1, name_search, buf); break; case 'r': who_room = 1; strcpy(buf, buf1); break; case 'c': half_chop(buf1, arg, buf); for (i = 0; i < strlen(arg); i++) showclass |= find_class_bitvector(arg[i]); break; default: send_to_char(WHO_FORMAT, ch); return; } /* end of switch */ } else { /* endif */ send_to_char(WHO_FORMAT, ch); return; } } /* end while (parser) */ send_to_char(" &01_&02-&03`&12~&05`&14-&01_&02-&03`&12~&05`&14-&01_&02-&03`&12~&05`&14-&01_&02-&03`&12~&05`&14-&01_&02-&03`&12~&05`&14-&01_&00\r\n &12Players On Dragonball &15X&00\r\n &01_&02-&03`&12~&05`&14-&01_&02-&03`&12~&05`&14-&01_&02-&03`&12~&05`&14-&01_&02-&03`&12~&05`&14-&01_&02-&03`&12~&05`&14-&01_&00\r\n", ch); for (d = descriptor_list; d; d = d->next) { if (d->original) tch = d->original; else if (!(tch = d->character)) continue; if (!show_on_who_list(d)) continue; if (*name_search && str_cmp(GET_NAME(tch), name_search) && !strstr(GET_TITLE(tch), name_search)) continue; if (!CAN_SEE(ch, tch) || GET_LEVEL(tch) < low || GET_LEVEL(tch) > high) continue; if (outlaws && !PLR_FLAGGED(tch, PLR_KILLER) && !PLR_FLAGGED(tch, PLR_icer)) continue; if (questwho && !PRF_FLAGGED(tch, PRF_QUEST)) continue; if (localwho && world[ch->in_room].zone != world[tch->in_room].zone) continue; if (who_room && (tch->in_room != ch->in_room)) continue; if (showclass && !(showclass & (1 << GET_CLASS(tch)))) continue; if (short_list) { sprintf(buf, "%s[%2Ld %s] %-12.12s%s%s", (GET_LEVEL(tch) >= LVL_IMMORT ? CCYEL(ch, C_SPR) : ""), GET_LEVEL(tch), CLASS_ABBR(tch), GET_NAME(tch), (GET_LEVEL(tch) >= LVL_IMMORT ? CCNRM(ch, C_SPR) : ""), ((!(++num_can_see % 4)) ? "\r\n" : "")); send_to_char(buf, ch); } else { num_can_see++; sprintf(buf, "&05-&03(&00%s&03)&05-&00 &03%s&00 %s", CLASS_ABBR(tch), GET_NAME(tch), GET_TITLE(tch)); /* Male */ if (IS_saiyan(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &14Saiya-Jin&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_Human(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &06Human&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_DEMON(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &09Demon&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_Namek(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &10Namek&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_icer(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &12Icer&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_ANDROID(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &15Android&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_HALF_BREED(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[&00&06Half&09-&06Breed&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_MAJIN(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &13Majin&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_ARLIAN(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &05Arlian&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_KONATSU(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &11Konatsu&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_CHANGELING(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[&01C&02h&03a&04n&05g&06e&07l&09i&10n&11g&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_KAIO(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &15K&09a&15i&09o&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_TRUFFLE(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &04Truffle&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_ALIEN(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &07Alien&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_TUGUIL(tch) && GET_SEX(tch) == SEX_MALE) sprintf(buf, "&11{&12M&11} &10[ &03Tuguil&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); /* Female */ if (IS_saiyan(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[ &14Saiya-Jin&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_Human(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[&00 &06Human&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_DEMON(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[ &09Demon&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_Namek(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[ &10Namek&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_icer(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[ &12Icer&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_ANDROID(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[ &15Android&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_HALF_BREED(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[&06Half&09-&14Breed&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_MAJIN(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[ &13Majin&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_ARLIAN(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[ &05Arlian&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_KONATSU(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[ &11Konatsu&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_CHANGELING(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[&01C&02h&03a&04n&05g&06e&07l&09i&10n&11g&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_KAIO(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[ &15K&09a&15i&09o&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_TRUFFLE(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[ &04Truffle&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_ALIEN(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[ &07Alien&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (IS_TUGUIL(tch) && GET_SEX(tch) == SEX_FEMALE) sprintf(buf, "&11{&13F&11} &10[ &03Tuguil&00 &10] &09%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); /* Imms */ if ((GET_LEVEL(tch) == LVL_IMMORT)) sprintf(buf, "&11{&12M&11} &10[ &12Immortal&00 &10] &12%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); else if ((GET_LEVEL(tch) == LVL_LSSRGOD)) sprintf(buf, "&11{&12M&11} &10[&05Lesser God&00 &10] &12%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); else if ((GET_LEVEL(tch) == LVL_GOD)) sprintf(buf, "&11{&12M&11} &10[ &13God&00 &10] &12%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); else if ((GET_LEVEL(tch) == LVL_ARCANE)) sprintf(buf, "&11{&12M&11} &10[ &11Creator&00 &10] &12%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); else if ((GET_LEVEL(tch) == LVL_GRGOD)) sprintf(buf, "&11{&12M&11} &10[&14Greater God&00&10] &12%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); else if ((GET_LEVEL(tch) == LVL_COIMP)) sprintf(buf, "&11{&12M&11} &10[ &11Co-Imp&00 &10] &12%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); else if ((GET_LEVEL(tch) == LVL_IMPL)) sprintf(buf, "&11{&12M&11} &10[&09Imp&10le&12m&10en&09tor&00&10] &13%s&15 %s&00", GET_NAME(tch), GET_TITLE(tch)); if (GET_INVIS_LEV(tch)) sprintf(buf + strlen(buf), " (i%Ld)", GET_INVIS_LEV(tch)); else if (AFF_FLAGGED(tch, AFF_INVISIBLE)) strcat(buf, " (invis)"); if (PLR_FLAGGED(tch, PLR_MAILING)) strcat(buf, " (mailing)"); else if ((STATE(d) >= CON_OEDIT) && (STATE(d) <= CON_TEXTED)) strcat(buf, " (OLC)"); else if (PLR_FLAGGED(tch, PLR_WRITING)) strcat(buf, " (writing)"); if (PRF_FLAGGED(tch, PRF_DEAF)) strcat(buf, " (deaf)"); if (PRF_FLAGGED(tch, PRF_NOTELL)) strcat(buf, " (notell)"); if (PRF_FLAGGED(tch, PRF_QUEST)) strcat(buf, " (quest)"); if (PLR_FLAGGED(tch, PLR_icer)) strcat(buf, " (Thief)"); if (PLR_FLAGGED(tch, PLR_KILLER)) strcat(buf, " (Killer)"); if (PRF_FLAGGED(tch, PRF_AFK)) strcat(buf, " (&09AFK&00)"); if (GET_LEVEL(tch) >= LVL_IMMORT) strcat(buf, CCNRM(ch, C_SPR)); strcat(buf, "\r\n"); send_to_char(buf, ch); } /* endif shortlist */ } /* end of for */ if (short_list && (num_can_see % 4)) send_to_char("\r\n", ch); if (num_can_see == 0) sprintf(buf, "\r\n&15No-one at all!&00\r\n"); else if (num_can_see == 1) sprintf(buf, "\r\n&15One lonely character displayed.&00\r\n"); else sprintf(buf, "\r\n&13%d&00 &15characters displayed.&00\r\n", num_can_see); send_to_char(buf, ch); } #define USERS_FORMAT \ "format: users [-l minlevel[-maxlevel]] [-n name] [-h host] [-c classlist] [-o] [-p]\r\n" ACMD(do_users) { const char *format = "%3d %-7s %-12s %-14s %-3s %-8s "; char line[200], line2[220], idletime[10], classname[20]; char state[30], *timeptr, mode; char name_search[MAX_INPUT_LENGTH], host_search[MAX_INPUT_LENGTH]; struct char_data *tch; struct descriptor_data *d; size_t i; int low = 0, high = LVL_IMPL, num_can_see = 0; int showclass = 0, outlaws = 0, playing = 0, deadweight = 0; host_search[0] = name_search[0] = '\0'; strcpy(buf, argument); while (*buf) { half_chop(buf, arg, buf1); if (*arg == '-') { mode = *(arg + 1); /* just in case; we destroy arg in the switch */ switch (mode) { case 'o': case 'k': outlaws = 1; playing = 1; strcpy(buf, buf1); break; case 'p': playing = 1; strcpy(buf, buf1); break; case 'd': deadweight = 1; strcpy(buf, buf1); break; case 'l': playing = 1; half_chop(buf1, arg, buf); sscanf(arg, "%d-%d", &low, &high); break; case 'n': playing = 1; half_chop(buf1, name_search, buf); break; case 'h': playing = 1; half_chop(buf1, host_search, buf); break; case 'c': playing = 1; half_chop(buf1, arg, buf); for (i = 0; i < strlen(arg); i++) showclass |= find_class_bitvector(arg[i]); break; default: send_to_char(USERS_FORMAT, ch); return; } /* end of switch */ } else { /* endif */ send_to_char(USERS_FORMAT, ch); return; } } /* end while (parser) */ strcpy(line, "Num Class Name State Idl Login@ Site\r\n"); strcat(line, "--- ------- ------------ -------------- --- -------- ------------------------\r\n"); send_to_char(line, ch); one_argument(argument, arg); for (d = descriptor_list; d; d = d->next) { if (STATE(d) != CON_PLAYING && playing) continue; if (STATE(d) == CON_PLAYING && deadweight) continue; if (STATE(d) == CON_PLAYING) { if (d->original) tch = d->original; else if (!(tch = d->character)) continue; if (*host_search && !strstr(d->host, host_search)) continue; if (*name_search && str_cmp(GET_NAME(tch), name_search)) continue; if (!CAN_SEE(ch, tch) || GET_LEVEL(tch) < low || GET_LEVEL(tch) > high) continue; if (outlaws && !PLR_FLAGGED(tch, PLR_KILLER) && !PLR_FLAGGED(tch, PLR_icer)) continue; if (showclass && !(showclass & (1 << GET_CLASS(tch)))) continue; if (GET_INVIS_LEV(ch) > GET_LEVEL(ch)) continue; if (d->original) sprintf(classname, "[%2Ld %s]", GET_LEVEL(d->original), CLASS_ABBR(d->original)); else sprintf(classname, "[%2Ld %s]", GET_LEVEL(d->character), CLASS_ABBR(d->character)); } else strcpy(classname, " - "); timeptr = asctime(localtime(&d->login_time)); timeptr += 11; *(timeptr + 8) = '\0'; if (STATE(d) == CON_PLAYING && d->original) strcpy(state, "Switched"); else strcpy(state, connected_types[STATE(d)]); if (d->character && STATE(d) == CON_PLAYING && GET_LEVEL(d->character) < LVL_GOD) sprintf(idletime, "%3d", d->character->char_specials.timer * SECS_PER_MUD_HOUR / SECS_PER_REAL_MIN); else strcpy(idletime, ""); if (d->character && d->character->player.name) { if (d->original) sprintf(line, format, d->desc_num, classname, d->original->player.name, state, idletime, timeptr); else sprintf(line, format, d->desc_num, classname, d->character->player.name, state, idletime, timeptr); } else sprintf(line, format, d->desc_num, " - ", "UNDEFINED", state, idletime, timeptr); if (d->host && *d->host) sprintf(line + strlen(line), "[%s]\r\n", d->host); else strcat(line, "[Hostname unknown]\r\n"); if (STATE(d) != CON_PLAYING) { sprintf(line2, "%s%s%s", CCGRN(ch, C_SPR), line, CCNRM(ch, C_SPR)); strcpy(line, line2); } if (STATE(d) != CON_PLAYING || (STATE(d) == CON_PLAYING && CAN_SEE(ch, d->character))) { send_to_char(line, ch); num_can_see++; } } sprintf(line, "\r\n%d visible sockets connected.\r\n", num_can_see); send_to_char(line, ch); } /* Generic page_string function for displaying text */ ACMD(do_gen_ps) { switch (subcmd) { case SCMD_CREDITS: page_string(ch->desc, credits, 0); break; case SCMD_NEWS: page_string(ch->desc, news, 0); break; case SCMD_INFO: page_string(ch->desc, info, 0); break; case SCMD_WIZLIST: page_string(ch->desc, wizlist, 0); break; case SCMD_IMMLIST: page_string(ch->desc, immlist, 0); break; case SCMD_HANDBOOK: page_string(ch->desc, handbook, 0); break; case SCMD_POLICIES: page_string(ch->desc, policies, 0); break; case SCMD_MOTD: page_string(ch->desc, motd, 0); break; case SCMD_IMOTD: page_string(ch->desc, imotd, 0); break; case SCMD_CLEAR: send_to_char("\033[H\033[J", ch); break; case SCMD_WHOAMI: send_to_char(strcat(strcpy(buf, GET_NAME(ch)), "\r\n"), ch); break; default: return; } } void perform_mortal_where(struct char_data * ch, char *arg) { register struct char_data *i; register struct descriptor_data *d; if (!*arg) { send_to_char("Players in your Zone\r\n--------------------\r\n", ch); for (d = descriptor_list; d; d = d->next) { if (STATE(d) != CON_PLAYING || d->character == ch) continue; if ((i = (d->original ? d->original : d->character)) == NULL) continue; if (i->in_room == NOWHERE || !CAN_SEE(ch, i)) continue; if (world[ch->in_room].zone != world[i->in_room].zone) continue; sprintf(buf, "%-20s - %s\r\n", GET_NAME(i), world[i->in_room].name); send_to_char(buf, ch); } } else { /* print only FIRST char, not all. */ for (i = character_list; i; i = i->next) { if (i->in_room == NOWHERE || i == ch) continue; if (!CAN_SEE(ch, i) || world[i->in_room].zone != world[ch->in_room].zone) continue; if (!isname(arg, i->player.name)) continue; sprintf(buf, "%-25s - %s\r\n", GET_NAME(i), world[i->in_room].name); send_to_char(buf, ch); return; } send_to_char("No-one around by that name.\r\n", ch); } } void print_object_location(int num, struct obj_data * obj, struct char_data * ch, int recur) { if (num > 0) sprintf(buf, "O%3d. %-25s - ", num, obj->short_description); else sprintf(buf, "%33s", " - "); if (obj->in_room > NOWHERE) { sprintf(buf + strlen(buf), "[%5d] %s\r\n", GET_ROOM_VNUM(IN_ROOM(obj)), world[obj->in_room].name); send_to_char(buf, ch); } else if (obj->carried_by) { sprintf(buf + strlen(buf), "carried by %s\r\n", PERS(obj->carried_by, ch)); send_to_char(buf, ch); } else if (obj->worn_by) { sprintf(buf + strlen(buf), "worn by %s\r\n", PERS(obj->worn_by, ch)); send_to_char(buf, ch); } else if (obj->in_obj) { sprintf(buf + strlen(buf), "inside %s%s\r\n", obj->in_obj->short_description, (recur ? ", which is" : " ")); send_to_char(buf, ch); if (recur) print_object_location(0, obj->in_obj, ch, recur); } else { sprintf(buf + strlen(buf), "in an unknown location\r\n"); send_to_char(buf, ch); } } void perform_immort_where(struct char_data * ch, char *arg) { register struct char_data *i; register struct obj_data *k; struct descriptor_data *d; int num = 0, found = 0; if (!*arg) { send_to_char("Players\r\n-------\r\n", ch); for (d = descriptor_list; d; d = d->next) if (STATE(d) == CON_PLAYING) { i = (d->original ? d->original : d->character); if (i && CAN_SEE(ch, i) && (i->in_room != NOWHERE)) { if (d->original) sprintf(buf, "%-20s - [%5d] %s (in %s)\r\n", GET_NAME(i), GET_ROOM_VNUM(IN_ROOM(d->character)), world[d->character->in_room].name, GET_NAME(d->character)); else sprintf(buf, "%-20s - [%5d] %s\r\n", GET_NAME(i), GET_ROOM_VNUM(IN_ROOM(i)), world[i->in_room].name); send_to_char(buf, ch); } } } else { for (i = character_list; i; i = i->next) if (CAN_SEE(ch, i) && i->in_room != NOWHERE && isname(arg, i->player.name)) { found = 1; sprintf(buf, "M%3d. %-25s - [%5d] %s\r\n", ++num, GET_NAME(i), GET_ROOM_VNUM(IN_ROOM(i)), world[IN_ROOM(i)].name); send_to_char(buf, ch); } for (num = 0, k = object_list; k; k = k->next) if (CAN_SEE_OBJ(ch, k) && isname(arg, k->name)) { found = 1; print_object_location(++num, k, ch, TRUE); } if (!found) send_to_char("Couldn't find any such thing.\r\n", ch); } } ACMD(do_where) { one_argument(argument, arg); if (GET_LEVEL(ch) >= LVL_IMMORT) perform_immort_where(ch, arg); else perform_mortal_where(ch, arg); } ACMD(do_consider) { struct char_data *victim; int diff; one_argument(argument, buf); if (!(victim = get_char_room_vis(ch, buf))) { send_to_char("Consider killing who?\r\n", ch); return; } if (victim == ch) { send_to_char("Easy! Very easy indeed!\r\n", ch); return; } if (!IS_NPC(victim)) { send_to_char("Would you like to borrow a cross and a shovel?\r\n", ch); return; } diff = (GET_LEVEL(victim) - GET_LEVEL(ch)); if (diff <= -10) send_to_char("Now where did that chicken go?\r\n", ch); else if (diff <= -5) send_to_char("You could do it with a needle!\r\n", ch); else if (diff <= -2) send_to_char("Easy.\r\n", ch); else if (diff <= -1) send_to_char("Fairly easy.\r\n", ch); else if (diff == 0) send_to_char("The perfect match!\r\n", ch); else if (diff <= 1) send_to_char("You would need some luck!\r\n", ch); else if (diff <= 2) send_to_char("You would need a lot of luck!\r\n", ch); else if (diff <= 3) send_to_char("You would need a lot of luck and great equipment!\r\n", ch); else if (diff <= 5) send_to_char("Do you feel lucky, punk?\r\n", ch); else if (diff <= 10) send_to_char("Are you mad!?\r\n", ch); else if (diff <= 100) send_to_char("You ARE mad!\r\n", ch); } ACMD(do_diagnose) { struct char_data *vict; one_argument(argument, buf); if (*buf) { if (!(vict = get_char_room_vis(ch, buf))) { send_to_char(NOPERSON, ch); return; } else diag_char_to_char(vict, ch); } else { if (FIGHTING(ch)) diag_char_to_char(FIGHTING(ch), ch); else send_to_char("Diagnose who?\r\n", ch); } } const char *ctypes[] = { "off", "sparse", "normal", "complete", "\n" }; ACMD(do_color) { int tp; if (IS_NPC(ch)) return; one_argument(argument, arg); if (!*arg) { sprintf(buf, "Your current color level is %s.\r\n", ctypes[COLOR_LEV(ch)]); send_to_char(buf, ch); return; } if (((tp = search_block(arg, ctypes, FALSE)) == -1)) { send_to_char("Usage: color { Off | Sparse | Normal | Complete }\r\n", ch); return; } REMOVE_BIT(PRF_FLAGS(ch), PRF_COLOR_1 | PRF_COLOR_2); SET_BIT(PRF_FLAGS(ch), (PRF_COLOR_1 * (tp & 1)) | (PRF_COLOR_2 * (tp & 2) >> 1)); sprintf(buf, "Your %scolor%s is now %s.\r\n", CCRED(ch, C_SPR), CCNRM(ch, C_OFF), ctypes[tp]); send_to_char(buf, ch); } ACMD(do_toggle) { if (IS_NPC(ch)) return; if (GET_WIMP_LEV(ch) == 0) strcpy(buf2, "OFF"); else sprintf(buf2, "%-3d", GET_WIMP_LEV(ch)); sprintf(buf, "Hit Pnt Display: %-3s " " Brief Mode: %-3s " " Summon Protect: %-3s\r\n" " Move Display: %-3s " " Compact Mode: %-3s " " On Quest: %-3s\r\n" " Ki Display: %-3s " " NoTell: %-3s " " Repeat Comm.: %-3s\r\n" " Auto Show Exit: %-3s " " Deaf: %-3s " " Wimp Level: %-3s\r\n" " Telepathy Channel: %-3s " " OOC Channel: %-3s " " Grats Channel: %-3s\r\n" " Color Level: %s\r\n", ONOFF(PRF_FLAGGED(ch, PRF_DISPHP)), ONOFF(PRF_FLAGGED(ch, PRF_BRIEF)), ONOFF(!PRF_FLAGGED(ch, PRF_SUMMONABLE)), ONOFF(PRF_FLAGGED(ch, PRF_DISPMOVE)), ONOFF(PRF_FLAGGED(ch, PRF_COMPACT)), YESNO(PRF_FLAGGED(ch, PRF_QUEST)), ONOFF(PRF_FLAGGED(ch, PRF_DISPMANA)), ONOFF(PRF_FLAGGED(ch, PRF_NOTELL)), YESNO(!PRF_FLAGGED(ch, PRF_NOREPEAT)), ONOFF(PRF_FLAGGED(ch, PRF_AUTOEXIT)), YESNO(PRF_FLAGGED(ch, PRF_DEAF)), buf2, ONOFF(!PRF_FLAGGED(ch, PRF_NOGOSS)), ONOFF(!PRF_FLAGGED(ch, PRF_NOooc)), ONOFF(!PRF_FLAGGED(ch, PRF_NOGRATZ)), ctypes[COLOR_LEV(ch)]); send_to_char(buf, ch); } struct sort_struct { int sort_pos; byte is_social; } *cmd_sort_info = NULL; int num_of_cmds; void sort_commands(void) { int a, b, tmp; num_of_cmds = 0; /* * first, count commands (num_of_commands is actually one greater than the * number of commands; it inclues the '\n'. */ while (*complete_cmd_info[num_of_cmds].command != '\n') num_of_cmds++; /* check if there was an old sort info.. then free it -- aedit -- M. Scott*/ if (cmd_sort_info) free(cmd_sort_info); /* create data array */ CREATE(cmd_sort_info, struct sort_struct, num_of_cmds); /* initialize it */ for (a = 1; a < num_of_cmds; a++) { cmd_sort_info[a].sort_pos = a; cmd_sort_info[a].is_social = (complete_cmd_info[a].command_pointer == do_action); } /* the infernal special case */ cmd_sort_info[find_command("insult")].is_social = TRUE; /* Sort. 'a' starts at 1, not 0, to remove 'RESERVED' */ for (a = 1; a < num_of_cmds - 1; a++) for (b = a + 1; b < num_of_cmds; b++) if (strcmp(complete_cmd_info[cmd_sort_info[a].sort_pos].command, complete_cmd_info[cmd_sort_info[b].sort_pos].command) > 0) { tmp = cmd_sort_info[a].sort_pos; cmd_sort_info[a].sort_pos = cmd_sort_info[b].sort_pos; cmd_sort_info[b].sort_pos = tmp; } } ACMD(do_commands) { int no, i, cmd_num; int wizhelp = 0, socials = 0; struct char_data *vict; one_argument(argument, arg); if (*arg) { if (!(vict = get_char_vis(ch, arg)) || IS_NPC(vict)) { send_to_char("Who is that?\r\n", ch); return; } if (GET_LEVEL(ch) < GET_LEVEL(vict)) { send_to_char("You can't see the commands of people above your level.\r\n", ch); return; } } else vict = ch; if (subcmd == SCMD_SOCIALS) socials = 1; else if (subcmd == SCMD_WIZHELP) wizhelp = 1; sprintf(buf, "The following %s%s are available to %s:\r\n", wizhelp ? "privileged " : "", socials ? "socials" : "commands", vict == ch ? "you" : GET_NAME(vict)); /* cmd_num starts at 1, not 0, to remove 'RESERVED' */ for (no = 1, cmd_num = 1; cmd_num < num_of_cmds; cmd_num++) { i = cmd_sort_info[cmd_num].sort_pos; if (complete_cmd_info[i].minimum_level >= 0 && GET_LEVEL(vict) >= complete_cmd_info[i].minimum_level && (complete_cmd_info[i].minimum_level >= LVL_IMMORT) == wizhelp && (wizhelp || socials == cmd_sort_info[i].is_social)) { sprintf(buf + strlen(buf), "%-11s", complete_cmd_info[i].command); if (!(no % 7)) strcat(buf, "\r\n"); no++; } } strcat(buf, "\r\n"); send_to_char(buf, ch); } ACMD(do_pushup) { int is_altered = FALSE; int num_levels = 0; int MOVE = 0, EXP = 0; if (IS_ANDROID(ch)) { send_to_char("&15Androids have no use for pushups, you won't get stronger.&00\r\n", ch); return; } if (PRF_FLAGGED(ch, PRF_CAMP)) { send_to_char("You can't do this while camped!\r\n", ch); return; } if (!IS_NPC(ch) && GET_LEVEL(ch) < LVL_IMMORT && GET_EXP(ch) >= GET_LEVEL(ch)*2000) { GET_LEVEL(ch) += 1; GET_EXP(ch) = 1; num_levels++; advance_level(ch); is_altered = TRUE; send_to_char("You seem to have grown surprisingly stronger with that pushup!\r\n", ch); } if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV10) && GET_MOVE(ch) >= 51) { send_to_char("You do some pushups and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some pushups.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(50, 50); EXP = number(GET_LEVEL(ch)*5+100, GET_LEVEL(ch)*40+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV100) && GET_MOVE(ch) >= 101) { send_to_char("You do some pushups and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some pushups.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(150, 150); EXP = number(GET_LEVEL(ch)*10+100, GET_LEVEL(ch)*100+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV200) && GET_MOVE(ch) >= 201) { send_to_char("You do some pushups and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some pushups.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(250, 250); EXP = number(GET_LEVEL(ch)*20+100, GET_LEVEL(ch)*200+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV300) && GET_MOVE(ch) >= 301) { send_to_char("You do some pushups and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some pushups.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(350, 350); EXP = number(GET_LEVEL(ch)*30+100, GET_LEVEL(ch)*300+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV400) && GET_MOVE(ch) >= 401) { send_to_char("You do some pushups and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some pushups.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(450, 450); EXP = number(GET_LEVEL(ch)*40+100, GET_LEVEL(ch)*400+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV100) && GET_MOVE(ch) >= 501) { send_to_char("You do some pushups and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some pushups.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(550, 550); EXP = number(GET_LEVEL(ch)*100+100, GET_LEVEL(ch)*800+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } else if (GET_MOVE(ch) >= 16 && !IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV10) && !IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV100) && !IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV200) && !IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV300) && !IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV400) && !IS_SET(ROOM_FLAGS(ch->in_room), ROOM_SPIRIT)) { send_to_char("You do some pushups and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some pushups.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(10, 10); EXP = number(GET_LEVEL(ch)+100, GET_LEVEL(ch)+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } else { act("Your too tired to do pushups.", TRUE, ch, 0, 0, TO_CHAR); return; } } ACMD(do_situp) { int is_altered = FALSE; int num_levels = 0; int MOVE = 0, EXP = 0; if (IS_ANDROID(ch)) { send_to_char("&15Androids have no use for situps, you won't get stronger.&00\r\n", ch); return; } if (PRF_FLAGGED(ch, PRF_CAMP)) { send_to_char("You can't do this while camped!\r\n", ch); return; } if (!IS_NPC(ch) && GET_LEVEL(ch) < LVL_IMMORT && GET_EXP(ch) >= GET_LEVEL(ch)*2000) { GET_LEVEL(ch) += 1; GET_EXP(ch) = 1; num_levels++; advance_level(ch); is_altered = TRUE; send_to_char("You seem to have grown surprisingly stronger with that pushup!\r\n", ch); } if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV10) && GET_MOVE(ch) >= 16) { send_to_char("You do some situps and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some situps.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(10, 10); EXP = number(GET_LEVEL(ch)*5+100, GET_LEVEL(ch)*5+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV100) && GET_MOVE(ch) >= 51) { send_to_char("You do some situps and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some situps.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(30, 30); EXP = number(GET_LEVEL(ch)*10+100, GET_LEVEL(ch)*10+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV200) && GET_MOVE(ch) >= 101) { send_to_char("You do some situps and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some situps.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(40, 40); EXP = number(GET_LEVEL(ch)*20+100, GET_LEVEL(ch)*20+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV300) && GET_MOVE(ch) >= 201) { send_to_char("You do some situps and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some situps.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(80, 80); EXP = number(GET_LEVEL(ch)*30+100, GET_LEVEL(ch)*30+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV400) && GET_MOVE(ch) >= 301) { send_to_char("You do some situps and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some situps.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(150, 150); EXP = number(GET_LEVEL(ch)*40+00, GET_LEVEL(ch)*40+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV100) && GET_MOVE(ch) >= 401) { send_to_char("You do some situps and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some situps.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(200, 200); EXP = number(GET_LEVEL(ch)*100+100, GET_LEVEL(ch)*100+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } else if (GET_MOVE(ch) >= 16 && !IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV10) && !IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV100) && !IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV200) && !IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV300) && !IS_SET(ROOM_FLAGS(ch->in_room), ROOM_GRAV400) && !IS_SET(ROOM_FLAGS(ch->in_room), ROOM_SPIRIT)) { send_to_char("You do some situps and feel yourself getting stronger.\r\n", ch); act("&11$n&00 does some &12situps&00.", TRUE, ch, 0, 0, TO_ROOM); MOVE = number(10, 10); EXP = number(GET_LEVEL(ch)+100, GET_LEVEL(ch)+100); GET_MOVE(ch) = GET_MOVE(ch) - MOVE; GET_EXP(ch) = GET_EXP(ch) + EXP; return; } else { act("Your too tired to do situps.", TRUE, ch, 0, 0, TO_CHAR); return; } } ACMD(do_scan) { struct char_data *i; int is_in, dir, dis, maxdis, found = 0; const char *distance[] = { "&09right here", "&09immediately ", "&09nearby ", "&09a ways ", "&09far ", "&09very far ", "&09extremely far ", "&09impossibly far ", }; if (!GET_SKILL(ch, SKILL_SCAN)) { send_to_char("You can't do that!\r\n", ch); return; } if (IS_AFFECTED(ch, AFF_SOLAR_FLARE)) { act("You can't see anything, you're blind!", TRUE, ch, 0, 0, TO_CHAR); return; } if ((GET_MOVE(ch) < 3) && (GET_LEVEL(ch) < LVL_IMMORT)) { act("You are too exhausted.", TRUE, ch, 0, 0, TO_CHAR); return; } maxdis = (1 + ((GET_SKILL(ch, SKILL_SCAN) * 5) / 100)); if (GET_LEVEL(ch) >= LVL_IMMORT) maxdis = 7; act("&15You quickly scan the area and see:&00", TRUE, ch, 0, 0, TO_CHAR); act("$n quickly scans the area.", FALSE, ch, 0, 0, TO_ROOM); if (GET_LEVEL(ch) < LVL_IMMORT) GET_MOVE(ch) -= 3; is_in = ch->in_room; for (dir = 0; dir < NUM_OF_DIRS; dir++) { ch->in_room = is_in; for (dis = 0; dis <= maxdis; dis++) { if (((dis == 0) && (dir == 0)) || (dis > 0)) { for (i = world[ch->in_room].people; i; i = i->next_in_room) { if ((!((ch == i) && (dis == 0))) && CAN_SEE(ch, i)) { sprintf(buf, "%33s: %s%s%s%s&00", GET_NAME(i), distance[dis], ((dis > 0) && (dir < (NUM_OF_DIRS - 2))) ? "&15to the&09 " : "", (dis > 0) ? dirs[dir] : "", ((dis > 0) && (dir > (NUM_OF_DIRS - 3))) ? "&15wards&00" : ""); act(buf, TRUE, ch, 0, 0, TO_CHAR); found++; } } } if (!CAN_GO(ch, dir) || (world[ch->in_room].dir_option[dir]->to_room == is_in)) break; else ch->in_room = world[ch->in_room].dir_option[dir]->to_room; } } if (found == 0) act("Nobody anywhere near you.", TRUE, ch, 0, 0, TO_CHAR); ch->in_room = is_in; } ACMD(do_finger) { char value[MAX_INPUT_LENGTH], birth[80]; struct char_file_u vbuf; one_argument(argument, arg); if (!*argument) { send_to_char("A name would help.\r\n", ch); return; } if (load_char(value, &vbuf) < 0) { send_to_char("There is no such player.\r\n", ch); return; } else sprintf(buf, "Player: %-12s (%s) [%s] They have %s eyes, and %s %s hair.\r\n", vbuf.name, genders[(int) vbuf.sex], class_abbrevs[(int) vbuf.chclass], eyes[(int) vbuf.eye], hl[(int) vbuf.hairl], hc[(int) vbuf.hairc] ); sprintf(buf, "%sAu: %-8d Bal: %-8d Exp: %-10Ld Align: %-5d Lessons: %-3d\r\n", buf, vbuf.points.gold, vbuf.points.bank_gold, vbuf.points.exp, vbuf.char_specials_saved.alignment, vbuf.player_specials_saved.spells_to_learn); strcpy(birth, ctime(&vbuf.birth)); sprintf(buf, "%sStarted: %-20.16s Last: %-20.16s Played: %3dh %2dm\r\n", buf, birth, ctime(&vbuf.last_logon), (int) (vbuf.played / 3600), (int) (vbuf.played / 60 % 60)); send_to_char(buf, ch); }