Update and extend R_ParseSpriteInfo for default pivot

- Set default pivot with DEFAULT block
- Use wildcard star (*) with Sprite/Sprite2Info/Skin to
iterate over all sprites and/or skins
This commit is contained in:
James R 2022-09-21 12:32:06 -07:00
parent 5a631b302d
commit 0912ebaaa3

View file

@ -1401,10 +1401,14 @@ struct ParseSpriteInfoState {
spriteinfo_t *info;
spritenum_t sprnum;
playersprite_t spr2num;
boolean any;
INT32 skinnumbers[MAXSKINS];
INT32 foundskins;
};
#define PARSER_FRAME (false)
#define PARSER_DEFAULT (true)
static void R_ParseSpriteInfoSkin(struct ParseSpriteInfoState *parser)
{
char *sprinfoToken;
@ -1420,6 +1424,12 @@ static void R_ParseSpriteInfoSkin(struct ParseSpriteInfoState *parser)
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where skin frame should be");
}
if (strcmp(sprinfoToken, "*")==0) // All skins
{
parser->foundskins = -1;
}
else
{
// copy skin name yada yada
sprinfoTokenLength = strlen(sprinfoToken);
skinName = (char *)Z_Malloc((sprinfoTokenLength+1)*sizeof(char),PU_STATIC,NULL);
@ -1433,6 +1443,7 @@ static void R_ParseSpriteInfoSkin(struct ParseSpriteInfoState *parser)
parser->skinnumbers[parser->foundskins] = skinnum;
parser->foundskins++;
}
Z_Free(sprinfoToken);
}
@ -1442,10 +1453,22 @@ static void copy_to_skin (struct ParseSpriteInfoState *parser, INT32 skinnum)
skin_t *skin = &skins[skinnum];
spriteinfo_t *sprinfo = skin->sprinfo;
if (parser->any)
{
playersprite_t spr2num;
for (spr2num = 0; spr2num < NUMPLAYERSPRITES; ++spr2num)
{
M_Memcpy(&sprinfo[spr2num], parser->info, sizeof(spriteinfo_t));
}
}
else
{
M_Memcpy(&sprinfo[parser->spr2num], parser->info, sizeof(spriteinfo_t));
}
}
static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser)
static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser, boolean all)
{
char *sprinfoToken;
size_t sprinfoTokenLength;
@ -1455,6 +1478,12 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser)
INT16 frameYPivot = 0;
rotaxis_t frameRotAxis = 0;
if (all)
{
frameFrame = SPRINFO_DEFAULT_PIVOT;
}
else
{
// Sprite identifier
sprinfoToken = M_GetToken(NULL);
if (sprinfoToken == NULL)
@ -1471,6 +1500,7 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser)
frameFrame = R_Char2Frame(frameChar[0]);
Z_Free(sprinfoToken);
}
// Left Curly Brace
sprinfoToken = M_GetToken(NULL);
@ -1528,6 +1558,8 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser)
parser->info->pivot[frameFrame].y = frameYPivot;
parser->info->pivot[frameFrame].rotaxis = frameRotAxis;
set_bit_array(parser->info->available, frameFrame);
if (parser->spr2)
{
INT32 i;
@ -1535,15 +1567,37 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser)
if (!parser->foundskins)
I_Error("Error parsing SPRTINFO lump: No skins specified in this sprite2 definition");
if (parser->foundskins < 0)
{
for (i = 0; i < numskins; i++)
{
copy_to_skin(parser, i);
}
}
else
{
for (i = 0; i < parser->foundskins; i++)
{
copy_to_skin(parser, parser->skinnumbers[i]);
}
}
}
else
{
if (parser->any)
{
spritenum_t sprnum;
for (sprnum = 0; sprnum < NUMSPRITES; ++sprnum)
{
M_Memcpy(&spriteinfo[sprnum], parser->info, sizeof(spriteinfo_t));
}
}
else
{
M_Memcpy(&spriteinfo[parser->sprnum], parser->info, sizeof(spriteinfo_t));
}
}
}
//
@ -1561,6 +1615,7 @@ static void R_ParseSpriteInfo(boolean spr2)
.spr2 = spr2,
.sprnum = NUMSPRITES,
.spr2num = NUMPLAYERSPRITES,
.any = false,
.foundskins = 0,
};
@ -1573,6 +1628,12 @@ static void R_ParseSpriteInfo(boolean spr2)
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where sprite name should be");
}
if (!strcmp(sprinfoToken, "*")) // All sprites
{
parser.any = true;
}
else
{
sprinfoTokenLength = strlen(sprinfoToken);
if (sprinfoTokenLength != 4)
{
@ -1585,10 +1646,13 @@ static void R_ParseSpriteInfo(boolean spr2)
// ^^ we've confirmed that the token is == 4 characters so it will never overflow a 5 byte char buffer
strupr(newSpriteName); // Just do this now so we don't have to worry about it
}
}
Z_Free(sprinfoToken);
if (!spr2)
if (parser.any)
;
else if (!spr2)
{
for (i = 0; i <= NUMSPRITES; i++)
{
@ -1617,7 +1681,6 @@ static void R_ParseSpriteInfo(boolean spr2)
// allocate a spriteinfo
parser.info = Z_Calloc(sizeof(spriteinfo_t), PU_STATIC, NULL);
parser.info->available = true;
// Left Curly Brace
sprinfoToken = M_GetToken(NULL);
@ -1646,7 +1709,12 @@ static void R_ParseSpriteInfo(boolean spr2)
else if (stricmp(sprinfoToken, "FRAME")==0)
{
Z_Free(sprinfoToken);
R_ParseSpriteInfoFrame(&parser);
R_ParseSpriteInfoFrame(&parser, PARSER_FRAME);
}
else if (stricmp(sprinfoToken, "DEFAULT")==0)
{
Z_Free(sprinfoToken);
R_ParseSpriteInfoFrame(&parser, PARSER_DEFAULT);
}
else
{