#include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "emlen.h" /*destroy_list destroys the linked list of gen_next */ void destroy_list (CHAR_DATA * ch) { CHAR_DATA *nxt; CHAR_DATA *current; for (current = ch; current != NULL; current = nxt) { nxt = current->gen_next; current->gen_next = NULL; } return; } int been_to_room[501]; void clear_been_to_room (void) { int i; for (i = 0; i < 501; i++) been_to_room[i] = 0; return; } bool been_here (int vnum) { int i; for (i = 0; i < 501; i++) { if (been_to_room[i] == vnum) return TRUE; } return FALSE; } void add_room_to_list (int vnum) { int i; for (i = 0; i < 501; i++) if (been_to_room[i] == 0) { been_to_room[i] = vnum; break; } return; } int scan_room_for_people (CHAR_DATA * ch, ROOM_DATA * rid) { CHAR_DATA *blah; int ii; CHAR_DATA *cur = NULL; if (been_here (rid->vnum)) return -1; ii = 0; for (blah = ch; blah != NULL; blah = blah->gen_next) { ii++; if (blah->gen_next == NULL) { cur = blah; break; } if (ii > 70) { fprintf (stderr, "Ch: %s in %d. Rm: %d\n", NAME (ch), ch->in_room->vnum, rid->vnum); ch->gen_next = NULL; return -1; } } if (cur == NULL) return 0; if (rid->more) for (blah = rid->more->people; blah != NULL; blah = blah->next_in_room) { if (blah == ch) continue; if (blah == cur) continue; cur->gen_next = blah; if (blah->gen_next) blah->gen_next = NULL; cur = blah; } return 0; } void do_it (CHAR_DATA * ch, ROOM_DATA * rid, int strength, short came_from) { int ctr = 0; if (strength < 1) return; if (IS_SET (rid->room_flags, ROOM_NOHEAR)) return; if (been_here (rid->vnum)) return; if (scan_room_for_people (ch, rid) < 0) { return; } add_room_to_list (rid->vnum); if (rid->exit[DIR_EAST] && came_from != DIR_WEST && rid->exit[DIR_EAST]->to_room) { if (rid->exit[DIR_EAST]->d_info && IS_SET (rid->exit[DIR_EAST]->d_info->exit_info, EX_CLOSED)) ctr++; if (IS_SET (rid->room_flags, ROOM_NOISY)) ctr++; if (rid->exit[DIR_EAST]->d_info && IS_SET (rid->exit[DIR_EAST]->d_info->exit_info, EX_HIDDEN)) ctr = 9999; do_it (ch, rid->exit[DIR_EAST]->to_room, (strength - ctr - 1), DIR_EAST); } if (rid->exit[DIR_WEST] && came_from != DIR_EAST && rid->exit[DIR_WEST]->to_room) { if (rid->exit[DIR_WEST]->d_info && IS_SET (rid->exit[DIR_WEST]->d_info->exit_info, EX_CLOSED)) ctr++; if (IS_SET (rid->room_flags, ROOM_NOISY)) ctr++; if (rid->exit[DIR_WEST]->d_info && IS_SET (rid->exit[DIR_WEST]->d_info->exit_info, EX_HIDDEN)) ctr = 9999; do_it (ch, rid->exit[DIR_WEST]->to_room, (strength - ctr - 1), DIR_WEST); } if (rid->exit[DIR_NORTH] && came_from != DIR_SOUTH && rid->exit[DIR_NORTH]->to_room) { if (rid->exit[DIR_NORTH]->d_info && IS_SET (rid->exit[DIR_NORTH]->d_info->exit_info, EX_CLOSED)) ctr++; if (IS_SET (rid->room_flags, ROOM_NOISY)) ctr++; if (rid->exit[DIR_NORTH]->d_info && IS_SET (rid->exit[DIR_NORTH]->d_info->exit_info, EX_HIDDEN)) ctr = 9999; do_it (ch, rid->exit[DIR_NORTH]->to_room, (strength - ctr - 1), DIR_EAST); } if (rid->exit[DIR_SOUTH] && came_from != DIR_NORTH && rid->exit[DIR_SOUTH]->to_room) { if (rid->exit[DIR_SOUTH]->d_info && IS_SET (rid->exit[DIR_SOUTH]->d_info->exit_info, EX_CLOSED)) ctr++; if (IS_SET (rid->room_flags, ROOM_NOISY)) ctr++; if (rid->exit[DIR_SOUTH]->d_info && IS_SET (rid->exit[DIR_SOUTH]->d_info->exit_info, EX_HIDDEN)) ctr = 9999; do_it (ch, rid->exit[DIR_SOUTH]->to_room, (strength - ctr - 1), DIR_EAST); } return; } void find_people_n (CHAR_DATA * ch, int n) { if (!ch->in_room) { return; } clear_been_to_room (); destroy_list (ch); if (n > 15) { send_to_char ("Error in find_people_n: Max depth is 15.\n\r", ch); return; } do_it (ch, ch->in_room, n, 9999); return; }