Cleanup & bug-fixin

This commit is contained in:
TehRealSalt 2019-10-15 20:56:28 -04:00
parent cf8a77cfd6
commit 64a3d133b4
14 changed files with 383 additions and 366 deletions

View file

@ -1352,8 +1352,7 @@ finish:
// landing point for possiblevalue failures // landing point for possiblevalue failures
badinput: badinput:
if (var != &cv_nextmap) // Suppress errors for cv_nextmap CONS_Printf(M_GetText("\"%s\" is not a possible value for \"%s\"\n"), valstr, var->name);
CONS_Printf(M_GetText("\"%s\" is not a possible value for \"%s\"\n"), valstr, var->name);
// default value not valid... ?! // default value not valid... ?!
if (var->defaultvalue == valstr) if (var->defaultvalue == valstr)
@ -1628,44 +1627,6 @@ void CV_AddValue(consvar_t *var, INT32 increment)
if (var->PossibleValue) if (var->PossibleValue)
{ {
#if 0
if (var == &cv_nextmap)
{
// Special case for the nextmap variable, used only directly from the menu
INT32 oldvalue = var->value - 1, gt;
gt = cv_newgametype.value;
if (increment != 0) // Going up!
{
newvalue = var->value - 1;
do
{
if(increment > 0) // Going up!
{
if (++newvalue == NUMMAPS)
newvalue = -1;
}
else // Going down!
{
if (--newvalue == -2)
newvalue = NUMMAPS-1;
}
if (newvalue == oldvalue)
break; // don't loop forever if there's none of a certain gametype
if(!mapheaderinfo[newvalue])
continue; // Don't allocate the header. That just makes memory usage skyrocket.
} while (!M_CanShowLevelInList(newvalue, gt));
var->value = newvalue + 1;
var->func();
return;
}
}
else
#endif
#define MINVAL 0 #define MINVAL 0
#define MAXVAL 1 #define MAXVAL 1
if (var->PossibleValue[MINVAL].strvalue && !strcmp(var->PossibleValue[MINVAL].strvalue, "MIN")) if (var->PossibleValue[MINVAL].strvalue && !strcmp(var->PossibleValue[MINVAL].strvalue, "MIN"))

View file

@ -493,10 +493,7 @@ static void D_Display(void)
if (lastdraw) if (lastdraw)
{ {
if (rendermode == render_soft) if (rendermode == render_soft)
{
VID_BlitLinearScreen(screens[0], screens[1], vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes); VID_BlitLinearScreen(screens[0], screens[1], vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes);
usebuffer = true;
}
lastdraw = false; lastdraw = false;
} }
@ -1335,7 +1332,7 @@ void D_SRB2Main(void)
if (M_CheckParm("-noupload")) if (M_CheckParm("-noupload"))
COM_BufAddText("downloading 0\n"); COM_BufAddText("downloading 0\n");
CONS_Printf("M_Init(): Init miscellaneous info.\n"); CONS_Printf("M_Init(): Init menus.\n");
M_Init(); M_Init();
CONS_Printf("R_Init(): Init SRB2 refresh daemon.\n"); CONS_Printf("R_Init(): Init SRB2 refresh daemon.\n");

View file

@ -518,23 +518,17 @@ const char *netxcmdnames[MAXNETXCMD - 1] =
void D_RegisterServerCommands(void) void D_RegisterServerCommands(void)
{ {
INT32 i; INT32 i;
Forceskin_cons_t[0].value = -1; Forceskin_cons_t[0].value = -1;
Forceskin_cons_t[0].strvalue = "Off"; Forceskin_cons_t[0].strvalue = "Off";
for (i = 0; i < NUMGAMETYPES; i++)
{
gametype_cons_t[i].value = i;
gametype_cons_t[i].strvalue = Gametype_Names[i];
}
gametype_cons_t[NUMGAMETYPES].value = 0;
gametype_cons_t[NUMGAMETYPES].strvalue = NULL;
// Set the values to 0/NULL, it will be overwritten later when a skin is assigned to the slot. // Set the values to 0/NULL, it will be overwritten later when a skin is assigned to the slot.
for (i = 1; i < MAXSKINS; i++) for (i = 1; i < MAXSKINS; i++)
{ {
Forceskin_cons_t[i].value = 0; Forceskin_cons_t[i].value = 0;
Forceskin_cons_t[i].strvalue = NULL; Forceskin_cons_t[i].strvalue = NULL;
} }
RegisterNetXCmd(XD_NAMEANDCOLOR, Got_NameAndColor); RegisterNetXCmd(XD_NAMEANDCOLOR, Got_NameAndColor);
RegisterNetXCmd(XD_WEAPONPREF, Got_WeaponPref); RegisterNetXCmd(XD_WEAPONPREF, Got_WeaponPref);
RegisterNetXCmd(XD_MAP, Got_Mapcmd); RegisterNetXCmd(XD_MAP, Got_Mapcmd);
@ -4786,6 +4780,7 @@ void D_GameTypeChanged(INT32 lastgametype)
if (oldgt && newgt) if (oldgt && newgt)
CONS_Printf(M_GetText("Gametype was changed from %s to %s\n"), oldgt, newgt); CONS_Printf(M_GetText("Gametype was changed from %s to %s\n"), oldgt, newgt);
} }
// Only do the following as the server, not as remote admin. // Only do the following as the server, not as remote admin.
// There will always be a server, and this only needs to be done once. // There will always be a server, and this only needs to be done once.
if (server && (multiplayer || netgame)) if (server && (multiplayer || netgame))
@ -4859,9 +4854,10 @@ void D_GameTypeChanged(INT32 lastgametype)
} }
} }
#if 0
// When swapping to a gametype that supports spectators, // When swapping to a gametype that supports spectators,
// make everyone a spectator initially. // make everyone a spectator initially.
/*if (G_GametypeHasSpectators()) if (G_GametypeHasSpectators())
{ {
INT32 i; INT32 i;
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
@ -4870,7 +4866,8 @@ void D_GameTypeChanged(INT32 lastgametype)
players[i].ctfteam = 0; players[i].ctfteam = 0;
players[i].spectator = true; players[i].spectator = true;
} }
}*/ }
#endif
// don't retain teams in other modes or between changes from ctf to team match. // don't retain teams in other modes or between changes from ctf to team match.
// also, stop any and all forms of team scrambling that might otherwise take place. // also, stop any and all forms of team scrambling that might otherwise take place.

View file

@ -1459,9 +1459,12 @@ static void readcupheader(MYFILE *f, cupheader_t *cup)
break; break;
if (cup->numlevels >= MAXLEVELLIST) if (cup->numlevels >= MAXLEVELLIST)
{
deh_warning("%s Cup: reached max levellist (%d)\n", cup->name, MAXLEVELLIST); deh_warning("%s Cup: reached max levellist (%d)\n", cup->name, MAXLEVELLIST);
break;
}
cup->levellist[cup->numlevels] = map; cup->levellist[cup->numlevels] = map - 1;
cup->numlevels++; cup->numlevels++;
} while((tmp = strtok(NULL,",")) != NULL); } while((tmp = strtok(NULL,",")) != NULL);
} }
@ -1470,14 +1473,14 @@ static void readcupheader(MYFILE *f, cupheader_t *cup)
// Convert to map number // Convert to map number
if (word2[0] >= 'A' && word2[0] <= 'Z' && word2[2] == '\0') if (word2[0] >= 'A' && word2[0] <= 'Z' && word2[2] == '\0')
i = M_MapNumber(word2[0], word2[1]); i = M_MapNumber(word2[0], word2[1]);
cup->bonusgame = (INT16)i; cup->bonusgame = (INT16)i - 1;
} }
else if (fastcmp(word, "SPECIALSTAGE")) else if (fastcmp(word, "SPECIALSTAGE"))
{ {
// Convert to map number // Convert to map number
if (word2[0] >= 'A' && word2[0] <= 'Z' && word2[2] == '\0') if (word2[0] >= 'A' && word2[0] <= 'Z' && word2[2] == '\0')
i = M_MapNumber(word2[0], word2[1]); i = M_MapNumber(word2[0], word2[1]);
cup->specialstage = (INT16)i; cup->specialstage = (INT16)i - 1;
} }
else if (fastcmp(word, "EMERALDNUM")) else if (fastcmp(word, "EMERALDNUM"))
{ {
@ -1486,6 +1489,13 @@ static void readcupheader(MYFILE *f, cupheader_t *cup)
else else
deh_warning("%s Cup: invalid emerald number %d", cup->name, i); deh_warning("%s Cup: invalid emerald number %d", cup->name, i);
} }
else if (fastcmp(word, "UNLOCKABLE"))
{
if (i >= 0 && i <= MAXUNLOCKABLES) // 0 for no unlock required, anything else requires something
cup->unlockrequired = (SINT8)i - 1;
else
deh_warning("%s Cup: invalid unlockable number %d", cup->name, i);
}
else else
deh_warning("%s Cup: unknown word '%s'", cup->name, word); deh_warning("%s Cup: unknown word '%s'", cup->name, word);
} }

