* Improved layout of addons menu.
* Disabled input for 5 tics after a console-touching enter key command on the menu, so that weird stuff doesn't happen.
* Added Add-on options.
* cv_addons_option - chooses save location. A little smaller in scope than the weird Default/HOME/SRB2/Custom thing for screenshots - now it's SRB2 Folder and Custom.
* cv_addons_folder - goes with Custom for above.
* cv_addons_md5 - chooses whether to identify files on the addons menu with name comparison only, or with checksum comparison as well (more intensive hence not default).
* cv_addons_showall - chooses whether to show just supported file extensions, or all
* Some minor other refactors.

Bad:
* Screenshot options menu crashes on access for some reason (to do with itemOn not being valid?????) looking into
This commit is contained in:
toasterbabe 2017-04-29 16:40:07 +01:00
parent f3b054fc8f
commit 4e0d015803
6 changed files with 131 additions and 50 deletions

View File

@ -37,6 +37,7 @@
#include "d_main.h" #include "d_main.h"
#include "m_random.h" #include "m_random.h"
#include "f_finale.h" #include "f_finale.h"
#include "filesrch.h"
#include "mserv.h" #include "mserv.h"
#include "md5.h" #include "md5.h"
#include "z_zone.h" #include "z_zone.h"
@ -714,6 +715,12 @@ void D_RegisterClientCommands(void)
CV_RegisterVar(&cv_firenaxis); CV_RegisterVar(&cv_firenaxis);
CV_RegisterVar(&cv_firenaxis2); CV_RegisterVar(&cv_firenaxis2);
// filesrch.c
CV_RegisterVar(&cv_addons_option);
CV_RegisterVar(&cv_addons_folder);
CV_RegisterVar(&cv_addons_md5);
CV_RegisterVar(&cv_addons_showall);
// WARNING: the order is important when initialising mouse2 // WARNING: the order is important when initialising mouse2
// we need the mouse2port // we need the mouse2port
CV_RegisterVar(&cv_mouse2port); CV_RegisterVar(&cv_mouse2port);

View File

