/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * ROM 2.4 is copyright 1993-1995 Russ Taylor * * ROM 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) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * ***************************************************************************/ /*************************************************************************** * ROT 1.4 is copyright 1996-1997 by Russ Walsh * * By using this code, you have agreed to follow the terms of the * * ROT license, in the file doc/rot.license * ***************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" char *const distance[4] = { "right here.", "nearby to the %s.", "not far %s.", "far to the %s." }; CH_CMD ( do_scan ) { char arg1[MAX_INPUT_LENGTH], buf[MAX_INPUT_LENGTH]; ROOM_INDEX_DATA *scan_room; EXIT_DATA *pExit; sh_int door, depth, outlet; argument = one_argument ( argument, arg1 ); if ( IS_AFFECTED ( ch, AFF_BLIND ) ) { send_to_char ( "Maybe it would help if you could see?\n\r", ch ); return; } if ( arg1[0] == '\0' ) { act ( "$n looks all around.", ch, NULL, NULL, TO_ROOM ); send_to_char ( "Looking around you see:\n\r", ch ); scan_list ( ch->in_room, ch, 0, -1 ); for ( door = 0; door < 6; door++ ) { outlet = door; if ( ( ch->alignment < 0 ) && ( pExit = ch->in_room->exit[door + 6] ) != NULL ) outlet += 6; if ( ( pExit = ch->in_room->exit[outlet] ) != NULL ) scan_list ( pExit->u1.to_room, ch, 1, outlet ); } return; } else if ( !str_cmp ( arg1, "n" ) || !str_cmp ( arg1, "north" ) ) door = 0; else if ( !str_cmp ( arg1, "e" ) || !str_cmp ( arg1, "east" ) ) door = 1; else if ( !str_cmp ( arg1, "s" ) || !str_cmp ( arg1, "south" ) ) door = 2; else if ( !str_cmp ( arg1, "w" ) || !str_cmp ( arg1, "west" ) ) door = 3; else if ( !str_cmp ( arg1, "u" ) || !str_cmp ( arg1, "up" ) ) door = 4; else if ( !str_cmp ( arg1, "d" ) || !str_cmp ( arg1, "down" ) ) door = 5; else { send_to_char ( "Which way do you want to scan?\n\r", ch ); 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 ); sprintf ( buf, "Looking %s you see:\n\r", dir_name[door] ); scan_room = ch->in_room; for ( depth = 1; depth < 4; depth++ ) { outlet = door; if ( ( ch->alignment < 0 ) && ( pExit = scan_room->exit[outlet + 6] ) != NULL ) outlet += 6; if ( ( pExit = scan_room->exit[outlet] ) != NULL ) { scan_room = pExit->u1.to_room; scan_list ( pExit->u1.to_room, ch, depth, outlet ); } } return; } 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; for ( rch = scan_room->people; rch != NULL; rch = rch->next_in_room ) { if ( rch == ch ) continue; if ( !IS_NPC ( rch ) && rch->invis_level > get_trust ( ch ) ) continue; if ( get_trust ( ch ) < rch->ghost_level ) 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[MAX_INPUT_LENGTH], buf2[MAX_INPUT_LENGTH]; buf[0] = '\0'; if ( IS_AFFECTED ( ch, AFF_FARSIGHT ) || depth == 0 ) { strcat ( buf, PERS ( victim, ch ) ); strcat ( buf, ", " ); } else { strcat ( buf, "Something is moving " ); } sprintf ( buf2, distance[depth], dir_name[door] ); strcat ( buf, buf2 ); strcat ( buf, "\n\r" ); if ( IS_QUESTOR ( ch ) && ch->pcdata->questmob > 0 && IS_NPC ( victim ) && victim->pIndexData->vnum == ch->pcdata->questmob ) strcat ( buf, "{W[{RT{rARGE{RT{W]{x " ); /* if (ON_GQUEST(ch) && IS_NPC(victim) && is_gqmob(ch, victim->pIndexData->vnum) != -1) strcat(buf, "(Gquest) "); */ send_to_char ( buf, ch ); return; }