- migrated highpalookup, basepalette and undefbasepaletterange.

This commit is contained in:
Christoph Oelckers 2021-04-20 22:43:02 +02:00
parent f51872db25
commit b49de68c86
2 changed files with 194 additions and 230 deletions

View File

@ -981,53 +981,8 @@ static int32_t defsparser(scriptfile *script)
parseSkybox(*script, pos);
break;
case T_HIGHPALOOKUP:
{
int32_t basepal=-1, pal=-1;
FString fn;
FScanner::SavedPos highpalend;
static const tokenlist highpaltokens[] =
{
{ "basepal", T_BASEPAL },
{ "pal", T_PAL },
{ "file", T_FILE }
};
if (scriptfile_getbraces(script,&highpalend)) break;
while (!scriptfile_endofblock(script, highpalend))
{
switch (getatoken(script,highpaltokens,countof(highpaltokens)))
{
case T_BASEPAL:
scriptfile_getsymbol(script,&basepal); break;
case T_PAL:
scriptfile_getsymbol(script,&pal); break;
case T_FILE:
scriptfile_getstring(script,&fn); break;
}
}
if ((unsigned)basepal >= MAXBASEPALS)
{
pos.Message(MSG_ERROR, "missing or invalid 'base palette number' for highpalookup definition ");
break;
}
if ((unsigned)pal >= MAXPALOOKUPS - RESERVEDPALS)
{
pos.Message(MSG_ERROR, "missing or invalid 'palette number' for highpalookup definition");
break;
}
if (fn.IsEmpty())
{
pos.Message(MSG_ERROR, "missing 'file name' for highpalookup definition");
break;
}
if (!fileSystem.FileExists(fn))
break;
}
break;
parseHighpalookup(*script, pos);
break;
case T_TINT:
parseTint(*script, pos);
break;
@ -1115,168 +1070,7 @@ static int32_t defsparser(scriptfile *script)
parseMultiPsky(*script, pos);
break;
case T_BASEPALETTE:
{
FScanner::SavedPos blockend;
int32_t id;
static const tokenlist subtokens[] =
{
{ "raw", T_RAW },
{ "copy", T_COPY },
{ "undef", T_UNDEF },
};
if (scriptfile_getsymbol(script,&id))
break;
if (scriptfile_getbraces(script,&blockend))
break;
if ((unsigned)id >= MAXBASEPALS)
{
pos.Message(MSG_ERROR, "basepalette: Invalid basepal number");
scriptfile_setposition(script, blockend);
break;
}
int didLoadPal = 0;
while (!scriptfile_endofblock(script, blockend))
{
int32_t token = getatoken(script,subtokens,countof(subtokens));
switch (token)
{
case T_RAW:
{
FScanner::SavedPos rawblockend;
static const tokenlist rawsubtokens[] =
{
{ "file", T_FILE },
{ "offset", T_OFFSET },
{ "shiftleft", T_SHIFTLEFT },
};
if (scriptfile_getbraces(script,&rawblockend))
break;
FString fn;
int32_t offset = 0;
int32_t shiftleft = 0;
while (!scriptfile_endofblock(script, rawblockend))
{
int32_t token = getatoken(script,rawsubtokens,countof(rawsubtokens));
switch (token)
{
case T_FILE:
{
scriptfile_getstring(script,&fn);
break;
}
case T_OFFSET:
{
scriptfile_getnumber(script,&offset);
break;
}
case T_SHIFTLEFT:
{
scriptfile_getnumber(script,&shiftleft);
break;
}
default:
break;
}
}
if (fn.IsEmpty())
{
pos.Message(MSG_ERROR, "basepalette: No filename provided");
break;
}
if (offset < 0)
{
pos.Message(MSG_ERROR, "basepalette: Invalid file offset");
break;
}
if ((unsigned)shiftleft >= 8)
{
pos.Message(MSG_ERROR, "basepalette: Invalid left shift provided");
break;
}
FileReader fil = fileSystem.OpenFileReader(fn);
if (!fil.isOpen())
{
pos.Message(MSG_ERROR, "basepalette: Failed opening \"%s\"", fn.GetChars());
break;
}
if (fil.Seek(offset, FileReader::SeekSet) < 0)
{
pos.Message(MSG_ERROR, "basepalette: Seek failed");
break;
}
auto palbuf = fil.Read();
if (palbuf.Size() < 768)
{
pos.Message(MSG_ERROR, "basepalette: Read failed");
break;
}
if (shiftleft != 0)
{
for (bssize_t k = 0; k < 768; k++)
palbuf[k] <<= shiftleft;
}
paletteSetColorTable(id, palbuf.Data(), false, false);
didLoadPal = 1;
break;
}
case T_COPY:
{
int32_t source;
scriptfile_getsymbol(script,&source);
if ((unsigned)source >= MAXBASEPALS || source == id)
{
pos.Message(MSG_ERROR, "basepalette: Invalid source basepal number");
break;
}
auto sourcepal = GPalette.GetTranslation(Translation_BasePalettes, source);
if (sourcepal == NULL)
{
pos.Message(MSG_ERROR, "basepalette: Source basepal does not exist");
break;
}
GPalette.CopyTranslation(TRANSLATION(Translation_BasePalettes, id), TRANSLATION(Translation_BasePalettes, source));
didLoadPal = 1;
break;
}
case T_UNDEF:
{
GPalette.ClearTranslationSlot(TRANSLATION(Translation_BasePalettes, id));
didLoadPal = 0;
if (id == 0)
paletteloaded &= ~PALETTE_MAIN;
break;
}
default:
break;
}
}
if (didLoadPal && id == 0)
{
paletteloaded |= PALETTE_MAIN;
}
}
parseBasePalette(*script, pos);
break;
case T_PALOOKUP:
parsePalookup(*script, pos);
@ -1288,27 +1082,8 @@ static int32_t defsparser(scriptfile *script)
parseNumAlphaTabs(*script, pos);
break;
case T_UNDEFBASEPALETTERANGE:
{
int32_t id0, id1;
if (scriptfile_getsymbol(script,&id0))
break;
if (scriptfile_getsymbol(script,&id1))
break;
if (id0 > id1 || (unsigned)id0 >= MAXBASEPALS || (unsigned)id1 >= MAXBASEPALS)
{
pos.Message(MSG_ERROR, "undefbasepaletterange: Invalid range");
break;
}
for (bssize_t i = id0; i <= id1; i++)
GPalette.ClearTranslationSlot(TRANSLATION(Translation_BasePalettes, i));
if (id0 == 0)
paletteloaded &= ~PALETTE_MAIN;
}
break;
parseUndefBasePaletteRange(*script, pos);
break;
case T_UNDEFPALOOKUPRANGE:
parseUndefPalookupRange(*script, pos);
break;

