Ended up being stressed and not getting any real work done, so figured I'd finish up the checklist system.

This commit is contained in:
toasterbabe 2017-04-23 00:16:09 +01:00
parent 9a8ae7cd64
commit bcf0df7cb6
3 changed files with 158 additions and 71 deletions

View File

@ -2469,6 +2469,7 @@ static void readunlockable(MYFILE *f, INT32 num)
DEH_WriteUndoline("VAR", va("%d", unlockables[num].variable), UNDO_NONE); DEH_WriteUndoline("VAR", va("%d", unlockables[num].variable), UNDO_NONE);
memset(&unlockables[num], 0, sizeof(unlockable_t)); memset(&unlockables[num], 0, sizeof(unlockable_t));
unlockables[num].objective[0] = '/';
do do
{ {

View File

@ -573,31 +573,31 @@ extraemblem_t extraemblems[MAXEXTRAEMBLEMS] =
unlockable_t unlockables[MAXUNLOCKABLES] = unlockable_t unlockables[MAXUNLOCKABLES] =
{ {
// Name, Objective, Menu Height, ConditionSet, Unlock Type, Variable, NoCecho, NoChecklist // Name, Objective, Menu Height, ConditionSet, Unlock Type, Variable, NoCecho, NoChecklist
/* 01 */ {"Record Attack", "Complete Greenflower Zone, Act 1", 0, 1, SECRET_RECORDATTACK, 0, true, true, 0}, /* 01 */ {"Record Attack", "/", 0, 1, SECRET_RECORDATTACK, 0, true, true, 0},
/* 02 */ {"NiGHTS Mode", "Complete Floral Field", 0, 2, SECRET_NIGHTSMODE, 0, true, true, 0}, /* 02 */ {"NiGHTS Mode", "/", 0, 2, SECRET_NIGHTSMODE, 0, true, true, 0},
/* 03 */ {"Play Credits", "Complete 1P Mode", 30, 10, SECRET_CREDITS, 0, true, true, 0}, /* 03 */ {"Play Credits", "/", 30, 10, SECRET_CREDITS, 0, true, true, 0},
/* 04 */ {"Sound Test", "Complete 1P Mode", 40, 10, SECRET_SOUNDTEST, 0, false, false, 0}, /* 04 */ {"Sound Test", "/", 40, 10, SECRET_SOUNDTEST, 0, false, false, 0},
/* 05 */ {"EXTRA LEVELS", "", 58, 0, SECRET_HEADER, 0, true, true, 0}, /* 05 */ {"EXTRA LEVELS", "/", 58, 0, SECRET_HEADER, 0, true, true, 0},
/* 06 */ {"Aerial Garden Zone", "Complete 1P Mode w/ all emeralds", 70, 11, SECRET_WARP, 40, false, false, 0}, /* 06 */ {"Aerial Garden Zone", "/", 70, 11, SECRET_WARP, 40, false, false, 0},
/* 07 */ {"Azure Temple Zone", "Complete Aerial Garden Zone", 80, 20, SECRET_WARP, 41, false, false, 0}, /* 07 */ {"Azure Temple Zone", "/", 80, 20, SECRET_WARP, 41, false, false, 0},
/* 08 */ {"BONUS LEVELS", "", 98, 0, SECRET_HEADER, 0, true, true, 0}, /* 08 */ {"BONUS LEVELS", "/", 98, 0, SECRET_HEADER, 0, true, true, 0},
/* 09 */ {"PLACEHOLDER", "PLACEHOLDER", 0, 0, SECRET_NONE, 0, true, true, 0}, /* 09 */ {"PLACEHOLDER", "/", 0, 0, SECRET_NONE, 0, true, true, 0},
/* 10 */ {"Mario Koopa Blast", "Collect 60 Emblems", 110, 42, SECRET_WARP, 30, false, false, 0}, /* 10 */ {"Mario Koopa Blast", "/", 110, 42, SECRET_WARP, 30, false, false, 0},
/* 11 */ {"PLACEHOLDER", "PLACEHOLDER", 0, 0, SECRET_NONE, 0, true, true, 0}, /* 11 */ {"PLACEHOLDER", "/", 0, 0, SECRET_NONE, 0, true, true, 0},
/* 12 */ {"Spring Hill Zone", "Collect 100 Emblems", 0, 44, SECRET_NONE, 0, false, false, 0}, /* 12 */ {"Spring Hill Zone", "/", 0, 44, SECRET_NONE, 0, false, false, 0},
/* 13 */ {"Black Hole", "A Rank in all Special Stages", 0, 50, SECRET_NONE, 0, false, true, 0}, /* 13 */ {"Black Hole", "Get grade A in all Special Stages", 0, 50, SECRET_NONE, 0, false, true, 0},
/* 14 */ {"Emblem Hints", "Collect 40 Emblems", 0, 41, SECRET_EMBLEMHINTS, 0, false, true, 0}, /* 14 */ {"Emblem Hints", "/", 0, 41, SECRET_EMBLEMHINTS, 0, false, true, 0},
/* 15 */ {"Emblem Radar", "Collect 80 Emblems", 0, 43, SECRET_ITEMFINDER, 0, false, true, 0}, /* 15 */ {"Emblem Radar", "/", 0, 43, SECRET_ITEMFINDER, 0, false, true, 0},
/* 16 */ {"Pandora's Box", "Collect All Emblems", 0, 45, SECRET_PANDORA, 0, false, false, 0}, /* 16 */ {"Pandora's Box", "/", 0, 45, SECRET_PANDORA, 0, false, false, 0},
/* 17 */ {"Level Select", "Collect All Emblems", 20, 45, SECRET_LEVELSELECT, 1, false, true, 0}, /* 17 */ {"Level Select", "/", 20, 45, SECRET_LEVELSELECT, 1, false, true, 0},
}; };
// Default number of emblems and extra emblems // Default number of emblems and extra emblems

View File

@ -241,8 +241,11 @@ static void M_LevelSelectWarp(INT32 choice);
static void M_Credits(INT32 choice); static void M_Credits(INT32 choice);
static void M_PandorasBox(INT32 choice); static void M_PandorasBox(INT32 choice);
static void M_EmblemHints(INT32 choice); static void M_EmblemHints(INT32 choice);
static void M_HandleChecklist(INT32 choice);
menu_t SR_MainDef, SR_UnlockChecklistDef; menu_t SR_MainDef, SR_UnlockChecklistDef;
static UINT8 check_on;
// Misc. Main Menu // Misc. Main Menu
static void M_SinglePlayerMenu(INT32 choice); static void M_SinglePlayerMenu(INT32 choice);
static void M_Options(INT32 choice); static void M_Options(INT32 choice);
@ -712,7 +715,7 @@ static menuitem_t SR_LevelSelectMenu[] =
static menuitem_t SR_UnlockChecklistMenu[] = static menuitem_t SR_UnlockChecklistMenu[] =
{ {
{IT_SUBMENU | IT_STRING, NULL, "NEXT", &SR_MainDef, 192}, {IT_KEYHANDLER | IT_STRING, NULL, "", M_HandleChecklist, 0},
}; };
static menuitem_t SR_EmblemHintMenu[] = static menuitem_t SR_EmblemHintMenu[] =
@ -1497,7 +1500,7 @@ menu_t SR_LevelSelectDef = MAPPLATTERMENUSTYLE(NULL, SR_LevelSelectMenu);
menu_t SR_UnlockChecklistDef = menu_t SR_UnlockChecklistDef =
{ {
NULL, "M_SECRET",
1, 1,
&SR_MainDef, &SR_MainDef,
SR_UnlockChecklistMenu, SR_UnlockChecklistMenu,
@ -4787,12 +4790,65 @@ static void M_LevelSelectWarp(INT32 choice)
UINT8 skyRoomMenuTranslations[MAXUNLOCKABLES]; UINT8 skyRoomMenuTranslations[MAXUNLOCKABLES];
static boolean checklist_cangodown; // uuuueeerggghhhh HACK
static void M_HandleChecklist(INT32 choice)
{
INT32 j;
switch (choice)
{
case KEY_DOWNARROW:
S_StartSound(NULL, sfx_menu1);
if (checklist_cangodown)
{
for (j = check_on+1; j < MAXUNLOCKABLES; j++)
{
if (!(unlockables[j].name[0] == 0 //|| unlockables[j].nochecklist
|| !unlockables[j].conditionset || unlockables[j].conditionset > MAXCONDITIONSETS))
break;
}
if (j != MAXUNLOCKABLES)
check_on = j;
}
return;
case KEY_UPARROW:
S_StartSound(NULL, sfx_menu1);
for (j = check_on-1; j > -1; j--)
{
if (!(unlockables[j].name[0] == 0 //|| unlockables[j].nochecklist
|| !unlockables[j].conditionset || unlockables[j].conditionset > MAXCONDITIONSETS))
break;
}
if (j != -1)
check_on = j;
return;
case KEY_ESCAPE:
if (currentMenu->prevMenu)
M_SetupNextMenu(currentMenu->prevMenu);
else
M_ClearMenus(true);
return;
default:
break;
}
}
#define addy(add) { y += add; if ((y - currentMenu->y) > (scrollareaheight*2)) goto finishchecklist; }
static void M_DrawChecklist(void) static void M_DrawChecklist(void)
{ {
INT32 i = 0, j = 0, y = currentMenu->y; INT32 i = check_on, j = 0, y = currentMenu->y;
UINT32 condnum, previd, maxcond; UINT32 condnum, previd, maxcond;
condition_t *cond; condition_t *cond;
// draw title (or big pic)
M_DrawMenuTitle();
if (check_on)
V_DrawString(10, y, V_YELLOWMAP, "\x1A");
while (i < MAXUNLOCKABLES) while (i < MAXUNLOCKABLES)
{ {
if (unlockables[i].name[0] == 0 //|| unlockables[i].nochecklist if (unlockables[i].name[0] == 0 //|| unlockables[i].nochecklist
@ -4808,68 +4864,96 @@ static void M_DrawChecklist(void)
break; break;
} }
if ((j != MAXUNLOCKABLES) && (unlockables[i].conditionset == unlockables[j].conditionset)) if ((j != MAXUNLOCKABLES) && (unlockables[i].conditionset == unlockables[j].conditionset))
y += 8; addy(8)
else else
{ {
if ((maxcond = conditionSets[unlockables[i].conditionset-1].numconditions)) if ((maxcond = conditionSets[unlockables[i].conditionset-1].numconditions))
{ {
cond = conditionSets[unlockables[i].conditionset-1].condition; cond = conditionSets[unlockables[i].conditionset-1].condition;
previd = cond[0].id; previd = cond[0].id;
y += 2; addy(2);
for (condnum = 0; condnum < maxcond; condnum++)
if (unlockables[i].objective[0] != '/')
{ {
if (cond[condnum].id != previd) addy(8);
V_DrawString(currentMenu->x, y,
V_ALLOWLOWERCASE,
va("\x1E %s", unlockables[i].objective));
}
else
{
for (condnum = 0; condnum < maxcond; condnum++)
{ {
y += 8; if (cond[condnum].id != previd)
V_DrawString(currentMenu->x + 4, y, V_YELLOWMAP, "OR"); {
} addy(8);
V_DrawString(currentMenu->x + 4, y, V_YELLOWMAP, "OR");
}
y += 8; addy(8);
switch (cond[condnum].type) switch (cond[condnum].type)
{ {
case UC_MAPBEATEN: case UC_MAPBEATEN:
case UC_MAPPERFECT: case UC_MAPPERFECT:
{
char *title = G_BuildMapTitle(cond[condnum].requirement);
if (title)
{ {
V_DrawString(currentMenu->x, y, V_ALLOWLOWERCASE, va("\x1E %s %s", char *title = G_BuildMapTitle(cond[condnum].requirement);
((cond[condnum].type == UC_MAPPERFECT) ? "Get every ring in" : "Complete"), if (title)
((M_MapLocked(cond[condnum].requirement) || !((mapheaderinfo[cond[condnum].requirement-1]->menuflags & LF2_NOVISITNEEDED) || mapvisited[cond[condnum].requirement-1])) ? M_CreateSecretMenuOption(title) : title))); {
Z_Free(title); V_DrawString(currentMenu->x, y, V_ALLOWLOWERCASE, va("\x1E %s %s",
((cond[condnum].type == UC_MAPPERFECT) ? "Get every ring in" : "Complete"),
((M_MapLocked(cond[condnum].requirement) || !((mapheaderinfo[cond[condnum].requirement-1]->menuflags & LF2_NOVISITNEEDED) || mapvisited[cond[condnum].requirement-1])) ? M_CreateSecretMenuOption(title) : title)));
Z_Free(title);
}
} }
} break;
break; case UC_GAMECLEAR:
case UC_GAMECLEAR: case UC_ALLEMERALDS:
case UC_ALLEMERALDS: {
{ const char *emeraldtext = ((cond[condnum].type == UC_ALLEMERALDS) ? " with all emeralds" : "");
const char *emeraldtext = ((cond[condnum].type == UC_ALLEMERALDS) ? " with all emeralds" : ""); if (cond[condnum].requirement != 1)
if (cond[condnum].requirement != 1) V_DrawString(currentMenu->x, y,
V_DrawString(currentMenu->x, y, V_ALLOWLOWERCASE,va("\x1E Beat the game %d times%s",
V_ALLOWLOWERCASE,va("\x1E Complete the game %d times%s", cond[condnum].requirement, emeraldtext));
cond[condnum].requirement, emeraldtext)); else
else V_DrawString(currentMenu->x, y,
V_DrawString(currentMenu->x, y, V_ALLOWLOWERCASE,
V_ALLOWLOWERCASE, va("\x1E Beat the game%s", emeraldtext));
va("\x1E Complete the game%s", emeraldtext)); }
} break;
break; case UC_TOTALEMBLEMS:
case UC_TOTALEMBLEMS: V_DrawString(currentMenu->x, y,
V_DrawString(currentMenu->x, y, V_ALLOWLOWERCASE,
V_ALLOWLOWERCASE, va("\x1E Collect %s%d emblems", ((M_CountEmblems() == cond[condnum].requirement) ? "all " : ""), cond[condnum].requirement));
va("\x1E Collect %s%d emblems", ((M_CountEmblems() == cond[condnum].requirement) ? "all " : ""), cond[condnum].requirement)); break;
break; case UC_NIGHTSGRADE:
default: {
V_DrawString(currentMenu->x, y, // No support for specific mare information yet.
V_ALLOWLOWERCASE, char *title = G_BuildMapTitle(cond[condnum].extrainfo1);
va("\x1E id %d, type %d, req %d", cond[condnum].id, cond[condnum].type, cond[condnum].requirement)); char grade = ('F' - (char)cond[condnum].requirement);
break; if (grade < 'A')
grade = 'A';
if (title)
{
V_DrawString(currentMenu->x, y, V_ALLOWLOWERCASE, va("\x1E Get grade %c in %s",
grade,
((M_MapLocked(cond[condnum].extrainfo1) || !((mapheaderinfo[cond[condnum].extrainfo1-1]->menuflags & LF2_NOVISITNEEDED) || mapvisited[cond[condnum].extrainfo1-1])) ? M_CreateSecretMenuOption(title) : title)));
Z_Free(title);
}
}
break;
default:
V_DrawString(currentMenu->x, y,
V_ALLOWLOWERCASE,
va("\x1E id %d, type %d, req %d", cond[condnum].id, cond[condnum].type, cond[condnum].requirement));
break;
}
previd = cond[condnum].id;
} }
previd = cond[condnum].id;
} }
} }
y += 12; addy(12);
} }
i = j; i = j;
@ -4880,6 +4964,12 @@ static void M_DrawChecklist(void)
else else
V_DrawString(308, 8+(24*j), V_YELLOWMAP, "N");*/ V_DrawString(308, 8+(24*j), V_YELLOWMAP, "N");*/
} }
finishchecklist:
if ((checklist_cangodown = ((y - currentMenu->y) > (scrollareaheight*2)))) // haaaaaaacks.
{
V_DrawString(10, currentMenu->y+(scrollareaheight*2), V_YELLOWMAP, "\x1B");
}
} }
#define NUMHINTS 5 #define NUMHINTS 5
@ -8025,7 +8115,6 @@ static void M_ToggleSFX(INT32 choice)
return; return;
case KEY_ESCAPE: case KEY_ESCAPE:
S_StartSound(NULL, sfx_menu1);
if (currentMenu->prevMenu) if (currentMenu->prevMenu)
M_SetupNextMenu(currentMenu->prevMenu); M_SetupNextMenu(currentMenu->prevMenu);
else else
@ -8080,7 +8169,6 @@ static void M_ToggleDigital(INT32 choice)
return; return;
case KEY_ESCAPE: case KEY_ESCAPE:
S_StartSound(NULL, sfx_menu1);
if (currentMenu->prevMenu) if (currentMenu->prevMenu)
M_SetupNextMenu(currentMenu->prevMenu); M_SetupNextMenu(currentMenu->prevMenu);
else else
@ -8132,7 +8220,6 @@ static void M_ToggleMIDI(INT32 choice)
return; return;
case KEY_ESCAPE: case KEY_ESCAPE:
S_StartSound(NULL, sfx_menu1);
if (currentMenu->prevMenu) if (currentMenu->prevMenu)
M_SetupNextMenu(currentMenu->prevMenu); M_SetupNextMenu(currentMenu->prevMenu);
else else
@ -8703,7 +8790,6 @@ static void M_HandleFogColor(INT32 choice)
break; break;
case KEY_ESCAPE: case KEY_ESCAPE:
S_StartSound(NULL, sfx_menu1);
exitmenu = true; exitmenu = true;
break; break;