mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-31 13:40:45 +00:00
Allow sprite names with up to 64 characters
This commit is contained in:
parent
8073b8b3f0
commit
092ac6643e
7 changed files with 35 additions and 37 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue