Disable menu items with flags (#914)

* Disable menu items with flags

* Add menu flags for complevels, strict and critical modes.

* Consolidate all checks in `M_MenuItemDisabled()` function.

* Cosmetic fixes.

* darken disabled mini thermo

* remove redundant M_UpdateCriticalItems() call

* disable brightmaps menu item if forced or lump not found

* add ItemSelected() function, rename M_MenuItemDisabled->ItemDisabled, cosmetics

* restore S_COLOR flag, replace S_CHAT and S_NAME with S_STRING
This commit is contained in:
Roman Fomin 2023-02-19 18:39:43 +07:00 committed by GitHub
parent 6b1c41718f
commit c0908b5d98
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 288 additions and 329 deletions

View File

@ -2319,6 +2319,8 @@ void D_DoomMain(void)
PostProcessDeh();
D_ProcessInWads("BRGHTMPS", R_ParseBrightmaps, false);
putchar('\n'); // killough 3/6/98: add a newline, by popular demand :)
// Moved after WAD initialization because we are checking the COMPLVL lump
@ -2350,8 +2352,6 @@ void D_DoomMain(void)
D_ProcessInWads("UMAPDEF", U_ParseMapDefInfo, false);
D_ProcessInWads("BRGHTMPS", R_ParseBrightmaps, false);
//!
// @category mod
//

View File

@ -768,7 +768,6 @@ static void G_DoLoadLevel(void)
}
critical = (gameaction == ga_playdemo || demorecording || demoplayback || D_CheckNetConnect());
M_UpdateCriticalItems();
// [crispy] pistol start
if (CRITICAL(pistolstart))

View File

