mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 17:22:12 +00:00
Started work on FLIPX/FLIPY support for patches. Doesn't do anything yet, but the parser should know how to look for them now
Note: I had to create M_UnGetToken in order to avoid problems with looking for patch parameters (marked by { and }) but not finding anything
This commit is contained in:
parent
326ad8a14f
commit
587c0079e2
5 changed files with 64 additions and 4 deletions
|
@ -2778,7 +2778,7 @@ static void readpatch(MYFILE *f, const char *name, UINT16 wad)
|
|||
char *word2;
|
||||
char *tmp;
|
||||
INT32 i = 0, j = 0, value;
|
||||
texpatch_t patch = {0, 0, UINT16_MAX, UINT16_MAX};
|
||||
texpatch_t patch = {0, 0, UINT16_MAX, UINT16_MAX, 0};
|
||||
|
||||
// Jump to the texture this patch belongs to, which,
|
||||
// coincidentally, is always the last one on the buffer cache.
|
||||
|
|
|
@ -407,6 +407,7 @@ 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);
|
||||
char *sizeu1(size_t num);
|
||||
char *sizeu2(size_t num);
|
||||
char *sizeu3(size_t num);
|
||||
|
|
21
src/m_misc.c
21
src/m_misc.c
|
@ -1617,6 +1617,11 @@ INT32 axtoi(const char *hexStg)
|
|||
return intValue;
|
||||
}
|
||||
|
||||
// Token parser variables
|
||||
|
||||
static UINT32 oldendPos = 0; // old value of endPos, used by M_UnGetToken
|
||||
static UINT32 endPos = 0; // now external to M_GetToken, but still static
|
||||
|
||||
/** Token parser for TEXTURES, ANIMDEFS, and potentially other lumps later down the line.
|
||||
* Was originally R_GetTexturesToken when I was coding up the TEXTURES parser, until I realized I needed it for ANIMDEFS too.
|
||||
* Parses up to the next whitespace character or comma. When finding the start of the next token, whitespace is skipped.
|
||||
|
@ -1631,7 +1636,7 @@ char *M_GetToken(const char *inputString)
|
|||
{
|
||||
static const char *stringToUse = NULL; // Populated if inputString != NULL; used otherwise
|
||||
static UINT32 startPos = 0;
|
||||
static UINT32 endPos = 0;
|
||||
// static UINT32 endPos = 0;
|
||||
static UINT32 stringLength = 0;
|
||||
static UINT8 inComment = 0; // 0 = not in comment, 1 = // Single-line, 2 = /* Multi-line */
|
||||
char *texturesToken = NULL;
|
||||
|
@ -1641,12 +1646,12 @@ char *M_GetToken(const char *inputString)
|
|||
{
|
||||
stringToUse = inputString;
|
||||
startPos = 0;
|
||||
endPos = 0;
|
||||
oldendPos = endPos = 0;
|
||||
stringLength = strlen(inputString);
|
||||
}
|
||||
else
|
||||
{
|
||||
startPos = endPos;
|
||||
startPos = oldendPos = endPos;
|
||||
}
|
||||
if (stringToUse == NULL)
|
||||
return NULL;
|
||||
|
@ -1777,6 +1782,16 @@ char *M_GetToken(const char *inputString)
|
|||
return texturesToken;
|
||||
}
|
||||
|
||||
/** Undoes the last M_GetToken call
|
||||
* The current position along the string being parsed is reset to the last saved position.
|
||||
* This exists mostly because of R_ParseTexture/R_ParsePatch honestly, but could be useful elsewhere?
|
||||
* -Monster Iestyn (22/10/16)
|
||||
*/
|
||||
void M_UnGetToken(void)
|
||||
{
|
||||
endPos = oldendPos;
|
||||
}
|
||||
|
||||
/** Count bits in a number.
|
||||
*/
|
||||
UINT8 M_CountBits(UINT32 num, UINT8 size)
|
||||
|
|
43
src/r_data.c
43
src/r_data.c
|
@ -502,6 +502,7 @@ static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
|
|||
char *patchName = NULL;
|
||||
INT16 patchXPos;
|
||||
INT16 patchYPos;
|
||||
UINT8 flip = 0;
|
||||
texpatch_t *resultPatch = NULL;
|
||||
lumpnum_t patchLumpNum;
|
||||
|
||||
|
@ -598,6 +599,47 @@ static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
|
|||
}
|
||||
Z_Free(texturesToken);
|
||||
|
||||
// Patch parameters block (OPTIONAL)
|
||||
// added by Monster Iestyn (22/10/16)
|
||||
|
||||
// Left Curly Brace
|
||||
texturesToken = M_GetToken(NULL);
|
||||
if (texturesToken == NULL)
|
||||
; // move on and ignore, R_ParseTextures will deal with this
|
||||
else
|
||||
{
|
||||
if (strcmp(texturesToken,"{")==0)
|
||||
{
|
||||
Z_Free(texturesToken);
|
||||
texturesToken = M_GetToken(NULL);
|
||||
if (texturesToken == NULL)
|
||||
{
|
||||
I_Error("Error parsing TEXTURES lump: Unexpected end of file where patch \"%s\"'s parameters should be",patchName);
|
||||
}
|
||||
while (strcmp(texturesToken,"}")!=0)
|
||||
{
|
||||
if (stricmp(texturesToken, "FLIPX")==0)
|
||||
flip |= 1;
|
||||
else if (stricmp(texturesToken, "FLIPY")==0)
|
||||
flip |= 2;
|
||||
Z_Free(texturesToken);
|
||||
|
||||
texturesToken = M_GetToken(NULL);
|
||||
if (texturesToken == NULL)
|
||||
{
|
||||
I_Error("Error parsing TEXTURES lump: Unexpected end of file where patch \"%s\"'s parameters or right curly brace should be",patchName);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// this is not what we wanted...
|
||||
// undo last read so R_ParseTextures can re-get the token for its own purposes
|
||||
M_UnGetToken();
|
||||
}
|
||||
Z_Free(texturesToken);
|
||||
}
|
||||
|
||||
if (actuallyLoadPatch == true)
|
||||
{
|
||||
// Check lump exists
|
||||
|
@ -608,6 +650,7 @@ static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
|
|||
resultPatch->originy = patchYPos;
|
||||
resultPatch->lump = patchLumpNum & 65535;
|
||||
resultPatch->wad = patchLumpNum>>16;
|
||||
resultPatch->flip = flip;
|
||||
// Clean up a little after ourselves
|
||||
Z_Free(patchName);
|
||||
// Then return it
|
||||
|
|
|
@ -31,6 +31,7 @@ typedef struct
|
|||
// Block origin (always UL), which has already accounted for the internal origin of the patch.
|
||||
INT16 originx, originy;
|
||||
UINT16 wad, lump;
|
||||
UINT8 flip; // 1 = flipx, 2 = flipy, 3 = both
|
||||
} texpatch_t;
|
||||
|
||||
// A maptexturedef_t describes a rectangular texture,
|
||||
|
|
Loading…
Reference in a new issue