From 276fd19462aa1cc7e03ec50478f70e3387df4a59 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 13 Apr 2021 20:46:33 +0200 Subject: [PATCH] - parseMakePalookup --- source/build/src/defs.cpp | 108 +------------------------------------- source/core/parsefuncs.h | 73 ++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 106 deletions(-) diff --git a/source/build/src/defs.cpp b/source/build/src/defs.cpp index b57986a97..e067971e5 100644 --- a/source/build/src/defs.cpp +++ b/source/build/src/defs.cpp @@ -1032,112 +1032,8 @@ static int32_t defsparser(scriptfile *script) parseTint(*script, pos); break; case T_MAKEPALOOKUP: - { - int32_t red=0, green=0, blue=0, pal=-1; - int32_t havepal=0, remappal=0; - int32_t nofloorpal=-1; - FScanner::SavedPos endtextptr; - - static const tokenlist palookuptokens[] = - { - { "pal", T_PAL }, - { "red", T_RED }, { "r", T_RED }, - { "green", T_GREEN }, { "g", T_GREEN }, - { "blue", T_BLUE }, { "b", T_BLUE }, - { "remappal", T_REMAPPAL }, - { "remapself", T_REMAPSELF }, - { "nofloorpal", T_NOFLOORPAL }, - }; - - enum { - HAVE_PAL = 1, - HAVE_REMAPPAL = 2, - HAVE_REMAPSELF = 4, - - HAVEPAL_SPECIAL = HAVE_REMAPPAL | HAVE_REMAPSELF, - HAVEPAL_ERROR = 8, - }; - - if (scriptfile_getbraces(script,&endtextptr)) break; - while (!scriptfile_endofblock(script, endtextptr)) - { - switch (getatoken(script, palookuptokens, countof(palookuptokens))) - { - case T_PAL: - scriptfile_getsymbol(script, &pal); - havepal |= HAVE_PAL; - break; - case T_RED: - scriptfile_getnumber(script,&red); - red = clamp(red, 0, 63); - break; - case T_GREEN: - scriptfile_getnumber(script,&green); - green = clamp(green, 0, 63); - break; - case T_BLUE: - scriptfile_getnumber(script,&blue); - blue = clamp(blue, 0, 63); - break; - case T_REMAPPAL: - scriptfile_getsymbol(script,&remappal); - if (havepal & HAVEPAL_SPECIAL) - havepal |= HAVEPAL_ERROR; - havepal |= HAVE_REMAPPAL; - break; - case T_REMAPSELF: - if (havepal & HAVEPAL_SPECIAL) - havepal |= HAVEPAL_ERROR; - havepal |= HAVE_REMAPSELF; - break; - case T_NOFLOORPAL: - scriptfile_getsymbol(script, &nofloorpal); - nofloorpal = clamp(nofloorpal, 0, 1); - break; - } - } - - { - char msgend[BMAX_PATH+64]; - - sprintf(msgend, "for palookup definition"); - - if ((havepal & HAVE_PAL)==0) - { - pos.Message(MSG_ERROR, "missing 'palette number' %s\n", msgend); - break; - } - else if (pal==0 || (unsigned)pal >= MAXPALOOKUPS-RESERVEDPALS) - { - pos.Message(MSG_ERROR, "'palette number' out of range (1 .. %d) %s\n", - MAXPALOOKUPS-RESERVEDPALS-1, msgend); - break; - } - - if (havepal & HAVEPAL_ERROR) - { - // will also disallow multiple remappals or remapselfs - pos.Message(MSG_ERROR, "must have exactly one of either 'remappal' or 'remapself' %s\n", msgend); - break; - } - else if ((havepal & HAVE_REMAPPAL - && (unsigned)remappal >= MAXPALOOKUPS-RESERVEDPALS)) - { - pos.Message(MSG_ERROR, "'remap palette number' out of range (max=%d) %s\n", - MAXPALOOKUPS-RESERVEDPALS-1, msgend); - break; - } - - if (havepal & HAVE_REMAPSELF) - remappal = pal; - } - - // NOTE: all palookups are initialized, i.e. non-NULL! - // NOTE2: aliasing (pal==remappal) is OK - lookups.makeTable(pal, lookups.getTable(remappal), red<<2, green<<2, blue<<2, - remappal==0 ? 1 : (nofloorpal == -1 ? lookups.tables[remappal].noFloorPal : nofloorpal)); - } - break; + parseMakePalookup(*script, pos); + break; case T_TEXTURE: parseTexture(*script, pos); break; diff --git a/source/core/parsefuncs.h b/source/core/parsefuncs.h index 4bc17b10c..41864dcd5 100644 --- a/source/core/parsefuncs.h +++ b/source/core/parsefuncs.h @@ -1263,3 +1263,76 @@ void parsePalookup(FScanner& sc, FScriptPosition& pos) paletteloaded |= PALETTE_SHADE; } } + +//=========================================================================== +// +// +// +//=========================================================================== + +void parseMakePalookup(FScanner& sc, FScriptPosition& pos) +{ + FScanner::SavedPos blockend; + int red = 0, green = 0, blue = 0, pal = -1; + int havepal = 0, remappal = 0; + int nofloorpal = -1; + + if (sc.StartBraces(&blockend)) return; + + enum { + HAVE_PAL = 1, + HAVE_REMAPPAL = 2, + HAVE_REMAPSELF = 4, + + HAVEPAL_SPECIAL = HAVE_REMAPPAL | HAVE_REMAPSELF, + HAVEPAL_ERROR = 8, + }; + + while (!sc.FoundEndBrace(blockend)) + { + sc.MustGetString(); + if (sc.Compare({ "r", "red" })) sc.GetNumber(red); + else if (sc.Compare({ "g", "green" })) sc.GetNumber(green); + else if (sc.Compare({ "b", "blue" })) sc.GetNumber(blue); + else if (sc.Compare("remappal")) + { + sc.GetNumber(remappal, true); + if (havepal & HAVEPAL_SPECIAL) havepal |= HAVEPAL_ERROR; + havepal |= HAVE_REMAPPAL; + } + else if (sc.Compare("remapself")) + { + if (havepal & HAVEPAL_SPECIAL) havepal |= HAVEPAL_ERROR; + havepal |= HAVE_REMAPSELF; + } + else if (sc.Compare("nofloorpal")) sc.GetNumber(nofloorpal, true); + else if (sc.Compare("pal")) sc.GetNumber(pal, true); + } + red = clamp(red, 0, 63); + green = clamp(green, 0, 63); + blue = clamp(blue, 0, 63); + + if ((havepal & HAVE_PAL) == 0) + { + pos.Message(MSG_ERROR, "makepalookup: missing 'palette number'"); + } + else if (pal == 0 || (unsigned)pal >= MAXPALOOKUPS - RESERVEDPALS) + { + pos.Message(MSG_ERROR, "makepalookup: 'palette number' %d out of range (1 .. %d)\n", pal, MAXPALOOKUPS - RESERVEDPALS - 1); + } + else if (havepal & HAVEPAL_ERROR) + { + // will also disallow multiple remappals or remapselfs + pos.Message(MSG_ERROR, "makepalookup: must have exactly one of either 'remappal' or 'remapself'\n"); + } + else if ((havepal & HAVE_REMAPPAL && (unsigned)remappal >= MAXPALOOKUPS - RESERVEDPALS)) + { + pos.Message(MSG_ERROR, "makepalookup: 'remap palette number' %d out of range (max=%d)\n", pal, MAXPALOOKUPS - RESERVEDPALS - 1); + } + else + { + if (havepal & HAVE_REMAPSELF) remappal = pal; + lookups.makeTable(pal, lookups.getTable(remappal), red << 2, green << 2, blue << 2, + remappal == 0 ? 1 : (nofloorpal == -1 ? lookups.tables[remappal].noFloorPal : nofloorpal)); + } +}