mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-28 04:51:42 +00:00
Unlocks now only get marked unlocked when heading to the main menu
EXTREMELY early, but...
- M_InterruptMenuWithChallenges hijacks certain transitions
- Currently only initial profile selection and title screen, but the intercept is low-profile enough to add wherever necessary
- M_GetNextAchievedUnlock gets the first unlock in the listing that has all its conditions achieved but isn't unlocked
- Preliminary Challenges menu
- Currently only ticks between Achieved but not Unlocked unlocks with the above function, no tilegrid yet
This commit is contained in:
parent
0aa85bf291
commit
5ba1d4c197
6 changed files with 174 additions and 7 deletions
28
src/k_menu.h
28
src/k_menu.h
|
|
@ -398,12 +398,15 @@ extern menu_t EXTRAS_ReplayStartDef;
|
||||||
extern menuitem_t PAUSE_Main[];
|
extern menuitem_t PAUSE_Main[];
|
||||||
extern menu_t PAUSE_MainDef;
|
extern menu_t PAUSE_MainDef;
|
||||||
|
|
||||||
|
// EXTRAS
|
||||||
|
extern menuitem_t MISC_Manual[];
|
||||||
|
extern menu_t MISC_ManualDef;
|
||||||
|
|
||||||
extern menuitem_t MISC_Addons[];
|
extern menuitem_t MISC_Addons[];
|
||||||
extern menu_t MISC_AddonsDef;
|
extern menu_t MISC_AddonsDef;
|
||||||
|
|
||||||
// MANUAL
|
extern menuitem_t MISC_Challenges[];
|
||||||
extern menuitem_t MISC_Manual[];
|
extern menu_t MISC_ChallengesDef;
|
||||||
extern menu_t MISC_ManualDef;
|
|
||||||
|
|
||||||
// We'll need this since we're gonna have to dynamically enable and disable options depending on which state we're in.
|
// We'll need this since we're gonna have to dynamically enable and disable options depending on which state we're in.
|
||||||
typedef enum
|
typedef enum
|
||||||
|
|
@ -1076,6 +1079,25 @@ void M_DrawReplayStartMenu(void);
|
||||||
#define LOCATIONSTRING2 "Visit \x88SRB2.ORG/MODS\x80 to get & make addons!"
|
#define LOCATIONSTRING2 "Visit \x88SRB2.ORG/MODS\x80 to get & make addons!"
|
||||||
void M_DrawAddons(void);
|
void M_DrawAddons(void);
|
||||||
|
|
||||||
|
// Challenges menu:
|
||||||
|
#define UNLOCKTIME 35
|
||||||
|
|
||||||
|
// Keep track of some pause menu data for visual goodness.
|
||||||
|
extern struct challengesmenu_s {
|
||||||
|
|
||||||
|
tic_t ticker; // How long the menu's been open for
|
||||||
|
INT16 offset; // To make the icons move smoothly when we transition!
|
||||||
|
|
||||||
|
UINT8 currentunlock;
|
||||||
|
tic_t unlockanim;
|
||||||
|
|
||||||
|
boolean pending;
|
||||||
|
} challengesmenu;
|
||||||
|
|
||||||
|
void M_DrawChallenges(void);
|
||||||
|
void M_ChallengesTick(void);
|
||||||
|
boolean M_ChallengesInputs(INT32 ch);
|
||||||
|
|
||||||
// These defines make it a little easier to make menus
|
// These defines make it a little easier to make menus
|
||||||
#define DEFAULTMENUSTYLE(source, prev, x, y)\
|
#define DEFAULTMENUSTYLE(source, prev, x, y)\
|
||||||
{\
|
{\
|
||||||
|
|
|
||||||
|
|
@ -1744,3 +1744,24 @@ menu_t MISC_AddonsDef = {
|
||||||
NULL,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Challenges.
|
||||||
|
menuitem_t MISC_ChallengesMenu[] =
|
||||||
|
{
|
||||||
|
{IT_STRING | IT_CALL, "Back", NULL, NULL, {.routine = M_GoBack}, 0, 0},
|
||||||
|
};
|
||||||
|
|
||||||
|
menu_t MISC_ChallengesDef = {
|
||||||
|
sizeof (MISC_ChallengesMenu)/sizeof (menuitem_t),
|
||||||
|
&MainDef,
|
||||||
|
0,
|
||||||
|
MISC_ChallengesMenu,
|
||||||
|
48, 80,
|
||||||
|
0, 0,
|
||||||
|
98, 0,
|
||||||
|
M_DrawChallenges,
|
||||||
|
M_ChallengesTick,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
M_ChallengesInputs,
|
||||||
|
};
|
||||||
|
|
|
||||||
|
|
@ -4457,3 +4457,28 @@ void M_DrawAddons(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef addonsseperation
|
#undef addonsseperation
|
||||||
|
|
||||||
|
void M_DrawChallenges(void)
|
||||||
|
{
|
||||||
|
INT32 x, y;
|
||||||
|
|
||||||
|
{
|
||||||
|
patch_t *bg = W_CachePatchName("M_XTRABG", PU_CACHE);
|
||||||
|
V_DrawFixedPatch(0, 0, FRACUNIT, 0, bg, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (challengesmenu.currentunlock < MAXUNLOCKABLES)
|
||||||
|
{
|
||||||
|
V_DrawThinString(currentMenu->x, currentMenu->y, V_ALLOWLOWERCASE, unlockables[challengesmenu.currentunlock].name);
|
||||||
|
|
||||||
|
if (challengesmenu.unlockanim >= UNLOCKTIME)
|
||||||
|
V_DrawThinString(currentMenu->x, currentMenu->y + 10, V_ALLOWLOWERCASE, "Press (A)");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
V_DrawThinString(currentMenu->x, currentMenu->y, V_ALLOWLOWERCASE, va("pending = %c", challengesmenu.pending ? 'T' : 'F'));
|
||||||
|
|
||||||
|
if (challengesmenu.unlockanim >= UNLOCKTIME)
|
||||||
|
V_DrawThinString(currentMenu->x, currentMenu->y + 10, V_ALLOWLOWERCASE, "Press (B)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -775,6 +775,20 @@ static boolean M_PrevOpt(void)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static menu_t *M_InterruptMenuWithChallenges(menu_t *desiredmenu)
|
||||||
|
{
|
||||||
|
M_UpdateUnlockablesAndExtraEmblems(false);
|
||||||
|
|
||||||
|
if (M_GetNextAchievedUnlock(false) < MAXUNLOCKABLES)
|
||||||
|
{
|
||||||
|
challengesmenu.pending = true;
|
||||||
|
challengesmenu.currentunlock = MAXUNLOCKABLES;
|
||||||
|
return &MISC_ChallengesDef;
|
||||||
|
}
|
||||||
|
|
||||||
|
return desiredmenu;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// M_Responder
|
// M_Responder
|
||||||
//
|
//
|
||||||
|
|
@ -981,7 +995,7 @@ void M_StartControlPanel(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
currentMenu = &MainDef;
|
currentMenu = M_InterruptMenuWithChallenges(&MainDef);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -4811,7 +4825,7 @@ static void M_FirstPickProfile(INT32 c)
|
||||||
optionsmenu.profile = NULL; // Make sure to get rid of that, too.
|
optionsmenu.profile = NULL; // Make sure to get rid of that, too.
|
||||||
|
|
||||||
PR_ApplyProfile(optionsmenu.profilen, 0);
|
PR_ApplyProfile(optionsmenu.profilen, 0);
|
||||||
M_SetupNextMenu(&MainDef, false);
|
M_SetupNextMenu(M_InterruptMenuWithChallenges(&MainDef), false);
|
||||||
|
|
||||||
// Tell the game this is the last profile we picked.
|
// Tell the game this is the last profile we picked.
|
||||||
CV_StealthSetValue(&cv_ttlprofilen, optionsmenu.profilen);
|
CV_StealthSetValue(&cv_ttlprofilen, optionsmenu.profilen);
|
||||||
|
|
@ -6807,3 +6821,53 @@ void M_Manual(INT32 choice)
|
||||||
MISC_ManualDef.prevMenu = (choice == INT32_MAX ? NULL : currentMenu);
|
MISC_ManualDef.prevMenu = (choice == INT32_MAX ? NULL : currentMenu);
|
||||||
M_SetupNextMenu(&MISC_ManualDef, true);
|
M_SetupNextMenu(&MISC_ManualDef, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct challengesmenu_s challengesmenu;
|
||||||
|
|
||||||
|
void M_ChallengesTick(void)
|
||||||
|
{
|
||||||
|
challengesmenu.ticker++;
|
||||||
|
|
||||||
|
if (challengesmenu.pending && challengesmenu.currentunlock >= MAXUNLOCKABLES)
|
||||||
|
{
|
||||||
|
if ((challengesmenu.currentunlock = M_GetNextAchievedUnlock(true)) >= MAXUNLOCKABLES)
|
||||||
|
challengesmenu.pending = false;
|
||||||
|
}
|
||||||
|
else if (challengesmenu.unlockanim >= UNLOCKTIME)
|
||||||
|
{
|
||||||
|
;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
challengesmenu.unlockanim++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean M_ChallengesInputs(INT32 ch)
|
||||||
|
{
|
||||||
|
const UINT8 pid = 0;
|
||||||
|
boolean start = M_MenuButtonPressed(pid, MBT_START);
|
||||||
|
(void) ch;
|
||||||
|
|
||||||
|
if (challengesmenu.unlockanim < UNLOCKTIME)
|
||||||
|
{
|
||||||
|
;
|
||||||
|
}
|
||||||
|
else if (challengesmenu.pending)
|
||||||
|
{
|
||||||
|
if ((M_MenuConfirmPressed(pid) || start))
|
||||||
|
{
|
||||||
|
challengesmenu.currentunlock = MAXUNLOCKABLES;
|
||||||
|
challengesmenu.unlockanim = 0;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (M_MenuBackPressed(pid) || start)
|
||||||
|
{
|
||||||
|
M_GoBack(0);
|
||||||
|
M_SetMenuDelay(pid);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
||||||
38
src/m_cond.c
38
src/m_cond.c
|
|
@ -261,12 +261,12 @@ boolean M_UpdateUnlockablesAndExtraEmblems(boolean loud)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((gamedata->unlocked[i] = M_Achieved(unlockables[i].conditionset - 1)) == false)
|
if (gamedata->unlocked[i] == true)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlockables[i].nocecho)
|
if (M_Achieved(unlockables[i].conditionset - 1) == false)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -281,6 +281,7 @@ boolean M_UpdateUnlockablesAndExtraEmblems(boolean loud)
|
||||||
// Announce
|
// Announce
|
||||||
if (cechoLines && loud)
|
if (cechoLines && loud)
|
||||||
{
|
{
|
||||||
|
strcat(cechoText, "Return to main menu to see");
|
||||||
#ifdef DEVELOP
|
#ifdef DEVELOP
|
||||||
// todo make debugmode
|
// todo make debugmode
|
||||||
CONS_Printf("%s\n", cechoText);
|
CONS_Printf("%s\n", cechoText);
|
||||||
|
|
@ -290,6 +291,39 @@ boolean M_UpdateUnlockablesAndExtraEmblems(boolean loud)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UINT8 M_GetNextAchievedUnlock(boolean set)
|
||||||
|
{
|
||||||
|
UINT8 i;
|
||||||
|
|
||||||
|
// Go through unlockables
|
||||||
|
for (i = 0; i < MAXUNLOCKABLES; ++i)
|
||||||
|
{
|
||||||
|
if (gamedata->unlocked[i] || !unlockables[i].conditionset)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gamedata->unlocked[i] == true)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (M_Achieved(unlockables[i].conditionset - 1) == false)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (set)
|
||||||
|
{
|
||||||
|
gamedata->unlocked[i] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MAXUNLOCKABLES;
|
||||||
|
}
|
||||||
|
|
||||||
// Emblem unlocking shit
|
// Emblem unlocking shit
|
||||||
UINT8 M_CheckLevelEmblems(void)
|
UINT8 M_CheckLevelEmblems(void)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -182,6 +182,7 @@ void M_ClearSecrets(void);
|
||||||
void M_CheckUnlockConditions(void);
|
void M_CheckUnlockConditions(void);
|
||||||
UINT8 M_CheckCondition(condition_t *cn);
|
UINT8 M_CheckCondition(condition_t *cn);
|
||||||
boolean M_UpdateUnlockablesAndExtraEmblems(boolean silent);
|
boolean M_UpdateUnlockablesAndExtraEmblems(boolean silent);
|
||||||
|
UINT8 M_GetNextAchievedUnlock(boolean set);
|
||||||
UINT8 M_CheckLevelEmblems(void);
|
UINT8 M_CheckLevelEmblems(void);
|
||||||
UINT8 M_CompletionEmblems(void);
|
UINT8 M_CompletionEmblems(void);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue