From 4380876959f881f4d9722a745b94d95d957005ab Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 24 Feb 2023 17:38:08 +0000 Subject: [PATCH] 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. --- src/k_menu.h | 2 +- src/k_menudraw.c | 6 ++--- src/m_cond.c | 43 +++++++++++++++++++++-------------- src/m_cond.h | 10 +++++++- src/menus/extras-challenges.c | 22 +++++++++--------- src/typedef.h | 1 + 6 files changed, 51 insertions(+), 33 deletions(-) diff --git a/src/k_menu.h b/src/k_menu.h index ec6a96111..33b08da0a 100644 --- a/src/k_menu.h +++ b/src/k_menu.h @@ -1151,7 +1151,7 @@ extern struct challengesmenu_s { SINT8 row, hilix, focusx; UINT8 col, hiliy; - UINT8 *extradata; + challengegridextradata_t *extradata; boolean pending; boolean requestnew; diff --git a/src/k_menudraw.c b/src/k_menudraw.c index 2d9f570b3..56709a7ed 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -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)) ) ) { diff --git a/src/m_cond.c b/src/m_cond.c index ffcbca21b..26d91d6a0 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -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; } } diff --git a/src/m_cond.h b/src/m_cond.h index 9439cfe86..4d8ac1c2b 100644 --- a/src/m_cond.h +++ b/src/m_cond.h @@ -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 diff --git a/src/menus/extras-challenges.c b/src/menus/extras-challenges.c index 583dc7a1a..e38415bdf 100644 --- a/src/menus/extras-challenges.c +++ b/src/menus/extras-challenges.c @@ -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) { diff --git a/src/typedef.h b/src/typedef.h index a38b018a0..632684d1e 100644 --- a/src/typedef.h +++ b/src/typedef.h @@ -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);