Add support for charpad 9 format

This commit is contained in:
drmortalwombat 2024-06-11 22:26:10 +02:00
parent 4cf64ee170
commit 02e921364b

View File

@ -303,16 +303,30 @@ bool SourceFile::ReadLine(char* line)
return false; return false;
} }
struct CTMHeader8 struct CTMHeader
{ {
uint8 mID[3]; uint8 mID[3];
uint8 mVersion[1]; uint8 mVersion;
};
struct CTMHeader8
{
uint8 mDispMode; uint8 mDispMode;
uint8 mColorMethod; uint8 mColorMethod;
uint8 mFlags; uint8 mFlags;
uint8 mColors[7]; uint8 mColors[7];
}; };
struct CTMHeader9
{
uint8 mDispMode;
uint8 mColorMethod;
uint8 mFlags;
uint8 mFgridWidth[2], mFGridHeight[2];
char mFGridConfig;
uint8 mColors[7];
};
#if 0 #if 0
#pragma pack(push, 1) #pragma pack(push, 1)
struct SPDHeader5 struct SPDHeader5
@ -433,11 +447,28 @@ void SourceFile::ReadSpritePad(Errors* errors, const Location& location, SourceF
void SourceFile::ReadCharPad(Errors* errors, const Location& location, SourceFileDecoder decoder) void SourceFile::ReadCharPad(Errors* errors, const Location& location, SourceFileDecoder decoder)
{ {
CTMHeader8 ctmHeader; CTMHeader ctmHeader;
CTMHeader8 ctmHeader8;
CTMHeader9 ctmHeader9;
uint16 ctmMarker, numChars, numTiles; uint16 ctmMarker, numChars, numTiles;
char tileWidth, tileHeight; char tileWidth, tileHeight;
fread(&ctmHeader, sizeof(CTMHeader8), 1, mFile); fread(&ctmHeader, sizeof(CTMHeader), 1, mFile);
switch (ctmHeader.mVersion)
{
case 8:
fread(&ctmHeader8, sizeof(CTMHeader8), 1, mFile);
break;
case 9:
fread(&ctmHeader9, sizeof(CTMHeader9), 1, mFile);
ctmHeader8.mDispMode = ctmHeader9.mDispMode;
ctmHeader8.mColorMethod = ctmHeader9.mColorMethod;
ctmHeader8.mFlags = ctmHeader9.mFlags;
break;
}
fread(&ctmMarker, 2, 1, mFile); fread(&ctmMarker, 2, 1, mFile);
fread(&numChars, 2, 1, mFile); fread(&numChars, 2, 1, mFile);
numChars++; numChars++;
@ -476,13 +507,13 @@ void SourceFile::ReadCharPad(Errors* errors, const Location& location, SourceFil
fseek(mFile, 1 * numChars, SEEK_CUR); fseek(mFile, 1 * numChars, SEEK_CUR);
} }
if (ctmHeader.mColorMethod == 2) if (ctmHeader8.mColorMethod == 2)
{ {
fread(&ctmMarker, 2, 1, mFile); fread(&ctmMarker, 2, 1, mFile);
if (decoder == SFD_CTM_CHAR_ATTRIB_1 || decoder == SFD_CTM_CHAR_ATTRIB_2) if (decoder == SFD_CTM_CHAR_ATTRIB_1 || decoder == SFD_CTM_CHAR_ATTRIB_2)
{ {
if (ctmHeader.mDispMode == 4) if (ctmHeader8.mDispMode == 4)
{ {
for (int i = 0; i < mMemSize; i++) for (int i = 0; i < mMemSize; i++)
{ {
@ -510,9 +541,9 @@ void SourceFile::ReadCharPad(Errors* errors, const Location& location, SourceFil
else else
{ {
// Skip colors // Skip colors
if (ctmHeader.mDispMode == 3) if (ctmHeader8.mDispMode == 3)
fseek(mFile, 2 * numChars, SEEK_CUR); fseek(mFile, 2 * numChars, SEEK_CUR);
else if (ctmHeader.mDispMode == 4) else if (ctmHeader8.mDispMode == 4)
fseek(mFile, 3 * numChars, SEEK_CUR); fseek(mFile, 3 * numChars, SEEK_CUR);
else else
fseek(mFile, numChars, SEEK_CUR); fseek(mFile, numChars, SEEK_CUR);
@ -523,7 +554,7 @@ void SourceFile::ReadCharPad(Errors* errors, const Location& location, SourceFil
return; return;
} }
if (ctmHeader.mFlags & 1) if (ctmHeader8.mFlags & 1)
{ {
fread(&ctmMarker, 2, 1, mFile); fread(&ctmMarker, 2, 1, mFile);
@ -572,7 +603,7 @@ void SourceFile::ReadCharPad(Errors* errors, const Location& location, SourceFil
else else
fseek(mFile, 2 * numTiles * tileWidth * tileHeight, SEEK_CUR); fseek(mFile, 2 * numTiles * tileWidth * tileHeight, SEEK_CUR);
if (ctmHeader.mColorMethod == 1) if (ctmHeader8.mColorMethod == 1)
{ {
fread(&ctmMarker, 2, 1, mFile); fread(&ctmMarker, 2, 1, mFile);
if (decoder == SFD_CTM_CHAR_ATTRIB_1 || decoder == SFD_CTM_CHAR_ATTRIB_2) if (decoder == SFD_CTM_CHAR_ATTRIB_1 || decoder == SFD_CTM_CHAR_ATTRIB_2)
@ -582,7 +613,7 @@ void SourceFile::ReadCharPad(Errors* errors, const Location& location, SourceFil
mMemPos = 0; mMemPos = 0;
mMemData = new uint8[mMemSize]; mMemData = new uint8[mMemSize];
if (ctmHeader.mDispMode == 4) if (ctmHeader8.mDispMode == 4)
{ {
for (int i = 0; i < mMemSize; i++) for (int i = 0; i < mMemSize; i++)
{ {
@ -609,9 +640,9 @@ void SourceFile::ReadCharPad(Errors* errors, const Location& location, SourceFil
else else
{ {
// Skip colors // Skip colors
if (ctmHeader.mDispMode == 3) if (ctmHeader8.mDispMode == 3)
fseek(mFile, 2 * numTiles, SEEK_CUR); fseek(mFile, 2 * numTiles, SEEK_CUR);
else if (ctmHeader.mDispMode == 4) else if (ctmHeader8.mDispMode == 4)
fseek(mFile, 3 * numTiles, SEEK_CUR); fseek(mFile, 3 * numTiles, SEEK_CUR);
else else
fseek(mFile, numTiles, SEEK_CUR); fseek(mFile, numTiles, SEEK_CUR);