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);
memset(&unlockables[num], 0, sizeof(unlockable_t));
unlockables[num].objective[0] = '/';
do
{

View File

@ -573,31 +573,31 @@ extraemblem_t extraemblems[MAXEXTRAEMBLEMS] =
unlockable_t unlockables[MAXUNLOCKABLES] =
{
// 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},
/* 02 */ {"NiGHTS Mode", "Complete Floral Field", 0, 2, SECRET_NIGHTSMODE, 0, true, true, 0},
/* 01 */ {"Record Attack", "/", 0, 1, SECRET_RECORDATTACK, 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},
/* 04 */ {"Sound Test", "Complete 1P Mode", 40, 10, SECRET_SOUNDTEST, 0, false, false, 0},
/* 03 */ {"Play Credits", "/", 30, 10, SECRET_CREDITS, 0, true, true, 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},
/* 07 */ {"Azure Temple Zone", "Complete Aerial Garden Zone", 80, 20, SECRET_WARP, 41, false, false, 0},
/* 06 */ {"Aerial Garden Zone", "/", 70, 11, SECRET_WARP, 40, 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},
/* 10 */ {"Mario Koopa Blast", "Collect 60 Emblems", 110, 42, SECRET_WARP, 30, false, false, 0},
/* 11 */ {"PLACEHOLDER", "PLACEHOLDER", 0, 0, SECRET_NONE, 0, true, true, 0},
/* 09 */ {"PLACEHOLDER", "/", 0, 0, SECRET_NONE, 0, true, true, 0},
/* 10 */ {"Mario Koopa Blast", "/", 110, 42, SECRET_WARP, 30, false, false, 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},
/* 13 */ {"Black Hole", "A Rank in all Special Stages", 0, 50, SECRET_NONE, 0, false, true, 0},
/* 12 */ {"Spring Hill Zone", "/", 0, 44, SECRET_NONE, 0, false, false, 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},
/* 15 */ {"Emblem Radar", "Collect 80 Emblems", 0, 43, SECRET_ITEMFINDER, 0, false, true, 0},
/* 14 */ {"Emblem Hints", "/", 0, 41, SECRET_EMBLEMHINTS, 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},
/* 17 */ {"Level Select", "Collect All Emblems", 20, 45, SECRET_LEVELSELECT, 1, false, true, 0},
/* 16 */ {"Pandora's Box", "/", 0, 45, SECRET_PANDORA, 0, false, false, 0},
/* 17 */ {"Level Select", "/", 20, 45, SECRET_LEVELSELECT, 1, false, true, 0},
};
// 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_PandorasBox(INT32 choice);
static void M_EmblemHints(INT32 choice);
static void M_HandleChecklist(INT32 choice);
menu_t SR_MainDef, SR_UnlockChecklistDef;
static UINT8 check_on;
// Misc. Main Menu
static void M_SinglePlayerMenu(INT32 choice);
static void M_Options(INT32 choice);
@ -712,7 +715,7 @@ static menuitem_t SR_LevelSelectMenu[] =
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[] =
@ -1497,7 +1500,7 @@ menu_t SR_LevelSelectDef = MAPPLATTERMENUSTYLE(NULL, SR_LevelSelectMenu);
menu_t SR_UnlockChecklistDef =
{
NULL,
"M_SECRET",
1,
&SR_MainDef,
SR_UnlockChecklistMenu,
@ -4787,12 +4790,65 @@ static void M_LevelSelectWarp(INT32 choice)
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)
{
INT32 i = 0, j = 0, y = currentMenu->y;
INT32 i = check_on, j = 0, y = currentMenu->y;
UINT32 condnum, previd, maxcond;
condition_t *cond;
// draw title (or big pic)
M_DrawMenuTitle();
if (check_on)
V_DrawString(10, y, V_YELLOWMAP, "\x1A");
while (i < MAXUNLOCKABLES)
{
if (unlockables[i].name[0] == 0 //|| unlockables[i].nochecklist
@ -4808,68 +4864,96 @@ static void M_DrawChecklist(void)
break;
}
if ((j != MAXUNLOCKABLES) && (unlockables[i].conditionset == unlockables[j].conditionset))
y += 8;
addy(8)
else
{
if ((maxcond = conditionSets[unlockables[i].conditionset-1].numconditions))
{
cond = conditionSets[unlockables[i].conditionset-1].condition;
previd = cond[0].id;
y += 2;
for (condnum = 0; condnum < maxcond; condnum++)
addy(2);
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;
V_DrawString(currentMenu->x + 4, y, V_YELLOWMAP, "OR");
}
if (cond[condnum].id != previd)
{
addy(8);
V_DrawString(currentMenu->x + 4, y, V_YELLOWMAP, "OR");
}
y += 8;
addy(8);
switch (cond[condnum].type)
{
case UC_MAPBEATEN:
case UC_MAPPERFECT:
{
char *title = G_BuildMapTitle(cond[condnum].requirement);
if (title)
switch (cond[condnum].type)
{
case UC_MAPBEATEN:
case UC_MAPPERFECT:
{
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);
char *title = G_BuildMapTitle(cond[condnum].requirement);
if (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;
case UC_GAMECLEAR:
case UC_ALLEMERALDS:
{
const char *emeraldtext = ((cond[condnum].type == UC_ALLEMERALDS) ? " with all emeralds" : "");
if (cond[condnum].requirement != 1)
V_DrawString(currentMenu->x, y,
V_ALLOWLOWERCASE,va("\x1E Complete the game %d times%s",
cond[condnum].requirement, emeraldtext));
else
V_DrawString(currentMenu->x, y,
V_ALLOWLOWERCASE,
va("\x1E Complete the game%s", emeraldtext));
}
break;
case UC_TOTALEMBLEMS:
V_DrawString(currentMenu->x, y,
V_ALLOWLOWERCASE,
va("\x1E Collect %s%d emblems", ((M_CountEmblems() == cond[condnum].requirement) ? "all " : ""), cond[condnum].requirement));
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;
break;
case UC_GAMECLEAR:
case UC_ALLEMERALDS:
{
const char *emeraldtext = ((cond[condnum].type == UC_ALLEMERALDS) ? " with all emeralds" : "");
if (cond[condnum].requirement != 1)
V_DrawString(currentMenu->x, y,
V_ALLOWLOWERCASE,va("\x1E Beat the game %d times%s",
cond[condnum].requirement, emeraldtext));
else
V_DrawString(currentMenu->x, y,
V_ALLOWLOWERCASE,
va("\x1E Beat the game%s", emeraldtext));
}
break;
case UC_TOTALEMBLEMS:
V_DrawString(currentMenu->x, y,
V_ALLOWLOWERCASE,
va("\x1E Collect %s%d emblems", ((M_CountEmblems() == cond[condnum].requirement) ? "all " : ""), cond[condnum].requirement));
break;
case UC_NIGHTSGRADE:
{
// No support for specific mare information yet.
char *title = G_BuildMapTitle(cond[condnum].extrainfo1);
char grade = ('F' - (char)cond[condnum].requirement);
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;
@ -4880,6 +4964,12 @@ static void M_DrawChecklist(void)
else
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
@ -8025,7 +8115,6 @@ static void M_ToggleSFX(INT32 choice)
return;
case KEY_ESCAPE:
S_StartSound(NULL, sfx_menu1);
if (currentMenu->prevMenu)
M_SetupNextMenu(currentMenu->prevMenu);
else
@ -8080,7 +8169,6 @@ static void M_ToggleDigital(INT32 choice)
return;
case KEY_ESCAPE:
S_StartSound(NULL, sfx_menu1);
if (currentMenu->prevMenu)
M_SetupNextMenu(currentMenu->prevMenu);
else
@ -8132,7 +8220,6 @@ static void M_ToggleMIDI(INT32 choice)
return;
case KEY_ESCAPE:
S_StartSound(NULL, sfx_menu1);
if (currentMenu->prevMenu)
M_SetupNextMenu(currentMenu->prevMenu);
else
@ -8703,7 +8790,6 @@ static void M_HandleFogColor(INT32 choice)
break;
case KEY_ESCAPE:
S_StartSound(NULL, sfx_menu1);
exitmenu = true;
break;