/* ************************************************************************ * 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 by the Trustees of the Johns Hopkins University * * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * ************************************************************************ */ /* act.informative split into 2 files act.inform1 and act.inform2 */ /* Archipelago changes by Alastair J. Neil Copyright (C) 1993, 94, 95, 96 */ #include <stdio.h> #include <string.h> #include <ctype.h> #include <time.h> #include "structs.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "spells.h" #include "limits.h" #include "screen.h" /* extern variables */ extern int top_of_world; extern struct room_data *world; extern struct descriptor_data *descriptor_list; extern struct char_data *character_list; extern struct obj_data *object_list; extern struct command_info cmd_info[]; extern struct index_data *mob_index; extern struct dual_list_type nonreg_plurals[]; extern char *damage_state[]; extern char *credits; extern char *news; extern char *info; extern char *wizlist; extern char *immlist; extern char *policies; extern char *handbook; extern char *building; extern char *motd; extern char *imotd; extern char *dirs[]; extern char *where[]; extern char *where_animal[]; extern char *where_plant[]; extern char *where_equine[]; extern char *color_liquid[]; extern char *fullness[]; extern char *connected_types[]; extern char *command[]; extern char *race_abbrevs[]; extern char *room_bits[]; extern char *spells[]; extern char *skills_list[]; extern char *equipment_types[]; extern char *affected_bits[]; extern char *apply_types[]; extern char *pc_race_types[]; extern char *npc_class_types[]; extern char *action_bits[]; extern char *position_types[]; int compute_room_light_value(struct room_data *room); char *report_cost(int gold); char *report_gold(int gold); int report_money_weight(int amount); int report_highest_value_for_weight(int weight); int find_eq_pos(struct char_data *ch, struct obj_data *obj, char *arg); void parse_text(struct char_data *c,struct char_data *vict, int mode, char *text); int report_crowns(int amount); int report_groats(int amount); int report_pennies(int amount); char *make_plural(char *arg); char *first_name(char *arg); char *pluralise_string(char *arg); char *find_spell_name(int spl); char *find_skill_name(int spl); char buf_crwn[240]; /* intern functions & vars*/ int num_of_cmds; void list_obj_to_char(struct obj_data *list, struct char_data *ch, int mode, bool show); void show_char_to_char(struct char_data *i, struct char_data *ch, int mode); int can_see_hidden(struct char_data *sub, struct char_data *obj); void show_cart_to_char(struct obj_data *object, struct char_data *ch, int mode); void format_desc(char *string, char *buf_p, int max_l); void process_room_descr(char *in, char *out, byte llev); /* Procedures related to 'look' */ void format_desc(char *string, char *buf_p, int max_lin) { char *p, *pp, line[100]; int i, min_lin=100; bzero(line,100); strcpy(line," "); for (i = 0;*(string + i) == ' ';i++) ; *buf_p = '\0'; p = string +i; pp = line + 3; while((*p != '\0') && (p <= string + strlen(string))) { if ((*p == ' ') && (*(p + 1) == ' ') && (*(p -1) == ' ' || (*(p + 2) == ' '))) { for (;((*p == ' ') && (*p != '\0'));p++) ; if ((pp - line) < min_lin) min_lin = pp - line; strcat(line, "\r\n"); strcat(buf_p, line); bzero(line,100); strcpy(line," "); pp = line + 3; continue; } if (((*p == '\r') && (*(p+1) == '\n')) || (((*p == '\n') && (*(p+1) == '\r')))){ if ((pp - line > 75) && (*(p+2) == '\0')) { p += 2; if ((pp - line) < min_lin) min_lin = pp - line; strcat(line, "\r\n"); strcat(buf_p, line); bzero(line,100); pp = line; continue; } if (*(p-1) != ' ') *pp++ = ' '; if ((*(p-1) == '.') || (*(p-1) == '?') || (*(p-1) == '!')) *pp++ = ' '; p += 2; for (i=1 ;((*(p+i) != ' ') && (*(p+i) != '\n') && (*(p+i) != '\r') && (*(p+i) != '\0'));i++) ; if ((pp - line + i) > max_lin) { for (;((*p == ' ') && (*p != '\0'));p++) ; if ((pp - line) < min_lin) min_lin = pp - line; strcat(line, "\r\n"); strcat(buf_p, line); bzero(line,100); pp = line; continue; } } *pp++ = *p++; if (*p == ' ') { if ((*(p-1) != '.') && ((*p+1) == ' ')) for (;((*p == ' ') && (*p != '\0'));p++) ; for (i=1 ;((*(p+i) != ' ') && (*(p+i) != '\n') && (*(p+i) != '\r') && (*(p+i) != '\0'));i++) ; if ((pp - line + i) >= max_lin) { for (;((*p == ' ') && (*p != '\0'));p++) ; if ((pp - line) < min_lin) min_lin = pp - line; strcat(line, "\r\n"); strcat(buf_p, line); bzero(line,100); pp = line; } } } if ((pp - line) < min_lin && (pp > line)) min_lin = pp - line; strcat(buf_p, line); if ((*(buf_p + strlen(buf_p) -2) != '\r') && (*(buf_p + strlen(buf_p) -2) != '\n')) strcat(buf_p,"\r\n"); if ((min_lin < 9) && (max_lin > 71)) format_desc(string, buf_p, max_lin -2); } void argument_split_2(char *argument, char *first_arg, char *second_arg) { int look_at, found, begin; found = begin = 0; if (!argument) return; /* Find first non blank */ for ( ; *(argument + begin ) == ' ' ; begin++) ; /* Find length of first word */ for (look_at = 0; *(argument + begin + look_at) > ' ' ; look_at++) /* Make all letters lower case, AND copy them to first_arg */ *(first_arg + look_at) = LOWER(*(argument + begin + look_at)); *(first_arg + look_at) = '\0'; begin += look_at; /* Find first non blank */ for ( ; *(argument + begin ) == ' ' ; begin++) ; /* Find length of second word */ for ( look_at = 0; *(argument + begin + look_at) > ' ' ; look_at++) /* Make all letters lower case, AND copy them to second_arg */ *(second_arg + look_at) = LOWER(*(argument + begin + look_at)); *(second_arg + look_at) = '\0'; begin += look_at; } char *find_ex_description(char *word, struct extra_descr_data *list) { struct extra_descr_data *i =0; for (i = list; i; i = i->next) if (i->keyword && isname(word, i->keyword)) return(i->description); return(0); } void show_scabbard_to_char(struct obj_data *scabbard, struct char_data *ch, int mode) { if (IS_OBJ_STAT(scabbard, ITEM_INVISIBLE)) strcat(buf, "(invisible)"); if (!scabbard->contains) strcat(buf, "..empty."); else { strcat (buf, "..containing\r\n ... "); if (!CAN_SEE_OBJ(ch, scabbard->contains)) strcat (buf, "something."); else strcat (buf, ((scabbard->contains->short_description) ? scabbard->contains->short_description : "a weapon.")); } if (*buf) page_string(ch->desc, buf, 1); } void show_obj_to_char(struct obj_data *object, struct char_data *ch, int mode) { bool found; int where; *buf = '\0'; if (mode == 0){ if (object->description) strcat(buf,(CAN_SEE_OBJ(ch, object) ? object->description : "something")); } else if (object->short_description && ((mode == 1) || (mode == 2) || (mode == 3) || (mode == 4))) strcat(buf, (CAN_SEE_OBJ(ch, object) ? object->short_description: "something")); else if (mode == 5) { if (object->obj_flags.type_flag == 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 ((object->obj_flags.type_flag != 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) { if (GET_ITEM_TYPE(object) == ITEM_SCABBARD) { show_scabbard_to_char(object, ch, mode); return; } found = FALSE; if (IS_OBJ_STAT(object, ITEM_EVIL) && IS_AFFECTED(ch, AFF_DETECT_EVIL)) { strcat(buf, "..reeking of evil!"); found = TRUE; } if (IS_OBJ_STAT(object, ITEM_MAGIC) && IS_AFFECTED(ch, AFF_DETECT_MAGIC)) { strcat(buf, "..it smells of magic!"); found = TRUE; } if (IS_OBJ_STAT(object, ITEM_GLOW) && (object->obj_flags2.light != 0)) { if ((object->obj_flags2.light+3)/3 > 5) strcat(buf, "..brilliantly shining!"); else switch((object->obj_flags2.light+3)/4){ case 5: strcat(buf, "..brilliantly shining!"); break; case 4: strcat(buf, "..shining!"); break; case 3: strcat(buf, "..glowing strongly."); break; case 2: strcat(buf, "..glowing."); break; case 1: strcat(buf, "..glowing faintly."); case 0: break; case -1: strcat(buf, "..casting faint shadows."); break; case -2: strcat(buf, "..cloaked in shadow."); break; case -3: strcat(buf, "..wreathed in darkness."); break; case -4: strcat(buf, "..exuding tendrils of darkness!"); break; case -5: strcat(buf, "..enveloped in blackness!"); break; } found = TRUE; } if (IS_OBJ_STAT(object, ITEM_HUM)) { strcat(buf, "..faintly humming."); found = TRUE; } where = find_eq_pos(ch, object, 0); if (where >0 && where != HOLD && where != WEAR_SCABBARD ) if (!PRF_FLAGGED(ch, PRF_NOCOND)){ if (object->obj_flags.value[4] >= 0) strcat(buf,damage_state[object->obj_flags.value[4]]); else strcat(buf,"..in stunning condition."); } if (IS_OBJ_STAT(object, ITEM_INVISIBLE)) { strcat(buf, "(invisible)"); found = TRUE; } } if (*buf) page_string(ch->desc, buf, 1); } void list_obj_to_char(struct obj_data *list, struct char_data *ch, int mode, bool show) { bool found; struct obj_data *i,*ii,*iii,*iv,*v; /* sort the list putting objs with the same virtual number next to each other */ for (i = list; i; i = i->next_content) { if(i->next_content) for (ii = i->next_content; ii; ii = ii->next_content) if (i->description && ii->description && (ii != i->next_content) && !(strcmp(ii->description,i->description))) { iii = ii->next_content; iv = i->next_content; for (v = i;v->next_content != ii;v = v->next_content) ; v->next_content = iii; i->next_content = ii; ii->next_content = iv; break; } } found = FALSE; for ( i = list ; i ; i = i->next_content ) { if (CAN_SEE_OBJ(ch, i)){ if (i->pulled_by) show_cart_to_char(i, ch, mode); else if ((GET_ITEM_TYPE(i) == ITEM_CONTAINER) && (HASROOM(i)) && (ch->in_room == real_room(i->obj_flags.value[3]))) continue; else show_obj_to_char(i, ch, mode); found = TRUE; } } if ((!found) && (show)) send_to_char("Nothing.\r\n", ch); } void show_cart_to_char(struct obj_data *object, struct char_data *ch, int mode) { struct follow_type *k; char buf_loc[256]; char tmp_loc[256]; int n = 0; bzero(buf_loc,256); for (k = object->pulled_by;k;k = k->next){ show_char_to_char(k->follower,ch,mode); strcat(buf_loc, first_name(k->follower->player.name ? k->follower->player.name : k->follower->player.short_descr)); strcat(buf_loc, " "); n++;} if (n > 1) sprintf(tmp_loc,"The %s are hitched to $p.",pluralise_string(buf_loc)); else{ half_chop(buf_loc,buf,buf1); sprintf(tmp_loc,"The %s is hitched to $p.",buf);} act(tmp_loc,TRUE,ch,object,0,TO_CHAR); } char *pluralise_string(char *arg_loc) { char buf1[256], buf2[256], buf2p[256], result[256]; char *pt, *tmpp; int i; pt = arg_loc; if (!pt) return(pt); bzero(result,256); while(TRUE){ if (!pt || *pt == '\0') break; half_chop(pt,buf2,buf1); pt = buf1; strcpy(buf2p,make_plural(buf2)); if (!strstr(result,buf2) && !strstr(result, buf2p)){ i=0; tmpp = pt; while ((tmpp = strstr(tmpp,buf2))){ for(;*tmpp != ' ' && *tmpp != '\0';tmpp++) ; i++; } if (i > 0) strcat(result,buf2p); else strcat(result,buf2); strcat(result, " and "); } } if (result && strlen(result) > 5) { bzero(buf1,256); strncpy(buf1,result, strlen(result) -5); strcpy(buf,buf1); return(buf); } return(0); } 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?? */ if (CAN_SEE(ch,i)) strcpy(buf, GET_NAME(i)); else { if (CAN_SPEAK(i)) strcpy(buf, "someone"); else strcpy(buf, "something"); } CAP(buf); if (percent >= 100) strcat(buf, " is unhurt.\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); if (GET_MAX_MOVE(i) > 0) percent = (100 * GET_MOVE(i)) / GET_MAX_MOVE(i); else percent = -1; /* How could MAX_HIT be < 1?? */ if (CAN_SEE(ch,i)) strcpy(buf, GET_NAME(i)); else if (CAN_SPEAK(i)) strcpy(buf, "someone"); else strcpy(buf, "something"); CAP(buf); if (percent >= 90) strcat(buf, " looks fully rested.\r\n"); else if (percent >= 75) strcat(buf, " seems a little weary.\r\n"); else if (percent >= 50) strcat(buf, " looks tired.\r\n"); else if (percent >= 30 ) strcat(buf, " looks very tired.\r\n"); else if ( percent >= 15 ) strcat(buf, " looks extremely tired.\r\n"); else if ( percent >= 0 ) strcat(buf, " looks nearly exhausted.\r\n"); else strcat(buf, " is completely exhausted!\r\n"); send_to_char(buf, ch); } void show_char_to_char(struct char_data *i, struct char_data *ch, int mode) { int j,jj, found; struct obj_data *tmp_obj; bool has_boat=FALSE; const char *pos; const int loc[]={6,18,19,20,21,3,4,5,22,10,1,2,14,15,9, 11,23,0,16,17,12,13,7,8}; for (tmp_obj = i->inventory; tmp_obj; tmp_obj= tmp_obj->next_content) if (tmp_obj->obj_flags.type_flag == ITEM_BOAT) has_boat = TRUE; if (mode == 0) { if ((IS_AFFECTED(i, AFF_HIDE) && !can_see_hidden(ch,i)) || !CAN_SEE(ch, i)) { if (IS_AFFECTED(ch, AFF_SENSE_LIFE)) send_to_char("You catch a glimpse of something or someone.\r\n", ch); return; } if (!(i->player.long_descr) || (GET_POS(i) != i->specials.default_pos) || affected_by_spell(i, SPELL_ENCASE_IN_ICE) || affected_by_spell(i, SPELL_WEB) || i->specials.fighting || i->specials.mount || i->specials.carrying || MOB_FLAGGED(i,MOB_TETHERED) || i->specials.rider) { /* A player char or a mobile without long descr, or not in default position, or fighting */ if (!IS_NPC(i)){ if (!i->specials.mount){ parse_text(i,ch,0,buf2); sprintf(buf, "%s", buf2); } else sprintf(buf, "%s", i->player.name); } else { strcpy(buf, i->player.short_descr); CAP(buf); if (MOB_FLAGGED(i,MOB_CITIZEN)) strcat(buf, " (citizen)"); if (MOB_FLAGGED(i,MOB_DOCILE)) strcat(buf, " (tame)"); if (IS_AFFECTED(i, AFF_HIDE)) strcat(buf," (hiding)"); } if (MOB_FLAGGED(i, MOB_TETHERED)) { strcat(buf, " is tethered here."); } else if (i->specials.mount || i->specials.carrying || affected_by_spell(i, SPELL_ENCASE_IN_ICE) || affected_by_spell(i, SPELL_WEB)) { strcat(buf, " is here"); } else { switch (GET_POS(i)) { case POSITION_STUNNED : strcat(buf, " is lying here, stunned."); break; case POSITION_INCAP : strcat(buf, " is lying here, incapacitated."); break; case POSITION_MORTALLYW: strcat(buf, " is lying here, mortally wounded."); break; case POSITION_DEAD : strcat(buf, " is lying here, dead."); break; case POSITION_STANDING : if (world[i->in_room].sector_type == SECT_UNDER_WATER || world[i->in_room].sector_type == SECT_WATER_SWIM || (world[i->in_room].sector_type == SECT_WATER_NOSWIM && !has_boat)) strcat(buf, " is swimming here."); else if (IS_AFFECTED(i, AFF_FLY)) strcat(buf, " is hovering here."); else strcat(buf, " is standing here."); break; case POSITION_SITTING : strcat(buf, " is sitting here."); break; case POSITION_RESTING : strcat(buf, " is lying here."); break; case POSITION_SLEEPING : strcat(buf, " is sleeping here."); break; default : strcat(buf, " is floating here."); break; } } if (i->specials.rider) sprintf(buf, "%s (%sridden%s)",buf, CCBBLU(ch,C_NRM),CCNRM(ch,C_NRM)); if (IS_AFFECTED(i, AFF_INVISIBLE)) sprintf(buf, "%s (%sinvis%s)",buf,CCWHT(ch,C_NRM),CCNRM(ch,C_NRM)); if (IS_AFFECTED(i, AFF_HIDE)) sprintf(buf, "%s (%shide%s)",buf,CCWHT(ch,C_NRM),CCNRM(ch,C_NRM)); if (!IS_NPC(i) && !i->desc) sprintf(buf, "%s (%sLD%s)", buf, CCWHT(ch,C_NRM),CCNRM(ch,C_NRM)); if (PLR_FLAGGED(i, PLR_WRITING)) sprintf(buf, "%s (%swriting%s)", buf, CCGRN(ch,C_NRM), CCNRM(ch,C_NRM)); if (PLR_FLAGGED(i, PLR_BUILDING)) sprintf(buf, "%s (%sbuilding%s)", buf, CCYEL(ch,C_NRM), CCNRM(ch,C_NRM)); if (PLR_FLAGGED(i, PLR_AFK)) sprintf(buf,"%s (%saway%s)",buf,CCCYN(ch,C_NRM),CCNRM(ch,C_NRM)); if (IS_AFFECTED(ch, AFF_DETECT_EVIL) && IS_EVIL(i)) sprintf(buf,"%s (%sevil%s)",buf,CCRED(ch,C_NRM),CCNRM(ch,C_NRM)); if (i->specials.mount) { strcat(buf, " riding on "); if (!IS_NPC(i->specials.mount)) strcat(buf, i->specials.mount->player.name); else strcat(buf, i->specials.mount->player.short_descr); strcat(buf, "'s back.\r\n"); } else if (i->specials.carrying) { strcat(buf, " carrying "); if (!IS_NPC(i->specials.carrying)) strcat(buf, i->specials.carrying->player.name); else strcat(buf, i->specials.carrying->player.short_descr); strcat(buf, ".\r\n"); } else if(affected_by_spell(i, SPELL_ENCASE_IN_ICE)) strcat(buf, " encased in a block of ice.\r\n"); else if(affected_by_spell(i, SPELL_WEB)) strcat(buf, " entangled in sticky webs.\r\n"); else strcat(buf, "\r\n"); } else { /* npc with long */ *buf = '\0'; strcat(buf, i->player.long_descr); if (IS_AFFECTED(i, AFF_INVISIBLE)) sprintf(buf, "%s%s*%s\r\n",strtok(buf,"\r\n"),CCBWHT(ch,C_NRM), CCNRM(ch,C_NRM)); if (IS_AFFECTED(ch, AFF_DETECT_EVIL)) { if (IS_EVIL(i)) sprintf(buf,"%s%s+%s\r\n",strtok(buf,"\r\n"),CCRED(ch,C_NRM), CCNRM(ch,C_NRM)); } if (IS_NPC(i) && MOB_FLAGGED(i,MOB_DOCILE)) strcat(strtok(buf,"\r\n"), " (tame)\r\n"); if (IS_NPC(i) && MOB_FLAGGED(i,MOB_CITIZEN)) strcat(strtok(buf,"\r\n"), " (citizen)\r\n"); strcat(strtok(buf,"\r\n"), "\r\n"); } if (i->specials.fighting) { strcat(strtok(buf,"\r\n"), "..fighting "); if (i->specials.fighting == ch) strcat(buf, "YOU!\r\n"); else { if (i->in_room == i->specials.fighting->in_room){ strcat(buf, ((i->specials.fighting->player.short_descr) ? i->specials.fighting->player.short_descr: ((i->specials.fighting->player.name) ? i->specials.fighting->player.name: "something"))); strcat(buf, ".\r\n"); } else strcat(buf, "someone who has already left.\r\n"); } } send_to_char(buf, ch); if (i->specials.mount) show_char_to_char(i->specials.mount,ch,mode); if (!i->specials.rider) { if (IS_AFFECTED(i, AFF_SANCTUARY)) act("$n glows with a bright light!", FALSE, i, 0, ch, TO_VICT); if (!IS_NPC(i)){ if (IS_AFFECTED(i, AFF_RESIST_HEAT)) act("$n glows with a pink light!", FALSE, i, 0, ch, TO_VICT); if (IS_AFFECTED(i, AFF_RESIST_COLD)) act("$n glows with a blue light!", FALSE, i, 0, ch, TO_VICT);} } } else if (mode == 1) { 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); } /* Show a character to another */ diag_char_to_char(i, ch); found = FALSE; if (i->specials.carrying) found = TRUE; for (j = 0; j < MAX_WEAR; j++) { if (found) break; if (i->equipment[j]) if (CAN_SEE_OBJ(ch, i->equipment[j]) ) found = TRUE; } if (found) { /* switch (GET_RACE(i)){ */ /* case CLASS_ANIMAL: */ /* pos = where_animal[0]; */ /* break; */ /* case CLASS_PLANT: */ /* pos = where_plant[0]; */ /* break; */ /* case CLASS_EQUINE: */ /* pos = where_equine[0]; */ /* break; */ /* case CLASS_OTHER: */ /* case CLASS_HUMANOID: */ /* case CLASS_UNDEAD: */ /* default: */ /* pos = where[0]; */ /* } */ act("\r\n$n has:", FALSE, i, 0, ch, TO_VICT); jj = 1; for (j = 0; j < MAX_WEAR; j++) { if ((loc[j] == HOLD) && i->specials.carrying) { sprintf(buf, "[%2i] <carried> %s\r\n",jj, (IS_NPC(i->specials.carrying) ? i->specials.carrying->player.short_descr : i->specials.carrying->player.name)); send_to_char(buf,ch); } if (i->equipment[loc[j]]) { if (CAN_SEE_OBJ(ch, i->equipment[loc[j]])) { if ((loc[j] == HOLD && (is_held_obj_twohanded(i,i->equipment[loc[j]]))) || (loc[j] == WIELD && (is_two_handed(i,i->equipment[loc[j]])))) sprintf(buf, "[%2i]%s ",jj,"<both hands> "); else sprintf(buf,"[%2i]%s ",jj,where[loc[j]]); send_to_char(buf, ch); show_obj_to_char(i->equipment[loc[j]], ch, 1); jj++; } } } } if (((GET_PER(ch) >= number(1,30)) || GET_LEVEL(ch) >= LEVEL_BUILDER) && (ch != i)) { found = FALSE; send_to_char("\r\nYou attempt to peek at the inventory:\r\n", ch); for (tmp_obj = i->inventory; tmp_obj; tmp_obj = tmp_obj->next_content) { if (number(0, 120) < (GET_LEVEL(ch) + 3*GET_PER(ch))) { show_obj_to_char(tmp_obj, ch, 1); found = TRUE; } } if (!found) send_to_char("You can't see anything.\r\n", ch); } } else if (mode == 2) { /* Lists inventory */ act("$n has in $s inventory:", FALSE, i, 0, ch, TO_VICT); list_obj_to_char(i->inventory, ch, 1, TRUE); } } int can_see_hidden(struct char_data *sub, struct char_data *obj) { if(!obj) return(FALSE); if ((GET_PER(sub) >= (GET_LEVEL(obj) - GET_LEVEL(sub))/20 + 20) && number(0,60) <= GET_PER(sub)) return(TRUE); else return(FALSE); } void list_char_to_char(struct char_data *list, struct char_data *ch, int mode) { struct char_data *i,*ii,*iii,*iv,*v; /* sort the list putting mobs with the same virtual number next to each other */ for (i = list; i; i = i->next_in_room) { if(IS_MOB(i)) if(i->next_in_room) for (ii = i->next_in_room; ii; ii = ii->next_in_room) if (i->player.long_descr && ii->player.long_descr && (ii != i->next_in_room) && !(strcmp(ii->player.long_descr,i->player.long_descr))) { iii = ii->next_in_room; iv = i->next_in_room; for (v = i;v->next_in_room != ii;v = v->next_in_room) ; v->next_in_room = iii; i->next_in_room = ii; ii->next_in_room = iv; break; } } for (i = list; i; i = i->next_in_room) if (ch != i) { if ((CAN_SEE(ch, i) && !IS_PULLING(i) && (!i->specials.carried_by) && (!(i->specials.rider) || (i->specials.rider == ch)) && ((IS_AFFECTED(ch, AFF_SENSE_LIFE) || !IS_AFFECTED(i, AFF_HIDE)) || (IS_AFFECTED(i, AFF_HIDE) && can_see_hidden(ch,i))))) show_char_to_char(i, ch, 0); else if ((IS_DARK(ch->in_room)) && (IS_AFFECTED(i, AFF_INFRARED))) send_to_char("You see a pair of glowing red eyes looking your way.\r\n", ch); } } ACMD(do_motd) { one_argument(argument,arg); if (GET_LEVEL(ch) < LEVEL_BUILDER) page_string(ch->desc,motd,1); else if (!(*arg)) page_string(ch->desc,imotd,1); else if (!strcmp("mortal",arg) || !strcmp("motd",arg)) page_string(ch->desc,motd,1); else page_string(ch->desc,imotd,1); } ACMD(do_attributes) { int nsp, bonus; char *name; struct affected_type *aff; extern struct str_app_type str_app[]; if (IS_MOB(ch)) return; bonus = combat_bonus(ch); sprintf(buf,"You are: "); send_to_char(buf,ch); if (ch->player.title){ parse_text(ch,ch,0,buf2); sprintf(buf, "%s.\r\n", buf2); } else sprintf(buf, " %s.\r\n",ch->player.name); send_to_char(buf, ch); if (GET_LEVEL(ch) < LEVEL_BUILDER){ if (!ch->specials.fighting){ sprinttype(GET_POS(ch), position_types, buf2); sprintf(buf, "You are %s.\r\n", buf2);} else sprintf(buf, "%sYou are fighting!%s\r\n", CCRED(ch, C_NRM), CCNRM(ch, C_NRM)); send_to_char(buf, ch); strcpy(buf, "Race: "); sprinttype(ch->player.race, pc_race_types, buf2); strcat(buf, buf2); send_to_char(buf,ch); if (GET_ALIGNMENT(ch) > 950) sprintf(buf,"Saintly"); else if (GET_ALIGNMENT(ch) > 850) sprintf(buf,"Pious"); else if (GET_ALIGNMENT(ch) > 600) sprintf(buf,"Righteous"); else if (GET_ALIGNMENT(ch) > 450) sprintf(buf,"Upright"); else if (GET_ALIGNMENT(ch) > 350) sprintf(buf,"Moral"); else if (GET_ALIGNMENT(ch) > 250) sprintf(buf,"Wayward"); else if (GET_ALIGNMENT(ch) > 0) sprintf(buf,"Perverse"); else if (GET_ALIGNMENT(ch) > -250) sprintf(buf,"Bad"); else if (GET_ALIGNMENT(ch) > -350) sprintf(buf,"Amoral"); else if (GET_ALIGNMENT(ch) > -450) sprintf(buf,"Cruel"); else if (GET_ALIGNMENT(ch) > -600) sprintf(buf,"Debauched"); else if (GET_ALIGNMENT(ch) > -850) sprintf(buf,"Wicked"); else if (GET_ALIGNMENT(ch) > -950) sprintf(buf,"Evil"); else sprintf(buf,"Diabolic"); sprintf(buf2, ", XP: [%s%7d%s], Align: %s%s%s, Pracs [%s%5d%s]\r\n", CCYEL(ch, C_NRM), GET_EXP(ch), CCNRM(ch, C_NRM), CCYEL(ch, C_NRM), buf,CCNRM(ch, C_NRM), CCYEL(ch, C_NRM), SPELLS_TO_LEARN(ch),CCNRM(ch, C_NRM)); send_to_char(buf2, ch); sprintf(buf,"Height: %s%2d'%2d''%s, Weight: %s%4d lb%s, ", CCYEL(ch, C_NRM), (int) (100*GET_HEIGHT(ch)/254)/12, (int)(100*GET_HEIGHT(ch)/254)-12*((100*GET_HEIGHT(ch)/254)/12), CCNRM(ch, C_NRM), CCYEL(ch, C_NRM), GET_WEIGHT(ch)/10, CCNRM(ch, C_NRM) ); send_to_char(buf, ch); sprintf(buf, "Carried Weight: %s%4d%s, items: %s%3d%s.\r\n", CCYEL(ch, C_NRM), IS_CARRYING_W(ch)/10,CCNRM(ch, C_NRM), CCYEL(ch, C_NRM), IS_CARRYING_N(ch),CCNRM(ch, C_NRM) ); send_to_char(buf,ch); switch(encumberance_level(ch)){ case 0: sprintf(buf, "%sYou are unencumbered.\r\n%s", CCBBLU(ch, C_NRM),CCNRM(ch, C_NRM)); break; case 1: sprintf(buf, "%sYou are lightly loaded.\r\n%s", CCBBLU(ch, C_NRM),CCNRM(ch, C_NRM)); break; case 2: sprintf(buf, "%sYou are slightly encumbered.\r\n%s", CCBBLU(ch, C_NRM),CCNRM(ch, C_NRM)); break; case 3: sprintf(buf, "%sYou are moderately encumbered.\r\n%s", CCBBLU(ch, C_NRM),CCNRM(ch, C_NRM)); break; case 4: sprintf(buf, "%sYou are encumbered.\r\n%s", CCBBLU(ch, C_NRM),CCNRM(ch, C_NRM)); break; case 5: sprintf(buf, "%sYou are heavily loaded.\r\n%s", CCBBLU(ch, C_NRM),CCNRM(ch, C_NRM)); break; case 6: sprintf(buf, "%sYou are close to your carrying limit.\r\n%s", CCBBLU(ch, C_NRM),CCNRM(ch, C_NRM)); break; default: sprintf(buf, "%sMinor Bug please report this.\r\n%s", CCBBLU(ch, C_NRM),CCNRM(ch, C_NRM)); break; } send_to_char(buf,ch); send_to_char(CCBGRN(ch,C_NRM), ch); send_to_char("\r\n Current/Base Stats:\r\n",ch); send_to_char(CCNRM(ch,C_NRM), ch); sprintf(buf, " \r\n Str: [%s%2d/%2d%s] Int: [%s%2d/%2d%s] Wis: [%s%2d/%2d%s] Dex: [%s%2d/%2d%s] Foc: [%s%2d/%2d%s]\r\n", CCBCYN(ch, C_NRM), GET_STR(ch), GET_RAW_STR(ch), CCNRM(ch, C_NRM), CCBCYN(ch, C_NRM), GET_INT(ch), GET_RAW_INT(ch), CCNRM(ch, C_NRM), CCBCYN(ch, C_NRM), GET_WIS(ch), GET_RAW_WIS(ch), CCNRM(ch, C_NRM), CCBCYN(ch, C_NRM), GET_DEX(ch), GET_RAW_DEX(ch), CCNRM(ch, C_NRM), CCBCYN(ch, C_NRM), GET_FOC(ch), GET_RAW_FOC(ch), CCNRM(ch, C_NRM)); send_to_char(buf, ch); sprintf(buf, " Con: [%s%2d/%2d%s] Chr: [%s%2d/%2d%s] Per: [%s%2d/%2d%s] Gui: [%s%2d/%2d%s] \r\n", CCBCYN(ch, C_NRM), GET_CON(ch), GET_RAW_CON(ch), CCNRM(ch, C_NRM), CCBCYN(ch, C_NRM), GET_CHR(ch), GET_RAW_CHR(ch), CCNRM(ch, C_NRM), CCBCYN(ch, C_NRM), GET_PER(ch), GET_RAW_PER(ch), CCNRM(ch, C_NRM), CCBCYN(ch, C_NRM), GET_GUI(ch), GET_RAW_GUI(ch), CCNRM(ch, C_NRM)); send_to_char(buf, ch); sprintf(buf, " \r\n Hit p.: [%s%4d/%4d%s] Move p.: [%s%4d/%4d%s]\r\n \r\n", CCBGRN(ch, C_NRM), GET_HIT(ch), GET_MAX_HIT(ch), CCNRM(ch, C_NRM), CCBGRN(ch, C_NRM), GET_MOVE(ch), GET_MAX_MOVE(ch), CCNRM(ch, C_NRM)); send_to_char(buf, ch); sprintf(buf, " Body AC/St: [%s%d/%d%s] Arm AC/St: [%s%d/%d%s]\r\n", CCBWHT(ch, C_NRM),GET_BODY_AC(ch),GET_BODY_STOPPING(ch),CCNRM(ch,C_NRM), CCBWHT(ch, C_NRM),GET_ARMS_AC(ch),GET_ARMS_STOPPING(ch),CCNRM(ch,C_NRM)); send_to_char(buf, ch); sprintf( buf," Head AC/St: [%s%d/%d%s] Leg AC/St: [%s%d/%d%s]\r\n", CCBWHT(ch, C_NRM),GET_HEAD_AC(ch),GET_HEAD_STOPPING(ch),CCNRM(ch,C_NRM), CCBWHT(ch, C_NRM),GET_LEGS_AC(ch),GET_LEGS_STOPPING(ch),CCNRM(ch,C_NRM)); send_to_char(buf, ch); sprintf(buf,"\r\nPrimary: Hitroll: [%s%2d%s/%s%2d%s] Damroll: [%s%2d%s/%s%2d%s]\r\n", CCBCYN(ch, C_NRM),ch->points.hitroll,CCNRM(ch, C_NRM), CCBYEL(ch, C_NRM),ch->points.hitroll+bonus,CCNRM(ch, C_NRM), CCBCYN(ch, C_NRM),ch->points.damroll,CCNRM(ch, C_NRM), CCBYEL(ch, C_NRM),ch->points.damroll+bonus,CCNRM(ch, C_NRM)); send_to_char(buf, ch); sprintf(buf,"\r\nSecondary: Hitroll: [%s%2d%s/%s%2d%s] Damroll: [%s%2d%s/%s%2d%s]\r\n", CCBCYN(ch, C_NRM),ch->specials.hitroll,CCNRM(ch, C_NRM), CCBYEL(ch, C_NRM),ch->specials.hitroll+bonus,CCNRM(ch, C_NRM), CCBCYN(ch, C_NRM),ch->specials.damroll,CCNRM(ch, C_NRM), CCBYEL(ch, C_NRM),ch->specials.damroll+bonus,CCNRM(ch, C_NRM)); send_to_char(buf, ch); } else{ parse_text(ch,ch,1,buf2); sprintf(buf,"%sPoofIn: %s%s\r\n",CCCYN(ch, C_NRM),CCNRM(ch, C_NRM), buf2); send_to_char(buf,ch); parse_text(ch,ch,2,buf2); sprintf(buf,"%sPoofOut: %s%s\r\n",CCCYN(ch, C_NRM),CCNRM(ch, C_NRM),buf2); send_to_char(buf,ch); sprintf(buf,"\r\n%sYou load in room: %s%d%s\r\n" ,CCGRN(ch, C_NRM),CCRED(ch, C_NRM), ch->specials2.load_room,CCNRM(ch, C_NRM)); send_to_char(buf,ch); if (GET_LEVEL(ch) >= LEVEL_BUILDER){ if (ch->specials2.edit_zone > 0) sprintf(buf,"\r\n%sYou are editing zone: %s%ld%s\r\n" ,CCGRN(ch, C_NRM),CCRED(ch, C_NRM), ch->specials2.edit_zone,CCNRM(ch, C_NRM)); else sprintf(buf,"\r\n%sYou are editing zone: %sNone%s\r\n" ,CCGRN(ch, C_NRM),CCRED(ch, C_NRM),CCNRM(ch, C_NRM)); send_to_char(buf,ch); } if (GET_LEVEL(ch) > LEVEL_BUILDER && (ch->specials2.edit_zone2 > 0 || ch->specials2.edit_zone3 > 0)){ if (ch->specials2.edit_zone2 > 0 && ch->specials2.edit_zone3 <= 0) sprintf(buf,"%sYou can also edit zone:%s%ld%s" ,CCGRN(ch, C_NRM),CCRED(ch, C_NRM) , ch->specials2.edit_zone2,CCNRM(ch, C_NRM)); else if (ch->specials2.edit_zone2 <= 0 && ch->specials2.edit_zone3 > 0) sprintf(buf,"%sYou can also edit zone:%s%ld%s" ,CCGRN(ch, C_NRM),CCRED(ch, C_NRM) , ch->specials2.edit_zone3,CCNRM(ch, C_NRM)); else if (ch->specials2.edit_zone2 > 0 && ch->specials2.edit_zone3 > 0) sprintf(buf,"%sYou can also edit zones: %s%ld and %ld %s\r\n" ,CCGRN(ch, C_NRM),CCRED(ch, C_NRM) ,ch->specials2.edit_zone2 ,ch->specials2.edit_zone3 ,CCNRM(ch, C_NRM)); send_to_char(buf,ch); } } /* Routine to show what spells a char is affected by */ if (ch->affected) { send_to_char(CCYEL(ch,C_NRM), ch); send_to_char("\r\n Spells Affecting:\r\n",ch); send_to_char(CCNRM(ch,C_NRM), ch); nsp = 0; *buf = 0; for (aff = ch->affected; aff; aff = aff->next) { if (aff->type != SKILL_SNEAK){ if ((name = find_spell_name(aff->type))){ sprintf(buf, "%sSPL: %s%20s%s ",buf, CCGRN(ch, C_NRM), name, CCNRM(ch, C_NRM)); nsp++; } else if ((name = find_skill_name(aff->type))){ sprintf(buf, "%sSKL: %s%20s%s ",buf, CCGRN(ch, C_NRM), name, CCNRM(ch, C_NRM)); nsp++; } } if (nsp > 1 && !(nsp%2)) sprintf(buf, "%s\r\n",buf); } sprintf(buf, "%s\r\n",buf); send_to_char(buf, ch); } } int report_highest_value_for_weight(int weight) { int amount=0; amount += 1000*weight/4; weight -= 4*(weight/4); amount += 100*weight/3; weight -= 3*(weight/3); amount += 10*weight/2; return amount; } int report_money_weight(int amount) { int weight=0; weight += report_crowns(amount)*4; weight += report_groats(amount)*3; weight += report_pennies(amount)*2; return(weight); } int report_crowns(int gold) { int crowns; crowns = gold/1000; return(crowns); } int report_groats(int gold) { int crowns,groats; crowns = gold/1000; groats = gold/100 - crowns*10; return(groats); } int report_pennies(int gold) { int crowns,groats,pennies; crowns = gold/1000; groats = gold/100 - crowns*10; pennies = gold/10 - crowns*100 - groats*10; return(pennies); } char *report_cost(int gold) { char buf_loc[240]; int crowns, groats, pennies; if (gold <10){ sprintf(buf_crwn,"nothing"); return(&buf_crwn[0]); } crowns = gold/1000; groats = gold/100 - crowns*10; pennies = gold/10 - crowns*100 -groats*10; if (crowns) if (crowns > 1) sprintf(buf_crwn,"%d crowns", crowns); else sprintf(buf_crwn,"1 crown"); if (groats) if ( crowns > 0 && pennies == 0 ){ if (groats == 1) strcat(buf_crwn," and 1 groat"); else { sprintf(buf_loc," and %d groats", groats); strcat(buf_crwn,buf_loc); } } else if (crowns > 0 && pennies > 0){ if (groats == 1) strcat(buf_crwn,", 1 groat"); else { sprintf(buf_loc,", %d groats", groats); strcat(buf_crwn,buf_loc); } } else if (crowns == 0){ if (groats == 1) sprintf(buf_crwn,"1 groat"); else { sprintf(buf_crwn,"%d groats", groats); } } if (pennies) if ( crowns > 0 || groats > 0 ) { if (pennies == 1) strcat(buf_crwn," and 1 penny"); else { sprintf(buf_loc," and %d pennies", pennies); strcat(buf_crwn,buf_loc); } } else { if (pennies == 1) sprintf(buf_crwn,"1 penny"); else { sprintf(buf_crwn,"%d pennies", pennies); } } return(&buf_crwn[0]); } char *report_gold(int gold) { char buf_loc[240]; int crowns, groats, pennies; crowns = gold/1000; groats = gold/100 - crowns*10; pennies = gold/10 - crowns*100 -groats*10; if (crowns) if (crowns > 1) sprintf(buf_crwn,"%d cr", crowns); else sprintf(buf_crwn,"1 cr"); else buf_crwn[0] = '\0'; if (groats) if ( crowns > 0){ if (groats == 1) strcat(buf_crwn,"/1 gr"); else { sprintf(buf_loc,"/%d gr", groats); strcat(buf_crwn,buf_loc); } } else if ( crowns == 0 && pennies >0){ if (groats == 1) sprintf(buf_crwn,"1 gr"); else { sprintf(buf_crwn,"%d gr", groats); } } if (pennies) if ( crowns > 0 || groats > 0 ) { if (pennies == 1) strcat(buf_crwn,"/1 p"); else { sprintf(buf_loc,"/%d p", pennies); strcat(buf_crwn,buf_loc); } } else { if (pennies == 1) sprintf(buf_crwn,"1 penny"); else { sprintf(buf_crwn,"%d pennies", pennies); } } return(&buf_crwn[0]); } ACMD(do_look) { static char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH]; char buff[100]; int keyword_no, to_room; int j,iexits2, bits, temp; byte llev; bool found; struct obj_data *tmp_object, *found_object; struct char_data *tmp_char; char *tmp_desc; ACMD(do_track); static char *keywords[] = { "north", "east", "south", "west", "up", "down", "in", "at", "", /* Look at '' case */ "room", "out", "\n" }; int door,iexits; char *exits[] = { "North", "East", "South", "West", "Up", "Down" }; if (!ch->desc) return; if (GET_POS(ch) < POSITION_SLEEPING) send_to_char("You can't see anything but stars!\r\n", ch); else if (GET_POS(ch) == POSITION_SLEEPING) send_to_char("You can't see anything, you're sleeping!\r\n", ch); else if ( IS_AFFECTED(ch, AFF_BLIND) ) send_to_char("You can't see a damned thing, you're blinded!\r\n", ch); else { argument_split_2(argument, arg1, arg2); keyword_no = search_block(arg1, keywords, FALSE); /* Partiel Match */ if ((keyword_no == -1) && *arg1) { keyword_no = 7; strcpy(arg2, arg1); /* Let arg2 become the target object (arg1) */ } found = FALSE; tmp_object = 0; tmp_char = 0; tmp_desc = 0; switch (keyword_no) { /* look <dir> */ case 0 : case 1 : case 2 : case 3 : case 4 : case 5 : if (EXIT(ch, keyword_no)) { if (EXIT(ch, keyword_no)->general_description && !IS_SET(EXIT(ch,keyword_no)->exit_info,EX_SECRET)) send_to_char(EXIT(ch, keyword_no)->general_description, ch); else if (!IS_SET(EXIT(ch,keyword_no)->exit_info,EX_SECRET) || (!IS_SET(EXIT(ch, keyword_no)->exit_info, EX_CLOSED) && IS_SET(EXIT(ch,keyword_no)->exit_info,EX_SECRET))) send_to_char("You see nothing special.\r\n", ch); else send_to_char("Nothing special there...\r\n", ch); if (IS_SET(EXIT(ch, keyword_no)->exit_info, EX_CLOSED) && (EXIT(ch, keyword_no)->keyword) && !IS_SET(EXIT(ch,keyword_no)->exit_info,EX_SECRET) && !IS_SET(EXIT(ch,keyword_no)->exit_info,EX_DARK)) { sprintf(buf, "The %s is closed.\r\n", fname(EXIT(ch, keyword_no)->keyword)); send_to_char(buf, ch); } else { if (IS_SET(EXIT(ch, keyword_no)->exit_info, EX_ISDOOR) && EXIT(ch, keyword_no)->keyword && !IS_SET(EXIT(ch,keyword_no)->exit_info,EX_SECRET) && !IS_SET(EXIT(ch,keyword_no)->exit_info,EX_DARK)) { sprintf(buf, "The %s is open.\r\n", fname(EXIT(ch, keyword_no)->keyword)); send_to_char(buf, ch); } } } else { send_to_char("Nothing special there...\r\n", ch); } break; /* look 'in' */ case 6: if (*arg2) { /* Item carried */ bits = generic_find(arg2, FIND_OBJ_INV | FIND_OBJ_ROOM | FIND_OBJ_EQUIP, ch, &tmp_char, &tmp_object); if (bits) { /* Found something */ if ((GET_ITEM_TYPE(tmp_object) == ITEM_DRINKCON) || (GET_ITEM_TYPE(tmp_object) == ITEM_FOUNTAIN)) { if (tmp_object->obj_flags.value[1] <= 0) { act("It is empty.", FALSE, ch, 0, 0, TO_CHAR); } else { temp = ((tmp_object->obj_flags.value[1] * 3) / tmp_object->obj_flags.value[0]); sprintf(buf, "It's %sfull of a %s liquid.\r\n",fullness[temp], color_liquid[tmp_object->obj_flags.value[2]]); send_to_char(buf, ch); } } else if ((GET_ITEM_TYPE(tmp_object) == ITEM_CONTAINER) || (GET_ITEM_TYPE(tmp_object) == ITEM_SCABBARD)) { if (!IS_SET(tmp_object->obj_flags.value[1], CONT_CLOSED)) { if (HASROOM(tmp_object)) { to_room = real_room(tmp_object->obj_flags.value[3]); if (tmp_object->obj_flags.value[0] > 0) act("Looking in $p you see:",TRUE,ch,tmp_object,0,TO_CHAR); else act("Looking through $p you see:",TRUE ,ch,tmp_object,0,TO_CHAR); compute_room_light_value(&world[to_room]); llev = illumination_level(world[to_room].light, ch); if (PRF_FLAGGED(ch, PRF_HOLYLIGHT)) llev = 3; if ((llev < 0)) strcpy(buf2,"It is pitch black you can't see anything.\r\n"); else if (llev == 5) strcpy(buf2,"It is dazzlingly bright you can't see anything.\r\n"); else { sprintf(buf2,"%s\r\n%s.", CCCYN(ch, C_CMP), (world[to_room].name ? world[to_room].name : "something")); if (PRF_FLAGGED(ch, PRF_ROOMFLAGS)) { sprintbit((long) world[to_room].room_flags, room_bits,buf); sprintf(buf2, "%s (#%d) [ %s]",buf2, world[to_room].number, buf); } strcat(buf2, CCNRM(ch, C_CMP)); strcat(buf2, "\r\n"); send_to_char(buf2,ch); if (world[to_room].description && !PRF_FLAGGED(ch, PRF_BRIEF)){ process_room_descr(world[to_room].description, buf1,llev); if(!IS_SET(world[to_room].room_flags, NO_AUTOFORMAT)) { if (PRF_FLAGGED(ch, PRF_HOLYLIGHT)) { if (*buf1) *(buf1 + strlen(buf1) -2) = '\0'; strcat(buf1, " The area is magically lit.\r\n"); } else { switch (llev) { case 0: if (*buf1) *(buf1 + strlen(buf1) -2) = '\0'; strcat(buf1, " It's quite dark here.\r\n"); break; case 1: if (*buf1) *(buf1 + strlen(buf1) -2) = '\0'; strcat(buf1, " It's a bit gloomy here.\r\n"); break; case 3: if (*buf1) *(buf1 + strlen(buf1) -2) = '\0'; strcat(buf1, " It's bright here.\r\n"); break; case 4: if (*buf1) *(buf1 + strlen(buf1) -2) = '\0'; strcat(buf1, " It's glaringly bright here.\r\n"); break; default: break; } } if (*buf1) { format_desc(buf1, buf,79); send_to_char(buf, ch); } } else send_to_char(world[to_room].description,ch); } list_obj_to_char(world[to_room].contents ,ch,0,FALSE); list_char_to_char(world[to_room].people,ch,0); } } else { send_to_char(fname(tmp_object->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(" (worn) : \r\n", ch); break; } list_obj_to_char(tmp_object->contains, ch, 2, TRUE); } } else send_to_char("It is closed.\r\n", ch); } else send_to_char("That is not a container.\r\n", ch); } else /* wrong argument */ send_to_char("You do not see that item here.\r\n", ch); } else /* no argument */ send_to_char("Look in what?!\r\n", ch); break; /* look 'at' */ case 7 : if (*arg2) { bits = generic_find(arg2, FIND_OBJ_INV | FIND_OBJ_ROOM | FIND_OBJ_EQUIP | FIND_CHAR_ROOM, ch, &tmp_char, &found_object); if (tmp_char) { show_char_to_char(tmp_char, ch, 1); if (ch != tmp_char) { if (CAN_SEE(tmp_char, ch)) act("$n looks at you.", TRUE, ch, 0, tmp_char, TO_VICT); act("$n looks at $N.", TRUE, ch, 0, tmp_char, TO_NOTVICT); } return; } /* Search for Extra Descriptions in room and items */ /* Extra description in room?? */ if (!found) { tmp_desc = find_ex_description(arg2, world[ch->in_room].ex_description); if (tmp_desc) { page_string(ch->desc, tmp_desc, 0); return; /* RETURN SINCE IT WAS A ROOM DESCRIPTION */ /* Old system was: found = TRUE; */ } } /* Search for extra descriptions in items */ /* Equipment Used */ if (!found) { for (j = 0; j < MAX_WEAR && !found; j++) { if (ch->equipment[j]) { if (CAN_SEE_OBJ(ch, ch->equipment[j])) { tmp_desc = find_ex_description(arg2, ch->equipment[j]->ex_description); if (tmp_desc) { page_string(ch->desc, tmp_desc, 1); found = TRUE; } } } } } /* In inventory */ if (!found) { for (tmp_object = ch->inventory; tmp_object && !found; tmp_object = tmp_object->next_content) { if CAN_SEE_OBJ(ch, tmp_object) { tmp_desc = find_ex_description(arg2, tmp_object->ex_description); if (tmp_desc) { page_string(ch->desc, tmp_desc, 1); found = TRUE; } } } } /* Object In room */ if (!found) { for (tmp_object = world[ch->in_room].contents; tmp_object && !found; tmp_object = tmp_object->next_content) { if CAN_SEE_OBJ(ch, tmp_object) { tmp_desc = find_ex_description(arg2, tmp_object->ex_description); if (tmp_desc) { page_string(ch->desc, tmp_desc, 1); found = TRUE; } } } } /* wrong argument */ if (bits) { /* If an object was found */ if (!found) show_obj_to_char(found_object, ch, 5); /* Show no-description */ else show_obj_to_char(found_object, ch, 6); /* Find hum, glow etc */ } else if (!found) { send_to_char("You do not see that here.\r\n", ch); } } else { /* no argument */ send_to_char("Look at what?\r\n", ch); } break; /* look '' */ /* and look 'room' */ case 8: case 9 : compute_room_light_value(&world[ch->in_room]); llev = illumination_level(world[ch->in_room].light, ch); if (PRF_FLAGGED(ch, PRF_HOLYLIGHT)) llev = 3; if ((llev < 0)) strcpy(buf2,"It is pitch black...\r\n"); else if (llev == 5) strcpy(buf2,"It is dazzlingly bright...\r\n"); else { strcpy(buf2, CCCYN(ch, C_CMP)); strcat(buf2, (world[ch->in_room].name ?world[ch->in_room].name :"Null" )); if (PRF_FLAGGED(ch, PRF_ROOMFLAGS)) { sprintbit((long) world[ch->in_room].room_flags, room_bits, buf); sprintf(buf2,"%s (#%d) [ %s]",buf2,world[ch->in_room].number, buf); } strcat(buf2, CCNRM(ch, C_CMP)); strcat(buf2, "\r\n"); } if ( world[ch->in_room].description && !PRF_FLAGGED(ch, PRF_BRIEF)) { process_room_descr(world[ch->in_room].description, buf1, llev); if(!IS_SET(world[ch->in_room].room_flags,NO_AUTOFORMAT)) { if (PRF_FLAGGED(ch, PRF_HOLYLIGHT)) { if (*buf1) *(buf1 + strlen(buf1) -2) = '\0'; strcat(buf1, " The area is magically lit.\r\n"); } else { switch (llev) { case 0: if (*buf1) *(buf1 + strlen(buf1) -2) = '\0'; strcat(buf1, " It's quite dark here.\r\n"); break; case 1: if (*buf1) *(buf1 + strlen(buf1) -2) = '\0'; strcat(buf1, " It's a bit gloomy here.\r\n"); break; case 3: if (*buf1) *(buf1 + strlen(buf1) -2) = '\0'; strcat(buf1, " It's bright here.\r\n"); break; case 4: if (*buf1) *(buf1 + strlen(buf1) -2) = '\0'; strcat(buf1, " It's glaringly bright here.\r\n"); break; default: break; } } if (*buf1) { format_desc(buf1, buf,79); strcat (buf2, buf); } } else strcat (buf2, buf1); } send_to_char(buf2, ch); if (world[ch->in_room].obj) if (GET_ITEM_TYPE(world[ch->in_room].obj) == ITEM_CONTAINER && !IS_SET(world[ch->in_room] .obj->obj_flags.extra_flags, ITEM_DARK) && !IS_SET(world[ch->in_room] .obj->obj_flags.value[1], CONT_ONEWAY) && CAN_SEE_OBJ(ch,world[ch->in_room].obj)){ if (!IS_SET(world[ch->in_room].obj->obj_flags.value[1], CONT_CLOSED)) sprintf(buff,"The %s is open.", first_name(world[ch->in_room].obj->name)); else sprintf(buff,"The %s is closed.", first_name(world[ch->in_room].obj->name)); act(buff,FALSE,ch,0,0,TO_CHAR); } /* this is a hack to add exits at end of room descriptions ajn 15th Dec 1993 */ if (!IS_SET(world[ch->in_room].room_flags, NO_EXITS)){ *buf = '\0'; sprintf(buf1,"%sExits: ",CCGRN(ch, C_NRM)); iexits=0; iexits2=0; for (door = 0; door <=5; door++){ if (EXIT(ch, door)) if (((EXIT(ch, door)->to_room) > 0) && !IS_SET(EXIT(ch, door)->exit_info, EX_CLOSED) && !IS_SET(EXIT(ch, door)->exit_info, EX_DARK)) iexits++;} for (tmp_object = world[ch->in_room].contents ; tmp_object;tmp_object = tmp_object->next_content) if (HASROOM(tmp_object) && !IS_SET(tmp_object->obj_flags.extra_flags,ITEM_DARK) && !IS_SET(tmp_object->obj_flags.value[1],CONT_CLOSED) && CAN_SEE_OBJ(ch,tmp_object )) iexits++; if (world[ch->in_room].obj) if (GET_ITEM_TYPE(world[ch->in_room].obj) == ITEM_CONTAINER && !IS_SET(world[ch->in_room].obj->obj_flags.extra_flags,ITEM_DARK) && !IS_SET(world[ch->in_room] .obj->obj_flags.value[1], CONT_CLOSED) && !IS_SET(world[ch->in_room] .obj->obj_flags.value[1], CONT_ONEWAY) && CAN_SEE_OBJ(ch,world[ch->in_room].obj)) iexits++; for (door = 0; door <= 5; door++) { if (EXIT(ch, door)) if ((EXIT(ch, door)->to_room > 0) && !IS_SET(EXIT(ch, door)->exit_info, EX_CLOSED) && !IS_SET(EXIT(ch, door)->exit_info, EX_DARK)) { strcat(buf, exits[door]); iexits2++; if (*buf) { if ((iexits >=1) && (iexits2 <iexits)) strcat(buf,", "); } } } for (tmp_object = world[ch->in_room].contents ; tmp_object;tmp_object = tmp_object->next_content) if (HASROOM(tmp_object) && !IS_SET(tmp_object->obj_flags.extra_flags,ITEM_DARK) && !IS_SET(tmp_object->obj_flags.value[1],CONT_CLOSED) && CAN_SEE_OBJ(ch,tmp_object)) { strcpy(buff,first_name(tmp_object->name)); buff[0] = UPPER(buff[0]); strcat(buf, buff); iexits2++; if(*buf) { if ((iexits >=1) && (iexits2 < iexits)) strcat(buf,", "); } } if (world[ch->in_room].obj) if (GET_ITEM_TYPE(world[ch->in_room].obj) == ITEM_CONTAINER && !IS_SET(world[ch->in_room].obj->obj_flags.extra_flags,ITEM_DARK) && !IS_SET(world[ch->in_room] .obj->obj_flags.value[1], CONT_CLOSED) && !IS_SET(world[ch->in_room] .obj->obj_flags.value[1], CONT_ONEWAY) && CAN_SEE_OBJ(ch,world[ch->in_room].obj)){ iexits2++; strcat(buf,"Leave"); if ((iexits >=1) && (iexits2 < iexits)) strcat(buf,", "); } if (*buf) strcat(buf,"."); else strcat(buf,"None."); strcat(buf1,buf); sprintf(buf,"%s\r\n",CCNRM(ch,C_NRM)); strcat(buf1,buf); send_to_char(buf1,ch); } /*end of Hack*/ list_obj_to_char(world[ch->in_room].contents, ch, 0, FALSE); list_char_to_char(world[ch->in_room].people, ch, 0); if (!IS_NPC(ch) && ch->specials.hunting) do_track(ch,"",0,0); break; /* look 'out' (from a cart e.g. ...) */ case 10: if (world[ch->in_room].obj) { if (IS_SET(world[ch->in_room].obj->obj_flags.value[1], CONT_CLOSED)){ sprintf(buf,"The %s seems to be closed.", first_name(world[ch->in_room].obj->name)); act(buf,TRUE,ch,0,0,TO_CHAR); return; } else if (IS_DARK(world[ch->in_room].obj->in_room) && !PRF_FLAGGED(ch, PRF_HOLYLIGHT)) send_to_char("Nothing. It is pitch black.\r\n",ch); else{ sprintf(buf1,"Looking out of the %s you see:%s\r\n\r\n%s.", first_name(world[ch->in_room].obj->name), CCCYN(ch, C_CMP), (world[world[ch->in_room].obj->in_room].name ? world[world[ch->in_room].obj->in_room].name: "something")); if (PRF_FLAGGED(ch, PRF_ROOMFLAGS)) { sprintbit((long) world[world[ch->in_room].obj->in_room].room_flags, room_bits, buf); sprintf(buf1, "%s (#%d) [ %s]", buf1, world[world[ch->in_room].obj->in_room].number, buf); } strcat(buf1, CCNRM(ch, C_CMP)); strcat(buf1, "\r\n"); send_to_char(buf1,ch); if (world[world[ch->in_room].obj->in_room].description && !PRF_FLAGGED(ch, PRF_BRIEF)){ strcpy(buf2, world[world[ch->in_room].obj->in_room].description); send_to_char(buf2, ch);} list_obj_to_char(world[world[ch->in_room].obj->in_room].contents,ch,0,FALSE); list_char_to_char(world[world[ch->in_room].obj->in_room].people,ch,0); return; } } do_look(ch,"",0,0); return; /* wrong arg */ case -1 : send_to_char("Sorry, I didn't understand that!\r\n", ch); break; } } } /* end of look */ ACMD(do_read) { /* This is just for now - To be changed later.! */ sprintf(buf1, "at %s", argument); do_look(ch, buf1, 15, 0); } ACMD(do_examine) { char name[100], buf[100]; int bits; struct char_data *tmp_char; struct obj_data *tmp_object; sprintf(buf, "at %s", argument); do_look(ch, buf, 15, 0); one_argument(argument, name); if (!*name) { send_to_char("Examine what?\r\n", ch); return; } bits = generic_find(name, FIND_OBJ_INV | FIND_OBJ_ROOM | FIND_OBJ_EQUIP, ch, &tmp_char, &tmp_object); if (tmp_object) { if ((GET_ITEM_TYPE(tmp_object) == ITEM_DRINKCON) || (GET_ITEM_TYPE(tmp_object) == ITEM_FOUNTAIN) || (GET_ITEM_TYPE(tmp_object) == ITEM_CONTAINER)) { send_to_char("When you look inside, you see:\r\n", ch); sprintf(buf, "in %s", argument); do_look(ch, buf, 15, 0); } } } ACMD(do_scan) { char buf[256],buf1[2048]; struct char_data *list,*i; static char *dirn_info[] = { "A little to the North.", "A little to the East.", "A little to the South.", "A little to the West.", "A little above your head.", "A little below you."}; static char *dirn_info_far[] = { "To the North.", "To the East.", "To the South.", "To the West.", "Above your head.", "Below you."}; int door, rnum, rrnum,rrrnum; act("$n looks about furtively.",FALSE,ch,0,0,TO_ROOM); send_to_char("You check the area.\r\n",ch); if (IS_SET(world[ch->in_room].room_flags,NO_SCAN)) { send_to_char("You can't see anything.\r\n",ch); return;} *buf1 = '\0'; *buf = '\0'; list = world[ch->in_room].people; if (!(IS_DARK(ch->in_room) && !IS_AFFECTED(ch,AFF_INFRARED))) for (i=list;i;i=i->next_in_room) /* this room */ { if (ch != i) { if ((CAN_SEE(ch,i) && (IS_AFFECTED(ch, AFF_SENSE_LIFE) || !IS_AFFECTED(i, AFF_HIDE)))) if (!(IS_NPC(i))) sprintf(buf, "\t%s...%s",i->player.name, "Right here!\r\n"); else sprintf(buf, "\t%s...%s",i->player.short_descr, "Right here!\r\n"); strcat(buf1,buf); *buf = '\0'; } } for (door=0;door<=5; door++) /* other exits */ { if (!EXIT(ch,door)) continue; else if ((EXIT(ch, door)->to_room > 0) && !IS_SET(EXIT(ch, door)->exit_info, EX_CLOSED) && !(IS_DARK(real_room(EXIT(ch,door)->to_room)) && !IS_AFFECTED(ch,AFF_INFRARED))) { rnum = EXIT(ch,door)->to_room; rrnum = real_room(rnum); list = world[rrnum].people; for (i=list;i;i=i->next_in_room) { if (ch != i) { if ((CAN_SEE(ch,i) && (IS_AFFECTED(ch, AFF_SENSE_LIFE) || !IS_AFFECTED(i, AFF_HIDE)) && (number(0,10) > 5))) if (!(IS_NPC(i))) sprintf(buf, "\t%s...%s\r\n",i->player.name, dirn_info[door]); else sprintf(buf, "\t%s...%s\r\n",i->player.short_descr, dirn_info[door]); strcat(buf1,buf); *buf = '\0'; } } if (!(world[rrnum].dir_option[door])) continue; if (((world[rrnum].dir_option[door])->to_room) != NOWHERE && !IS_SET((world[rrnum].dir_option[door])->exit_info, EX_CLOSED) && !(IS_DARK(real_room(world[rrnum].dir_option[door]->to_room)) && !IS_AFFECTED(ch,AFF_INFRARED))) { rrrnum = world[rrnum].dir_option[door]->to_room; rrnum = real_room(rrrnum); list = world[rrnum].people; for (i=list;i;i=i->next_in_room) { if (ch != i) { if ((CAN_SEE(ch,i) && (IS_AFFECTED(ch, AFF_SENSE_LIFE) || !IS_AFFECTED(i, AFF_HIDE)) && (number(0,10) > 7))) if (!(IS_NPC(i))) sprintf(buf, "\t%s...%s\r\n",i->player.name, dirn_info_far[door]); else sprintf(buf, "\t%s...%s\r\n",i->player.short_descr, dirn_info_far[door]); strcat(buf1,buf); *buf = '\0'; } } } } } if (!(*buf1)) send_to_char("hmmm, all clear - nobody about.\r\n",ch); else { send_to_char("You see...\r\n", ch); send_to_char(buf1,ch);} } ACMD(do_exits) { struct obj_data *tmp_object; int door, to_room; char *exits[] = { "North", "East ", "South", "West ", "Up ", "Down " }; *buf = '\0'; if ( IS_AFFECTED(ch, AFF_BLIND) ) send_to_char("You can't see a damned thing, you're blinded!\r\n", ch); else if ( IS_DARK(ch->in_room) && !PRF_FLAGGED(ch, PRF_HOLYLIGHT)) send_to_char("It is pitch black...\r\n", ch); else{ for (door = 0; door <= 5; door++) if (EXIT(ch, door)) if (EXIT(ch, door)->to_room > 0 && !IS_SET(EXIT(ch, door)->exit_info, EX_CLOSED) && !IS_SET(EXIT(ch, door)->exit_info, EX_DARK) && (!IS_SET(world[real_room(EXIT(ch, door)->to_room)].room_flags,UNFINISHED) || GET_LEVEL(ch) > LEVEL_BUILDER)) if (GET_LEVEL(ch) >= LEVEL_BUILDER) sprintf(buf + strlen(buf), "%-5s - [%5d] %s\r\n", exits[door], EXIT(ch, door)->to_room, world[real_room(EXIT(ch, door)->to_room)].name); else if (IS_DARK(real_room(EXIT(ch, door)->to_room)) && !PRF_FLAGGED(ch, PRF_HOLYLIGHT)) sprintf(buf + strlen(buf), "%-5s - Too dark to tell\r\n", exits[door]); else sprintf(buf + strlen(buf), "%-5s - %s\r\n", exits[door], world[real_room(EXIT(ch, door)->to_room)].name); for (tmp_object = world[ch->in_room].contents ; tmp_object;tmp_object = tmp_object->next_content){ to_room = real_room(tmp_object->obj_flags.value[3]); if (HASROOM(tmp_object) && !IS_SET(tmp_object->obj_flags.extra_flags,ITEM_DARK) && !IS_SET(tmp_object->obj_flags.value[1],CONT_CLOSED) && CAN_SEE_OBJ(ch,tmp_object)) { sprintf(buf1, first_name(tmp_object->name)); buf1[0] = UPPER(buf1[0]); if (GET_LEVEL(ch) >= LEVEL_BUILDER) sprintf(buf + strlen(buf),"%-5s - [%5d] %s\r\n", buf1,world[to_room].number, world[to_room].name); else if (IS_DARK(to_room) && !PRF_FLAGGED(ch,PRF_HOLYLIGHT)) sprintf(buf + strlen(buf),"%-5s - Too dark to tell\r\n",buf1); else sprintf(buf + strlen(buf),"%-5s - %s\r\n",buf1, world[to_room].name); } } if (world[ch->in_room].obj && !IS_SET(world[ch->in_room].obj->obj_flags.extra_flags,ITEM_DARK) && CAN_SEE_OBJ(ch,world[ch->in_room].obj) && !IS_SET(world[ch->in_room].obj->obj_flags.value[1],CONT_ONEWAY) && !IS_SET(world[ch->in_room].obj->obj_flags.value[1],CONT_CLOSED)) { sprintf(buf1, "Leave"); if (GET_LEVEL(ch) >= LEVEL_BUILDER) sprintf(buf + strlen(buf),"%-5s - [%5d] %s\r\n", buf1,world[world[ch->in_room].obj->in_room].number, world[world[ch->in_room].obj->in_room].name); else if (IS_DARK(world[ch->in_room].obj->in_room) && !PRF_FLAGGED(ch,PRF_HOLYLIGHT)) sprintf(buf + strlen(buf),"%-5s - Too dark to tell\r\n",buf1); else sprintf(buf + strlen(buf),"%-5s - %s\r\n",buf1, world[world[ch->in_room].obj->in_room].name); } send_to_char("Obvious exits:\r\n", ch); if (*buf) send_to_char(buf, ch); else send_to_char(" None.\r\n", ch);} } char *social_standing(struct char_data *ch) { if (GET_FAME(ch) < -500) return("Outlaw"); else if (GET_FAME(ch) < -300) return("Cutthroat"); else if (GET_FAME(ch) < -200) return("Brigand"); else if (GET_FAME(ch) < -100) return("Thug"); else if (GET_FAME(ch) < 0) return("Bully"); else if (GET_FAME(ch) < 100) return("Peasant"); else if (GET_FAME(ch) < 200) return(((GET_SEX(ch) == 1) ? "Yeoman": "Goodwife")); else if (GET_FAME(ch) < 300) return(((GET_SEX(ch) == 1) ? "Squire": "Mistress")); else if (GET_FAME(ch) < 400) return(((GET_SEX(ch) == 1) ? "Burgher": "Lady")); else if (GET_FAME(ch) < 500) return(((GET_SEX(ch) == 1) ? "Knight": "Dame")); else if (GET_FAME(ch) < 600) return(((GET_SEX(ch) == 1) ? "Baron": "Baroness")); else if (GET_FAME(ch) < 700) return(((GET_SEX(ch) == 1) ? "Viscount": "Viscountess")); else if (GET_FAME(ch) < 850) return(((GET_SEX(ch) == 1) ? "Earl": "Countess")); else if (GET_FAME(ch) < -950) return(((GET_SEX(ch) == 1) ? "Marquess": "Marchioness")); else return(((GET_SEX(ch) == 1) ? "Duke": "Duchess")); } ACMD(do_score) { struct time_info_data playing_time; struct time_info_data real_time_passed(time_t t2, time_t t1); sprintf(buf, "You are %d years old.", GET_AGE(ch)); if ((age(ch).month == 0) && (age(ch).day == 0)) strcat(buf, " It's your birthday today.\r\n"); else strcat(buf, "\r\n"); sprintf(buf, "%sIn your purse you have: %s.\r\n", buf, report_cost(GET_GOLD(ch))); sprintf(buf, "%sIn the bank you have: %s.\r\n", buf, report_cost(GET_BANK_GOLD(ch))); playing_time = real_time_passed((time(0) - ch->player.time.logon) + ch->player.time.played, 0); sprintf(buf, "%sYou have been playing for %d days and %d hours.\r\n", buf, playing_time.day, playing_time.hours); sprintf(buf, "%sYou have %d social points making you a %s.\r\n", buf, GET_FAME(ch), social_standing(ch)); sprintf(buf, "%sYou have %d study/training/learning sessions\r\n", buf, SPELLS_TO_LEARN(ch)); sprinttype(GET_POS(ch), position_types, buf2); sprintf(buf, "%sYou are %s and fighting %s.\r\n",buf, buf2, ((ch->specials.fighting) ? GET_NAME(ch->specials.fighting) : "Nobody")); if (GET_COND(ch, DRUNK) > 10) strcat(buf, "You are intoxicated.\r\n"); if (GET_COND(ch, FULL) == 0) strcat(buf, "You are starving.\r\n"); if (GET_COND(ch, FULL) == -1) strcat(buf, "You are sustained my holy manna.\r\n"); else if (GET_COND(ch, FULL) <= 4 ) strcat(buf, "You are famished.\r\n"); else if (GET_COND(ch, FULL) <= 8 ) strcat(buf, "You are very hungry.\r\n"); else if (GET_COND(ch, FULL) <= 12 ) strcat(buf, "You are hungry.\r\n"); else if (GET_COND(ch, FULL) < 16 ) strcat(buf, "Your stomach is growling.\r\n"); if (GET_COND(ch, THIRST) == 0) strcat(buf, "You are parched.\r\n"); if (GET_COND(ch, THIRST) == -1) strcat(buf, "Your thirst is quenched by sweet nectar.\r\n"); else if (GET_COND(ch, THIRST) <= 4) strcat(buf, "Your throat is dry and your lips cracked.\r\n"); else if (GET_COND(ch, THIRST) <= 8) strcat(buf, "Your throat is very dry.\r\n"); else if (GET_COND(ch, THIRST) <= 12) strcat(buf, "You are thirsty.\r\n"); else if (GET_COND(ch, THIRST) < 16) strcat(buf, "Your feel a little thirsty.\r\n"); if (IS_AFFECTED(ch, AFF_BLIND)) strcat(buf, "You have been blinded!\r\n"); if (IS_AFFECTED(ch, AFF_INVISIBLE)) strcat(buf, "You are invisible.\r\n"); if (IS_AFFECTED(ch, AFF_DETECT_INVISIBLE)) strcat(buf, "You are sensitive to the presence of invisible things.\r\n"); if (IS_AFFECTED(ch, AFF_POISON)) strcat(buf, "You are poisoned!\r\n"); if (IS_AFFECTED(ch, AFF_CHARM)) strcat(buf, "You have been charmed!\r\n"); if (affected_by_spell(ch, SPELL_FORTITUDE_BEAR)) strcat(buf, "You feel protected.\r\n"); if (PRF_FLAGGED(ch, PRF_SUMMONABLE)) strcat(buf, "You are summonable by other players.\r\n"); strcat(buf, "\r\n"); send_to_char(buf, ch); } ACMD(do_time) { char *suf; int weekday, day; extern struct time_info_data time_info; extern const char *weekdays[]; extern const char *month_name[]; 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") ); weekday = ((35 * time_info.month) + time_info.day + 1) % 7;/* 35 days in a month */ 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) { static char *sky_look[4] = { "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); } ACMD(do_help) { extern int top_of_helpt; extern struct help_index_element *help_index; extern FILE *help_fl; extern char *help; int chk, bot, top, mid, minlen; if (!ch->desc) return; for (; isspace(*argument); argument++) ; if (*argument) { if (!help_index) { send_to_char("No help available.\r\n", ch); return; } bot = 0; top = top_of_helpt; for (; ; ) { mid = (bot + top) / 2; minlen = strlen(argument); if (!(chk = strn_cmp(argument, help_index[mid].keyword, minlen))) { /* trace backwards to find first matching entry. Thanks Jeff Fink! */ while ((mid > 0) && (!(chk = strn_cmp(argument, help_index[mid-1].keyword, minlen)))) mid--; fseek(help_fl, help_index[mid].pos, SEEK_SET); *buf2 = '\0'; for (; ; ) { fgets(buf, 80, help_fl); if (*buf == '#') break; strcat(buf2, buf); strcat(buf2, "\r"); } page_string(ch->desc, buf2, 1); return; } else if (bot >= top) { send_to_char("There is no help on that word.\r\n", ch); return; } else if (chk > 0) bot = ++mid; else top = --mid; } return; } send_to_char(help, ch); } #define WHO_FORMAT \ "format: who [-n name] [-d] [-o] [-q] [-r] [-z]\r\n" #define WHO_FORMAT_IMM \ "format: who [minlev[-maxlev]] [-n name] [-d] [-o] [-q] [-r] [-z]\r\n" ACMD(do_who) { char bff2[25]; struct char_data *tch; char name_search[80]; char mode; int maxl,minl,low = 0, high = LEVEL_IMPL, i, localwho = 0, questwho = 0; int short_list = 0, outlaws = 0, num_can_see = 0, deadw = 0; int who_room = 0; /* skip spaces */ for (i = 0; *(argument + i) == ' '; i++) ; strcpy(buf, (argument + i)); name_search[0] = '\0'; while (*buf) { half_chop(buf, arg, buf1); if (isdigit(*arg)) { if (GET_LEVEL(ch) < LEVEL_BUILDER){ send_to_char(WHO_FORMAT, ch); return; } 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 'd': deadw = 1; strcpy(buf, buf1); break; case 'o': case 'k': outlaws = 1; strcpy(buf, buf1); break; case 'z': localwho = 1; strcpy(buf, buf1); break; case 's': if (GET_LEVEL(ch) < LEVEL_BUILDER){ send_to_char(WHO_FORMAT, ch); return; } short_list = 1; strcpy(buf, buf1); break; case 'q': questwho = 1; strcpy(buf, buf1); break; case 'l': if (GET_LEVEL(ch) < LEVEL_BUILDER){ send_to_char(WHO_FORMAT, ch); return; } 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; default: if (GET_LEVEL(ch) < LEVEL_BUILDER) send_to_char(WHO_FORMAT, ch); else send_to_char(WHO_FORMAT_IMM, ch); return; break; } /* end of switch */ } else { /* endif */ send_to_char(WHO_FORMAT, ch); return; } } /* end while (parser) */ minl = LEVEL_BUILDER; maxl = LEVEL_IMPL; while(TRUE){ num_can_see=0; if (minl >= LEVEL_BUILDER) sprintf(buf,"%sImmortals%s\r\n---------\r\n%s",CCBWHT(ch,C_NRM), CCBLU(ch,C_NRM),CCNRM(ch,C_NRM)); else sprintf(buf,"\r\n%sPlayers%s\r\n-------\r\n%s",CCBWHT(ch,C_NRM), CCBLU(ch,C_NRM),CCNRM(ch,C_NRM)); send_to_char(buf,ch); for (tch = character_list; tch; tch = tch->next){ if (IS_NPC(tch)) continue; if (GET_LEVEL(tch) > maxl || GET_LEVEL(tch) < minl) continue; if (*name_search && str_cmp(GET_NAME(tch), name_search) && !strstr(GET_TITLE(ch), 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_THIEF)) continue; if (deadw && tch->desc) continue; if (!deadw && !tch->desc) 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 (short_list) { sprintf(buf, "%s[ %3d %3.3s] %-12.12s%s%s", (GET_LEVEL(tch) >= LEVEL_BUILDER ? CCYEL(ch, C_SPR) : ""), GET_LEVEL(tch), RACE_ABBR(tch), GET_NAME(tch), (GET_LEVEL(tch) >= LEVEL_BUILDER ? CCNRM(ch, C_SPR) : ""), ((!(++num_can_see % 3)) ? "\r\n" : "")); send_to_char(buf, ch); } else { num_can_see++; switch(GET_RACE(tch)){ case 0: sprintf( bff2," ERROR "); break; case 1: sprintf( bff2," Human "); break; case 2: sprintf( bff2," Elf "); break; case 3: sprintf( bff2,"Halfling"); break; case 4: sprintf( bff2," Giant "); break; case 5: sprintf( bff2," Gnome "); break; case 6: sprintf( bff2,"Half-elf"); break; case 7: sprintf( bff2," Ogier "); break; case 8: sprintf( bff2," Dwarf "); break; case 9: sprintf( bff2," Selkie "); break; case 10: sprintf( bff2," Pixie "); break; case 11: sprintf( bff2," Amarya "); break; case 12: sprintf( bff2, "%s", " Troll "); break; } if (GET_LEVEL(tch) >= LEVEL_IMPL) sprintf(buf, "[%s%-15.15s%s] ",CCBCYN(ch, C_SPR)," Implementor ",CCNRM(ch, C_SPR)); else if (GET_LEVEL(tch) >= LEVEL_ASS_IMPL) sprintf(buf, "[%s%-15.15s%s] ",CCBYEL(ch, C_SPR)," Overlord ",CCNRM(ch, C_SPR)); else if (GET_LEVEL(tch) >= LEVEL_GRGOD) sprintf(buf, "[%s%-15.15s%s] ",CCBMAG(ch, C_SPR)," Djinn ",CCNRM(ch, C_SPR)); else if (GET_LEVEL(tch) >= LEVEL_GOD) sprintf(buf, "[%s%-15.15s%s] ",CCBGRN(ch, C_SPR)," Daemon ",CCNRM(ch, C_SPR)); else if (GET_LEVEL(tch) >= LEVEL_MBUILDER) sprintf(buf, "[%s%-15.15s%s] ",CCBGRN(ch, C_SPR)," Bodhisattva ",CCNRM(ch, C_SPR)); else if (GET_LEVEL(tch) >= LEVEL_BUILDER) sprintf(buf, "[%s%-15.15s%s] ",CCBWHT(ch, C_SPR)," Builder ",CCNRM(ch, C_SPR)); else if (GET_LEVEL(tch) >= 200) sprintf(buf, "[%s%-8.8s%s] ",CCBWHT(ch, C_SPR)," Avatar ",CCNRM(ch, C_SPR)); else sprintf(buf, "[%-8.8s] ",bff2); parse_text(tch,ch,0,buf2); sprintf(buf, "%s%s",buf, buf2); if (GET_INVIS_LEV(tch)) sprintf(buf, "%s (i%d)", buf, GET_INVIS_LEV(tch)); else if (IS_AFFECTED(tch, AFF_INVISIBLE)) sprintf(buf, "%s (%sinvis%s)", buf, CCWHT(ch,C_NRM), CCNRM(ch,C_NRM)); if (PLR_FLAGGED(tch, PLR_MAILING)) sprintf(buf, "%s (%smailing%s)", buf, CCGRN(ch,C_NRM), CCNRM(ch,C_NRM)); else if (PLR_FLAGGED(tch, PLR_WRITING)) sprintf(buf, "%s (%swriting%s)", buf, CCGRN(ch,C_NRM), CCNRM(ch,C_NRM)); else if (PLR_FLAGGED(tch, PLR_BUILDING)) sprintf(buf, "%s (%sbuilding%s)", buf, CCYEL(ch,C_NRM), CCNRM(ch,C_NRM)); else if (PLR_FLAGGED(tch, PLR_AFK)) sprintf(buf, "%s (%saway%s)", buf, CCCYN(ch,C_NRM), CCNRM(ch,C_NRM)); if (PRF_FLAGGED(tch, PRF_DEAF)) sprintf(buf, "%s (%sdeaf%s)", buf, CCBBLU(ch,C_NRM), CCNRM(ch,C_NRM)); if (PRF_FLAGGED(tch, PRF_NOTELL)) sprintf(buf, "%s (%snotell%s)", buf, CCBBLU(ch,C_NRM), CCNRM(ch,C_NRM)); if (PRF_FLAGGED(tch, PRF_QUEST)) sprintf(buf, "%s (%squest%s)", buf, CCMAG(ch,C_NRM), CCNRM(ch,C_NRM)); if (PLR_FLAGGED(tch, PLR_THIEF)) sprintf(buf, "%s (%sTHIEF%s)", buf, CCBMAG(ch,C_NRM), CCNRM(ch,C_NRM)); if (PLR_FLAGGED(tch, PLR_KILLER)) sprintf(buf, "%s (%sKILLER%s)", buf, CCBCYN(ch,C_NRM), CCNRM(ch,C_NRM)); if (!tch->desc) sprintf(buf, "%s (%sLD%s)", buf, CCWHT(ch,C_NRM), CCNRM(ch,C_NRM)); if (GET_LEVEL(tch) >= LEVEL_BUILDER) 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 % 2)) send_to_char("\r\n", ch); sprintf(buf, "\r\n%s%d%s characters displayed.%s\r\n",CCBRED(ch,C_NRM), num_can_see,CCBWHT(ch,C_NRM),CCNRM(ch,C_NRM)); send_to_char(buf, ch); if (maxl < LEVEL_BUILDER) break; minl = 0; maxl = LEVEL_BUILDER -1; } } char *make_plural(char *arg) { char tmp_loc[100], tmp2_loc[100]; const char *ptr; char *ptrr; int i; bzero(tmp2_loc,100); bzero(tmp_loc,100); if (!*arg) return(arg); if (strlen(arg) > 90) return(arg); for (ptr = arg; *ptr == ' '; ptr++) ; for (ptrr= tmp2_loc; *ptr != ' ' && *ptr != '\0';ptr++, ptrr++) *ptrr = LOWER(*ptr); /* first exceptions */ *(ptrr++) = '\0'; for(i=0;strcmp(nonreg_plurals[i].singular,"\n");i++) { if (!strcmp(nonreg_plurals[i].plural,tmp2_loc)) /*already plural*/ return(nonreg_plurals[i].plural); else if (!strcmp(nonreg_plurals[i].singular,tmp2_loc)) return(nonreg_plurals[i].plural); } for(ptr = arg, ptrr= tmp_loc;*ptr != ' ' && *ptr != '\0'; ptr++, ptrr++) *ptrr = *ptr; ptr--; if (*ptr == 'y') { ptrr--; *ptrr = 'i'; *(ptrr +1) = 'e'; *(ptrr +2) = 's'; *(ptrr +3) = '\0'; } else { *ptrr = 's'; *(ptrr +1) = '\0'; } strcpy(buf1,tmp_loc); return(buf1); } char *first_name(char *arg) { char buf3[256]; if (strlen(arg) > 256) *(arg + 255) = '\0'; half_chop(arg, buf3, buf2); strcpy(buf2,buf3); return (buf2); } void process_room_descr(char *in, char *out, byte llev) { const char *string, *i; char *p; bool include = TRUE; if (llev == 0) include = FALSE; bzero(buf1,MAX_STRING_LENGTH); if ((llev == -1) || (llev == 5)) { strcpy(out,buf1); return; } p = buf1; string = in; while ( *string != '\0') { if (*string != '%') { if (include) *p++ = *string++; else string++; continue; } ++string; if ((*string == '0')) { string++; while (*string != '%' && *string != '\0') { if (llev >=0) *p++ = *string++; else string++; continue; } } else if ((*string == '1')) { string++; while (*string != '%' && *string != '0' ) { if (llev > 0) *p++ = *string++; else string++; continue; } } else if ((*string == '2')) { string++; while (*string != '%' && *string != '\0') { if (llev > 1) *p++ = *string++; else string++; continue; } } else if ((*string == '3')) { string++; while (*string != '%' && *string != '\0') { if (llev > 2) *p++ = *string++; else string++; continue; } } else if ((*string == '4')) { string++; while (*string != '%' && *string != '\0') { if (llev > 3) *p++ = *string++; else string++; continue; } } else if ((*string == '%')) *p++ = *string++; } return; }