Allow sprite names with up to 64 characters

This commit is contained in:
LJ Sonic 2024-03-14 20:32:10 +01:00
parent 8073b8b3f0
commit 092ac6643e
7 changed files with 35 additions and 37 deletions

View file

@ -60,13 +60,17 @@ static inline int lib_freeslot(lua_State *L)
else if (fastcmp(type, "SPR")) else if (fastcmp(type, "SPR"))
{ {
spritenum_t j; spritenum_t j;
if (strlen(word) > MAXSPRITENAME)
return luaL_error(L, "Sprite name is longer than %d characters\n", strlen(word));
for (j = SPR_FIRSTFREESLOT; j <= SPR_LASTFREESLOT; j++) for (j = SPR_FIRSTFREESLOT; j <= SPR_LASTFREESLOT; j++)
{ {
if (used_spr[(j-SPR_FIRSTFREESLOT)/8] & (1<<(j%8))) if (used_spr[(j-SPR_FIRSTFREESLOT)/8] & (1<<(j%8)))
continue; // Already allocated, next. continue; // Already allocated, next.
// Found a free slot! // Found a free slot!
CONS_Printf("Sprite SPR_%s allocated.\n",word); CONS_Printf("Sprite SPR_%s allocated.\n",word);
strncpy(sprnames[j],word,4); strcpy(sprnames[j], word);
used_spr[(j-SPR_FIRSTFREESLOT)/8] |= 1<<(j%8); // Okay, this sprite slot has been named now. used_spr[(j-SPR_FIRSTFREESLOT)/8] |= 1<<(j%8); // Okay, this sprite slot has been named now.
// Lua needs to update the value in _G if it exists // Lua needs to update the value in _G if it exists
LUA_UpdateSprName(word, j); LUA_UpdateSprName(word, j);
@ -447,7 +451,7 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
else if (fastncmp("SPR_",word,4)) { else if (fastncmp("SPR_",word,4)) {
p = word+4; p = word+4;
for (i = 0; i < NUMSPRITES; i++) for (i = 0; i < NUMSPRITES; i++)
if (fastncmp(p,sprnames[i],4)) { if (fastcmp(p,sprnames[i])) {
// updating overridden sprnames is not implemented for soc parser, // updating overridden sprnames is not implemented for soc parser,
// so don't use cache // so don't use cache
if (mathlib) if (mathlib)
@ -729,12 +733,12 @@ static inline int lib_getenum(lua_State *L)
// If a sprname has been "cached" to _G, update it to a new value. // If a sprname has been "cached" to _G, update it to a new value.
void LUA_UpdateSprName(const char *name, lua_Integer value) void LUA_UpdateSprName(const char *name, lua_Integer value)
{ {
char fullname[9] = "SPR_XXXX"; char fullname[4 + MAXSPRITENAME + 1] = "SPR_";
if (!gL) if (!gL)
return; return;
strncpy(&fullname[4], name, 4); strcpy(&fullname[4], name);
lua_pushstring(gL, fullname); lua_pushstring(gL, fullname);
lua_rawget(gL, LUA_GLOBALSINDEX); lua_rawget(gL, LUA_GLOBALSINDEX);

View file

@ -440,12 +440,15 @@ void readfreeslots(MYFILE *f)
S_AddSoundFx(word, false, 0, false); S_AddSoundFx(word, false, 0, false);
else if (fastcmp(type, "SPR")) else if (fastcmp(type, "SPR"))
{ {
if (strlen(word) > MAXSPRITENAME)
I_Error("Sprite name is longer than %d characters\n", strlen(word));
for (i = SPR_FIRSTFREESLOT; i <= SPR_LASTFREESLOT; i++) for (i = SPR_FIRSTFREESLOT; i <= SPR_LASTFREESLOT; i++)
{ {
if (used_spr[(i-SPR_FIRSTFREESLOT)/8] & (1<<(i%8))) if (used_spr[(i-SPR_FIRSTFREESLOT)/8] & (1<<(i%8)))
continue; // Already allocated, next. continue; // Already allocated, next.
// Found a free slot! // Found a free slot!
strncpy(sprnames[i],word,4); strcpy(sprnames[i], word);
used_spr[(i-SPR_FIRSTFREESLOT)/8] |= 1<<(i%8); // Okay, this sprite slot has been named now. used_spr[(i-SPR_FIRSTFREESLOT)/8] |= 1<<(i%8); // Okay, this sprite slot has been named now.
// Lua needs to update the value in _G if it exists // Lua needs to update the value in _G if it exists
LUA_UpdateSprName(word, i); LUA_UpdateSprName(word, i);
@ -4178,7 +4181,7 @@ spritenum_t get_sprite(const char *word)
if (fastncmp("SPR_",word,4)) if (fastncmp("SPR_",word,4))
word += 4; // take off the SPR_ word += 4; // take off the SPR_
for (i = 0; i < NUMSPRITES; i++) for (i = 0; i < NUMSPRITES; i++)
if (memcmp(word,sprnames[i],4)==0) if (!strcmp(word, sprnames[i]))
return i; return i;
deh_warning("Couldn't find sprite named 'SPR_%s'",word); deh_warning("Couldn't find sprite named 'SPR_%s'",word);
return SPR_NULL; return SPR_NULL;

View file

@ -571,19 +571,15 @@ void HWR_LoadModels(void)
} }
// Add sprite models. // Add sprite models.
// Must be 4 characters long exactly. Otherwise, it's not a sprite name. for (i = 0; i < numsprites; i++)
if (len == 4)
{ {
for (i = 0; i < numsprites; i++) if (stricmp(name, sprnames[i]) == 0)
{ {
if (stricmp(name, sprnames[i]) == 0) md2_models[i].scale = scale;
{ md2_models[i].offset = offset;
md2_models[i].scale = scale; md2_models[i].found = true;
md2_models[i].offset = offset; strcpy(md2_models[i].filename, filename);
md2_models[i].found = true; goto modelfound;
strcpy(md2_models[i].filename, filename);
goto modelfound;
}
} }
} }

View file

@ -26,9 +26,10 @@
#include "hardware/hw_light.h" #include "hardware/hw_light.h"
#endif #endif
// Hey, moron! If you change this table, don't forget about the sprite enum in info.h and the sprite lights in hw_light.c! // Hey, moron! If you change this table, don't forget about the sprite enum in info.h and the sprite lights in hw_light.c!
// For the sake of constant merge conflicts, let's spread this out // For the sake of constant merge conflicts, let's spread this out
char sprnames[NUMSPRITES + 1][5] = char sprnames[NUMSPRITES + 1][MAXSPRITENAME + 1] =
{ {
"NULL", // invisible object "NULL", // invisible object
"UNKN", "UNKN",
@ -525,7 +526,7 @@ char sprnames[NUMSPRITES + 1][5] =
"GWLR", "GWLR",
}; };
char spr2names[NUMPLAYERSPRITES][5] = char spr2names[NUMPLAYERSPRITES][MAXSPRITENAME + 1] =
{ {
"STND", "STND",
"WAIT", "WAIT",

View file

@ -575,6 +575,7 @@ extern int actionsoverridden[NUMACTIONS][MAX_ACTION_RECURSION];
#define NUMMOBJFREESLOTS 1024 #define NUMMOBJFREESLOTS 1024
#define NUMSPRITEFREESLOTS NUMMOBJFREESLOTS #define NUMSPRITEFREESLOTS NUMMOBJFREESLOTS
#define NUMSTATEFREESLOTS (NUMMOBJFREESLOTS*8) #define NUMSTATEFREESLOTS (NUMMOBJFREESLOTS*8)
#define MAXSPRITENAME 64
// Hey, moron! If you change this table, don't forget about sprnames in info.c and the sprite lights in hw_light.c! // Hey, moron! If you change this table, don't forget about sprnames in info.c and the sprite lights in hw_light.c!
typedef enum sprite typedef enum sprite
@ -4383,8 +4384,8 @@ typedef struct
} state_t; } state_t;
extern state_t states[NUMSTATES]; extern state_t states[NUMSTATES];
extern char sprnames[NUMSPRITES + 1][5]; extern char sprnames[NUMSPRITES + 1][MAXSPRITENAME + 1];
extern char spr2names[NUMPLAYERSPRITES][5]; extern char spr2names[NUMPLAYERSPRITES][MAXSPRITENAME + 1];
extern playersprite_t spr2defaults[NUMPLAYERSPRITES]; extern playersprite_t spr2defaults[NUMPLAYERSPRITES];
extern state_t *astate; extern state_t *astate;
extern playersprite_t free_spr2; extern playersprite_t free_spr2;

View file

@ -1570,7 +1570,7 @@ static void R_ParseSpriteInfo(boolean spr2)
spriteinfo_t *info; spriteinfo_t *info;
char *sprinfoToken; char *sprinfoToken;
size_t sprinfoTokenLength; size_t sprinfoTokenLength;
char newSpriteName[5]; // no longer dynamically allocated char newSpriteName[MAXSPRITENAME + 1]; // no longer dynamically allocated
spritenum_t sprnum = NUMSPRITES; spritenum_t sprnum = NUMSPRITES;
playersprite_t spr2num = NUMPLAYERSPRITES; playersprite_t spr2num = NUMPLAYERSPRITES;
INT32 i; INT32 i;
@ -1584,17 +1584,10 @@ 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");
} }
sprinfoTokenLength = strlen(sprinfoToken); sprinfoTokenLength = strlen(sprinfoToken);
if (sprinfoTokenLength != 4) if (sprinfoTokenLength > MAXSPRITENAME)
{ I_Error("Error parsing SPRTINFO lump: Sprite name \"%s\" is longer than %d characters", sprinfoToken, MAXSPRITENAME);
I_Error("Error parsing SPRTINFO lump: Sprite name \"%s\" isn't 4 characters long",sprinfoToken); strcpy(newSpriteName, sprinfoToken);
} strupr(newSpriteName); // Just do this now so we don't have to worry about it
else
{
memset(&newSpriteName, 0, 5);
M_Memcpy(newSpriteName, sprinfoToken, sprinfoTokenLength);
// ^^ 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); Z_Free(sprinfoToken);
if (!spr2) if (!spr2)
@ -1603,7 +1596,7 @@ static void R_ParseSpriteInfo(boolean spr2)
{ {
if (i == NUMSPRITES) if (i == NUMSPRITES)
I_Error("Error parsing SPRTINFO lump: Unknown sprite name \"%s\"", newSpriteName); I_Error("Error parsing SPRTINFO lump: Unknown sprite name \"%s\"", newSpriteName);
if (!memcmp(newSpriteName,sprnames[i],4)) if (!strcmp(newSpriteName, sprnames[i]))
{ {
sprnum = i; sprnum = i;
break; break;

View file

@ -383,7 +383,7 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
{ {
case SRF_NONE: case SRF_NONE:
// no rotations were found for that frame at all // no rotations were found for that frame at all
I_Error("R_AddSingleSpriteDef: No patches found for %.4s frame %c", sprname, R_Frame2Char(frame)); I_Error("R_AddSingleSpriteDef: No patches found for %s frame %c", sprname, R_Frame2Char(frame));
break; break;
case SRF_SINGLE: case SRF_SINGLE:
@ -393,7 +393,7 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
case SRF_2D: // both Left and Right rotations case SRF_2D: // both Left and Right rotations
// we test to see whether the left and right slots are present // we test to see whether the left and right slots are present
if ((sprtemp[frame].lumppat[2] == LUMPERROR) || (sprtemp[frame].lumppat[6] == LUMPERROR)) if ((sprtemp[frame].lumppat[2] == LUMPERROR) || (sprtemp[frame].lumppat[6] == LUMPERROR))
I_Error("R_AddSingleSpriteDef: Sprite %.4s frame %c is missing rotations (L-R mode)", I_Error("R_AddSingleSpriteDef: Sprite %s frame %c is missing rotations (L-R mode)",
sprname, R_Frame2Char(frame)); sprname, R_Frame2Char(frame));
break; break;
@ -404,7 +404,7 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
// we test the patch lump, or the id lump whatever // we test the patch lump, or the id lump whatever
// if it was not loaded the two are LUMPERROR // if it was not loaded the two are LUMPERROR
if (sprtemp[frame].lumppat[rotation] == LUMPERROR) if (sprtemp[frame].lumppat[rotation] == LUMPERROR)
I_Error("R_AddSingleSpriteDef: Sprite %.4s frame %c is missing rotations (1-%c mode)", I_Error("R_AddSingleSpriteDef: Sprite %s frame %c is missing rotations (1-%c mode)",
sprname, R_Frame2Char(frame), ((sprtemp[frame].rotate & SRF_3DGE) ? 'G' : '8')); sprname, R_Frame2Char(frame), ((sprtemp[frame].rotate & SRF_3DGE) ? 'G' : '8'));
break; break;
} }