|
|
@@ -48,141 +48,85 @@ CDefEssential::~CDefEssential()
|
|
|
for(size_t i=0; i < ourImages.size(); ++i)
|
|
|
SDL_FreeSurface(ourImages[i].bitmap);
|
|
|
}
|
|
|
+// Note: this function is unused
|
|
|
void CDefHandler::openDef(std::string name)
|
|
|
{
|
|
|
- int i,j, totalInBlock;
|
|
|
- char Buffer[13];
|
|
|
- BMPPalette palette[256];
|
|
|
- defName=name;
|
|
|
-
|
|
|
int andame;
|
|
|
std::ifstream * is = new std::ifstream();
|
|
|
is -> open(name.c_str(),std::ios::binary);
|
|
|
is->seekg(0,std::ios::end); // na koniec
|
|
|
andame = is->tellg(); // read length
|
|
|
is->seekg(0,std::ios::beg); // wracamy na poczatek
|
|
|
- unsigned char * FDef = new unsigned char[andame]; // allocate memory
|
|
|
+ unsigned char * FDef = new unsigned char[andame]; // allocate memory
|
|
|
is->read((char*)FDef, andame); // read map file to buffer
|
|
|
is->close();
|
|
|
delete is;
|
|
|
- i = 0;
|
|
|
- DEFType = readNormalNr(i,4,FDef); i+=4;
|
|
|
- width = readNormalNr(i,4,FDef); i+=4;
|
|
|
- height = readNormalNr(i,4,FDef); i+=4;
|
|
|
- i=0xc;
|
|
|
- totalBlocks = readNormalNr(i,4,FDef); i+=4;
|
|
|
-
|
|
|
- i=0x10;
|
|
|
- for (int it=0;it<256;it++)
|
|
|
- {
|
|
|
- palette[it].R = FDef[i++];
|
|
|
- palette[it].G = FDef[i++];
|
|
|
- palette[it].B = FDef[i++];
|
|
|
- palette[it].F = 0;
|
|
|
- }
|
|
|
- i=0x310;
|
|
|
- totalEntries=0;
|
|
|
- for (int z=0; z<totalBlocks; z++)
|
|
|
- {
|
|
|
- i+=4;
|
|
|
- totalInBlock = readNormalNr(i,4,FDef); i+=4;
|
|
|
- for (j=SEntries.size(); j<totalEntries+totalInBlock; j++)
|
|
|
- SEntries.push_back(SEntry());
|
|
|
- i+=8;
|
|
|
- for (j=0; j<totalInBlock; j++)
|
|
|
- {
|
|
|
- for (int k=0;k<13;k++) Buffer[k]=FDef[i+k];
|
|
|
- i+=13;
|
|
|
- SEntries[totalEntries+j].name=Buffer;
|
|
|
- }
|
|
|
- for (j=0; j<totalInBlock; j++)
|
|
|
- {
|
|
|
- SEntries[totalEntries+j].offset = readNormalNr(i,4,FDef);
|
|
|
- i+=4;
|
|
|
- }
|
|
|
- //totalEntries+=totalInBlock;
|
|
|
- for(int hh=0; hh<totalInBlock; ++hh)
|
|
|
- {
|
|
|
- SEntries[totalEntries].group = z;
|
|
|
- ++totalEntries;
|
|
|
- }
|
|
|
- }
|
|
|
- for(j=0; j<SEntries.size(); ++j)
|
|
|
- {
|
|
|
- SEntries[j].name = SEntries[j].name.substr(0, SEntries[j].name.find('.')+4);
|
|
|
- }
|
|
|
- for(size_t i=0; i < SEntries.size(); ++i)
|
|
|
- {
|
|
|
- Cimage nimg;
|
|
|
- nimg.bitmap = getSprite(i, FDef, palette);
|
|
|
- nimg.imName = SEntries[i].name;
|
|
|
- nimg.groupNumber = SEntries[i].group;
|
|
|
- ourImages.push_back(nimg);
|
|
|
- }
|
|
|
+
|
|
|
+ openFromMemory(FDef, name);
|
|
|
+
|
|
|
delete [] FDef;
|
|
|
- FDef = NULL;
|
|
|
}
|
|
|
|
|
|
void CDefHandler::openFromMemory(unsigned char *table, std::string name)
|
|
|
{
|
|
|
- int i,j, totalInBlock;
|
|
|
BMPPalette palette[256];
|
|
|
- defName=name;
|
|
|
- i = 0;
|
|
|
- DEFType = readNormalNr(i,4,table); i+=4;
|
|
|
- width = readNormalNr(i,4,table); i+=4;
|
|
|
- height = readNormalNr(i,4,table); i+=4;
|
|
|
- i=0xc;
|
|
|
- totalBlocks = readNormalNr(i,4,table); i+=4;
|
|
|
-
|
|
|
- i=0x10;
|
|
|
- for (int it=0;it<256;it++)
|
|
|
+ struct defEntry &de = *(struct defEntry *)table;
|
|
|
+ unsigned char *p;
|
|
|
+
|
|
|
+ defName = name;
|
|
|
+ DEFType = SDL_SwapLE32(de.DEFType);
|
|
|
+ width = SDL_SwapLE32(de.width);
|
|
|
+ height = SDL_SwapLE32(de.height);
|
|
|
+ totalBlocks = SDL_SwapLE32(de.totalBlocks);
|
|
|
+
|
|
|
+ for (unsigned int it=0;it<256;it++)
|
|
|
{
|
|
|
- palette[it].R = table[i++];
|
|
|
- palette[it].G = table[i++];
|
|
|
- palette[it].B = table[i++];
|
|
|
+ palette[it].R = de.palette[it].R;
|
|
|
+ palette[it].G = de.palette[it].G;
|
|
|
+ palette[it].B = de.palette[it].B;
|
|
|
palette[it].F = 0;
|
|
|
}
|
|
|
- i=0x310;
|
|
|
+
|
|
|
+ p = (unsigned char *)de.blocks;
|
|
|
totalEntries=0;
|
|
|
- for (int z=0; z<totalBlocks; z++)
|
|
|
+ for (unsigned int z=0; z<totalBlocks; z++)
|
|
|
{
|
|
|
- int unknown1 = readNormalNr(i,4,table); i+=4; //TODO use me
|
|
|
- totalInBlock = readNormalNr(i,4,table); i+=4;
|
|
|
- for (j=SEntries.size(); j<totalEntries+totalInBlock; j++)
|
|
|
+ struct defEntryBlock &block = *(struct defEntryBlock *)p;
|
|
|
+ unsigned int totalInBlock;
|
|
|
+
|
|
|
+ totalInBlock = SDL_SwapLE32(block.totalInBlock);
|
|
|
+
|
|
|
+ for (unsigned int j=SEntries.size(); j<totalEntries+totalInBlock; j++)
|
|
|
SEntries.push_back(SEntry());
|
|
|
- int unknown2 = readNormalNr(i,4,table); //TODO use me
|
|
|
- i+=4;
|
|
|
- int unknown3 = readNormalNr(i,4,table); //TODO use me
|
|
|
- i+=4;
|
|
|
- for (j=0; j<totalInBlock; j++)
|
|
|
+
|
|
|
+ p = block.data;
|
|
|
+ for (unsigned int j=0; j<totalInBlock; j++)
|
|
|
{
|
|
|
char Buffer[13];
|
|
|
- memcpy(Buffer, &table[i], 12);
|
|
|
+ memcpy(Buffer, p, 12);
|
|
|
Buffer[12] = 0;
|
|
|
SEntries[totalEntries+j].name=Buffer;
|
|
|
-
|
|
|
- i+=13;
|
|
|
+ p += 13;
|
|
|
}
|
|
|
- for (j=0; j<totalInBlock; j++)
|
|
|
+ for (unsigned int j=0; j<totalInBlock; j++)
|
|
|
{
|
|
|
- SEntries[totalEntries+j].offset = readNormalNr(i,4,table);
|
|
|
- int unknown4 = readNormalNr(i,4,table); //TODO use me
|
|
|
- i+=4;
|
|
|
+ SEntries[totalEntries+j].offset = SDL_SwapLE32(*(Uint32 *)p);
|
|
|
+ p += 4;
|
|
|
}
|
|
|
//totalEntries+=totalInBlock;
|
|
|
- for(int hh=0; hh<totalInBlock; ++hh)
|
|
|
+ for(unsigned int hh=0; hh<totalInBlock; ++hh)
|
|
|
{
|
|
|
SEntries[totalEntries].group = z;
|
|
|
++totalEntries;
|
|
|
}
|
|
|
}
|
|
|
- for(j=0; j<SEntries.size(); ++j)
|
|
|
+
|
|
|
+ for(unsigned int j=0; j<SEntries.size(); ++j)
|
|
|
{
|
|
|
SEntries[j].name = SEntries[j].name.substr(0, SEntries[j].name.find('.')+4);
|
|
|
}
|
|
|
//RWEntries = new unsigned int[height];
|
|
|
- for(size_t i=0; i < SEntries.size(); ++i)
|
|
|
+ for(unsigned int i=0; i < SEntries.size(); ++i)
|
|
|
{
|
|
|
Cimage nimg;
|
|
|
nimg.bitmap = getSprite(i, table, palette);
|
|
|
@@ -256,24 +200,29 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet
|
|
|
{
|
|
|
SDL_Surface * ret=NULL;
|
|
|
|
|
|
- long BaseOffset,
|
|
|
+ unsigned int BaseOffset,
|
|
|
SpriteWidth, SpriteHeight, //format sprite'a
|
|
|
- LeftMargin, RightMargin, TopMargin,BottomMargin,
|
|
|
- i, add, FullHeight,FullWidth,
|
|
|
- TotalRowLength, // dlugosc przeczytanego segmentu
|
|
|
- RowAdd;//, NextSpriteOffset; //TODO use me
|
|
|
+ TotalRowLength, // dlugosc przeczytanego segmentu
|
|
|
+ add, FullHeight,FullWidth,
|
|
|
+ RowAdd, //, NextSpriteOffset; //TODO use me
|
|
|
+ prSize,
|
|
|
+ defType2;
|
|
|
+ int LeftMargin, RightMargin, TopMargin, BottomMargin;
|
|
|
+
|
|
|
|
|
|
unsigned char SegmentType;//, BL, BR; //TODO use me
|
|
|
|
|
|
- i=BaseOffset=SEntries[SIndex].offset;
|
|
|
- int prSize=readNormalNr(i,4,FDef);i+=4; //TODO use me
|
|
|
- int defType2 = readNormalNr(i,4,FDef);i+=4;
|
|
|
- FullWidth = readNormalNr(i,4,FDef);i+=4;
|
|
|
- FullHeight = readNormalNr(i,4,FDef);i+=4;
|
|
|
- SpriteWidth = readNormalNr(i,4,FDef);i+=4;
|
|
|
- SpriteHeight = readNormalNr(i,4,FDef);i+=4;
|
|
|
- LeftMargin = readNormalNr(i,4,FDef);i+=4;
|
|
|
- TopMargin = readNormalNr(i,4,FDef);i+=4;
|
|
|
+ BaseOffset=SEntries[SIndex].offset;
|
|
|
+ struct spriteDef sd = *(struct spriteDef *)(FDef + BaseOffset);
|
|
|
+
|
|
|
+ prSize = SDL_SwapLE32(sd.prSize); //TODO use me
|
|
|
+ defType2 = SDL_SwapLE32(sd.defType2);
|
|
|
+ FullWidth = SDL_SwapLE32(sd.FullWidth);
|
|
|
+ FullHeight = SDL_SwapLE32(sd.FullHeight);
|
|
|
+ SpriteWidth = SDL_SwapLE32(sd.SpriteWidth);
|
|
|
+ SpriteHeight = SDL_SwapLE32(sd.SpriteHeight);
|
|
|
+ LeftMargin = SDL_SwapLE32(sd.LeftMargin);
|
|
|
+ TopMargin = SDL_SwapLE32(sd.TopMargin);
|
|
|
RightMargin = FullWidth - SpriteWidth - LeftMargin;
|
|
|
BottomMargin = FullHeight - SpriteHeight - TopMargin;
|
|
|
|
|
|
@@ -292,7 +241,8 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet
|
|
|
ret = SDL_CreateRGBSurface(SDL_SWSURFACE, FullWidth, FullHeight, 8, 0, 0, 0, 0);
|
|
|
//int tempee2 = readNormalNr(0,4,((unsigned char *)tempee.c_str()));
|
|
|
|
|
|
- int BaseOffsetor = BaseOffset = i;
|
|
|
+ BaseOffset += sizeof(struct spriteDef);
|
|
|
+ int BaseOffsetor = BaseOffset;
|
|
|
|
|
|
for(int i=0; i<256; ++i)
|
|
|
{
|
|
|
@@ -319,7 +269,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet
|
|
|
{
|
|
|
case 0:
|
|
|
{
|
|
|
- for (int i=0;i<SpriteHeight;i++)
|
|
|
+ for (unsigned int i=0;i<SpriteHeight;i++)
|
|
|
{
|
|
|
if (LeftMargin>0)
|
|
|
ftcp += LeftMargin;
|
|
|
@@ -338,7 +288,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet
|
|
|
{
|
|
|
unsigned int * RWEntriesLoc = (unsigned int *)(FDef+BaseOffset);
|
|
|
BaseOffset += sizeof(int) * SpriteHeight;
|
|
|
- for (int i=0;i<SpriteHeight;i++)
|
|
|
+ for (unsigned int i=0;i<SpriteHeight;i++)
|
|
|
{
|
|
|
BaseOffset=BaseOffsetor+RWEntriesLoc[i];
|
|
|
if (LeftMargin>0)
|
|
|
@@ -354,7 +304,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet
|
|
|
|
|
|
if (SegmentType==0xFF)
|
|
|
{
|
|
|
- for (int k=0; k<SegmentLength;k++)
|
|
|
+ for (unsigned int k=0; k<SegmentLength;k++)
|
|
|
{
|
|
|
((char*)(ret->pixels))[ftcp++]=FDef[BaseOffset+k];
|
|
|
if ((TotalRowLength+k)>=SpriteWidth)
|
|
|
@@ -389,7 +339,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet
|
|
|
RWEntries[i] = readNormalNr(BaseOffsetor+i*2*(SpriteWidth/32), 2, FDef);
|
|
|
}*/
|
|
|
BaseOffset = BaseOffsetor + *(unsigned short*)( FDef + BaseOffsetor ); //was + RWEntries[0];
|
|
|
- for (int i=0;i<SpriteHeight;i++)
|
|
|
+ for (unsigned int i=0;i<SpriteHeight;i++)
|
|
|
{
|
|
|
//BaseOffset = BaseOffsetor+RWEntries[i];
|
|
|
if (LeftMargin>0)
|
|
|
@@ -433,7 +383,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet
|
|
|
{
|
|
|
RWEntries[i] = readNormalNr(BaseOffsetor+i*2*(SpriteWidth/32), 2, FDef);
|
|
|
}*/
|
|
|
- for (int i=0;i<SpriteHeight;i++)
|
|
|
+ for (unsigned int i=0;i<SpriteHeight;i++)
|
|
|
{
|
|
|
BaseOffset = BaseOffsetor + *(unsigned short*)( FDef + BaseOffsetor+i*2*(SpriteWidth/32) ); //was + RWEntries[i] before speedup
|
|
|
if (LeftMargin>0)
|