@ -32,7 +32,7 @@
#include "d_netfil.h" #include "d_netfil.h"
#include "m_misc.h" #include "m_misc.h"
#include "z_zone.h" #include "z_zone.h"
#include "doomtype.h" #include "m_menu.h" // Addons_option_Onchange
#if (defined (_WIN32) && !defined (_WIN32_WCE)) && defined (_MSC_VER) && !defined (_XBOX) #if (defined (_WIN32) && !defined (_WIN32_WCE)) && defined (_MSC_VER) && !defined (_XBOX)
@ -310,6 +310,15 @@ closedir (DIR * dirp)
} }
#endif #endif
static CV_PossibleValue_t addons_cons_t[] = {{0, "SRB2 Folder"}, /*{1, "HOME"}, {2, "SRB2 Folder"},*/ {3, "CUSTOM"}, {0, NULL}};
consvar_t cv_addons_option = {"addons_option", "SRB2 Folder", CV_SAVE|CV_CALL, addons_cons_t, Addons_option_Onchange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_addons_folder = {"addons_folder", "./", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
static CV_PossibleValue_t addons_md5_cons_t[] = {{0, "Name"}, {1, "Checksum"}, {0, NULL}};
consvar_t cv_addons_md5 = {"addons_md5", "Name", CV_SAVE, addons_md5_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_addons_showall = {"addons_showall", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
char menupath[1024]; char menupath[1024];
size_t menupathindex[menudepth]; size_t menupathindex[menudepth];
size_t menudepthleft = menudepth; size_t menudepthleft = menudepth;
@ -590,11 +599,14 @@ boolean preparefilemenu(boolean samedepth)
{ {
if (!S_ISDIR(fsstat.st_mode)) // file if (!S_ISDIR(fsstat.st_mode)) // file
{ {
size_t len = strlen(dent->d_name)+1; if (!cv_addons_showall.value)
UINT8 ext; {
for (ext = 0; ext < NUM_EXT_TABLE; ext++) size_t len = strlen(dent->d_name)+1;
if (!strcasecmp(exttable[ext], dent->d_name+len-5)) break; UINT8 ext;
if (ext == NUM_EXT_TABLE) continue; // not an addfile-able (or exec-able) file for (ext = 0; ext < NUM_EXT_TABLE; ext++)
if (!strcasecmp(exttable[ext], dent->d_name+len-5)) break;
if (ext == NUM_EXT_TABLE) continue; // not an addfile-able (or exec-able) file
}
searchdir; searchdir;
} }
else // directory else // directory
@ -660,7 +672,7 @@ boolean preparefilemenu(boolean samedepth)
if (!((numfolders+pos) < sizedirmenu)) continue; // crash prevention if (!((numfolders+pos) < sizedirmenu)) continue; // crash prevention
for (; ext < NUM_EXT_TABLE; ext++) for (; ext < NUM_EXT_TABLE; ext++)
if (!strcasecmp(exttable[ext], dent->d_name+len-5)) break; if (!strcasecmp(exttable[ext], dent->d_name+len-5)) break;
if (ext == NUM_EXT_TABLE) continue; // not an addfile-able (or exec-able) file if (ext == NUM_EXT_TABLE && !cv_addons_showall.value) continue; // not an addfile-able (or exec-able) file
ext += EXT_START; // moving to be appropriate position ext += EXT_START; // moving to be appropriate position
searchdir; searchdir;
@ -676,10 +688,13 @@ boolean preparefilemenu(boolean samedepth)
filenamebuf[i][MAX_WADPATH - 1] = '\0'; filenamebuf[i][MAX_WADPATH - 1] = '\0';
nameonly(filenamebuf[i]); nameonly(filenamebuf[i]);
} }
if (strcmp(dent->d_name, filenamebuf[i])) if (strcmp(dent->d_name, filenamebuf[i]))
continue; continue;
if (checkfilemd5(menupath, wadfiles[i]->md5sum)) if (cv_addons_md5.value && !checkfilemd5(menupath, wadfiles[i]->md5sum))
ext |= EXT_LOADED; continue;
ext |= EXT_LOADED;
} }
} }

View File

