/* * Seven Kingdoms: Ancient Adversaries * * Copyright 1997,1998 Enlight Software Ltd. * * 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. * * 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. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ //Filename : ORES.CPP //Description : Resource library handling object #include #include #include #include //------------ Format of RES file -------------// // // In the resource file, contain many data unit. // // = no. of data records in this RES file // // Index area // = offset of corresponding data unit in this file // . // . // = the last index is a virtual index which is used to calculate // the size of the last data unit // // Data area // = data // //--------------------------------------------- // // size of data unit = next offset - current offset // //---------------------------------------------// //---------- Begin of function Resource::init ----------// // // resName = name of the resource file (e.g. "GIF.RES") // readAll = whether read all data into the buffer or read one each time // [int] useCommonBuf = whether use the common buffer to store the data or not // (default:0) // void Resource::init(char* resName, int readAll, int useCommonBuf) { if( init_flag ) deinit(); //-------------------------------------------// long dataSize; file_open(resName); read_all = readAll; use_common_buf = useCommonBuf; data_buf = NULL; data_buf_size = 0 ; rec_count = file_get_short(); cur_rec_no = -1; //---------- Read in record index -------------// index_buf = (long*) mem_add( (rec_count+1) * sizeof(long) ); // rec_count+1 is the last index pointer for calculating last record size file_read( index_buf, sizeof(long) * (rec_count+1) ); //---------- Read in record data -------------// if( read_all ) { dataSize = index_buf[rec_count] - index_buf[0]; data_buf = mem_add( dataSize ); file_read( data_buf, dataSize ); file_close(); } else { if( use_common_buf ) data_buf = sys.common_data_buf; } init_flag = 1; } //----------- End of function Resource::init -------------// //---------- Begin of function Resource::deinit ---------// // void Resource::deinit() { if( init_flag ) { if( index_buf ) { mem_del(index_buf); index_buf = NULL; } if( data_buf && data_buf != sys.common_data_buf ) { mem_del(data_buf); data_buf=NULL; } if( !read_all ) file_close(); init_flag=0; } } //----------- End of function Resource::deinit ------------// //---------- Begin of function Resource::read ----------// // // Read in data from the resource file and store in an the buffer of this class // // The index field of the current record in the database object is // used to locate the data in the resource file. // // Syntax : read(int recNo) // // [int] recNo = the record no of the data going to read // (default : current record no.) // // Return : data pointer // NULL if the record has not index to data // char* Resource::read(int recNo) { err_when( !init_flag ); unsigned dataSize; if( recNo < 1 ) recNo = cur_rec_no; err_when( recNo < 1 || recNo > rec_count ); if( recNo < 1 || recNo > rec_count ) // when no in debug mode, err_when() will be removed return NULL; //------ all data pre-loaded to memory ------// if( read_all ) return data_buf + index_buf[recNo-1] - index_buf[0]; //------ all data NOT pre-loaded to memory -------// if( recNo == cur_rec_no && !use_common_buf ) return data_buf; dataSize = index_buf[recNo] - index_buf[recNo-1]; err_when( use_common_buf && dataSize > COMMON_DATA_BUF_SIZE ); if( !use_common_buf && data_buf_size < dataSize ) data_buf = mem_resize( data_buf, dataSize ); data_buf_size = dataSize; //------------ read data ------------// file_seek( index_buf[recNo-1] ); file_read( data_buf, dataSize ); return data_buf; } //----------- End of function Resource::read -------------// //---------- Begin of function Resource::get_file ----------// // // Position the file pointer to the beginning of the data and // return the file stream // // recNo = the record no of the data going to read // (default : current record no.) // // dataSIze = for returning the data size of the resource record // // // Return : the file stream // NULL if the record has not index to data/all data read into memory // File* Resource::get_file(int recNo, int& dataSize) { err_when( !init_flag || read_all ); // if read_all, all data in file has been read in and the file has been closed err_when( recNo < 1 || recNo > rec_count ); if( recNo < 1 || recNo > rec_count ) // when no in debug mode, err_when() will be removed return NULL; file_seek( index_buf[recNo-1] ); return this; } //----------- End of function Resource::get_file -------------//