View file

@ -291,6 +291,8 @@ typedef struct
extern mapheader_t* mapheaderinfo[NUMMAPS]; extern mapheader_t* mapheaderinfo[NUMMAPS];
// This could support more, but is that a good idea?
// Keep in mind that it may encourage people making overly long cups just because they "can", and would be a waste of memory.
#define MAXLEVELLIST 5 #define MAXLEVELLIST 5
typedef struct cupheader_s typedef struct cupheader_s
@ -303,6 +305,7 @@ typedef struct cupheader_s
INT16 bonusgame; ///< Map number to use for bonus game INT16 bonusgame; ///< Map number to use for bonus game
INT16 specialstage; ///< Map number to use for special stage INT16 specialstage; ///< Map number to use for special stage
UINT8 emeraldnum; ///< ID of Emerald to use for special stage (1-7 for Chaos Emeralds, 8-14 for Super Emeralds, 0 for no emerald) UINT8 emeraldnum; ///< ID of Emerald to use for special stage (1-7 for Chaos Emeralds, 8-14 for Super Emeralds, 0 for no emerald)
SINT8 unlockrequired; ///< An unlockable is required to select this cup. -1 for no unlocking required.
struct cupheader_s *next; ///< Next cup in linked list struct cupheader_s *next; ///< Next cup in linked list
} cupheader_t; } cupheader_t;

View file

