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; spriteinfo_t *info;
spritenum_t sprnum; spritenum_t sprnum;
playersprite_t spr2num; playersprite_t spr2num;
boolean any;
INT32 skinnumbers[MAXSKINS]; INT32 skinnumbers[MAXSKINS];
INT32 foundskins; INT32 foundskins;
}; };
#define PARSER_FRAME (false)
#define PARSER_DEFAULT (true)
static void R_ParseSpriteInfoSkin(struct ParseSpriteInfoState *parser) static void R_ParseSpriteInfoSkin(struct ParseSpriteInfoState *parser)
{ {
char *sprinfoToken; 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"); 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 // copy skin name yada yada
sprinfoTokenLength = strlen(sprinfoToken); sprinfoTokenLength = strlen(sprinfoToken);
skinName = (char *)Z_Malloc((sprinfoTokenLength+1)*sizeof(char),PU_STATIC,NULL); 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->skinnumbers[parser->foundskins] = skinnum;
parser->foundskins++; parser->foundskins++;
}
Z_Free(sprinfoToken); Z_Free(sprinfoToken);
} }
@ -1442,10 +1453,22 @@ static void copy_to_skin (struct ParseSpriteInfoState *parser, INT32 skinnum)
skin_t *skin = &skins[skinnum]; skin_t *skin = &skins[skinnum];
spriteinfo_t *sprinfo = skin->sprinfo; 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)); 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; char *sprinfoToken;
size_t sprinfoTokenLength; size_t sprinfoTokenLength;
@ -1455,6 +1478,12 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser)
INT16 frameYPivot = 0; INT16 frameYPivot = 0;
rotaxis_t frameRotAxis = 0; rotaxis_t frameRotAxis = 0;
if (all)
{
frameFrame = SPRINFO_DEFAULT_PIVOT;
}
else
{
// Sprite identifier // Sprite identifier
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
if (sprinfoToken == NULL) if (sprinfoToken == NULL)
@ -1471,6 +1500,7 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser)
frameFrame = R_Char2Frame(frameChar[0]); frameFrame = R_Char2Frame(frameChar[0]);
Z_Free(sprinfoToken); Z_Free(sprinfoToken);
}
// Left Curly Brace // Left Curly Brace
sprinfoToken = M_GetToken(NULL); 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].y = frameYPivot;
parser->info->pivot[frameFrame].rotaxis = frameRotAxis; parser->info->pivot[frameFrame].rotaxis = frameRotAxis;
set_bit_array(parser->info->available, frameFrame);
if (parser->spr2) if (parser->spr2)
{ {
INT32 i; INT32 i;
@ -1535,15 +1567,37 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser)
if (!parser->foundskins) if (!parser->foundskins)
I_Error("Error parsing SPRTINFO lump: No skins specified in this sprite2 definition"); 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++) for (i = 0; i < parser->foundskins; i++)
{ {
copy_to_skin(parser, parser->skinnumbers[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 else
{ {
M_Memcpy(&spriteinfo[parser->sprnum], parser->info, sizeof(spriteinfo_t)); M_Memcpy(&spriteinfo[parser->sprnum], parser->info, sizeof(spriteinfo_t));
} }
}
} }
// //
@ -1561,6 +1615,7 @@ static void R_ParseSpriteInfo(boolean spr2)
.spr2 = spr2, .spr2 = spr2,
.sprnum = NUMSPRITES, .sprnum = NUMSPRITES,
.spr2num = NUMPLAYERSPRITES, .spr2num = NUMPLAYERSPRITES,
.any = false,
.foundskins = 0, .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"); 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); sprinfoTokenLength = strlen(sprinfoToken);
if (sprinfoTokenLength != 4) 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 // ^^ 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 strupr(newSpriteName); // Just do this now so we don't have to worry about it
} }
}
Z_Free(sprinfoToken); Z_Free(sprinfoToken);
if (!spr2) if (parser.any)
;
else if (!spr2)
{ {
for (i = 0; i <= NUMSPRITES; i++) for (i = 0; i <= NUMSPRITES; i++)
{ {
@ -1617,7 +1681,6 @@ static void R_ParseSpriteInfo(boolean spr2)
// allocate a spriteinfo // allocate a spriteinfo
parser.info = Z_Calloc(sizeof(spriteinfo_t), PU_STATIC, NULL); parser.info = Z_Calloc(sizeof(spriteinfo_t), PU_STATIC, NULL);
parser.info->available = true;
// Left Curly Brace // Left Curly Brace
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
@ -1646,7 +1709,12 @@ static void R_ParseSpriteInfo(boolean spr2)
else if (stricmp(sprinfoToken, "FRAME")==0) else if (stricmp(sprinfoToken, "FRAME")==0)
{ {
Z_Free(sprinfoToken); 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 else
{ {