void load_world()
{
FILE * ptrList;
FILE * ptrZone;
char * zName;
char zList[20];
log_string( "Ready to load the zone files" );
sprintf( zList, "../zones/zone.lst" );
if ( ( ptrList = fopen( zList, "r" ) ) == NULL )
{
bug( "LOAD_WORLD: Error opening zone list." );
abort();
}
log_string( "Zone list loaded." );
for ( ; ; )
{
zName = fread_word( ptrList );
if ( zName[0] == '$' )
break;
if ( ( ptrZone = fopen( zName, "r" ) ) == NULL )
{
bug( "Cannot open zone %s.", zName );
abort();
}
for ( ;; )
{
char * section;
section = fread_word( ptrZone );
if ( !strcmp( section, "#0" ) ) break;
bug( section );
if ( section[0] != '#' )
{
bug( "LOAD_WORLD: Bad format detected." );
abort();
}
if ( !strcmp( section, "#0" ) ) break;
else if ( !strcmp( section, "#ZONE" ) ) load_zone( ptrZone );
else if ( !strcmp( section, "#ROOM" ) ) load_room( ptrZone );
else
{
bug( "LOAD_WORLD: Bad section name" );
abort();
}
}
fclose(ptrZone);
log_string( "Zone file closed" );
}
fclose(ptrList);
log_string( "List file closed." );
return;
}
void load_zone( FILE *fp )
{
DATA_ZONE *pZone;
if ( (pZone = malloc(sizeof(*pZone))) == NULL )
{
bug( "LOAD_ZONE: Cannot allocate memory." );
abort();
}
pZone->name = fread_string(fp);
pZone->builder = fread_string(fp);
if ( zone_first == NULL ) zone_first = pZone;
if ( zone_last != NULL ) zone_last->next = pZone;
zone_last = pZone;
pZone->next = NULL;
log_string( "Zone info for '%s' loaded.", pZone->name );
return;
}
void load_room( FILE *fp )
{
DATA_ROOM * pRoom;
int door;
log_string( "Ready to load rooms." );
if ( ( pRoom = malloc(sizeof(*pRoom))) == NULL )
{
bug( "LOAD_ROOM: Cannot allocate memory." );
abort();
}
pRoom->rmId = fread_number(fp);
pRoom->rmName = fread_string(fp);
pRoom->rmDesc = fread_string(fp);
pRoom->rmTerrain = fread_number(fp);
log_string( "Room '%s' loaded.", pRoom->rmName );
for ( door = 0; door <= 5; door++ ) pRoom->exit[door] = NULL;
for ( ;; )
{
DATA_EXIT * pExit;
char letter;
int dir;
if ( ( pExit = malloc(sizeof(*pExit))) == NULL )
{
bug( "LOAD_ROOM: Cannot allocate exit memory." );
abort();
}
letter = fread_letter(fp);
if ( letter == 'S' ) break;
else if ( letter == 'D' )
{
dir = fread_number(fp);
pExit->exDesc = fread_string(fp);
pExit->tRoom = getRoomId(fread_number(fp));
}
}
if ( room_first == NULL ) room_first = pRoom;
if ( room_last != NULL ) room_last->next = pRoom;
room_last = pRoom;
pRoom->next = NULL;
fclose(fp);
return;
}
DATA_ROOM *getRoomId( sh_int id )
{
DATA_ROOM *sRoom;
for ( sRoom = room_last; sRoom != NULL; sRoom = sRoom->next )
{
if ( sRoom->rmId == id )
return sRoom;
}
return NULL;
}
dChar->room = getRoomId( ROOM_START );
I can get it to load the zone list, the zone info, and a room, but I can't get it to end properly.
Here's the code that's hemming it up:
and here's the zone file:
And here's the log/buf files
I've spent 3 days looking at this code, and can't figure it out. I know that when someone points it out to me, it's gonna be a boneheaded mistake, but *shrugs* I wanna get this done, so I can move on to the next steps.