/** * \brief Setup map files for decoding. * \param[in] headFileName Name of file with header offsets. * \param[in] mapFileName Name of file with map data. * \param[in,out] RLEWtag Run length encoded word tag. * \param[in,out] nTotalMaps Number of maps in file. * \return On success true, otherwise false. * \note Must call function MapFile_Shutdown() when done. */ PUBLIC wtBoolean MapFile_Setup( const char *headFileName, const char *mapFileName, W16 *RLEWtag, W32 *nTotalMaps ) { FILE *fileHandle; SW32 fileSize; char *tempFileName; W32 TotalMaps; tempFileName = (char *) MM_MALLOC( strlen( headFileName ) + 1 ); if( tempFileName == NULL ) { return false; } // // Load map head file to get offsets and tile info. // wt_strlcpy( tempFileName, headFileName, strlen( headFileName ) + 1 ); fileHandle = fopen( wt_strupr( tempFileName ), "rb" ); if( fileHandle == NULL ) { fileHandle = fopen( wt_strlwr( tempFileName ), "rb" ); if( fileHandle == NULL ) { fprintf( stderr, "Could not open file (%s) for read!\n", tempFileName ); MM_FREE( tempFileName ); return false; } } fileSize = FS_FileLength( fileHandle ); fread( RLEWtag, 2, 1, fileHandle ); for( TotalMaps = 0 ; TotalMaps < fileSize ; ++TotalMaps ) { fread( &headerOffsets[ TotalMaps ], 4, 1, fileHandle ); if( ! headerOffsets[ TotalMaps ] ) { break; } } fclose( fileHandle ); MM_FREE( tempFileName ); tempFileName = (char *) MM_MALLOC( strlen( mapFileName ) + 1 ); wt_strlcpy( tempFileName, mapFileName, strlen( mapFileName ) + 1 ); // // Open map data file. // map_file_handle = fopen( wt_strupr( tempFileName ), "rb"); if( NULL == map_file_handle ) { map_file_handle = fopen( wt_strlwr( tempFileName ), "rb"); if( NULL == map_file_handle ) { MM_FREE( tempFileName ); return false; } } *nTotalMaps = TotalMaps; MM_FREE( tempFileName ); return true; }
/** * \brief Setup page file for decoding. * \param[in] pagefname Source buffer to convert from * \param[out] nBlocks Destination buffer to convert to. * \param[out] SpriteStart Offset index for sprite data. * \param[out] SoundStart Offset index for sound data. * \return On success true, otherwise false. */ PUBLIC wtBoolean PageFile_Setup( const char *pagefname, W32 *nBlocks, W32 *SpriteStart, W32 *SoundStart ) { W32 i; W32 size; void *buf = NULL; W32 *offsetptr; char *temp_fileName = NULL; PageList_t *page; W16 *lengthptr; W16 tval; W32 PMNumBlocks; W32 PMSpriteStart; W32 PMSoundStart; if( ! pagefname || ! *pagefname ) { fprintf( stderr, "[PageFile_Setup]: Invalid file name\n" ); goto PMSetupFailure; } temp_fileName = (char *) MM_MALLOC( strlen( pagefname ) + 1 ); if( temp_fileName == NULL ) { goto PMSetupFailure; } wt_strlcpy( temp_fileName, pagefname, strlen( pagefname ) + 1 ); /* Open page file */ file_handle_page = fopen( wt_strupr( temp_fileName ), "rb" ); if( file_handle_page == NULL ) { file_handle_page = fopen( wt_strlwr( temp_fileName ), "rb" ); if( file_handle_page == NULL ) { fprintf( stderr, "Could not open file (%s) for read!\n", temp_fileName ); goto PMSetupFailure; } } /* Read in header variables */ fread( &tval, sizeof( W16 ), 1, file_handle_page ); PMNumBlocks = LittleShort( tval ); fread( &tval, sizeof( W16 ), 1, file_handle_page ); PMSpriteStart = LittleShort( tval ); fread( &tval, sizeof( W16 ), 1, file_handle_page ); PMSoundStart = LittleShort( tval ); /* Allocate and clear the page list */ PMPages = (PageList_t *) MM_MALLOC( sizeof( PageList_t ) * PMNumBlocks ); if( PMPages == NULL ) { goto PMSetupFailure; } memset( PMPages, 0, sizeof( PageList_t ) * PMNumBlocks ); /* Read in the chunk offsets */ size = sizeof( W32 ) * PMNumBlocks; buf = MM_MALLOC( size ); if( buf == NULL ) { goto PMSetupFailure; } if( fread( buf, 1, size, file_handle_page ) == 0 ) { fprintf( stderr, "Could not read chunk offsets from file (%s)\n", temp_fileName ); } offsetptr = (PW32) buf; for( i = 0, page = PMPages; i < PMNumBlocks; i++, page++ ) { page->offset = LittleLong( *offsetptr++ ); } MM_FREE( buf ); /* Read in the chunk lengths */ size = sizeof( W16 ) * PMNumBlocks; buf = MM_MALLOC( size ); if( buf == NULL ) { goto PMSetupFailure; } if( fread( buf, 1, size, file_handle_page ) == 0 ) { fprintf( stderr, "Could not read chunk lengths from file (%s)\n", temp_fileName ); } lengthptr = (PW16)buf; for( i = 0, page = PMPages ; i < PMNumBlocks ; ++i, page++ ) { page->length = LittleShort( *lengthptr++ ); } MM_FREE( buf ); MM_FREE( temp_fileName ); *nBlocks = PMNumBlocks; *SpriteStart = PMSpriteStart; *SoundStart = PMSoundStart; return true; PMSetupFailure: MM_FREE( temp_fileName ); MM_FREE( PMPages ); MM_FREE( buf ); return false; }
/** * \brief Setup for audio decoding. * \param[in] aheadfname Audio header file name. * \param[in] audfname Audio file name. * \return On success true, otherwise false. */ PUBLIC wtBoolean AudioFile_Setup( const char *aheadfname, const char *audfname ) { char tempFileName[ 1024 ]; FILE *handle; SW32 length; SW32 count; /* Number of bytes read from file */ if( ! aheadfname || ! *aheadfname || ! audfname || ! *audfname ) { fprintf( stderr, "[AudioFile_Setup]: NULL file name!\n" ); return false; } // // Load audiohed.XXX (offsets and lengths for audio file) // wt_strlcpy( tempFileName, aheadfname, sizeof( tempFileName ) ); handle = fopen( wt_strupr( tempFileName ), "rb" ); if( handle == NULL ) { handle = fopen( wt_strlwr( tempFileName ), "rb" ); if( handle == NULL ) { fprintf( stderr, "Could not open file (%s) for read!\n", tempFileName ); return false; } } length = FS_FileLength( handle ); if( length < 4 ) { fclose( handle ); fprintf( stderr, "[AudioFile_Setup]: Incorrect audio header size on file: %s\n", tempFileName ); return false; } audiostarts = (PW32) MM_MALLOC( length ); if( audiostarts == NULL ) { fclose( handle ); return false; } count = fread( audiostarts, 1, length, handle ); if( count != length ) { fclose( handle ); fprintf( stderr, "[AudioFile_Setup]: Read error on file: (%s)", tempFileName ); return false; } fclose( handle ); // // Open the Audio data file // wt_strlcpy( tempFileName, audfname, sizeof( tempFileName ) ); audiohandle = fopen( wt_strupr( tempFileName ), "rb" ); if( audiohandle == NULL ) { audiohandle = fopen( wt_strlwr( tempFileName ), "rb" ); if( audiohandle == NULL ) { fprintf( stderr, "[AudioFile_Setup]: Could not open file (%s) for read!\n", tempFileName ); return false; } } return true; }