mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-27 20:41:46 +00:00
Tutorials are now strongly ordered, as opposed to passively ordered
- You will only see one uncompleted course on the Tutorial level select at a time.
- All subsequent stages will not be visible.
- This actually doesn't apply if you've beaten all the basegame Tutorial courses, and then load custom ones, to avoid discouraging the creation of those.
- If you select the menu and any loaded Tutorial stage is not completed, that stage will be highlighted automatically.
- Uses the same icon as the Grand Prix backup tracker
- Partly because it's the same general concept, saving your progress between sessions and alerting you to incompletion
- Partly so I didn't have to bother any asset creators for something more specialised
This commit is contained in:
parent
993dea580c
commit
95ea6ae883
3 changed files with 69 additions and 7 deletions
|
|
@ -2894,7 +2894,7 @@ static void M_DrawHighLowLevelTitle(INT16 x, INT16 y, INT16 map)
|
||||||
V_DrawLSTitleLowString(x2, y+28, 0, word2);
|
V_DrawLSTitleLowString(x2, y+28, 0, word2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void M_DrawLevelSelectBlock(INT16 x, INT16 y, INT16 map, boolean redblink, boolean greyscale)
|
static void M_DrawLevelSelectBlock(INT16 x, INT16 y, UINT16 map, boolean redblink, boolean greyscale)
|
||||||
{
|
{
|
||||||
UINT8 *colormap = NULL;
|
UINT8 *colormap = NULL;
|
||||||
|
|
||||||
|
|
@ -2913,6 +2913,20 @@ static void M_DrawLevelSelectBlock(INT16 x, INT16 y, INT16 map, boolean redblink
|
||||||
map,
|
map,
|
||||||
colormap);
|
colormap);
|
||||||
M_DrawHighLowLevelTitle(98+x, y+8, map);
|
M_DrawHighLowLevelTitle(98+x, y+8, map);
|
||||||
|
|
||||||
|
if (levellist.levelsearch.tutorial && !(mapheaderinfo[map]->records.mapvisited & MV_BEATEN))
|
||||||
|
{
|
||||||
|
V_DrawScaledPatch(
|
||||||
|
x + 80 + 3, y + 50, 0,
|
||||||
|
W_CachePatchName(
|
||||||
|
va(
|
||||||
|
"CUPBKUP%c",
|
||||||
|
(greyscale ? '1' : '2')
|
||||||
|
),
|
||||||
|
PU_CACHE
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void M_DrawLevelSelect(void)
|
void M_DrawLevelSelect(void)
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,11 @@ static void M_StatisticsMaps(void)
|
||||||
headerexists = false;
|
headerexists = false;
|
||||||
for (i = 0; i < nummapheaders; i++)
|
for (i = 0; i < nummapheaders; i++)
|
||||||
{
|
{
|
||||||
M_StatisticsAddMap(i, NULL, &headerexists, true);
|
if (M_StatisticsAddMap(i, NULL, &headerexists, true))
|
||||||
|
{
|
||||||
|
if (!(mapheaderinfo[i]->records.mapvisited & MV_BEATEN))
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((i = statisticsmenu.numextramedals) != 0)
|
if ((i = statisticsmenu.numextramedals) != 0)
|
||||||
|
|
|
||||||
|
|
@ -125,9 +125,25 @@ UINT16 M_CountLevelsToShowInList(levelsearch_t *levelsearch)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < nummapheaders; i++)
|
for (i = 0; i < nummapheaders; i++)
|
||||||
|
{
|
||||||
if (M_CanShowLevelInList(i, levelsearch))
|
if (M_CanShowLevelInList(i, levelsearch))
|
||||||
|
{
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
|
// Tutorial will only show what you've made your way to
|
||||||
|
if (!levelsearch->checklocked)
|
||||||
|
continue;
|
||||||
|
if (!levelsearch->tutorial)
|
||||||
|
continue;
|
||||||
|
if (i >= basenummapheaders)
|
||||||
|
continue;
|
||||||
|
if (mapheaderinfo[i]->records.mapvisited & MV_BEATEN)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -188,6 +204,13 @@ UINT16 M_GetNextLevelInList(UINT16 mapnum, UINT8 *i, levelsearch_t *levelsearch)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// Tutorial will only show what you've made your way to
|
||||||
|
if (levelsearch->checklocked
|
||||||
|
&& levelsearch->tutorial
|
||||||
|
&& mapnum < basenummapheaders
|
||||||
|
&& !(mapheaderinfo[mapnum]->records.mapvisited & MV_BEATEN))
|
||||||
|
return NEXTMAP_INVALID;
|
||||||
|
|
||||||
mapnum++;
|
mapnum++;
|
||||||
while (!M_CanShowLevelInList(mapnum, levelsearch) && mapnum < nummapheaders)
|
while (!M_CanShowLevelInList(mapnum, levelsearch) && mapnum < nummapheaders)
|
||||||
mapnum++;
|
mapnum++;
|
||||||
|
|
@ -412,19 +435,41 @@ boolean M_LevelListFromGametype(INT16 gt)
|
||||||
|
|
||||||
// Okay, just a list of maps then.
|
// Okay, just a list of maps then.
|
||||||
|
|
||||||
if (M_GetFirstLevelInList(&temp, &levellist.levelsearch) == NEXTMAP_INVALID)
|
boolean invalidatedcursor = (
|
||||||
|
levellist.levelsearch.cup != NULL
|
||||||
|
|| levellist.levelsearch.tutorial != (gt == GT_TUTORIAL)
|
||||||
|
);
|
||||||
|
levellist.levelsearch.cup = NULL;
|
||||||
|
levellist.levelsearch.tutorial = (gt == GT_TUTORIAL);
|
||||||
|
|
||||||
|
UINT16 test = M_GetFirstLevelInList(&temp, &levellist.levelsearch);
|
||||||
|
|
||||||
|
if (test == NEXTMAP_INVALID)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset position properly if you go back & forth between gametypes
|
// Reset position properly if you go back & forth between gametypes
|
||||||
if (levellist.levelsearch.cup)
|
levellist.mapcount = M_CountLevelsToShowInList(&levellist.levelsearch);
|
||||||
|
|
||||||
|
if (levellist.levelsearch.tutorial && levellist.levelsearch.checklocked)
|
||||||
|
{
|
||||||
|
// Find the first level we haven't played.
|
||||||
|
UINT16 possiblecursor = 0;
|
||||||
|
while (test < nummapheaders && (mapheaderinfo[test]->records.mapvisited & MV_BEATEN))
|
||||||
|
{
|
||||||
|
test = M_GetNextLevelInList(test, &temp, &levellist.levelsearch);
|
||||||
|
possiblecursor++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (test != NEXTMAP_INVALID)
|
||||||
|
levellist.cursor = possiblecursor;
|
||||||
|
}
|
||||||
|
else if (invalidatedcursor)
|
||||||
{
|
{
|
||||||
levellist.cursor = 0;
|
levellist.cursor = 0;
|
||||||
levellist.levelsearch.cup = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
levellist.mapcount = M_CountLevelsToShowInList(&levellist.levelsearch);
|
|
||||||
M_LevelSelectScrollDest();
|
M_LevelSelectScrollDest();
|
||||||
levellist.y = levellist.dest;
|
levellist.y = levellist.dest;
|
||||||
|
|
||||||
|
|
@ -450,7 +495,6 @@ void M_LevelSelectInit(INT32 choice)
|
||||||
// Make sure this is reset as we'll only be using this function for offline games!
|
// Make sure this is reset as we'll only be using this function for offline games!
|
||||||
levellist.netgame = false;
|
levellist.netgame = false;
|
||||||
levellist.levelsearch.checklocked = true;
|
levellist.levelsearch.checklocked = true;
|
||||||
levellist.levelsearch.tutorial = (gt == GT_TUTORIAL);
|
|
||||||
|
|
||||||
switch (currentMenu->menuitems[itemOn].mvar1)
|
switch (currentMenu->menuitems[itemOn].mvar1)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue