I was just about done getting the standard merc scan ported over, when I thought, what is the difference between "scan" and "look"? There shouldn't be any! So, I removed the do_scan part of it, and added a call to scan from do_look. My code is below. If you like the original better, just make a do_scan function that loops 6 times, and calls scan with the direction. Or, to improve this one, change my do_look part, to check a PRF_ASTUTE flag. Okay... in act.informative.c, make the first part of look_in_direction look like this: void look_in_direction(struct char_data * ch, int dir) { if (EXIT(ch, dir)) { if (EXIT(ch, dir)->general_description) { scan(ch, dir); send_to_char(EXIT(ch, dir)->general_description, ch); } else scan(ch, dir); Then, add this function anywhere before the previous one. I chose the very beginning, so I could alter it as I thought of new things... /* * Nagilum's scan function and related constants. * (contributed by VampLestat 17-Feb-94) * (modified by Mikko Kilpikoski 12-Jun-94) * Ported to circle 3.0 and improved by Larcevious 4/5/95 */ char * const dist_name [] = { "just", "close by", "not far off", "a brief walk away", "rather far off", "in the distance", "almost out of sight" }; char * const dir_desc [] = { "to your north", "to your east", "to your south", "to your west", "above you", "below you" }; void scan( struct char_data * ch, int dir ) { char buf[MAX_STRING_LENGTH]; int distance, visibility; bool found; struct char_data *vict; int was_in_room, percent, count = 0; visibility = 6; if (!PRF_FLAGGED(ch, PRF_HOLYLIGHT)) { switch( weather_info.sunlight ) { case SUN_SET: visibility = 4; break; case SUN_DARK: visibility = 2; break; case SUN_RISE: visibility = 4; break; case SUN_LIGHT: visibility = 6; break; default: visibility = 6; break; } switch( weather_info.sky ) { case SKY_CLOUDLESS: break; case SKY_CLOUDY: visibility -= 1; break; case SKY_WINDY: visibility -= 1; break; case SKY_RAINING: visibility -= 2; break; case SKY_LIGHTNING: visibility -= 3; break; default: break; } } was_in_room = ch->in_room; found = FALSE; for( distance = 1; distance <= 6; distance++ ) { switch( world[ch->in_room].sector_type ) { case SECT_FOREST: count += 25; break; /* Trees and such will */ case SECT_HILLS: count += 50; break; /* block ones view */ case SECT_MOUNTAIN: count += 75; break; case SECT_UNDERWATER: count += 80; break; default: break; } percent = number(1, 101) - count; if (EXIT(ch, dir) && EXIT(ch, dir)->to_room != NOWHERE) { if (IS_SET(EXIT(ch, dir)->exit_info, EX_CLOSED)) { char door_name[80]; one_argument( fname(EXIT(ch, dir)->keyword), door_name ); if( door_name[0] == '\0' ) strcat( door_name, "door" ); sprintf( buf, "A closed %s %s %s.\n\r", door_name, dist_name[distance-1], dir_desc[dir] ); send_to_char( buf, ch ); found = TRUE; break; } if (IS_DARK(ch->in_room) && !CAN_SEE_IN_DARK(ch)) { visibility--; continue; } for(vict = world[EXIT(ch, dir)->to_room].people; vict != NULL; vict = vict->next_in_room ) { if (count > 5) count += 2; /* gets harder, the more people around */ else if (count > 10) count += 3; else if (count > 15) count += 10; /* big jump to cut down spam */ else count++; /* switch on race here, if imped */ /* giants being easier than pixies! */ if(GET_LEVEL(ch) >= LVL_IMMORT) percent = 100; if(CAN_SEE(ch, vict) && (percent > 5)) { found = TRUE; sprintf( buf, "%s who is %s %s.\n\r", PERS( vict, ch ), dist_name[distance], dir_desc[dir] ); buf[0] = UPPER(buf[0]); send_to_char( buf, ch); } } ch->in_room = world[ch->in_room].dir_option[dir]->to_room; } } ch->in_room = was_in_room; if( !found ) { sprintf( buf, "You don't notice anyone %s.\n\r", dir_desc[dir] ); send_to_char( buf, ch ); } return; }
This archive was generated by hypermail 2b30 : 12/07/00 PST