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; SINT8 row, hilix, focusx;
UINT8 col, hiliy; UINT8 col, hiliy;
UINT8 *extradata; challengegridextradata_t *extradata;
boolean pending; boolean pending;
boolean requestnew; boolean requestnew;

View file

@ -4544,7 +4544,7 @@ static void M_DrawChallengeTile(INT16 i, INT16 j, INT32 x, INT32 y, boolean hili
if (!unlockedyet) 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); bgmap = R_GetTranslationColormap(TC_DEFAULT, col, GTC_MENUCACHE);
} }
else else
@ -5027,7 +5027,7 @@ void M_DrawChallenges(void)
{ {
y += challengesgridstep; y += challengesgridstep;
if (challengesmenu.extradata[(i * CHALLENGEGRIDHEIGHT) + j] & CHE_DONTDRAW) if (challengesmenu.extradata[(i * CHALLENGEGRIDHEIGHT) + j].flags & CHE_DONTDRAW)
{ {
continue; continue;
} }
@ -5112,7 +5112,7 @@ challengedesc:
&& challengesmenu.currentunlock < MAXUNLOCKABLES && challengesmenu.currentunlock < MAXUNLOCKABLES
&& ((gamedata->unlocked[challengesmenu.currentunlock] == true) && ((gamedata->unlocked[challengesmenu.currentunlock] == true)
|| ((challengesmenu.extradata != NULL) || ((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 i, j, num, id, tempid, work;
UINT8 *extradata; challengegridextradata_t *extradata;
boolean idchange; boolean idchange;
if (!gamedata->challengegrid) if (!gamedata->challengegrid)
@ -272,7 +272,7 @@ UINT8 *M_ChallengeGridExtraData(void)
} }
extradata = Z_Malloc( extradata = Z_Malloc(
(gamedata->challengegridwidth * CHALLENGEGRIDHEIGHT * sizeof(UINT8)), (gamedata->challengegridwidth * CHALLENGEGRIDHEIGHT * sizeof(challengegridextradata_t)),
PU_STATIC, NULL); PU_STATIC, NULL);
if (!extradata) if (!extradata)
@ -282,6 +282,17 @@ UINT8 *M_ChallengeGridExtraData(void)
//CONS_Printf(" --- \n"); //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 (i = 0; i < gamedata->challengegridwidth; i++)
{ {
for (j = 0; j < CHALLENGEGRIDHEIGHT; j++) for (j = 0; j < CHALLENGEGRIDHEIGHT; j++)
@ -290,8 +301,6 @@ UINT8 *M_ChallengeGridExtraData(void)
num = gamedata->challengegrid[id]; num = gamedata->challengegrid[id];
idchange = false; idchange = false;
extradata[id] = CHE_NONE;
// Empty spots in the grid are always unconnected. // Empty spots in the grid are always unconnected.
if (num >= MAXUNLOCKABLES) if (num >= MAXUNLOCKABLES)
{ {
@ -305,13 +314,13 @@ UINT8 *M_ChallengeGridExtraData(void)
work = gamedata->challengegrid[tempid]; work = gamedata->challengegrid[tempid];
if (work == num) if (work == num)
{ {
extradata[id] = CHE_CONNECTEDUP; extradata[id].flags = CHE_CONNECTEDUP;
// Get the id to write extra hint data to. // Get the id to write extra hint data to.
// This check is safe because extradata's order of population // 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); //CONS_Printf(" %d - %d above %d is invalid, check to left\n", num, tempid, id);
if (i > 0) if (i > 0)
{ {
@ -328,14 +337,14 @@ UINT8 *M_ChallengeGridExtraData(void)
id = tempid; id = tempid;
idchange = true; idchange = true;
if (extradata[id] == CHE_HINT) if (extradata[id].flags == CHE_HINT)
{ {
continue; continue;
} }
} }
else if (work < MAXUNLOCKABLES && gamedata->unlocked[work]) 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); //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 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; id = tempid;
} }
/*else /*else
@ -369,13 +378,13 @@ UINT8 *M_ChallengeGridExtraData(void)
} }
else if (work < MAXUNLOCKABLES && gamedata->unlocked[work]) else if (work < MAXUNLOCKABLES && gamedata->unlocked[work])
{ {
extradata[id] = CHE_HINT; extradata[id].flags = CHE_HINT;
continue; continue;
} }
} }
// Since we're not modifying id past this point, the conditions become much simpler. // 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; continue;
} }
@ -392,7 +401,7 @@ UINT8 *M_ChallengeGridExtraData(void)
} }
else if (work < MAXUNLOCKABLES && gamedata->unlocked[work]) else if (work < MAXUNLOCKABLES && gamedata->unlocked[work])
{ {
extradata[id] = CHE_HINT; extradata[id].flags = CHE_HINT;
continue; continue;
} }
} }
@ -415,7 +424,7 @@ UINT8 *M_ChallengeGridExtraData(void)
} }
else if (work < MAXUNLOCKABLES && gamedata->unlocked[work]) else if (work < MAXUNLOCKABLES && gamedata->unlocked[work])
{ {
extradata[id] = CHE_HINT; extradata[id].flags = CHE_HINT;
continue; continue;
} }
} }

View file

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

View file

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

View file

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