@ -8,6 +8,8 @@
#include "d_netfil.h" #include "d_netfil.h"
#include "m_menu.h" // MAXSTRINGLENGTH #include "m_menu.h" // MAXSTRINGLENGTH
extern consvar_t cv_addons_option, cv_addons_folder, cv_addons_md5, cv_addons_showall;
/** \brief The filesearch function /** \brief The filesearch function
This function search files, manly WADs and return back the status of the file This function search files, manly WADs and return back the status of the file

View File

@ -213,14 +213,13 @@ menu_t SPauseDef;
// Level Select // Level Select
static levelselect_t levelselect = {0, NULL}; static levelselect_t levelselect = {0, NULL};
static UINT8 levelselectselect[4]; static UINT8 levelselectselect[3];
static patch_t *levselp[2][3]; static patch_t *levselp[2][3];
static INT32 lsoffs[2]; static INT32 lsoffs[2];
#define lsrow levelselectselect[0] #define lsrow levelselectselect[0]
#define lscol levelselectselect[1] #define lscol levelselectselect[1]
#define lstic levelselectselect[2] #define lshli levelselectselect[2]
#define lshli levelselectselect[3]
#define lshseperation 101 #define lshseperation 101
#define lsbasevseperation 62 #define lsbasevseperation 62
@ -337,7 +336,9 @@ static void M_ScreenshotOptions(INT32 choice);
static void M_EraseData(INT32 choice); static void M_EraseData(INT32 choice);
static void M_Addons(INT32 choice); static void M_Addons(INT32 choice);
static patch_t *addonsp[NUM_EXT+4]; static void M_AddonsOptions(INT32 choice);
static patch_t *addonsp[NUM_EXT+5];
static UINT8 addonsresponselimit = 0;
#define numaddonsshown 4 #define numaddonsshown 4
@ -1336,9 +1337,11 @@ static menuitem_t OP_SoundOptionsMenu[] =
static menuitem_t OP_DataOptionsMenu[] = static menuitem_t OP_DataOptionsMenu[] =
{ {
{IT_STRING | IT_CALL, NULL, "Screenshot Options...", M_ScreenshotOptions, 10}, {IT_STRING | IT_CALL, NULL, "Add-on Options...", M_AddonsOptions, 10},
{IT_STRING | IT_SUBMENU, NULL, "\x85" "Erase Data...", &OP_EraseDataDef, 20}, {IT_STRING | IT_CALL, NULL, "Screenshot Options...", M_ScreenshotOptions, 30},
{IT_STRING | IT_SUBMENU, NULL, "\x85" "Erase Data...", &OP_EraseDataDef, 50},
}; };
static menuitem_t OP_ScreenshotOptionsMenu[] = static menuitem_t OP_ScreenshotOptionsMenu[] =
@ -1385,6 +1388,20 @@ static menuitem_t OP_EraseDataMenu[] =
{IT_STRING | IT_CALL, NULL, "\x85" "Erase ALL Data", M_EraseData, 40}, {IT_STRING | IT_CALL, NULL, "\x85" "Erase ALL Data", M_EraseData, 40},
}; };
static menuitem_t OP_AddonsOptionsMenu[] =
{
{IT_HEADER, NULL, "Menu", NULL, 0},
{IT_STRING|IT_CVAR, NULL, "Location", &cv_addons_option, 6},
{IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Custom Folder", &cv_addons_folder, 11},
{IT_STRING|IT_CVAR, NULL, "Identify loaded files via", &cv_addons_md5, 25},
{IT_STRING|IT_CVAR, NULL, "Show unsupported file types", &cv_addons_showall, 30},
};
enum
{
op_addons_folder = 2,
};
static menuitem_t OP_ServerOptionsMenu[] = static menuitem_t OP_ServerOptionsMenu[] =
{ {
{IT_HEADER, NULL, "General", NULL, 0}, {IT_HEADER, NULL, "General", NULL, 0},
@ -1834,17 +1851,7 @@ menu_t OP_SoundOptionsDef =
NULL NULL
}; };
menu_t OP_ServerOptionsDef = menu_t OP_ServerOptionsDef = DEFAULTSCROLLMENUSTYLE("M_SERVER", OP_ServerOptionsMenu, &OP_MainDef, 30, 30);
{
"M_SERVER",
sizeof (OP_ServerOptionsMenu)/sizeof (menuitem_t),
&OP_MainDef,
OP_ServerOptionsMenu,
M_DrawGenericScrollMenu,
30, 30,
0,
NULL
};
menu_t OP_MonitorToggleDef = menu_t OP_MonitorToggleDef =
{ {
@ -1886,7 +1893,7 @@ menu_t OP_OpenGLColorDef =
NULL NULL
}; };
#endif #endif
menu_t OP_DataOptionsDef = DEFAULTMENUSTYLE("M_DATA", OP_DataOptionsMenu, &OP_MainDef, 30, 30); menu_t OP_DataOptionsDef = DEFAULTMENUSTYLE("M_DATA", OP_DataOptionsMenu, &OP_MainDef, 60, 30);
menu_t OP_ScreenshotOptionsDef = menu_t OP_ScreenshotOptionsDef =
{ {
@ -1900,6 +1907,8 @@ menu_t OP_ScreenshotOptionsDef =
NULL NULL
}; };
menu_t OP_AddonsOptionsDef = DEFAULTSCROLLMENUSTYLE("M_ADDONS", OP_AddonsOptionsMenu, &OP_DataOptionsDef, 30, 30);
menu_t OP_EraseDataDef = DEFAULTMENUSTYLE("M_DATA", OP_EraseDataMenu, &OP_DataOptionsDef, 60, 30); menu_t OP_EraseDataDef = DEFAULTMENUSTYLE("M_DATA", OP_EraseDataMenu, &OP_DataOptionsDef, 60, 30);
// ========================================================================== // ==========================================================================
@ -2118,6 +2127,12 @@ void Moviemode_mode_Onchange(void)
OP_ScreenshotOptionsMenu[i].status = IT_STRING|IT_CVAR; OP_ScreenshotOptionsMenu[i].status = IT_STRING|IT_CVAR;
} }
void Addons_option_Onchange(void)
{
OP_AddonsOptionsMenu[op_addons_folder].status =
(cv_addons_option.value == 3 ? IT_CVAR|IT_STRING|IT_CV_STRING : IT_DISABLED);
}
// ========================================================================== // ==========================================================================
// END ORGANIZATION STUFF. // END ORGANIZATION STUFF.
// ========================================================================== // ==========================================================================
@ -3945,7 +3960,7 @@ static boolean M_PrepareLevelPlatter(INT32 gt)
I_Error("Insufficient memory to prepare level platter"); I_Error("Insufficient memory to prepare level platter");
// done here so lsrow and lscol can be set if cv_nextmap is on the platter // done here so lsrow and lscol can be set if cv_nextmap is on the platter
lsrow = lscol = lstic = lshli = lsoffs[0] = lsoffs[1] = 0; lsrow = lscol = lshli = lsoffs[0] = lsoffs[1] = 0;
while (mapnum < NUMMAPS) while (mapnum < NUMMAPS)
{ {
@ -4216,9 +4231,7 @@ void M_DrawLevelPlatterHeader(INT32 y, const char *header, boolean headerhighlig
} }
y++; y++;
if ((y >= 0) && (y < 200)) if ((y >= 0) && (y < 200))
{
V_DrawFill(19, y, 282, 1, 26); V_DrawFill(19, y, 282, 1, 26);
}
} }
static void M_DrawLevelPlatterWideMap(UINT8 row, UINT8 col, INT32 x, INT32 y, boolean highlight) static void M_DrawLevelPlatterWideMap(UINT8 row, UINT8 col, INT32 x, INT32 y, boolean highlight)
@ -4331,9 +4344,6 @@ static void M_DrawLevelPlatterMenu(void)
INT32 y = lsbasey + lsoffs[0] - getheadingoffset(lsrow); INT32 y = lsbasey + lsoffs[0] - getheadingoffset(lsrow);
const INT32 cursorx = (sizeselect ? 0 : (lscol*lshseperation)); const INT32 cursorx = (sizeselect ? 0 : (lscol*lshseperation));
if (++lstic == 32)
lstic = 0;
if (gamestate == GS_TIMEATTACK) if (gamestate == GS_TIMEATTACK)
V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_CACHE)); V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_CACHE));
@ -4353,7 +4363,7 @@ static void M_DrawLevelPlatterMenu(void)
} }
// draw cursor box // draw cursor box
V_DrawSmallScaledPatch(lsbasex + cursorx + lsoffs[1], lsbasey, 0, ((lstic & 8) ? levselp[sizeselect][0] : levselp[sizeselect][1])); 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])
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));
@ -4653,11 +4663,31 @@ static void M_HandleImageDef(INT32 choice)
// MISC MAIN MENU OPTIONS // MISC MAIN MENU OPTIONS
// ====================== // ======================
static void M_Addons(INT32 choice) static void M_AddonsOptions(INT32 choice)
{ {
(void)choice; (void)choice;
Addons_option_Onchange();
strlcpy(menupath, srb2home, 1024); M_SetupNextMenu(&OP_AddonsOptionsDef);
}
static void M_Addons(INT32 choice)
{
const char *pathname = ".";
(void)choice;
/*if (cv_addons_option.value == 0)
pathname = srb2home; usehome ? srb2home : srb2path;
else if (cv_addons_option.value == 1)
pathname = srb2home;
else if (cv_addons_option.value == 2)
pathname = srb2path;
else*/
if (cv_addons_option.value == 3 && *cv_addons_folder.string != '\0')
pathname = cv_addons_folder.string;
strlcpy(menupath, pathname, 1024);
menupathindex[(menudepthleft = menudepth-1)] = strlen(menupath) + 1; menupathindex[(menudepthleft = menudepth-1)] = strlen(menupath) + 1;
if (menupath[menupathindex[menudepthleft]-2] != '/') if (menupath[menupathindex[menudepthleft]-2] != '/')
@ -4679,7 +4709,7 @@ static void M_Addons(INT32 choice)
if (addonsp[0]) // never going to have some provided but not all, saves individually checking if (addonsp[0]) // never going to have some provided but not all, saves individually checking
{ {
size_t i; size_t i;
for (i = 0; i < NUM_EXT+4; i++) for (i = 0; i < NUM_EXT+5; i++)
W_UnlockCachedPatch(addonsp[i]); W_UnlockCachedPatch(addonsp[i]);
} }
@ -4691,10 +4721,11 @@ static void M_Addons(INT32 choice)
addonsp[EXT_WAD] = W_CachePatchName("M_FWAD", PU_STATIC); addonsp[EXT_WAD] = W_CachePatchName("M_FWAD", PU_STATIC);
addonsp[EXT_SOC] = W_CachePatchName("M_FSOC", PU_STATIC); addonsp[EXT_SOC] = W_CachePatchName("M_FSOC", PU_STATIC);
addonsp[EXT_LUA] = W_CachePatchName("M_FLUA", PU_STATIC); addonsp[EXT_LUA] = W_CachePatchName("M_FLUA", PU_STATIC);
addonsp[NUM_EXT] = W_CachePatchName("M_FSEL1", PU_STATIC); addonsp[NUM_EXT] = W_CachePatchName("M_FUNKN", PU_STATIC);
addonsp[NUM_EXT+1] = W_CachePatchName("M_FSEL2", PU_STATIC); addonsp[NUM_EXT+1] = W_CachePatchName("M_FSEL1", PU_STATIC);
addonsp[NUM_EXT+2] = W_CachePatchName("M_FLOAD", PU_STATIC); addonsp[NUM_EXT+2] = W_CachePatchName("M_FSEL2", PU_STATIC);
addonsp[NUM_EXT+3] = W_CachePatchName("M_FSRCH", PU_STATIC); addonsp[NUM_EXT+3] = W_CachePatchName("M_FLOAD", PU_STATIC);
addonsp[NUM_EXT+4] = W_CachePatchName("M_FSRCH", PU_STATIC);
MISC_AddonsDef.prevMenu = currentMenu; MISC_AddonsDef.prevMenu = currentMenu;
M_SetupNextMenu(&MISC_AddonsDef); M_SetupNextMenu(&MISC_AddonsDef);
@ -4754,9 +4785,9 @@ static char *M_AddonsHeaderPath(void)
strcpy(header, menupath); strcpy(header, menupath);
len = strlen(header); len = strlen(header);
if (len > 35) if (len > 34)
{ {
len = len-35; len = len-34;
header[len] = header[len+1] = header[len+2] = '.'; header[len] = header[len+1] = header[len+2] = '.';
} }
else else
@ -4814,6 +4845,9 @@ static void M_DrawAddons(void)
if (refreshdirmenu & M_AddonsRefresh()) if (refreshdirmenu & M_AddonsRefresh())
return M_DrawMessageMenu(); return M_DrawMessageMenu();
if (addonsresponselimit)
addonsresponselimit--;
if (Playing()) if (Playing())
V_DrawCenteredString(BASEVIDWIDTH/2, 4, V_REDMAP, "Adding files mid-game may cause problems."); V_DrawCenteredString(BASEVIDWIDTH/2, 4, V_REDMAP, "Adding files mid-game may cause problems.");
@ -4827,13 +4861,17 @@ static void M_DrawAddons(void)
} }
V_DrawRightAlignedString(BASEVIDWIDTH, BASEVIDHEIGHT-8, V_TRANSLUCENT, va("%d%%", (100*x)>>FRACBITS)); V_DrawRightAlignedString(BASEVIDWIDTH, BASEVIDHEIGHT-8, V_TRANSLUCENT, va("%d%%", (100*x)>>FRACBITS));
M_DrawTemperature(BASEVIDWIDTH - 12, x); M_DrawTemperature(BASEVIDWIDTH - 16, x);
// DRAW MENU // DRAW MENU
x = currentMenu->x; x = currentMenu->x;
y = currentMenu->y; y = currentMenu->y;
M_DrawLevelPlatterHeader(y - 16, M_AddonsHeaderPath(), true, true); //M_DrawLevelPlatterHeader(y - 16, M_AddonsHeaderPath(), true, true); -- wanted different width
V_DrawString(x-21, (y - 16) + (lsheadingheight - 12), V_YELLOWMAP|V_ALLOWLOWERCASE, M_AddonsHeaderPath());
V_DrawFill(x-21, (y - 16) + (lsheadingheight - 3), (MAXSTRINGLENGTH*8+6 - 1), 1, yellowmap[3]);
V_DrawFill(x-21 + (MAXSTRINGLENGTH*8+6 - 1), (y - 16) + (lsheadingheight - 3), 1, 1, 26);
V_DrawFill(x-21, (y - 16) + (lsheadingheight - 2), MAXSTRINGLENGTH*8+6, 1, 26);
V_DrawFill(x - 21, y - 1, MAXSTRINGLENGTH*8+6, (BASEVIDHEIGHT - currentMenu->y + 1) - (y - 1), 159); V_DrawFill(x - 21, y - 1, MAXSTRINGLENGTH*8+6, (BASEVIDHEIGHT - currentMenu->y + 1) - (y - 1), 159);
@ -4868,12 +4906,11 @@ static void M_DrawAddons(void)
V_DrawSmallScaledPatch(x-(16+4), y, (flags & V_TRANSLUCENT), addonsp[((UINT8)(dirmenu[i][DIR_TYPE]) & ~EXT_LOADED)]); V_DrawSmallScaledPatch(x-(16+4), y, (flags & V_TRANSLUCENT), addonsp[((UINT8)(dirmenu[i][DIR_TYPE]) & ~EXT_LOADED)]);
if (dirmenu[i][DIR_TYPE] & EXT_LOADED) if (dirmenu[i][DIR_TYPE] & EXT_LOADED)
V_DrawSmallScaledPatch(x-(16+4), y, 0, addonsp[NUM_EXT+2]); V_DrawSmallScaledPatch(x-(16+4), y, 0, addonsp[NUM_EXT+3]);
if ((size_t)i == dir_on[menudepthleft]) if ((size_t)i == dir_on[menudepthleft])
{ {
tic_t flash = ((skullAnimCounter/4) ? 1 : 0); V_DrawSmallScaledPatch(x-(16+4), y, 0, addonsp[NUM_EXT+1+((skullAnimCounter/4) ? 1 : 0)]);
V_DrawSmallScaledPatch(x-(16+4), y, 0, addonsp[NUM_EXT+flash]);
flags = V_ALLOWLOWERCASE|V_YELLOWMAP; flags = V_ALLOWLOWERCASE|V_YELLOWMAP;
} }
@ -4892,7 +4929,7 @@ static void M_DrawAddons(void)
y = BASEVIDHEIGHT - currentMenu->y; y = BASEVIDHEIGHT - currentMenu->y;
V_DrawSmallScaledPatch(x-(21 + 5 + 16), y + 4, 0, addonsp[NUM_EXT+3]); V_DrawSmallScaledPatch(x-(21 + 5 + 16), y + 4, 0, addonsp[NUM_EXT+4]);
M_DrawTextBox(x - (21 + 5), y, MAXSTRINGLENGTH, 1); M_DrawTextBox(x - (21 + 5), y, MAXSTRINGLENGTH, 1);
if (menusearch[0]) if (menusearch[0])
V_DrawString(x - 18, y + 8, V_ALLOWLOWERCASE, menusearch+1); V_DrawString(x - 18, y + 8, V_ALLOWLOWERCASE, menusearch+1);
@ -4910,6 +4947,7 @@ static void M_AddonExec(INT32 ch)
S_StartSound(NULL, sfx_strpst); S_StartSound(NULL, sfx_strpst);
COM_BufAddText(va("exec %s%s", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); COM_BufAddText(va("exec %s%s", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING));
addonsresponselimit = 5;
} }
#define len menusearch[0] #define len menusearch[0]
@ -4954,6 +4992,9 @@ static void M_HandleAddons(INT32 choice)
{ {
boolean exitmenu = false; // exit to previous menu boolean exitmenu = false; // exit to previous menu
if (addonsresponselimit)
return;
if (M_ChangeStringAddons(choice)) if (M_ChangeStringAddons(choice))
{ {
if (!preparefilemenu(true)) if (!preparefilemenu(true))
@ -5053,6 +5094,7 @@ static void M_HandleAddons(INT32 choice)
case EXT_SOC: case EXT_SOC:
case EXT_WAD: case EXT_WAD:
COM_BufAddText(va("addfile %s%s", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING)); COM_BufAddText(va("addfile %s%s", menupath, dirmenu[dir_on[menudepthleft]]+DIR_STRING));
addonsresponselimit = 5;
break; break;
default: default:
S_StartSound(NULL, sfx_lose); S_StartSound(NULL, sfx_lose);

View File

@ -251,6 +251,9 @@ void Nextmap_OnChange(void);
void Moviemode_mode_Onchange(void); void Moviemode_mode_Onchange(void);
void Screenshot_option_Onchange(void); void Screenshot_option_Onchange(void);
// Addons menu updating
void Addons_option_Onchange(void);
// These defines make it a little easier to make menus // These defines make it a little easier to make menus
#define DEFAULTMENUSTYLE(header, source, prev, x, y)\ #define DEFAULTMENUSTYLE(header, source, prev, x, y)\
{\ {\
@ -264,6 +267,18 @@ void Screenshot_option_Onchange(void);
NULL\ NULL\
} }
#define DEFAULTSCROLLMENUSTYLE(header, source, prev, x, y)\
{\
header,\
sizeof(source)/sizeof(menuitem_t),\
prev,\
source,\
M_DrawGenericScrollMenu,\
x, y,\
0,\
NULL\
}
#define PAUSEMENUSTYLE(source, x, y)\ #define PAUSEMENUSTYLE(source, x, y)\
{\ {\
NULL,\ NULL,\

View File

@ -100,7 +100,7 @@ static CV_PossibleValue_t screenshot_cons_t[] = {{0, "Default"}, {1, "HOME"}, {2
consvar_t cv_screenshot_option = {"screenshot_option", "Default", CV_SAVE|CV_CALL, screenshot_cons_t, Screenshot_option_Onchange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_screenshot_option = {"screenshot_option", "Default", CV_SAVE|CV_CALL, screenshot_cons_t, Screenshot_option_Onchange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_screenshot_folder = {"screenshot_folder", "", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_screenshot_folder = {"screenshot_folder", "", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_screenshot_colorprofile = {"screenshot_colorprofile", "Yes", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_screenshot_colorprofile = {"screenshot_colorprofile", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
static CV_PossibleValue_t moviemode_cons_t[] = {{MM_GIF, "GIF"}, {MM_APNG, "aPNG"}, {MM_SCREENSHOT, "Screenshots"}, {0, NULL}}; static CV_PossibleValue_t moviemode_cons_t[] = {{MM_GIF, "GIF"}, {MM_APNG, "aPNG"}, {MM_SCREENSHOT, "Screenshots"}, {0, NULL}};
consvar_t cv_moviemode = {"moviemode_mode", "GIF", CV_SAVE|CV_CALL, moviemode_cons_t, Moviemode_mode_Onchange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_moviemode = {"moviemode_mode", "GIF", CV_SAVE|CV_CALL, moviemode_cons_t, Moviemode_mode_Onchange, 0, NULL, NULL, 0, 0, NULL};