spritecache.c
changeset 37 61bf1df68d82
parent 0 29654efe3188
child 74 d23a80ef6361
equal deleted inserted replaced
36:c1b3b884584e 37:61bf1df68d82
    67 
    67 
    68 static const uint16 * const _landscape_spriteindexes[] = {
    68 static const uint16 * const _landscape_spriteindexes[] = {
    69 	_landscape_spriteindexes_1,
    69 	_landscape_spriteindexes_1,
    70 	_landscape_spriteindexes_2,
    70 	_landscape_spriteindexes_2,
    71 	_landscape_spriteindexes_3,
    71 	_landscape_spriteindexes_3,
       
    72 };
       
    73 
       
    74 static const uint16 * const _slopes_spriteindexes[] = {
       
    75 	_slopes_spriteindexes_0,
       
    76 	_slopes_spriteindexes_1,
       
    77 	_slopes_spriteindexes_2,
       
    78 	_slopes_spriteindexes_3,
    72 };
    79 };
    73 
    80 
    74 static void CompactSpriteCache();
    81 static void CompactSpriteCache();
    75 
    82 
    76 void DecodeSpecialSprite(const char *filename, int num, int load_index);
    83 void DecodeSpecialSprite(const char *filename, int num, int load_index);
   208 #endif
   215 #endif
   209 
   216 
   210 	return true;
   217 	return true;
   211 }
   218 }
   212 
   219 
       
   220 static void SkipSprites(int count)
       
   221 {
       
   222 	while(count>0)
       
   223 	{
       
   224 		uint16 size;
       
   225 		if ( (size = FioReadWord()) == 0)
       
   226 			return;
       
   227 
       
   228 		ReadSpriteHeaderSkipData(size, NUM_SPRITES-1);
       
   229 		count--;
       
   230 	}
       
   231 }
       
   232 
   213 // Checks, if trg1r.grf is the Windows version
   233 // Checks, if trg1r.grf is the Windows version
   214 static bool CheckGrfFile()
   234 static bool CheckGrfFile()
   215 {
   235 {
   216 	byte check;
   236 	byte check;
   217 	FioSeekToFile(38); // Byte 38 has the value 0x21 in Windows version, 0x07 in DOS
   237 	FioSeekToFile(38); // Byte 38 has the value 0x21 in Windows version, 0x07 in DOS
   244 	return load_index - load_index_org;
   264 	return load_index - load_index_org;
   245 }
   265 }
   246 
   266 
   247 static void LoadGrfIndexed(const char *filename, const uint16 *index_tbl, int file_index)
   267 static void LoadGrfIndexed(const char *filename, const uint16 *index_tbl, int file_index)
   248 {
   268 {
   249 	int start, end;
   269 	int start;
   250 
   270 
   251 	FioOpenFile(file_index, filename);
   271 	FioOpenFile(file_index, filename);
   252 
   272 
   253 	for(;(start=*index_tbl++) != 0xffff;) {
   273 	for(;(start=*index_tbl++) != 0xffff;) {
   254 		end = *index_tbl++;
   274 		int end = *index_tbl++;
   255 		do {
   275 		if(start==0xfffe) { // skip sprites (amount in second var)
   256 			bool b = LoadNextSprite(start, file_index);
   276 			SkipSprites(end);
   257 			assert(b);
   277 		} else { // load sprites and use indexes from start to end
   258 		} while (++start <= end);
   278 			do {
       
   279 				bool b = LoadNextSprite(start, file_index);
       
   280 				assert(b);
       
   281 			} while (++start <= end);
       
   282 		}
   259 	}
   283 	}
   260 }	
   284 }	
   261 
   285 
   262 typedef size_t CDECL fread_t(void*,size_t,size_t,FILE*);
   286 typedef size_t CDECL fread_t(void*,size_t,size_t,FILE*);
   263 
   287 
   667 		{
   691 		{
   668 			int l;
   692 			int l;
   669 			if ((l=_sprite_page_to_load) != 0)
   693 			if ((l=_sprite_page_to_load) != 0)
   670 				LoadGrfIndexed(_landscape_filenames[l-1], _landscape_spriteindexes[l-1], i++); 
   694 				LoadGrfIndexed(_landscape_filenames[l-1], _landscape_spriteindexes[l-1], i++); 
   671 		}
   695 		}
       
   696 		
       
   697 		LoadGrfIndexed("trkfoundw.grf", _slopes_spriteindexes[_opt.landscape], i++);
   672 
   698 
   673 		load_index = SPR_CANALS_BASE;
   699 		load_index = SPR_CANALS_BASE;
   674 		load_index += LoadGrfFile("canalsw.grf", load_index, i++);
   700 		load_index += LoadGrfFile("canalsw.grf", load_index, i++);
   675 		/* XXX: Only for debugging. Will be more generic. */
   701 		/* XXX: Only for debugging. Will be more generic. */
   676 		
   702