Add I_Errors for when the game exhausts all freeslots of any type.

This commit is contained in:
Ashnal 2021-09-04 22:46:30 -04:00
parent e66eaf001e
commit f5bcfc6379

View file

@ -591,13 +591,13 @@ void DEH_UpdateMaxFreeslots(void)
} }
// TODO: Figure out how to do undolines for this.... // TODO: Figure out how to do undolines for this....
// TODO: Warnings for running out of freeslots
static void readfreeslots(MYFILE *f) static void readfreeslots(MYFILE *f)
{ {
char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL); char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
char *word,*type; char *word,*type;
char *tmp; char *tmp;
int i; int i;
boolean allocated = false;
do do
{ {
@ -625,10 +625,12 @@ static void readfreeslots(MYFILE *f)
break; break;
// TODO: Check for existing freeslot mobjs/states/etc. and make errors. // TODO: Check for existing freeslot mobjs/states/etc. and make errors.
// TODO: Out-of-slots warnings/errors.
// TODO: Name too long (truncated) warnings. // TODO: Name too long (truncated) warnings.
if (fastcmp(type, "SFX")) if (fastcmp(type, "SFX"))
{
CONS_Printf("Sound sfx_%s allocated.\n",word);
S_AddSoundFx(word, false, 0, false); S_AddSoundFx(word, false, 0, false);
}
else if (fastcmp(type, "SPR")) else if (fastcmp(type, "SPR"))
{ {
for (i = SPR_FIRSTFREESLOT; i <= SPR_LASTFREESLOT; i++) for (i = SPR_FIRSTFREESLOT; i <= SPR_LASTFREESLOT; i++)
@ -642,29 +644,44 @@ static void readfreeslots(MYFILE *f)
// Found a free slot! // Found a free slot!
strncpy(sprnames[i],word,4); strncpy(sprnames[i],word,4);
//sprnames[i][4] = 0; //sprnames[i][4] = 0;
CONS_Printf("Sprite SPR_%s allocated.\n",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.
allocated = true;
break; break;
} }
if (!allocated)
I_Error("Out of Sprite Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
} }
else if (fastcmp(type, "S")) else if (fastcmp(type, "S"))
{ {
for (i = 0; i < NUMSTATEFREESLOTS; i++) for (i = 0; i < NUMSTATEFREESLOTS; i++)
if (!FREE_STATES[i]) { if (!FREE_STATES[i]) {
CONS_Printf("State S_%s allocated.\n",word);
FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL); FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
strcpy(FREE_STATES[i],word); strcpy(FREE_STATES[i],word);
freeslotusage[0][0]++; freeslotusage[0][0]++;
allocated = true;
break; break;
} }
if (!allocated)
I_Error("Out of State Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
} }
else if (fastcmp(type, "MT")) else if (fastcmp(type, "MT"))
{ {
for (i = 0; i < NUMMOBJFREESLOTS; i++) for (i = 0; i < NUMMOBJFREESLOTS; i++)
if (!FREE_MOBJS[i]) { if (!FREE_MOBJS[i]) {
CONS_Printf("MobjType MT_%s allocated.\n",word);
FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL); FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
strcpy(FREE_MOBJS[i],word); strcpy(FREE_MOBJS[i],word);
freeslotusage[1][0]++; freeslotusage[1][0]++;
allocated = true;
break; break;
} }
if (!allocated)
I_Error("Out of Mobj Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
} }
else else
deh_warning("Freeslots: unknown enum class '%s' for '%s_%s'", type, type, word); deh_warning("Freeslots: unknown enum class '%s' for '%s_%s'", type, type, word);
@ -9215,7 +9232,7 @@ void DEH_Check(void)
static inline int lib_freeslot(lua_State *L) static inline int lib_freeslot(lua_State *L)
{ {
int n = lua_gettop(L); int n = lua_gettop(L);
int r = 0; // args returned int r = 0; // args returned
char *s, *type,*word; char *s, *type,*word;
while (n-- > 0) while (n-- > 0)
@ -9245,7 +9262,7 @@ static inline int lib_freeslot(lua_State *L)
lua_pushinteger(L, sfx); lua_pushinteger(L, sfx);
r++; r++;
} else } else
return r; return luaL_error(L, "Out of Sfx Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
} }
else if (fastcmp(type, "SPR")) else if (fastcmp(type, "SPR"))
{ {
@ -9272,7 +9289,7 @@ static inline int lib_freeslot(lua_State *L)
break; break;
} }
if (j > SPR_LASTFREESLOT) if (j > SPR_LASTFREESLOT)
return r; I_Error("Out of Sprite Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
} }
else if (fastcmp(type, "S")) else if (fastcmp(type, "S"))
{ {
@ -9288,7 +9305,7 @@ static inline int lib_freeslot(lua_State *L)
break; break;
} }
if (i == NUMSTATEFREESLOTS) if (i == NUMSTATEFREESLOTS)
return r; I_Error("Out of State Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
} }
else if (fastcmp(type, "MT")) else if (fastcmp(type, "MT"))
{ {
@ -9304,7 +9321,7 @@ static inline int lib_freeslot(lua_State *L)
break; break;
} }
if (i == NUMMOBJFREESLOTS) if (i == NUMMOBJFREESLOTS)
return r; I_Error("Out of Mobj Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
} }
Z_Free(s); Z_Free(s);
lua_remove(L, 1); lua_remove(L, 1);