/* * Usage : Informative commands. * * Copyright (C) 1990, 1991 - see 'license.doc' for complete information. * ************************************************************************* */ #include <stdio.h> #include <string.h> #include <ctype.h> #include <time.h> #include "protos.h" /* extern variables */ #if HASH extern struct hash_header room_db; #else extern struct room_data *room_db; #endif extern struct descriptor_data *descriptor_list; extern struct char_data *character_list; extern struct obj_data *object_list; extern int top_of_world; extern int top_of_zone_table; extern int top_of_mobt; extern int top_of_objt; extern int top_of_p_table; extern char *exits[]; extern char credits[MAX_STRING_LENGTH]; extern char news[MAX_STRING_LENGTH]; extern char info[MAX_STRING_LENGTH]; extern char wizlist[MAX_STRING_LENGTH]; extern char *dirs[]; extern char *where[]; extern char *color_liquid[]; extern char *fullness[]; extern char *RaceName[]; extern int RacialMax[][MAX_CLASS]; extern char *spell_desc[]; extern char *spells[]; extern struct spell_info_type spell_info[MAX_SPL_LIST]; extern char *system_flag_types[]; extern char *exits[]; extern char *listexits[]; extern struct index_data *mob_index; extern char *item_types[]; extern char *extra_bits[]; extern char *apply_types[]; extern char *affected_bits[]; extern char *affected_bits2[]; extern char *immunity_names[]; extern long Uptime; extern long room_count; extern long mob_count; extern long obj_count; extern long SystemFlags; extern char *spells[]; extern int spell_status[]; extern const struct title_type titles[MAX_CLASS][ABS_MAX_LVL]; extern const char *connected_types[]; extern struct radix_list radix_head[]; extern int top_of_wizhelpt; extern struct help_index_element *wizhelp_index; extern FILE *wizhelp_fl; extern struct radix_list radix_head[]; extern int top_of_helpt; extern struct help_index_element *help_index; extern FILE *help_fl; extern char help[MAX_STRING_LENGTH]; extern struct weather_data weather_info; extern struct time_info_data time_info; extern const char *weekdays[]; extern const char *month_name[]; extern const struct title_type titles[MAX_CLASS][ABS_MAX_LVL]; extern char *RaceNames[]; /* extern functions */ struct time_info_data age(struct char_data *ch); void page_string(struct descriptor_data *d, char *str, int keep_internal); int track( struct char_data *ch, struct char_data *vict); int GetApprox(int num, int perc); int SpyCheck(struct char_data *ch); int remove_trap( struct char_data *ch, struct obj_data *trap); void do_actual_wiz_help(struct char_data *ch, char *argument, int cmd); struct obj_data *get_obj_in_list_vis(struct char_data *ch, char *name, struct obj_data *list); /* intern functions */ void list_obj_to_char(struct obj_data *list,struct char_data *ch, int mode, bool show); char *DescDamage(float dam); char *DescRatio(float f); /* theirs / yours */ char *DamRollDesc(int a); char *HitRollDesc(int a); char *ArmorDesc(int a); char *AlignDesc(int a); char *DescAttacks(float a); int singular( struct obj_data *o) { if (IS_SET(o->obj_flags.wear_flags, ITEM_WEAR_HANDS) || IS_SET(o->obj_flags.wear_flags, ITEM_WEAR_FEET) || IS_SET(o->obj_flags.wear_flags, ITEM_WEAR_LEGS) || IS_SET(o->obj_flags.wear_flags, ITEM_WEAR_ARMS)) return(FALSE); return(TRUE); } /* Procedures related to 'look' */ void argument_split_2(char *argument, char *first_arg, char *second_arg) { int look_at, begin; begin = 0; /* 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; } struct obj_data *get_object_in_equip_vis(struct char_data *ch, char *arg, struct obj_data *equipment[], int *j) { for ((*j) = 0; (*j) < MAX_WEAR ; (*j)++) if (equipment[(*j)]) if (CAN_SEE_OBJ(ch,equipment[(*j)])) if (isname(arg, equipment[(*j)]->name)) return(equipment[(*j)]); return (0); } char *find_ex_description(char *word, struct extra_descr_data *list) { struct extra_descr_data *i; for (i = list; i; i = i->next) if (*word && i->keyword) if (isname(word,i->keyword)) return(i->description); return(0); } void show_obj_to_char(struct obj_data *object, struct char_data *ch, int mode) { char buffer[MAX_STRING_LENGTH]; buffer[0] = 0; if ((mode == 0) && object->description) strcpy(buffer, object->description); else if (object->short_description && ((mode == 1) || (mode == 2) || (mode==3) || (mode == 4))) strcpy(buffer,object->short_description); else if (mode == 5) { if (object->obj_flags.type_flag == ITEM_NOTE) { if (object->action_description) { strcpy(buffer, "There is something written upon it:\n\r\n\r"); strcat(buffer, object->action_description); page_string(ch->desc, buffer, 1); } else { act("It's blank.", FALSE, ch,0,0,TO_CHAR); } return; /* mail fix, thanks brett */ } else if((object->obj_flags.type_flag != ITEM_DRINKCON)) { strcpy(buffer,"You see nothing special.."); } else { /* ITEM_TYPE == ITEM_DRINKCON */ strcpy(buffer, "It looks like a drink container."); } } if (mode != 3) { if (IS_OBJ_STAT(object,ITEM_INVISIBLE)) { strcat(buffer,"(invisible)"); } if (IS_OBJ_STAT(object,ITEM_ANTI_GOOD) && IS_AFFECTED(ch,AFF_DETECT_EVIL)) { if (singular(object)) strcat(buffer,"..It glows red"); else strcat(buffer,"..They glow red"); } if (IS_OBJ_STAT(object,ITEM_MAGIC) && IS_AFFECTED(ch,AFF_DETECT_MAGIC)) { if (singular(object)) strcat(buffer,"..It glows blue"); else strcat(buffer,"..They glow blue"); } if (IS_OBJ_STAT(object,ITEM_GLOW)) { if (singular(object)) strcat(buffer,"..It glows softly"); else strcat(buffer,"..They glow softly"); } if (IS_OBJ_STAT(object,ITEM_HUM)) { if (singular(object)) strcat(buffer,"..It hums powerfully"); else strcat(buffer,"..They hum with power"); } if (object->obj_flags.type_flag == ITEM_ARMOR) { if (object->obj_flags.value[0] < (object->obj_flags.value[1] / 4)) { if (singular(object)) strcat(buffer, "..It is falling apart"); else strcat(buffer,"..They are falling apart"); } else if (object->obj_flags.value[0] < (object->obj_flags.value[1] / 3)) { if (singular(object)) strcat(buffer, "..It is need of much repair."); else strcat(buffer,"..They are in need of much repair"); } else if (object->obj_flags.value[0] < (object->obj_flags.value[1] / 2)) { if (singular(object)) strcat(buffer, "..It is in fair condition"); else strcat(buffer,"..They are in fair condition"); } else if (object->obj_flags.value[0] < object->obj_flags.value[1]) { if (singular(object)) strcat(buffer, "..It is in good condition"); else strcat(buffer,"..They are in good condition"); } else { if (singular(object)) strcat(buffer, "..It is in excellent condition"); else strcat(buffer,"..They are in excellent condition"); } } } strcat(buffer, "\n\r"); page_string(ch->desc, buffer, 1); } void show_mult_obj_to_char(struct obj_data *object, struct char_data *ch, int mode, int num) { char buffer[MAX_STRING_LENGTH]; char tmp[10]; buffer[0] = 0; tmp[0] = 0; if ((mode == 0) && object->description) strcpy(buffer,object->description); else if (object->short_description && ((mode == 1) || (mode == 2) || (mode==3) || (mode == 4))) strcpy(buffer,object->short_description); else if (mode == 5) { if (object->obj_flags.type_flag == ITEM_NOTE) { if (object->action_description) { strcpy(buffer, "There is something written upon it:\n\r\n\r"); strcat(buffer, object->action_description); page_string(ch->desc, buffer, 1); } else act("It's blank.", FALSE, ch,0,0,TO_CHAR); return; } else if((object->obj_flags.type_flag != ITEM_DRINKCON)) { strcpy(buffer,"You see nothing special.."); } else { /* ITEM_TYPE == ITEM_DRINKCON */ strcpy(buffer, "It looks like a drink container."); } } if (mode != 3) { if (IS_OBJ_STAT(object,ITEM_INVISIBLE)) { strcat(buffer,"(invisible)"); } if (IS_OBJ_STAT(object,ITEM_ANTI_GOOD) && IS_AFFECTED(ch,AFF_DETECT_EVIL)) { strcat(buffer,"..It glows red!"); } if (IS_OBJ_STAT(object,ITEM_MAGIC) && IS_AFFECTED(ch,AFF_DETECT_MAGIC)) { strcat(buffer,"..It glows blue!"); } if (IS_OBJ_STAT(object,ITEM_GLOW)) { strcat(buffer,"..It has a soft glowing aura!"); } if (IS_OBJ_STAT(object,ITEM_HUM)) { strcat(buffer,"..It emits a faint humming sound!"); } } if (num>1) { sprintf(tmp,"[%d]", num); strcat(buffer, tmp); } strcat(buffer, "\n\r"); page_string(ch->desc, buffer, 1); } void list_obj_in_room(struct obj_data *list, struct char_data *ch) { struct obj_data *i, *cond_ptr[50]; int Inventory_Num = 1; int k, cond_top, cond_tot[50], found=FALSE; char buf[MAX_STRING_LENGTH]; cond_top = 0; for (i=list; i; i = i->next_content) { if (CAN_SEE_OBJ(ch, i)) { if (cond_top< 50) { found = FALSE; for (k=0;(k<cond_top&& !found);k++) { if (cond_top>0) { if ((i->item_number == cond_ptr[k]->item_number) && (i->description && cond_ptr[k]->description && !strcmp(i->description,cond_ptr[k]->description))){ cond_tot[k] += 1; found=TRUE; } } } if (!found) { cond_ptr[cond_top] = i; cond_tot[cond_top] = 1; cond_top+=1; } } else { if ((ITEM_TYPE(i) == ITEM_TRAP) || (GET_TRAP_CHARGES(i) > 0)) { if (CAN_SEE_OBJ(ch,i)) { show_obj_to_char(i,ch,0); } } /* not a trap */ else { show_obj_to_char(i,ch,0); } } } } if (cond_top) { for (k=0; k<cond_top; k++) { if ((ITEM_TYPE(cond_ptr[k]) == ITEM_TRAP) && (GET_TRAP_CHARGES(cond_ptr[k]) > 0)) { if (CAN_SEE_OBJ(ch,cond_ptr[k])) if (cond_tot[k] > 1) { sprintf(buf,"[%2d] ",Inventory_Num++); send_to_char(buf,ch); show_mult_obj_to_char(cond_ptr[k],ch,0,cond_tot[k]); } else { show_obj_to_char(cond_ptr[k],ch,0); } } else { if (cond_tot[k] > 1) { sprintf(buf,"[%2d] ",Inventory_Num++); send_to_char(buf,ch); show_mult_obj_to_char(cond_ptr[k],ch,0,cond_tot[k]); } else { show_obj_to_char(cond_ptr[k],ch,0); } } } } } void list_obj_in_heap(struct obj_data *list, struct char_data *ch) { struct obj_data *i, *cond_ptr[50]; int k, cond_top, cond_tot[50], found=FALSE; char buf[MAX_STRING_LENGTH]; int Num_Inventory = 1; cond_top = 0; for (i=list; i; i = i->next_content) { if (CAN_SEE_OBJ(ch, i)) { if (cond_top< 50) { found = FALSE; for (k=0;(k<cond_top&& !found);k++) { if (cond_top>0) { if ((i->item_number == cond_ptr[k]->item_number) && (i->short_description && cond_ptr[k]->short_description && (!strcmp(i->short_description,cond_ptr[k]->short_description)))) { cond_tot[k] += 1; found=TRUE; } } } if (!found) { cond_ptr[cond_top] = i; cond_tot[cond_top] = 1; cond_top+=1; } } else { show_obj_to_char(i,ch,2); } } /* else can't see */ } if (cond_top) { for (k=0; k<cond_top; k++) { sprintf(buf,"[%2d] ",Num_Inventory++); send_to_char(buf,ch); if (cond_tot[k] > 1) { Num_Inventory += cond_tot[k] - 1; show_mult_obj_to_char(cond_ptr[k],ch,2,cond_tot[k]); } else { show_obj_to_char(cond_ptr[k],ch,2); } } } } void list_obj_to_char(struct obj_data *list,struct char_data *ch, int mode, bool show) { char buf[MAX_STRING_LENGTH]; int Num_In_Bag = 1; struct obj_data *i; bool found; found = FALSE; for ( i = list ; i ; i = i->next_content ) { if (CAN_SEE_OBJ(ch,i)) { sprintf(buf,"[%2d] ",Num_In_Bag++); send_to_char(buf,ch); show_obj_to_char(i, ch, mode); found = TRUE; } } if ((! found) && (show)) send_to_char("Nothing\n\r", ch); } void show_char_to_char(struct char_data *i, struct char_data *ch, int mode) { char buffer[MAX_STRING_LENGTH]; int j, found, percent, otype; struct obj_data *tmp_obj; struct affected_type *aff; if (!ch || !i) { log_string("!ch || !i in act.info.c show_char_to_char"); return; } if (mode == 0) { if (IS_AFFECTED(i, AFF_HIDE) || !CAN_SEE(ch,i)) { if (IS_AFFECTED(ch, AFF_SENSE_LIFE) && !IS_IMMORTAL(i)) { send_to_char("You sense a hidden life form in the room.\n\r", ch); return; } else { /* no see nothing */ return; } } if (!(i->player.long_descr)||(GET_POS(i) != i->specials.default_pos)){ /* A player char or a mobile without long descr, or not in default pos.*/ if (!IS_NPC(i)) { strcpy(buffer,GET_NAME(i)); strcat(buffer," "); if (GET_TITLE(i)) strcat(buffer,GET_TITLE(i)); } else { strcpy(buffer, i->player.short_descr); CAP(buffer); } if ( IS_AFFECTED(i,AFF_INVISIBLE) || i->invis_level == LOW_IMMORTAL) strcat(buffer," (invisible)"); if ( IS_AFFECTED(i,AFF_CHARM)) strcat(buffer," (pet)"); switch(GET_POS(i)) { case POSITION_STUNNED : strcat(buffer," is lying here, stunned."); break; case POSITION_INCAP : strcat(buffer," is lying here, incapacitated."); break; case POSITION_MORTALLYW: strcat(buffer," is lying here, mortally wounded."); break; case POSITION_DEAD : strcat(buffer," is lying here, dead."); break; case POSITION_MOUNTED: if (MOUNTED(i)) { strcat(buffer, " is here, riding "); strcat(buffer, MOUNTED(i)->player.short_descr); } else { strcat(buffer, " is standing here."); } break; case POSITION_STANDING : if (!IS_AFFECTED(i, AFF_FLYING) && !affected_by_spell(i,SKILL_LEVITATION)) { if (real_roomp(i->in_room)->sector_type == SECT_WATER_NOSWIM) strcat(buffer, "is floating here."); else strcat(buffer," is standing here."); } else { strcat(buffer," is flying about."); } break; case POSITION_SITTING : if (real_roomp(i->in_room)->sector_type == SECT_WATER_NOSWIM) strcat(buffer, "is floating here."); else strcat(buffer," is sitting here."); break; case POSITION_RESTING : if (real_roomp(i->in_room)->sector_type == SECT_WATER_NOSWIM) strcat(buffer, "is resting here in the water."); else strcat(buffer," is resting here."); break; case POSITION_SLEEPING : if (real_roomp(i->in_room)->sector_type == SECT_WATER_NOSWIM) strcat(buffer, "is sleeping here in the water."); else strcat(buffer," is sleeping here."); break; case POSITION_FIGHTING : if (i->specials.fighting) { strcat(buffer," is here, fighting "); if (i->specials.fighting == ch) strcat(buffer," YOU!"); else { if (i->in_room == i->specials.fighting->in_room) if (IS_NPC(i->specials.fighting)) strcat(buffer, i->specials.fighting->player.short_descr); else strcat(buffer, GET_NAME(i->specials.fighting)); else strcat(buffer, "someone who has already left."); } } else /* NIL fighting pointer */ strcat(buffer," is here struggling with thin air."); break; default : strcat(buffer," is floating here."); break; } if (IS_AFFECTED2(i,AFF2_AFK)) strcat(buffer,"$c0006 (AFK)$c0007"); if (IS_LINKDEAD(i)) strcat(buffer,"$c0015 (Linkdead)$c0007"); if (IS_AFFECTED(ch, AFF_DETECT_EVIL)) { if (IS_EVIL(i)) strcat(buffer, "$c0009 (Red Aura)"); } act(buffer,FALSE, ch,0,0,TO_CHAR); } else { /* npc with long */ if (IS_AFFECTED(i,AFF_INVISIBLE)) strcpy(buffer,"*"); else *buffer = '\0'; if (IS_AFFECTED(ch, AFF_DETECT_EVIL)) { if (IS_EVIL(i)) strcat(buffer, "$c0009 (Red Aura)"); } if (IS_AFFECTED2(i,AFF2_AFK)) strcat(buffer,"$c0006 (AFK)$c0007"); if (IS_LINKDEAD(i)) strcat(buffer,"$c0015 (Linkdead)$c0007"); strcat(buffer, i->player.long_descr); /* strip \n\r's off */ while ((buffer[strlen(buffer)-1]=='\r') || (buffer[strlen(buffer)-1]=='\n') || (buffer[strlen(buffer)-1]==' ')) { buffer[strlen(buffer)-1] = '\0'; } act(buffer,FALSE, ch,0,0,TO_CHAR); } if (IS_AFFECTED(i,AFF_SANCTUARY)) { if (!affected_by_spell(i,SPELL_GLOBE_DARKNESS)) act("$c0015$n glows with a bright light!", FALSE, i, 0, ch, TO_VICT); } if (IS_AFFECTED(i,AFF_GROWTH)) act("$c0003$n is extremely large!", FALSE, i, 0, ch, TO_VICT); if (IS_AFFECTED(i, AFF_FIRESHIELD)) { if (!affected_by_spell(i,SPELL_GLOBE_DARKNESS)) act("$c0001$n is surrounded by burning flames!", FALSE, i, 0, ch, TO_VICT); } if (affected_by_spell(i,SPELL_GLOBE_DARKNESS)) act("$c0008$n is surround by darkness!", 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); } /* personal descriptions. */ if (IS_PC(i)) { sprintf(buffer, "$n is %s", RaceName[GET_RACE(i)]); act(buffer, FALSE, i, 0, ch, TO_VICT); } if (MOUNTED(i)) { sprintf(buffer,"$n is mounted on %s", MOUNTED(i)->player.short_descr); act(buffer, FALSE, i, 0, ch, TO_VICT); } if (RIDDEN(i)) { sprintf(buffer,"$n is ridden by %s", IS_NPC(RIDDEN(i))?RIDDEN(i)->player.short_descr:GET_NAME(RIDDEN(i))); act(buffer, FALSE, i, 0, ch, TO_VICT); } /* Show a character to another */ 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 (IS_NPC(i)) strcpy(buffer, i->player.short_descr); else strcpy(buffer, GET_NAME(i)); if (percent >= 100) strcat(buffer, " is in an excellent condition."); else if (percent >= 90) strcat(buffer, " has a few scratches."); else if (percent >= 75) strcat(buffer, " has some small wounds and many bruises."); else if (percent >= 50) strcat(buffer, " is wounded, and bleeding."); else if (percent >= 30) strcat(buffer, " has some big nasty wounds and scratches."); else if (percent >= 15) strcat(buffer, " is badly wounded"); else if (percent >= 0) strcat(buffer, " $c0001is in an awful condition."); else strcat(buffer, " $c0009is bleeding badly from large, gaping wounds."); act(buffer,FALSE, ch,0,0,TO_CHAR); /* spell_descriptions, etc. */ for (aff = i->affected; aff; aff = aff->next) { if (aff->type < MAX_EXIST_SPELL) { otype = -1; if (spell_desc[aff->type] && *spell_desc[aff->type]) if (aff->type != otype) { act(spell_desc[aff->type], FALSE, i, 0, ch, TO_VICT); otype = aff->type; } } } found = FALSE; for (j=0; j< MAX_WEAR; j++) { if (i->equipment[j]) { if (CAN_SEE_OBJ(ch,i->equipment[j])) { found = TRUE; } } } if (found) { act("\n\r$n is using:", FALSE, i, 0, ch, TO_VICT); for (j=0; j< MAX_WEAR; j++) { if (i->equipment[j]) { if (CAN_SEE_OBJ(ch,i->equipment[j])) { send_to_char(where[j],ch); show_obj_to_char(i->equipment[j],ch,1); } } } } if (HasClass(ch, CLASS_THIEF) && (ch != i) && (!IS_IMMORTAL(ch))){ found = FALSE; send_to_char ("\n\rYou attempt to peek at the inventory:\n\r", ch); for(tmp_obj = i->carrying; tmp_obj; tmp_obj = tmp_obj->next_content) { if (CAN_SEE_OBJ(ch, tmp_obj) && (number(0,MAX_MORT) < GetMaxLevel(ch))) { show_obj_to_char(tmp_obj, ch, 1); found = TRUE; } } if (!found) send_to_char("You can't see anything.\n\r", ch); } else if (IS_IMMORTAL(ch)) { send_to_char("Inventory:\n\r",ch); for(tmp_obj = i->carrying; tmp_obj; tmp_obj = tmp_obj->next_content) { show_obj_to_char(tmp_obj, ch, 1); found = TRUE; } if (!found) { send_to_char("Nothing\n\r",ch); } } } else if (mode == 2) { /* Lists inventory */ act("$n is carrying:", FALSE, i, 0, ch, TO_VICT); list_obj_in_heap(i->carrying,ch); } } void show_mult_char_to_char(struct char_data *i, struct char_data *ch, int mode, int num) { char buffer[MAX_STRING_LENGTH]; char tmp[10]; int j, found, percent; struct obj_data *tmp_obj; if (mode == 0) { if (IS_AFFECTED(i, AFF_HIDE) || !CAN_SEE(ch,i)) { if (IS_AFFECTED(ch, AFF_SENSE_LIFE) && !IS_IMMORTAL(i)) { if (num==1) act("$c0002You sense a hidden life form in the room.",FALSE, ch,0,0,TO_CHAR); else act("$c0002You sense a hidden life form in the room.",FALSE, ch,0,0,TO_CHAR); return; } else { /* no see nothing */ return; } } if (!(i->player.long_descr)||(GET_POS(i) != i->specials.default_pos)){ /* A player char or a mobile without long descr, or not in default pos. */ if (!IS_NPC(i)) { strcpy(buffer,GET_NAME(i)); strcat(buffer," "); if (GET_TITLE(i)) strcat(buffer,GET_TITLE(i)); } else { strcpy(buffer, i->player.short_descr); CAP(buffer); } if ( IS_AFFECTED(i,AFF_INVISIBLE)) strcat(buffer,"$c0011 (invisible)"); if ( IS_AFFECTED(i,AFF_CHARM)) strcat(buffer,"$c0010 (pet)"); switch(GET_POS(i)) { case POSITION_STUNNED : strcat(buffer,"$c0005 is lying here, stunned."); break; case POSITION_INCAP : strcat(buffer,"$c0006 is lying here, incapacitated."); break; case POSITION_MORTALLYW: strcat(buffer,"$c0009 is lying here, mortally wounded."); break; case POSITION_DEAD : strcat(buffer," is lying here, dead."); break; case POSITION_STANDING : if (!IS_AFFECTED(i, AFF_FLYING) && !affected_by_spell(i,SKILL_LEVITATION)) { if (real_roomp(i->in_room)->sector_type == SECT_WATER_NOSWIM) strcat(buffer, "is floating here."); else strcat(buffer," is standing here."); } else { strcat(buffer," is flying about."); } break; case POSITION_SITTING : if (real_roomp(i->in_room)->sector_type == SECT_WATER_NOSWIM) strcat(buffer, "is floating here."); else strcat(buffer," is sitting here."); break; case POSITION_RESTING : if (real_roomp(i->in_room)->sector_type == SECT_WATER_NOSWIM) strcat(buffer, "is resting here in the water"); else strcat(buffer," is resting here."); break; case POSITION_SLEEPING : if (real_roomp(i->in_room)->sector_type == SECT_WATER_NOSWIM) strcat(buffer, "is sleeping here in the water"); else strcat(buffer," is sleeping here."); break; case POSITION_FIGHTING : if (i->specials.fighting) { strcat(buffer," is here, fighting "); if (i->specials.fighting == ch) strcat(buffer," YOU!"); else { if (i->in_room == i->specials.fighting->in_room) if (IS_NPC(i->specials.fighting)) strcat(buffer, i->specials.fighting->player.short_descr); else strcat(buffer, GET_NAME(i->specials.fighting)); else strcat(buffer, "someone who has already left."); } } else /* NIL fighting pointer */ strcat(buffer," is here struggling with thin air."); break; default : strcat(buffer,"$c0006 is floating here."); break; } if (IS_AFFECTED(ch, AFF_DETECT_EVIL)) { if (IS_EVIL(i)) strcat(buffer, "$c0009 (Red Aura)"); } if (IS_AFFECTED2(i,AFF2_AFK)) strcat(buffer,"$c0006 (AFK)$c0007"); if (IS_LINKDEAD(i)) strcat(buffer,"$c0015 (Linkdead)$c0007"); if (num > 1) { sprintf(tmp," [%d]", num); strcat(buffer, tmp); } act(buffer,FALSE, ch,0,0,TO_CHAR); } else { /* npc with long */ if (IS_AFFECTED(i,AFF_INVISIBLE)) strcpy(buffer,"*"); else *buffer = '\0'; if (IS_AFFECTED(ch, AFF_DETECT_EVIL)) { if (IS_EVIL(i)) strcat(buffer, "$c0009 (Red Aura)"); } if (IS_AFFECTED2(i,AFF2_AFK)) strcat(buffer,"$c0006 (AFK)$c0007"); if (IS_LINKDEAD(i)) strcat(buffer,"$c0015 (Linkdead)$c0007"); strcat(buffer, i->player.long_descr); /* this gets a little annoying */ if (num > 1) { while ((buffer[strlen(buffer)-1]=='\r') || (buffer[strlen(buffer)-1]=='\n') || (buffer[strlen(buffer)-1]==' ')) { buffer[strlen(buffer)-1] = '\0'; } sprintf(tmp," [%d]", num); strcat(buffer, tmp); } act(buffer,FALSE, ch,0,0,TO_CHAR); } if (IS_AFFECTED(i,AFF_SANCTUARY)) { if (!affected_by_spell(i,SPELL_GLOBE_DARKNESS)) act("$c0015$n glows with a bright light!", FALSE, i, 0, ch, TO_VICT); } if (IS_AFFECTED(i,AFF_GROWTH)) act("$c0003$n is extremely large!", FALSE, i, 0, ch, TO_VICT); if (IS_AFFECTED(i, AFF_FIRESHIELD)) { if (!affected_by_spell(i,SPELL_GLOBE_DARKNESS)) act("$c0001$n is surrounded by burning flames!", FALSE, i, 0, ch, TO_VICT); } if (affected_by_spell(i,SPELL_GLOBE_DARKNESS)) act("$c0008$n is surround by darkness!", 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 */ 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 (IS_NPC(i)) strcpy(buffer, i->player.short_descr); else strcpy(buffer, GET_NAME(i)); if (percent >= 100) strcat(buffer, " is in an excellent condition.\n\r"); else if (percent >= 90) strcat(buffer, " has a few scratches.\n\r"); else if (percent >= 75) strcat(buffer, " has some small wounds and bruises.\n\r"); else if (percent >= 50) strcat(buffer, " has quite a few wounds.\n\r"); else if (percent >= 30) strcat(buffer, " has some big nasty wounds and scratches.\n\r"); else if (percent >= 15) strcat(buffer, " looks pretty hurt.\n\r"); else if (percent >= 0) strcat(buffer, " $c0001is in an awful condition.\n\r"); else strcat(buffer, " $c0009is bleeding awfully from big wounds.\n\r"); act(buffer,FALSE, ch,0,0,TO_CHAR); found = FALSE; for (j=0; j< MAX_WEAR; j++) { if (i->equipment[j]) { if (CAN_SEE_OBJ(ch,i->equipment[j])) { found = TRUE; } } } if (found) { act("\n\r$n is using:", FALSE, i, 0, ch, TO_VICT); for (j=0; j< MAX_WEAR; j++) { if (i->equipment[j]) { if (CAN_SEE_OBJ(ch,i->equipment[j])) { send_to_char(where[j],ch); show_obj_to_char(i->equipment[j],ch,1); } } } } if ((HasClass(ch, CLASS_THIEF)) && (ch != i)) { found = FALSE; send_to_char("\n\rYou attempt to peek at the inventory:\n\r", ch); for(tmp_obj = i->carrying; tmp_obj; tmp_obj = tmp_obj->next_content) { if (CAN_SEE_OBJ(ch,tmp_obj)&&(number(0,MAX_MORT) < GetMaxLevel(ch))) { show_obj_to_char(tmp_obj, ch, 1); found = TRUE; } } if (!found) send_to_char("You can't see anything.\n\r", ch); } } else if (mode == 2) { /* Lists inventory */ act("$n is carrying:", FALSE, i, 0, ch, TO_VICT); list_obj_in_heap(i->carrying,ch); } } void list_char_in_room(struct char_data *list, struct char_data *ch) { struct char_data *i, *cond_ptr[50]; int k, cond_top, cond_tot[50], found=FALSE; cond_top = 0; for (i=list; i; i = i->next_in_room) { if ( (ch!=i) && (!RIDDEN(i)) && (IS_AFFECTED(ch, AFF_SENSE_LIFE) || (CAN_SEE(ch,i) && !IS_AFFECTED(i, AFF_HIDE))) ) { if ((cond_top< 50) && !MOUNTED(i)) { found = FALSE; if (IS_NPC(i)) { for (k=0;(k<cond_top&& !found);k++) { if (cond_top>0) { if (i->nr == cond_ptr[k]->nr && (GET_POS(i) == GET_POS(cond_ptr[k])) && (i->specials.affected_by==cond_ptr[k]->specials.affected_by) && (i->specials.fighting == cond_ptr[k]->specials.fighting) && (i->player.short_descr && cond_ptr[k]->player.short_descr && 0==strcmp(i->player.short_descr,cond_ptr[k]->player.short_descr))) { cond_tot[k] += 1; found=TRUE; } } } } if (!found) { cond_ptr[cond_top] = i; cond_tot[cond_top] = 1; cond_top+=1; } } else { show_char_to_char(i,ch,0); } } } if (cond_top) { for (k=0; k<cond_top; k++) { if (cond_tot[k] > 1) { show_mult_char_to_char(cond_ptr[k],ch,0,cond_tot[k]); } else { show_char_to_char(cond_ptr[k],ch,0); } } } } void list_char_to_char(struct char_data *list, struct char_data *ch, int mode) { struct char_data *i; for (i = list; i ; i = i->next_in_room) { if ( (ch!=i) && (IS_AFFECTED(ch, AFF_SENSE_LIFE) || (CAN_SEE(ch,i) && !IS_AFFECTED(i, AFF_HIDE))) ) show_char_to_char(i,ch,0); } } /* Added by Mike Wilson 9/23/93 */ void list_exits_in_room(struct char_data *ch) { int door,seeit=FALSE; char buf[MAX_STRING_LENGTH],buf2[MAX_STRING_LENGTH]; struct room_direction_data *exitdata; *buf = '\0'; for (door = 0; door <= 5; door++) { exitdata = EXIT(ch,door); if (exitdata) { if (real_roomp(exitdata->to_room)) { if (GET_RACE(ch)==RACE_ELVEN || GET_RACE(ch) == RACE_GOLD_ELF || GET_RACE(ch) == RACE_WILD_ELF || GET_RACE(ch) == RACE_SEA_ELF) /* elves can see secret doors 1-2 on d6 */ seeit=(number(1,6)<=2); else seeit = FALSE; if (GET_RACE(ch)==RACE_HALF_ELVEN) /* half-elves can see exits, not as good as full */ seeit=(number(1,6)<=1); else seeit=FALSE; if (exitdata->to_room != NOWHERE || IS_IMMORTAL(ch)) { if ( ( !IS_SET(exitdata->exit_info, EX_CLOSED) && !IS_SET(exitdata->exit_info, EX_SECRET) || IS_IMMORTAL(ch)) || IS_SET(exitdata->exit_info, EX_SECRET) && seeit ) { sprintf(buf2," %s",listexits[door]); strcat(buf,buf2); if (IS_SET(exitdata->exit_info, EX_CLOSED) && IS_IMMORTAL(ch)) strcat(buf, " (closed)"); if (IS_SET(exitdata->exit_info, EX_SECRET) && seeit) strcat(buf, " $c5009(secret)$c0007"); /* blink red */ } /* exit */ } /* ! = NOWHERE */ } /* real_roomp */ } /* exitdata */ } /* for */ send_to_char("Exits:", ch); if (*buf) act(buf,FALSE, ch,0,0,TO_CHAR); else send_to_char("None!\n\r", ch); } #if 1 void do_look(struct char_data *ch, char *argument, int cmd) { char buffer[MAX_STRING_LENGTH]; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; int keyword_no, res; int j, bits, temp; bool found; struct obj_data *tmp_object, *found_object; struct char_data *tmp_char; char *tmp_desc; static char *keywords[]= { "north", "east", "south", "west", "up", "down", "in", "at", "", /* Look at '' case */ "room", "\n" }; dlog("in do_look"); if (!ch->desc) { return; } if (GET_POS(ch) < POSITION_SLEEPING) send_to_char("You can't see anything but stars!\n\r", ch); else if (GET_POS(ch) == POSITION_SLEEPING) send_to_char("You can't see anything, you're sleeping!\n\r", ch); else if ( IS_AFFECTED(ch, AFF_BLIND) ) send_to_char("You can't see a damn thing, you're blinded!\n\r", ch); else if ((IS_DARK(ch->in_room)) && (!IS_IMMORTAL(ch)) && (!IS_AFFECTED(ch, AFF_TRUE_SIGHT))) { send_to_char("It is very dark in here...\n\r", ch); if (IS_AFFECTED(ch, AFF_INFRAVISION)) { list_char_in_room(real_roomp(ch->in_room)->people, ch); } } else { only_argument(argument, arg1); if (0==strn_cmp(arg1,"at",2) && isspace(arg1[2])) { only_argument(argument+3, arg2); keyword_no = 7; } else if (0==strn_cmp(arg1,"in",2) && isspace(arg1[2])) { only_argument(argument+3, arg2); keyword_no = 6; } else { keyword_no = search_block(arg1, keywords, FALSE); } if ((keyword_no == -1) && *arg1) { keyword_no = 7; only_argument(argument, arg2); } 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 : { struct room_direction_data *exitp; exitp = EXIT(ch, keyword_no); if (exitp) { if (exitp->general_description) { send_to_char(exitp-> general_description, ch); } else { send_to_char("You see nothing special.\n\r", ch); } if (affected_by_spell(ch,SKILL_DANGER_SENSE)) { struct room_data *tmprp; tmprp = real_roomp(exitp->to_room); if (tmprp && IS_SET(tmprp->room_flags,DEATH)) send_to_char("You sense great dangers in that direction.\n\r",ch); } if (IS_SET(exitp->exit_info, EX_CLOSED) && (exitp->keyword)) { if ((strcmp(fname(exitp->keyword), "secret")) && (!IS_SET(exitp->exit_info, EX_SECRET))) { sprintf(buffer, "The %s is closed.\n\r", fname(exitp->keyword)); send_to_char(buffer, ch); } } else { if (IS_SET(exitp->exit_info, EX_ISDOOR) && exitp->keyword) { sprintf(buffer, "The %s is open.\n\r", fname(exitp->keyword)); send_to_char(buffer, ch); } } } else { send_to_char("You see nothing special.\n\r", ch); } if (exitp && exitp->to_room && (!IS_SET(exitp->exit_info, EX_ISDOOR) || (!IS_SET(exitp->exit_info, EX_CLOSED)))) { if (IS_AFFECTED(ch, AFF_SCRYING) || IS_IMMORTAL(ch)) { struct room_data *rp; sprintf(buffer,"You look %swards.\n\r", dirs[keyword_no]); send_to_char(buffer, ch); sprintf(buffer,"$n looks %swards.", dirs[keyword_no]); act(buffer, FALSE, ch, 0, 0, TO_ROOM); rp = real_roomp(exitp->to_room); if (!rp) { send_to_char("You see swirling chaos.\n\r", ch); } else if(exitp) { sprintf(buffer, "%d look", exitp->to_room); do_at(ch, buffer, 0); } else { send_to_char("You see nothing special.\n\r", 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) { 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(buffer,"It's %sfull of a %s liquid.\n\r", fullness[temp],color_liquid[tmp_object->obj_flags.value[2]]); send_to_char(buffer, ch); } } else if (GET_ITEM_TYPE(tmp_object) == ITEM_CONTAINER) { if (!IS_SET(tmp_object->obj_flags.value[1],CONT_CLOSED)) { send_to_char(fname(tmp_object->name), ch); switch (bits) { case FIND_OBJ_INV : send_to_char(" (carried) : \n\r", ch); break; case FIND_OBJ_ROOM : send_to_char(" (here) : \n\r", ch); break; case FIND_OBJ_EQUIP : send_to_char(" (used) : \n\r", ch); break; } list_obj_in_heap(tmp_object->contains, ch); } else send_to_char("It is closed.\n\r", ch); } else { send_to_char("That is not a container.\n\r", ch); } } else { /* wrong argument */ send_to_char("You do not see that item here.\n\r", ch); } } else { /* no argument */ send_to_char("Look in what?!\n\r", 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) { 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, real_roomp(ch->in_room)->ex_description); if (tmp_desc) { page_string(ch->desc, tmp_desc, 0); return; } } /* 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->carrying; 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 = real_roomp(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.\n\r", ch); } } else { /* no argument */ send_to_char("Look at what?\n\r", ch); } } break; /* look '' */ case 8 : { send_to_char(real_roomp(ch->in_room)->name, ch); send_to_char("\n\r", ch); if (!IS_SET(ch->specials.act, PLR_BRIEF)) send_to_char(real_roomp(ch->in_room)->description, ch); if (!IS_NPC(ch)) { if (IS_SET(ch->specials.act, PLR_HUNTING)) { if (ch->specials.hunting) { res = track(ch, ch->specials.hunting); if (!res) { ch->specials.hunting = 0; ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, PLR_HUNTING); } } else { ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, PLR_HUNTING); } } } else { if (IS_SET(ch->specials.act, ACT_HUNTING)) { if (ch->specials.hunting) { res = track(ch, ch->specials.hunting); if (!res) { ch->specials.hunting = 0; ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, ACT_HUNTING); } } else { ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, ACT_HUNTING); } } } list_exits_in_room(ch); list_obj_in_room(real_roomp(ch->in_room)->contents, ch); list_char_in_room(real_roomp(ch->in_room)->people, ch); } break; /* wrong arg */ case -1 : send_to_char("Sorry, I didn't understand that!\n\r", ch); break; /* look 'room' */ case 9 : { send_to_char(real_roomp(ch->in_room)->name, ch); send_to_char("\n\r", ch); send_to_char(real_roomp(ch->in_room)->description, ch); if (!IS_NPC(ch)) { if (IS_SET(ch->specials.act, PLR_HUNTING)) { if (ch->specials.hunting) { res = track(ch, ch->specials.hunting); if (!res) { ch->specials.hunting = 0; ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, PLR_HUNTING); } } else { ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, PLR_HUNTING); } } } else { if (IS_SET(ch->specials.act, ACT_HUNTING)) { if (ch->specials.hunting) { res = track(ch, ch->specials.hunting); if (!res) { ch->specials.hunting = 0; ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, ACT_HUNTING); } } else { ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, ACT_HUNTING); } } } list_exits_in_room(ch); list_obj_in_room(real_roomp(ch->in_room)->contents, ch); list_char_in_room(real_roomp(ch->in_room)->people, ch); } break; } } } /* end of look */ #else /* base do look */ void do_look(struct char_data *ch, char *argument, int cmd) { char buffer[MAX_STRING_LENGTH]; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; int keyword_no, res; int j, bits, temp; bool found; struct obj_data *tmp_object, *found_object; struct char_data *tmp_char; char *tmp_desc; static char *keywords[]= { "north", "east", "south", "west", "up", "down", "in", "at", "", /* Look at '' case */ "room", "\n" }; dlog("in do_look2"); if (!ch->desc) return; if (GET_POS(ch) < POSITION_SLEEPING) send_to_char("You can't see anything but stars!\n\r", ch); else if (GET_POS(ch) == POSITION_SLEEPING) send_to_char("You can't see anything, you're sleeping!\n\r", ch); else if ( IS_AFFECTED(ch, AFF_BLIND) ) send_to_char("You can't see a damn thing, you're blinded!\n\r", ch); else if ((IS_DARK(ch->in_room)) && (!IS_IMMORTAL(ch)) && (!IS_AFFECTED(ch, AFF_TRUE_SIGHT))) { send_to_char("It is very dark in here...\n\r", ch); if (IS_AFFECTED(ch, AFF_INFRAVISION)) { list_char_in_room(real_roomp(ch->in_room)->people, ch); } } else { only_argument(argument, arg1); if (0==strn_cmp(arg1,"at",2) && isspace(arg1[2])) { only_argument(argument+3, arg2); keyword_no = 7; } else if (0==strn_cmp(arg1,"in",2) && isspace(arg1[2])) { only_argument(argument+3, arg2); keyword_no = 6; } else { keyword_no = search_block(arg1, keywords, FALSE); } if ((keyword_no == -1) && *arg1) { keyword_no = 7; only_argument(argument, arg2); } 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 : { struct room_direction_data *exitp; exitp = EXIT(ch, keyword_no); if (exitp) { if (exitp->general_description) { send_to_char(exitp-> general_description, ch); } else { send_to_char("You see nothing special.\n\r", ch); } if (IS_SET(exitp->exit_info, EX_CLOSED) && (exitp->keyword)) { if ((strcmp(fname(exitp->keyword), "secret")) && (!IS_SET(exitp->exit_info, EX_SECRET))) { sprintf(buffer, "The %s is closed.\n\r", fname(exitp->keyword)); send_to_char(buffer, ch); } } else { if (IS_SET(exitp->exit_info, EX_ISDOOR) && exitp->keyword) { sprintf(buffer, "The %s is open.\n\r", fname(exitp->keyword)); send_to_char(buffer, ch); } } } else { send_to_char("You see nothing special.\n\r", ch); } if (exitp && exitp->to_room && (!IS_SET(exitp->exit_info, EX_ISDOOR) || (!IS_SET(exitp->exit_info, EX_CLOSED)))) { if (IS_AFFECTED(ch, AFF_SCRYING) || IS_IMMORTAL(ch)) { struct room_data *rp; sprintf(buffer,"You look %swards.\n\r", dirs[keyword_no]); send_to_char(buffer, ch); sprintf(buffer,"$n looks %swards.", dirs[keyword_no]); act(buffer, FALSE, ch, 0, 0, TO_ROOM); rp = real_roomp(exitp->to_room); if (!rp) { send_to_char("You see swirling chaos.\n\r", ch); } else if(exitp) { sprintf(buffer, "%d look", exitp->to_room); do_at(ch, buffer, 0); } else { send_to_char("You see nothing special.\n\r", 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) { 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(buffer,"It's %sfull of a %s liquid.\n\r", fullness[temp],color_liquid[tmp_object->obj_flags.value[2]]); send_to_char(buffer, ch); } } else if (GET_ITEM_TYPE(tmp_object) == ITEM_CONTAINER) { if (!IS_SET(tmp_object->obj_flags.value[1],CONT_CLOSED)) { send_to_char(fname(tmp_object->name), ch); switch (bits) { case FIND_OBJ_INV : send_to_char(" (carried) : \n\r", ch); break; case FIND_OBJ_ROOM : send_to_char(" (here) : \n\r", ch); break; case FIND_OBJ_EQUIP : send_to_char(" (used) : \n\r", ch); break; } list_obj_in_heap(tmp_object->contains, ch); } else send_to_char("It is closed.\n\r", ch); } else { send_to_char("That is not a container.\n\r", ch); } } else { /* wrong argument */ send_to_char("You do not see that item here.\n\r", ch); } } else { /* no argument */ send_to_char("Look in what?!\n\r", 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) { 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, real_roomp(ch->in_room)->ex_description); if (tmp_desc) { page_string(ch->desc, tmp_desc, 0); return; } } /* 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->carrying; 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 = real_roomp(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.\n\r", ch); } } else { /* no argument */ send_to_char("Look at what?\n\r", ch); } } break; /* look '' */ case 8 : { send_to_char(real_roomp(ch->in_room)->name, ch); send_to_char("\n\r", ch); if (!IS_SET(ch->specials.act, PLR_BRIEF)) send_to_char(real_roomp(ch->in_room)->description, ch); if (!IS_NPC(ch)) { if (IS_SET(ch->specials.act, PLR_HUNTING)) { if (ch->specials.hunting) { res = track(ch, ch->specials.hunting); if (!res) { ch->specials.hunting = 0; ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, PLR_HUNTING); } } else { ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, PLR_HUNTING); } } } else { if (IS_SET(ch->specials.act, ACT_HUNTING)) { if (ch->specials.hunting) { res = track(ch, ch->specials.hunting); if (!res) { ch->specials.hunting = 0; ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, ACT_HUNTING); } } else { ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, ACT_HUNTING); } } } list_obj_in_room(real_roomp(ch->in_room)->contents, ch); list_char_in_room(real_roomp(ch->in_room)->people, ch); } break; /* wrong arg */ case -1 : send_to_char("Sorry, I didn't understand that!\n\r", ch); break; /* look 'room' */ case 9 : { send_to_char(real_roomp(ch->in_room)->name, ch); send_to_char("\n\r", ch); send_to_char(real_roomp(ch->in_room)->description, ch); if (!IS_NPC(ch)) { if (IS_SET(ch->specials.act, PLR_HUNTING)) { if (ch->specials.hunting) { res = track(ch, ch->specials.hunting); if (!res) { ch->specials.hunting = 0; ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, PLR_HUNTING); } } else { ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, PLR_HUNTING); } } } else { if (IS_SET(ch->specials.act, ACT_HUNTING)) { if (ch->specials.hunting) { res = track(ch, ch->specials.hunting); if (!res) { ch->specials.hunting = 0; ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, ACT_HUNTING); } } else { ch->hunt_dist = 0; REMOVE_BIT(ch->specials.act, ACT_HUNTING); } } } list_obj_in_room(real_roomp(ch->in_room)->contents, ch); list_char_in_room(real_roomp(ch->in_room)->people, ch); } break; } } } /* end of look */ #endif void do_read(struct char_data *ch, char *argument, int cmd) { char buf[100]; dlog("in do_read"); /* This is just for now - To be changed later.! */ sprintf(buf,"at %s",argument); do_look(ch,buf,15); } void do_examine(struct char_data *ch, char *argument, int cmd) { char name[1000], buf[1000]; struct char_data *tmp_char; struct obj_data *tmp_object; dlog("in do_examine"); sprintf(buf,"at %s",argument); do_look(ch,buf,15); one_argument(argument, name); if (!*name) { send_to_char("Examine what?\n\r", ch); return; } 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_CONTAINER)) { send_to_char("When you look inside, you see:\n\r", ch); sprintf(buf,"in %s",argument); do_look(ch,buf,15); } } } #if 0 void do_exits(struct char_data *ch, char *argument, int cmd) { int door; char buf[1000]; struct room_direction_data *exitdata; dlog("in do_exits"); *buf = '\0'; for (door = 0; door <= 5; door++) { exitdata = EXIT(ch,door); if (exitdata) { if (!real_roomp(exitdata->to_room)) { /* don't print unless immortal */ if (IS_IMMORTAL(ch)) { sprintf(buf + strlen(buf), "%s - swirling chaos of #%d\n\r", exits[door], exitdata->to_room); } } else if (exitdata->to_room != NOWHERE && (!IS_SET(exitdata->exit_info, EX_CLOSED) || IS_IMMORTAL(ch))) { if (IS_DARK(exitdata->to_room)) sprintf(buf + strlen(buf), "%s - Too dark to tell", exits[door]); else sprintf(buf + strlen(buf), "%s - %s", exits[door], real_roomp(exitdata->to_room)->name); if (IS_SET(exitdata->exit_info, EX_CLOSED)) strcat(buf, " (closed)"); strcat(buf, "\n\r"); } } } send_to_char("Obvious exits:\n\r", ch); if (*buf) send_to_char(buf, ch); else send_to_char("None.\n\r", ch); } #else /* Gecko's spiffy enhancement to do_exits() from act.info.c */ void do_exits(struct char_data *ch, char *argument, int cmd) { /* NOTE: Input var 'cmd' is not used. */ int door; char buf[1000]; struct room_direction_data *exitdata; dlog("in do_exits2"); *buf = '\0'; for (door = 0; door <= 5; door++) { exitdata = EXIT(ch,door); if (exitdata) { if (!real_roomp(exitdata->to_room)) { /* don't print unless immortal */ if (IS_IMMORTAL(ch)) { sprintf(buf + strlen(buf), "%s - swirling chaos of #%d\n\r", exits[door], exitdata->to_room); } } else if (exitdata->to_room != NOWHERE) { if (IS_IMMORTAL(ch)) { sprintf(buf + strlen(buf), "%s - %s", exits[door], real_roomp(exitdata->to_room)->name); if(IS_SET(exitdata->exit_info, EX_SECRET)) strcat(buf," (secret)"); if(IS_SET(exitdata->exit_info, EX_CLOSED)) strcat(buf, " (closed)"); if(IS_DARK(exitdata->to_room)) strcat(buf, " (dark)"); sprintf(buf + strlen(buf), " #%d\n\r", exitdata->to_room); } else if (!IS_SET(exitdata->exit_info, EX_CLOSED) && !IS_SET(exitdata->exit_info, EX_SECRET)) /* msw 10/93 */ { if (IS_DARK(exitdata->to_room)) sprintf(buf + strlen(buf), "%s - Too dark to tell\n\r", exits[door]); else sprintf(buf + strlen(buf), "%s - %s\n\r", exits[door], real_roomp(exitdata->to_room)->name); } } } } send_to_char("Obvious exits:\n\r", ch); if (*buf) send_to_char(buf, ch); else send_to_char("None.\n\r", ch); } #endif void do_score(struct char_data *ch, char *argument, int cmd) { struct time_info_data playing_time; static char buf[1000], buf2[1000]; struct time_info_data my_age; struct time_info_data real_time_passed(time_t t2, time_t t1); dlog("in do_score"); age2(ch, &my_age); sprintf(buf, "$c0005You are $c0015%d$c0005 years old.", my_age.year); if ((my_age.month == 0) && (my_age.year == 0)) strcat(buf,"$c0015 It's your birthday today."); act(buf,FALSE, ch,0,0,TO_CHAR); sprintf(buf, "$c0005You belong to the $c0015%s$c0005 race", RaceName[GET_RACE(ch)]); act(buf,FALSE, ch,0,0,TO_CHAR); if (!IS_IMMORTAL(ch) && (!IS_NPC(ch))) { if (GET_COND(ch,DRUNK)>10) act("$c0011You are intoxicated.",FALSE, ch,0,0,TO_CHAR); if (GET_COND(ch,FULL)<2 && GET_COND(ch,FULL) != -1) act("$c0005You are $c0015hungry$c0005...",FALSE, ch,0,0,TO_CHAR); if (GET_COND(ch,THIRST)<2 && GET_COND(ch,THIRST) != -1) act("$c0005You are $c0015thirsty$c0005...",FALSE, ch,0,0,TO_CHAR); } sprintf(buf, "$c0005You have $c0015%d$c0005($c0011%d$c0005) hit, $c0015%d$c0005($c0011%d$c0005) mana and $c0015%d$c0005($c0011%d$c0005) movement points.", GET_HIT(ch),GET_MAX_HIT(ch), GET_MANA(ch),GET_MAX_MANA(ch), GET_MOVE(ch),GET_MAX_MOVE(ch)); act(buf,FALSE,ch,0,0,TO_CHAR); sprintf(buf, "$c0005Your alignment is: $c0015%s", AlignDesc(GET_ALIGNMENT(ch))); act(buf,FALSE,ch,0,0,TO_CHAR); sprintf(buf,"$c0005You have scored $c0015%d$c0005 exp, and have $c0015%d$c0005 gold coins.", GET_EXP(ch),GET_GOLD(ch)); act(buf,FALSE,ch,0,0,TO_CHAR); /* the mud will crash without this check! */ if (GetMaxLevel(ch)>MAX_MORT || (IS_NPC(ch) && !IS_SET(ch->specials.act,ACT_POLYSELF))) { /* do nothing! */ } else { buf[0] = '\0'; sprintf(buf,"$c0005Exp to next level : "); if (HasClass(ch, CLASS_MAGIC_USER)) { if (GetMaxLevel(ch)<MAX_IMMORT) sprintf(buf2,"M:$c0015%d$c0005 ", (titles[MAGE_LEVEL_IND][GET_LEVEL(ch, MAGE_LEVEL_IND)+1].exp)-GET_EXP(ch)); else sprintf(buf2,"M:0 "); strcat(buf,buf2); } if (HasClass(ch, CLASS_CLERIC)) { if (GetMaxLevel(ch)<MAX_IMMORT) sprintf(buf2,"C:$c0015%d$c0005 ", (titles[CLERIC_LEVEL_IND][GET_LEVEL(ch, CLERIC_LEVEL_IND)+1].exp)-GET_EXP(ch)); else sprintf(buf2,"C:0 "); strcat(buf,buf2); } if (HasClass(ch, CLASS_THIEF)) { if (GetMaxLevel(ch)<MAX_IMMORT) sprintf(buf2,"T:$c0015%d$c0005 ", (titles[THIEF_LEVEL_IND][GET_LEVEL(ch, THIEF_LEVEL_IND)+1].exp)-GET_EXP(ch)); else sprintf(buf2,"T:0 "); strcat(buf,buf2); } if (HasClass(ch, CLASS_WARRIOR)) { if (GetMaxLevel(ch)<MAX_IMMORT) sprintf(buf2,"W:$c0015%d$c0005 ", (titles[WARRIOR_LEVEL_IND][GET_LEVEL(ch, WARRIOR_LEVEL_IND)+1].exp)-GET_EXP(ch)); else sprintf(buf2,"W:0 "); strcat(buf,buf2); } if (HasClass(ch, CLASS_DRUID)) { if (GetMaxLevel(ch)<MAX_IMMORT) sprintf(buf2,"D:$c0015%d$c0005 ", (titles[DRUID_LEVEL_IND][GET_LEVEL(ch, DRUID_LEVEL_IND)+1].exp)-GET_EXP(ch)); else sprintf(buf2,"D:0 "); strcat(buf,buf2); } if (HasClass(ch, CLASS_MONK)) { if (GetMaxLevel(ch)<MAX_IMMORT) sprintf(buf2,"K:$c0015%d$c0005 ", (titles[MONK_LEVEL_IND][GET_LEVEL(ch, MONK_LEVEL_IND)+1].exp)-GET_EXP(ch)); else sprintf(buf2,"K:0 "); strcat(buf,buf2); } if (HasClass(ch, CLASS_BARBARIAN)) { if (GetMaxLevel(ch)<MAX_IMMORT) sprintf(buf2,"B:$c0015%d$c0005 ", (titles[BARBARIAN_LEVEL_IND][GET_LEVEL(ch, BARBARIAN_LEVEL_IND)+1].exp)-GET_EXP(ch)); else sprintf(buf2,"B:0 "); strcat(buf,buf2); } if (HasClass(ch, CLASS_SORCERER)) { if (GetMaxLevel(ch)<MAX_IMMORT) sprintf(buf2,"S:$c0015%d$c0005 ", (titles[SORCERER_LEVEL_IND][GET_LEVEL(ch, SORCERER_LEVEL_IND)+1].exp)-GET_EXP(ch)); else sprintf(buf2,"S:0 "); strcat(buf,buf2); } if (HasClass(ch, CLASS_PALADIN)) { if (GetMaxLevel(ch)<MAX_IMMORT) sprintf(buf2,"PA:$c0015%d$c0005 ", (titles[PALADIN_LEVEL_IND][GET_LEVEL(ch, PALADIN_LEVEL_IND)+1].exp)-GET_EXP(ch)); else sprintf(buf2,"PA:0 "); strcat(buf,buf2); } if (HasClass(ch, CLASS_RANGER)) { if (GetMaxLevel(ch)<MAX_IMMORT) sprintf(buf2,"R:$c0015%d$c0005 ", (titles[RANGER_LEVEL_IND][GET_LEVEL(ch, RANGER_LEVEL_IND)+1].exp)-GET_EXP(ch)); else sprintf(buf2,"R:0 "); strcat(buf,buf2); } if (HasClass(ch, CLASS_PSI)) { if (GetMaxLevel(ch)<MAX_IMMORT) sprintf(buf2,"PS:$c0015%d$c0005 ", (titles[PSI_LEVEL_IND][GET_LEVEL(ch, PSI_LEVEL_IND)+1].exp)-GET_EXP(ch)); else sprintf(buf2,"PS:0 "); strcat(buf,buf2); } act(buf,FALSE,ch,0,0,TO_CHAR); } buf[0] = '\0'; sprintf(buf, "$c0005Your levels:"); if (HasClass(ch, CLASS_MAGIC_USER)) { sprintf(buf2, " M:$c0015%d$c0005", GET_LEVEL(ch, MAGE_LEVEL_IND)); strcat(buf, buf2); } if (HasClass(ch, CLASS_CLERIC)) { sprintf(buf2, " C:$c0015%d$c0005", GET_LEVEL(ch, CLERIC_LEVEL_IND)); strcat(buf, buf2); } if (HasClass(ch, CLASS_WARRIOR)) { sprintf(buf2, " W:$c0015%d$c0005", GET_LEVEL(ch, WARRIOR_LEVEL_IND)); strcat(buf, buf2); } if (HasClass(ch, CLASS_THIEF)) { sprintf(buf2, " T:$c0015%d$c0005", GET_LEVEL(ch, THIEF_LEVEL_IND)); strcat(buf, buf2); } if (HasClass(ch, CLASS_DRUID)) { sprintf(buf2, " D:$c0015%d$c0005", GET_LEVEL(ch, DRUID_LEVEL_IND)); strcat(buf, buf2); } if (HasClass(ch, CLASS_MONK)) { sprintf(buf2, " K:$c0015%d$c0005", GET_LEVEL(ch, MONK_LEVEL_IND)); strcat(buf, buf2); } if (HasClass(ch, CLASS_BARBARIAN)) { sprintf(buf2, " B:$c0015%d$c0005", GET_LEVEL(ch, BARBARIAN_LEVEL_IND)); strcat(buf, buf2); } if (HasClass(ch, CLASS_SORCERER)) { sprintf(buf2, " S:$c0015%d$c0005", GET_LEVEL(ch, SORCERER_LEVEL_IND)); strcat(buf, buf2); } if (HasClass(ch, CLASS_PALADIN)) { sprintf(buf2, " PA:$c0015%d$c0005", GET_LEVEL(ch, PALADIN_LEVEL_IND)); strcat(buf, buf2); } if (HasClass(ch, CLASS_RANGER)) { sprintf(buf2, " R:$c0015%d$c0005", GET_LEVEL(ch, RANGER_LEVEL_IND)); strcat(buf, buf2); } if (HasClass(ch, CLASS_PSI)) { sprintf(buf2, " PS:$c0015%d$c0005", GET_LEVEL(ch, PSI_LEVEL_IND)); strcat(buf, buf2); } act(buf,FALSE,ch,0,0,TO_CHAR); if (GET_TITLE(ch)) { sprintf(buf,"$c0005This ranks you as $c0015%s $c0011%s", GET_NAME(ch), GET_TITLE(ch)); act(buf,FALSE,ch,0,0,TO_CHAR); } playing_time = real_time_passed((time(0)-ch->player.time.logon) + ch->player.time.played, 0); sprintf(buf,"$c0005You have been playing for $c0015%d$c0005 days and $c0015%d$c0005 hours.", playing_time.day, playing_time.hours); act(buf,FALSE,ch,0,0,TO_CHAR); /* Drow fight -4 in lighted rooms! */ if (!IS_DARK(ch->in_room) && GET_RACE(ch) == RACE_DROW && !affected_by_spell(ch,SPELL_GLOBE_DARKNESS) && !IS_UNDERGROUND(ch)) { sprintf(buf,"$c0011The light is the area causes you great pain$c0009!"); act(buf,FALSE,ch,0,0,TO_CHAR); } switch(GET_POS(ch)) { case POSITION_DEAD : act("$c0009You are DEAD!",FALSE, ch,0,0,TO_CHAR); break; case POSITION_MORTALLYW : act("$c0009You are mortally wounded!, you should seek help!",FALSE, ch,0,0,TO_CHAR); break; case POSITION_INCAP : act("$c0009You are incapacitated, slowly fading away",FALSE, ch,0,0,TO_CHAR); break; case POSITION_STUNNED : act("$c0011You are stunned! You can't move",FALSE, ch,0,0,TO_CHAR); break; case POSITION_SLEEPING : act("$c0010You are sleeping.",FALSE,ch,0,0,TO_CHAR); break; case POSITION_RESTING : act("$c0012You are resting.",FALSE,ch,0,0,TO_CHAR); break; case POSITION_SITTING : act("$c0013You are sitting.",FALSE,ch,0,0,TO_CHAR); break; case POSITION_FIGHTING : if (ch->specials.fighting) act("$c1009You are fighting $N.", FALSE, ch, 0, ch->specials.fighting, TO_CHAR); else act("$c1009You are fighting thin air.",FALSE, ch,0,0,TO_CHAR); break; case POSITION_STANDING : act("$c0005You are standing.",FALSE,ch,0,0,TO_CHAR); break; case POSITION_MOUNTED: if (MOUNTED(ch)) { sprintf(buf,"$c0005You are riding on $c0015%s",MOUNTED(ch)->player.short_descr); act(buf,FALSE,ch,0,0,TO_CHAR); } else { act("$c0005You are standing.",FALSE,ch,0,0,TO_CHAR);break; } break; default : act("$c0005You are floating.",FALSE,ch,0,0,TO_CHAR); break; } } void do_time(struct char_data *ch, char *argument, int cmd) { char buf[100], *suf; int weekday, day; dlog("in do_time"); 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,"\n\r"); 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.\n\r", day, suf, month_name[(int)time_info.month], time_info.year); send_to_char(buf,ch); } void do_weather(struct char_data *ch, char *argument, int cmd) { static char *sky_look[4]= { "cloudless", "cloudy", "rainy", "lit by flashes of lightning"}; static char buf[1024]; dlog("in do_weather"); if (OUTSIDE(ch)) { sprintf(buf, "The sky is %s and %s.\n\r", 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.\n\r", ch); } void do_help(struct char_data *ch, char *argument, int cmd) { int chk, bot, top, mid, minlen; char buf[MAX_STRING_LENGTH], buffer[MAX_STRING_LENGTH]; dlog("in do_help"); if (!ch->desc) return; for(;isspace(*argument); argument++) ; if (*argument) { if (!help_index) { send_to_char("No help available.\n\r", 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))) { fseek(help_fl, help_index[mid].pos, 0); *buffer = '\0'; for (;;) { fgets(buf, 80, help_fl); if (*buf == '#') break; if (strlen(buf)+strlen(buffer) > MAX_STRING_LENGTH-2) break; strcat(buffer, buf); strcat(buffer, "\r"); } page_string(ch->desc, buffer, 1); return; } else if (bot >= top) { send_to_char("There is no help on that word.\n\r", ch); return; } else if (chk > 0) bot = ++mid; else top = --mid; } return; } send_to_char(help, ch); } void do_wizhelp(struct char_data *ch, char *arg, int cmd) { char buf[1000]; int i, j = 1; NODE *n; dlog("in do_wizhelp"); if(IS_NPC(ch)) return; one_argument(arg,buf); /* new msw */ if (*arg) { do_actual_wiz_help(ch,arg,cmd); /* asking for help on keyword, try looking in file */ return; } sprintf(buf, "Wizhelp <keyword>\n\rWizard Commands Available To You:\n\r\n\r"); for(i = 0; i < 27; i++) { n = radix_head[i].next; while(n) { if(n->min_level <= GetMaxLevel(ch) && n->min_level >= LOW_IMMORTAL) { sprintf((buf + strlen(buf)), "%-10s", n->name); if(!(j % 7)) sprintf((buf + strlen(buf)), "\n\r"); j++; } n = n->next; } } strcat(buf, "\n\r"); page_string(ch->desc, buf, 1); } void do_actual_wiz_help(struct char_data *ch, char *argument, int cmd) { int chk, bot, top, mid, minlen; char buf[MAX_STRING_LENGTH], buffer[MAX_STRING_LENGTH]; dlog("in do_actual_wiz"); if (!ch->desc) return; for(;isspace(*argument); argument++) ; if (*argument) { if (!wizhelp_index) { send_to_char("No wizhelp available.\n\r", ch); return; } bot = 0; top = top_of_wizhelpt; for (;;) { mid = (bot + top) / 2; minlen = strlen(argument); if (!(chk = strn_cmp(argument, wizhelp_index[mid].keyword, minlen))) { fseek(wizhelp_fl, wizhelp_index[mid].pos, 0); *buffer = '\0'; for (;;) { fgets(buf, 80, wizhelp_fl); if (*buf == '#') break; if (strlen(buf)+strlen(buffer) > MAX_STRING_LENGTH-2) break; strcat(buffer, buf); strcat(buffer, "\r"); } page_string(ch->desc, buffer, 1); return; } else if (bot >= top) { send_to_char("There is no wizhelp on that word.\n\r", ch); return; } else if (chk > 0) bot = ++mid; else top = --mid; } return; } /* send a generic wizhelp menu like help I guess send_to_char(help, ch); */ } void do_command_list(struct char_data *ch, char *arg, int cmd) { char buf[MAX_STRING_LENGTH]; int i, j = 1; NODE *n; dlog("in do_command_list"); if(IS_NPC(ch)) return; sprintf(buf, "Commands Available To You:\n\r\n\r"); for(i = 0; i < 27; i++) { n = radix_head[i].next; while(n) { if(n->min_level <= GetMaxLevel(ch)) { if (strlen(buf)+strlen(n->name) <= MAX_STRING_LENGTH) sprintf((buf + strlen(buf)), "%-10s", n->name); if(!(j % 7)) if (strlen(buf)+4 <= MAX_STRING_LENGTH) sprintf((buf + strlen(buf)), "\n\r"); j++; } n = n->next; } } strcat(buf, "\n\r"); page_string(ch->desc, buf, 1); } #define OK_NAME(name,mask) (mask[0]=='\0' || \ strncmp(strcpy(tmpname1,lower(GET_NAME(name))),\ strcpy(tmpname2,lower(mask)),\ strlen(mask))==NULL) /* int OK_NAME(struct char_data *name, char *mask) { char n1[80],n2[80]; if(!*mask) return 1; strcpy(n1,lower(GET_NAME(name))); strcpy(n2,lower(mask)); return(strncmp(n1,n2,strlen(mask))==0); } */ void do_who(struct char_data *ch, char *argument, int cmd) { struct descriptor_data *d; struct char_data *person; char buffer[MAX_STRING_LENGTH*3]="",tbuf[1024]; int count; char color_cnt=1; char flags[20]=""; char name_mask[40]=""; char tmpname1[80],tmpname2[80]; dlog("in do_who"); /* check for an arg */ argument = one_argument(argument,tbuf); if(tbuf[0]=='-' && tbuf[1]!='\0') strcpy(flags,tbuf+1); else strcpy(name_mask,tbuf); if(*argument) { argument = one_argument(argument,tbuf); if(tbuf[0]=='-' && tbuf[1]!='\0') strcpy(flags,tbuf+1); else strcpy(name_mask,tbuf); } if ( (IS_IMMORTAL(ch) && flags[0]=='\0') || !IS_IMMORTAL(ch) || cmd == 234) { if( IS_IMMORTAL(ch) ) sprintf(buffer,"$c0005Players [God Version -? for Help]\n\r--------\n\r"); else if(cmd==234) { sprintf(buffer,"$c0005Players\n\r"); strcat(buffer,"------------\n\r"); } else { sprintf(buffer,"$c0005 Shadowdale Players\n\r"); strcat(buffer, " ------------\n\r"); } count=0; for (d = descriptor_list; d; d = d->next) { person=(d->original?d->original:d->character); if (CAN_SEE(ch, d->character) && \ (real_roomp(person->in_room)) && \ (real_roomp(person->in_room)->zone == real_roomp(ch->in_room)->zone || cmd!=234 ) && (!index(flags,'g') || IS_IMMORTAL(person))) { if (OK_NAME(person,name_mask)) { count++; color_cnt = (color_cnt++ % 9); /* range 1 to 9 */ if (cmd==234) { /* it's a whozone command */ if ((!IS_AFFECTED(person, AFF_HIDE)) || (IS_IMMORTAL(ch))) { sprintf(tbuf,"$c0012%-25s - %s", GET_NAME(person),real_roomp(person->in_room)->name); if (GetMaxLevel(ch) >= LOW_IMMORTAL) sprintf(tbuf+strlen(tbuf)," [%d]", person->in_room); } } else { char levels[40]="", classes[20]=""; char *classname[]={"Mu","Cl","Wa","Th","Dr","Mo","Ba","So","Pa","Ra","Ps"}; int i,total,classn; long bit; #if 1 if(!IS_IMMORTAL(person)) { for(bit=1,i=total=classn=0;i<PSI_LEVEL_IND+1;i++, bit<<=1) { if(HasClass(person,bit)) { /* if(strlen(levels)!=0) strcat(levels,"/"); sprintf(levels+strlen(levels),"%d",person->player.level[i]);*/ classn++; total+=person->player.level[i]; if(strlen(classes)!=0) strcat(classes,"/"); sprintf(classes+strlen(classes),"%s",classname[i]); } } if (total <=0) total =1; if (classn <= 0) classn =1; total/=classn; if(total<11) strcpy(levels,"$c0008Newbie"); else if(total<21) strcpy(levels,"$c0004Chump"); else if(total<31) strcpy(levels,"$c0006Medium"); else if(total<41) strcpy(levels,"$c0014Expert"); else if(total<51) strcpy(levels,"$c0015Adept"); sprintf(tbuf, "%s $c0012%s",levels, classes); sprintf(levels,"%30s",""); strcpy(levels+8-((strlen(tbuf)-12)/2),tbuf); sprintf(tbuf, "%-28s $c0005: $c0007%s %s",levels, GET_NAME(person),person->player.title?person->player.title:"(Null)"); } else { switch(GetMaxLevel(person)) { case 51: sprintf(levels,"Newbie Immortal"); break; case 52: sprintf(levels,"Saint"); break; case 53: sprintf(levels,"Creator"); break; case 54: sprintf(levels,"Demi God"); break; case 55: sprintf(levels,"God"); break; case 56: sprintf(levels,"Greater God"); break; case 57: sprintf(levels,"Overseer"); break; case 58: sprintf(levels,"SD Lord"); break; case 59: sprintf(levels,"Lord of Realm"); break; case 60: sprintf(levels,"God of Realm"); break; } sprintf(tbuf, "%s",levels); sprintf(levels,"%30s",""); strcpy(levels+8-(strlen(tbuf)/2),tbuf); sprintf(tbuf, "$c0011%-16s $c0005: $c0007%s %s",levels,GET_NAME(person), person->player.title?person->player.title:"(Null)"); } #else sprintf(tbuf, "$c100%d%s %s", color_cnt,GET_NAME(person), person->player.title?person->player.title:"(Null)"); #endif } if(IS_AFFECTED2(person,AFF2_AFK)) sprintf(tbuf+strlen(tbuf),"$c0008 [AFK] $c0007"); if (IS_LINKDEAD(person)) sprintf(tbuf+strlen(tbuf),"$c0015 [LINKDEAD] $c0007"); sprintf(tbuf+strlen(tbuf),"\n\r"); if (strlen(buffer)+strlen(tbuf) < (MAX_STRING_LENGTH*2)-512) strcat(buffer,tbuf); } } } if(index(flags,'g')) sprintf(tbuf, "\n\r$c0005Total visible gods: $c0015%d\n\r", count); else sprintf(tbuf, "\n\r$c0005Total visible players: $c0015%d\n\r", count); if (strlen(buffer)+strlen(tbuf) < MAX_STRING_LENGTH*2-512) strcat(buffer,tbuf); } else { /* GOD WHO */ int listed = 0, count, lcount, l, skip = FALSE; char ttbuf[256]; sprintf(buffer,"$c0005Players [God Version -? for Help]\n\r--------\n\r"); count=0; lcount=0; if(index(flags,'?')) { send_to_char(buffer,ch); send_to_char("$c0007[-]i=idle l=levels t=title h=hit/mana/move s=stats r=race\n\r",ch); send_to_char("[-]d=linkdead g=God o=Mort [1]Mage[2]Cleric[3]War[4]Thief[5]Druid\n\r",ch); send_to_char("[-][6]Monk[7]Barb[8]Sorc[9]Paladin[!]Ranger[@]Psi\n\r", ch); return; } for (person = character_list; person; person = person->next) { if (!IS_NPC(person) && CAN_SEE(ch, person) && OK_NAME(person,name_mask)) { count++; if (person->desc == NULL) lcount ++; skip = FALSE; if (index(flags,'g') != NULL) if (!IS_IMMORTAL(person)) skip = TRUE; if (index(flags,'o') != NULL) if (IS_IMMORTAL(person)) skip = TRUE; if (index(flags,'1') != NULL) if (!HasClass(person,CLASS_MAGIC_USER)) skip = TRUE; if (index(flags,'2') != NULL) if (!HasClass(person,CLASS_CLERIC)) skip = TRUE; if (index(flags,'3') != NULL) if (!HasClass(person,CLASS_WARRIOR)) skip = TRUE; if (index(flags,'4') != NULL) if (!HasClass(person,CLASS_THIEF)) skip = TRUE; if (index(flags,'5') != NULL) if (!HasClass(person,CLASS_DRUID)) skip = TRUE; if (index(flags,'6') != NULL) if (!HasClass(person,CLASS_MONK)) skip = TRUE; if (index(flags,'7') != NULL) if (!HasClass(person,CLASS_BARBARIAN)) skip = TRUE; if (index(flags,'8') != NULL) if (!HasClass(person,CLASS_SORCERER)) skip = TRUE; if (index(flags,'9') != NULL) if (!HasClass(person,CLASS_PALADIN)) skip = TRUE; if (index(flags,'!') != NULL) if (!HasClass(person,CLASS_RANGER)) skip = TRUE; if (index(flags,'@') != NULL) if (!HasClass(person,CLASS_PSI)) skip = TRUE; if (!skip) { if (person->desc == NULL) { if (index(flags,'d') != NULL) { sprintf(tbuf, "$c0003[%-12s] ", GET_NAME(person)); listed++; } } else { if (IS_NPC(person) && IS_SET(person->specials.act, ACT_POLYSELF)) { sprintf(tbuf, "(%-12s) ", GET_NAME(person)); listed++; } else { sprintf(tbuf, "$c0012%-14s ", GET_NAME(person)); listed++; } } if ((person->desc != NULL) || (index(flags,'d') != NULL)) { for (l = 0; l < strlen(flags) ; l++) { switch (flags[l]) { case 'r': { /* show race */ char bbuf[256]; sprinttype((person->race),RaceName,ttbuf); sprintf(bbuf," [%s] ",ttbuf); strcat(tbuf,bbuf); break; } case 'i': sprintf(ttbuf,"Idle:[%-3d] ",person->specials.timer); strcat(tbuf,ttbuf); break; case 'l': sprintf(ttbuf,"Level:[%-2d/%-2d/%-2d/%-2d/%-2d/%-2d/%-2d/%-2d/%-2d/%-2d/%-2d] ", person->player.level[0],person->player.level[1], person->player.level[2],person->player.level[3], person->player.level[4],person->player.level[5], person->player.level[6],person->player.level[7], person->player.level[8],person->player.level[9], person->player.level[10]); strcat(tbuf,ttbuf); break; case 'h': sprintf(ttbuf,"Hit:[%-3d] Mana:[%-3d] Move:[%-3d] ",GET_HIT(person),GET_MANA(person),GET_MOVE(person)); strcat(tbuf,ttbuf); break; case 's': if (GET_STR(person) != 18) sprintf(ttbuf,"[S:%-2d I:%-2d W:%-2d C:%-2d D:%-2d CH:%-2d] ", GET_STR(person),GET_INT(person),GET_WIS(person), GET_CON(person),GET_DEX(person),GET_CHR(person)); else sprintf(ttbuf,"[S:%-2d(%1d) I:%-2d W:%-2d C:%-2d D:%-2d CH:%-2d] ", GET_STR(person),GET_ADD(person),GET_INT(person), GET_WIS(person),GET_CON(person),GET_DEX(person), GET_CHR(person)); strcat(tbuf,ttbuf); break; case 't': sprintf(ttbuf," %-16s ",(person->player.title?person->player.title:"(null)")); strcat(tbuf,ttbuf); break; default: break; } } } if ((person->desc != NULL) || (index(flags,'d') != NULL)) { if(OK_NAME(person,name_mask)) { if (strlen(buffer)+strlen(tbuf) < (MAX_STRING_LENGTH*2)-512) { strcat(buffer,tbuf); strcat(buffer,"\n\r"); } } } } } } if (listed<=0) sprintf(tbuf,"\n\r$c0005No Matches\n\r"); else sprintf(tbuf,"\n\r$c0005Total players / Link dead [%d/%d] (%2.0f%%)\n\r", count,lcount,((float)lcount / (int)count) * 100); if (strlen(buffer)+strlen(tbuf) < (MAX_STRING_LENGTH*2)-512) strcat(buffer,tbuf); } page_string(ch->desc,buffer,TRUE); } void do_users(struct char_data *ch, char *argument, int cmd) { char buf[MAX_STRING_LENGTH], line[200], buf2[255]; struct descriptor_data *d; dlog("in do_users"); strcpy(buf, "Connections:\n\r------------\n\r"); for (d = descriptor_list; d; d = d->next){ if (CAN_SEE(ch, d->character) || GetMaxLevel(ch)==BIG_GUY) { if (d->character && d->character->player.name) { if(d->original) sprintf(line, "%-16s: ", d->original->player.name); else sprintf(line, "%-16s: ", d->character->player.name); } else sprintf(line, "UNDEFINED : "); if (d->host && *d->host) { sprintf(buf2, "%-22s [%s]\n\r", connected_types[d->connected],d->host); } else { sprintf(buf2, "%-22s [%s]\n\r", connected_types[d->connected],"????"); } strcat(line, buf2); strcat(buf, line); } /* could not see the person */ } /* end for */ /* send_to_char(buf, ch); */ page_string(ch->desc,buf,TRUE); } void do_inventory(struct char_data *ch, char *argument, int cmd) { dlog("in do_inventory"); send_to_char("You are carrying:\n\r", ch); list_obj_in_heap(ch->carrying, ch); } void do_equipment(struct char_data *ch, char *argument, int cmd) { int j,Worn_Index; bool found; char String[256]; dlog("in do_equip"); send_to_char("You are using:\n\r", ch); found = FALSE; for (Worn_Index = j=0; j< MAX_WEAR; j++) { if (ch->equipment[j]) { Worn_Index++; sprintf(String,"[%d] %s",Worn_Index,where[j]); send_to_char(String,ch); if (CAN_SEE_OBJ(ch,ch->equipment[j])) { show_obj_to_char(ch->equipment[j],ch,1); found = TRUE; } else { send_to_char("Something.\n\r",ch); found = TRUE; } } } if(!found) { send_to_char(" Nothing.\n\r", ch); } } void do_credits(struct char_data *ch, char *argument, int cmd) { dlog("in do_credits"); page_string(ch->desc, credits, 0); } void do_news(struct char_data *ch, char *argument, int cmd) { dlog("in do_news"); page_string(ch->desc, news, TRUE); } void do_info(struct char_data *ch, char *argument, int cmd) { dlog("in do_info"); page_string(ch->desc, info, 0); } void do_wizlist(struct char_data *ch, char *argument, int cmd) { dlog("in do_wizlist"); page_string(ch->desc, wizlist, TRUE); } int which_number_mobile(struct char_data *ch, struct char_data *mob) { struct char_data *i; char *name; int number; name = fname(mob->player.name); for (i=character_list, number=0; i; i=i->next) { if (isname(name, i->player.name) && i->in_room != NOWHERE) { number++; if (i==mob) return number; } } return 0; } char *numbered_person(struct char_data *ch, struct char_data *person) { static char buf[MAX_STRING_LENGTH]; if (IS_NPC(person) && IS_IMMORTAL(ch)) { sprintf(buf, "%d.%s", which_number_mobile(ch, person), fname(person->player.name)); } else { strcpy(buf, PERS(person, ch)); } return buf; } void do_where_person(struct char_data *ch, struct char_data *person, struct string_block *sb) { char buf[MAX_STRING_LENGTH]; dlog("in do_where_person"); if (!CAN_SEE(ch, person)) return; sprintf(buf, "%-30s- %s ", PERS(person, ch), (person->in_room > -1 ? real_roomp(person->in_room)->name : "Nowhere")); if (GetMaxLevel(ch) >= LOW_IMMORTAL) sprintf(buf+strlen(buf),"[%d]", person->in_room); strcpy(buf+strlen(buf), "\n\r"); append_to_string_block(sb, buf); } void do_where_object(struct char_data *ch, struct obj_data *obj, int recurse, struct string_block *sb) { char buf[MAX_STRING_LENGTH]; dlog("in do_where_object"); if (obj->in_room != NOWHERE) { /* object in a room */ sprintf(buf, "%-30s- %s [%d]\n\r", obj->short_description, real_roomp(obj->in_room)->name, obj->in_room); } else if (obj->carried_by != NULL) { /* object carried by monster */ sprintf(buf, "%-30s- carried by %s\n\r", obj->short_description, numbered_person(ch, obj->carried_by)); } else if (obj->equipped_by != NULL) { /* object equipped by monster */ sprintf(buf, "%-30s- equipped by %s\n\r", obj->short_description, numbered_person(ch, obj->equipped_by)); } else if (obj->in_obj) { /* object in object */ sprintf(buf, "%-30s- in %s\n\r", obj->short_description, obj->in_obj->short_description); } else { sprintf(buf, "%-30s- god doesn't even know where...\n\r", obj->short_description); } if (*buf) append_to_string_block(sb, buf); if (recurse) { if (obj->in_room != NOWHERE) return; else if (obj->carried_by != NULL) do_where_person(ch, obj->carried_by, sb); else if (obj->equipped_by != NULL) do_where_person(ch, obj->equipped_by, sb); else if (obj->in_obj != NULL) do_where_object(ch, obj->in_obj, TRUE, sb); } } void do_where(struct char_data *ch, char *argument, int cmd) { char name[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH]; char *nameonly; register struct char_data *i; register struct obj_data *k; struct descriptor_data *d; int number, count; struct string_block sb; dlog("in do_where"); only_argument(argument, name); if (!*name) { if (GetMaxLevel(ch) < LOW_IMMORTAL) { send_to_char("What are you looking for?\n\r", ch); return; } else { init_string_block(&sb); append_to_string_block(&sb, "Players:\n\r--------\n\r"); for (d = descriptor_list; d; d = d->next) { if (d->character && (d->connected == CON_PLYNG) && (d->character->in_room != NOWHERE) && CAN_SEE(ch, d->character)) { if (d->original) /* If switched */ sprintf(buf, "%-20s - %s [%d] In body of %s\n\r", d->original->player.name, real_roomp(d->character->in_room)->name, d->character->in_room, fname(d->character->player.name)); else sprintf(buf, "%-20s - %s [%d]\n\r", d->character->player.name, real_roomp(d->character->in_room)->name, d->character->in_room); append_to_string_block(&sb, buf); } } page_string_block(&sb,ch); destroy_string_block(&sb); return; } } if (isdigit(*name)) { nameonly = name; count = number = get_number(&nameonly); } else { count = number = 0; } *buf = '\0'; init_string_block(&sb); for (i = character_list; i; i = i->next) if (isname(name, i->player.name) && CAN_SEE(ch, i) ) { if ((i->in_room != NOWHERE) && ((GetMaxLevel(ch)>=LOW_IMMORTAL) || (real_roomp(i->in_room)->zone == real_roomp(ch->in_room)->zone))) { if (number==0 || (--count) == 0) { if (number==0) { sprintf(buf, "[%2d] ", ++count); /* I love short circuiting :) */ append_to_string_block(&sb, buf); } do_where_person(ch, i, &sb); *buf = 1; if (number!=0) break; } if (GetMaxLevel(ch) < LOW_IMMORTAL) break; } } /* count = number;*/ if (GetMaxLevel(ch) >= SAINT ) { for (k = object_list; k; k = k->next) if (isname(name, k->name) && CAN_SEE_OBJ(ch, k)) { if (number==0 || (--count)==0) { if (number==0) { sprintf(buf, "[%2d] ", ++count); append_to_string_block(&sb, buf); } do_where_object(ch, k, number!=0, &sb); *buf = 1; if (number!=0) break; } } } if (!*sb.data) send_to_char("Couldn't find any such thing.\n\r", ch); else page_string_block(&sb, ch); destroy_string_block(&sb); } void do_levels(struct char_data *ch, char *argument, int cmd) { int i, RaceMax, class; char buf[MAX_STRING_LENGTH*2],buf2[MAX_STRING_LENGTH]; dlog("in do_levels"); if (IS_NPC(ch)) { send_to_char("You ain't nothin' but a hound-dog.\n\r", ch); return; } *buf = '\0'; /* ** get the class */ for (;isspace(*argument);argument++); if (!*argument) { send_to_char("You must supply a class!\n\r", ch); return; } switch(*argument) { case 'C': case 'c': class = CLERIC_LEVEL_IND; break; case 'F': case 'f': case 'W': case 'w': class = WARRIOR_LEVEL_IND; break; case 'M': case 'm': class = MAGE_LEVEL_IND; break; case 'T': case 't': class = THIEF_LEVEL_IND; break; case 'D': case 'd': class = DRUID_LEVEL_IND; break; case 'K': case 'k': class = MONK_LEVEL_IND; break; case 'B': case 'b': class = BARBARIAN_LEVEL_IND; break; case 'S': case 's': class = SORCERER_LEVEL_IND; break; case 'P': case 'p': class = PALADIN_LEVEL_IND; break; case 'R': case 'r': class = RANGER_LEVEL_IND; break; case 'I': case 'i': class = PSI_LEVEL_IND; break; default: sprintf(buf, "I don't recognize %s\n\r", argument); send_to_char(buf,ch); return; break; } RaceMax = RacialMax[GET_RACE(ch)][class]; buf[0]=0; for (i = 1; i <= RaceMax; i++) { /* crashed in sprintf here, see if you can figure out why. msw, 8/24/94 */ sprintf(buf2, "[%2d] %9d-%-9d : %s\n\r", i, titles[class][i].exp, titles[class][i + 1].exp, (GET_SEX(ch)==SEX_FEMALE?titles[class][i].title_f:titles[class][i].title_m)); /* send_to_char(buf, ch); */ strcat(buf,buf2); } strcat(buf,"\n\r"); page_string(ch->desc,buf,1); } void do_consider(struct char_data *ch, char *argument, int cmd) { struct char_data *victim; char name[256], buf[256]; int diff; dlog("in do_consider"); only_argument(argument, name); if (!(victim = get_char_room_vis(ch, name))) { send_to_char("Consider killing who?\n\r", ch); return; } if (victim == ch) { send_to_char("Easy! Very easy indeed!\n\r", ch); return; } if (!IS_NPC(victim)) { send_to_char("Would you like to borrow a cross and a shovel?\n\r", ch); return; } act("$n looks at $N", FALSE, ch, 0, victim, TO_NOTVICT); act("$n looks at you", FALSE, ch, 0, victim, TO_VICT); if (GetMaxLevel(ch)>=LOW_IMMORTAL) { send_to_char("Consider this, What the heck do you need con for?\n\r", ch); return; } diff = GET_AVE_LEVEL(victim) - GET_AVE_LEVEL(ch); diff += MobLevBonus(victim); if (diff <= -10) send_to_char("Too easy to be believed.\n\r", ch); else if (diff <= -5) send_to_char("Not a problem.\n\r", ch); else if (diff <= -3) send_to_char("Rather easy.\n\r",ch); else if (diff <= -2) send_to_char("Easy.\n\r", ch); else if (diff <= -1) send_to_char("Fairly easy.\n\r", ch); else if (diff == 0) send_to_char("The perfect match!\n\r", ch); else if (diff <= 1) send_to_char("You would need some luck!\n\r", ch); else if (diff <= 2) send_to_char("You would need a lot of luck!\n\r", ch); else if (diff <= 3) send_to_char("You would need a lot of luck and great equipment!\n\r", ch); else if (diff <= 5) send_to_char("Do you feel lucky, punk?\n\r", ch); else if (diff <= 10) send_to_char("Are you crazy? Is that your problem?\n\r", ch); else if (diff <= 30) send_to_char("You ARE mad!\n\r", ch); else send_to_char("Why don't I just kill you right now and save you the trouble?\n\r", ch); #if 0 if (ch->skills) { int skill=0; int learn=0; int num, num2; float fnum; if (IsAnimal(victim) && ch->skills[SKILL_CONS_ANIMAL].learned) { skill = SKILL_CONS_ANIMAL; learn = ch->skills[skill].learned; act("$N seems to be an animal", FALSE, ch, 0, victim, TO_CHAR); } if (IsVeggie(victim) && ch->skills[SKILL_CONS_VEGGIE].learned) { if (!skill) skill = SKILL_CONS_VEGGIE; learn = MAX(learn, ch->skills[SKILL_CONS_VEGGIE].learned); act("$N seems to be an ambulatory vegetable", FALSE, ch, 0, victim, TO_CHAR); } if (IsDiabolic(victim) && ch->skills[SKILL_CONS_DEMON].learned) { if (!skill) skill = SKILL_CONS_DEMON; learn = MAX(learn, ch->skills[SKILL_CONS_DEMON].learned); act("$N seems to be a demon!", FALSE, ch, 0, victim, TO_CHAR); } if (IsReptile(victim) && ch->skills[SKILL_CONS_REPTILE].learned) { if (!skill) skill = SKILL_CONS_REPTILE; learn = MAX(learn, ch->skills[SKILL_CONS_REPTILE].learned); act("$N seems to be a reptilian creature", FALSE, ch, 0, victim, TO_CHAR); } if (IsUndead(victim) && ch->skills[SKILL_CONS_UNDEAD].learned) { if (!skill) skill = SKILL_CONS_UNDEAD; learn = MAX(learn, ch->skills[SKILL_CONS_UNDEAD].learned); act("$N seems to be undead", FALSE, ch, 0, victim, TO_CHAR); } if (IsGiantish(victim)&& ch->skills[SKILL_CONS_GIANT].learned) { if (!skill) skill = SKILL_CONS_GIANT; learn = MAX(learn, ch->skills[SKILL_CONS_GIANT].learned); act("$N seems to be a giantish creature", FALSE, ch, 0, victim, TO_CHAR); } if (IsPerson(victim) && ch->skills[SKILL_CONS_PEOPLE].learned) { if (!skill) skill = SKILL_CONS_PEOPLE; learn = MAX(learn, ch->skills[SKILL_CONS_PEOPLE].learned); act("$N seems to be a human or demi-human", FALSE, ch, 0, victim, TO_CHAR); } if (IsOther(victim)&& ch->skills[SKILL_CONS_OTHER].learned) { if (!skill) skill = SKILL_CONS_OTHER; learn = MAX(learn, ch->skills[SKILL_CONS_OTHER].learned/2); act("$N seems to be a monster you know about", FALSE, ch, 0, victim, TO_CHAR); } if (learn > 95) learn = 95; if (learn == 0) return; WAIT_STATE(ch, PULSE_VIOLENCE*2); #if 1 num = (int)GetApprox(GET_MAX_HIT(victim), learn); num2 = (int)GET_MAX_HIT(ch); if (!num2) num2=1; fnum = ((int)num/(int)num2); sprintf(buf, "Est Max hits are: %s\n\r", DescRatio(fnum)); send_to_char(buf, ch); num = (int)GetApprox(GET_AC(victim), learn); num2 = (int)GET_AC(ch); if (!num2) num2=1; fnum = ((int)num/(int)num2); sprintf(buf, "Est. armor class is : %s\n\r", DescRatio(fnum)); send_to_char(buf, ch); if (learn > 60) { sprintf(buf, "Est. # of attacks: %s\n\r", DescAttacks((int)GetApprox((int)victim->mult_att, learn))); send_to_char(buf, ch); } if (learn > 70) { num = (int)GetApprox((int)victim->specials.damnodice, learn); num2 = (int)GetApprox((int)victim->specials.damsizedice, learn); if (!num2) num2=1; fnum = (int)num*(num2/2.0); sprintf(buf, "Est. damage of attacks is %s\n\r", DescDamage(fnum)); send_to_char(buf, ch); } if (learn > 80) { num = (int)GetApprox(GET_HITROLL(victim), learn); num2 = ((int)21 - CalcThaco(ch)); if (!num2) num2=1; if (num2 > 0) fnum = ((int)num/(int)num2); else fnum = 2.0; sprintf(buf, "Est. Thaco: %s\n\r", DescRatio(fnum)); send_to_char(buf, ch); num = GetApprox(GET_DAMROLL(victim), learn); num2 = GET_DAMROLL(ch); if (!num2) num2=1; fnum = ((int)num/(int)num2); sprintf(buf, "Est. Dam bonus is: %s\n\r", DescRatio(fnum)); send_to_char(buf, ch); } #endif } #endif } void do_spells(struct char_data *ch, char *argument, int cmd) { int spl, i; /* 16384 */ char buf[MAX_STRING_LENGTH],tbuf[255]; dlog("in do_spells"); if (IS_NPC(ch)) { send_to_char("You ain't nothin' but a hound-dog.\n\r", ch); return; } *buf=0; sprintf(buf + strlen(buf), "[# ] %-20s MANA, Cl, Mu, Dr, Sc, Pa, Ra, Ps\n\r", "SPELL/SKILL\0"); for (i = 1, spl = 0; i <= MAX_EXIST_SPELL; i++, spl++) { if (GetMaxLevel(ch) > LOW_IMMORTAL || spell_info[i].min_level_cleric < ABS_MAX_LVL) { if (!spells[spl]) { sprintf(tbuf,"!spells[spl] on %d, do_spells in act.info.c",i); log_string(tbuf); } else sprintf(buf + strlen(buf), "[%2d] %-20s <%3d> %2d %3d %3d %3d %3d %3d %3d\n\r", i, spells[spl], spell_info[i].min_usesmana, spell_info[i].min_level_cleric, spell_info[i].min_level_magic, spell_info[i].min_level_druid, spell_info[i].min_level_sorcerer, spell_info[i].min_level_paladin, spell_info[i].min_level_ranger, spell_info[i].min_level_psi ); } } strcat(buf, "\n\r"); page_string(ch->desc, buf, 1); } void do_world(struct char_data *ch, char *argument, int cmd) { char buf[1000]; long ct, ot; char *tmstr, *otmstr; dlog("in do_world"); sprintf(buf, "$c0005Base Source: $c0014DaleMUD$c0005 Version $c0015%s.", VERSION); act(buf,FALSE, ch,0,0,TO_CHAR); ot = Uptime; otmstr = asctime(localtime(&ot)); *(otmstr + strlen(otmstr) - 1) = '\0'; sprintf(buf, "$c0005Start time was: $c0015%s $c0005(CST)", otmstr); act(buf,FALSE, ch,0,0,TO_CHAR); ct = time(0); tmstr = asctime(localtime(&ct)); *(tmstr + strlen(tmstr) - 1) = '\0'; sprintf(buf, "$c0005Current time is: $c0015%s $c0005(CST)", tmstr); act(buf,FALSE, ch,0,0,TO_CHAR); if (GetMaxLevel(ch) >=LOW_IMMORTAL) { char tbuf[256]; sprintbit((unsigned long)SystemFlags,system_flag_types,tbuf); sprintf(buf,"$c0005Current system settings :[$c0015%s$c0005]",tbuf); act(buf,FALSE,ch,0,0,TO_CHAR); } #if HASH sprintf(buf, "$c0005Total number of rooms in world: $c0015%d", room_db.klistlen); #else sprintf(buf, "$c0005Total number of rooms in world: $c0015%d", room_count); #endif act(buf,FALSE, ch,0,0,TO_CHAR); sprintf(buf, "$c0005Total number of zones in world: $c0015%d\n\r", top_of_zone_table + 1); act(buf,FALSE, ch,0,0,TO_CHAR); sprintf(buf,"$c0005Total number of distinct mobiles in world: $c0015%d", top_of_mobt + 1); act(buf,FALSE, ch,0,0,TO_CHAR); sprintf(buf,"$c0005Total number of distinct objects in world: $c0015%d\n\r", top_of_objt + 1); act(buf,FALSE, ch,0,0,TO_CHAR); sprintf(buf,"$c0005Total number of registered players: $c0015%d",top_of_p_table + 1); act(buf,FALSE, ch,0,0,TO_CHAR); sprintf(buf, "$c0005Total number of monsters in game: $c0015%d", mob_count); act(buf,FALSE, ch,0,0,TO_CHAR); sprintf(buf, "$c0005Total number of objects in game: $c0015%d", obj_count); act(buf, FALSE,ch,0,0,TO_CHAR); } void do_attribute(struct char_data *ch, char *argument, int cmd) { char buf[MAX_STRING_LENGTH]; struct affected_type *aff; struct time_info_data my_age; dlog("in do_attrib"); age2(ch, &my_age); sprintf(buf, "$c0005You are $c0014%d$c0005 years and $c0014%d$c0005 months, $c0014%d$c0005 cms, and you weigh $c0014%d$c0005 lbs.", my_age.year, my_age.month, ch->player.height, ch->player.weight); act(buf,FALSE, ch,0,0,TO_CHAR); sprintf(buf, "$c0005You are carrying $c0014%d$c0005 lbs of equipment.", IS_CARRYING_W(ch)); act(buf,FALSE, ch,0,0,TO_CHAR); sprintf(buf,"$c0005You are$c0014 %s",ArmorDesc(ch->points.armor)); act(buf,FALSE,ch,0,0,TO_CHAR); if (GetMaxLevel(ch) > 15) { sprintf(buf,"$c0005You have $c0014%d$c0005/$c0015%d $c0005STR, $c0014%d $c0005INT, $c0014%d $c0005WIS, $c0014%d $c0005DEX, $c0014%d $c0005CON, $c0014%d $c0005CHR", GET_STR(ch), GET_ADD(ch), GET_INT(ch), GET_WIS(ch), GET_DEX(ch), GET_CON(ch), GET_CHR(ch)); act(buf,FALSE,ch,0,0,TO_CHAR); } sprintf(buf, "$c0005Your hit bonus and damage bonus are $c0014%s$c0005 and $c0014%s$c0005 respectively.", HitRollDesc(GET_HITROLL(ch)), DamRollDesc(GET_DAMROLL(ch))); act(buf,FALSE, ch,0,0,TO_CHAR); /* ** by popular demand -- affected stuff */ act("\n\r$c0005Affecting Spells:\n\r--------------",FALSE, ch,0,0,TO_CHAR); if (ch->affected) { for(aff = ch->affected; aff; aff = aff->next) { if (aff->type <= MAX_EXIST_SPELL) { switch(aff->type) { case SKILL_SNEAK: case SPELL_POISON: case SPELL_CURSE: case SPELL_PRAYER: case SKILL_SWIM: case SKILL_SPY: case SKILL_FIRST_AID: case SKILL_LAY_ON_HANDS: case SKILL_MEDITATE: break; default: sprintf(buf, "$c0005Spell : '$c0014%s$c0005'",spells[aff->type-1]); act(buf,FALSE, ch,0,0,TO_CHAR); break; } } } } } void do_value(struct char_data *ch, char *argument, int cmd) { char buf[1000],buf2[1000], name[1000]; struct obj_data *obj=0; struct char_data *vict=0; dlog("in do_value"); /* Spell Names */ /* For Objects */ if (!HasClass(ch, CLASS_THIEF|CLASS_RANGER)) { send_to_char("Sorry, you can't do that here", ch); return; } argument = one_argument(argument, name); if ((obj = get_obj_in_list_vis(ch, name, ch->carrying))==0) { if ((vict = get_char_room_vis(ch, name))==0) { send_to_char("Who, or what are you talking about?\n\r", ch); return; } else { only_argument(argument, name); if ((obj = get_obj_in_list_vis(ch, name, vict->carrying))==0) { act("You can't see that on $M", FALSE, ch, obj, vict, TO_CHAR); act("$n looks you over", FALSE, ch, 0, vict, TO_VICT); act("$n looks $N over", FALSE, ch, 0, vict, TO_NOTVICT); return; } } } WAIT_STATE(ch, PULSE_VIOLENCE*2); if (!SpyCheck(ch)) { /* failed spying check */ if (obj && vict) { act("$n looks at you, and $s eyes linger on $p", FALSE, ch, obj, vict, TO_VICT); act("$n studies $N", FALSE, ch, 0, vict, TO_ROOM); } else if (obj) { act("$n intensely studies $p", FALSE, ch, obj, 0, TO_ROOM); } else{ return; } } sprintf(buf, "Object: %s. Item type: ", obj->short_description); sprinttype(GET_ITEM_TYPE(obj),item_types,buf2); strcat(buf,buf2); strcat(buf,"\n\r"); send_to_char(buf, ch); if (!ch->skills) return; if (number(1,101) < ch->skills[SKILL_EVALUATE].learned/3) { if (obj->obj_flags.bitvector) { send_to_char("Item will give you following abilities: ", ch); sprintbit((unsigned long)obj->obj_flags.bitvector,affected_bits,buf); strcat(buf,"\n\r"); send_to_char(buf, ch); } } if (number(1,101) < ch->skills[SKILL_EVALUATE].learned/2) { send_to_char("Item is: ", ch); sprintbit((unsigned long) obj->obj_flags.extra_flags,extra_bits,buf); strcat(buf,"\n\r"); send_to_char(buf,ch); } sprintf(buf,"Weight: %d, Value: %d, Rent cost: %d %s\n\r", obj->obj_flags.weight, GetApprox(obj->obj_flags.cost, ch->skills[SKILL_EVALUATE].learned-10), GetApprox(obj->obj_flags.cost_per_day, ch->skills[SKILL_EVALUATE].learned-10), obj->obj_flags.cost_per_day>LIM_ITEM_COST_MIN?"[RARE]":" "); send_to_char(buf, ch); if (ITEM_TYPE(obj) == ITEM_WEAPON) { sprintf(buf, "Damage Dice is '%dD%d'\n\r", GetApprox(obj->obj_flags.value[1], ch->skills[SKILL_EVALUATE].learned-10), GetApprox(obj->obj_flags.value[2], ch->skills[SKILL_EVALUATE].learned-10)); send_to_char(buf, ch); } else if (ITEM_TYPE(obj) == ITEM_ARMOR) { sprintf(buf, "AC-apply is %d\n\r", GetApprox(obj->obj_flags.value[0], ch->skills[SKILL_EVALUATE].learned-10)); send_to_char(buf, ch); } } char *AlignDesc(int a) { if (a <= -900) { return("Really really bad"); } else if (a <= -500) { return("Not nice at all"); } else if (a <= -351) { return("obnoxious as hell"); } else if (a <= -100) { return("just plain annoying"); } else if (a <= 100) { return("You feel balanced"); } else if (a <= 350) { return("Polite"); } else if (a <= 500) { return("Sweet, and caring."); } else if (a <= 900) { return("A real goody-goody"); } else{ return("So good it makes you sick"); } } char *ArmorDesc(int a) { if (a >= 90) { return("barely armored"); } else if (a >= 50) { return("Lightly armored"); } else if (a >= 30) { return("Medium-armored"); } else if (a >= 10) { return("Fairly well armored"); } else if (a >= -10) { return("Well armored"); } else if (a >= -30) { return("Quite well armored"); } else if (a >= -50) { return("Very well armored"); } else if (a >= -90) { return("Extremeley well armored"); } else { return("armored like a Dragon"); } } char *HitRollDesc(int a) { if (a < -5) { return("Quite bad"); } else if (a < -1) { return("Pretty lousy"); } else if (a <= 1) { return("Not Much of one"); } else if (a < 3) { return("Not bad"); } else if (a < 8) { return("Damn good"); } else { return("Very good"); } } char *DamRollDesc(int a) { if (a < -5) { return("Quite bad"); } else if (a < -1) { return("Pretty lousy"); } else if (a <= 1) { return("Not Much of one"); } else if (a < 3) { return("Not bad"); } else if (a < 8) { return("Damn good"); } else { return("Very good"); } } char *DescRatio(float f) /* theirs / yours */ { if (f > 1.0) { return("More than twice yours"); } else if (f > .75) { return("More than half again greater than yours"); } else if (f > .6) { return("At least a third greater than yours"); } else if (f > .4) { return("About the same as yours"); } else if (f > .3) { return("A little worse than yours"); } else if (f > .1) { return("Much worse than yours"); } else { return("Extremely inferior"); } } char *DescDamage(float dam) { if (dam < 1.0) { return("Minimal Damage"); } else if (dam <= 2.0) { return("Slight damage"); } else if (dam <= 4.0) { return("A bit of damage"); } else if (dam <= 10.0) { return("A decent amount of damage"); } else if (dam <= 15.0) { return("A lot of damage"); } else if (dam <= 25.0) { return("A whole lot of damage"); } else if (dam <= 35.0) { return("A very large amount"); } else { return("A TON of damage"); } } char *DescAttacks(float a) { if (a < 1.0) { return("Not many"); } else if (a < 2.0) { return("About average"); } else if (a < 3.0) { return("A few"); } else if (a < 5.0) { return("A lot"); } else if (a < 9.0) { return("Many"); } else { return("A whole bunch"); } } void do_display(struct char_data *ch, char *arg, int cmd) { int i; dlog("in do_display"); if(IS_NPC(ch)) return; i = atoi(arg); switch(i) { case 0: if(ch->term == 0) { send_to_char("Display unchanged.\n\r", ch); return; } ch->term = 0; ScreenOff(ch); send_to_char("Display now turned off.\n\r", ch); return; case 1: if(ch->term == 1) { send_to_char("Display unchanged.\n\r", ch); return; } ch->term = VT100; InitScreen(ch); send_to_char("Display now set to VT100.\n\r", ch); return; default: if(ch->term == VT100) { send_to_char("Term type is currently VT100.\n\r", ch); return; } send_to_char("Display is currently OFF.\n\r", ch); return; } } void ScreenOff(struct char_data *ch) { char buf[255]; sprintf(buf, VT_MARGSET, 0, ch->size- 1); send_to_char(buf, ch); send_to_char(VT_HOMECLR, ch); } void do_resize(struct char_data *ch, char *arg, int cmd) { int i; dlog("in do_resize"); if(IS_NPC(ch)) return; i = atoi(arg); if(i < 7) { send_to_char("Screen size must be greater than 7.\n\r", ch); return; } if (i > 50) { send_to_char("Size must be smaller than 50.\n\r",ch); return; } ch->size = i; if(ch->term == VT100) { ScreenOff(ch); InitScreen(ch); } send_to_char("Ok.\n\r", ch); return; } int MobLevBonus(struct char_data *ch) { int t=0; if (mob_index[ch->nr].func == magic_user) t+=5; if (mob_index[ch->nr].func == BreathWeapon) t+=7; if (mob_index[ch->nr].func == fighter) t+=3; if (mob_index[ch->nr].func == snake) t+=3; t+=(ch->mult_att-1)*3; if (GET_HIT(ch) > GetMaxLevel(ch)*8) t+=1; if (GET_HIT(ch) > GetMaxLevel(ch)*12) t+=2; if (GET_HIT(ch) > GetMaxLevel(ch)*16) t+=3; if (GET_HIT(ch) > GetMaxLevel(ch)*20) t+=4; return(t); } void do_show_skill(struct char_data *ch, char *arg, int cmd) { char buf[254], buffer[MAX_STRING_LENGTH]; int i; dlog("in do_show_skill"); buffer[0]='\0'; if (!ch->skills) return; for (; isspace(*arg); arg++); if (!arg) { send_to_char("You need to supply a class for that.",ch); return; } switch(*arg) { case 'w': case 'W': case 'f': case 'F': { if (!HasClass(ch, CLASS_WARRIOR)) { send_to_char("I bet you think you're a warrior.\n\r", ch); return; } send_to_char("Not implemented for warriors yet\n\r", ch); } break; case 't': case 'T': { if (!HasClass(ch, CLASS_THIEF)) { send_to_char("I bet you think you're a thief.\n\r", ch); return; } send_to_char("Not implemented for thieves yet\n\r", ch); } break; case 'M': case 'm': { if (!HasClass(ch, CLASS_MAGIC_USER)) { send_to_char("I bet you think you're a magic-user.\n\r", ch); return; } send_to_char("Your class can learn these spells:\n\r", ch); for(i=0; *spells[i] != '\n'; i++) if (spell_info[i+1].spell_pointer && spell_info[i+1].min_level_magic<51) { sprintf(buf,"[%d] %s %s", spell_info[i+1].min_level_magic, spells[i],how_good(ch->skills[i+1].learned)); strcat(buf," \n\r"); if (strlen(buf)+strlen(buffer) > (MAX_STRING_LENGTH*2)-2) break; strcat(buffer, buf); strcat(buffer, "\r"); } page_string(ch->desc, buffer, 1); return; } break; case 'C': case 'c': { if (!HasClass(ch, CLASS_CLERIC)) { send_to_char("I bet you think you're a cleric.\n\r", ch); return; } send_to_char("Your class can learn these spells:\n\r", ch); for(i=0; *spells[i] != '\n'; i++) if (spell_info[i+1].spell_pointer && spell_info[i+1].min_level_cleric<51) { sprintf(buf,"[%d] %s %s", spell_info[i+1].min_level_cleric, spells[i],how_good(ch->skills[i+1].learned)); strcat(buf," \n\r"); if (strlen(buf)+strlen(buffer) > (MAX_STRING_LENGTH*2)-2) break; strcat(buffer, buf); strcat(buffer, "\r"); } page_string(ch->desc, buffer, 1); return; } break; case 'D': case 'd': { if (!HasClass(ch, CLASS_DRUID)) { send_to_char("I bet you think you're a druid.\n\r", ch); return; } send_to_char("Your class can learn any of these spells:\n\r", ch); for(i=0; *spells[i] != '\n'; i++) if (spell_info[i+1].spell_pointer && spell_info[i+1].min_level_druid<51) { sprintf(buf,"[%d] %s %s", spell_info[i+1].min_level_druid, spells[i],how_good(ch->skills[i+1].learned)); strcat(buf," \n\r" ); if (strlen(buf)+strlen(buffer) > MAX_STRING_LENGTH-2) break; strcat(buffer, buf); strcat(buffer, "\r"); } page_string(ch->desc, buffer, 1); return; } break; case 'K': case 'k': { if (!HasClass(ch, CLASS_MONK)) { send_to_char("I bet you think you're a monk.\n\r", ch); return; } send_to_char("Not implemented for monks yet\n\r", ch); } break; case 'b': case 'B': { if (!HasClass(ch, CLASS_BARBARIAN)) { send_to_char("I bet you think you're a Barbarian.\n\r", ch); return; } send_to_char("Not implemented for barbs yet:\n\r", ch); } break; case 'S': case 's': { if (!HasClass(ch, CLASS_SORCERER)) { send_to_char("I bet you think you're a sorcerer.\n\r", ch); return; } send_to_char("Your class can learn these spells:\n\r", ch); for(i=0; *spells[i] != '\n'; i++) if (spell_info[i+1].spell_pointer && spell_info[i+1].min_level_magic<51) { sprintf(buf,"[%d] %s %s", spell_info[i+1].min_level_magic, spells[i],how_good(ch->skills[i+1].learned)); strcat(buf," \n\r"); if (strlen(buf)+strlen(buffer) > (MAX_STRING_LENGTH*2)-2) break; strcat(buffer, buf); strcat(buffer, "\r"); } page_string(ch->desc, buffer, 1); return; } break; case 'p': case 'P': { if (!HasClass(ch, CLASS_PALADIN)) { send_to_char("I bet you think you're a paladin.\n\r", ch); return; } send_to_char("Your class can learn these skills:\n\r", ch); for(i=0; *spells[i] != '\n'; i++) if (spell_info[i+1].spell_pointer && spell_info[i+1].min_level_paladin<51) { sprintf(buf,"[%d] %s %s", spell_info[i+1].min_level_paladin, spells[i],how_good(ch->skills[i+1].learned)); strcat(buf," \n\r"); if (strlen(buf)+strlen(buffer) > (MAX_STRING_LENGTH*2)-2) break; strcat(buffer, buf); strcat(buffer, "\r"); } page_string(ch->desc, buffer, 1); return; } break; case 'R': case 'r': { if (!HasClass(ch, CLASS_RANGER)) { send_to_char("I bet you think you're a ranger.\n\r", ch); return; } send_to_char("Your class can learn these skills:\n\r", ch); for(i=0; *spells[i] != '\n'; i++) if (spell_info[i+1].spell_pointer && spell_info[i+1].min_level_ranger<51) { sprintf(buf,"[%d] %s %s", spell_info[i+1].min_level_ranger, spells[i],how_good(ch->skills[i+1].learned)); strcat(buf," \n\r"); if (strlen(buf)+strlen(buffer) > (MAX_STRING_LENGTH*2)-2) break; strcat(buffer, buf); strcat(buffer, "\r"); } page_string(ch->desc, buffer, 1); return; } break; case 'i': case 'I': { if (!HasClass(ch, CLASS_PSI)) { send_to_char("I bet you think you're a psionist.\n\r", ch); return; } send_to_char("Your class can learn these skills:\n\r", ch); for(i=0; *spells[i] != '\n'; i++) if (spell_info[i+1].spell_pointer && spell_info[i+1].min_level_psi<51) { sprintf(buf,"[%d] %s %s", spell_info[i+1].min_level_psi, spells[i],how_good(ch->skills[i+1].learned)); strcat(buf," \n\r"); if (strlen(buf)+strlen(buffer) > (MAX_STRING_LENGTH*2)-2) break; strcat(buffer, buf); strcat(buffer, "\r"); } page_string(ch->desc, buffer, 1); return; } break; default: send_to_char("Which class???\n\r", ch); } } /* this command will only be used for immorts as I am using it as a way */ /* to figure out how to look into rooms next to this room. Will be using*/ /* the code for throwing items. I figure there is no IC reason for a PC */ /* to have a command like this. Do what ya want on your on MUD */ void do_scan(struct char_data *ch, char *argument, int cmd) { static char *keywords[]= { "north", "east", "south", "west", "up", "down", "\n"}; char *dir_desc[] = { "to the north", "to the east", "to the south", "to the west", "upwards", "downwards"}; char *rng_desc[] = { "right here", "immediately", "nearby", "a ways", "a ways", "far", "far", "very far", "very far"}; char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH]; char arg1[MAX_STRING_LENGTH], arg2[MAX_STRING_LENGTH]; int sd, smin, smax, swt, i, max_range = 6, range, rm, nfnd; struct char_data *spud; dlog("in do_scan"); /* sprintf(buf,"In scan - Room #%d, %s scanning.", ch->in_room,GET_NAME(ch)); slog(buf); */ /* Check mortals spot skill, and give THEM a max scan of 2 rooms. */ if (!ch->skills) { send_to_char("You do not have skills!\n\r",ch); return; } if (GetMaxLevel(ch)<LOW_IMMORTAL) { if (!ch->skills[SKILL_SPOT].learned) { send_to_char ("You have not been trained to spot.\n\r",ch); return; } if (dice(1,101) > ch->skills[SKILL_SPOT].learned) { send_to_char("Absolutely no-one anywhere.\n\r",ch); WAIT_STATE(ch,2); return; } /* failed */ max_range=2; /* morts can only spot two rooms away */ } /* was mortal */ argument_split_2(argument,arg1,arg2); sd = search_block(arg1, keywords, FALSE); if (sd==-1) { smin = 0; smax = 5; swt = 3; sprintf(buf,"$n peers intently all around."); sprintf(buf2,"You peer intently all around, and see :\n\r"); } else { smin = sd; smax = sd; swt = 1; sprintf(buf,"$n peers intently %s.",dir_desc[sd]); sprintf(buf2,"You peer intently %s, and see :\n\r",dir_desc[sd]); } act(buf, FALSE, ch, 0, 0, TO_ROOM); send_to_char(buf2,ch); nfnd = 0; /* Check in room first */ for (spud=real_roomp(ch->in_room)->people;spud;spud=spud->next_in_room) { if ((CAN_SEE(ch,spud))&&(!IS_SET(spud->specials.affected_by,AFF_HIDE))&&(spud!=ch)) { if (IS_NPC(spud)) { sprintf(buf,"%30s : right here\n\r",spud->player.short_descr); } else { sprintf(buf,"%30s : right here\n\r",GET_NAME(spud)); } send_to_char(buf,ch); nfnd++; } } for (i=smin;i<=smax;i++) { rm = ch->in_room; range = 0; while (range<max_range) { range++; if (clearpath(ch, rm,i)) { rm = real_roomp(rm)->dir_option[i]->to_room; for (spud=real_roomp(rm)->people;spud;spud=spud->next_in_room) { if ((CAN_SEE(ch,spud))&&(!(IS_SET(spud->specials.affected_by,AFF_HIDE)))) { if (IS_NPC(spud)) { sprintf(buf,"%30s : %s %s\n\r",spud->player.short_descr,rng_desc[range],dir_desc[i]); } else { sprintf(buf,"%30s : %s %s\n\r",GET_NAME(spud),rng_desc[range],dir_desc[i]); } send_to_char(buf,ch); nfnd++; } } } else { range = max_range + 1; } } } if (nfnd==0) send_to_char("Absolutely no-one anywhere.\n\r",ch); WAIT_STATE(ch,swt); } void list_groups(struct char_data *ch) { struct descriptor_data *i; struct char_data *person; struct follow_type *f; int count = 0; char buf[MAX_STRING_LENGTH*2],tbuf[MAX_STRING_LENGTH]; sprintf(buf,"$c0015[------- Adventuring Groups -------]\n\r"); /* go through the descriptor list */ for (i = descriptor_list;i;i=i->next) { /* find everyone who is a master */ if (!i->connected) { person = (i->original ? i->original:i->character); /* list the master and the group name */ if (!person->master && IS_AFFECTED(person, AFF_GROUP)) { if (person->specials.group_name && CAN_SEE(ch, person)) { sprintf(tbuf, " $c0015%s\n\r$c0014%s\n\r",person->specials.group_name, fname (GET_NAME(person))); strcat(buf,tbuf); /* list the members that ch can see */ count = 0; for(f=person->followers; f; f=f->next) { if (IS_AFFECTED(f->follower, AFF_GROUP) && IS_PC(f->follower)) { count++; if (CAN_SEE(ch, f->follower) && strlen(GET_NAME(f->follower))>1 ) { sprintf(tbuf,"$c0013%s\n\r", fname(GET_NAME(f->follower))); strcat(buf,tbuf); } else { sprintf(tbuf,"$c0013Someone\n\r"); strcat(buf,tbuf); } } } /* if there are no group members, then remove the group title */ if (count < 1) { send_to_char("Your group name has been removed, your group is to small\n\r",person); if (person->specials.group_name) free(person->specials.group_name); person->specials.group_name=0; } } } } } strcat(buf,"\n\r$c0015[---------- End List --------------]\n\r"); page_string(ch->desc,buf,1); } int can_see_linear(struct char_data *ch, struct char_data *targ, int *rng, int *dr) { int i, rm, max_range = 6, range = 0; struct char_data *spud; for (i=0;i<6;i++) { rm = ch->in_room; range = 0; while (range<max_range) { range++; if (clearpath(ch, rm,i)) { rm = real_roomp(rm)->dir_option[i]->to_room; for (spud=real_roomp(rm)->people;spud;spud=spud->next_in_room) { if ((spud==targ)&&(CAN_SEE(ch,spud))) { *rng = range; *dr = i; return i; } } } } } return -1; } struct char_data *get_char_linear(struct char_data *ch, char *arg, int *rf, int *df) /* Returns direction if can see, -1 if not */ { int i, rm, max_range = 6, range = 0, n, n_sofar = 0; struct char_data *spud; char *tmp, tmpname[MAX_STRING_LENGTH]; strcpy(tmpname, arg); tmp = tmpname; if (!(n = get_number(&tmp))) return NULL; rm = ch->in_room; i = 0; range = 0; for (spud=real_roomp(rm)->people;spud;spud=spud->next_in_room) { if ((isname(tmp, GET_NAME(spud)))&&(CAN_SEE(ch,spud))) { n_sofar++; if (n_sofar==n) { *rf = range; *df = i; return spud; } } } for (i=0;i<6;i++) { rm = ch->in_room; range = 0; while (range<max_range) { range++; if (clearpath(ch, rm,i)) { rm = real_roomp(rm)->dir_option[i]->to_room; for (spud=real_roomp(rm)->people;spud;spud=spud->next_in_room) { if ((isname(tmp, GET_NAME(spud)))&&(CAN_SEE(ch,spud))) { n_sofar++; if (n_sofar==n) { *rf = range; *df = i; return spud; } } } } else { range = max_range+1; } } } return NULL; }