/************************************************************************** * # # # ## # # ### ## ## ### http://www.lyonesse.it * * # # # # # ## # # # # # * * # # # # # ## ## # # ## ## ## # # ## * * # # # # # ## # # # # # # # # # # # * * ### # ## # # ### ## ## ### # # #### ## Ver. 1.0 * * * * -Based on CircleMud & Smaug- Copyright (c) 2001-2002 by Mithrandir * * * * ********************************************************************** * * * * File: wilderness.c * * * * Wilderness with dynamic rooms code * * * **************************************************************************/ #include "conf.h" #include "sysdep.h" #include "structs.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "constants.h" /* external funcs */ PSTONE_DATA *get_pstone_by_coord( COORD_DATA *coord ); int char_to_sect( char charsect ); char sect_to_char( int sectnum ); void show_full_weath_map( CHAR_DATA *ch ); void load_life(WILD_DATA *wd); void save_life(WILD_DATA *wd); /* local functions */ WILD_DATA *load_wildmap_sector(COORD_DATA *coord); WILD_DATA *get_wd(COORD_DATA *coord); WILD_DATA *wild_sector(int y, int x); void check_wild_move(CHAR_DATA *ch, VEHICLE_DATA *vehicle, SHIP_DATA *ship, FERRY_DATA *ferry, ROOM_DATA *pRoomFrom, ROOM_DATA *pRoomTo); void wild_map_load(CHAR_DATA *ch, COORD_DATA *coord); void remove_exit_to_room(ROOM_DATA *wRoom); void update_wild_life(int y, int x, int oper); /* Globals */ ROOM_DATA *wild[WILD_HASH][WILD_HASH]; WILD_DATA *kWorld[WDATA_HASH][WDATA_HASH]; int loaded_rooms = 0; /* Global lists */ WILD_REMOVE *wild_remove_list = NULL; /* ************************************************************** */ void free_ex_descriptions(EXTRA_DESCR *head) { EXTRA_DESCR *thised, *next_one; if (!head) { log("free_ex_descriptions: NULL pointer or NULL data."); return; } for (thised = head; thised; thised = next_one) { next_one = thised->next; if (thised->keyword) free(thised->keyword); if (thised->description) free(thised->description); free(thised); } } int free_room_strings(ROOM_DATA *room) { /* Free descriptions. */ if (room->name) free(room->name); if (room->description) free(room->description); if (room->ex_description) free_ex_descriptions(room->ex_description); return (TRUE); } void free_room(ROOM_DATA *room) { EXIT_DATA *pexit, *pex_next = NULL; free_room_strings(room); /* Free exits */ for ( pexit = room->first_exit; pexit; pexit = pex_next ) { pex_next = pexit->next; extract_exit( room, pexit ); } } /* *************************************************************** */ /* W I L D S E C T O R S H A N D L I N G */ /* *************************************************************** */ void update_sect_file( WILD_DATA *wd ) { FILE *fp; char fname[128]; register int fy; if ( !wd ) return; /* update map file */ sprintf( fname, "%smap/%d-%d.map", WLS_PREFIX, wd->coord->y, wd->coord->x ); if ( !( fp = fopen( fname, "w" ) ) ) { log( "SYSERR: cannot create map file %d %d", wd->coord->y, wd->coord->x ); return; } for ( fy = 0; fy < MAP_SIZE; fy++ ) fprintf( fp, "%s\n", wd->ws_map[fy] ); fclose(fp); } int get_sect( COORD_DATA *coord ) { WILD_DATA *wd; COORD_DATA csect; csect.y = coord->y / MAP_SIZE * MAP_SIZE; csect.x = coord->x / MAP_SIZE * MAP_SIZE; if ( !( wd = wild_sector( csect.y, csect.x ) ) ) wd = load_wildmap_sector( &csect ); csect.y = abs( coord->y - csect.y ); csect.x = abs( coord->x - csect.x ); return ( char_to_sect( wd->ws_map[csect.y][csect.x] ) ); } void put_sect( int y, int x, int nSect, bool upMap ) { WILD_DATA *wd; int ty, tx, fy, fx; ty = y / MAP_SIZE * MAP_SIZE; tx = x / MAP_SIZE * MAP_SIZE; if ( !( wd = wild_sector( ty, tx ) ) ) { log ( "SYSERR: wild sector %d %d not loaded.", y, x ); return; } fy = abs( y - ty ); fx = abs( x - tx ); wd->ws_map[fy][fx] = sect_to_char( nSect ); if ( upMap ) update_sect_file( wd ); } WILD_DATA *get_wd(COORD_DATA *coord) { WILD_DATA *wd = NULL; int y, x, wy, wx; if (!coord) return (NULL); y = coord->y / MAP_SIZE * MAP_SIZE; x = coord->x / MAP_SIZE * MAP_SIZE; wy = y % WDATA_HASH; wx = x % WDATA_HASH; for (wd = kWorld[wy][wx]; wd; wd = wd->next) { if (wd->coord->y == y && wd->coord->x == x) break; } return (wd); } WILD_DATA *wild_sector(int y, int x) { WILD_DATA *wd; int wy = y % WDATA_HASH; int wx = x % WDATA_HASH; for (wd = kWorld[wy][wx]; wd; wd = wd->next) { if (wd->coord->y == y && wd->coord->x == x) break; } return (wd); } void unload_wildmap_sector( WILD_DATA *wd ) { WILD_DATA *temp; int y = wd->coord->y % WDATA_HASH; int x = wd->coord->x % WDATA_HASH; // save life data -- checks are inside save_life() save_life(wd); REMOVE_FROM_LIST( wd, kWorld[y][x], next ); DISPOSE(wd->coord); DISPOSE(wd); } WILD_DATA *load_wildmap_sector( COORD_DATA *coord ) { FILE *fp; WILD_DATA *wd; char fname[128], line[MAP_SIZE+3]; int y, x, ww, wy, wx; y = coord->y / MAP_SIZE * MAP_SIZE; x = coord->x / MAP_SIZE * MAP_SIZE; if ( ( wd = wild_sector(y, x) ) ) return (wd); CREATE( wd, WILD_DATA, 1 ); CREATE( wd->coord, COORD_DATA, 1 ); wd->coord->y = y; wd->coord->x = x; /* read map file */ sprintf( fname, "%smap/%d-%d.map", WLS_PREFIX, y, x ); if ( !( fp = fopen( fname, "r" ) ) ) { log( "SYSERR: load_wildmap_sector() : cannot find map file %d-%d.map", y, x ); return (NULL); } for ( ww = 0; ww < MAP_SIZE && !feof(fp); ww++ ) { get_line( fp, line ); strcpy( wd->ws_map[ww], line ); } fclose(fp); /* add to hash table */ wy = y % WDATA_HASH; wx = x % WDATA_HASH; wd->next = kWorld[wy][wx]; kWorld[wy][wx] = wd; // load life data, or clone base_life_table for wd load_life(wd); return (wd); } /* *************************************************************** */ /* C H E C K S */ /* *************************************************************** */ bool check_coord(int y, int x) { if (y < 0 || y >= WILD_Y) return (FALSE); if (x < 0 || x >= WILD_X) return (FALSE); return (TRUE); } bool invalid_sect( COORD_DATA *coord ) { int nSect = get_sect( coord ); if ( nSect == SECT_ZONE_BORDER ) return ( TRUE ); if ( nSect == SECT_ZONE_INSIDE ) return ( TRUE ); return ( FALSE ); } /* *************************************************************** */ /* R O O M H A N D L I N G */ /* *************************************************************** */ /* find an existing wild room located at "coord" */ ROOM_DATA *get_wild_room( COORD_DATA *coord ) { ROOM_DATA *wRoom; int xHash, yHash; yHash = coord->y % WILD_HASH; xHash = coord->x % WILD_HASH; for ( wRoom = wild[yHash][xHash]; wRoom; wRoom = wRoom->next ) { if ( wRoom->coord->y == coord->y && wRoom->coord->x == coord->x ) return ( wRoom ); } return (NULL); } /* create a wild room located at "coord" */ ROOM_DATA *create_wild_room( COORD_DATA *coord, bool Static ) { ROOM_DATA *wRoom; int xHash, yHash; /* sanity checks */ if ((wRoom = get_wild_room(coord)) != NULL) { if (Static && !ROOM_FLAGGED(wRoom, ROOM_WILD_STATIC)) { SET_BIT(ROOM_FLAGS(wRoom), ROOM_WILD_STATIC); SET_BIT(ROOM_FLAGS(wRoom), ROOM_NOMAGIC); } return (wRoom); } /* create the new room */ wRoom = new_room(); /* Initialize vars */ wRoom->sector_type = get_sect(coord); wRoom->zone = WILD_ZONE; CREATE(wRoom->coord, COORD_DATA, 1); wRoom->coord->y = coord->y; wRoom->coord->x = coord->x; if (Static) { SET_BIT(ROOM_FLAGS(wRoom), ROOM_WILD_STATIC); SET_BIT(ROOM_FLAGS(wRoom), ROOM_NOMAGIC); } /* check for portal stone to place in */ wRoom->portal_stone = get_pstone_by_coord( coord ); /* add to the hash table */ yHash = coord->y % WILD_HASH; xHash = coord->x % WILD_HASH; wRoom->next = wild[yHash][xHash]; wild[yHash][xHash] = wRoom; update_wild_life(coord->y, coord->x, WS_ADD_ROOM); loaded_rooms++; return (wRoom); } /* delete a wild room */ int destroy_wild_room( ROOM_DATA *wRoom ) { ROOM_DATA *temp; int xHash, yHash; /* sanity checks */ if ( !wRoom || !IS_WILD( wRoom ) ) return (0); if ( !wRoom->coord ) return (0); if ( !get_wild_room(wRoom->coord) ) return (0); if ( wRoom->buildings ) return (0); if ( wRoom->people ) return (0); if ( wRoom->ships ) return (0); if ( wRoom->vehicles ) return (0); if ( wRoom->ferryboat ) return (0); if ( wRoom->first_content ) return (0); /* remove all exits to this room */ remove_exit_to_room( wRoom ); update_wild_life( wRoom->coord->y, wRoom->coord->x, WS_REM_ROOM ); /* remove from the hash table */ yHash = wRoom->coord->y % WILD_HASH; xHash = wRoom->coord->x % WILD_HASH; REMOVE_FROM_LIST( wRoom, wild[yHash][xHash], next ); /* destroy room */ free_room(wRoom); /* nullify all pointers */ wRoom->buildings = NULL; wRoom->ships = NULL; wRoom->vehicles = NULL; wRoom->ferryboat = NULL; wRoom->first_content = NULL; wRoom->last_content = NULL; wRoom->people = NULL; wRoom->ex_description = NULL; wRoom->first_exit = NULL; wRoom->last_exit = NULL; wRoom->func = NULL; wRoom->coord = NULL; wRoom->next = NULL; DISPOSE( wRoom ); loaded_rooms--; return (1); } void wild_remove_update( void ) { WILD_REMOVE *wrem, *wrem_next, *temp; if ( !wild_remove_list ) return; for ( wrem = wild_remove_list; wrem; wrem = wrem_next ) { wrem_next = wrem->next; if ( wrem->timer-- <= 0 ) { if ( destroy_wild_room( wrem->wRoom ) ) { REMOVE_FROM_LIST( wrem, wild_remove_list, next ); DISPOSE( wrem ); } else { if ( wrem->wRoom ) { log( "SYSERR: Unable to remove wild room %d %d -- will try next pass.", wrem->wRoom->coord->y, wrem->wRoom->coord->x ); } wrem->timer = 1; } } } } void wild_remove_enqueue( ROOM_DATA *wRoom ) { WILD_REMOVE *wrem; CREATE( wrem, WILD_REMOVE, 1 ); wrem->wRoom = wRoom; wrem->timer = 3; // 90+30 seconds if ( SECT(wRoom) == SECT_SEA ) wrem->timer = 1; // add to the list wrem->next = wild_remove_list; wild_remove_list = wrem; SET_BIT( ROOM_FLAGS( wRoom ), ROOM_WILD_REMOVE ); } void wild_remove_dequeue( ROOM_DATA *wRoom ) { WILD_REMOVE *wrem, *wrem_next, *temp; if ( !wild_remove_list ) return; if ( !wRoom || !IS_WILD( wRoom) ) return; if ( !wRoom->coord ) return; if ( !ROOM_FLAGGED( wRoom, ROOM_WILD_REMOVE ) ) return; for ( wrem = wild_remove_list; wrem; wrem = wrem_next ) { wrem_next = wrem->next; if ( wrem->wRoom == wRoom ) { REMOVE_BIT( ROOM_FLAGS(wRoom), ROOM_WILD_REMOVE ); REMOVE_FROM_LIST( wrem, wild_remove_list, next ); DISPOSE( wrem ); } } } void wild_check_for_remove( ROOM_DATA *wRoom ) { if ( !wRoom || !IS_WILD( wRoom ) ) return; if ( ROOM_FLAGGED( wRoom, ROOM_WILD_STATIC ) || ROOM_FLAGGED( wRoom, ROOM_WILD_REMOVE ) ) return; if ( !wRoom->coord ) return; if ( !get_wild_room( wRoom->coord ) ) return; if ( wRoom->people ) return; if ( wRoom->first_content ) return; if ( wRoom->buildings ) return; if ( wRoom->ships ) return; if ( wRoom->vehicles ) return; if ( wRoom->ferryboat ) return; wild_remove_enqueue( wRoom ); } /* *************************************************************** */ /* E X I T H A N D L I N G */ /* *************************************************************** */ void remove_exit_to_room(ROOM_DATA *wRoom) { EXIT_DATA *pexit, *p_next, *nexit; ROOM_DATA *nRoom; for (pexit = wRoom->first_exit; pexit; pexit = p_next) { p_next = pexit->next; nRoom = pexit->to_room; nexit = pexit->rexit; if (nRoom && nexit) extract_exit(nRoom, nexit); } } void setup_wild_static( ROOM_DATA *wRoom, ROOM_DATA *zRoom ) { ROOM_DATA *nRoom; COORD_DATA around; int dir; for ( around.y = wRoom->coord->y - 1; around.y < wRoom->coord->y + 2; around.y++ ) { for ( around.x = wRoom->coord->x - 1; around.x < wRoom->coord->x + 2; around.x++ ) { if ( invalid_sect( &around ) ) continue; if ( ( nRoom = get_wild_room( &around ) ) == NULL ) { nRoom = create_wild_room( &around, TRUE ); } else { SET_BIT( ROOM_FLAGS( nRoom ), ROOM_WILD_STATIC ); SET_BIT( ROOM_FLAGS( nRoom ), ROOM_NOMAGIC ); } } } for ( dir = 0; dir < NUM_OF_DIRS; dir++ ) { if ( dir == UP || dir == DOWN ) continue; if ( ( nRoom = find_wild_room( wRoom, dir, FALSE ) ) ) { if ( !get_exit_to_coord( wRoom, dir, nRoom->coord ) ) make_exit( wRoom, nRoom, dir ); if ( !get_exit_to( nRoom, rev_dir[dir], zRoom->number ) ) make_exit( nRoom, zRoom, rev_dir[dir] ); } } } /* *************************************************************** */ /* D I R E C T I O N S */ /* *************************************************************** */ COORD_DATA *make_step( COORD_DATA *target, int dir ) { COORD_DATA *coord; CREATE(coord, COORD_DATA, 1); coord->y = target->y; coord->x = target->x; switch (dir) { case NORTH: if (--coord->y < 0) coord->y = WILD_Y - 1; break; case EAST: if (++coord->x >= WILD_X) coord->x = 0; break; case SOUTH: if (++coord->y >= WILD_Y) coord->y = 0; break; case WEST: if (--coord->x < 0) coord->x = WILD_X - 1; break; case NORTHEAST: if (--coord->y < 0) coord->y = WILD_Y - 1; if (++coord->x > WILD_X) coord->x = 0; break; case SOUTHEAST: if (++coord->y >= WILD_Y) coord->y = 0; if (++coord->x >= WILD_X) coord->x = 0; break; case SOUTHWEST: if (++coord->y >= WILD_Y) coord->y = 0; if (--coord->x < 0) coord->x = WILD_X - 1; break; case NORTHWEST: if (--coord->y < 0) coord->y = WILD_Y - 1; if (--coord->x < 0) coord->x = WILD_X - 1; break; default: // handle UP & DOWN too DISPOSE(coord); break; } return (coord); } COORD_DATA *check_next_step( COORD_DATA *step, int dir ) { COORD_DATA *coord; if (!(coord = make_step(step, dir))) return (NULL); if (invalid_sect(coord)) return (NULL); return (coord); } /* * given a direction, return the target room */ ROOM_DATA *find_wild_room( ROOM_DATA *wRoom, int dir, bool makenew ) { COORD_DATA *coord; ROOM_DATA *newRoom; if (!( coord = make_step(wRoom->coord, dir))) return (NULL); if (invalid_sect(coord)) return (NULL); newRoom = get_wild_room(coord); if (!makenew) return (newRoom); if (!newRoom) newRoom = create_wild_room(coord, FALSE); make_exit(wRoom, newRoom, dir); make_exit(newRoom, wRoom, rev_dir[dir]); return (newRoom); } /* *************************************************************** */ /* W I L D E R N E S S */ /* *************************************************************** */ void load_sectors( void ) { FILE *fl; char fname[128], line[256]; int nr = -1, last; log(" Loading sectors descriptions."); sprintf(fname, "%s", SECT_FILE); /* Si legge le descrizioni base dei vari settori */ if (!(fl = fopen(fname, "r"))) { if (errno != ENOENT) { log("fatal error opening: %s", fname); exit(1); } else { log("%s file does not exist", fname); exit(1); } } last = 0; for (;;) { if (!get_line(fl, line)) { log("SYSERR: Format error in %s file after #%d (file not terminated with '$'?)\n", fname, nr); exit(1); } if (*line == '$') break; if (*line == '*') continue; if (*line == '#') { last = nr; if (sscanf(line, "#%d", &nr) != 1) { log("SYSERR: Format error in %s after #%d\n", fname, last); exit(1); } CREATE( terrain_type[nr], TERRAIN_DATA, 1 ); terrain_type[nr]->name = fread_string(fl, buf2); terrain_type[nr]->description = fread_string(fl, buf2); terrain_type[nr]->movement_loss = fread_number(fl); terrain_type[nr]->map = str_dup( fread_word( fl ) ); terrain_type[nr]->map2 = str_dup( fread_word( fl ) ); terrain_type[nr]->mapbw = str_dup( fread_word( fl ) ); } } fclose( fl ); /* * check for submaps * * if it's not present the 0-0.map file, it will regenerate all submaps */ sprintf(fname, "%smap/0-0.map", WLS_PREFIX); if (!(fl = fopen(fname, "r"))) { void parse_bmp(void); void create_submaps(void); log(" Wilderness map not available - regenerating submaps (this will take a while)"); parse_bmp(); create_submaps(); log(" Done."); } else fclose(fl); } /* *************************************************************** */ /* Character map & movement handling */ /* *************************************************************** */ void generate_ch_map( CHAR_DATA *ch, COORD_DATA *coord ) { FILE *fl[3]; char fname[80], line[3][MAP_SIZE+3]; char ch_wild[MAP_Y][MAP_X+3]; int xfl[3], yfl[3], xx, yy, filey, curry; if ( coord->y < 0 || coord->y > WILD_Y || coord->x < 0 || coord->x > WILD_X ) return; // quadrato centrale yfl[1] = coord->y / MAP_SIZE * MAP_SIZE; xfl[1] = coord->x / MAP_SIZE * MAP_SIZE; // quadrato superiore sinistro if ( yfl[1] - MAP_SIZE < 0 ) yfl[0] = WILD_Y - MAP_SIZE; else yfl[0] = yfl[1] - MAP_SIZE; if ( xfl[1] - MAP_SIZE < 0 ) xfl[0] = WILD_X - MAP_SIZE; else xfl[0] = xfl[1] - MAP_SIZE; // quadrato inferiore destro if ( yfl[1] + MAP_SIZE > WILD_Y - MAP_SIZE ) yfl[2] = 0; else yfl[2] = yfl[1] + MAP_SIZE; if ( xfl[1] + MAP_SIZE > WILD_X - MAP_SIZE ) xfl[2] = 0; else xfl[2] = xfl[1] + MAP_SIZE; curry = 0; for ( filey = 0; filey < 3; filey++ ) { for ( xx = 0; xx < 3; xx++ ) { sprintf( fname, "%smap/%d-%d.map", WLS_PREFIX, yfl[filey], xfl[xx] ); if ( !( fl[xx] = fopen( fname, "r" ) ) ) { log( "SYSERR: generate_ch_map() : cannot open map file %d-%d.map", xfl, yfl ); send_to_char( "Al momento non e' possibile.. riprova piu' tardi.\r\n", ch ); return; } } for ( yy = 0; yy < MAP_SIZE; yy++ ) { get_line( fl[0], line[0] ); get_line( fl[1], line[1] ); get_line( fl[2], line[2] ); sprintf( ch_wild[yy+curry], "%s%s%s", line[0], line[1], line[2] ); } curry += MAP_SIZE; for ( xx = 0; xx < 3; xx++ ) { fclose ( fl[xx] ); } } /* generate char map */ if ( !ch->player_specials->wildmap ) { CREATE( ch->player_specials->wildmap, char *, MAP_Y ); for ( yy = 0; yy < MAP_Y; yy++ ) { CREATE( ch->player_specials->wildmap[yy], char, MAP_X ); ch->player_specials->wildmap[yy] = NULL; } } for ( yy = 0; yy < MAP_Y; yy++ ) { if ( ch->player_specials->wildmap[yy] ) DISPOSE( ch->player_specials->wildmap[yy] ); ch->player_specials->wildmap[yy] = str_dup( ch_wild[yy] ); } } /* * load wild sector submaps & build char map */ void wild_map_load( CHAR_DATA *ch, COORD_DATA *coord ) { load_wildmap_sector(coord); if (!IS_NPC(ch)) generate_ch_map(ch, coord); } /* * update wild sector usage */ void update_wild_life( int y, int x, int oper ) { WILD_DATA *wd; int ty, tx; ty = y / MAP_SIZE * MAP_SIZE; tx = x / MAP_SIZE * MAP_SIZE; if ( !( wd = wild_sector( ty, tx ) ) ) { log( "SYSERR: update_wild_life() attempting update life for non-loaded sector %d %d.", y, x ); return; } switch ( oper ) { case WS_ADD_ROOM: wd->num_of_rooms++; break; case WS_REM_ROOM: wd->num_of_rooms--; /* no rooms here.. can be unload */ if ( wd->num_of_rooms == 0 ) unload_wildmap_sector( wd ); break; } } /* * check if a character, vehicle, ship or ferryboat * move between two different wild sectors */ void check_wild_move(CHAR_DATA *ch, VEHICLE_DATA *vehicle, SHIP_DATA *ship, FERRY_DATA *ferry, ROOM_DATA *pRoomFrom, ROOM_DATA *pRoomTo) { CHAR_DATA *ppl; int quadx[2], quady[2]; if (!pRoomFrom || !pRoomTo) return; if (!IS_WILD(pRoomTo)) return; if (!IS_WILD(pRoomFrom)) { if (ch) wild_map_load(ch, pRoomTo->coord); else if (ship) { for ( ppl = ship->people; ppl; ppl = ppl->next_in_vehicle ) wild_map_load( ppl, pRoomTo->coord ); } else if (vehicle) { if (vehicle->wagoner) wild_map_load(vehicle->wagoner, pRoomTo->coord); for (ppl = vehicle->people; ppl; ppl = ppl->next_in_vehicle) wild_map_load(ppl, pRoomTo->coord); } else if (ferry) { for ( ppl = ferry->room->people; ppl; ppl = ppl->next_in_room ) wild_map_load( ppl, pRoomTo->coord ); } return; } quady[0] = GET_RY(pRoomFrom) / MAP_SIZE * MAP_SIZE; quadx[0] = GET_RX(pRoomFrom) / MAP_SIZE * MAP_SIZE; quady[1] = GET_RY(pRoomTo) / MAP_SIZE * MAP_SIZE; quadx[1] = GET_RX(pRoomTo) / MAP_SIZE * MAP_SIZE; if (quadx[0] != quadx[1] || quady[0] != quady[1]) { if (ch) wild_map_load(ch, pRoomTo->coord); else if (ship) { for ( ppl = ship->people; ppl; ppl = ppl->next_in_vehicle ) wild_map_load( ppl, pRoomTo->coord ); } else if (vehicle) { if (vehicle->wagoner) wild_map_load(vehicle->wagoner, pRoomTo->coord); for (ppl = vehicle->people; ppl; ppl = ppl->next_in_vehicle) wild_map_load(ppl, pRoomTo->coord); } else if (ferry) { for ( ppl = ferry->room->people; ppl; ppl = ppl->next_in_room ) wild_map_load( ppl, pRoomTo->coord ); } } } /* =============================================================== */ /* Immortal Commands */ /* =============================================================== */ void do_stat_wild(CHAR_DATA *ch) { WILD_DATA *wd; char wbuf[MAX_STRING_LENGTH]; int y, x; strcpy( wbuf, "List of Wilderness Sectors loaded:\r\n" ); for ( y = 0; y < WDATA_HASH; y++ ) { for ( x = 0; x < WDATA_HASH; x++ ) { if ( kWorld[y][x] ) { for ( wd = kWorld[y][x]; wd; wd = wd->next ) { sprintf( wbuf + strlen(wbuf), " Coord: [%d] [%d] Life: %d\r\n", wd->coord->y, wd->coord->x, wd->num_of_rooms ); } } } } send_to_char( wbuf, ch ); } ACMD(do_wildlist) { ROOM_DATA *pRoom; char wbuf[MAX_STRING_LENGTH]; int y, x; strcpy(wbuf, "List of Wilderness Rooms loaded:\r\n"); for (y = 0; y < WILD_HASH; y++) { for (x = 0; x < WILD_HASH; x++) { for (pRoom = wild[y][x]; pRoom; pRoom = pRoom->next) sprintf(wbuf + strlen(wbuf), " Coord: [%d] [%d] Sector: %s\r\n", pRoom->coord->y, pRoom->coord->x, terrain_type[pRoom->sector_type]->name); } } page_string(ch->desc, wbuf, 1); }