Add sound options menu, move items to config (#1996)

* Move "flick snap" to config only

Off by default.

* Move "armor color matches type" to config only

On by default.

* Move "coords follow pointer" to config only

On by default.

* Move "smooth automap lines" to config only

On by default.

* Move "square aspect ratio" to config only

On by default.

* Move "blocky spectre drawing" to config only

On by default.

* Add sound options menu
This commit is contained in:
ceski 2024-11-08 08:36:15 -08:00 committed by GitHub
parent 2bd08f01b5
commit c5aec1ac34
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 126 additions and 74 deletions

View File

@ -608,7 +608,7 @@ static void AM_clearLastMark(void)
markpointnum--;
}
void AM_EnableSmoothLines(void)
static void AM_EnableSmoothLines(void)
{
AM_drawFline = map_smooth_lines ? AM_drawFline_Smooth : AM_drawFline_Vanilla;
}
@ -2407,7 +2407,7 @@ void AM_BindAutomapVariables(void)
M_BindBool("automaprotate", &automaprotate, NULL, false, ss_auto, wad_no,
"Automap rotation");
M_BindBool("map_point_coord", &map_point_coord, NULL, true, ss_auto, wad_no,
M_BindBool("map_point_coord", &map_point_coord, NULL, true, ss_none, wad_no,
"Show automap pointer coordinates in non-follow mode");
M_BindBool("map_secret_after", &map_secret_after, NULL, false, ss_auto, wad_no,
"Don't highlight secret sectors on the automap before they're revealed");
@ -2415,14 +2415,14 @@ void AM_BindAutomapVariables(void)
MAP_KEYED_DOOR_COLOR, MAP_KEYED_DOOR_OFF, MAP_KEYED_DOOR_FLASH,
ss_auto, wad_no,
"Color key-locked doors on the automap (1 = Static; 2 = Flashing)");
M_BindBool("map_smooth_lines", &map_smooth_lines, NULL, true, ss_auto,
M_BindBool("map_smooth_lines", &map_smooth_lines, NULL, true, ss_none,
wad_no, "Smooth automap lines");
M_BindNum("mapcolor_preset", &mapcolor_preset, NULL, AM_PRESET_BOOM,
AM_PRESET_VANILLA, AM_PRESET_ZDOOM, ss_auto, wad_no,
"Automap color preset (0 = Vanilla Doom; 1 = Crispy Doom; 2 = Boom; 3 = ZDoom)");
M_BindBool("automapsquareaspect", &automapsquareaspect, NULL, false, ss_auto, wad_no,
M_BindBool("automapsquareaspect", &automapsquareaspect, NULL, true, ss_none, wad_no,
"Use square aspect ratio in automap");
#define BIND_CR(name, v, help) \

View File

@ -58,8 +58,6 @@ void AM_SetMapCenter(fixed_t x, fixed_t y);
void AM_ResetScreenSize(void);
void AM_EnableSmoothLines(void);
void AM_ColorPreset(void);
void AM_BindAutomapVariables(void);

View File

@ -224,6 +224,7 @@ typedef enum {
ss_enem,
ss_gen, // killough 10/98
ss_comp, // killough 10/98
ss_sfx,
ss_midi,
ss_eq,
ss_padadv,

View File

@ -284,6 +284,6 @@ void I_BindFlickStickVariables(void)
"Flick deadzone relative to camera deadzone [percent]");
BIND_NUM(joy_flick_forward_deadzone, 7, 0, 45,
"Forward angle range where flicks are disabled [degrees]");
BIND_NUM_PADADV(joy_flick_snap, 0, 0, 2,
BIND_NUM(joy_flick_snap, 0, 0, 2,
"Snap to cardinal directions (0 = Off; 1 = 4-way; 2 = 8-way)");
}

View File

@ -441,13 +441,13 @@ void I_OAL_BindSoundVariables(void)
{
BIND_BOOL_GENERAL(snd_hrtf, false,
"[OpenAL 3D] Headphones mode (0 = No; 1 = Yes)");
BIND_NUM_GENERAL(snd_resampler, 1, 0, UL,
BIND_NUM_SFX(snd_resampler, 1, 0, UL,
"Sound resampler (0 = Nearest; 1 = Linear; ...)");
BIND_NUM(snd_absorption, 0, 0, 10,
"[OpenAL 3D] Air absorption effect (0 = Off; 10 = Max)");
BIND_NUM(snd_doppler, 0, 0, 10,
BIND_NUM_SFX(snd_doppler, 0, 0, 10,
"[OpenAL 3D] Doppler effect (0 = Off; 10 = Max)");
BIND_BOOL(snd_limiter, false, "Use sound output limiter");
BIND_BOOL_SFX(snd_limiter, false, "Use sound output limiter");
}
boolean I_OAL_InitSound(int snd_module)

View File

@ -741,13 +741,12 @@ void I_BindSoundVariables(void)
"Sound effects volume");
M_BindNum("music_volume", &snd_MusicVolume, NULL, 8, 0, 15, ss_none, wad_no,
"Music volume");
BIND_BOOL(pitched_sounds, false,
BIND_BOOL_SFX(pitched_sounds, false,
"Variable pitch for sound effects");
BIND_NUM(pitch_bend_range, 120, 100, 300,
"Variable pitch bend range (100 = None)");
BIND_BOOL_GENERAL(full_sounds, false, "Play sounds in full length (prevents cutoffs)");
M_BindNum("snd_channels", &default_numChannels, NULL,
MAX_CHANNELS, 1, MAX_CHANNELS, ss_none, wad_no,
BIND_BOOL_SFX(full_sounds, false, "Play sounds in full length (prevents cutoffs)");
BIND_NUM_SFX(snd_channels, MAX_CHANNELS, 1, MAX_CHANNELS,
"Maximum number of simultaneous sound effects");
BIND_NUM_GENERAL(snd_module, SND_MODULE_MBF, 0, NUM_SND_MODULES - 1,
"Sound module (0 = Standard; 1 = OpenAL 3D; 2 = PC Speaker Sound)");

View File

@ -42,6 +42,9 @@ void M_BindNum(const char *name, void *location, void *current,
#define BIND_NUM_GENERAL(name, v, a, b, help) \
M_BindNum(#name, &name, NULL, (v), (a), (b), ss_gen, wad_no, help)
#define BIND_NUM_SFX(name, v, a, b, help) \
M_BindNum(#name, &name, NULL, (v), (a), (b), ss_sfx, wad_no, help)
#define BIND_NUM_MIDI(name, v, a, b, help) \
M_BindNum(#name, &name, NULL, (v), (a), (b), ss_midi, wad_no, help)
@ -55,6 +58,9 @@ void M_BindBool(const char *name, boolean *location, boolean *current,
#define BIND_BOOL_GENERAL(name, v, help) \
M_BindBool(#name, &name, NULL, (v), ss_gen, wad_no, help)
#define BIND_BOOL_SFX(name, v, help) \
M_BindBool(#name, &name, NULL, (v), ss_sfx, wad_no, help)
#define BIND_BOOL_MIDI(name, v, help) \
M_BindBool(#name, &name, NULL, (v), ss_midi, wad_no, help)

View File

@ -96,6 +96,7 @@ void MN_DrawStatusHUD(void);
void MN_DrawAutoMap(void);
void MN_DrawWeapons(void);
void MN_DrawEnemy(void);
void MN_DrawSfx(void);
void MN_DrawMidi(void);
void MN_DrawEqualizer(void);
void MN_DrawPadAdv(void);

View File

@ -2070,6 +2070,14 @@ static menu_t CompatDef = // killough 10/98
0
};
static menu_t SfxDef = {
generic_setup_end, // numitems
&SetupDef, // prevMenu
Generic_Setup, // menuitems
MN_DrawSfx, // routine
34, 5, // x, y (skull drawn here)
};
static menu_t MidiDef = {
generic_setup_end, // numitems
&SetupDef, // prevMenu
@ -2105,9 +2113,9 @@ static menu_t GyroDef = {
void MN_SetNextMenuAlt(ss_types type)
{
static menu_t *setup_defs[] = {
&KeybndDef, &WeaponDef, &StatusHUDDef, &AutoMapDef,
&EnemyDef, &GeneralDef, &CompatDef, &MidiDef,
&EqualizerDef, &PadAdvDef, &GyroDef,
&KeybndDef, &WeaponDef, &StatusHUDDef, &AutoMapDef,
&EnemyDef, &GeneralDef, &CompatDef, &SfxDef,
&MidiDef, &EqualizerDef, &PadAdvDef, &GyroDef,
};
SetNextMenu(setup_defs[type]);

View File

@ -315,7 +315,7 @@ enum
str_ms_time,
str_movement_sensitivity,
str_movement_type,
str_rumble,
str_percent,
str_curve,
str_center_weapon,
str_screensize,
@ -1841,8 +1841,6 @@ static setup_menu_t stat_settings1[] = {
{"Solid Background Color", S_ONOFF, H_X, M_SPC, {"st_solidbackground"},
.action = RefreshSolidBackground},
{"Armor Color Matches Type", S_ONOFF, H_X, M_SPC, {"hud_armor_type"}},
{"Animated Health/Armor Count", S_ONOFF, H_X, M_SPC, {"hud_animated_counts"}},
MI_RESET,
@ -2024,9 +2022,6 @@ static setup_menu_t auto_settings1[] = {
{"Overlay Automap", S_CHOICE, H_X, M_SPC, {"automapoverlay"},
.strings_id = str_overlay},
// killough 10/98
{"Coords Follow Pointer", S_ONOFF, H_X, M_SPC, {"map_point_coord"}},
MI_GAP,
{"Miscellaneous", S_SKIP | S_TITLE, H_X, M_SPC},
@ -2034,16 +2029,11 @@ static setup_menu_t auto_settings1[] = {
{"Color Preset", S_CHOICE | S_COSMETIC, H_X, M_SPC, {"mapcolor_preset"},
.strings_id = str_automap_preset, .action = AM_ColorPreset},
{"Smooth automap lines", S_ONOFF, H_X, M_SPC, {"map_smooth_lines"},
.action = AM_EnableSmoothLines},
{"Show Found Secrets Only", S_ONOFF, H_X, M_SPC, {"map_secret_after"}},
{"Color Keyed Doors", S_CHOICE, H_X, M_SPC, {"map_keyed_door"},
.strings_id = str_automap_keyed_door},
{"Square Aspect Ratio", S_ONOFF, H_X, M_SPC, {"automapsquareaspect"}},
MI_RESET,
MI_END
@ -2116,10 +2106,6 @@ static setup_menu_t enem_settings1[] = {
{"Translucent Ghost Monsters", S_ONOFF | S_STRICT | S_VANILLA, M_X, M_SPC,
{"ghost_monsters"}},
// [FG] spectre drawing mode
{"Blocky Spectre Drawing", S_ONOFF, M_X, M_SPC, {"fuzzcolumn_mode"},
.action = R_SetFuzzColumnMode},
MI_RESET,
MI_END
@ -2520,6 +2506,7 @@ static void SetMidiPlayerFluidSynth(void)
}
}
static void MN_Sfx(void);
static void MN_Midi(void);
static void MN_Equalizer(void);
@ -2531,7 +2518,7 @@ static setup_menu_t gen_settings2[] = {
{"Music Volume", S_THERMO, CNTR_X, M_THRM_SPC, {"music_volume"},
.action = UpdateMusicVolume},
MI_GAP_Y(6),
MI_GAP,
{"Sound Module", S_CHOICE, CNTR_X, M_SPC, {"snd_module"},
.strings_id = str_sound_module, .action = SetSoundModule},
@ -2539,6 +2526,34 @@ static setup_menu_t gen_settings2[] = {
{"Headphones Mode", S_ONOFF, CNTR_X, M_SPC, {"snd_hrtf"},
.action = SetSoundModule},
MI_GAP,
// [FG] music backend
{"MIDI Player", S_CHOICE | S_ACTION | S_WRAP_LINE, CNTR_X, M_SPC * 2,
{"midi_player_menu"}, .strings_id = str_midi_player,
.action = SetMidiPlayer},
MI_GAP,
{"Sound Options", S_FUNC, CNTR_X, M_SPC, .action = MN_Sfx},
{"MIDI Options", S_FUNC, CNTR_X, M_SPC, .action = MN_Midi},
{"Equalizer Options", S_FUNC, CNTR_X, M_SPC, .action = MN_Equalizer},
MI_END
};
static setup_menu_t sfx_settings1[] = {
{"SFX Channels", S_THERMO, CNTR_X, M_THRM_SPC, {"snd_channels"},
.action = S_StopChannels},
{"Output Limiter", S_ONOFF, CNTR_X, M_SPC, {"snd_limiter"},
.action = SetSoundModule},
MI_GAP,
{"Pitch-Shifting", S_ONOFF, CNTR_X, M_SPC, {"pitched_sounds"}},
// [FG] play sounds in full length
@ -2547,18 +2562,10 @@ static setup_menu_t gen_settings2[] = {
{"Resampler", S_CHOICE, CNTR_X, M_SPC, {"snd_resampler"},
.strings_id = str_resampler, .action = I_OAL_SetResampler},
MI_GAP_Y(6),
MI_GAP,
// [FG] music backend
{"MIDI Player", S_CHOICE | S_ACTION | S_WRAP_LINE, CNTR_X, M_SPC * 2,
{"midi_player_menu"}, .strings_id = str_midi_player,
.action = SetMidiPlayer},
MI_GAP_Y(6),
{"MIDI Options", S_FUNC, CNTR_X, M_SPC, .action = MN_Midi},
{"Equalizer Options", S_FUNC, CNTR_X, M_SPC, .action = MN_Equalizer},
{"Doppler Effect", S_THERMO, CNTR_X, M_THRM_SPC, {"snd_doppler"},
.strings_id = str_percent, .action = SetSoundModule},
MI_END
};
@ -2566,10 +2573,35 @@ static setup_menu_t gen_settings2[] = {
static const char **GetResamplerStrings(void)
{
const char **strings = I_OAL_GetResamplerStrings();
DisableItem(!strings, gen_settings2, "snd_resampler");
DisableItem(!strings, sfx_settings1, "snd_resampler");
return strings;
}
static setup_menu_t *sfx_settings[] = {sfx_settings1, NULL};
static setup_tab_t sfx_tabs[] = {{"Sound"}, {NULL}};
static void MN_Sfx(void)
{
SetItemOn(set_item_on);
SetPageIndex(current_page);
MN_SetNextMenuAlt(ss_sfx);
setup_screen = ss_sfx;
current_page = GetPageIndex(sfx_settings);
current_menu = sfx_settings[current_page];
current_tabs = sfx_tabs;
SetupMenuSecondary();
}
void MN_DrawSfx(void)
{
DrawBackground("FLOOR4_6");
MN_DrawTitle(M_X_CENTER, M_Y_TITLE, "M_GENERL", "General");
DrawTabs();
DrawInstructions();
DrawScreenItems(current_menu);
}
static const char *midi_complevel_strings[] = {
"Vanilla", "Standard", "Full"
};
@ -2835,7 +2867,7 @@ static void UpdateRumble(void)
I_RumbleMenuFeedback();
}
static const char *rumble_strings[] = {
static const char *percent_strings[] = {
"Off", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "100%"
};
@ -2869,7 +2901,7 @@ static setup_menu_t gen_settings4[] = {
MI_GAP_Y(4),
{"Rumble", S_THERMO, CNTR_X, M_THRM_SPC, {"joy_rumble"},
.strings_id = str_rumble, .action = UpdateRumble},
.strings_id = str_percent, .action = UpdateRumble},
MI_GAP_Y(5),
@ -2929,13 +2961,10 @@ static setup_menu_t padadv_settings1[] = {
{"Stick Layout", S_CHOICE, CNTR_X, M_SPC, {"joy_stick_layout"},
.strings_id = str_layout, .action = UpdateGamepad},
{"Flick Snap", S_CHOICE | S_STRICT, CNTR_X, M_SPC, {"joy_flick_snap"},
.strings_id = str_flick_snap, .action = I_ResetGamepad},
{"Flick Time", S_THERMO, CNTR_X, M_THRM_SPC, {"joy_flick_time"},
.strings_id = str_ms_time, .action = I_ResetGamepad},
MI_GAP_Y(6),
MI_GAP,
{"Movement Type", S_CHOICE, CNTR_X, M_SPC, {"joy_movement_type"},
.strings_id = str_movement_type, .action = I_ResetGamepad},
@ -2948,7 +2977,7 @@ static setup_menu_t padadv_settings1[] = {
{"joy_strafe_sensitivity"}, .strings_id = str_movement_sensitivity,
.action = I_ResetGamepad},
MI_GAP_Y(6),
MI_GAP,
{"Extra Turn Speed", S_THERMO | S_THRM_SIZE11, CNTR_X, M_THRM_SPC,
{"joy_outer_turn_speed"}, .action = UpdateGamepad},
@ -2956,8 +2985,6 @@ static setup_menu_t padadv_settings1[] = {
{"Extra Ramp Time", S_THERMO, CNTR_X, M_THRM_SPC, {"joy_outer_ramp_time"},
.strings_id = str_ms_time, .action = I_ResetGamepad},
MI_GAP_Y(6),
{"Response Curve", S_THERMO, CNTR_X, M_THRM_SPC, {"joy_camera_curve"},
.strings_id = str_curve, .action = I_ResetGamepad},
@ -3010,7 +3037,6 @@ static void UpdateGamepadItems(void)
DisableItem(condition, gen_settings4, "joy_look_speed");
DisableItem(!gamepad, padadv_settings1, "joy_stick_layout");
DisableItem(!flick, padadv_settings1, "joy_flick_snap");
DisableItem(!flick, padadv_settings1, "joy_flick_time");
DisableItem(condition, padadv_settings1, "joy_movement_type");
DisableItem(condition, padadv_settings1, "joy_forward_sensitivity");
@ -3300,6 +3326,7 @@ void MN_UpdateDynamicResolutionItem(void)
void MN_UpdateAdvancedSoundItems(boolean toggle)
{
DisableItem(toggle, gen_settings2, "snd_hrtf");
DisableItem(toggle, sfx_settings1, "snd_doppler");
}
void MN_UpdateFpsLimitItem(void)
@ -3395,6 +3422,7 @@ static setup_menu_t **setup_screens[] = {
enem_settings,
gen_settings, // killough 10/98
comp_settings,
sfx_settings,
midi_settings,
eq_settings,
padadv_settings,
@ -3525,6 +3553,7 @@ static void ResetDefaultsSecondary(void)
{
if (setup_screen == ss_gen)
{
ResetDefaults(ss_sfx);
ResetDefaults(ss_midi);
ResetDefaults(ss_eq);
ResetDefaults(ss_padadv);
@ -4733,7 +4762,7 @@ static const char **selectstrings[] = {
NULL, // str_ms_time
NULL, // str_movement_sensitivity
movement_type_strings,
rumble_strings,
percent_strings,
curve_strings,
center_weapon_strings,
screensize_strings,

View File

@ -1041,7 +1041,7 @@ void R_BindRenderVariables(void)
M_BindBool("flipcorpses", &flipcorpses, NULL, false, ss_enem, wad_no,
"Randomly mirrored death animations");
M_BindBool("fuzzcolumn_mode", &fuzzcolumn_mode, NULL, true, ss_enem, wad_no,
M_BindBool("fuzzcolumn_mode", &fuzzcolumn_mode, NULL, true, ss_none, wad_no,
"Fuzz rendering (0 = Resolution-dependent; 1 = Blocky)");
BIND_BOOL(draw_nearby_sprites, true,

View File

@ -74,8 +74,7 @@ static musicinfo_t *mus_playing;
// following is set
// by the defaults code in M_misc:
// number of channels available
int numChannels;
int default_numChannels; // killough 9/98
int snd_channels;
// jff 3/17/98 to keep track of last IDMUS specified music num
int idmusnum;
@ -92,7 +91,7 @@ int idmusnum;
static void S_StopChannel(int cnum)
{
#ifdef RANGECHECK
if (cnum < 0 || cnum >= numChannels)
if (cnum < 0 || cnum >= snd_channels)
{
I_Error("S_StopChannel: handle %d out of range\n", cnum);
}
@ -107,6 +106,17 @@ static void S_StopChannel(int cnum)
}
}
void S_StopChannels(void)
{
for (int i = 0; i < MAX_CHANNELS; i++)
{
I_StopSound(channels[i].handle);
}
memset(channels, 0, sizeof(channels));
memset(sobjs, 0, sizeof(sobjs));
}
//
// S_AdjustSoundParams
//
@ -144,7 +154,7 @@ static int S_getChannel(const mobj_t *origin, sfxinfo_t *sfxinfo, int priority,
// kill old sound
// killough 12/98: replace is_pickup hack with singularity flag
// haleyjd 06/12/08: only if subchannel matches
for (cnum = 0; cnum < numChannels; cnum++)
for (cnum = 0; cnum < snd_channels; cnum++)
{
if (channels[cnum].sfxinfo && channels[cnum].singularity == singularity
&& channels[cnum].origin == origin)
@ -155,13 +165,13 @@ static int S_getChannel(const mobj_t *origin, sfxinfo_t *sfxinfo, int priority,
}
// Find an open channel
if (cnum == numChannels)
if (cnum == snd_channels)
{
// haleyjd 09/28/06: it isn't necessary to look for playing sounds in
// the same singularity class again, as we just did that above. Here
// we are looking for an open channel. We will also keep track of the
// channel found with the lowest sound priority while doing this.
for (cnum = 0; cnum < numChannels && channels[cnum].sfxinfo; cnum++)
for (cnum = 0; cnum < snd_channels && channels[cnum].sfxinfo; cnum++)
{
if (channels[cnum].priority > lowestpriority)
{
@ -172,7 +182,7 @@ static int S_getChannel(const mobj_t *origin, sfxinfo_t *sfxinfo, int priority,
}
// None available?
if (cnum == numChannels)
if (cnum == snd_channels)
{
// Look for lower priority
// haleyjd: we have stored the channel found with the lowest priority
@ -189,7 +199,7 @@ static int S_getChannel(const mobj_t *origin, sfxinfo_t *sfxinfo, int priority,
}
#ifdef RANGECHECK
if (cnum >= numChannels)
if (cnum >= snd_channels)
{
I_Error("S_getChannel: handle %d out of range\n", cnum);
}
@ -275,7 +285,7 @@ static void StartSound(const mobj_t *origin, int sfx_id,
}
#ifdef RANGECHECK
if (cnum < 0 || cnum >= numChannels)
if (cnum < 0 || cnum >= snd_channels)
{
I_Error("S_StartSfxInfo: handle %d out of range\n", cnum);
}
@ -452,7 +462,7 @@ void S_StopSound(const mobj_t *origin)
return;
}
for (cnum = 0; cnum < numChannels; ++cnum)
for (cnum = 0; cnum < snd_channels; ++cnum)
{
if (channels[cnum].sfxinfo && channels[cnum].origin == origin)
{
@ -477,7 +487,7 @@ void S_UnlinkSound(mobj_t *origin)
if (origin)
{
for (cnum = 0; cnum < numChannels; cnum++)
for (cnum = 0; cnum < snd_channels; cnum++)
{
if (channels[cnum].sfxinfo && channels[cnum].origin == origin)
{
@ -543,7 +553,7 @@ void S_UpdateSounds(const mobj_t *listener)
I_DeferSoundUpdates();
for (cnum = 0; cnum < numChannels; ++cnum)
for (cnum = 0; cnum < snd_channels; ++cnum)
{
channel_t *c = &channels[cnum];
sfxinfo_t *sfx = c->sfxinfo;
@ -812,7 +822,7 @@ void S_Start(void)
// jff 1/22/98 skip sound init if sound not enabled
if (!nosfxparm)
{
for (cnum = 0; cnum < numChannels; ++cnum)
for (cnum = 0; cnum < snd_channels; ++cnum)
{
if (channels[cnum].sfxinfo)
{
@ -915,7 +925,6 @@ void S_Init(int sfxVolume, int musicVolume)
S_SetSfxVolume(sfxVolume);
// Reset channel memory
numChannels = default_numChannels;
memset(channels, 0, sizeof(channels));
memset(sobjs, 0, sizeof(sobjs));
}

View File

@ -44,6 +44,8 @@ void S_Init(int sfxVolume, int musicVolume);
//
void S_Start(void);
void S_StopChannels(void);
//
// Start sound for thing at <origin>
// using <sound_id> from sounds.h
@ -115,8 +117,7 @@ void S_SetMusicVolume(int volume);
void S_SetSfxVolume(int volume);
// machine-independent sound params
extern int numChannels;
extern int default_numChannels; // killough 10/98
extern int snd_channels;
// jff 3/17/98 holds last IDMUS number, or -1
extern int idmusnum;

View File

@ -1779,7 +1779,7 @@ void ST_BindSTSVariables(void)
"Use solid-color borders for the status bar in widescreen mode");
M_BindBool("hud_animated_counts", &hud_animated_counts, NULL,
false, ss_stat, wad_no, "Animated health/armor counts");
M_BindBool("hud_armor_type", &hud_armor_type, NULL, false, ss_stat, wad_no,
M_BindBool("hud_armor_type", &hud_armor_type, NULL, true, ss_none, wad_no,
"Armor count is colored based on armor type");
M_BindNum("health_red", &health_red, NULL, 25, 0, 200, ss_none, wad_yes,
"Amount of health for red-to-yellow transition");