@ -808,9 +808,10 @@ const char *G_BuildMapName(INT32 map)
{ {
static char mapname[10] = "MAPXX"; // internal map name (wad resource name) static char mapname[10] = "MAPXX"; // internal map name (wad resource name)
I_Assert(map >= 0); I_Assert(map > 0);
I_Assert(map <= NUMMAPS); I_Assert(map <= NUMMAPS);
#if 0
if (map == 0) // hack??? if (map == 0) // hack???
{ {
if (gamestate == GS_TITLESCREEN) if (gamestate == GS_TITLESCREEN)
@ -821,6 +822,7 @@ const char *G_BuildMapName(INT32 map)
map = prevmap; map = prevmap;
map = G_RandMap(G_TOLFlag(cv_newgametype.value), map, false, 0, false, NULL)+1; map = G_RandMap(G_TOLFlag(cv_newgametype.value), map, false, 0, false, NULL)+1;
} }
#endif
if (map < 100) if (map < 100)
sprintf(&mapname[3], "%.2d", map); sprintf(&mapname[3], "%.2d", map);

View file

@ -2978,7 +2978,7 @@ static void HU_DrawRankings(void)
if (modeattacking) if (modeattacking)
V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, "Record Attack"); V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, "Record Attack");
else else
V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, gametype_cons_t[gametype].strvalue); V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, Gametype_Names[gametype]);
if (G_GametypeHasTeams()) if (G_GametypeHasTeams())
{ {

View file

@ -202,8 +202,7 @@ extern struct menutransition_s {
extern boolean menuwipe; extern boolean menuwipe;
extern consvar_t cv_showfocuslost; extern consvar_t cv_showfocuslost;
extern consvar_t cv_newgametype, cv_nextmap, cv_chooseskin, cv_serversort; extern consvar_t cv_chooseskin, cv_serversort;
extern CV_PossibleValue_t gametype_cons_t[];
void Moviemode_mode_Onchange(void); void Moviemode_mode_Onchange(void);
void Screenshot_option_Onchange(void); void Screenshot_option_Onchange(void);
@ -286,35 +285,31 @@ void M_CharacterSelectHandler(INT32 choice);
void M_CharacterSelectTick(void); void M_CharacterSelectTick(void);
boolean M_CharacterSelectQuit(void); boolean M_CharacterSelectQuit(void);
#define CUPS_COLUMNS 7 #define CUPMENU_COLUMNS 7
#define CUPS_ROWS 2 #define CUPMENU_ROWS 2
#define CUPS_MAPSPERCUP 5 #define CUPMENU_CURSORID (cupgrid.x + (cupgrid.y * CUPMENU_COLUMNS) + (cupgrid.pageno * (CUPMENU_COLUMNS * CUPMENU_ROWS)))
#define CUPS_MAX (NUMMAPS / CUPS_MAPSPERCUP)
#define CUPS_PAGES (CUPS_MAX / (CUPS_COLUMNS * CUPS_ROWS))
#define CUPID (levellist_cupgrid.x + (levellist_cupgrid.y * CUPS_COLUMNS)) extern struct cupgrid_s {
extern cupheader_t *selectedcup;
extern INT16 selectedcupnum;
extern struct levellist_cupgrid_s {
UINT8 numcups;
SINT8 x, y; SINT8 x, y;
SINT8 pageno; SINT8 pageno;
UINT8 numpages;
tic_t previewanim; tic_t previewanim;
boolean grandprix; // Setup grand prix server after picking boolean grandprix; // Setup grand prix server after picking
} levellist_cupgrid; } cupgrid;
extern struct levellist_scroll_s { extern struct levellist_s {
SINT8 cursor; SINT8 cursor;
UINT16 y; UINT16 y;
UINT16 dest; UINT16 dest;
cupheader_t *selectedcup;
INT16 choosemap;
UINT8 newgametype;
boolean timeattack; // Setup time attack menu after picking boolean timeattack; // Setup time attack menu after picking
} levellist_scroll; } levellist;
boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt); boolean M_CanShowLevelInList(INT16 mapnum, UINT8 gt);
INT32 M_CountLevelsToShowInList(INT32 gt); INT16 M_CountLevelsToShowInList(UINT8 gt);
INT32 M_GetFirstLevelInList(INT32 gt); INT16 M_GetFirstLevelInList(UINT8 gt);
void M_LevelSelectInit(INT32 choice); void M_LevelSelectInit(INT32 choice);
void M_CupSelectHandler(INT32 choice); void M_CupSelectHandler(INT32 choice);

View file

@ -102,13 +102,13 @@ void M_Drawer(void)
if (gamestate == GS_MENU) // draw BG if (gamestate == GS_MENU) // draw BG
V_DrawFixedPatch(0, 0, FRACUNIT, 0, W_CachePatchName("MENUBG", PU_CACHE), NULL); V_DrawFixedPatch(0, 0, FRACUNIT, 0, W_CachePatchName("MENUBG", PU_CACHE), NULL);
else if (!WipeInAction && currentMenu != &PAUSE_PlaybackMenuDef) else if (!WipeInAction && currentMenu != &PAUSE_PlaybackMenuDef)
V_DrawFadeScreen(0xFF00, 16); // now that's more readable with a faded background (yeah like Quake...) V_DrawCustomFadeScreen("FADEMAP0", 4); // now that's more readable with a faded background (yeah like Quake...)
if (currentMenu->drawroutine) if (currentMenu->drawroutine)
currentMenu->drawroutine(); // call current menu Draw routine currentMenu->drawroutine(); // call current menu Draw routine
// draw non-green resolution border // draw non-green resolution border
if ((gamestate == GS_MENU) && ((vid.width % BASEVIDWIDTH != 0) || (vid.height % BASEVIDHEIGHT != 0))) if ((vid.width % BASEVIDWIDTH != 0) || (vid.height % BASEVIDHEIGHT != 0))
V_DrawFixedPatch(0, 0, FRACUNIT, 0, W_CachePatchName("WEIRDRES", PU_CACHE), NULL); V_DrawFixedPatch(0, 0, FRACUNIT, 0, W_CachePatchName("WEIRDRES", PU_CACHE), NULL);
// Draw version down in corner // Draw version down in corner
@ -878,21 +878,62 @@ void M_DrawCharacterSelect(void)
static void M_DrawCupPreview(INT16 y, cupheader_t *cup) static void M_DrawCupPreview(INT16 y, cupheader_t *cup)
{ {
UINT8 i; UINT8 i;
INT16 x = -(levellist_cupgrid.previewanim % 82); INT16 x = -(cupgrid.previewanim % 82);
for (i = 0; i < cup->numlevels; i++) V_DrawFill(0, y, BASEVIDWIDTH, 54, 31);
if (cup && (cup->unlockrequired == -1 || unlockables[cup->unlockrequired].unlocked))
{ {
lumpnum_t lumpnum; for (i = 0; i < cup->numlevels; i++)
patch_t *PictureOfLevel; {
UINT8 lvloff = (i + (levellist_cupgrid.previewanim / 82)) % cup->numlevels; lumpnum_t lumpnum;
patch_t *PictureOfLevel;
UINT8 lvloff = (i + (cupgrid.previewanim / 82)) % cup->numlevels;
lumpnum = W_CheckNumForName(va("%sP", G_BuildMapName(cup->levellist[lvloff] ))); lumpnum = W_CheckNumForName(va("%sP", G_BuildMapName(cup->levellist[lvloff]+1)));
if (lumpnum != LUMPERROR) if (lumpnum != LUMPERROR)
PictureOfLevel = W_CachePatchNum(lumpnum, PU_CACHE); PictureOfLevel = W_CachePatchNum(lumpnum, PU_CACHE);
else else
PictureOfLevel = W_CachePatchName("BLANKLVL", PU_CACHE); PictureOfLevel = W_CachePatchName("BLANKLVL", PU_CACHE);
V_DrawSmallScaledPatch(x + 1 + (i*82), y+2, 0, PictureOfLevel); V_DrawSmallScaledPatch(x + 1 + (i*82), y+2, 0, PictureOfLevel);
}
}
else
{
patch_t *st = W_CachePatchName(va("PREVST0%d", (cupgrid.previewanim % 4) + 1), PU_CACHE);
while (x < BASEVIDWIDTH)
{
V_DrawScaledPatch(x+1, y+2, 0, st);
x += 82;
}
}
}
static void M_DrawCupTitle(INT16 y, cupheader_t *cup)
{
V_DrawScaledPatch(0, y, 0, W_CachePatchName("MENUHINT", PU_CACHE));
if (cup)
{
boolean unlocked = (cup->unlockrequired == -1 || unlockables[cup->unlockrequired].unlocked);
UINT8 *colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_GREY, GTC_MENUCACHE);
patch_t *icon = W_CachePatchName(cup->icon, PU_CACHE);
const char *str = (unlocked ? va("%s Cup", cup->name) : "???");
INT16 offset = V_LSTitleLowStringWidth(str, 0) / 2;
V_DrawLSTitleLowString(BASEVIDWIDTH/2 - offset, y+6, 0, str);
if (unlocked)
{
V_DrawMappedPatch(BASEVIDWIDTH/2 - offset - 24, y+5, 0, icon, colormap);
V_DrawMappedPatch(BASEVIDWIDTH/2 + offset + 3, y+5, 0, icon, colormap);
}
}
else
{
if (currentMenu == &PLAY_LevelSelectDef)
V_DrawCenteredLSTitleLowString(BASEVIDWIDTH/2, y+6, 0, va("%s Mode", Gametype_Names[levellist.newgametype]));
} }
} }
@ -903,16 +944,16 @@ void M_DrawCupSelect(void)
while (cup) while (cup)
{ {
if (cup->id == CUPID) if (cup->id == CUPMENU_CURSORID)
break; break;
cup = cup->next; cup = cup->next;
} }
for (i = 0; i < CUPS_COLUMNS; i++) for (i = 0; i < CUPMENU_COLUMNS; i++)
{ {
for (j = 0; j < CUPS_ROWS; j++) for (j = 0; j < CUPMENU_ROWS; j++)
{ {
UINT8 id = (i + (j * CUPS_COLUMNS)); UINT8 id = (i + (j * CUPMENU_COLUMNS)) + (cupgrid.pageno * (CUPMENU_COLUMNS * CUPMENU_ROWS));
cupheader_t *iconcup = kartcupheaders; cupheader_t *iconcup = kartcupheaders;
patch_t *patch = NULL; patch_t *patch = NULL;
INT16 x, y; INT16 x, y;
@ -943,24 +984,26 @@ void M_DrawCupSelect(void)
V_DrawScaledPatch(x, y, 0, patch); V_DrawScaledPatch(x, y, 0, patch);
V_DrawScaledPatch(x + 8, y + icony, 0, W_CachePatchName(iconcup->icon, PU_CACHE)); if (iconcup->unlockrequired != -1 && !unlockables[iconcup->unlockrequired].unlocked)
V_DrawScaledPatch(x + 8, y + icony, 0, W_CachePatchName("CUPBOX", PU_CACHE)); {
patch_t *st = W_CachePatchName(va("ICONST0%d", (cupgrid.previewanim % 4) + 1), PU_CACHE);
V_DrawScaledPatch(x + 8, y + icony, 0, st);
}
else
{
V_DrawScaledPatch(x + 8, y + icony, 0, W_CachePatchName(iconcup->icon, PU_CACHE));
V_DrawScaledPatch(x + 8, y + icony, 0, W_CachePatchName("CUPBOX", PU_CACHE));
}
} }
} }
V_DrawScaledPatch(14 + (levellist_cupgrid.x*42) - 4, V_DrawScaledPatch(14 + (cupgrid.x*42) - 4,
20 + (levellist_cupgrid.y*44) - 1 - (12*menutransition.tics), 20 + (cupgrid.y*44) - 1 - (12*menutransition.tics),
0, W_CachePatchName("CUPCURS", PU_CACHE) 0, W_CachePatchName("CUPCURS", PU_CACHE)
); );
V_DrawFill(0, 146 + (12*menutransition.tics), BASEVIDWIDTH, 54, 31); M_DrawCupPreview(146 + (12*menutransition.tics), cup);
V_DrawScaledPatch(0, 120 - (12*menutransition.tics), 0, W_CachePatchName("MENUHINT", PU_CACHE)); M_DrawCupTitle(120 - (12*menutransition.tics), cup);
if (cup)
{
M_DrawCupPreview(146 + (12*menutransition.tics), cup);
V_DrawCenteredLSTitleLowString(BASEVIDWIDTH/2, 126 - (12*menutransition.tics), 0, va("%s Cup", cup->name));
}
} }
static void M_DrawHighLowLevelTitle(INT16 x, INT16 y, INT16 map) static void M_DrawHighLowLevelTitle(INT16 x, INT16 y, INT16 map)
@ -1033,16 +1076,37 @@ static void M_DrawHighLowLevelTitle(INT16 x, INT16 y, INT16 map)
} }
} }
if (mapheaderinfo[map]->actnum[0])
{
word2[word2len] = ' ';
word2len++;
for (i = 0; i < 3; i++)
{
if (!mapheaderinfo[map]->actnum[i])
break;
word2[word2len] = mapheaderinfo[map]->actnum[i];
word2len++;
}
}
word1[word1len] = '\0'; word1[word1len] = '\0';
word2[word2len] = '\0'; word2[word2len] = '\0';
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
INT32 c; INT32 c;
if (i >= word1len) if (i >= word1len)
break; break;
c = toupper(word1[i]) - LT_FONTSTART; c = toupper(word1[i]) - LT_FONTSTART;
x2 += SHORT(title_font_high[c]->width) - 4;
if (!title_font_high[c])
x2 += 16;
else
x2 += SHORT(title_font_high[c]->width) - 4;
} }
if (word1len) if (word1len)
@ -1060,7 +1124,7 @@ static void M_DrawLevelSelectBlock(INT16 x, INT16 y, INT16 map, boolean redblink
if (greyscale) if (greyscale)
colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_GREY, GTC_MENUCACHE); colormap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_GREY, GTC_MENUCACHE);
lumpnum = W_CheckNumForName(va("%sP", G_BuildMapName(map))); lumpnum = W_CheckNumForName(va("%sP", G_BuildMapName(map+1)));
if (lumpnum != LUMPERROR) if (lumpnum != LUMPERROR)
PictureOfLevel = W_CachePatchNum(lumpnum, PU_CACHE); PictureOfLevel = W_CachePatchNum(lumpnum, PU_CACHE);
else else
@ -1072,16 +1136,17 @@ static void M_DrawLevelSelectBlock(INT16 x, INT16 y, INT16 map, boolean redblink
V_DrawScaledPatch(3+x, y, 0, W_CachePatchName("LVLSEL", PU_CACHE)); V_DrawScaledPatch(3+x, y, 0, W_CachePatchName("LVLSEL", PU_CACHE));
V_DrawSmallMappedPatch(9+x, y+6, 0, PictureOfLevel, colormap); V_DrawSmallMappedPatch(9+x, y+6, 0, PictureOfLevel, colormap);
M_DrawHighLowLevelTitle(98+x, y+8, map-1); M_DrawHighLowLevelTitle(98+x, y+8, map);
} }
void M_DrawLevelSelect(void) void M_DrawLevelSelect(void)
{ {
INT16 i; INT16 i;
INT16 start = M_GetFirstLevelInList(cv_newgametype.value)-1; INT16 start = M_GetFirstLevelInList(levellist.newgametype);
INT16 map = start;
INT16 t = (32*menutransition.tics), tay = 0; INT16 t = (32*menutransition.tics), tay = 0;
INT16 y = 80 - (12 * levellist_scroll.y); INT16 y = 80 - (12 * levellist.y);
boolean tatransition = (menutransition.startmenu == &PLAY_TimeAttackDef || menutransition.endmenu == &PLAY_TimeAttackDef); boolean tatransition = ((menutransition.startmenu == &PLAY_TimeAttackDef || menutransition.endmenu == &PLAY_TimeAttackDef) && menutransition.tics);
if (tatransition) if (tatransition)
{ {
@ -1089,41 +1154,37 @@ void M_DrawLevelSelect(void)
tay = t/2; tay = t/2;
} }
for (i = 0; i < M_CountLevelsToShowInList(cv_newgametype.value); i++) for (i = 0; i < M_CountLevelsToShowInList(levellist.newgametype); i++)
{ {
INT16 lvlx = t, lvly = y; INT16 lvlx = t, lvly = y;
INT16 map = start + i;
while (!M_CanShowLevelInList(map, cv_newgametype.value) && map < NUMMAPS) while (!M_CanShowLevelInList(map, levellist.newgametype) && map < NUMMAPS)
map++; map++;
if (map >= NUMMAPS) if (map >= NUMMAPS)
break; break;
if (i == levellist_scroll.cursor && tatransition) if (i == levellist.cursor && tatransition)
{ {
lvlx = 0; lvlx = 0;
lvly = max(2, y+tay); lvly = max(2, y+tay);
} }
M_DrawLevelSelectBlock(lvlx, lvly, map, M_DrawLevelSelectBlock(lvlx, lvly, map,
(i == levellist_scroll.cursor && ((skullAnimCounter / 4) & 1)), (i == levellist.cursor && (((skullAnimCounter / 4) & 1) || tatransition)),
(i != levellist_scroll.cursor) (i != levellist.cursor)
); );
y += 72; y += 72;
map++;
} }
V_DrawScaledPatch(0, tay, 0, W_CachePatchName("MENUHINT", PU_CACHE)); M_DrawCupTitle(tay, levellist.selectedcup);
if (selectedcup)
V_DrawCenteredLSTitleLowString(BASEVIDWIDTH/2, 6+tay, 0, va("%s Cup", selectedcup->name));
else
V_DrawCenteredLSTitleLowString(BASEVIDWIDTH/2, 6+tay, 0, va("%s Mode", Gametype_Names[cv_newgametype.value]));
} }
void M_DrawTimeAttack(void) void M_DrawTimeAttack(void)
{ {
INT16 map = cv_nextmap.value; INT16 map = levellist.choosemap;
INT16 t = (24*menutransition.tics); INT16 t = (24*menutransition.tics);
INT16 leftedge = 149+t+16; INT16 leftedge = 149+t+16;
INT16 rightedge = 149+t+155; INT16 rightedge = 149+t+155;
@ -1131,11 +1192,11 @@ void M_DrawTimeAttack(void)
lumpnum_t lumpnum; lumpnum_t lumpnum;
UINT8 i; UINT8 i;
M_DrawLevelSelectBlock(0, 2, map, false, false); M_DrawLevelSelectBlock(0, 2, map, true, false);
//V_DrawFill(24-t, 82, 100, 100, 36); // size test //V_DrawFill(24-t, 82, 100, 100, 36); // size test
lumpnum = W_CheckNumForName(va("%sR", G_BuildMapName(map))); lumpnum = W_CheckNumForName(va("%sR", G_BuildMapName(map+1)));
if (lumpnum != LUMPERROR) if (lumpnum != LUMPERROR)
V_DrawScaledPatch(24-t, 82, 0, W_CachePatchNum(lumpnum, PU_CACHE)); V_DrawScaledPatch(24-t, 82, 0, W_CachePatchNum(lumpnum, PU_CACHE));

View file

@ -83,7 +83,7 @@ menu_t *currentMenu = &MainDef;
char dummystaffname[22]; char dummystaffname[22];
INT16 itemOn = 0; // menu item skull is on, Hack by Tails 09-18-2002 INT16 itemOn = 0; // menu item skull is on, Hack by Tails 09-18-2002
INT16 skullAnimCounter = 10; // skull animation counter INT16 skullAnimCounter = 8; // skull animation counter
struct menutransition_s menutransition; // Menu transition properties struct menutransition_s menutransition; // Menu transition properties
// finish wipes between screens // finish wipes between screens
@ -98,10 +98,7 @@ static boolean noFurtherInput = false;
// ========================================================================== // ==========================================================================
// Consvar onchange functions // Consvar onchange functions
static void Nextmap_OnChange(void);
static void Newgametype_OnChange(void);
static void Dummymenuplayer_OnChange(void); static void Dummymenuplayer_OnChange(void);
//static void Dummymares_OnChange(void);
static void Dummystaff_OnChange(void); static void Dummystaff_OnChange(void);
consvar_t cv_showfocuslost = {"showfocuslost", "Yes", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL }; consvar_t cv_showfocuslost = {"showfocuslost", "Yes", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL };
@ -136,20 +133,8 @@ consvar_t cv_splitplayers = {"splitplayers", "One", CV_CALL, splitplayers_cons_t
//Console variables used solely in the menu system. //Console variables used solely in the menu system.
//todo: add a way to use non-console variables in the menu //todo: add a way to use non-console variables in the menu
// or make these consvars legitimate like color or skin. // or make these consvars legitimate like color or skin.
static CV_PossibleValue_t map_cons_t[] = {
{0,"MIN"},
{NUMMAPS, "MAX"},
{0, NULL}
};
consvar_t cv_nextmap = {"nextmap", "1", CV_HIDDEN|CV_CALL, map_cons_t, Nextmap_OnChange, 0, NULL, NULL, 0, 0, NULL};
static CV_PossibleValue_t skins_cons_t[MAXSKINS+1] = {{1, DEFAULTSKIN}}; static CV_PossibleValue_t skins_cons_t[MAXSKINS+1] = {{1, DEFAULTSKIN}};
consvar_t cv_chooseskin = {"chooseskin", DEFAULTSKIN, CV_HIDDEN|CV_CALL, skins_cons_t, Nextmap_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_chooseskin = {"chooseskin", DEFAULTSKIN, CV_HIDDEN, skins_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
// This gametype list is integral for many different reasons.
// When you add gametypes here, don't forget to update them in dehacked.c and doomstat.h!
CV_PossibleValue_t gametype_cons_t[NUMGAMETYPES+1];
consvar_t cv_newgametype = {"newgametype", "Race", CV_HIDDEN|CV_CALL, gametype_cons_t, Newgametype_OnChange, 0, NULL, NULL, 0, 0, NULL};
static CV_PossibleValue_t dummymenuplayer_cons_t[] = {{0, "NOPE"}, {1, "P1"}, {2, "P2"}, {3, "P3"}, {4, "P4"}, {0, NULL}}; static CV_PossibleValue_t dummymenuplayer_cons_t[] = {{0, "NOPE"}, {1, "P1"}, {2, "P2"}, {3, "P3"}, {4, "P4"}, {0, NULL}};
static consvar_t cv_dummymenuplayer = {"dummymenuplayer", "P1", CV_HIDDEN|CV_CALL, dummymenuplayer_cons_t, Dummymenuplayer_OnChange, 0, NULL, NULL, 0, 0, NULL}; static consvar_t cv_dummymenuplayer = {"dummymenuplayer", "P1", CV_HIDDEN|CV_CALL, dummymenuplayer_cons_t, Dummymenuplayer_OnChange, 0, NULL, NULL, 0, 0, NULL};
@ -172,15 +157,9 @@ static consvar_t cv_dummystaff = {"dummystaff", "0", CV_HIDDEN|CV_CALL, dummysta
// (there's only a couple anyway) // (there's only a couple anyway)
#if 0 #if 0
// Prototypes
static INT32 M_FindFirstMap(INT32 gtype);
static INT32 M_GetFirstLevelInList(void);
#endif
// Nextmap. Used for Time Attack. // Nextmap. Used for Time Attack.
static void Nextmap_OnChange(void) static void Nextmap_OnChange(void)
{ {
#if 0
char *leveltitle; char *leveltitle;
// Update the string in the consvar. // Update the string in the consvar.
@ -188,7 +167,6 @@ static void Nextmap_OnChange(void)
leveltitle = G_BuildMapTitle(cv_nextmap.value); leveltitle = G_BuildMapTitle(cv_nextmap.value);
cv_nextmap.string = cv_nextmap.zstring = leveltitle ? leveltitle : Z_StrDup(G_BuildMapName(cv_nextmap.value)); cv_nextmap.string = cv_nextmap.zstring = leveltitle ? leveltitle : Z_StrDup(G_BuildMapName(cv_nextmap.value));
if (currentMenu == &SP_TimeAttackDef) if (currentMenu == &SP_TimeAttackDef)
{ {
// see also p_setup.c's P_LoadRecordGhosts // see also p_setup.c's P_LoadRecordGhosts
@ -270,9 +248,8 @@ static void Nextmap_OnChange(void)
free(gpath); free(gpath);
} }
#endif
} }
#endif
static void Dummymenuplayer_OnChange(void) static void Dummymenuplayer_OnChange(void)
{ {
@ -284,6 +261,7 @@ static void Dummymenuplayer_OnChange(void)
static void Dummystaff_OnChange(void) static void Dummystaff_OnChange(void)
{ {
#if 0
lumpnum_t l; lumpnum_t l;
dummystaffname[0] = '\0'; dummystaffname[0] = '\0';
@ -315,40 +293,9 @@ static void Dummystaff_OnChange(void)
sprintf(temp, " - %d", cv_dummystaff.value); sprintf(temp, " - %d", cv_dummystaff.value);
} }
}
// Newgametype. Used for gametype changes.
static void Newgametype_OnChange(void)
{
#if 0
if (cv_nextmap.value && menuactive)
{
if (!mapheaderinfo[cv_nextmap.value-1])
P_AllocMapHeader((INT16)(cv_nextmap.value-1));
if ((cv_newgametype.value == GT_RACE && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_RACE))
|| (cv_newgametype.value == GT_MATCH && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_MATCH)))
{
INT32 value = 0;
switch (cv_newgametype.value)
{
default:
case GT_RACE:
value = TOL_RACE;
break;
case GT_MATCH:
value = TOL_MATCH;
break;
}
CV_SetValue(&cv_nextmap, M_FindFirstMap(value));
}
}
#endif #endif
} }
void Screenshot_option_Onchange(void) void Screenshot_option_Onchange(void)
{ {
#if 0 #if 0
@ -427,32 +374,37 @@ static void M_ChangeCvar(INT32 choice)
{ {
consvar_t *cv = (consvar_t *)currentMenu->menuitems[itemOn].itemaction; consvar_t *cv = (consvar_t *)currentMenu->menuitems[itemOn].itemaction;
// Backspace sets values to default value
if (choice == -1) if (choice == -1)
{ {
// There's a default color technically, but it's not ideal. Use your skin's prefcolor instead!
if (cv == &cv_playercolor) if (cv == &cv_playercolor)
{ {
SINT8 skinno = R_SkinAvailable(cv_chooseskin.string); SINT8 skinno = R_SkinAvailable(cv_chooseskin.string);
if (skinno != -1) if (skinno != -1)
CV_SetValue(cv,skins[skinno].prefcolor); CV_SetValue(cv, skins[skinno].prefcolor);
return; return;
} }
CV_Set(cv,cv->defaultvalue);
CV_Set(cv, cv->defaultvalue);
return; return;
} }
choice = (choice<<1) - 1; choice = (choice<<1) - 1;
if (((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_SLIDER) if (((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_SLIDER)
||((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_INVISSLIDER) || ((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_INVISSLIDER)
||((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_NOMOD)) || ((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_NOMOD))
{ {
CV_SetValue(cv,cv->value+choice); CV_SetValue(cv, cv->value+choice);
} }
else if (cv->flags & CV_FLOAT) else if (cv->flags & CV_FLOAT)
{ {
char s[20]; char s[20];
sprintf(s,"%f",FIXED_TO_FLOAT(cv->value)+(choice)*(1.0f/16.0f)); sprintf(s, "%f", FIXED_TO_FLOAT(cv->value) + (choice) * (1.0f / 16.0f));
CV_Set(cv,s); CV_Set(cv, s);
} }
else else
{ {
@ -464,7 +416,8 @@ static void M_ChangeCvar(INT32 choice)
else if (cv == &cv_maxping) else if (cv == &cv_maxping)
choice *= 50; choice *= 50;
#endif #endif
CV_AddValue(cv,choice);
CV_AddValue(cv, choice);
} }
} }
@ -579,15 +532,15 @@ boolean M_Responder(event_t *ev)
switch (ch) switch (ch)
{ {
case KEY_MOUSE1: case KEY_MOUSE1:
//case KEY_JOY1: //case KEY_JOY1:
//case KEY_JOY1 + 2: //case KEY_JOY1 + 2:
ch = KEY_ENTER; ch = KEY_ENTER;
break; break;
/*case KEY_JOY1 + 3: // Brake can function as 'n' for message boxes now. /*case KEY_JOY1 + 3: // Brake can function as 'n' for message boxes now.
ch = 'n'; ch = 'n';
break;*/ break;*/
case KEY_MOUSE1 + 1: case KEY_MOUSE1 + 1:
//case KEY_JOY1 + 1: //case KEY_JOY1 + 1:
ch = KEY_BACKSPACE; ch = KEY_BACKSPACE;
break; break;
case KEY_HAT1: case KEY_HAT1:
@ -744,8 +697,8 @@ boolean M_Responder(event_t *ev)
M_QuitSRB2(0); M_QuitSRB2(0);
return true; return true;
case KEY_F11: // Gamma Level case KEY_F11: // Empty (used to be Gamma)
CV_AddValue(&cv_usegamma, 1); //CV_AddValue(&cv_usegamma, 1);
return true; return true;
// Spymode on F12 handled in game logic // Spymode on F12 handled in game logic
@ -948,8 +901,8 @@ boolean M_Responder(event_t *ev)
if (cv == &cv_chooseskin if (cv == &cv_chooseskin
|| cv == &cv_dummystaff || cv == &cv_dummystaff
|| cv == &cv_nextmap /*|| cv == &cv_nextmap
|| cv == &cv_newgametype) || cv == &cv_newgametype*/)
return true; return true;
#if 0 #if 0
@ -1344,8 +1297,6 @@ void M_Init(void)
{ {
//COM_AddCommand("manual", Command_Manual_f); //COM_AddCommand("manual", Command_Manual_f);
CV_RegisterVar(&cv_nextmap);
CV_RegisterVar(&cv_newgametype);
CV_RegisterVar(&cv_chooseskin); CV_RegisterVar(&cv_chooseskin);
CV_RegisterVar(&cv_autorecord); CV_RegisterVar(&cv_autorecord);
@ -2023,7 +1974,7 @@ boolean M_CharacterSelectQuit(void)
// Determines whether to show a given map in the various level-select lists. // Determines whether to show a given map in the various level-select lists.
// Set gt = -1 to ignore gametype. // Set gt = -1 to ignore gametype.
// //
boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt) boolean M_CanShowLevelInList(INT16 mapnum, UINT8 gt)
{ {
// Does the map exist? // Does the map exist?
if (!mapheaderinfo[mapnum]) if (!mapheaderinfo[mapnum])
@ -2037,7 +1988,7 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt)
return false; // not unlocked return false; // not unlocked
// Should the map be hidden? // Should the map be hidden?
if (mapheaderinfo[mapnum]->menuflags & LF2_HIDEINMENU && mapnum+1 != gamemap) if (mapheaderinfo[mapnum]->menuflags & LF2_HIDEINMENU /*&& mapnum+1 != gamemap*/)
return false; return false;
if (gt == GT_MATCH && (mapheaderinfo[mapnum]->typeoflevel & TOL_MATCH)) if (gt == GT_MATCH && (mapheaderinfo[mapnum]->typeoflevel & TOL_MATCH))
@ -2045,17 +1996,17 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt)
if (gt == GT_RACE && (mapheaderinfo[mapnum]->typeoflevel & TOL_RACE)) if (gt == GT_RACE && (mapheaderinfo[mapnum]->typeoflevel & TOL_RACE))
{ {
if (selectedcup && selectedcup->numlevels) if (levellist.selectedcup && levellist.selectedcup->numlevels)
{ {
UINT8 i; UINT8 i;
for (i = 0; i < selectedcup->numlevels; i++) for (i = 0; i < levellist.selectedcup->numlevels; i++)
{ {
if (mapnum == selectedcup->levellist[i]) if (mapnum == levellist.selectedcup->levellist[i])
break; break;
} }
if (i == selectedcup->numlevels) if (i == levellist.selectedcup->numlevels)
return false; return false;
} }
@ -2066,9 +2017,9 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt)
return false; return false;
} }
INT32 M_CountLevelsToShowInList(INT32 gt) INT16 M_CountLevelsToShowInList(UINT8 gt)
{ {
INT32 mapnum, count = 0; INT16 mapnum, count = 0;
for (mapnum = 0; mapnum < NUMMAPS; mapnum++) for (mapnum = 0; mapnum < NUMMAPS; mapnum++)
if (M_CanShowLevelInList(mapnum, gt)) if (M_CanShowLevelInList(mapnum, gt))
@ -2077,32 +2028,31 @@ INT32 M_CountLevelsToShowInList(INT32 gt)
return count; return count;
} }
INT32 M_GetFirstLevelInList(INT32 gt) INT16 M_GetFirstLevelInList(UINT8 gt)
{ {
INT32 mapnum; INT16 mapnum;
for (mapnum = 0; mapnum < NUMMAPS; mapnum++) for (mapnum = 0; mapnum < NUMMAPS; mapnum++)
if (M_CanShowLevelInList(mapnum, gt)) if (M_CanShowLevelInList(mapnum, gt))
return mapnum + 1; return mapnum;
return 1; return 0;
} }
cupheader_t *selectedcup = NULL; struct cupgrid_s cupgrid;
struct levellist_cupgrid_s levellist_cupgrid; struct levellist_s levellist;
struct levellist_scroll_s levellist_scroll;
static void M_LevelSelectScrollDest(void) static void M_LevelSelectScrollDest(void)
{ {
UINT16 m = M_CountLevelsToShowInList(cv_newgametype.value)-1; UINT16 m = M_CountLevelsToShowInList(levellist.newgametype)-1;
levellist_scroll.dest = (6*levellist_scroll.cursor); levellist.dest = (6*levellist.cursor);
if (levellist_scroll.dest < 3) if (levellist.dest < 3)
levellist_scroll.dest = 3; levellist.dest = 3;
if (levellist_scroll.dest > (6*m)-3) if (levellist.dest > (6*m)-3)
levellist_scroll.dest = (6*m)-3; levellist.dest = (6*m)-3;
} }
void M_LevelSelectInit(INT32 choice) void M_LevelSelectInit(INT32 choice)
@ -2112,36 +2062,64 @@ void M_LevelSelectInit(INT32 choice)
switch (currentMenu->menuitems[itemOn].mvar1) switch (currentMenu->menuitems[itemOn].mvar1)
{ {
case 0: case 0:
levellist_cupgrid.grandprix = false; cupgrid.grandprix = false;
levellist_scroll.timeattack = false; levellist.timeattack = false;
break; break;
case 1: case 1:
levellist_cupgrid.grandprix = false; cupgrid.grandprix = false;
levellist_scroll.timeattack = true; levellist.timeattack = true;
break;
case 2:
levellist_cupgrid.grandprix = true;
levellist_scroll.timeattack = false;
break; break;
/*case 2:
cupgrid.grandprix = true;
levellist.timeattack = false;
break;*/
default: default:
CONS_Alert(CONS_WARNING, "Bad level select init\n"); CONS_Alert(CONS_WARNING, "Bad level select init\n");
return; return;
} }
CV_StealthSetValue(&cv_newgametype, currentMenu->menuitems[itemOn].mvar2); levellist.newgametype = currentMenu->menuitems[itemOn].mvar2;
PLAY_CupSelectDef.prevMenu = currentMenu; PLAY_CupSelectDef.prevMenu = currentMenu;
if (cv_newgametype.value == GT_RACE) // Obviously go to Cup Select in gametypes that have cups.
// Use a really long level select in gametypes that don't use cups.
if (levellist.newgametype == GT_RACE)
{ {
cupheader_t *cup = kartcupheaders;
UINT8 highestid = 0;
// Make sure there's valid cups before going to this menu.
if (cup == NULL)
I_Error("Can you really call this a racing game, I didn't recieve any Cups on my pillow or anything");
while (cup)
{
if (cup->unlockrequired == -1 || unlockables[cup->unlockrequired].unlocked)
highestid = cup->id;
cup = cup->next;
}
cupgrid.numpages = (highestid / (CUPMENU_COLUMNS * CUPMENU_ROWS)) + 1;
PLAY_LevelSelectDef.prevMenu = &PLAY_CupSelectDef; PLAY_LevelSelectDef.prevMenu = &PLAY_CupSelectDef;
M_SetupNextMenu(&PLAY_CupSelectDef, false); M_SetupNextMenu(&PLAY_CupSelectDef, false);
return;
} }
else
// Reset position properly if you go back & forth between gametypes
if (levellist.selectedcup)
{ {
selectedcup = NULL; levellist.cursor = 0;
PLAY_LevelSelectDef.prevMenu = currentMenu; levellist.selectedcup = NULL;
M_SetupNextMenu(&PLAY_LevelSelectDef, false);
} }
M_LevelSelectScrollDest();
levellist.y = levellist.dest;
PLAY_LevelSelectDef.prevMenu = currentMenu;
M_SetupNextMenu(&PLAY_LevelSelectDef, false);
} }
void M_CupSelectHandler(INT32 choice) void M_CupSelectHandler(INT32 choice)
@ -2150,7 +2128,7 @@ void M_CupSelectHandler(INT32 choice)
while (newcup) while (newcup)
{ {
if (newcup->id == CUPID) if (newcup->id == CUPMENU_CURSORID)
break; break;
newcup = newcup->next; newcup = newcup->next;
} }
@ -2158,53 +2136,55 @@ void M_CupSelectHandler(INT32 choice)
switch (choice) switch (choice)
{ {
case KEY_RIGHTARROW: case KEY_RIGHTARROW:
levellist_cupgrid.x++; cupgrid.x++;
if (levellist_cupgrid.x >= CUPS_COLUMNS) if (cupgrid.x >= CUPMENU_COLUMNS)
{ {
levellist_cupgrid.x = 0; cupgrid.x = 0;
//levellist_cupgrid.pageno++; cupgrid.pageno++;
if (cupgrid.pageno >= cupgrid.numpages)
cupgrid.pageno = 0;
} }
S_StartSound(NULL, sfx_s3k5b); S_StartSound(NULL, sfx_s3k5b);
break; break;
case KEY_LEFTARROW: case KEY_LEFTARROW:
levellist_cupgrid.x--; cupgrid.x--;
if (levellist_cupgrid.x < 0) if (cupgrid.x < 0)
{ {
levellist_cupgrid.x = CUPS_COLUMNS-1; cupgrid.x = CUPMENU_COLUMNS-1;
//levellist_cupgrid.pageno--; cupgrid.pageno--;
if (cupgrid.pageno < 0)
cupgrid.pageno = cupgrid.numpages-1;
} }
S_StartSound(NULL, sfx_s3k5b); S_StartSound(NULL, sfx_s3k5b);
break; break;
case KEY_UPARROW: case KEY_UPARROW:
levellist_cupgrid.y++; cupgrid.y++;
if (levellist_cupgrid.y >= CUPS_ROWS) if (cupgrid.y >= CUPMENU_ROWS)
{ cupgrid.y = 0;
levellist_cupgrid.y = 0;
//levellist_cupgrid.pageno++;
}
S_StartSound(NULL, sfx_s3k5b); S_StartSound(NULL, sfx_s3k5b);
break; break;
case KEY_DOWNARROW: case KEY_DOWNARROW:
levellist_cupgrid.y--; cupgrid.y--;
if (levellist_cupgrid.y < 0) if (cupgrid.y < 0)
{ cupgrid.y = CUPMENU_ROWS-1;
levellist_cupgrid.y = CUPS_ROWS-1;
//levellist_cupgrid.pageno--;
}
S_StartSound(NULL, sfx_s3k5b); S_StartSound(NULL, sfx_s3k5b);
break; break;
case KEY_ENTER: case KEY_ENTER:
if (!newcup) if ((!newcup) || (newcup && newcup->unlockrequired != -1 && !unlockables[newcup->unlockrequired].unlocked))
break;
if (!selectedcup || newcup->id != selectedcup->id) // Keep cursor position if you select the same cup again
{ {
levellist_scroll.cursor = 0; S_StartSound(NULL, sfx_s3kb2);
selectedcup = newcup; break;
}
// Keep cursor position if you select the same cup again, reset if it's a different cup
if (!levellist.selectedcup || newcup->id != levellist.selectedcup->id)
{
levellist.cursor = 0;
levellist.selectedcup = newcup;
} }
M_LevelSelectScrollDest(); M_LevelSelectScrollDest();
levellist_scroll.y = levellist_scroll.dest; levellist.y = levellist.dest;
M_SetupNextMenu(&PLAY_LevelSelectDef, false); M_SetupNextMenu(&PLAY_LevelSelectDef, false);
S_StartSound(NULL, sfx_s3k63); S_StartSound(NULL, sfx_s3k63);
@ -2222,87 +2202,109 @@ void M_CupSelectHandler(INT32 choice)
void M_CupSelectTick(void) void M_CupSelectTick(void)
{ {
levellist_cupgrid.previewanim++; cupgrid.previewanim++;
} }
void M_LevelSelectHandler(INT32 choice) void M_LevelSelectHandler(INT32 choice)
{ {
INT16 start = M_GetFirstLevelInList(cv_newgametype.value)-1; INT16 start = M_GetFirstLevelInList(levellist.newgametype);
INT16 maxlevels = M_CountLevelsToShowInList(cv_newgametype.value); INT16 maxlevels = M_CountLevelsToShowInList(levellist.newgametype);
INT16 map = start;
if (levellist_scroll.y != levellist_scroll.dest) if (levellist.y != levellist.dest)
return; return;
switch (choice) switch (choice)
{ {
case KEY_UPARROW: case KEY_UPARROW:
levellist_scroll.cursor--; levellist.cursor--;
if (levellist_scroll.cursor < 0) if (levellist.cursor < 0)
levellist_scroll.cursor = maxlevels-1; levellist.cursor = maxlevels-1;
S_StartSound(NULL, sfx_s3k5b); S_StartSound(NULL, sfx_s3k5b);
break; break;
case KEY_DOWNARROW: case KEY_DOWNARROW:
levellist_scroll.cursor++; levellist.cursor++;
if (levellist_scroll.cursor >= maxlevels) if (levellist.cursor >= maxlevels)
levellist_scroll.cursor = 0; levellist.cursor = 0;
S_StartSound(NULL, sfx_s3k5b); S_StartSound(NULL, sfx_s3k5b);
break; break;
case KEY_ENTER: case KEY_ENTER:
map = start + levellist_scroll.cursor;
while (!M_CanShowLevelInList(map, cv_newgametype.value) && map < NUMMAPS)
map++;
if (map >= NUMMAPS)
break;
CV_SetValue(&cv_nextmap, map);
if (levellist_scroll.timeattack)
M_SetupNextMenu(&PLAY_TimeAttackDef, false);
else
{ {
UINT8 ssplayers = cv_splitplayers.value-1; INT16 map = start;
INT16 add = levellist.cursor;
netgame = false; while (add > 0)
multiplayer = true;
strncpy(connectedservername, cv_servername.string, MAXSERVERNAME);
// Still need to reset devmode
cv_debug = 0;
if (strlen(cv_dummyjoinpassword.string) > 0)
D_SetJoinPassword(cv_dummyjoinpassword.string);
else
joinpasswordset = false;
if (demo.playback)
G_StopDemo();
if (metalrecording)
G_StopMetalDemo();
if (!cv_nextmap.value)
CV_SetValue(&cv_nextmap, G_RandMap(G_TOLFlag(cv_newgametype.value), -1, false, 0, false, NULL)+1);
if (cv_maxplayers.value < ssplayers+1)
CV_SetValue(&cv_maxplayers, ssplayers+1);
if (splitscreen != ssplayers)
{ {
splitscreen = ssplayers; map++;
SplitScreen_OnChange();
while (!M_CanShowLevelInList(map, levellist.newgametype) && map < NUMMAPS)
map++;
if (map >= NUMMAPS)
break;
add--;
} }
paused = false; if (map >= NUMMAPS)
SV_StartSinglePlayerServer(); break;
multiplayer = true; // yeah, SV_StartSinglePlayerServer clobbers this...
D_MapChange(cv_nextmap.value, cv_newgametype.value, (cv_kartencore.value == 1), 1, 1, false, false);
M_ClearMenus(true); levellist.choosemap = map;
if (levellist.timeattack)
{
M_SetupNextMenu(&PLAY_TimeAttackDef, false);
S_StartSound(NULL, sfx_s3k63);
}
else
{
UINT8 ssplayers = cv_splitplayers.value-1;
netgame = false;
multiplayer = true;
strncpy(connectedservername, cv_servername.string, MAXSERVERNAME);
// Still need to reset devmode
cv_debug = 0;
if (strlen(cv_dummyjoinpassword.string) > 0)
D_SetJoinPassword(cv_dummyjoinpassword.string);
else
joinpasswordset = false;
if (demo.playback)
G_StopDemo();
if (metalrecording)
G_StopMetalDemo();
/*if (levellist.choosemap == 0)
levellist.choosemap = G_RandMap(G_TOLFlag(levellist.newgametype), -1, false, 0, false, NULL);*/
if (cv_maxplayers.value < ssplayers+1)
CV_SetValue(&cv_maxplayers, ssplayers+1);
if (splitscreen != ssplayers)
{
splitscreen = ssplayers;
SplitScreen_OnChange();
}
S_StartSound(NULL, sfx_s3k63);
// Early fadeout to let the sound finish playing
F_WipeStartScreen();
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31);
F_WipeEndScreen();
F_RunWipe(wipedefs[wipe_level_toblack], false, "FADEMAP0", false, false);
paused = false;
SV_StartSinglePlayerServer();
multiplayer = true; // yeah, SV_StartSinglePlayerServer clobbers this...
D_MapChange(levellist.choosemap+1, levellist.newgametype, (cv_kartencore.value == 1), 1, 1, false, false);
M_ClearMenus(true);
}
} }
S_StartSound(NULL, sfx_s3k63);
break; break;
case KEY_ESCAPE: case KEY_ESCAPE:
if (currentMenu->prevMenu) if (currentMenu->prevMenu)
@ -2319,10 +2321,20 @@ void M_LevelSelectHandler(INT32 choice)
void M_LevelSelectTick(void) void M_LevelSelectTick(void)
{ {
if (levellist_scroll.y > levellist_scroll.dest) UINT8 times = 1 + (abs(levellist.dest - levellist.y) / 21);
levellist_scroll.y--;
else if (levellist_scroll.y < levellist_scroll.dest) while (times) // increase speed as you're farther away
levellist_scroll.y++; {
if (levellist.y > levellist.dest)
levellist.y--;
else if (levellist.y < levellist.dest)
levellist.y++;
if (levellist.y == levellist.dest)
break;
times--;
}
} }
// ===================== // =====================

View file

@ -69,7 +69,7 @@ static UINT8 cheatf_warp(void)
if (menuactive && currentMenu != &MainDef) if (menuactive && currentMenu != &MainDef)
return 0; // Only on the main menu! return 0; // Only on the main menu!
// Temporarily unlock EVERYTHING. // Unlock EVERYTHING.
for (i = 0; i < MAXUNLOCKABLES; i++) for (i = 0; i < MAXUNLOCKABLES; i++)
{ {
if (!unlockables[i].conditionset) if (!unlockables[i].conditionset)
@ -120,30 +120,13 @@ static UINT8 cheatf_devmode(void)
} }
#endif #endif
/*static cheatseq_t cheat_ultimate = {
0, cheatf_ultimate,
{ SCRAMBLE('u'), SCRAMBLE('l'), SCRAMBLE('t'), SCRAMBLE('i'), SCRAMBLE('m'), SCRAMBLE('a'), SCRAMBLE('t'), SCRAMBLE('e'), 0xff }
};*/
/*static cheatseq_t cheat_ultimate_joy = {
0, cheatf_ultimate,
{ SCRAMBLE(KEY_UPARROW), SCRAMBLE(KEY_UPARROW), SCRAMBLE(KEY_DOWNARROW), SCRAMBLE(KEY_DOWNARROW),
SCRAMBLE(KEY_LEFTARROW), SCRAMBLE(KEY_RIGHTARROW), SCRAMBLE(KEY_LEFTARROW), SCRAMBLE(KEY_RIGHTARROW),
SCRAMBLE(KEY_ENTER), 0xff }
};*/
static cheatseq_t cheat_warp = { static cheatseq_t cheat_warp = {
0, cheatf_warp, 0, cheatf_warp,
//{ SCRAMBLE('r'), SCRAMBLE('e'), SCRAMBLE('d'), SCRAMBLE('x'), SCRAMBLE('v'), SCRAMBLE('i'), 0xff }
{ SCRAMBLE('b'), SCRAMBLE('a'), SCRAMBLE('n'), SCRAMBLE('a'), SCRAMBLE('n'), SCRAMBLE('a'), 0xff } { SCRAMBLE('b'), SCRAMBLE('a'), SCRAMBLE('n'), SCRAMBLE('a'), SCRAMBLE('n'), SCRAMBLE('a'), 0xff }
}; };
static cheatseq_t cheat_warp_joy = { static cheatseq_t cheat_warp_joy = {
0, cheatf_warp, 0, cheatf_warp,
/*{ SCRAMBLE(KEY_LEFTARROW), SCRAMBLE(KEY_LEFTARROW), SCRAMBLE(KEY_UPARROW),
SCRAMBLE(KEY_RIGHTARROW), SCRAMBLE(KEY_RIGHTARROW), SCRAMBLE(KEY_UPARROW),
SCRAMBLE(KEY_LEFTARROW), SCRAMBLE(KEY_UPARROW),
SCRAMBLE(KEY_ENTER), 0xff }*/
{ SCRAMBLE(KEY_LEFTARROW), SCRAMBLE(KEY_UPARROW), SCRAMBLE(KEY_RIGHTARROW), { SCRAMBLE(KEY_LEFTARROW), SCRAMBLE(KEY_UPARROW), SCRAMBLE(KEY_RIGHTARROW),
SCRAMBLE(KEY_RIGHTARROW), SCRAMBLE(KEY_UPARROW), SCRAMBLE(KEY_LEFTARROW), SCRAMBLE(KEY_RIGHTARROW), SCRAMBLE(KEY_UPARROW), SCRAMBLE(KEY_LEFTARROW),
SCRAMBLE(KEY_DOWNARROW), SCRAMBLE(KEY_RIGHTARROW), SCRAMBLE(KEY_DOWNARROW), SCRAMBLE(KEY_RIGHTARROW),
@ -239,8 +222,6 @@ boolean cht_Responder(event_t *ev)
else else
ch = (UINT8)ev->data1; ch = (UINT8)ev->data1;
//ret += cht_CheckCheat(&cheat_ultimate, (char)ch);
//ret += cht_CheckCheat(&cheat_ultimate_joy, (char)ch);
ret += cht_CheckCheat(&cheat_warp, (char)ch); ret += cht_CheckCheat(&cheat_warp, (char)ch);
ret += cht_CheckCheat(&cheat_warp_joy, (char)ch); ret += cht_CheckCheat(&cheat_warp_joy, (char)ch);
#ifdef DEVELOP #ifdef DEVELOP

View file

@ -803,7 +803,7 @@ static void ST_drawLevelTitle(void)
if (subttl[0]) if (subttl[0])
V_DrawRightAlignedString(sub + zonexpos - 8, bary+1, V_ALLOWLOWERCASE, subttl); V_DrawRightAlignedString(sub + zonexpos - 8, bary+1, V_ALLOWLOWERCASE, subttl);
//else //else
//V_DrawRightAlignedString(sub + zonexpos - 8, bary+1, V_ALLOWLOWERCASE, va("%s Mode", gametype_cons_t[gametype].strvalue)); //V_DrawRightAlignedString(sub + zonexpos - 8, bary+1, V_ALLOWLOWERCASE, va("%s Mode", Gametype_Names[gametype]));
} }
ttlnumxpos += sub; ttlnumxpos += sub;

View file

@ -347,10 +347,11 @@ void Y_IntermissionDrawer(void)
#endif #endif
else else
{ {
if (widebgpatch && rendermode == render_soft && vid.width / vid.dupx == 400) V_DrawFixedPatch(0, 0, FRACUNIT, 0, bgpatch, NULL);
V_DrawScaledPatch(0, 0, V_SNAPTOLEFT, widebgpatch);
else // draw non-green resolution border
V_DrawScaledPatch(0, 0, 0, bgpatch); if (widebgpatch && ((vid.width % BASEVIDWIDTH != 0) || (vid.height % BASEVIDHEIGHT != 0)))
V_DrawFixedPatch(0, 0, FRACUNIT, 0, widebgpatch, NULL);
} }
} }
else else
@ -775,8 +776,8 @@ static void Y_UpdateRecordReplays(void)
G_SaveGameData(false); G_SaveGameData(false);
// Update timeattack menu's replay availability. // Update timeattack menu's replay availability.
CV_AddValue(&cv_nextmap, 1); //CV_AddValue(&cv_nextmap, 1);
CV_AddValue(&cv_nextmap, -1); //CV_AddValue(&cv_nextmap, -1);
} }
// //
@ -869,12 +870,11 @@ void Y_StartIntermission(void)
break; break;
} }
//if (intertype == int_race || intertype == int_match)
{ bgpatch = W_CachePatchName("MENUBG", PU_STATIC);
//bgtile = W_CachePatchName("SRB2BACK", PU_STATIC); widebgpatch = W_CachePatchName("WEIRDRES", PU_STATIC);
usetile = useinterpic = false;
usebuffer = true; useinterpic = usetile = usebuffer = false;
}
} }
// ====== // ======
@ -1519,7 +1519,7 @@ void Y_StartVote(void)
// set up the gtc and gts // set up the gtc and gts
levelinfo[i].gtc = G_GetGametypeColor(votelevels[i][1]); levelinfo[i].gtc = G_GetGametypeColor(votelevels[i][1]);
if (i == 2 && votelevels[i][1] != votelevels[0][1]) if (i == 2 && votelevels[i][1] != votelevels[0][1])
levelinfo[i].gts = gametype_cons_t[votelevels[i][1]].strvalue; levelinfo[i].gts = Gametype_Names[votelevels[i][1]];
else else
levelinfo[i].gts = NULL; levelinfo[i].gts = NULL;

View file

@ -9,8 +9,6 @@
/// \file y_inter.h /// \file y_inter.h
/// \brief Tally screens, or "Intermissions" as they were formally called in Doom /// \brief Tally screens, or "Intermissions" as they were formally called in Doom
extern boolean usebuffer;
void Y_IntermissionDrawer(void); void Y_IntermissionDrawer(void);
void Y_Ticker(void); void Y_Ticker(void);
void Y_StartIntermission(void); void Y_StartIntermission(void);