@ -63,6 +63,7 @@
#include "m_argv.h"
#include "m_snapshot.h"
#include "i_sound.h"
#include "r_bmaps.h"
// [crispy] remove DOS reference from the game quit confirmation dialogs
#include "SDL_platform.h"
@ -142,8 +143,6 @@ background_t menu_background;
#define M_Y (29 + M_SPC)
#define M_X_PREV (57)
#define M_X_NEXT (310)
#define M_X_WARN (ORIGWIDTH/2 - M_GetPixelWidth(menu_buffer)/2)
#define M_Y_WARN (29 + 17 * M_SPC)
#define M_Y_PREVNEXT (29 + 18 * M_SPC)
#define M_THRM_SIZE 13
#define M_THRM_STEP 8
@ -2104,7 +2103,30 @@ char ResetButtonName[2][8] = {"M_BUTT1","M_BUTT2"};
// part). A different color is used for the text depending on whether the
// item is selected or not, or whether it's about to change.
void M_DrawStringDisable(int cx, int cy, const char *ch);
static void M_DrawMenuStringEx(int flags, int x, int y, int color);
static boolean ItemDisabled(int flags)
{
if ((flags & S_DISABLE) ||
(flags & S_STRICT && strictmode) ||
(flags & S_CRITICAL && critical) ||
(flags & S_MBF && demo_version < 203) ||
(flags & S_BOOM && demo_version < 202) ||
(flags & S_VANILLA && !demo_compatibility))
{
return true;
}
return false;
}
static boolean ItemSelected(setup_menu_t *s)
{
if (s == current_setup_menu + set_menu_itemon && whichSkull)
return true;
return false;
}
static boolean PrevItemAvailable (setup_menu_t *s)
{
@ -2148,28 +2170,24 @@ void M_DrawItem(setup_menu_t* s)
// This supports multiline items on horizontally-crowded menus.
for (p = t = strdup(s->m_text); (p = strtok(p,"\n")); y += 8, p = NULL)
{ // killough 10/98: support left-justification:
strcpy(menu_buffer,p);
if (!(flags & S_LEFTJUST))
w = M_GetPixelWidth(menu_buffer) + 4;
if (flags & S_DISABLE)
M_DrawStringDisable(x - w, y, menu_buffer);
else
M_DrawMenuString(x - w, y ,color);
{
menu_buffer[0] = '\0';
// [FG] print a blinking "arrow" next to the currently highlighted menu item
if (s == current_setup_menu + set_menu_itemon && whichSkull
&& !(flags & S_NEXT_LINE))
if (!(flags & S_NEXT_LINE) && ItemSelected(s))
{
if ((flags & (S_CHOICE|S_CRITEM|S_THERMO)) && setup_select)
{
if (PrevItemAvailable(s))
M_DrawString(x - w - 8, y, color, "<");
strcpy(menu_buffer, "< ");
}
else if (flags & S_DISABLE)
M_DrawStringDisable(x - w - 8, y, ">");
else
M_DrawString(x - w - 8, y, color, ">");
strcpy(menu_buffer, "> ");
}
// killough 10/98: support left-justification:
strcat(menu_buffer, p);
if (!(flags & S_LEFTJUST))
w = M_GetPixelWidth(menu_buffer) + 4;
M_DrawMenuStringEx(flags, x - w, y, color);
}
free(t);
}
@ -2194,28 +2212,28 @@ char gather_buffer[MAXGATHER+1]; // killough 10/98: make input character-based
// displays the appropriate setting value: yes/no, a key binding, a number,
// a paint chip, etc.
static void M_DrawMiniThermo(int x, int y, int size, int dot, int color)
static void M_DrawMiniThermo(int x, int y, int size, int dot, char *color)
{
int xx;
int i;
const int step = M_THRM_STEP * M_THRM_SIZE / size;
xx = x;
V_DrawPatch(xx, y, 0, W_CacheLumpName("M_MTHRML", PU_CACHE));
V_DrawPatchTranslated(xx, y, 0, W_CacheLumpName("M_MTHRML", PU_CACHE), color);
xx += M_THRM_STEP;
for (i = 0; i < M_THRM_SIZE; i++)
{
V_DrawPatch(xx, y, 0, W_CacheLumpName("M_MTHRMM", PU_CACHE));
V_DrawPatchTranslated(xx, y, 0, W_CacheLumpName("M_MTHRMM", PU_CACHE), color);
xx += M_THRM_STEP;
}
V_DrawPatch(xx, y, 0, W_CacheLumpName("M_MTHRMR", PU_CACHE));
V_DrawPatchTranslated(xx, y, 0, W_CacheLumpName("M_MTHRMR", PU_CACHE), color);
// [FG] do not crash anymore if value exceeds thermometer range
if (dot > size)
dot = size;
V_DrawPatchTranslated(x + M_THRM_STEP / 2 + dot * step, y, 0,
W_CacheLumpName("M_MTHRMO", PU_CACHE), colrngs[color]);
W_CacheLumpName("M_MTHRMO", PU_CACHE), color);
}
void M_DrawSetting(setup_menu_t* s)
@ -2233,12 +2251,9 @@ void M_DrawSetting(setup_menu_t* s)
{
strcpy(menu_buffer,s->var.def->location->i ? "YES" : "NO");
// [FG] print a blinking "arrow" next to the currently highlighted menu item
if (s == current_setup_menu + set_menu_itemon && whichSkull && !setup_select)
if (!setup_select && ItemSelected(s))
strcat(menu_buffer, " <");
if (flags & S_DISABLE)
M_DrawStringDisable(x,y,menu_buffer);
else
M_DrawMenuString(x,y,color);
M_DrawMenuStringEx(flags, x, y, color);
return;
}
@ -2255,12 +2270,9 @@ void M_DrawSetting(setup_menu_t* s)
else
sprintf(menu_buffer,"%d",s->var.def->location->i);
// [FG] print a blinking "arrow" next to the currently highlighted menu item
if (s == current_setup_menu + set_menu_itemon && whichSkull && !setup_select)
if (!setup_select && ItemSelected(s))
strcat(menu_buffer, " <");
if (flags & S_DISABLE)
M_DrawStringDisable(x,y,menu_buffer);
else
M_DrawMenuString(x,y,color);
M_DrawMenuStringEx(flags, x, y, color);
return;
}
@ -2309,9 +2321,9 @@ void M_DrawSetting(setup_menu_t* s)
M_GetKeyString(0, 0);
// [FG] print a blinking "arrow" next to the currently highlighted menu item
if (s == current_setup_menu + set_menu_itemon && whichSkull && !setup_select)
if (!setup_select && ItemSelected(s))
strcat(menu_buffer, " <");
M_DrawMenuString(x, y, color);
M_DrawMenuStringEx(flags, x, y, color);
}
// Is the item a weapon number?
@ -2327,23 +2339,15 @@ void M_DrawSetting(setup_menu_t* s)
{
sprintf(menu_buffer,"%d", s->var.def->location->i);
// [FG] print a blinking "arrow" next to the currently highlighted menu item
if (s == current_setup_menu + set_menu_itemon && whichSkull && !setup_select)
{
if (flags & S_DISABLE)
M_DrawStringDisable(x + 8, y, " <");
else
M_DrawString(x + 8, y, color, " <");
}
if (flags & S_DISABLE)
M_DrawStringDisable(x, y, menu_buffer);
else
M_DrawMenuString(x,y, flags & S_CRITEM ? s->var.def->location->i : color);
if (!setup_select && ItemSelected(s))
strcat(menu_buffer, " <");
M_DrawMenuStringEx(flags, x, y, color);
return;
}
// Is the item a paint chip?
if (flags & S_AM_COLOR) // Automap paint chip
if (flags & S_COLOR) // Automap paint chip
{
int i, ch;
byte *ptr = colorblock;
@ -2367,8 +2371,8 @@ void M_DrawSetting(setup_menu_t* s)
V_DrawBlock(x+1+WIDESCREENDELTA,y,0,CHIP_SIZE,CHIP_SIZE,colorblock);
}
// [FG] print a blinking "arrow" next to the currently highlighted menu item
if (s == current_setup_menu + set_menu_itemon && whichSkull && !setup_select)
M_DrawString(x + 8, y, color, " <");
if (!setup_select && ItemSelected(s))
M_DrawString(x + CHIP_SIZE, y, color, " <");
return;
}
@ -2424,7 +2428,7 @@ void M_DrawSetting(setup_menu_t* s)
strcpy(menu_buffer,text);
// [FG] print a blinking "arrow" next to the currently highlighted menu item
if (s == current_setup_menu + set_menu_itemon && whichSkull && !setup_select)
if (!setup_select && ItemSelected(s))
strcat(menu_buffer, " <");
M_DrawMenuString(x,y,color);
return;
@ -2435,35 +2439,43 @@ void M_DrawSetting(setup_menu_t* s)
if (flags & (S_CHOICE|S_CRITEM))
{
int i = s->var.def->location->i;
int width;
menu_buffer[0] = '\0';
if (i >= 0 && s->selectstrings[i])
strcpy(menu_buffer, s->selectstrings[i]);
width = M_GetPixelWidth(menu_buffer);
if (flags & S_NEXT_LINE)
{
y += M_SPC;
x -= M_GetPixelWidth(menu_buffer);
x -= width;
}
if (flags & S_DISABLE)
M_DrawStringDisable(x, y, menu_buffer);
else
M_DrawMenuString(x, y, flags & S_CRITEM ? i : color);
M_DrawMenuStringEx(flags, x, y, flags & S_CRITEM ? i : color);
// [FG] print a blinking "arrow" next to the currently highlighted menu item
if (s == current_setup_menu + set_menu_itemon && whichSkull)
if (ItemSelected(s))
{
int width = M_GetPixelWidth(menu_buffer);
menu_buffer[0] = '\0';
if (setup_select)
{
if (NextItemAvailable(s))
M_DrawString(x + width, y, color, " >");
if (flags & S_NEXT_LINE && PrevItemAvailable(s))
M_DrawString(x - 8, y, color, "< ");
strcpy(menu_buffer, " >");
}
else if (flags & S_DISABLE)
M_DrawStringDisable(x + width, y, " <");
else
strcpy(menu_buffer, " <");
M_DrawMenuStringEx(flags, x + width, y, color);
if (flags & S_NEXT_LINE)
{
M_DrawString(x + width, y, color, " <");
if (flags & S_NEXT_LINE)
M_DrawString(x - 8, y, color, "> ");
menu_buffer[0] = '\0';
if (setup_select)
{
if (PrevItemAvailable(s))
strcpy(menu_buffer, "< ");
}
else
strcpy(menu_buffer, "> ");
x -= M_GetPixelWidth(menu_buffer);
M_DrawMenuStringEx(flags, x, y, color);
}
}
return;
@ -2477,7 +2489,8 @@ void M_DrawSetting(setup_menu_t* s)
const int offsety = (M_SPC - SHORT(hu_font[0]->height)) / 2;
const int size = (max == UL ? M_THRM_SIZE : max);
M_DrawMiniThermo(x - offsetx, y - offsety, size, value, color);
M_DrawMiniThermo(x - offsetx, y - offsety, size, value,
ItemDisabled(flags) ? cr_dark : colrngs[color]);
if (s->selectstrings && value >= 0 && s->selectstrings[value])
strcpy(menu_buffer, s->selectstrings[value]);
@ -2485,7 +2498,7 @@ void M_DrawSetting(setup_menu_t* s)
M_snprintf(menu_buffer, 4, "%d", value);
// [FG] print a blinking "arrow" next to the currently highlighted menu item
if (s == current_setup_menu + set_menu_itemon && whichSkull)
if (ItemSelected(s))
{
if (setup_select)
{
@ -2495,11 +2508,7 @@ void M_DrawSetting(setup_menu_t* s)
else
strcat(menu_buffer, " <");
}
if (flags & S_DISABLE)
M_DrawStringDisable(x + M_THRM_WIDTH, y, menu_buffer);
else
M_DrawMenuString(x + M_THRM_WIDTH, y, color);
M_DrawMenuStringEx(flags, x + M_THRM_WIDTH, y, color);
}
}
@ -2512,30 +2521,24 @@ void M_DrawScreenItems(setup_menu_t* src)
{
if (print_warning_about_changes > 0) // killough 8/15/98: print warning
{
const int y_warn = M_Y_PREVNEXT - M_SPC;
int x_warn;
if (warning_about_changes & S_BADVAL)
{
strcpy(menu_buffer, "Value out of Range");
M_DrawMenuString(M_X_WARN,M_Y_WARN,CR_RED);
}
{
strcpy(menu_buffer, "Value out of Range");
}
else if (warning_about_changes & S_PRGWARN)
{
strcpy(menu_buffer, "Warning: Program must be restarted to see changes");
}
else
if (warning_about_changes & S_PRGWARN)
{
strcpy(menu_buffer,
"Warning: Program must be restarted to see changes");
M_DrawMenuString(M_X_WARN, M_Y_WARN, CR_RED);
}
else
if (warning_about_changes & S_BADVID)
{
strcpy(menu_buffer, "Video mode not supported");
M_DrawMenuString(M_X_WARN,M_Y_WARN,CR_RED);
}
else
{
strcpy(menu_buffer,
"Warning: Changes are pending until next game");
M_DrawMenuString(M_X_WARN,M_Y_WARN,CR_RED);
}
{
strcpy(menu_buffer, "Warning: Changes are pending until next game");
}
x_warn = ORIGWIDTH/2 - M_GetPixelWidth(menu_buffer)/2;
M_DrawMenuString(x_warn, y_warn, CR_RED);
}
while (!(src->m_flags & S_END))
@ -2633,7 +2636,7 @@ void M_DrawInstructions()
default_t *def = current_setup_menu[set_menu_itemon].var.def;
int flags = current_setup_menu[set_menu_itemon].m_flags;
if (flags & S_DISABLE)
if (ItemDisabled(flags))
return;
// killough 8/15/98: warn when values are different
@ -2672,8 +2675,7 @@ void M_DrawInstructions()
flags & S_WEAP ? (s = "Enter weapon number", 97) :
flags & S_NUM ? (s = "Enter value. Press ENTER when finished.", 37) :
flags & S_COLOR ? (s = "Select color and press enter", 70) :
flags & S_CHAT ? (s = "Type/edit chat string and Press ENTER", 43) :
flags & S_NAME ? (s = "Type/edit player name and Press ENTER", 43) :
flags & S_STRING ? (s = "Type/edit and Press ENTER", 78) :
flags & S_RESET ? 43 : 0 /* when you're changing something */ :
flags & S_RESET ? (s = "Press ENTER key to reset to defaults", 43) :
// [FG] clear key bindings with the DEL key
@ -3182,20 +3184,20 @@ static const char *default_bobfactor_strings[] = {
static void M_UpdateCenteredWeaponItem(void)
{
DISABLE_ITEM(!STRICTMODE(cosmetic_bobbing), weap_settings1[weap1_center]);
DISABLE_ITEM(!cosmetic_bobbing, weap_settings1[weap1_center]);
}
setup_menu_t weap_settings1[] = // Weapons Settings screen
{
{"1ST CHOICE WEAPON",S_WEAP,m_null,M_X,M_Y+weap1_pref1*M_SPC, {"weapon_choice_1"}},
{"2nd CHOICE WEAPON",S_WEAP,m_null,M_X,M_Y+weap1_pref2*M_SPC, {"weapon_choice_2"}},
{"3rd CHOICE WEAPON",S_WEAP,m_null,M_X,M_Y+weap1_pref3*M_SPC, {"weapon_choice_3"}},
{"4th CHOICE WEAPON",S_WEAP,m_null,M_X,M_Y+weap1_pref4*M_SPC, {"weapon_choice_4"}},
{"5th CHOICE WEAPON",S_WEAP,m_null,M_X,M_Y+weap1_pref5*M_SPC, {"weapon_choice_5"}},
{"6th CHOICE WEAPON",S_WEAP,m_null,M_X,M_Y+weap1_pref6*M_SPC, {"weapon_choice_6"}},
{"7th CHOICE WEAPON",S_WEAP,m_null,M_X,M_Y+weap1_pref7*M_SPC, {"weapon_choice_7"}},
{"8th CHOICE WEAPON",S_WEAP,m_null,M_X,M_Y+weap1_pref8*M_SPC, {"weapon_choice_8"}},
{"9th CHOICE WEAPON",S_WEAP,m_null,M_X,M_Y+weap1_pref9*M_SPC, {"weapon_choice_9"}},
{"1ST CHOICE WEAPON",S_WEAP|S_BOOM,m_null,M_X,M_Y+weap1_pref1*M_SPC, {"weapon_choice_1"}},
{"2nd CHOICE WEAPON",S_WEAP|S_BOOM,m_null,M_X,M_Y+weap1_pref2*M_SPC, {"weapon_choice_2"}},
{"3rd CHOICE WEAPON",S_WEAP|S_BOOM,m_null,M_X,M_Y+weap1_pref3*M_SPC, {"weapon_choice_3"}},
{"4th CHOICE WEAPON",S_WEAP|S_BOOM,m_null,M_X,M_Y+weap1_pref4*M_SPC, {"weapon_choice_4"}},
{"5th CHOICE WEAPON",S_WEAP|S_BOOM,m_null,M_X,M_Y+weap1_pref5*M_SPC, {"weapon_choice_5"}},
{"6th CHOICE WEAPON",S_WEAP|S_BOOM,m_null,M_X,M_Y+weap1_pref6*M_SPC, {"weapon_choice_6"}},
{"7th CHOICE WEAPON",S_WEAP|S_BOOM,m_null,M_X,M_Y+weap1_pref7*M_SPC, {"weapon_choice_7"}},
{"8th CHOICE WEAPON",S_WEAP|S_BOOM,m_null,M_X,M_Y+weap1_pref8*M_SPC, {"weapon_choice_8"}},
{"9th CHOICE WEAPON",S_WEAP|S_BOOM,m_null,M_X,M_Y+weap1_pref9*M_SPC, {"weapon_choice_9"}},
{"", S_SKIP, m_null, M_X, M_Y + weap1_stub1*M_SPC},
@ -3211,7 +3213,7 @@ setup_menu_t weap_settings1[] = // Weapons Settings screen
{"Enable Recoil Pitch", S_YESNO,m_null,M_X, M_Y+ weap1_recoilpitch*M_SPC, {"weapon_recoilpitch"}},
// [FG] centered or bobbing weapon sprite
{"Weapon Attack Alignment",S_CHOICE,m_null,M_X, M_Y+weap1_center*M_SPC, {"center_weapon"}, 0, NULL, weapon_attack_alignment_strings},
{"Weapon Attack Alignment",S_CHOICE|S_STRICT,m_null,M_X, M_Y+weap1_center*M_SPC, {"center_weapon"}, 0, NULL, weapon_attack_alignment_strings},
// Button for resetting to defaults
{0,S_RESET,m_null,X_BUTTON,Y_BUTTON},
@ -3350,10 +3352,10 @@ enum {
static void M_UpdateCrosshairItems (void)
{
DISABLE_ITEM(!hud_crosshair, stat_settings2[stat2_xhairhealth]);
DISABLE_ITEM(!STRICTMODE(hud_crosshair), stat_settings2[stat2_xhairtarget]);
DISABLE_ITEM(!STRICTMODE(hud_crosshair), stat_settings2[stat2_xhairlockon]);
DISABLE_ITEM(!hud_crosshair, stat_settings2[stat2_xhairtarget]);
DISABLE_ITEM(!hud_crosshair, stat_settings2[stat2_xhairlockon]);
DISABLE_ITEM(!hud_crosshair, stat_settings2[stat2_xhaircolor]);
DISABLE_ITEM(!STRICTMODE(hud_crosshair && hud_crosshair_target == crosstarget_highlight),
DISABLE_ITEM(!(hud_crosshair && hud_crosshair_target == crosstarget_highlight),
stat_settings2[stat2_xhairtcolor]);
}
@ -3389,11 +3391,11 @@ setup_menu_t stat_settings2[] =
{"CROSSHAIR",S_SKIP|S_TITLE,m_null,M_X,M_Y+stat2_title3*M_SPC },
{"ENABLE CROSSHAIR", S_CHOICE,m_null,M_X,M_Y+stat2_xhair*M_SPC, {"hud_crosshair"}, 0, M_UpdateCrosshairItems, crosshair_str},
{"COLOR BY PLAYER HEALTH",S_YESNO ,m_null,M_X,M_Y+stat2_xhairhealth*M_SPC, {"hud_crosshair_health"}},
{"COLOR BY TARGET", S_CHOICE,m_null,M_X,M_Y+stat2_xhairtarget*M_SPC, {"hud_crosshair_target"}, 0, M_UpdateCrosshairItems, crosshair_target_str},
{"LOCK ON TARGET", S_YESNO, m_null,M_X,M_Y+stat2_xhairlockon*M_SPC, {"hud_crosshair_lockon"}},
{"COLOR BY PLAYER HEALTH",S_YESNO|S_STRICT,m_null,M_X,M_Y+stat2_xhairhealth*M_SPC, {"hud_crosshair_health"}},
{"COLOR BY TARGET", S_CHOICE|S_STRICT,m_null,M_X,M_Y+stat2_xhairtarget*M_SPC, {"hud_crosshair_target"}, 0, M_UpdateCrosshairItems, crosshair_target_str},
{"LOCK ON TARGET", S_YESNO|S_STRICT,m_null,M_X,M_Y+stat2_xhairlockon*M_SPC, {"hud_crosshair_lockon"}},
{"DEFAULT COLOR", S_CRITEM,m_null,M_X,M_Y+stat2_xhaircolor*M_SPC, {"hud_crosshair_color"}, 0, NULL, hudcolor_str},
{"HIGHLIGHT COLOR", S_CRITEM,m_null,M_X,M_Y+stat2_xhairtcolor*M_SPC, {"hud_crosshair_target_color"}, 0, NULL, hudcolor_str},
{"HIGHLIGHT COLOR", S_CRITEM|S_STRICT,m_null,M_X,M_Y+stat2_xhairtcolor*M_SPC, {"hud_crosshair_target_color"}, 0, NULL, hudcolor_str},
{"<- PREV" ,S_SKIP|S_PREV,m_null,M_X_PREV,M_Y_PREVNEXT, {stat_settings1}},
@ -3495,7 +3497,7 @@ setup_menu_t auto_settings1[] = // 1st AutoMap Settings screen
{"Widgets",S_SKIP|S_TITLE,m_null,M_X,M_Y+auto1_title2*M_SPC},
// [FG] show level statistics and level time widgets
{"Show player coords" ,S_CHOICE,m_null,M_X,M_Y+auto1_coords*M_SPC, {"map_player_coords"},0,NULL,show_widgets_strings},
{"Show player coords" ,S_CHOICE|S_STRICT,m_null,M_X,M_Y+auto1_coords*M_SPC, {"map_player_coords"},0,NULL,show_widgets_strings},
{"Coords follow pointer",S_YESNO ,m_null,M_X,M_Y+auto1_pointer*M_SPC, {"map_point_coord"}}, // killough 10/98
{"Show level stats" ,S_YESNO ,m_null,M_X,M_Y+auto1_stats*M_SPC, {"map_level_stats"}},
{"Show level time" ,S_YESNO ,m_null,M_X,M_Y+auto1_time*M_SPC, {"map_level_time"}},
@ -3537,18 +3539,18 @@ enum {
setup_menu_t auto_settings2[] = // 2nd AutoMap Settings screen
{
{"background" ,S_COLOR,m_null,M_X,M_Y, {"mapcolor_back"}},
{"grid lines" ,S_COLOR,m_null,M_X,M_Y+auto2_col_grid*M_SPC, {"mapcolor_grid"}},
{"normal 1s wall" ,S_COLOR,m_null,M_X,M_Y+auto2_col_wall*M_SPC, {"mapcolor_wall"}},
{"line at floor height change" ,S_COLOR,m_null,M_X,M_Y+auto2_col_fchg*M_SPC, {"mapcolor_fchg"}},
{"line at ceiling height change" ,S_COLOR,m_null,M_X,M_Y+auto2_col_cchg*M_SPC, {"mapcolor_cchg"}},
{"line at sector with floor = ceiling",S_COLOR,m_null,M_X,M_Y+auto2_col_clsd*M_SPC, {"mapcolor_clsd"}},
{"red key" ,S_COLOR,m_null,M_X,M_Y+auto2_col_rkey*M_SPC, {"mapcolor_rkey"}},
{"blue key" ,S_COLOR,m_null,M_X,M_Y+auto2_col_bkey*M_SPC, {"mapcolor_bkey"}},
{"yellow key" ,S_COLOR,m_null,M_X,M_Y+auto2_col_ykey*M_SPC, {"mapcolor_ykey"}},
{"red door" ,S_COLOR,m_null,M_X,M_Y+auto2_col_rdor*M_SPC, {"mapcolor_rdor"}},
{"blue door" ,S_COLOR,m_null,M_X,M_Y+auto2_col_bdor*M_SPC, {"mapcolor_bdor"}},
{"yellow door" ,S_COLOR,m_null,M_X,M_Y+auto2_col_ydor*M_SPC, {"mapcolor_ydor"}},
{"background" ,S_COLOR|S_COSMETIC,m_null,M_X,M_Y, {"mapcolor_back"}},
{"grid lines" ,S_COLOR|S_COSMETIC,m_null,M_X,M_Y+auto2_col_grid*M_SPC, {"mapcolor_grid"}},
{"normal 1s wall" ,S_COLOR|S_COSMETIC,m_null,M_X,M_Y+auto2_col_wall*M_SPC, {"mapcolor_wall"}},
{"line at floor height change" ,S_COLOR|S_COSMETIC,m_null,M_X,M_Y+auto2_col_fchg*M_SPC, {"mapcolor_fchg"}},
{"line at ceiling height change" ,S_COLOR|S_COSMETIC,m_null,M_X,M_Y+auto2_col_cchg*M_SPC, {"mapcolor_cchg"}},
{"line at sector with floor = ceiling",S_COLOR|S_COSMETIC,m_null,M_X,M_Y+auto2_col_clsd*M_SPC, {"mapcolor_clsd"}},
{"red key" ,S_COLOR|S_COSMETIC,m_null,M_X,M_Y+auto2_col_rkey*M_SPC, {"mapcolor_rkey"}},
{"blue key" ,S_COLOR|S_COSMETIC,m_null,M_X,M_Y+auto2_col_bkey*M_SPC, {"mapcolor_bkey"}},
{"yellow key" ,S_COLOR|S_COSMETIC,m_null,M_X,M_Y+auto2_col_ykey*M_SPC, {"mapcolor_ykey"}},
{"red door" ,S_COLOR|S_COSMETIC,m_null,M_X,M_Y+auto2_col_rdor*M_SPC, {"mapcolor_rdor"}},
{"blue door" ,S_COLOR|S_COSMETIC,m_null,M_X,M_Y+auto2_col_bdor*M_SPC, {"mapcolor_bdor"}},
{"yellow door" ,S_COLOR|S_COSMETIC,m_null,M_X,M_Y+auto2_col_ydor*M_SPC, {"mapcolor_ydor"}},
{"",S_SKIP,m_null,M_X,M_Y+auto2_stub1*M_SPC},
@ -3583,23 +3585,23 @@ enum {
setup_menu_t auto_settings3[] = // 3rd AutoMap Settings screen
{
{"teleporter line" ,S_COLOR ,m_null,M_X,M_Y, {"mapcolor_tele"}},
{"secret sector boundary" ,S_COLOR ,m_null,M_X,M_Y+auto3_col_secr*M_SPC, {"mapcolor_secr"}},
{"teleporter line" ,S_COLOR|S_COSMETIC ,m_null,M_X,M_Y, {"mapcolor_tele"}},
{"secret sector boundary" ,S_COLOR|S_COSMETIC ,m_null,M_X,M_Y+auto3_col_secr*M_SPC, {"mapcolor_secr"}},
//jff 4/23/98 add exit line to automap
{"exit line" ,S_COLOR ,m_null,M_X,M_Y+auto3_col_exit*M_SPC, {"mapcolor_exit"}},
{"computer map unseen line" ,S_COLOR ,m_null,M_X,M_Y+auto3_col_unsn*M_SPC, {"mapcolor_unsn"}},
{"line w/no floor/ceiling changes",S_COLOR ,m_null,M_X,M_Y+auto3_col_flat*M_SPC, {"mapcolor_flat"}},
{"general sprite" ,S_COLOR ,m_null,M_X,M_Y+auto3_col_sprt*M_SPC, {"mapcolor_sprt"}},
{"crosshair" ,S_COLOR ,m_null,M_X,M_Y+auto3_col_hair*M_SPC, {"mapcolor_hair"}},
{"single player arrow" ,S_COLOR ,m_null,M_X,M_Y+auto3_col_sngl*M_SPC, {"mapcolor_sngl"}},
{"player 1 arrow" ,S_COLOR ,m_null,M_X,M_Y+auto3_col_ply1*M_SPC, {"mapcolor_ply1"}},
{"player 2 arrow" ,S_COLOR ,m_null,M_X,M_Y+auto3_col_ply2*M_SPC, {"mapcolor_ply2"}},
{"player 3 arrow" ,S_COLOR ,m_null,M_X,M_Y+auto3_col_ply3*M_SPC, {"mapcolor_ply3"}},
{"player 4 arrow" ,S_COLOR ,m_null,M_X,M_Y+auto3_col_ply4*M_SPC, {"mapcolor_ply4"}},
{"exit line" ,S_COLOR|S_COSMETIC ,m_null,M_X,M_Y+auto3_col_exit*M_SPC, {"mapcolor_exit"}},
{"computer map unseen line" ,S_COLOR|S_COSMETIC ,m_null,M_X,M_Y+auto3_col_unsn*M_SPC, {"mapcolor_unsn"}},
{"line w/no floor/ceiling changes",S_COLOR|S_COSMETIC ,m_null,M_X,M_Y+auto3_col_flat*M_SPC, {"mapcolor_flat"}},
{"general sprite" ,S_COLOR|S_COSMETIC ,m_null,M_X,M_Y+auto3_col_sprt*M_SPC, {"mapcolor_sprt"}},
{"crosshair" ,S_COLOR|S_COSMETIC ,m_null,M_X,M_Y+auto3_col_hair*M_SPC, {"mapcolor_hair"}},
{"single player arrow" ,S_COLOR|S_COSMETIC ,m_null,M_X,M_Y+auto3_col_sngl*M_SPC, {"mapcolor_sngl"}},
{"player 1 arrow" ,S_COLOR|S_COSMETIC ,m_null,M_X,M_Y+auto3_col_ply1*M_SPC, {"mapcolor_ply1"}},
{"player 2 arrow" ,S_COLOR|S_COSMETIC ,m_null,M_X,M_Y+auto3_col_ply2*M_SPC, {"mapcolor_ply2"}},
{"player 3 arrow" ,S_COLOR|S_COSMETIC ,m_null,M_X,M_Y+auto3_col_ply3*M_SPC, {"mapcolor_ply3"}},
{"player 4 arrow" ,S_COLOR|S_COSMETIC ,m_null,M_X,M_Y+auto3_col_ply4*M_SPC, {"mapcolor_ply4"}},
{"",S_SKIP,m_null,M_X,M_Y+auto3_stub1*M_SPC},
{"friends" ,S_COLOR ,m_null,M_X,M_Y+auto3_col_frnd*M_SPC, {"mapcolor_frnd"}}, // killough 8/8/98
{"friends" ,S_COLOR|S_COSMETIC ,m_null,M_X,M_Y+auto3_col_frnd*M_SPC, {"mapcolor_frnd"}}, // killough 8/8/98
{"<- PREV",S_SKIP|S_PREV,m_null,M_X_PREV,M_Y_PREVNEXT, {auto_settings2}},
@ -3736,43 +3738,43 @@ enum {
setup_menu_t enem_settings1[] = // Enemy Settings screen
{
// killough 7/19/98
{"Monster Infighting When Provoked",S_YESNO,m_null,M_X,M_Y+ enem1_infighting*M_SPC, {"monster_infighting"}},
{"Monster Infighting When Provoked",S_YESNO|S_MBF,m_null,M_X,M_Y+ enem1_infighting*M_SPC, {"monster_infighting"}},
{"Remember Previous Enemy",S_YESNO,m_null,M_X,M_Y+ enem1_remember*M_SPC, {"monsters_remember"}},
{"Remember Previous Enemy",S_YESNO|S_BOOM,m_null,M_X,M_Y+ enem1_remember*M_SPC, {"monsters_remember"}},
// killough 9/8/98
{"Monster Backing Out",S_YESNO,m_null,M_X,M_Y+ enem1_backing*M_SPC, {"monster_backing"}},
{"Monster Backing Out",S_YESNO|S_MBF,m_null,M_X,M_Y+ enem1_backing*M_SPC, {"monster_backing"}},
{"Climb Steep Stairs", S_YESNO,m_null,M_X,M_Y+ enem1_monkeys*M_SPC, {"monkeys"}},
{"Climb Steep Stairs", S_YESNO|S_MBF,m_null,M_X,M_Y+ enem1_monkeys*M_SPC, {"monkeys"}},
// killough 9/9/98
{"Intelligently Avoid Hazards",S_YESNO,m_null,M_X,M_Y+ enem1_avoid_hazards*M_SPC, {"monster_avoid_hazards"}},
{"Intelligently Avoid Hazards",S_YESNO|S_MBF,m_null,M_X,M_Y+ enem1_avoid_hazards*M_SPC, {"monster_avoid_hazards"}},
// killough 10/98
{"Affected by Friction",S_YESNO,m_null,M_X,M_Y+ enem1_friction*M_SPC, {"monster_friction"}},
{"Affected by Friction",S_YESNO|S_MBF,m_null,M_X,M_Y+ enem1_friction*M_SPC, {"monster_friction"}},
{"Rescue Dying Friends",S_YESNO,m_null,M_X,M_Y+ enem1_help_friends*M_SPC, {"help_friends"}},
{"Rescue Dying Friends",S_YESNO|S_MBF,m_null,M_X,M_Y+ enem1_help_friends*M_SPC, {"help_friends"}},
// killough 7/19/98
{"Number Of Single-Player Helper Dogs",S_NUM|S_LEVWARN,m_null,M_X,M_Y+ enem1_helpers*M_SPC, {"player_helpers"}},
{"Number Of Single-Player Helper Dogs",S_NUM|S_LEVWARN|S_MBF,m_null,M_X,M_Y+ enem1_helpers*M_SPC, {"player_helpers"}},
// killough 8/8/98
{"Distance Friends Stay Away",S_NUM,m_null,M_X,M_Y+ enem1_distfriend*M_SPC, {"friend_distance"}},
{"Distance Friends Stay Away",S_NUM|S_MBF,m_null,M_X,M_Y+ enem1_distfriend*M_SPC, {"friend_distance"}},
{"Allow dogs to jump down",S_YESNO,m_null,M_X,M_Y+ enem1_dog_jumping*M_SPC, {"dog_jumping"}},
{"Allow dogs to jump down",S_YESNO|S_MBF,m_null,M_X,M_Y+ enem1_dog_jumping*M_SPC, {"dog_jumping"}},
{"", S_SKIP, m_null, M_X , M_Y + enem1_stub1*M_SPC},
{"Cosmetic",S_SKIP|S_TITLE,m_null,M_X,M_Y+ enem1_title1*M_SPC},
// [FG] colored blood and gibs
{"Colored Blood",S_YESNO,m_null,M_X,M_Y+ enem1_colored_blood*M_SPC, {"colored_blood"}, 0, D_SetBloodColor},
{"Colored Blood",S_YESNO|S_STRICT,m_null,M_X,M_Y+ enem1_colored_blood*M_SPC, {"colored_blood"}, 0, D_SetBloodColor},
// [crispy] randomly flip corpse, blood and death animation sprites
{"Randomly Mirrored Corpses",S_YESNO,m_null,M_X,M_Y+ enem1_flipcorpses*M_SPC, {"flipcorpses"}},
{"Randomly Mirrored Corpses",S_YESNO|S_STRICT,m_null,M_X,M_Y+ enem1_flipcorpses*M_SPC, {"flipcorpses"}},
// [crispy] resurrected pools of gore ("ghost monsters") are translucent
{"Translucent Ghost Monsters",S_YESNO,m_null,M_X,M_Y+ enem1_ghost*M_SPC, {"ghost_monsters"}},
{"Translucent Ghost Monsters",S_YESNO|S_STRICT,m_null,M_X,M_Y+ enem1_ghost*M_SPC, {"ghost_monsters"}},
// [FG] spectre drawing mode
{"Blocky Spectre Drawing",S_YESNO,m_null,M_X,M_Y+ enem1_fuzz*M_SPC, {"fuzzcolumn_mode"}, 0, R_SetFuzzColumnMode},
@ -3935,7 +3937,7 @@ setup_menu_t gen_settings1[] = { // General Settings screen1
{"Vertical Sync", S_YESNO, m_null, M_X,
M_Y+ gen1_vsync*M_SPC, {"use_vsync"}, 0, I_ResetScreen},
{"Enable predefined translucency", S_YESNO, m_null, M_X,
{"Enable predefined translucency", S_YESNO|S_STRICT, m_null, M_X,
M_Y+ gen1_trans*M_SPC, {"translucency"}, 0, M_Trans},
{"Translucency filter percentage", S_NUM, m_null, M_X,
@ -4026,23 +4028,6 @@ enum {
gen4_end1,
};
#define DISABLE_STRICT(item) DISABLE_ITEM(strictmode, item)
static void M_UpdateStrictModeItems(void)
{
extern boolean deh_set_blood_color;
// map_player_coords
DISABLE_STRICT(auto_settings1[auto1_coords]);
DISABLE_ITEM(strictmode || deh_set_blood_color, enem_settings1[enem1_colored_blood]);
DISABLE_STRICT(enem_settings1[enem1_flipcorpses]);
DISABLE_STRICT(gen_settings4[gen4_realtic]);
DISABLE_STRICT(gen_settings2[gen2_brightmaps]);
DISABLE_STRICT(gen_settings3[gen3_level_brightness]);
DISABLE_ITEM(strictmode && demo_compatibility, gen_settings1[gen1_trans]);
DISABLE_STRICT(gen_settings3[gen3_palette_changes]);
DISABLE_STRICT(gen_settings3[gen3_screen_melt]);
}
void M_ResetTimeScale(void)
{
if (strictmode || D_CheckNetConnect())
@ -4138,7 +4123,7 @@ setup_menu_t gen_settings2[] = { // General Settings screen2
{"Smooth Diminishing Lighting", S_YESNO, m_null, M_X,
M_Y + gen2_smoothlight*M_SPC, {"smoothlight"}, 0, M_SmoothLight},
{"Brightmaps for Textures and Sprites", S_YESNO, m_null, M_X,
{"Brightmaps for Textures and Sprites", S_YESNO|S_STRICT, m_null, M_X,
M_Y + gen2_brightmaps*M_SPC, {"brightmaps"}},
{"", S_SKIP, m_null, M_X, M_Y + gen2_stub1*M_SPC},
@ -4170,7 +4155,7 @@ setup_menu_t gen_settings3[] = { // General Settings screen3
{"Strict Mode", S_YESNO|S_LEVWARN, m_null, M_X,
M_Y + gen3_strictmode*M_SPC, {"strictmode"}},
{"Screen melt", S_YESNO, m_null, M_X,
{"Screen melt", S_YESNO|S_STRICT, m_null, M_X,
M_Y + gen3_screen_melt*M_SPC, {"screen_melt"}},
{"On death action", S_CHOICE, m_null, M_X,
@ -4182,10 +4167,10 @@ setup_menu_t gen_settings3[] = { // General Settings screen3
{"Show demo progress bar", S_YESNO, m_null, M_X,
M_Y + gen3_demobar*M_SPC, {"demobar"}},
{"Pain/pickup/powerup flashes", S_YESNO, m_null, M_X,
{"Pain/pickup/powerup flashes", S_YESNO|S_STRICT, m_null, M_X,
M_Y + gen3_palette_changes*M_SPC, {"palette_changes"}},
{"Level Brightness", S_THERMO, m_null, M_X_THRM,
{"Level Brightness", S_THERMO|S_STRICT, m_null, M_X_THRM,
M_Y + gen3_level_brightness*M_SPC, {"extra_level_brightness"}},
{"", S_SKIP, m_null, M_X, M_Y + gen3_end1*M_SPC},
@ -4193,13 +4178,13 @@ setup_menu_t gen_settings3[] = { // General Settings screen3
{"Compatibility-breaking Features" ,S_SKIP|S_TITLE, m_null, M_X,
M_Y + gen3_title2*M_SPC},
{"Walk Under Solid Hanging Bodies", S_YESNO, m_null, M_X,
{"Walk Under Solid Hanging Bodies", S_YESNO|S_STRICT|S_CRITICAL, m_null, M_X,
M_Y + gen3_hangsolid*M_SPC, {"hangsolid"}},
{"Improved Hit Detection", S_YESNO, m_null, M_X,
{"Improved Hit Detection", S_YESNO|S_STRICT|S_CRITICAL, m_null, M_X,
M_Y + gen3_blockmapfix*M_SPC, {"blockmapfix"}},
{"Pistol Start", S_YESNO, m_null, M_X,
{"Pistol Start", S_YESNO|S_STRICT|S_CRITICAL, m_null, M_X,
M_Y + gen3_pistolstart*M_SPC, {"pistolstart"}},
{"<- PREV",S_SKIP|S_PREV, m_null, M_X_PREV, M_Y_PREVNEXT, {gen_settings2}},
@ -4214,7 +4199,7 @@ setup_menu_t gen_settings4[] = { // General Settings screen4
{"Miscellaneous" ,S_SKIP|S_TITLE, m_null, M_X, M_Y + gen4_title1*M_SPC},
{"Game speed, percentage of normal", S_NUM, m_null, M_X,
{"Game speed, percentage of normal", S_NUM|S_STRICT, m_null, M_X,
M_Y + gen4_realtic*M_SPC, {"realtic_clock_rate"}, 0, M_ResetTimeScale},
{"Default compatibility", S_CHOICE|S_LEVWARN, m_null, M_X,
@ -4223,7 +4208,7 @@ setup_menu_t gen_settings4[] = { // General Settings screen4
{"Default skill level", S_CHOICE|S_LEVWARN, m_null, M_X,
M_Y + gen4_skill*M_SPC, {"default_skill"}, 0, NULL, default_skill_strings},
{"Player Name", S_NAME, m_null, M_X,
{"Player Name", S_STRING, m_null, M_X,
M_Y + gen4_playername*M_SPC, {"net_player_name"}},
{"<- PREV",S_SKIP|S_PREV, m_null, M_X_PREV, M_Y_PREVNEXT, {gen_settings3}},
@ -4238,9 +4223,6 @@ void M_Trans(void) // To reset translucency after setting it in menu
R_InitTranMap(0);
D_SetPredefinedTranslucency();
DISABLE_ITEM(strictmode && demo_compatibility, gen_settings1[gen1_trans]);
DISABLE_ITEM(strictmode && demo_compatibility, gen_settings1[gen1_transpct]);
}
// Setting up for the General screen. Turn on flags, set pointers,
@ -4317,34 +4299,34 @@ enum
setup_menu_t comp_settings1[] = // Compatibility Settings screen #1
{
{"Any monster can telefrag on MAP30", S_YESNO, m_null, C_X,
{"Any monster can telefrag on MAP30", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp1_telefrag * COMP_SPC, {"comp_telefrag"}},
{"Some objects never hang over tall ledges", S_YESNO, m_null, C_X,
{"Some objects never hang over tall ledges", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp1_dropoff * COMP_SPC, {"comp_dropoff"}},
{"Objects don't fall under their own weight", S_YESNO, m_null, C_X,
{"Objects don't fall under their own weight", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp1_falloff * COMP_SPC, {"comp_falloff"}},
{"Monsters randomly walk off of moving lifts", S_YESNO, m_null, C_X,
{"Monsters randomly walk off of moving lifts", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp1_staylift * COMP_SPC, {"comp_staylift"}},
{"Monsters get stuck on doortracks", S_YESNO, m_null, C_X,
{"Monsters get stuck on doortracks", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp1_doorstuck * COMP_SPC, {"comp_doorstuck"}},
{"Monsters don't give up pursuit of targets", S_YESNO, m_null, C_X,
{"Monsters don't give up pursuit of targets", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp1_pursuit * COMP_SPC, {"comp_pursuit"}},
{"Arch-Vile resurrects invincible ghosts", S_YESNO, m_null, C_X,
{"Arch-Vile resurrects invincible ghosts", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp1_vile * COMP_SPC, {"comp_vile"}},
{"Pain Elemental limited to 20 lost souls", S_YESNO, m_null, C_X,
{"Pain Elemental limited to 20 lost souls", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp1_pain * COMP_SPC, {"comp_pain"}},
{"Lost souls get stuck behind walls", S_YESNO, m_null, C_X,
{"Lost souls get stuck behind walls", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp1_skull * COMP_SPC, {"comp_skull"}},
{"God mode isn't absolute", S_YESNO, m_null, C_X,
{"God mode isn't absolute", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp1_god * COMP_SPC, {"comp_god"}},
// Button for resetting to defaults
@ -4373,22 +4355,22 @@ enum
setup_menu_t comp_settings2[] = // Compatibility Settings screen #2
{
{"Powerup cheats are not infinite duration", S_YESNO, m_null, C_X,
{"Powerup cheats are not infinite duration", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp2_infcheat * COMP_SPC, {"comp_infcheat"}},
{"Zombie players can exit levels", S_YESNO, m_null, C_X,
{"Zombie players can exit levels", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp2_zombie * COMP_SPC, {"comp_zombie"}},
{"Use exactly Doom's stairbuilding method", S_YESNO, m_null, C_X,
{"Use exactly Doom's stairbuilding method", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp2_stairs * COMP_SPC, {"comp_stairs"}},
{"Use exactly Doom's floor motion behavior", S_YESNO, m_null, C_X,
{"Use exactly Doom's floor motion behavior", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp2_floors * COMP_SPC, {"comp_floors"}},
{"Use exactly Doom's linedef trigger model", S_YESNO, m_null, C_X,
{"Use exactly Doom's linedef trigger model", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp2_model * COMP_SPC, {"comp_model"}},
{"Linedef effects work with sector tag = 0", S_YESNO, m_null, C_X,
{"Linedef effects work with sector tag = 0", S_YESNO|S_MBF, m_null, C_X,
M_Y + comp2_zerotags * COMP_SPC, {"comp_zerotags"}},
{"Cosmetic", S_SKIP|S_TITLE, m_null, C_X,
@ -4422,21 +4404,27 @@ enum
comp3_emu4,
};
static void M_UpdateCriticalItems(void)
{
DISABLE_ITEM(demo_compatibility && overflow[emu_intercepts].enabled,
gen_settings3[gen3_blockmapfix]);
}
setup_menu_t comp_settings3[] = // Compatibility Settings screen #3
{
{"Overflow Emulation", S_SKIP|S_TITLE, m_null, C_X,
M_Y + comp3_emu0 * COMP_SPC},
{"Emulate SPECHITS overflow", S_YESNO, m_null, C_X,
{"Emulate SPECHITS overflow", S_YESNO|S_VANILLA, m_null, C_X,
M_Y + comp3_emu1 * COMP_SPC, {"emu_spechits"}},
{"Emulate REJECT overflow", S_YESNO|S_LEVWARN, m_null, C_X,
{"Emulate REJECT overflow", S_YESNO|S_LEVWARN|S_VANILLA, m_null, C_X,
M_Y + comp3_emu2 * COMP_SPC, {"emu_reject"}},
{"Emulate INTERCEPTS overflow", S_YESNO, m_null, C_X,
{"Emulate INTERCEPTS overflow", S_YESNO|S_VANILLA, m_null, C_X,
M_Y + comp3_emu3 * COMP_SPC, {"emu_intercepts"}, 0, M_UpdateCriticalItems},
{"Enable missed backside emulation", S_YESNO|S_LEVWARN, m_null, C_X,
{"Enable missed backside emulation", S_YESNO|S_LEVWARN|S_VANILLA, m_null, C_X,
M_Y + comp3_emu4 * COMP_SPC, {"emu_missedbackside"}},
{"<- PREV", S_SKIP|S_PREV, m_null, M_X_PREV, M_Y_PREVNEXT, {comp_settings2}},
@ -4616,16 +4604,16 @@ setup_menu_t* chat_settings[] =
setup_menu_t chat_settings1[] = // Chat Strings screen
{
{"1",S_CHAT,m_null,CS_X,M_Y, {"chatmacro1"}},
{"2",S_CHAT,m_null,CS_X,M_Y+ 1*M_SPC, {"chatmacro2"}},
{"3",S_CHAT,m_null,CS_X,M_Y+ 2*M_SPC, {"chatmacro3"}},
{"4",S_CHAT,m_null,CS_X,M_Y+ 3*M_SPC, {"chatmacro4"}},
{"5",S_CHAT,m_null,CS_X,M_Y+ 4*M_SPC, {"chatmacro5"}},
{"6",S_CHAT,m_null,CS_X,M_Y+ 5*M_SPC, {"chatmacro6"}},
{"7",S_CHAT,m_null,CS_X,M_Y+ 6*M_SPC, {"chatmacro7"}},
{"8",S_CHAT,m_null,CS_X,M_Y+ 7*M_SPC, {"chatmacro8"}},
{"9",S_CHAT,m_null,CS_X,M_Y+ 8*M_SPC, {"chatmacro9"}},
{"0",S_CHAT,m_null,CS_X,M_Y+ 9*M_SPC, {"chatmacro0"}},
{"1",S_STRING|S_COSMETIC,m_null,CS_X,M_Y, {"chatmacro1"}},
{"2",S_STRING|S_COSMETIC,m_null,CS_X,M_Y+ 1*M_SPC, {"chatmacro2"}},
{"3",S_STRING|S_COSMETIC,m_null,CS_X,M_Y+ 2*M_SPC, {"chatmacro3"}},
{"4",S_STRING|S_COSMETIC,m_null,CS_X,M_Y+ 3*M_SPC, {"chatmacro4"}},
{"5",S_STRING|S_COSMETIC,m_null,CS_X,M_Y+ 4*M_SPC, {"chatmacro5"}},
{"6",S_STRING|S_COSMETIC,m_null,CS_X,M_Y+ 5*M_SPC, {"chatmacro6"}},
{"7",S_STRING|S_COSMETIC,m_null,CS_X,M_Y+ 6*M_SPC, {"chatmacro7"}},
{"8",S_STRING|S_COSMETIC,m_null,CS_X,M_Y+ 7*M_SPC, {"chatmacro8"}},
{"9",S_STRING|S_COSMETIC,m_null,CS_X,M_Y+ 8*M_SPC, {"chatmacro9"}},
{"0",S_STRING|S_COSMETIC,m_null,CS_X,M_Y+ 9*M_SPC, {"chatmacro0"}},
// Button for resetting to defaults
{0,S_RESET,m_null,X_BUTTON,Y_BUTTON},
@ -5067,11 +5055,6 @@ void M_DrawString(int cx, int cy, int color, const char *ch)
M_DrawStringCR(cx, cy, colrngs[color], ch);
}
void M_DrawStringDisable(int cx, int cy, const char *ch)
{
M_DrawStringCR(cx, cy, cr_dark, ch);
}
// cph 2006/08/06 - M_DrawString() is the old M_DrawMenuString, except that it is not tied to menu_buffer
void M_DrawMenuString(int cx, int cy, int color)
@ -5079,6 +5062,14 @@ void M_DrawMenuString(int cx, int cy, int color)
M_DrawString(cx, cy, color, menu_buffer);
}
static void M_DrawMenuStringEx(int flags, int x, int y, int color)
{
if (ItemDisabled(flags))
M_DrawStringCR(x, y, cr_dark, menu_buffer);
else
M_DrawMenuString(x, y, color);
}
// M_GetPixelWidth() returns the number of pixels in the width of
// the string, NOT the number of chars in the string.
@ -6245,7 +6236,7 @@ boolean M_Responder (event_t* ev)
//
// killough 10/98: use friendlier char-based input buffer
if (flags & S_DISABLE)
if (ItemDisabled(flags))
{
S_StartSound(NULL,sfx_oof);
return true;
@ -6256,7 +6247,7 @@ boolean M_Responder (event_t* ev)
print_warning_about_changes = false;
gather_count = 0;
}
else if ((flags & S_COLOR) == S_COLOR)
else if (flags & S_COLOR)
{
int color = ptr1->var.def->location->i;
@ -7040,49 +7031,9 @@ void M_ResetMenu(void)
}
}
#define DISABLE_BOOM(item) \
DISABLE_ITEM((strictmode || demo_version < 203), item)
#define DISABLE_VANILLA(item) \
DISABLE_ITEM((strictmode || demo_compatibility), item)
#define DISABLE_VANILLA_ONLY(item) \
DISABLE_ITEM(!demo_compatibility, item)
void M_ResetSetupMenu(void)
{
int i;
for (i = comp1_telefrag; i <= comp1_god; ++i)
{
DISABLE_BOOM(comp_settings1[i]);
}
for (i = comp2_infcheat; i <= comp2_zerotags; ++i)
{
DISABLE_BOOM(comp_settings2[i]);
}
for (i = comp2_blazing; i <= comp2_skymap; ++i)
{
DISABLE_STRICT(comp_settings2[i]);
}
// comp_emu1 to comp_emu3
for (i = comp3_emu1; i <= comp3_emu4; ++i)
{
DISABLE_VANILLA_ONLY(comp_settings3[i]);
}
DISABLE_BOOM(enem_settings1[enem1_infighting]);
for (i = enem1_backing; i < enem1_stub1; ++i)
{
DISABLE_BOOM(enem_settings1[i]);
}
DISABLE_ITEM(!comp[comp_vile] || strictmode, enem_settings1[enem1_ghost]);
DISABLE_VANILLA(enem_settings1[enem1_remember]);
for (i = weap1_pref1; i <= weap1_pref9; ++i)
{
DISABLE_ITEM(demo_compatibility, weap_settings1[i]);
}
extern boolean deh_set_blood_color;
// [FG] exclusive fullscreen
if (fullscreen_width != 0 || fullscreen_height != 0)
@ -7100,30 +7051,27 @@ void M_ResetSetupMenu(void)
gen_settings4[gen4_compat].m_flags |= S_DISABLE;
}
if (M_ParmExists("-pistolstart"))
{
gen_settings3[gen3_pistolstart].m_flags |= S_DISABLE;
}
if (deh_set_blood_color)
{
enem_settings1[enem1_colored_blood].m_flags |= S_DISABLE;
}
if (!brightmaps_found || force_brightmaps)
{
gen_settings2[gen2_brightmaps].m_flags |= S_DISABLE;
}
DISABLE_ITEM(!comp[comp_vile], enem_settings1[enem1_ghost]);
M_UpdateCrosshairItems();
M_UpdateCenteredWeaponItem();
M_UpdateMultiLineMsgItem();
M_UpdateStrictModeItems();
M_UpdateCriticalItems();
M_Trans();
}
#define DISABLE_CRITICAL(item) \
DISABLE_ITEM(critical || strictmode, item)
void M_UpdateCriticalItems(void)
{
DISABLE_CRITICAL(gen_settings3[gen3_hangsolid]);
if (demo_compatibility && overflow[emu_intercepts].enabled)
gen_settings3[gen3_blockmapfix].m_flags |= S_DISABLE;
else
DISABLE_CRITICAL(gen_settings3[gen3_blockmapfix]);
if (M_ParmExists("-pistolstart"))
gen_settings3[gen3_pistolstart].m_flags |= S_DISABLE;
else
DISABLE_CRITICAL(gen_settings3[gen3_pistolstart]);
}
void M_ResetSetupMenuVideo(void)

View File

@ -77,8 +77,6 @@ void M_ResetSetupMenuVideo(void);
void M_ResetTimeScale(void);
void M_UpdateCriticalItems(void);
void M_DrawCredits(void); // killough 11/98
// killough 8/15/98: warn about changes not being committed until next game
@ -92,50 +90,46 @@ extern int warning_about_changes, print_warning_about_changes;
// The following #defines are for the m_flags field of each item on every
// Setup Screen. They can be OR'ed together where appropriate
#define S_HILITE 0x1 // Cursor is sitting on this item
#define S_SELECT 0x2 // We're changing this item
#define S_TITLE 0x4 // Title item
#define S_YESNO 0x8 // Yes or No item
#define S_CRITEM 0x10 // Message color
#define S_AM_COLOR 0x20 // Automap color
#define S_CHAT_MACRO 0x40 // Chat String
#define S_RESET 0x80 // Reset to Defaults Button
#define S_PREV 0x100 // Previous menu exists
#define S_NEXT 0x200 // Next menu exists
#define S_INPUT 0x400 // Composite input
#define S_WEAP 0x800 // Weapon #
#define S_NUM 0x1000 // Numerical item
#define S_SKIP 0x2000 // Cursor can't land here
#define S_KEEP 0x4000 // Don't swap key out
#define S_END 0x8000 // Last item in list (dummy)
#define S_LEVWARN 0x10000// killough 8/30/98: Always warn about pending change
#define S_PRGWARN 0x20000// killough 10/98: Warn about change until next run
#define S_BADVAL 0x40000// killough 10/98: Warn about bad value
// removed
#define S_LEFTJUST 0x100000 // killough 10/98: items which are left-justified
#define S_CREDIT 0x200000 // killough 10/98: credit
#define S_BADVID 0x400000 // killough 12/98: video mode change error
#define S_CHOICE 0x800000 // [FG] selection of choices
#define S_DISABLE 0x1000000 // Disable item
#define S_COSMETIC 0x2000000 // Don't warn about change
#define S_THERMO 0x4000000 // Mini-thermo
#define S_NAME 0x8000000 // Player name
#define S_NEXT_LINE 0x10000000
#define S_HILITE 0x00000001 // Cursor is sitting on this item
#define S_SELECT 0x00000002 // We're changing this item
#define S_TITLE 0x00000004 // Title item
#define S_YESNO 0x00000008 // Yes or No item
#define S_CRITEM 0x00000010 // Message color
#define S_COLOR 0x00000020 // Automap color
#define S_STRING 0x00000040 // Chat/Player name String
#define S_RESET 0x00000080 // Reset to Defaults Button
#define S_PREV 0x00000100 // Previous menu exists
#define S_NEXT 0x00000200 // Next menu exists
#define S_INPUT 0x00000400 // Composite input
#define S_WEAP 0x00000800 // Weapon #
#define S_NUM 0x00001000 // Numerical item
#define S_SKIP 0x00002000 // Cursor can't land here
#define S_KEEP 0x00004000 // Don't swap key out
#define S_END 0x00008000 // Last item in list (dummy)
#define S_LEVWARN 0x00010000 // killough 8/30/98: Always warn about pending change
#define S_PRGWARN 0x00020000 // killough 10/98: Warn about change until next run
#define S_BADVAL 0x00040000 // killough 10/98: Warn about bad value
#define S_LEFTJUST 0x00080000 // killough 10/98: items which are left-justified
#define S_CREDIT 0x00100000 // killough 10/98: credit
#define S_CHOICE 0x00200000 // [FG] selection of choices
#define S_DISABLE 0x00400000 // Disable item
#define S_COSMETIC 0x00800000 // Don't warn about change, always load from OPTIONS lump
#define S_THERMO 0x01000000 // Mini-thermo
#define S_NEXT_LINE 0x02000000 // Two lines menu items
#define S_STRICT 0x04000000 // Disable in strict mode
#define S_MBF 0x08000000 // Disable if complevel < mbf
#define S_BOOM 0x10000000 // Disable if complevel < boom
#define S_VANILLA 0x20000000 // Disable if complevel != vanilla
#define S_CRITICAL 0x40000000 // Disable when recording/playing a demo and in netgame
// S_SHOWDESC = the set of items whose description should be displayed
// S_SHOWSET = the set of items whose setting should be displayed
// S_STRING = the set of items whose settings are strings -- killough 10/98:
// S_HASDEFPTR = the set of items whose var field points to default array
#define S_COLOR (S_AM_COLOR|S_COSMETIC)
#define S_SHOWDESC (S_TITLE|S_YESNO|S_CRITEM|S_COLOR|S_STRING|S_RESET|S_PREV|S_NEXT|S_INPUT|S_WEAP|S_NUM|S_CREDIT|S_CHOICE|S_THERMO)
#define S_CHAT (S_CHAT_MACRO|S_COSMETIC)
#define S_SHOWDESC (S_TITLE|S_YESNO|S_CRITEM|S_COLOR|S_CHAT|S_RESET|S_PREV|S_NEXT|S_INPUT|S_WEAP|S_NUM|S_CREDIT|S_CHOICE|S_THERMO|S_NAME)
#define S_SHOWSET (S_YESNO|S_CRITEM|S_COLOR|S_CHAT|S_INPUT|S_WEAP|S_NUM|S_CHOICE|S_THERMO|S_NAME)
#define S_STRING (S_CHAT_MACRO|S_NAME)
#define S_SHOWSET (S_YESNO|S_CRITEM|S_COLOR|S_STRING|S_INPUT|S_WEAP|S_NUM|S_CHOICE|S_THERMO)
#define S_HASDEFPTR (S_STRING|S_YESNO|S_NUM|S_WEAP|S_COLOR|S_CRITEM|S_CHOICE|S_THERMO)

View File

@ -26,7 +26,9 @@
#include "m_misc2.h"
#include "u_scanner.h"
int brightmaps;
boolean brightmaps;
boolean brightmaps_found;
boolean force_brightmaps;
#define COLORMASK_SIZE 256
@ -214,7 +216,7 @@ const byte *R_BrightmapForTexName(const char *texname)
const byte *R_BrightmapForSprite(const int type)
{
if (STRICTMODE(brightmaps))
if (STRICTMODE(brightmaps) || force_brightmaps)
{
int i;
for (i = sprites_bm.num_elems - 1; i >= 0 ; i--)
@ -231,7 +233,7 @@ const byte *R_BrightmapForSprite(const int type)
const byte *R_BrightmapForFlatNum(const int num)
{
if (STRICTMODE(brightmaps))
if (STRICTMODE(brightmaps) || force_brightmaps)
{
int i;
for (i = flats_bm.num_elems - 1; i >= 0; i--)
@ -248,7 +250,7 @@ const byte *R_BrightmapForFlatNum(const int num)
const byte *R_BrightmapForState(const int state)
{
if (STRICTMODE(brightmaps))
if (STRICTMODE(brightmaps) || force_brightmaps)
{
int i;
for (i = states_bm.num_elems - 1; i >= 0; i--)
@ -269,6 +271,8 @@ void R_ParseBrightmaps(int lumpnum)
const char *data = W_CacheLumpNum(lumpnum, PU_CACHE);
int length = W_LumpLength(lumpnum);
force_brightmaps = W_IsWADLump(lumpnum);
if (!num_brightmaps)
{
brightmap_t brightmap;
@ -350,4 +354,6 @@ void R_ParseBrightmaps(int lumpnum)
}
}
U_ScanClose(s);
brightmaps_found = (num_brightmaps > 1);
}

View File

@ -22,7 +22,9 @@
#include "doomtype.h"
extern int brightmaps;
extern boolean brightmaps;
extern boolean brightmaps_found;
extern boolean force_brightmaps;
void R_ParseBrightmaps(int lumpnum);

View File

@ -104,6 +104,7 @@ static void W_AddFile(const char *name) // killough 1/31/98: static, const
int startlump;
filelump_t *fileinfo, *fileinfo2free=NULL; //killough
filelump_t singleinfo;
boolean is_single = false;
char *filename = strcpy(malloc(strlen(name)+5), name);
NormalizeSlashes(AddDefaultExtension(filename, ".wad")); // killough 11/98
@ -135,6 +136,7 @@ static void W_AddFile(const char *name) // killough 1/31/98: static, const
singleinfo.size = LONG(W_FileLength(handle));
ExtractFileBase(filename, singleinfo.name);
numlumps++;
is_single = true;
}
else
{
@ -175,7 +177,7 @@ static void W_AddFile(const char *name) // killough 1/31/98: static, const
lump_p->namespace = ns_global; // killough 4/17/98
strncpy (lump_p->name, fileinfo->name, 8);
// [FG] WAD file that contains the lump
lump_p->wad_file = name;
lump_p->wad_file = (is_single ? NULL : name);
}
free(fileinfo2free); // killough
@ -551,6 +553,12 @@ boolean W_IsIWADLump (const int lump)
lumpinfo[lump].wad_file == wadfiles[0];
}
// check if lump is from WAD
boolean W_IsWADLump (const int lump)
{
return lump >= 0 && lump < numlumps && lumpinfo[lump].wad_file;
}
// [FG] avoid demo lump name collisions
void W_DemoLumpNameCollision(char **name)
{

View File

@ -123,6 +123,8 @@ extern void WritePredefinedLumpWad(const char *filename); // jff 5/6/98
// [FG] name of the WAD file that contains the lump
const char *W_WadNameForLump (const int lump);
boolean W_IsIWADLump (const int lump);
// check if lump is from WAD
boolean W_IsWADLump (const int lump);
void W_DemoLumpNameCollision(char **name);
void W_CloseFileDescriptors(void);