Fix Trick Panel TERRAIN not working

This commit is contained in:
Sally Coolatta 2022-10-11 01:31:06 -04:00
parent 8d6d8fff6b
commit 7559169144
6 changed files with 96 additions and 65 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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;

View file

@ -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);
}

View file

@ -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;

View file

@ -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};