Add spritepad version 1 file parsing

This commit is contained in:
drmortalwombat 2024-04-23 17:51:42 +02:00
parent 411648b130
commit 87ca43e5b7
2 changed files with 98 additions and 9 deletions

View File

@ -313,6 +313,7 @@ struct CTMHeader8
uint8 mColors[7];
};
#if 0
#pragma pack(push, 1)
struct SPDHeader5
{
@ -327,7 +328,7 @@ struct SPDHeader5
};
#pragma pack(pop)
void SourceFile::ReadSpritePad(SourceFileDecoder decoder)
void SourceFile::ReadSpritePad(Errors* errors, SourceFileDecoder decoder)
{
SPDHeader5 spdHeader;
@ -341,8 +342,96 @@ void SourceFile::ReadSpritePad(SourceFileDecoder decoder)
mLimit = 0;
}
#endif
void SourceFile::ReadCharPad(SourceFileDecoder decoder)
#pragma pack(push, 1)
// 0.0 1.0 5.0 SPD file format information
// - SPD SPD 3 bytes "SPD"
// - 01 04 version number of spritepad (1 = 2.0)
// - - byte flags
// - byte word number of sprites
// - byte word number of animations
// - - byte number of sprite animations
// - - byte number of tile animations
// - - byte tile width
// - - byte tile height
// byte byte byte color transparent
// byte byte byte color multicolor 1
// byte byte byte color multicolor 2
// list of [
// [63] [63] [63] 63 bytes of sprite data
// byte byte byte color byte. Bits: 0-3 color, 4 overlay, 7 multicolor/singlecolor
// ]
// - [4] - bytes xx = "00", "00", "01", "00" added at the end of file (SpritePad animation info)
struct SPDHeader
{
uint8 mID[3];
uint8 mVersion[1]; // 1=1.0 5=5.0
};
struct SPDHeader1
{
uint8 mNumSprites; // -1
uint8 mNumSpriteAnmis; // -1
uint8 mColors[3];
};
struct SPDHeader5
{
uint8 mFlags;
uint16 mNumSprites, mNumTiles;
uint8 mNumSpriteAnmis, mNumTileAnims;
uint8 mTileWidth, mTileHeight;
uint8 mColors[3];
int16 mSpriteOverlayDist, mTileOverlayDist;
};
#pragma pack(pop)
void SourceFile::ReadSpritePad(Errors* errors, const Location& location, SourceFileDecoder decoder)
{
SPDHeader spdHeader;
fread(&spdHeader, sizeof(SPDHeader), 1, mFile);
if (spdHeader.mID[0] == 'S' && spdHeader.mID[1] == 'P' && spdHeader.mID[2] == 'D')
{
int numSprites = 0;
switch (spdHeader.mVersion[0])
{
case 5:
{
SPDHeader5 spdHeader5;
fread(&spdHeader5, sizeof(SPDHeader5), 1, mFile);
numSprites = spdHeader5.mNumSprites;
break;
}
case 1:
{
SPDHeader1 spdHeader1;
fread(&spdHeader1, sizeof(SPDHeader1), 1, mFile);
numSprites = spdHeader1.mNumSprites + 1;
break;
}
default:
errors->Error(location, EERR_UNIMPLEMENTED, "SPD file version not recognized");
}
if (decoder == SFD_SPD_SPRITES)
{
mLimit = 64 * numSprites;
return;
}
}
else
errors->Error(location, EERR_UNIMPLEMENTED, "SPD file format not recognized");
mLimit = 0;
}
void SourceFile::ReadCharPad(Errors* errors, const Location& location, SourceFileDecoder decoder)
{
CTMHeader8 ctmHeader;
uint16 ctmMarker, numChars, numTiles;
@ -573,7 +662,7 @@ void SourceFile::ReadCharPad(SourceFileDecoder decoder)
mLimit = 0;
}
void SourceFile::Limit(SourceFileDecoder decoder, int skip, int limit)
void SourceFile::Limit(Errors* errors, const Location& location, SourceFileDecoder decoder, int skip, int limit)
{
switch (decoder)
{
@ -585,11 +674,11 @@ void SourceFile::Limit(SourceFileDecoder decoder, int skip, int limit)
case SFD_CTM_TILES_16:
case SFD_CTM_MAP_8:
case SFD_CTM_MAP_16:
ReadCharPad(decoder);
ReadCharPad(errors, location, decoder);
break;
case SFD_SPD_SPRITES:
ReadSpritePad(decoder);
ReadSpritePad(errors, location, decoder);
break;
default:
@ -767,7 +856,7 @@ bool Preprocessor::EmbedData(const char* reason, const char* name, bool local, i
if (mCompilerOptions & COPT_VERBOSE)
printf("%s \"%s\"\n", reason, source->mFileName);
source->Limit(decoder, skip, limit);
source->Limit(mErrors, mLocation, decoder, skip, limit);
source->mUp = mSource;
mSource = source;

View File

@ -63,7 +63,7 @@ public:
bool Open(const char* name, const char * path, SourceFileMode mode = SFM_TEXT);
void Close(void);
void Limit(SourceFileDecoder decoder, int skip, int limit);
void Limit(Errors * errors, const Location & location, SourceFileDecoder decoder, int skip, int limit);
bool PushSource(void);
bool PopSource(void);
@ -72,8 +72,8 @@ public:
protected:
FILE* mFile;
void ReadCharPad(SourceFileDecoder decoder);
void ReadSpritePad(SourceFileDecoder decoder);
void ReadCharPad(Errors* errors, const Location& location, SourceFileDecoder decoder);
void ReadSpritePad(Errors* errors, const Location& location, SourceFileDecoder decoder);
int ReadChar(void);
};