From 755916914499e2f1c7436a299409fa9a26d18c31 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Tue, 11 Oct 2022 01:31:06 -0400 Subject: [PATCH] Fix Trick Panel TERRAIN not working --- src/doomdef.h | 4 ++ src/k_brightmap.c | 29 +++++++------ src/k_brightmap.h | 4 +- src/k_terrain.c | 105 +++++++++++++++++++++++++++------------------- src/k_terrain.h | 12 +++--- src/m_misc.c | 7 ++++ 6 files changed, 96 insertions(+), 65 deletions(-) diff --git a/src/doomdef.h b/src/doomdef.h index 89812872b..96ef10769 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -503,13 +503,17 @@ extern char liveeventbackup[256]; void M_StartupLocale(void); extern void *(*M_Memcpy)(void* dest, const void* src, size_t n) FUNCNONNULL; char *va(const char *format, ...) FUNCPRINTF; + char *M_GetToken(const char *inputString); void M_UnGetToken(void); +UINT32 M_GetTokenPos(void); + void M_TokenizerOpen(const char *inputString); void M_TokenizerClose(void); const char *M_TokenizerRead(UINT32 i); UINT32 M_TokenizerGetEndPos(void); void M_TokenizerSetEndPos(UINT32 newPos); + char *sizeu1(size_t num); char *sizeu2(size_t num); char *sizeu3(size_t num); diff --git a/src/k_brightmap.c b/src/k_brightmap.c index d5ed88e2a..a70d7a955 100644 --- a/src/k_brightmap.c +++ b/src/k_brightmap.c @@ -86,29 +86,31 @@ static brightmapStorage_t *K_GetBrightmapStorageByTextureName(const char *checkN } /*-------------------------------------------------- - static boolean K_BRIGHTLumpParser(size_t size) + static boolean K_BRIGHTLumpParser(UINT8 *data, size_t size) Parses inputted lump data as a BRIGHT lump. Input Arguments:- + data - Pointer to lump data. size - The length of the lump data. Return:- false if any errors occured, otherwise true. --------------------------------------------------*/ -static boolean K_BRIGHTLumpParser(size_t size) +static boolean K_BRIGHTLumpParser(UINT8 *data, size_t size) { - const char *tkn = M_TokenizerRead(0); + char *tkn = M_GetToken((char *)data); size_t pos = 0; - while (tkn && (pos = M_TokenizerGetEndPos()) < size) + while (tkn && (pos = M_GetTokenPos()) < size) { boolean valid = true; if (stricmp(tkn, "texture") == 0) { - tkn = M_TokenizerRead(0); - pos = M_TokenizerGetEndPos(); + Z_Free(tkn); + tkn = M_GetToken(NULL); + pos = M_GetTokenPos(); if (tkn && pos < size) { @@ -121,8 +123,9 @@ static boolean K_BRIGHTLumpParser(size_t size) bms->textureHash = quickncasehash(tkn, 8); } - tkn = M_TokenizerRead(0); - pos = M_TokenizerGetEndPos(); + Z_Free(tkn); + tkn = M_GetToken(NULL); + pos = M_GetTokenPos(); if (tkn && pos < size) { @@ -148,14 +151,17 @@ static boolean K_BRIGHTLumpParser(size_t size) valid = false; } + Z_Free(tkn); + if (valid == false) { return false; } - tkn = M_TokenizerRead(0); + tkn = M_GetToken(NULL); } + Z_Free(tkn); return true; } @@ -192,10 +198,7 @@ void K_InitBrightmapsPwad(INT32 wadNum) size = W_LumpLengthPwad(wadNum, lumpNum); CONS_Printf(M_GetText("Loading BRIGHT from %s\n"), name); - - M_TokenizerOpen((char *)data); - K_BRIGHTLumpParser(size); - M_TokenizerClose(); + K_BRIGHTLumpParser(data, size); free(name); Z_Free(data); diff --git a/src/k_brightmap.h b/src/k_brightmap.h index 33a1faec2..9ed86b125 100644 --- a/src/k_brightmap.h +++ b/src/k_brightmap.h @@ -23,10 +23,10 @@ typedef struct brightmapStorage_s // Stores data for brightmap definitions, // before putting them into texturebrightmaps. - char textureName[8]; // The texture's name. + char textureName[9]; // The texture's name. UINT32 textureHash; // The texture name's hash. - char brightmapName[8]; // The brightmap's name. + char brightmapName[9]; // The brightmap's name. UINT32 brightmapHash; // The brightmap name's hash. } brightmapStorage_t; diff --git a/src/k_terrain.c b/src/k_terrain.c index 4f6367b3e..cd420e37a 100644 --- a/src/k_terrain.c +++ b/src/k_terrain.c @@ -1087,7 +1087,7 @@ void K_UpdateTerrainOverlay(mobj_t *mo) } /*-------------------------------------------------- - static void K_FlagBoolean(UINT32 *inputFlags, UINT32 newFlag, const char *val) + static void K_FlagBoolean(UINT32 *inputFlags, UINT32 newFlag, char *val) Sets a flag to true or false depending on the string input. @@ -1100,7 +1100,7 @@ void K_UpdateTerrainOverlay(mobj_t *mo) Return:- None --------------------------------------------------*/ -static void K_FlagBoolean(UINT32 *inputFlags, UINT32 newFlag, const char *val) +static void K_FlagBoolean(UINT32 *inputFlags, UINT32 newFlag, char *val) { if (stricmp(val, "true") == 0) { @@ -1158,7 +1158,7 @@ static void K_NewSplashDefs(void) } /*-------------------------------------------------- - static void K_ParseSplashParameter(size_t i, const char *param, const char *val) + static void K_ParseSplashParameter(size_t i, char *param, char *val) Parser function for Splash blocks. @@ -1170,7 +1170,7 @@ static void K_NewSplashDefs(void) Return:- None --------------------------------------------------*/ -static void K_ParseSplashParameter(size_t i, const char *param, const char *val) +static void K_ParseSplashParameter(size_t i, char *param, char *val) { t_splash_t *splash = &splashDefs[i]; @@ -1260,7 +1260,7 @@ static void K_NewFootstepDefs(void) } /*-------------------------------------------------- - static void K_ParseFootstepParameter(size_t i, const char *param, const char *val) + static void K_ParseFootstepParameter(size_t i, char *param, char *val) Parser function for Footstep blocks. @@ -1272,7 +1272,7 @@ static void K_NewFootstepDefs(void) Return:- None --------------------------------------------------*/ -static void K_ParseFootstepParameter(size_t i, const char *param, const char *val) +static void K_ParseFootstepParameter(size_t i, char *param, char *val) { t_footstep_t *footstep = &footstepDefs[i]; @@ -1367,7 +1367,7 @@ static void K_NewOverlayDefs(void) } /*-------------------------------------------------- - static void K_ParseOverlayParameter(size_t i, const char *param, const char *val) + static void K_ParseOverlayParameter(size_t i, char *param, char *val) Parser function for Overlay blocks. @@ -1379,7 +1379,7 @@ static void K_NewOverlayDefs(void) Return:- None --------------------------------------------------*/ -static void K_ParseOverlayParameter(size_t i, const char *param, const char *val) +static void K_ParseOverlayParameter(size_t i, char *param, char *val) { t_overlay_t *overlay = &overlayDefs[i]; @@ -1449,7 +1449,7 @@ static void K_NewTerrainDefs(void) } /*-------------------------------------------------- - static void K_ParseTerrainParameter(size_t i, const char *param, const char *val) + static void K_ParseTerrainParameter(size_t i, char *param, char *val) Parser function for Terrain blocks. @@ -1461,7 +1461,7 @@ static void K_NewTerrainDefs(void) Return:- None --------------------------------------------------*/ -static void K_ParseTerrainParameter(size_t i, const char *param, const char *val) +static void K_ParseTerrainParameter(size_t i, char *param, char *val) { terrain_t *terrain = &terrainDefs[i]; @@ -1486,7 +1486,7 @@ static void K_ParseTerrainParameter(size_t i, const char *param, const char *val } else if (stricmp(param, "offroad") == 0) { - terrain->offroad = FLOAT_TO_FIXED(atof(val)); + terrain->offroad = (UINT8)get_number(val); // offroad strength enum? } else if (stricmp(param, "damageType") == 0) { @@ -1536,7 +1536,7 @@ static void K_NewTerrainFloorDefs(void) } /*-------------------------------------------------- - static boolean K_DoTERRAINLumpParse(size_t num, void (*parser)(size_t, const char *, const char *)) + static boolean K_DoTERRAINLumpParse(size_t num, void (*parser)(UINT32, char *, char *)) Runs another parser function for the TERRAIN lump, handling the nitty-gritty parts of the @@ -1549,53 +1549,61 @@ static void K_NewTerrainFloorDefs(void) Return:- false if any errors occured, otherwise true. --------------------------------------------------*/ -static boolean K_DoTERRAINLumpParse(size_t num, void (*parser)(size_t, const char *, const char *)) +static boolean K_DoTERRAINLumpParse(size_t num, void (*parser)(size_t, char *, char *)) { - const char *param, *val; + char *param, *val; - param = M_TokenizerRead(0); + param = M_GetToken(NULL); if (!fastcmp(param, "{")) { + Z_Free(param); CONS_Alert(CONS_WARNING, "Invalid TERRAIN data capsule!\n"); return false; } + Z_Free(param); + while (true) { - param = M_TokenizerRead(0); + param = M_GetToken(NULL); if (fastcmp(param, "}")) { + Z_Free(param); break; } - val = M_TokenizerRead(1); + val = M_GetToken(NULL); parser(num, param, val); + + Z_Free(param); + Z_Free(val); } return true; } /*-------------------------------------------------- - static boolean K_TERRAINLumpParser(size_t size) + static boolean K_TERRAINLumpParser(UINT8 *data, size_t size) Parses inputted lump data as a TERRAIN lump. Input Arguments:- + data - Pointer to lump data. size - The length of the lump data. Return:- false if any errors occured, otherwise true. --------------------------------------------------*/ -static boolean K_TERRAINLumpParser(size_t size) +static boolean K_TERRAINLumpParser(UINT8 *data, size_t size) { - const char *tkn = M_TokenizerRead(0); + char *tkn = M_GetToken((char *)data); UINT32 tknHash = 0; size_t pos = 0; size_t i; - while (tkn && (pos = M_TokenizerGetEndPos()) < size) + while (tkn && (pos = M_GetTokenPos()) < size) { boolean valid = true; @@ -1608,8 +1616,9 @@ static boolean K_TERRAINLumpParser(size_t size) // Check for valid fields. else if (stricmp(tkn, "splash") == 0) { - tkn = M_TokenizerRead(0); - pos = M_TokenizerGetEndPos(); + Z_Free(tkn); + tkn = M_GetToken(NULL); + pos = M_GetTokenPos(); if (tkn && pos < size) { @@ -1648,8 +1657,9 @@ static boolean K_TERRAINLumpParser(size_t size) } else if (stricmp(tkn, "footstep") == 0) { - tkn = M_TokenizerRead(0); - pos = M_TokenizerGetEndPos(); + Z_Free(tkn); + tkn = M_GetToken(NULL); + pos = M_GetTokenPos(); if (tkn && pos < size) { @@ -1688,8 +1698,9 @@ static boolean K_TERRAINLumpParser(size_t size) } else if (stricmp(tkn, "overlay") == 0) { - tkn = M_TokenizerRead(0); - pos = M_TokenizerGetEndPos(); + Z_Free(tkn); + tkn = M_GetToken(NULL); + pos = M_GetTokenPos(); if (tkn && pos < size) { @@ -1728,8 +1739,9 @@ static boolean K_TERRAINLumpParser(size_t size) } else if (stricmp(tkn, "terrain") == 0) { - tkn = M_TokenizerRead(0); - pos = M_TokenizerGetEndPos(); + Z_Free(tkn); + tkn = M_GetToken(NULL); + pos = M_GetTokenPos(); if (tkn && pos < size) { @@ -1768,8 +1780,9 @@ static boolean K_TERRAINLumpParser(size_t size) } else if (stricmp(tkn, "floor") == 0 || stricmp(tkn, "texture") == 0) { - tkn = M_TokenizerRead(0); - pos = M_TokenizerGetEndPos(); + Z_Free(tkn); + tkn = M_GetToken(NULL); + pos = M_GetTokenPos(); if (tkn && pos < size) { @@ -1777,8 +1790,9 @@ static boolean K_TERRAINLumpParser(size_t size) { // "optional" is ZDoom syntax // We don't use it, but we can ignore it. - tkn = M_TokenizerRead(0); - pos = M_TokenizerGetEndPos(); + Z_Free(tkn); + tkn = M_GetToken(NULL); + pos = M_GetTokenPos(); } if (tkn && pos < size) @@ -1806,8 +1820,9 @@ static boolean K_TERRAINLumpParser(size_t size) f->textureHash = tknHash; } - tkn = M_TokenizerRead(0); - pos = M_TokenizerGetEndPos(); + Z_Free(tkn); + tkn = M_GetToken(NULL); + pos = M_GetTokenPos(); if (tkn && pos < size) { @@ -1844,8 +1859,9 @@ static boolean K_TERRAINLumpParser(size_t size) } else if (stricmp(tkn, "defaultTerrain") == 0) { - tkn = M_TokenizerRead(0); - pos = M_TokenizerGetEndPos(); + Z_Free(tkn); + tkn = M_GetToken(NULL); + pos = M_GetTokenPos(); if (tkn && pos < size) { @@ -1882,8 +1898,9 @@ static boolean K_TERRAINLumpParser(size_t size) } else if (stricmp(tkn, "defaultOffroadFootstep") == 0) { - tkn = M_TokenizerRead(0); - pos = M_TokenizerGetEndPos(); + Z_Free(tkn); + tkn = M_GetToken(NULL); + pos = M_GetTokenPos(); if (tkn && pos < size) { @@ -1924,14 +1941,17 @@ static boolean K_TERRAINLumpParser(size_t size) valid = false; } + Z_Free(tkn); + if (valid == false) { return false; } - tkn = M_TokenizerRead(0); + tkn = M_GetToken(NULL); } + Z_Free(tkn); return true; } @@ -1977,10 +1997,7 @@ void K_InitTerrain(UINT16 wadNum) size = W_LumpLengthPwad(wadNum, lumpNum); CONS_Printf(M_GetText("Loading TERRAIN from %s\n"), name); - - M_TokenizerOpen((char *)data); - K_TERRAINLumpParser(size); - M_TokenizerClose(); + K_TERRAINLumpParser(data, size); free(name); } diff --git a/src/k_terrain.h b/src/k_terrain.h index 399b6ba1c..a119cf8f5 100644 --- a/src/k_terrain.h +++ b/src/k_terrain.h @@ -27,7 +27,7 @@ typedef struct t_splash_s // Splash definition. // These are particles spawned when hitting the floor. - char name[TERRAIN_NAME_LEN]; // Lookup name. + char name[TERRAIN_NAME_LEN+1]; // Lookup name. UINT32 hash; // Lookup name's hash. UINT16 mobjType; // Thing type. MT_NULL to not spawn anything. @@ -48,7 +48,7 @@ typedef struct t_footstep_s // Footstep definition. // These are particles spawned when moving fast enough on a floor. - char name[TERRAIN_NAME_LEN]; // Lookup name. + char name[TERRAIN_NAME_LEN+1]; // Lookup name. UINT32 hash; // Lookup name's hash. UINT16 mobjType; // Thing type. MT_NULL to not spawn anything. @@ -80,7 +80,7 @@ typedef struct t_overlay_s // Overlay definition. // These are sprites displayed on top of the base object. - char name[TERRAIN_NAME_LEN]; // Lookup name. + char name[TERRAIN_NAME_LEN+1]; // Lookup name. UINT32 hash; // Lookup name's hash. UINT16 states[TOV__MAX]; // State to use when the object is still. @@ -103,7 +103,7 @@ typedef struct terrain_s // Terrain definition. // These are all of the properties that the floor gets. - char name[TERRAIN_NAME_LEN]; // Lookup name. + char name[TERRAIN_NAME_LEN+1]; // Lookup name. UINT32 hash; // Lookup name's hash. size_t splashID; // Splash defintion ID. @@ -113,7 +113,7 @@ typedef struct terrain_s fixed_t friction; // The default friction of this texture. fixed_t offroad; // The default offroad level of this texture. INT16 damageType; // The default damage type of this texture. (Negative means no damage). - UINT8 trickPanel; // Trick panel strength + fixed_t trickPanel; // Trick panel strength fixed_t floorClip; // Offset for sprites on this ground UINT32 flags; // Flag values (see: terrain_flags_t) } terrain_t; @@ -123,7 +123,7 @@ typedef struct t_floor_s // Terrain floor definition. // Ties a texture name to a terrain definition. - char textureName[8]; // Floor texture name. + char textureName[9]; // Floor texture name. UINT32 textureHash; // Floor texture hash. size_t terrainID; // Terrain definition ID. } t_floor_t; diff --git a/src/m_misc.c b/src/m_misc.c index 3826b40d8..cf03c5e2d 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -2074,6 +2074,13 @@ void M_UnGetToken(void) endPos = oldendPos; } +/** Returns the current token's position. + */ +UINT32 M_GetTokenPos(void) +{ + return endPos; +} + #define NUMTOKENS 2 static const char *tokenizerInput = NULL; static UINT32 tokenCapacity[NUMTOKENS] = {0};