/* =========================================================================== This snippet was written by Erwin S. Andreasen, erwin@andreasen.org. You may use this code freely, as long as you retain my name in all of the files. You also have to mail me telling that you are using it. Note, however, that I DO NOT OFFER ANY SUPPORT ON THIS CODE. If you have a problem installing it, this means you probably SHOULD NOT BE RUNNING A MUD. All my snippets are publically available at: http://www.andreasen.org/ =========================================================================== Note that function prototypes are not included in this code - remember to add them to merc.h yourself (i.e. DECLARE_DO_FUN(do_scan)). Also remember to add the command to the command table. Look at any other command to see how, or read the docs. The classic SCAN command, shows the mobs surrounding the character. Last update: Sep 18, 1995 Should work on : MERC2.2 ROM2.3 Fixed since last update: ch/target were reversed in the call to can_see Know bugs and limitations yet to be fixed: Blind character should get another message Dark rooms can be scanned into? Comments: For ROM2.3, replace to_room with u1.to_room It's primitive, but also some of my first work! :) */ /* * returns everything the character can see at that location in buf * returns number of creatures seen */ int scan_room (CHAR_DATA *ch, const ROOM_INDEX_DATA *room,char *buf) { CHAR_DATA *target = room->people; int number_found = 0; while (target != NULL) /* repeat as long more peple in the room */ { if (can_see(ch,target)) /* show only if the character can see the target */ { strcat (buf, " - "); strcat (buf, IS_NPC(target) ? target->short_descr : target->name); strcat (buf, "\n\r"); number_found++; } target = target->next_in_room; } return number_found; } void do_scan (CHAR_DATA *ch, char *argument) { EXIT_DATA * pexit; ROOM_INDEX_DATA * room; extern char * const dir_name[]; char buf[MAX_STRING_LENGTH]; int dir; int distance; sprintf (buf, "Right here you see:\n\r"); if (scan_room(ch,ch->in_room,buf) == 0) strcat (buf, "Noone\n\r"); send_to_char (buf,ch); for (dir = 0; dir < 6; dir++) /* look in every direction */ { room = ch->in_room; /* starting point */ for (distance = 1 ; distance < 4; distance++) { pexit = room->exit[dir]; /* find the door to the next room */ if ((pexit == NULL) || (pexit->to_room == NULL) || (IS_SET(pexit->exit_info, EX_CLOSED))) break; /* exit not there OR points to nothing OR is closed */ /* char can see the room */ sprintf (buf, "%d %s from here you see:\n\r", distance, dir_name[dir]); if (scan_room(ch,pexit->to_room,buf)) /* if there is something there */ send_to_char (buf,ch); room = pexit->to_room; /* go to the next room */ } /* for distance */ } /* for dir */ }