* Add new graphics for the no save and ultimate slots, and make the invalid files look a little different.
* Push big endsign images downwards. * Add a way to disable the ultimate slot. * BwehHehHe()
This commit is contained in:
parent
706eb5efeb
commit
6e7605e4f3
97
src/m_menu.c
97
src/m_menu.c
|
@ -4094,6 +4094,24 @@ static boolean M_PrepareLevelPlatter(INT32 gt)
|
||||||
mapnum++;
|
mapnum++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SYMMETRICAL_PLATTER
|
||||||
|
// horizontally space out rows with missing right sides
|
||||||
|
for (; row >= 0; row--)
|
||||||
|
{
|
||||||
|
if (!levelselect.rows[row].maplist[2] // no right side
|
||||||
|
&& levelselect.rows[row].maplist[0] && levelselect.rows[row].maplist[1]) // all the left filled in
|
||||||
|
{
|
||||||
|
levelselect.rows[row].maplist[2] = levelselect.rows[row].maplist[1];
|
||||||
|
STRBUFCPY(levelselect.rows[row].mapnames[2], levelselect.rows[row].mapnames[1]);
|
||||||
|
levelselect.rows[row].mapavailable[2] = levelselect.rows[row].mapavailable[1];
|
||||||
|
|
||||||
|
levelselect.rows[row].maplist[1] = -1; // diamond
|
||||||
|
levelselect.rows[row].mapnames[1][0] = '\0';
|
||||||
|
levelselect.rows[row].mapavailable[1] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (levselp[0][0]) // never going to have some provided but not all, saves individually checking
|
if (levselp[0][0]) // never going to have some provided but not all, saves individually checking
|
||||||
{
|
{
|
||||||
W_UnlockCachedPatch(levselp[0][0]);
|
W_UnlockCachedPatch(levselp[0][0]);
|
||||||
|
@ -4231,7 +4249,7 @@ static void M_HandleLevelPlatter(INT32 choice)
|
||||||
else if (!lsoffs[0]) // prevent sound spam
|
else if (!lsoffs[0]) // prevent sound spam
|
||||||
{
|
{
|
||||||
lsoffs[0] = -8;
|
lsoffs[0] = -8;
|
||||||
S_StartSound(NULL,sfx_s3kb2);
|
S_StartSound(NULL,sfx_lose);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -4277,7 +4295,7 @@ static void M_DrawLevelPlatterWideMap(UINT8 row, UINT8 col, INT32 x, INT32 y, bo
|
||||||
patch_t *patch;
|
patch_t *patch;
|
||||||
|
|
||||||
INT32 map = levelselect.rows[row].maplist[col];
|
INT32 map = levelselect.rows[row].maplist[col];
|
||||||
if (!map)
|
if (map <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// A 564x100 image of the level as entry MAPxxW
|
// A 564x100 image of the level as entry MAPxxW
|
||||||
|
@ -4318,7 +4336,7 @@ static void M_DrawLevelPlatterMap(UINT8 row, UINT8 col, INT32 x, INT32 y, boolea
|
||||||
patch_t *patch;
|
patch_t *patch;
|
||||||
|
|
||||||
INT32 map = levelselect.rows[row].maplist[col];
|
INT32 map = levelselect.rows[row].maplist[col];
|
||||||
if (!map)
|
if (map <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// A 160x100 image of the level as entry MAPxxP
|
// A 160x100 image of the level as entry MAPxxP
|
||||||
|
@ -4403,7 +4421,7 @@ static void M_DrawLevelPlatterMenu(void)
|
||||||
// draw cursor box
|
// draw cursor box
|
||||||
V_DrawSmallScaledPatch(lsbasex + cursorx + lsoffs[1], lsbasey, 0, (levselp[sizeselect][((skullAnimCounter/4) ? 1 : 0)]));
|
V_DrawSmallScaledPatch(lsbasex + cursorx + lsoffs[1], lsbasey, 0, (levselp[sizeselect][((skullAnimCounter/4) ? 1 : 0)]));
|
||||||
|
|
||||||
if (levelselect.rows[lsrow].maplist[lscol])
|
if (levelselect.rows[lsrow].maplist[lscol] > 0)
|
||||||
V_DrawScaledPatch(lsbasex + cursorx-17, lsbasey+50+lsoffs[0], 0, W_CachePatchName("M_CURSOR", PU_CACHE));
|
V_DrawScaledPatch(lsbasex + cursorx-17, lsbasey+50+lsoffs[0], 0, W_CachePatchName("M_CURSOR", PU_CACHE));
|
||||||
|
|
||||||
// handle movement of cursor box
|
// handle movement of cursor box
|
||||||
|
@ -6057,7 +6075,7 @@ static void M_DrawLoadGameData(void)
|
||||||
if (savetodraw == 0)
|
if (savetodraw == 0)
|
||||||
{
|
{
|
||||||
V_DrawSmallScaledPatch(x, y, 0,
|
V_DrawSmallScaledPatch(x, y, 0,
|
||||||
W_CachePatchName("SAVENONE", PU_CACHE));
|
W_CachePatchName(((ultimate_selectable) ? "ULTIMATE" : "SAVENONE"), PU_CACHE));
|
||||||
x += 2;
|
x += 2;
|
||||||
y += 1;
|
y += 1;
|
||||||
V_DrawString(x, y,
|
V_DrawString(x, y,
|
||||||
|
@ -6067,7 +6085,7 @@ static void M_DrawLoadGameData(void)
|
||||||
V_DrawFill(x, y+9, 80, 1, yellowmap[3]);
|
V_DrawFill(x, y+9, 80, 1, yellowmap[3]);
|
||||||
y += 11;
|
y += 11;
|
||||||
V_DrawSmallScaledPatch(x, y, V_STATIC,
|
V_DrawSmallScaledPatch(x, y, V_STATIC,
|
||||||
W_CachePatchName("BLACKLVL", PU_CACHE));
|
W_CachePatchName("BLACXLVL", PU_CACHE));
|
||||||
y += 41;
|
y += 41;
|
||||||
if (ultimate_selectable)
|
if (ultimate_selectable)
|
||||||
V_DrawRightAlignedThinString(x + 79, y, V_REDMAP, "ULTIMATE.");
|
V_DrawRightAlignedThinString(x + 79, y, V_REDMAP, "ULTIMATE.");
|
||||||
|
@ -6078,26 +6096,34 @@ static void M_DrawLoadGameData(void)
|
||||||
|
|
||||||
savetodraw--;
|
savetodraw--;
|
||||||
|
|
||||||
|
if (savegameinfo[savetodraw].lives > 0)
|
||||||
|
charskin = &skins[savegameinfo[savetodraw].skinnum];
|
||||||
|
|
||||||
// signpost background
|
// signpost background
|
||||||
{
|
{
|
||||||
UINT8 col;
|
UINT8 col;
|
||||||
if (savegameinfo[savetodraw].botskin == 3) // & knuckles
|
if (savegameinfo[savetodraw].lives == -666)
|
||||||
|
{
|
||||||
|
V_DrawSmallScaledPatch(x+2, y+64, 0,
|
||||||
|
W_CachePatchName("BLANKLVL", PU_CACHE));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (savegameinfo[savetodraw].lives == -42)
|
||||||
|
col = 26;
|
||||||
|
else if (savegameinfo[savetodraw].botskin == 3) // & knuckles
|
||||||
col = 105;
|
col = 105;
|
||||||
else if (savegameinfo[savetodraw].botskin) // tailsbot or custom
|
else if (savegameinfo[savetodraw].botskin) // tailsbot or custom
|
||||||
col = 134;
|
col = 134;
|
||||||
else if (savegameinfo[savetodraw].lives == -42)
|
|
||||||
col = 26;
|
|
||||||
else if (savegameinfo[savetodraw].lives == -666)
|
|
||||||
col = 47;
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
charskin = &skins[savegameinfo[savetodraw].skinnum];
|
|
||||||
col = (charskin->prefcolor - 1)*2;
|
col = (charskin->prefcolor - 1)*2;
|
||||||
col = Color_Index[Color_Opposite[col]-1][Color_Opposite[col+1]];
|
col = Color_Index[Color_Opposite[col]-1][Color_Opposite[col+1]];
|
||||||
}
|
}
|
||||||
|
|
||||||
V_DrawFill(x+6, y+64, 72, 50, col);
|
V_DrawFill(x+6, y+64, 72, 50, col);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
V_DrawSmallScaledPatch(x, y, 0,
|
V_DrawSmallScaledPatch(x, y, 0,
|
||||||
W_CachePatchName("SAVEBACK", PU_CACHE));
|
W_CachePatchName("SAVEBACK", PU_CACHE));
|
||||||
|
@ -6150,7 +6176,20 @@ static void M_DrawLoadGameData(void)
|
||||||
|| (savegameinfo[savetodraw].lives == -666))
|
|| (savegameinfo[savetodraw].lives == -666))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
y += 51;
|
y += 64;
|
||||||
|
|
||||||
|
// tiny emeralds
|
||||||
|
{
|
||||||
|
INT32 j, workx = x + 6;
|
||||||
|
for (j = 0; j < 7; ++j)
|
||||||
|
{
|
||||||
|
if (savegameinfo[savetodraw].numemeralds & (1 << j))
|
||||||
|
V_DrawScaledPatch(workx, y, 0, tinyemeraldpics[j]);
|
||||||
|
workx += 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
y -= 13;
|
||||||
|
|
||||||
// character heads, lives, and continues
|
// character heads, lives, and continues
|
||||||
{
|
{
|
||||||
|
@ -6159,7 +6198,7 @@ static void M_DrawLoadGameData(void)
|
||||||
patch_t *patch;
|
patch_t *patch;
|
||||||
UINT8 *colormap = NULL;
|
UINT8 *colormap = NULL;
|
||||||
|
|
||||||
INT32 tempx = (x+40)<<FRACBITS, tempy = y<<FRACBITS, flip = 0;
|
INT32 tempx = (x+40)<<FRACBITS, tempy = y<<FRACBITS, flip = 0, calc;
|
||||||
|
|
||||||
// botskin first
|
// botskin first
|
||||||
if (savegameinfo[savetodraw].botskin)
|
if (savegameinfo[savetodraw].botskin)
|
||||||
|
@ -6193,6 +6232,8 @@ skipbot:
|
||||||
goto skipsign;
|
goto skipsign;
|
||||||
sprframe = &sprdef->spriteframes[0];
|
sprframe = &sprdef->spriteframes[0];
|
||||||
patch = W_CachePatchNum(sprframe->lumppat[0], PU_CACHE);
|
patch = W_CachePatchNum(sprframe->lumppat[0], PU_CACHE);
|
||||||
|
if ((calc = SHORT(patch->topoffset) - 42) > 0)
|
||||||
|
tempy += ((4+calc)<<FRACBITS);
|
||||||
|
|
||||||
V_DrawFixedPatch(
|
V_DrawFixedPatch(
|
||||||
tempx,
|
tempx,
|
||||||
|
@ -6254,20 +6295,6 @@ skiplife:
|
||||||
V_DrawString(tempx + 16, y, V_GRAYMAP, "0");
|
V_DrawString(tempx + 16, y, V_GRAYMAP, "0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
x += 6;
|
|
||||||
y -= 12;
|
|
||||||
|
|
||||||
// tiny emeralds
|
|
||||||
{
|
|
||||||
INT32 j;
|
|
||||||
for (j = 0; j < 7; ++j)
|
|
||||||
{
|
|
||||||
if (savegameinfo[savetodraw].numemeralds & (1 << j))
|
|
||||||
V_DrawScaledPatch(x, y, 0, tinyemeraldpics[j]);
|
|
||||||
x += 10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6479,7 +6506,7 @@ static void M_SaveGameDeleteResponse(INT32 ch)
|
||||||
name[sizeof name - 1] = '\0';
|
name[sizeof name - 1] = '\0';
|
||||||
remove(name);
|
remove(name);
|
||||||
|
|
||||||
S_StartSound(NULL, sfx_bewar1+M_RandomKey(4)); // Bweh heh he
|
BwehHehHe();
|
||||||
M_ReadSaveStrings(); // reload the menu
|
M_ReadSaveStrings(); // reload the menu
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6513,7 +6540,7 @@ static void M_HandleLoadSave(INT32 choice)
|
||||||
}
|
}
|
||||||
else if (!loadgameoffset)
|
else if (!loadgameoffset)
|
||||||
{
|
{
|
||||||
S_StartSound(NULL, sfx_s3kb2);
|
S_StartSound(NULL, sfx_lose);
|
||||||
loadgameoffset = 14;
|
loadgameoffset = 14;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -6533,7 +6560,13 @@ static void M_HandleLoadSave(INT32 choice)
|
||||||
}
|
}
|
||||||
else if (!loadgameoffset)
|
else if (!loadgameoffset)
|
||||||
{
|
{
|
||||||
S_StartSound(NULL, sfx_s3kb2);
|
if (saveSlotSelected == NOSAVESLOT && ultimate_selectable)
|
||||||
|
{
|
||||||
|
ultimate_selectable = false;
|
||||||
|
BwehHehHe();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
S_StartSound(NULL, sfx_lose);
|
||||||
loadgameoffset = 14;
|
loadgameoffset = 14;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -8816,7 +8849,7 @@ static void M_EraseDataResponse(INT32 ch)
|
||||||
totalplaytime = 0;
|
totalplaytime = 0;
|
||||||
F_StartIntro();
|
F_StartIntro();
|
||||||
}
|
}
|
||||||
S_StartSound(NULL, sfx_bewar1+M_RandomKey(4)); // Bweh heh he
|
BwehHehHe();
|
||||||
M_ClearMenus(true);
|
M_ClearMenus(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -236,6 +236,8 @@ extern INT32 ultimate_selectable;
|
||||||
#define MAXSAVEGAMES 31 //note: last save game is "no save"
|
#define MAXSAVEGAMES 31 //note: last save game is "no save"
|
||||||
#define NOSAVESLOT 0 //slot where Play Without Saving appears
|
#define NOSAVESLOT 0 //slot where Play Without Saving appears
|
||||||
|
|
||||||
|
#define BwehHehHe() S_StartSound(NULL, sfx_bewar1+M_RandomKey(4)) // Bweh heh he
|
||||||
|
|
||||||
void M_ForceSaveSlotSelected(INT32 sslot);
|
void M_ForceSaveSlotSelected(INT32 sslot);
|
||||||
|
|
||||||
void M_CheatActivationResponder(INT32 ch);
|
void M_CheatActivationResponder(INT32 ch);
|
||||||
|
|
Loading…
Reference in a new issue