From 9cda82d896a47179f307c0177525e390494c9219 Mon Sep 17 00:00:00 2001 From: MascaraSnake <jonassauer27@gmail.com> Date: Wed, 1 Jan 2020 15:52:59 +0100 Subject: [PATCH] Rework textmap parser to always read a parameter's value, even if it doesn't recognize the parameter --- src/p_setup.c | 151 +++++++++++++++++++++++++------------------------- 1 file changed, 75 insertions(+), 76 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index f72e25da0..dc115ed19 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1362,135 +1362,133 @@ static boolean TextmapCount(UINT8 *data, size_t size) return true; } -static char* dat; - -static void ParseTextmapVertexParameter(UINT32 i, char *param) +static void ParseTextmapVertexParameter(UINT32 i, char *param, char *val) { if (fastcmp(param, "x")) - vertexes[i].x = FLOAT_TO_FIXED(atof(dat = M_GetToken(NULL))); + vertexes[i].x = FLOAT_TO_FIXED(atof(val)); else if (fastcmp(param, "y")) - vertexes[i].y = FLOAT_TO_FIXED(atof(dat = M_GetToken(NULL))); + vertexes[i].y = FLOAT_TO_FIXED(atof(val)); } -static void ParseTextmapSectorParameter(UINT32 i, char *param) +static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val) { if (fastcmp(param, "heightfloor")) - sectors[i].floorheight = atol(dat = M_GetToken(NULL)) << FRACBITS; + sectors[i].floorheight = atol(val) << FRACBITS; else if (fastcmp(param, "heightceiling")) - sectors[i].ceilingheight = atol(dat = M_GetToken(NULL)) << FRACBITS; + sectors[i].ceilingheight = atol(val) << FRACBITS; if (fastcmp(param, "texturefloor")) - sectors[i].floorpic = P_AddLevelFlat(dat = M_GetToken(NULL), foundflats); + sectors[i].floorpic = P_AddLevelFlat(val, foundflats); else if (fastcmp(param, "textureceiling")) - sectors[i].ceilingpic = P_AddLevelFlat(dat = M_GetToken(NULL), foundflats); + sectors[i].ceilingpic = P_AddLevelFlat(val, foundflats); else if (fastcmp(param, "lightlevel")) - sectors[i].lightlevel = atol(dat = M_GetToken(NULL)); + sectors[i].lightlevel = atol(val); else if (fastcmp(param, "special")) - sectors[i].special = atol(dat = M_GetToken(NULL)); + sectors[i].special = atol(val); else if (fastcmp(param, "id")) - sectors[i].tag = atol(dat = M_GetToken(NULL)); + sectors[i].tag = atol(val); else if (fastcmp(param, "xpanningfloor")) - sectors[i].floor_xoffs = FLOAT_TO_FIXED(atof(dat = M_GetToken(NULL))); + sectors[i].floor_xoffs = FLOAT_TO_FIXED(atof(val)); else if (fastcmp(param, "ypanningfloor")) - sectors[i].floor_yoffs = FLOAT_TO_FIXED(atof(dat = M_GetToken(NULL))); + sectors[i].floor_yoffs = FLOAT_TO_FIXED(atof(val)); else if (fastcmp(param, "xpanningceiling")) - sectors[i].ceiling_xoffs = FLOAT_TO_FIXED(atof(dat = M_GetToken(NULL))); + sectors[i].ceiling_xoffs = FLOAT_TO_FIXED(atof(val)); else if (fastcmp(param, "ypanningceiling")) - sectors[i].ceiling_yoffs = FLOAT_TO_FIXED(atof(dat = M_GetToken(NULL))); + sectors[i].ceiling_yoffs = FLOAT_TO_FIXED(atof(val)); else if (fastcmp(param, "rotationfloor")) - sectors[i].floorpic_angle = FixedAngle(FLOAT_TO_FIXED(atof(dat = M_GetToken(NULL)))); + sectors[i].floorpic_angle = FixedAngle(FLOAT_TO_FIXED(atof(val))); else if (fastcmp(param, "rotationceiling")) - sectors[i].ceilingpic_angle = FixedAngle(FLOAT_TO_FIXED(atof(dat = M_GetToken(NULL)))); + sectors[i].ceilingpic_angle = FixedAngle(FLOAT_TO_FIXED(atof(val))); } -static void ParseTextmapSidedefParameter(UINT32 i, char *param) +static void ParseTextmapSidedefParameter(UINT32 i, char *param, char *val) { if (fastcmp(param, "offsetx")) - sides[i].textureoffset = atol(dat = M_GetToken(NULL))<<FRACBITS; + sides[i].textureoffset = atol(val)<<FRACBITS; else if (fastcmp(param, "offsety")) - sides[i].rowoffset = atol(dat = M_GetToken(NULL))<<FRACBITS; + sides[i].rowoffset = atol(val)<<FRACBITS; else if (fastcmp(param, "texturetop")) - sides[i].toptexture = R_TextureNumForName(dat = M_GetToken(NULL)); + sides[i].toptexture = R_TextureNumForName(val); else if (fastcmp(param, "texturebottom")) - sides[i].bottomtexture = R_TextureNumForName(dat = M_GetToken(NULL)); + sides[i].bottomtexture = R_TextureNumForName(val); else if (fastcmp(param, "texturemiddle")) - sides[i].midtexture = R_TextureNumForName(dat = M_GetToken(NULL)); + sides[i].midtexture = R_TextureNumForName(val); else if (fastcmp(param, "sector")) - P_SetSidedefSector(i, atol(dat = M_GetToken(NULL))); + P_SetSidedefSector(i, atol(val)); else if (fastcmp(param, "repeatcnt")) - sides[i].repeatcnt = atol(dat = M_GetToken(NULL)); + sides[i].repeatcnt = atol(val); } -static void ParseTextmapLinedefParameter(UINT32 i, char *param) +static void ParseTextmapLinedefParameter(UINT32 i, char *param, char *val) { if (fastcmp(param, "id")) - lines[i].tag = atol(dat = M_GetToken(NULL)); + lines[i].tag = atol(val); else if (fastcmp(param, "special")) - lines[i].special = atol(dat = M_GetToken(NULL)); + lines[i].special = atol(val); else if (fastcmp(param, "v1")) - P_SetLinedefV1(i, atol(dat = M_GetToken(NULL))); + P_SetLinedefV1(i, atol(val)); else if (fastcmp(param, "v2")) - P_SetLinedefV2(i, atol(dat = M_GetToken(NULL))); + P_SetLinedefV2(i, atol(val)); else if (fastcmp(param, "sidefront")) - lines[i].sidenum[0] = atol(dat = M_GetToken(NULL)); + lines[i].sidenum[0] = atol(val); else if (fastcmp(param, "sideback")) - lines[i].sidenum[1] = atol(dat = M_GetToken(NULL)); + lines[i].sidenum[1] = atol(val); // Flags - else if (fastcmp(param, "blocking") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "blocking") && fastcmp("true", val)) lines[i].flags |= ML_IMPASSIBLE; - else if (fastcmp(param, "blockmonsters") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "blockmonsters") && fastcmp("true", val)) lines[i].flags |= ML_BLOCKMONSTERS; - else if (fastcmp(param, "twosided") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "twosided") && fastcmp("true", val)) lines[i].flags |= ML_TWOSIDED; - else if (fastcmp(param, "dontpegtop") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "dontpegtop") && fastcmp("true", val)) lines[i].flags |= ML_DONTPEGTOP; - else if (fastcmp(param, "dontpegbottom") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "dontpegbottom") && fastcmp("true", val)) lines[i].flags |= ML_DONTPEGBOTTOM; - else if (fastcmp(param, "skewtd") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "skewtd") && fastcmp("true", val)) lines[i].flags |= ML_EFFECT1; - else if (fastcmp(param, "noclimb") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "noclimb") && fastcmp("true", val)) lines[i].flags |= ML_NOCLIMB; - else if (fastcmp(param, "noskew") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "noskew") && fastcmp("true", val)) lines[i].flags |= ML_EFFECT2; - else if (fastcmp(param, "midpeg") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "midpeg") && fastcmp("true", val)) lines[i].flags |= ML_EFFECT3; - else if (fastcmp(param, "midsolid") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "midsolid") && fastcmp("true", val)) lines[i].flags |= ML_EFFECT4; - else if (fastcmp(param, "wrapmidtex") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "wrapmidtex") && fastcmp("true", val)) lines[i].flags |= ML_EFFECT5; - else if (fastcmp(param, "effect6") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "effect6") && fastcmp("true", val)) lines[i].flags |= ML_EFFECT6; - else if (fastcmp(param, "nonet") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "nonet") && fastcmp("true", val)) lines[i].flags |= ML_NONET; - else if (fastcmp(param, "netonly") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "netonly") && fastcmp("true", val)) lines[i].flags |= ML_NETONLY; - else if (fastcmp(param, "bouncy") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "bouncy") && fastcmp("true", val)) lines[i].flags |= ML_BOUNCY; - else if (fastcmp(param, "transfer") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "transfer") && fastcmp("true", val)) lines[i].flags |= ML_TFERLINE; } -static void ParseTextmapThingParameter(UINT32 i, char *param) +static void ParseTextmapThingParameter(UINT32 i, char *param, char *val) { if (fastcmp(param, "x")) - mapthings[i].x = atol(dat = M_GetToken(NULL)); + mapthings[i].x = atol(val); else if (fastcmp(param, "y")) - mapthings[i].y = atol(dat = M_GetToken(NULL)); + mapthings[i].y = atol(val); else if (fastcmp(param, "height")) - mapthings[i].z = atol(dat = M_GetToken(NULL)); + mapthings[i].z = atol(val); else if (fastcmp(param, "angle")) - mapthings[i].angle = atol(dat = M_GetToken(NULL)); + mapthings[i].angle = atol(val); else if (fastcmp(param, "type")) - mapthings[i].type = atol(dat = M_GetToken(NULL)); + mapthings[i].type = atol(val); // Flags - else if (fastcmp(param, "extra") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "extra") && fastcmp("true", val)) mapthings[i].options |= MTF_EXTRA; - else if (fastcmp(param, "flip") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "flip") && fastcmp("true", val)) mapthings[i].options |= MTF_OBJECTFLIP; - else if (fastcmp(param, "special") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "special") && fastcmp("true", val)) mapthings[i].options |= MTF_OBJECTSPECIAL; - else if (fastcmp(param, "ambush") && fastcmp("true", dat = M_GetToken(NULL))) + else if (fastcmp(param, "ambush") && fastcmp("true", val)) mapthings[i].options |= MTF_AMBUSH; } @@ -1500,32 +1498,33 @@ static void ParseTextmapThingParameter(UINT32 i, char *param) * \param Structure number (mapthings, sectors, ...). * \param Parser function pointer. */ -static void TextmapParse(UINT32 dataPos, size_t num, void (*parser)(UINT32, char *)) +static void TextmapParse(UINT32 dataPos, size_t num, void (*parser)(UINT32, char *, char *)) { - char *tkn; + char *param, *val; M_SetTokenPos(dataPos); - tkn = M_GetToken(NULL); - if (!fastcmp(tkn, "{")) + param = M_GetToken(NULL); + if (!fastcmp(param, "{")) { - Z_Free(tkn); + Z_Free(param); CONS_Alert(CONS_WARNING, "Invalid UDMF data capsule!\n"); return; } + Z_Free(param); - Z_Free(tkn); - tkn = M_GetToken(NULL); - while (!fastcmp(tkn, "}")) + while (true) { - dat = NULL; - parser(num, tkn); - if (dat) - Z_Free(dat); - - Z_Free(tkn); - tkn = M_GetToken(NULL); + param = M_GetToken(NULL); + if (fastcmp(param, "}")) + { + Z_Free(param); + break; + } + val = M_GetToken(NULL); + parser(num, param, val); + Z_Free(param); + Z_Free(val); } - Z_Free(tkn); } #define MAXFLATSIZE (2048<<FRACBITS)