/**************************************************************************/ // scan.cpp - Implementation of the scan command /*************************************************************************** * The Dawn of Time v1.69r (c)1997-2004 Michael Garratt * * >> A number of people have contributed to the Dawn codebase, with the * * majority of code written by Michael Garratt - www.dawnoftime.org * * >> To use this source code, you must fully comply with all the licenses * * in licenses.txt... In particular, you may not remove this copyright * * notice. * *************************************************************************** * >> Original Diku Mud copyright (c)1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, & Katja Nyboe. * * >> Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * >> ROM 2.4 is copyright 1993-1995 Russ Taylor and has been brought to * * you by the ROM consortium: Russ Taylor(rtaylor@pacinfo.com), * * Gabrielle Taylor(gtaylor@pacinfo.com) & Brian Moore(rom@rom.efn.org) * * >> Oblivion 1.2 is copyright 1996 Wes Wagner * **************************************************************************/ #include "include.h" // dawn standard includes char *const distance[6]= { "right here.", "nearby to the %s.", "not far %s.", "off in the distance %s.", "off in the far distance %s.", "far far away to the %s." }; void scan_list( ROOM_INDEX_DATA *scan_room, char_data *ch, sh_int depth, sh_int door); void scan_char( char_data *victim, char_data *ch, sh_int depth, sh_int door); /**************************************************************************/ void do_new_scan(char_data *ch, char *argument, int dist, int blocked) { char arg1[MIL]; ROOM_INDEX_DATA *scan_room; EXIT_DATA *pExit; sh_int door, depth; if (dist>5) dist = 5; argument = one_argument(argument, arg1); if (arg1[0] == '\0') { act("$n looks all around.", ch, NULL, NULL, TO_ROOM); ch->println( "`RLooking around you see:`x" ); scan_list(ch->in_room, ch, 0, -1); for (door=0;door<MAX_DIR;door++) { if (( pExit = ch->in_room->exit[door]) != NULL && ( !IS_SET( pExit->exit_info, EX_CLOSED ) || ( IS_SET( pExit->exit_info, EX_CLOSED) && !blocked ))) scan_list(pExit->u1.to_room, ch, 1, door); } return; } door = dir_lookup( arg1 ); if ( door == -1 ) { ch->println("Which way do you want to scan?"); return; } act("You peer intently $T.", ch, NULL, dir_name[door], TO_CHAR); act("$n peers intently $T.", ch, NULL, dir_name[door], TO_ROOM); scan_room = ch->in_room; for (depth = 1; depth <= dist; depth++) { if (scan_room && ((pExit = scan_room->exit[door]) != NULL) && ( !IS_SET(pExit->exit_info, EX_CLOSED) || (IS_SET(pExit->exit_info, EX_CLOSED) && !blocked))) { scan_room = pExit->u1.to_room; scan_list(pExit->u1.to_room, ch, depth, door); } else continue; } return; } /**************************************************************************/ void do_scan(char_data *ch, char *argument) { if(IS_RIDING(ch)){ do_new_scan(ch, argument, 4, true); }else{ do_new_scan(ch, argument, 3, true); } } /**************************************************************************/ void do_far_scan(char_data *ch, char *argument) { do_new_scan(ch, argument, 5, false); } /**************************************************************************/ void scan_list(ROOM_INDEX_DATA *scan_room, char_data *ch, sh_int depth, sh_int door) { char_data *rch; if (scan_room == NULL) return; if ( IS_SET( scan_room->room_flags, ROOM_NOSCAN )) return; if ( door != -1 && scan_room->exit[rev_dir[door]] != NULL && IS_SET(scan_room->exit[rev_dir[door]]->exit_info,EX_CLOSED) ){ return; } for (rch=scan_room->people; rch != NULL; rch=rch->next_in_room) { if (rch == ch) continue; if (!IS_NPC(rch) && INVIS_LEVEL(rch)> get_trust(ch)) continue; if (can_see(ch, rch)) scan_char(rch, ch, depth, door); } return; } /**************************************************************************/ void scan_char(char_data *victim, char_data *ch, sh_int depth, sh_int door) { char buf[MIL], buf2[MIL]; buf[0] = '\0'; strcat(buf, PERS(victim, ch)); strcat(buf, ", "); sprintf(buf2, distance[depth], dir_name[door]); strcat(buf, buf2); ch->println(buf); return; } /**************************************************************************/