mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-23 03:12:38 +00:00
Optimisations to the character select screen.
* If a character select character image is not set, don't iterate every tic - iterate on first image get and then save to the struct. * A character select screen with only two characters now has special case handling. * A memory leak in the making has been plugged. (specifically, picname not being Z_Free'd if the loop fails to do so) * Logic/operation simplification. Also, some typo corrections and clarity case movements of stuff in other files I've been looking at.
This commit is contained in:
parent
7c63a96bf1
commit
eee6a6ff45
3 changed files with 76 additions and 61 deletions
|
@ -563,7 +563,7 @@ static void readPlayer(MYFILE *f, INT32 num)
|
|||
You MAY disable previous entries if you so desire...
|
||||
But try to enable something that's already enabled and you will be sent to a free slot.
|
||||
|
||||
Because of this, you are allowed to edit any previous entrys you like, but only if you
|
||||
Because of this, you are allowed to edit any previous entries you like, but only if you
|
||||
signal that you are purposely doing so by disabling and then reenabling the slot.
|
||||
|
||||
... Or use MENUPOSITION first, that works too. Hell, you could edit multiple character
|
||||
|
|
122
src/m_menu.c
122
src/m_menu.c
|
@ -4813,10 +4813,9 @@ static void M_DrawSetupChoosePlayerMenu(void)
|
|||
{
|
||||
o = (lastdirection) ? -1 : 1;
|
||||
char_scroll = (itemOn + o)*128*FRACUNIT;
|
||||
i = -o*128;
|
||||
}
|
||||
|
||||
i = (itemOn*128 - char_scroll/FRACUNIT);
|
||||
|
||||
if (abs(i) > 1)
|
||||
char_scroll += i*FRACUNIT>>2;
|
||||
else // close enough.
|
||||
|
@ -4840,7 +4839,7 @@ static void M_DrawSetupChoosePlayerMenu(void)
|
|||
} while (i != j && PlayerMenu[i].status == IT_DISABLED); // Skip over all disabled characters.
|
||||
}
|
||||
|
||||
// prev character
|
||||
// Get prev character...
|
||||
prev = i;
|
||||
do
|
||||
{
|
||||
|
@ -4849,74 +4848,85 @@ static void M_DrawSetupChoosePlayerMenu(void)
|
|||
prev = (currentMenu->numitems - 1);
|
||||
} while (prev != i && PlayerMenu[prev].status == IT_DISABLED); // Skip over all disabled characters.
|
||||
|
||||
if (prev != i
|
||||
&& o < 32)
|
||||
if (prev != i) // If there's more than one character available...
|
||||
{
|
||||
picname = description[prev].picname;
|
||||
if (picname[0] == '\0')
|
||||
// Let's get the next character now.
|
||||
next = i;
|
||||
do
|
||||
{
|
||||
picname = strtok(Z_StrDup(description[prev].skinname), "&");
|
||||
for (j = 0; j < numskins; j++)
|
||||
if (stricmp(skins[j].name, picname) == 0)
|
||||
next++;
|
||||
if (next >= currentMenu->numitems)
|
||||
next = 0;
|
||||
} while (next != i && PlayerMenu[next].status == IT_DISABLED); // Skip over all disabled characters.
|
||||
|
||||
// Draw prev character if it's visible and its number isn't greater than the current one
|
||||
if ((o < 32) && !((prev == next) && prev > i)) // (prev != i) was previously a part of this, but we don't need to check again after above.
|
||||
{
|
||||
picname = description[prev].picname;
|
||||
if (picname[0] == '\0')
|
||||
{
|
||||
picname = strtok(Z_StrDup(description[prev].skinname), "&");
|
||||
for (j = 0; j < numskins; j++)
|
||||
if (stricmp(skins[j].name, picname) == 0)
|
||||
{
|
||||
Z_Free(picname);
|
||||
picname = skins[j].charsel;
|
||||
break;
|
||||
}
|
||||
if (j == numskins) // AAAAAAAAAA
|
||||
{
|
||||
Z_Free(picname);
|
||||
picname = skins[j].charsel;
|
||||
break;
|
||||
picname = skins[0].charsel;
|
||||
}
|
||||
if (j == numskins) // AAAAAAAAAA
|
||||
picname = skins[0].charsel;
|
||||
strncpy(description[prev].picname, picname, 8); // Only iterate once.
|
||||
}
|
||||
patch = W_CachePatchName(picname, PU_CACHE);
|
||||
if (SHORT(patch->width) >= 256)
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 8)<<FRACBITS, FRACUNIT/2, 0, patch, 0, SHORT(patch->height) - 64 + o*2, SHORT(patch->width), SHORT(patch->height));
|
||||
else
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 8)<<FRACBITS, FRACUNIT, 0, patch, 0, SHORT(patch->height) - 32 + o, SHORT(patch->width), SHORT(patch->height));
|
||||
W_UnlockCachedPatch(patch);
|
||||
}
|
||||
patch = W_CachePatchName(picname, PU_CACHE);
|
||||
if (SHORT(patch->width) >= 256)
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 8)<<FRACBITS, FRACUNIT/2, 0, patch, 0, SHORT(patch->height) - 64 + o*2, SHORT(patch->width), SHORT(patch->height));
|
||||
else
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 8)<<FRACBITS, FRACUNIT, 0, patch, 0, SHORT(patch->height) - 32 + o, SHORT(patch->width), SHORT(patch->height));
|
||||
W_UnlockCachedPatch(patch);
|
||||
}
|
||||
|
||||
// next character
|
||||
next = i;
|
||||
do
|
||||
{
|
||||
next++;
|
||||
if (next >= currentMenu->numitems)
|
||||
next = 0;
|
||||
} while (next != i && PlayerMenu[next].status == IT_DISABLED); // Skip over all disabled characters.
|
||||
|
||||
if (next != i
|
||||
&& o < 128)
|
||||
{
|
||||
picname = description[next].picname;
|
||||
if (picname[0] == '\0')
|
||||
// Draw next character if it's visible and its number isn't less than the current one
|
||||
if ((o < 128) && !((prev == next) && next < i)) // (next != i) was previously a part of this, but it's implicitly true if (prev != i) is true.
|
||||
{
|
||||
picname = strtok(Z_StrDup(description[next].skinname), "&");
|
||||
for (j = 0; j < numskins; j++)
|
||||
if (stricmp(skins[j].name, picname) == 0)
|
||||
picname = description[next].picname;
|
||||
if (picname[0] == '\0')
|
||||
{
|
||||
picname = strtok(Z_StrDup(description[next].skinname), "&");
|
||||
for (j = 0; j < numskins; j++)
|
||||
if (stricmp(skins[j].name, picname) == 0)
|
||||
{
|
||||
Z_Free(picname);
|
||||
picname = skins[j].charsel;
|
||||
break;
|
||||
}
|
||||
if (j == numskins) // AAAAAAAAAA
|
||||
{
|
||||
Z_Free(picname);
|
||||
picname = skins[j].charsel;
|
||||
break;
|
||||
picname = skins[0].charsel;
|
||||
}
|
||||
if (j == numskins) // AAAAAAAAAA
|
||||
picname = skins[0].charsel;
|
||||
strncpy(description[next].picname, picname, 8); // Only iterate once.
|
||||
}
|
||||
patch = W_CachePatchName(picname, PU_CACHE);
|
||||
if (SHORT(patch->width) >= 256)
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 168 - o)<<FRACBITS, FRACUNIT/2, 0, patch, 0, 0, SHORT(patch->width), o*2);
|
||||
else
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 168 - o)<<FRACBITS, FRACUNIT, 0, patch, 0, 0, SHORT(patch->width), o);
|
||||
W_UnlockCachedPatch(patch);
|
||||
}
|
||||
patch = W_CachePatchName(picname, PU_CACHE);
|
||||
if (SHORT(patch->width) >= 256)
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 168 - o)<<FRACBITS, FRACUNIT/2, 0, patch, 0, 0, SHORT(patch->width), o*2);
|
||||
else
|
||||
V_DrawCroppedPatch(8<<FRACBITS, (my + 168 - o)<<FRACBITS, FRACUNIT, 0, patch, 0, 0, SHORT(patch->width), o);
|
||||
W_UnlockCachedPatch(patch);
|
||||
}
|
||||
|
||||
// current character
|
||||
if (PlayerMenu[i].status == IT_DISABLED) // Prevent flickering.
|
||||
i = (lastdirection) ? prev : next; // This actually causes duplication at slow scroll speeds (<16FU per tic), but thankfully we always go quickly.
|
||||
// current character
|
||||
if (PlayerMenu[i].status == IT_DISABLED) // Prevent flickering.
|
||||
i = (lastdirection) ? prev : next; // This actually causes duplication at slow scroll speeds (<16FU per tic), but thankfully we always go quickly.
|
||||
}
|
||||
|
||||
if (PlayerMenu[i].status != IT_DISABLED)
|
||||
{
|
||||
picname = description[i].picname;
|
||||
if (picname[0] == '\0')
|
||||
{
|
||||
{
|
||||
picname = strtok(Z_StrDup(description[i].skinname), "&");
|
||||
for (j = 0; j < numskins; j++)
|
||||
if (stricmp(skins[j].name, picname) == 0)
|
||||
|
@ -4926,8 +4936,12 @@ static void M_DrawSetupChoosePlayerMenu(void)
|
|||
break;
|
||||
}
|
||||
if (j == numskins) // AAAAAAAAAA
|
||||
{
|
||||
Z_Free(picname);
|
||||
picname = skins[0].charsel;
|
||||
}
|
||||
}
|
||||
strncpy(description[i].picname, picname, 8); // Only iterate once.
|
||||
}
|
||||
patch = W_CachePatchName(picname, PU_CACHE);
|
||||
if (o >= 0 && o <= 32)
|
||||
{
|
||||
|
|
13
src/p_mobj.c
13
src/p_mobj.c
|
@ -355,7 +355,7 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
spr2 = SPR2_SPNG;
|
||||
break;
|
||||
case SPR2_JUMP:
|
||||
spr2 = (skin->flags & SF_NOJUMPSPIN) ? SPR2_SPNG : SPR2_SPIN;
|
||||
spr2 = (player->charflags & SF_NOJUMPSPIN) ? SPR2_SPNG : SPR2_SPIN;
|
||||
break;
|
||||
case SPR2_SPNG: // spring
|
||||
spr2 = SPR2_FALL;
|
||||
|
@ -384,11 +384,6 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
spr2 = SPR2_CLMB;
|
||||
break;
|
||||
|
||||
case SPR2_SIGN:
|
||||
case SPR2_LIFE:
|
||||
noalt = true;
|
||||
break;
|
||||
|
||||
// Super sprites fallback to regular sprites
|
||||
case SPR2_SWLK:
|
||||
spr2 = SPR2_WALK;
|
||||
|
@ -433,6 +428,12 @@ boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state)
|
|||
spr2 = SPR2_SWLK;
|
||||
break;
|
||||
|
||||
// Sprites for non-player objects? There's nothing we can do.
|
||||
case SPR2_SIGN:
|
||||
case SPR2_LIFE:
|
||||
noalt = true;
|
||||
break;
|
||||
|
||||
// Dunno? Just go to standing then.
|
||||
default:
|
||||
spr2 = SPR2_STND;
|
||||
|
|
Loading…
Reference in a new issue