View File

@ -1102,6 +1102,155 @@ void parseNumAlphaTabs(FScanner& sc, FScriptPosition& pos)
}
}
//===========================================================================
//
//
//
//===========================================================================
static bool parseBasePaletteRaw(FScanner& sc, FScriptPosition& pos, int id)
{
FScanner::SavedPos blockend;
FString fn;
int32_t offset = 0;
int32_t shiftleft = 0;
if (sc.StartBraces(&blockend)) return false;
while (!sc.FoundEndBrace(blockend))
{
sc.MustGetString();
if (sc.Compare("file")) sc.GetString(fn);
else if (sc.Compare("offset")) sc.GetNumber(offset, true);
else if (sc.Compare("shiftleft")) sc.GetNumber(shiftleft, true);
}
if (fn.IsEmpty())
{
pos.Message(MSG_ERROR, "basepalette: No filename provided");
}
else if (offset < 0)
{
pos.Message(MSG_ERROR, "basepalette: Invalid file offset");
}
else if ((unsigned)shiftleft >= 8)
{
pos.Message(MSG_ERROR, "basepalette: Invalid left shift %d provided", shiftleft);
}
else
{
FileReader fil = fileSystem.OpenFileReader(fn);
if (!fil.isOpen())
{
pos.Message(MSG_ERROR, "basepalette: Failed opening \"%s\"", fn.GetChars());
}
else if (fil.Seek(offset, FileReader::SeekSet) < 0)
{
pos.Message(MSG_ERROR, "basepalette: Seek failed");
}
else
{
auto palbuf = fil.Read();
if (palbuf.Size() < 768)
{
pos.Message(MSG_ERROR, "basepalette: Read failed");
}
else
{
if (shiftleft != 0)
{
for (bssize_t k = 0; k < 768; k++)
palbuf[k] <<= shiftleft;
}
paletteSetColorTable(id, palbuf.Data(), false, false);
return true;
}
}
}
return false;
}
void parseBasePalette(FScanner& sc, FScriptPosition& pos)
{
FScanner::SavedPos blockend;
int id;
bool didLoadPal = false;
if (!sc.GetNumber(id)) return;
if (sc.StartBraces(&blockend)) return;
if ((unsigned)id >= MAXBASEPALS)
{
pos.Message(MSG_ERROR, "basepalette: Invalid basepal number %d", id);
sc.RestorePos(blockend);
sc.CheckString("{");
return;
}
while (!sc.FoundEndBrace(blockend))
{
sc.MustGetString();
if (sc.Compare("raw")) didLoadPal |= parseBasePaletteRaw(sc, pos, id);
else if (sc.Compare("copy"))
{
int source = -1;
sc.GetNumber(source);
if ((unsigned)source >= MAXBASEPALS || source == id)
{
pos.Message(MSG_ERROR, "basepalette: Invalid source basepal number %d", source);
}
else
{
auto sourcepal = GPalette.GetTranslation(Translation_BasePalettes, source);
if (sourcepal == nullptr)
{
pos.Message(MSG_ERROR, "basepalette: Source basepal %d does not exist", source);
}
else
{
GPalette.CopyTranslation(TRANSLATION(Translation_BasePalettes, id), TRANSLATION(Translation_BasePalettes, source));
didLoadPal = true;
}
}
}
else if (sc.Compare("undef"))
{
GPalette.ClearTranslationSlot(TRANSLATION(Translation_BasePalettes, id));
didLoadPal = 0;
if (id == 0) paletteloaded &= ~PALETTE_MAIN;
}
}
if (didLoadPal && id == 0)
{
paletteloaded |= PALETTE_MAIN;
}
}
//===========================================================================
//
//
//
//===========================================================================
void parseUndefBasePaletteRange(FScanner& sc, FScriptPosition& pos)
{
int start, end;
if (!sc.GetNumber(start)) return;
if (!sc.GetNumber(end)) return;
if (start > end || (unsigned)start >= MAXBASEPALS || (unsigned)end >= MAXBASEPALS)
{
pos.Message(MSG_ERROR, "undefbasepaletterange: Invalid range [%d, %d]", start, end);
return;
}
for (int i = start; i <= end; i++) GPalette.ClearTranslationSlot(TRANSLATION(Translation_BasePalettes, i));
if (start == 0) paletteloaded &= ~PALETTE_MAIN;
}
//===========================================================================
//
@ -1391,3 +1540,43 @@ void parseUndefPalookupRange(FScanner& sc, FScriptPosition& pos)
if (id0 == 0) paletteloaded &= ~PALETTE_SHADE;
}
}
//===========================================================================
//
//
//
//===========================================================================
void parseHighpalookup(FScanner& sc, FScriptPosition& pos)
{
FScanner::SavedPos blockend;
int basepal = -1, pal = -1;
FString fn;
if (sc.StartBraces(&blockend)) return;
while (!sc.FoundEndBrace(blockend))
{
sc.MustGetString();
if (sc.Compare("basepal")) sc.GetNumber(basepal);
else if (sc.Compare("pal")) sc.GetNumber(pal);
else if (sc.Compare("file")) sc.GetString(fn);
}
if ((unsigned)basepal >= MAXBASEPALS)
{
pos.Message(MSG_ERROR, "highpalookup: invalid base palette number %d", basepal);
}
else if ((unsigned)pal >= MAXPALOOKUPS - RESERVEDPALS)
{
pos.Message(MSG_ERROR, "highpalookup: invalid palette number %d", pal);
}
else if (fn.IsEmpty())
{
pos.Message(MSG_ERROR, "highpalookup: missing file name");
}
else if (!fileSystem.FileExists(fn))
{
pos.Message(MSG_ERROR, "highpalookup: file %s not found", fn.GetChars());
}
// todo
}