mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-18 23:42:11 +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"))
|
||||
{
|
||||
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++)
|
||||
{
|
||||
if (used_spr[(j-SPR_FIRSTFREESLOT)/8] & (1<<(j%8)))
|
||||
continue; // Already allocated, next.
|
||||
// Found a free slot!
|
||||
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.
|
||||
// Lua needs to update the value in _G if it exists
|
||||
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)) {
|
||||
p = word+4;
|
||||
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,
|
||||
// so don't use cache
|
||||
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.
|
||||
void LUA_UpdateSprName(const char *name, lua_Integer value)
|
||||
{
|
||||
char fullname[9] = "SPR_XXXX";
|
||||
char fullname[4 + MAXSPRITENAME + 1] = "SPR_";
|
||||
|
||||
if (!gL)
|
||||
return;
|
||||
|
||||
strncpy(&fullname[4], name, 4);
|
||||
strcpy(&fullname[4], name);
|
||||
lua_pushstring(gL, fullname);
|
||||
lua_rawget(gL, LUA_GLOBALSINDEX);
|
||||
|
||||
|
|
|
@ -440,12 +440,15 @@ void readfreeslots(MYFILE *f)
|
|||
S_AddSoundFx(word, false, 0, false);
|
||||
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++)
|
||||
{
|
||||
if (used_spr[(i-SPR_FIRSTFREESLOT)/8] & (1<<(i%8)))
|
||||
continue; // Already allocated, next.
|
||||
// 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.
|
||||
// Lua needs to update the value in _G if it exists
|
||||
LUA_UpdateSprName(word, i);
|
||||
|
@ -4178,7 +4181,7 @@ spritenum_t get_sprite(const char *word)
|
|||
if (fastncmp("SPR_",word,4))
|
||||
word += 4; // take off the SPR_
|
||||
for (i = 0; i < NUMSPRITES; i++)
|
||||
if (memcmp(word,sprnames[i],4)==0)
|
||||
if (!strcmp(word, sprnames[i]))
|
||||
return i;
|
||||
deh_warning("Couldn't find sprite named 'SPR_%s'",word);
|
||||
return SPR_NULL;
|
||||
|
|
|
@ -571,19 +571,15 @@ void HWR_LoadModels(void)
|
|||
}
|
||||
|
||||
// Add sprite models.
|
||||
// Must be 4 characters long exactly. Otherwise, it's not a sprite name.
|
||||
if (len == 4)
|
||||
for (i = 0; i < numsprites; i++)
|
||||
{
|
||||
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].found = true;
|
||||
strcpy(md2_models[i].filename, filename);
|
||||
goto modelfound;
|
||||
}
|
||||
md2_models[i].scale = scale;
|
||||
md2_models[i].offset = offset;
|
||||
md2_models[i].found = true;
|
||||
strcpy(md2_models[i].filename, filename);
|
||||
goto modelfound;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -26,9 +26,10 @@
|
|||
#include "hardware/hw_light.h"
|
||||
#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!
|
||||
// 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
|
||||
"UNKN",
|
||||
|
@ -525,7 +526,7 @@ char sprnames[NUMSPRITES + 1][5] =
|
|||
"GWLR",
|
||||
};
|
||||
|
||||
char spr2names[NUMPLAYERSPRITES][5] =
|
||||
char spr2names[NUMPLAYERSPRITES][MAXSPRITENAME + 1] =
|
||||
{
|
||||
"STND",
|
||||
"WAIT",
|
||||
|
|
|
@ -575,6 +575,7 @@ extern int actionsoverridden[NUMACTIONS][MAX_ACTION_RECURSION];
|
|||
#define NUMMOBJFREESLOTS 1024
|
||||
#define NUMSPRITEFREESLOTS NUMMOBJFREESLOTS
|
||||
#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!
|
||||
typedef enum sprite
|
||||
|
@ -4383,8 +4384,8 @@ typedef struct
|
|||
} state_t;
|
||||
|
||||
extern state_t states[NUMSTATES];
|
||||
extern char sprnames[NUMSPRITES + 1][5];
|
||||
extern char spr2names[NUMPLAYERSPRITES][5];
|
||||
extern char sprnames[NUMSPRITES + 1][MAXSPRITENAME + 1];
|
||||
extern char spr2names[NUMPLAYERSPRITES][MAXSPRITENAME + 1];
|
||||
extern playersprite_t spr2defaults[NUMPLAYERSPRITES];
|
||||
extern state_t *astate;
|
||||
extern playersprite_t free_spr2;
|
||||
|
|
|
@ -1570,7 +1570,7 @@ static void R_ParseSpriteInfo(boolean spr2)
|
|||
spriteinfo_t *info;
|
||||
char *sprinfoToken;
|
||||
size_t sprinfoTokenLength;
|
||||
char newSpriteName[5]; // no longer dynamically allocated
|
||||
char newSpriteName[MAXSPRITENAME + 1]; // no longer dynamically allocated
|
||||
spritenum_t sprnum = NUMSPRITES;
|
||||
playersprite_t spr2num = NUMPLAYERSPRITES;
|
||||
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");
|
||||
}
|
||||
sprinfoTokenLength = strlen(sprinfoToken);
|
||||
if (sprinfoTokenLength != 4)
|
||||
{
|
||||
I_Error("Error parsing SPRTINFO lump: Sprite name \"%s\" isn't 4 characters long",sprinfoToken);
|
||||
}
|
||||
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
|
||||
}
|
||||
if (sprinfoTokenLength > MAXSPRITENAME)
|
||||
I_Error("Error parsing SPRTINFO lump: Sprite name \"%s\" is longer than %d characters", sprinfoToken, MAXSPRITENAME);
|
||||
strcpy(newSpriteName, sprinfoToken);
|
||||
strupr(newSpriteName); // Just do this now so we don't have to worry about it
|
||||
Z_Free(sprinfoToken);
|
||||
|
||||
if (!spr2)
|
||||
|
@ -1603,7 +1596,7 @@ static void R_ParseSpriteInfo(boolean spr2)
|
|||
{
|
||||
if (i == NUMSPRITES)
|
||||
I_Error("Error parsing SPRTINFO lump: Unknown sprite name \"%s\"", newSpriteName);
|
||||
if (!memcmp(newSpriteName,sprnames[i],4))
|
||||
if (!strcmp(newSpriteName, sprnames[i]))
|
||||
{
|
||||
sprnum = i;
|
||||
break;
|
||||
|
|
|
@ -383,7 +383,7 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
|||
{
|
||||
case SRF_NONE:
|
||||
// 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;
|
||||
|
||||
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
|
||||
// we test to see whether the left and right slots are present
|
||||
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));
|
||||
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
|
||||
// if it was not loaded the two are 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'));
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue