// Merge several PSX sprite files into one PSX sprite bank // Coded by Scott Evans 11/6/97 // Last modified 12/6/97 // NOTE : there is no error checking on file stuff // Build with structure packing of 4 bytes // Standard header files #include #include #include #include // Defines structures relating to PSX sprite files #include "sprconv.h" SprHeader sprhdr,*hdr; void main(int argc,char **argv) { // Files to merge are given on command line if(argc!=1) { _byte i,j,*addr; FILE *cluts,*pblks,*imgdata,*newfile; SprPblk *pblk; _long size=0,imgsize=0; // Set up new header information sprhdr.nsprs=0; sprhdr.npal=0; // The offset of the 1st CLUT sprhdr.paloff=sprhdr.pblkoff=_SprHeaderSize; // Create three temporary files, CLUT data, parameter block data and sprite image data cluts=fopen("clutdata","wb"); pblks=fopen("pblkdata","wb"); imgdata=fopen("imgdata","wb"); // For each file on the command line for(i=0;insprs; // Increase number of CLUTs, set offset to paremeter block data sprhdr.npal++; sprhdr.pblkoff+=_4bitCLUTSIZE; // Save CLUT data to temporary file addr=(_byte *)hdr+hdr->paloff; fwrite(addr,_4bitCLUTSIZE,1,cluts); // Update CLUT id for each sprite in file pblk=(SprPblk *)((_byte *)hdr+hdr->pblkoff); addr=(_byte *)pblk; for(j=0;jnsprs;j++,pblk->CLUTid=i,size+=((pblk->w)>>1)*(pblk++->h)); // Save parameter block data fwrite(addr,hdr->nsprs*_SprPblkSize,1,pblks); // Save image data pblk=(SprPblk *)((_byte *)hdr+hdr->pblkoff); addr=(_byte *)pblk+pblk->imgoff; fwrite(addr,size,1,imgdata); free(hdr); imgsize+=size; size=0; } // Close all temporary files fclose(cluts); fclose(pblks); fclose(imgdata); // Calculate new offsets to sprite image data size=_SprPblkSize*sprhdr.nsprs; addr=LoadFile("pblkdata"); pblk=(SprPblk *)addr; // For all parameter blocks in file for(i=0;iimgoff=size; // Calculate next offset size-=_SprPblkSize; size+=(pblk->w>>1)*pblk->h; } // Save updated parameter block data SaveFile("pblkdata",addr,_SprPblkSize*sprhdr.nsprs); free(addr); // Produce new merged file newfile=fopen(argv[1],"wb"); // Write header details fwrite(&sprhdr,_SprHeaderSize,1,newfile); addr=LoadFile("clutdata"); // Write palettes fwrite(addr,sprhdr.npal*_4bitCLUTSIZE,1,newfile); free(addr); addr=LoadFile("pblkdata"); // Write parameter blocks fwrite(addr,sprhdr.nsprs*_SprPblkSize,1,newfile); free(addr); addr=LoadFile("imgdata"); // Write sprite image data fwrite(addr,imgsize,1,newfile); free(addr); fclose(newfile); // Remove temporary files remove("clutdata"); remove("pblkdata"); remove("imgdata"); // Job done } else puts("Usage : sprmerge .... n"); exit(0); }