SPRTINFO: print warnings instead of I_Error (don't crash the game)

This commit is contained in:
James R 2023-08-31 05:22:13 -07:00
parent 7113e3c987
commit 48d1b72ac7

View file

@ -1466,7 +1466,7 @@ static void copy_to_skin (struct ParseSpriteInfoState *parser, INT32 skinnum)
} }
} }
static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser, boolean all) static boolean R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser, boolean all)
{ {
char *sprinfoToken; char *sprinfoToken;
size_t sprinfoTokenLength; size_t sprinfoTokenLength;
@ -1487,12 +1487,15 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser, boolean
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
if (sprinfoToken == NULL) if (sprinfoToken == NULL)
{ {
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where sprite frame should be"); CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Unexpected end of file where sprite frame should be\n");
return false;
} }
sprinfoTokenLength = strlen(sprinfoToken); sprinfoTokenLength = strlen(sprinfoToken);
if (sprinfoTokenLength != 1) if (sprinfoTokenLength != 1)
{ {
I_Error("Error parsing SPRTINFO lump: Invalid frame \"%s\"",sprinfoToken); CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Invalid frame \"%s\"\n",sprinfoToken);
Z_Free(sprinfoToken);
return false;
} }
else else
frameChar = sprinfoToken; frameChar = sprinfoToken;
@ -1504,7 +1507,10 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser, boolean
// Left Curly Brace // Left Curly Brace
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
if (sprinfoToken == NULL) if (sprinfoToken == NULL)
I_Error("Error parsing SPRTINFO lump: Missing sprite info"); {
CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Missing sprite info\n");
return false;
}
else else
{ {
if (strcmp(sprinfoToken,"{")==0) if (strcmp(sprinfoToken,"{")==0)
@ -1513,7 +1519,8 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser, boolean
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
if (sprinfoToken == NULL) if (sprinfoToken == NULL)
{ {
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where sprite info should be"); CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Unexpected end of file where sprite info should be\n");
return false;
} }
while (strcmp(sprinfoToken,"}")!=0) while (strcmp(sprinfoToken,"}")!=0)
{ {
@ -1550,7 +1557,8 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser, boolean
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
if (sprinfoToken == NULL) if (sprinfoToken == NULL)
{ {
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where sprite info or right curly brace should be"); CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Unexpected end of file where sprite info or right curly brace should be\n");
return false;
} }
} }
} }
@ -1574,7 +1582,11 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser, boolean
INT32 i; INT32 i;
if (!parser->foundskins) if (!parser->foundskins)
I_Error("Error parsing SPRTINFO lump: No skins specified in this sprite2 definition"); {
CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: No skins specified in this sprite2 definition\n");
Z_Free(bright);
return false;
}
if (parser->foundskins < 0) if (parser->foundskins < 0)
{ {
@ -1607,6 +1619,8 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser, boolean
M_Memcpy(&spriteinfo[parser->sprnum], parser->info, sizeof(spriteinfo_t)); M_Memcpy(&spriteinfo[parser->sprnum], parser->info, sizeof(spriteinfo_t));
} }
} }
return true;
} }
// //
@ -1614,7 +1628,7 @@ static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser, boolean
// //
// Parse a SPRTINFO lump. // Parse a SPRTINFO lump.
// //
static void R_ParseSpriteInfo(boolean spr2) static boolean R_ParseSpriteInfo(boolean spr2)
{ {
char *sprinfoToken; char *sprinfoToken;
size_t sprinfoTokenLength; size_t sprinfoTokenLength;
@ -1634,7 +1648,8 @@ static void R_ParseSpriteInfo(boolean spr2)
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
if (sprinfoToken == NULL) if (sprinfoToken == NULL)
{ {
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where sprite name should be"); CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Unexpected end of file where sprite name should be\n");
return false;
} }
if (!strcmp(sprinfoToken, "*")) // All sprites if (!strcmp(sprinfoToken, "*")) // All sprites
@ -1646,7 +1661,9 @@ static void R_ParseSpriteInfo(boolean spr2)
sprinfoTokenLength = strlen(sprinfoToken); sprinfoTokenLength = strlen(sprinfoToken);
if (sprinfoTokenLength != 4) if (sprinfoTokenLength != 4)
{ {
I_Error("Error parsing SPRTINFO lump: Sprite name \"%s\" isn't 4 characters long",sprinfoToken); CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Sprite name \"%s\" isn't 4 characters long\n",sprinfoToken);
Z_Free(sprinfoToken);
return false;
} }
else else
{ {
@ -1666,7 +1683,10 @@ static void R_ParseSpriteInfo(boolean spr2)
for (i = 0; i <= NUMSPRITES; i++) for (i = 0; i <= NUMSPRITES; i++)
{ {
if (i == NUMSPRITES) if (i == NUMSPRITES)
I_Error("Error parsing SPRTINFO lump: Unknown sprite name \"%s\"", newSpriteName); {
CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Unknown sprite name \"%s\"\n", newSpriteName);
return false;
}
if (!memcmp(newSpriteName,sprnames[i],4)) if (!memcmp(newSpriteName,sprnames[i],4))
{ {
parser.sprnum = i; parser.sprnum = i;
@ -1679,7 +1699,10 @@ static void R_ParseSpriteInfo(boolean spr2)
for (i = 0; i <= NUMPLAYERSPRITES; i++) for (i = 0; i <= NUMPLAYERSPRITES; i++)
{ {
if (i == NUMPLAYERSPRITES) if (i == NUMPLAYERSPRITES)
I_Error("Error parsing SPRTINFO lump: Unknown sprite2 name \"%s\"", newSpriteName); {
CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Unknown sprite2 name \"%s\"\n", newSpriteName);
return false;
}
if (!memcmp(newSpriteName,spr2names[i],4)) if (!memcmp(newSpriteName,spr2names[i],4))
{ {
parser.spr2num = i; parser.spr2num = i;
@ -1695,22 +1718,33 @@ static void R_ParseSpriteInfo(boolean spr2)
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
if (sprinfoToken == NULL) if (sprinfoToken == NULL)
{ {
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where open curly brace for sprite \"%s\" should be",newSpriteName); CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Unexpected end of file where open curly brace for sprite \"%s\" should be\n",newSpriteName);
Z_Free(parser.info);
return false;
} }
boolean error = false;
if (strcmp(sprinfoToken,"{")==0) if (strcmp(sprinfoToken,"{")==0)
{ {
Z_Free(sprinfoToken); Z_Free(sprinfoToken);
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
if (sprinfoToken == NULL) if (sprinfoToken == NULL)
{ {
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where definition for sprite \"%s\" should be",newSpriteName); CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Unexpected end of file where definition for sprite \"%s\" should be\n",newSpriteName);
Z_Free(parser.info);
return false;
} }
while (strcmp(sprinfoToken,"}")!=0) while (strcmp(sprinfoToken,"}")!=0)
{ {
if (stricmp(sprinfoToken, "SKIN")==0) if (stricmp(sprinfoToken, "SKIN")==0)
{ {
if (!spr2) if (!spr2)
I_Error("Error parsing SPRTINFO lump: \"SKIN\" token found outside of a sprite2 definition"); {
CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: \"SKIN\" token found outside of a sprite2 definition\n");
error = true;
break;
}
Z_Free(sprinfoToken); Z_Free(sprinfoToken);
R_ParseSpriteInfoSkin(&parser); R_ParseSpriteInfoSkin(&parser);
@ -1718,31 +1752,46 @@ 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, PARSER_FRAME); if (!R_ParseSpriteInfoFrame(&parser, PARSER_FRAME))
{
error = true;
break;
}
} }
else if (stricmp(sprinfoToken, "DEFAULT")==0) else if (stricmp(sprinfoToken, "DEFAULT")==0)
{ {
Z_Free(sprinfoToken); Z_Free(sprinfoToken);
R_ParseSpriteInfoFrame(&parser, PARSER_DEFAULT); if (!R_ParseSpriteInfoFrame(&parser, PARSER_DEFAULT))
{
error = true;
break;
}
} }
else else
{ {
I_Error("Error parsing SPRTINFO lump: Unknown keyword \"%s\" in sprite %s",sprinfoToken,newSpriteName); CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Unknown keyword \"%s\" in sprite %s\n",sprinfoToken,newSpriteName);
error = true;
break;
} }
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
if (sprinfoToken == NULL) if (sprinfoToken == NULL)
{ {
I_Error("Error parsing SPRTINFO lump: Unexpected end of file where sprite info or right curly brace for sprite \"%s\" should be",newSpriteName); CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Unexpected end of file where sprite info or right curly brace for sprite \"%s\" should be\n",newSpriteName);
error = true;
break;
} }
} }
} }
else else
{ {
I_Error("Error parsing SPRTINFO lump: Expected \"{\" for sprite \"%s\", got \"%s\"",newSpriteName,sprinfoToken); CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Expected \"{\" for sprite \"%s\", got \"%s\"\n",newSpriteName,sprinfoToken);
error = true;
} }
Z_Free(sprinfoToken); Z_Free(sprinfoToken);
Z_Free(parser.info); Z_Free(parser.info);
return !error;
} }
// //
@ -1777,13 +1826,20 @@ void R_ParseSPRTINFOLump(UINT16 wadNum, UINT16 lumpNum)
sprinfoToken = M_GetToken(sprinfoText); sprinfoToken = M_GetToken(sprinfoText);
while (sprinfoToken != NULL) while (sprinfoToken != NULL)
{ {
boolean error = true;
if (!stricmp(sprinfoToken, "SPRITE")) if (!stricmp(sprinfoToken, "SPRITE"))
R_ParseSpriteInfo(false); error = !R_ParseSpriteInfo(false);
else if (!stricmp(sprinfoToken, "SPRITE2")) else if (!stricmp(sprinfoToken, "SPRITE2"))
R_ParseSpriteInfo(true); error = !R_ParseSpriteInfo(true);
else else
I_Error("Error parsing SPRTINFO lump: Unknown keyword \"%s\"", sprinfoToken); CONS_Alert(CONS_WARNING, "Error parsing SPRTINFO lump: Unknown keyword \"%s\"\n", sprinfoToken);
Z_Free(sprinfoToken); Z_Free(sprinfoToken);
if (error)
break;
sprinfoToken = M_GetToken(NULL); sprinfoToken = M_GetToken(NULL);
} }
Z_Free((void *)sprinfoText); Z_Free((void *)sprinfoText);