Challenges Grid: create dedicated struct for menu extradata

- challengegridextradata_t
- Existing UINT8 data per entry has been converted to "flags" property
- This is a tool that will help us later.
This commit is contained in:
toaster 2023-02-24 17:38:08 +00:00
parent 9cb176de36
commit 4380876959
6 changed files with 51 additions and 33 deletions

View file

@ -1151,7 +1151,7 @@ extern struct challengesmenu_s {
SINT8 row, hilix, focusx;
UINT8 col, hiliy;
UINT8 *extradata;
challengegridextradata_t *extradata;
boolean pending;
boolean requestnew;

View file

@ -4544,7 +4544,7 @@ static void M_DrawChallengeTile(INT16 i, INT16 j, INT32 x, INT32 y, boolean hili
if (!unlockedyet)
{
UINT16 col = (challengesmenu.extradata[id] == CHE_HINT) ? SKINCOLOR_BLUE : SKINCOLOR_BLACK;
UINT16 col = (challengesmenu.extradata[id].flags == CHE_HINT) ? SKINCOLOR_BLUE : SKINCOLOR_BLACK;
bgmap = R_GetTranslationColormap(TC_DEFAULT, col, GTC_MENUCACHE);
}
else
@ -5027,7 +5027,7 @@ void M_DrawChallenges(void)
{
y += challengesgridstep;
if (challengesmenu.extradata[(i * CHALLENGEGRIDHEIGHT) + j] & CHE_DONTDRAW)
if (challengesmenu.extradata[(i * CHALLENGEGRIDHEIGHT) + j].flags & CHE_DONTDRAW)
{
continue;
}
@ -5112,7 +5112,7 @@ challengedesc:
&& challengesmenu.currentunlock < MAXUNLOCKABLES
&& ((gamedata->unlocked[challengesmenu.currentunlock] == true)
|| ((challengesmenu.extradata != NULL)
&& (challengesmenu.extradata[i] & CHE_HINT))
&& (challengesmenu.extradata[i].flags & CHE_HINT))
)
)
{

View file

@ -260,10 +260,10 @@ quickcheckagain:
}
}
UINT8 *M_ChallengeGridExtraData(void)
challengegridextradata_t *M_ChallengeGridExtraData(void)
{
UINT8 i, j, num, id, tempid, work;
UINT8 *extradata;
challengegridextradata_t *extradata;
boolean idchange;
if (!gamedata->challengegrid)
@ -272,7 +272,7 @@ UINT8 *M_ChallengeGridExtraData(void)
}
extradata = Z_Malloc(
(gamedata->challengegridwidth * CHALLENGEGRIDHEIGHT * sizeof(UINT8)),
(gamedata->challengegridwidth * CHALLENGEGRIDHEIGHT * sizeof(challengegridextradata_t)),
PU_STATIC, NULL);
if (!extradata)
@ -282,6 +282,17 @@ UINT8 *M_ChallengeGridExtraData(void)
//CONS_Printf(" --- \n");
// Pre-wipe flags.
for (i = 0; i < gamedata->challengegridwidth; i++)
{
for (j = 0; j < CHALLENGEGRIDHEIGHT; j++)
{
id = (i * CHALLENGEGRIDHEIGHT) + j;
extradata[id].flags = CHE_NONE;
}
}
// Populate extra data.
for (i = 0; i < gamedata->challengegridwidth; i++)
{
for (j = 0; j < CHALLENGEGRIDHEIGHT; j++)
@ -290,8 +301,6 @@ UINT8 *M_ChallengeGridExtraData(void)
num = gamedata->challengegrid[id];
idchange = false;
extradata[id] = CHE_NONE;
// Empty spots in the grid are always unconnected.
if (num >= MAXUNLOCKABLES)
{
@ -305,13 +314,13 @@ UINT8 *M_ChallengeGridExtraData(void)
work = gamedata->challengegrid[tempid];
if (work == num)
{
extradata[id] = CHE_CONNECTEDUP;
extradata[id].flags = CHE_CONNECTEDUP;
// Get the id to write extra hint data to.
// This check is safe because extradata's order of population
if (extradata[tempid] & CHE_CONNECTEDLEFT)
if (extradata[tempid].flags & CHE_CONNECTEDLEFT)
{
extradata[id] |= CHE_CONNECTEDLEFT;
extradata[id].flags |= CHE_CONNECTEDLEFT;
//CONS_Printf(" %d - %d above %d is invalid, check to left\n", num, tempid, id);
if (i > 0)
{
@ -328,14 +337,14 @@ UINT8 *M_ChallengeGridExtraData(void)
id = tempid;
idchange = true;
if (extradata[id] == CHE_HINT)
if (extradata[id].flags == CHE_HINT)
{
continue;
}
}
else if (work < MAXUNLOCKABLES && gamedata->unlocked[work])
{
extradata[id] = CHE_HINT;
extradata[id].flags = CHE_HINT;
}
}
@ -357,11 +366,11 @@ UINT8 *M_ChallengeGridExtraData(void)
{
//CONS_Printf(" %d - %d to left of %d is valid\n", work, tempid, id);
// If we haven't already updated our id, it's the one to our left.
if (extradata[id] == CHE_HINT)
if (extradata[id].flags == CHE_HINT)
{
extradata[tempid] = CHE_HINT;
extradata[tempid].flags = CHE_HINT;
}
extradata[id] = CHE_CONNECTEDLEFT;
extradata[id].flags = CHE_CONNECTEDLEFT;
id = tempid;
}
/*else
@ -369,13 +378,13 @@ UINT8 *M_ChallengeGridExtraData(void)
}
else if (work < MAXUNLOCKABLES && gamedata->unlocked[work])
{
extradata[id] = CHE_HINT;
extradata[id].flags = CHE_HINT;
continue;
}
}
// Since we're not modifying id past this point, the conditions become much simpler.
if (extradata[id] == CHE_HINT)
if ((extradata[id].flags & (CHE_HINT|CHE_DONTDRAW)) == CHE_HINT)
{
continue;
}
@ -392,7 +401,7 @@ UINT8 *M_ChallengeGridExtraData(void)
}
else if (work < MAXUNLOCKABLES && gamedata->unlocked[work])
{
extradata[id] = CHE_HINT;
extradata[id].flags = CHE_HINT;
continue;
}
}
@ -415,7 +424,7 @@ UINT8 *M_ChallengeGridExtraData(void)
}
else if (work < MAXUNLOCKABLES && gamedata->unlocked[work])
{
extradata[id] = CHE_HINT;
extradata[id].flags = CHE_HINT;
continue;
}
}

View file

@ -193,12 +193,20 @@ void M_NewGameDataStruct(void);
// Challenges menu stuff
void M_PopulateChallengeGrid(void);
UINT8 *M_ChallengeGridExtraData(void);
struct challengegridextradata_t
{
UINT8 flags;
};
challengegridextradata_t *M_ChallengeGridExtraData(void);
#define CHE_NONE 0
#define CHE_HINT 1
#define CHE_CONNECTEDLEFT (1<<1)
#define CHE_CONNECTEDUP (1<<2)
#define CHE_DONTDRAW (CHE_CONNECTEDLEFT|CHE_CONNECTEDUP)
char *M_BuildConditionSetString(UINT8 unlockid);
#define DESCRIPTIONWIDTH 170

View file

@ -72,7 +72,7 @@ static void M_ChallengesAutoFocus(UINT8 unlockid, boolean fresh)
continue;
}
if (challengesmenu.extradata[i] & CHE_CONNECTEDLEFT)
if (challengesmenu.extradata[i].flags & CHE_CONNECTEDLEFT)
{
// no need to check for CHE_CONNECTEDUP in linear iteration
continue;
@ -461,8 +461,8 @@ boolean M_ChallengesInputs(INT32 ch)
}
if (!(challengesmenu.extradata[
(challengesmenu.col * CHALLENGEGRIDHEIGHT)
+ challengesmenu.row]
& CHE_CONNECTEDUP))
+ challengesmenu.row
].flags & CHE_CONNECTEDUP))
{
break;
}
@ -475,8 +475,8 @@ boolean M_ChallengesInputs(INT32 ch)
{
i = (challengesmenu.extradata[
(challengesmenu.col * CHALLENGEGRIDHEIGHT)
+ challengesmenu.row]
& CHE_CONNECTEDUP) ? 2 : 1;
+ challengesmenu.row
].flags & CHE_CONNECTEDUP) ? 2 : 1;
while (i > 0)
{
if (challengesmenu.row > 0)
@ -516,8 +516,8 @@ boolean M_ChallengesInputs(INT32 ch)
if (!(challengesmenu.extradata[
(challengesmenu.col * CHALLENGEGRIDHEIGHT)
+ challengesmenu.row]
& CHE_CONNECTEDLEFT))
+ challengesmenu.row
].flags & CHE_CONNECTEDLEFT))
{
break;
}
@ -531,8 +531,8 @@ boolean M_ChallengesInputs(INT32 ch)
{
i = (challengesmenu.extradata[
(challengesmenu.col * CHALLENGEGRIDHEIGHT)
+ challengesmenu.row]
& CHE_CONNECTEDLEFT) ? 2 : 1;
+ challengesmenu.row
].flags & CHE_CONNECTEDLEFT) ? 2 : 1;
while (i > 0)
{
// Slide the focus counter to movement, if we can.
@ -570,12 +570,12 @@ boolean M_ChallengesInputs(INT32 ch)
{
// Adjust highlight coordinates up/to the left for large tiles.
if (challengesmenu.hiliy > 0 && (challengesmenu.extradata[i] & CHE_CONNECTEDUP))
if (challengesmenu.hiliy > 0 && (challengesmenu.extradata[i].flags & CHE_CONNECTEDUP))
{
challengesmenu.hiliy--;
}
if ((challengesmenu.extradata[i] & CHE_CONNECTEDLEFT))
if ((challengesmenu.extradata[i].flags & CHE_CONNECTEDLEFT))
{
if (challengesmenu.hilix > 0)
{

View file

@ -209,6 +209,7 @@ TYPEDEF (conditionset_t);
TYPEDEF (emblem_t);
TYPEDEF (unlockable_t);
TYPEDEF (gamedata_t);
TYPEDEF (challengegridextradata_t);
// m_dllist.h
TYPEDEF (mdllistitem_t);