2008-12-22 14:13:15 +00:00
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers , whose names
* are too numerous to list here . Please refer to the COPYRIGHT
* file distributed with this source distribution .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
2014-02-18 01:34:24 +00:00
*
2008-12-22 14:13:15 +00:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2014-02-18 01:34:24 +00:00
*
2008-12-22 14:13:15 +00:00
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*
*/
2009-01-02 16:52:38 +00:00
# ifdef ENABLE_SAGA2
2008-12-22 14:13:15 +00:00
// HRS Resource file management module (SAGA 2, used in DINO and FTA2)
# include "saga/saga.h"
# include "saga/actor.h"
# include "saga/animation.h"
# include "saga/interface.h"
# include "saga/music.h"
# include "saga/resource.h"
# include "saga/scene.h"
# include "saga/sndres.h"
2009-01-29 22:13:01 +00:00
# include "engines/advancedDetector.h"
2008-12-23 16:29:26 +00:00
# include "common/endian.h"
2008-12-22 14:13:15 +00:00
namespace Saga {
2014-07-20 18:19:20 +00:00
void ResourceContext_HRS : : readCategory ( ResourceData & element ) {
element . id = _file . readUint32BE ( ) ;
element . offset = _file . readUint32LE ( ) ;
element . size = _file . readUint32LE ( ) ;
element . category = 0 ;
debug ( 3 , " Category: id %u, offset %u, size %u " , element . id , ( uint ) element . offset , ( uint ) element . size ) ;
}
void ResourceContext_HRS : : readEntry ( ResourceData & element ) {
element . id = _file . readUint32BE ( ) ;
element . offset = _file . readUint32LE ( ) ;
element . size = _file . readUint32LE ( ) ;
element . category = getCategory ( _file . pos ( ) ) ;
2009-12-04 17:52:42 +00:00
debug ( 3 , " Entry: id %u, offset %u, size %u " , element . id , ( uint ) element . offset , ( uint ) element . size ) ;
2008-12-25 18:10:21 +00:00
}
2014-07-20 18:19:20 +00:00
uint32 ResourceContext_HRS : : getCategory ( uint32 resourceOffset ) {
for ( int i = _categories . size ( ) - 1 ; i > = 0 ; - - i ) {
if ( resourceOffset > = _categories [ i ] . offset )
return _categories [ i ] . id ;
}
error ( " Unknown category for offset %d " , resourceOffset ) ;
}
static bool categorySortHelper ( const ResourceData & r1 , const ResourceData & r2 ) {
return r1 . offset < r2 . offset ;
}
2009-12-04 17:52:42 +00:00
bool ResourceContext_HRS : : loadResV2 ( uint32 contextSize ) {
ResourceData origin ;
2008-12-25 15:19:33 +00:00
uint32 firstEntryOffset ;
uint32 tableSize ;
2008-12-25 12:09:24 +00:00
int i , count ;
2008-12-25 15:19:33 +00:00
const uint32 resourceSize = 4 + 4 + 4 ; // id, size, offset
2008-12-23 16:29:26 +00:00
2009-12-04 17:52:42 +00:00
debug ( 3 , " Context %s ===== " , _fileName ) ;
_file . seek ( 0 , SEEK_SET ) ;
2009-01-01 15:06:43 +00:00
2014-07-20 18:19:20 +00:00
readCategory ( origin ) ;
2008-12-23 16:29:26 +00:00
// Check if the file is valid
2011-04-12 14:53:15 +00:00
if ( origin . id ! = MKTAG ( ' H ' , ' R ' , ' E ' , ' S ' ) ) { // header
2008-12-23 16:29:26 +00:00
return false ;
}
2008-12-25 15:19:33 +00:00
// Read offset of first entry
2009-12-04 17:52:42 +00:00
_file . seek ( origin . offset - sizeof ( uint32 ) , SEEK_SET ) ;
firstEntryOffset = _file . readUint32LE ( ) ;
2008-12-23 16:29:26 +00:00
2008-12-25 15:19:33 +00:00
// Allocate buffers for table, categories and data
2009-12-04 17:52:42 +00:00
_categories . resize ( origin . size / resourceSize ) ;
tableSize = origin . offset - firstEntryOffset - sizeof ( uint32 ) ;
_table . resize ( tableSize / resourceSize ) ;
2008-12-25 12:09:24 +00:00
2008-12-25 15:19:33 +00:00
// Read categories
2009-12-04 17:52:42 +00:00
count = origin . size / resourceSize ;
2014-07-20 18:19:20 +00:00
debug ( 3 , " File: %s, categories: %d ===== " , _file . getName ( ) , count ) ;
2008-12-25 12:09:24 +00:00
for ( i = 0 ; i < count ; i + + ) {
2014-07-20 18:19:20 +00:00
readCategory ( _categories [ i ] ) ;
//uint32 id = _categories[i].id;
//debug("%i: %c%c%c%c, offset: %d, size: %d", i, (id >> 24), (id >> 16) & 0xFF, (id >> 8) & 0xFF, id & 0xFF, _categories[i].offset, _categories[i].size);
2008-12-25 12:09:24 +00:00
}
2014-07-20 18:19:20 +00:00
Common : : sort ( _categories . begin ( ) , _categories . end ( ) , categorySortHelper ) ;
2009-12-04 17:52:42 +00:00
_file . seek ( firstEntryOffset , SEEK_SET ) ;
2008-12-25 12:09:24 +00:00
2008-12-25 15:19:33 +00:00
// Read table entries
count = tableSize / resourceSize ;
2014-07-20 18:19:20 +00:00
debug ( 3 , " File: %s, entries: %d ===== " , _file . getName ( ) , count ) ;
2008-12-25 12:09:24 +00:00
for ( i = 0 ; i < count ; i + + ) {
2014-07-20 18:19:20 +00:00
readEntry ( _table [ i ] ) ;
//debug("%i: offset: %d, size: %d", i, _table[i].offset, _table[i].size);
2008-12-25 12:09:24 +00:00
}
2008-12-22 14:13:15 +00:00
return true ;
}
} // End of namespace Saga
2009-01-02 16:52:38 +00:00
# endif