/* ** gamecvars.cpp ** ** most of the game CVARs from the frontend consolidated to only have one instance ** **--------------------------------------------------------------------------- ** Copyright 2019 Christoph Oelckers ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions ** are met: ** ** 1. Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** 2. Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in the ** documentation and/or other materials provided with the distribution. ** 3. The name of the author may not be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. **--------------------------------------------------------------------------- ** ** */ #include "c_cvars.h" #include "common.h" #include "fx_man.h" #include "baselayer.h" #include "gameconfigfile.h" #include "keyboard.h" #include "control.h" #include "_control.h" #include "gamecontrol.h" #include "m_argv.h" #include "rts.h" #include "stats.h" #include "z_music.h" #include "c_dispatch.h" #include "gstrings.h" /* Notes RedNukem has this for the toggle autorun command. Todo: Check what this is supposed to accomplish. The implementation makes no sense at all. (!RRRA || (!g_player[myconnectindex].ps->on_motorcycle && !g_player[myconnectindex].ps->on_boat))) */ CVARD(Bool, cl_crosshair, true, CVAR_ARCHIVE, "enable/disable crosshair"); CVARD(Bool, cl_automsg, false, CVAR_ARCHIVE, "enable/disable automatically sending messages to all players") // Not implemented for Blood CUSTOM_CVARD(Bool, cl_autorun, true, CVAR_ARCHIVE, "enable/disable autorun") { #if 0 // todo: print a message if (gAutoRun) viewSetMessage("Auto run ON"); else viewSetMessage("Auto run OFF"); RUN MODE OFF RUN MODE ON cl_autorun= 1-cl_autorun; P_DoQuote(QUOTE_RUN_MODE_OFF + cl_autorun, &myplayer); } #endif } CVARD(Bool, cl_runmode, true, CVAR_ARCHIVE, "enable/disable modernized run key operation") CVARD(Bool, cl_autosave, true, CVAR_ARCHIVE, "enable/disable autosaves") // Not implemented for Blood (but looks like the other games never check it either.) CVARD(Bool, cl_autosavedeletion, true, CVAR_ARCHIVE, "enable/disable automatic deletion of autosaves") // Not implemented for Blood CVARD(Int, cl_maxautosaves, 8, CVAR_ARCHIVE, "number of autosaves to keep before deleting the oldest") // Not implemented for Blood CVARD(Int, cl_cheatmask, ~0, CVAR_ARCHIVE, "configure what cheats show in the cheats menu") CVARD(Bool, cl_obituaries, true, CVAR_ARCHIVE, "enable/disable multiplayer death messages") // Not implemented for Blood CVARD(Bool, cl_democams, true, CVAR_ARCHIVE, "enable/disable demo playback cameras") // Not implemented for Blood CVARD(Bool, cl_idplayers, true, CVAR_ARCHIVE, "enable/disable name display when aiming at opponents") CVARD(Bool, cl_showcoords, false, 0, "show your position in the game world") // This is a debug oprion in its current form, not implemented in Blood CVARD(Bool, cl_weaponsway, true, CVAR_ARCHIVE, "enable/disable player weapon swaying") // Not implemented for Blood // Todo: Consolidate these to be consistent across games? CVARD(Bool, cl_viewbob, true, CVAR_ARCHIVE|CVAR_FRONTEND_DUKELIKE, "enable/disable player head bobbing") // Not implemented for Blood CVARD(Bool, cl_viewhbob, true, CVAR_ARCHIVE|CVAR_FRONTEND_BLOOD, "enable/disable view horizontal bobbing") // Only implemented in Blood CVARD(Bool, cl_viewvbob, true, CVAR_ARCHIVE|CVAR_FRONTEND_BLOOD, "enable/disable view vertical bobbing") // Only implemented in Blood CVARD(Bool, cl_interpolate, true, CVAR_ARCHIVE, "enable/disable view interpolation") // only implemented in Blood CVARD(Bool, cl_slopetilting, false, CVAR_ARCHIVE, "enable/disable slope tilting") // only implemented in Blood CVARD(Int, cl_showweapon, 1, CVAR_ARCHIVE, "enable/disable show weapons") // only implemented in Blood CUSTOM_CVARD(Int, cl_crosshairscale, 50, CVAR_ARCHIVE, "changes the size of the crosshair") { if (self < 1) self = 1; else if (self > 100) self = 100; } CUSTOM_CVARD(Int, cl_autoaim, 1, CVAR_ARCHIVE|CVAR_USERINFO, "enable/disable weapon autoaim") { if (self < 0 || self > (playing_blood? 2 : 3)) self = 1; // The Shadow Warrior backend only has a bool for this. //UpdatePlayerFromMenu(); todo: networking (only operational in EDuke32 frontend anyway.) }; CUSTOM_CVARD(Int, cl_weaponswitch, 3, CVAR_ARCHIVE|CVAR_USERINFO, "enable/disable auto weapon switching") { if (self < 0) self = 0; if (self > 3 && playing_blood) self = 3; if (self > 7) self = 7; //UpdatePlayerFromMenu(); todo: networking (only operational in EDuke32 frontend anyway.) } CUSTOM_CVARD(Int, cl_autovote, 0, CVAR_ARCHIVE, "enable/disable automatic voting") { if (self < 0 || self > 2) self = 0; } bool G_CheckAutorun(bool button) { if (cl_runmode) return button || cl_autorun; else return button ^ !!cl_autorun; } // Demos CVARD_NAMED(Bool, demorec_diffcompress, demorec_diffcompress_cvar, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "Compression for diffs") CVARD_NAMED(Bool, demorec_seeds, demorec_seeds_cvar, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enable/disable recording of random seed for later sync checking") CVARD_NAMED(Bool, demorec_diffs, demorec_diffs_cvar, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enable/disable diff recording in demos") CVARD_NAMED(Bool, demorec_force, demorec_force_cvar, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enable/disable forced demo recording") CVARD_NAMED(Int, demorec_difftics, demorec_difftics_cvar, 60, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "sets game tic interval after which a diff is recorded") CVARD(Bool, demoplay_diffs, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enable/disable application of diffs in demo playback") CVARD(Bool, demoplay_showsync, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enable/disable display of sync status") // Sound CVARD(Bool, snd_ambience, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enables/disables ambient sounds") // Not implemented for Blood CVARD(Bool, snd_enabled, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enables/disables sound effects") CVARD(Bool, snd_tryformats, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enables/disables automatic discovery of replacement sounds and music in .flac and .ogg formats") CVARD(Bool, snd_doppler, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enable/disable 3d sound") CVARD(Bool, mus_restartonload, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "restart the music when loading a saved game with the same map or not") // only implemented for Blood - todo: generalize CVARD(Bool, mus_redbook, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_FRONTEND_BLOOD, "enables/disables redbook audio (Blood only!)") // only Blood has assets for this. CUSTOM_CVARD(Bool, snd_reversestereo, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL, "reverses the stereo channels") { FX_SetReverseStereo(self); } CUSTOM_CVARD(Int, snd_fxvolume, 255, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "controls volume for sound effects") { if (self < 0) self = 0; if (self > 255) self = 255; } CUSTOM_CVARD(Int, snd_mixrate, 44100, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "sound mixing rate") { if (self < 11025) self = 11025; else if (self > 48000) self = 48000; } CUSTOM_CVARD(Int, snd_numchannels, 2, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "the number of sound channels") { if (self < 1) self = 1; else if (self > 2) self = 2; } CUSTOM_CVARD(Int, snd_numvoices, 64, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "the number of concurrent sounds") { if (self < 8) self = 8; else if (self > 128) self = 128; } CUSTOM_CVARD(Int, snd_speech, 5, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enables/disables player speech") { if (self < 0) self = 0; else if (self > 5) self = 5; } int MusicDevice = ASS_WinMM; CUSTOM_CVARD(Int, mus_device, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "selects music device") { if (self < 0) self = 0; else if (self > 1) self = 1; else MusicDevice = self? ASS_WinMM : ASS_OPL3; // must be copied because it gets altered by the music code. } // HUD // This was particularly messy. EDuke and Rednukem had no consistent setting for this but a complex combination of 4 CVARs and lots of mod flags controlling the HUD layout // NBlood had this differently with an inverted scale of 0-7 with 0 having no HUD. // For consistency all frontends now use the same scale, with 0 being the smallest and 11 being the largest, which get converted to the internal settings by the set_hud_layout callback. CUSTOM_CVARD(Int, hud_size, 9, CVAR_ARCHIVE | CVAR_NOINITCALL, "Defines the HUD size and style") { if (self < 0) self = 0; else if (self > 11) self = 11; else { if (gi->validate_hud(self)) gi->set_hud_layout(self); else OSD_Printf("Hud size %d not available\n", *self); } } CUSTOM_CVARD(Int, hud_scale, 100, CVAR_ARCHIVE | CVAR_NOINITCALL, "changes the hud scale") { if (self < 36) self = 36; else if (self > 100) self = 100; else gi->set_hud_scale(hud_size); } // This is to allow flattening the overly complicated HUD configuration to one single value and keep the complexity safely inside the HUD code. bool G_ChangeHudLayout(int direction) { if (direction < 0 && hud_size > 0) { int layout = hud_size - 1; while (!gi->validate_hud(layout) && layout >= 0) layout--; if (layout >= 0) { hud_size = layout; return true; } } else if (hud_size < 11) { int layout = hud_size + 1; while (!gi->validate_hud(layout) && layout <= 11) layout++; if (layout <= 11) { hud_size = layout; return true; } } return false; } int hud_statusbarrange; // will be set by the game's configuration setup. CUSTOM_CVARD(Int, hud_custom, 0, CVAR_ARCHIVE|CVAR_NOINITCALL, "change the custom hud") // this has no backing implementation, it seems to be solely for scripted HUDs. { if (self < 0) self = 0; else if (self >= hud_statusbarrange) self = hud_statusbarrange - 1; } CVARD(Bool, hud_stats, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enable/disable level statistics display") CVARD(Bool, hud_showmapname, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enable/disable map name display on load") CVARD(Bool, hud_position, false, CVAR_ARCHIVE, "aligns the status bar to the bottom/top") CVARD(Bool, hud_bgstretch, false, CVAR_ARCHIVE|CVAR_FRONTEND_DUKELIKE, "enable/disable background image stretching in wide resolutions") CVARD(Int, hud_messagetime, 120, CVAR_ARCHIVE|CVAR_FRONTEND_DUKELIKE, "length of time to display multiplayer chat messages") // Should be available to all games - the message handling should also be consolidated into a game independent feature. CUSTOM_CVARD(Int, hud_messages, 1, CVAR_ARCHIVE, "enable/disable showing messages") { if (self < 0 || self > 2) self = 1; } CCMD (togglemessages) { // Fixme: Needs to redirect to the frontend specific routine to handle on-screen messages. // Ideally as an option to use the ZDoom-style notification. // P_DoQuote(fta ? QUOTE_MESSAGES_ON : QUOTE_MESSAGES_OFF, &myplayer); (Duke/Redneck - beware of crappy implementation!!! // void viewSetMessage(const char *pMessage, const int pal, const MESSAGE_PRIORITY priority) Blood // void viewSetSystemMessage(const char* pMessage, ...) alternative // void PutStringInfo(PLAYERp pp, const char *string) SW if (hud_messages) { Printf (128, "%s\n", GStrings("MSGOFF")); hud_messages = false; } else { Printf (128, "%s\n", GStrings("MSGON")); hud_messages = true; } } //{ //Blood::gGameMessageMgr.SetState(self); // this is for terminaing an active message. Cannot be done like this because CVARs are global. //} CVARD_NAMED(Int, hud_numbertile, althud_numbertile, 2930, CVAR_ARCHIVE|CVAR_FRONTEND_DUKELIKE, "first tile in alt hud number set") CVARD_NAMED(Int, hud_numberpal, althud_numberpal, 0, CVAR_ARCHIVE|CVAR_FRONTEND_DUKELIKE, "pal for alt hud numbers") CVARD_NAMED(Int, hud_shadows, althud_shadows, true, CVAR_ARCHIVE|CVAR_FRONTEND_DUKELIKE, "enable/disable althud shadows") CVARD_NAMED(Int, hud_flashing, althud_flashing, true, CVAR_ARCHIVE|CVAR_FRONTEND_DUKELIKE, "enable/disable althud flashing") CVARD(Bool, hud_glowingquotes, true, CVAR_ARCHIVE, "enable/disable \"glowing\" quote text") CUSTOM_CVARD(Int, hud_textscale, 200, CVAR_ARCHIVE|CVAR_FRONTEND_DUKELIKE, "sets multiplayer chat message size") { if (self < 100) self = 100; else if (self > 400) self = 400; } CUSTOM_CVARD(Int, hud_weaponscale, 100, CVAR_ARCHIVE|CVAR_FRONTEND_DUKELIKE, "changes the weapon scale") { if (self < 30) self = 30; else if (self > 100) self = 100; } CUSTOM_CVARD(Int, r_fov, 90, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "change the field of view") { if (self < 60) self = 60; else if (self > 140) self = 140; } CVARD(Bool, r_horizcenter, false, CVAR_ARCHIVE|CVAR_FRONTEND_BLOOD, "enable/disable centered horizon line") // only present in Blood, maybe add to others? CUSTOM_CVARD(Bool, in_joystick, false, CVAR_ARCHIVE||CVAR_GLOBALCONFIG|CVAR_NOINITCALL, "enables input from the joystick if it is present") { CONTROL_JoystickEnabled = (self && CONTROL_JoyPresent); } CUSTOM_CVARD(Bool, in_mouse, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL, "enables input from the mouse if it is present") { CONTROL_MouseEnabled = (self && CONTROL_MousePresent); } // Does it even make sense to have this configurable? It is in the menu but can be switched around at will by the mouse input code. int32_t g_MyAimMode = 1; CUSTOM_CVARD(Bool, in_mousemode, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "toggles vertical mouse view") { g_MyAimMode = self; // Needs to be copied to a shadow variable because the input code messes around with this setting - but that should not affect the user's original choice. } CVARD(Bool, in_aimmode, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "0:toggle, 1:hold to aim") CVARD(Bool, in_mouseflip, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "invert vertical mouse movement") CUSTOM_CVARD(Int, in_mousebias, 0, CVAR_GLOBALCONFIG|CVAR_ARCHIVE, "emulates the original mouse code's weighting of input towards whichever axis is moving the most at any given time") { if (self < 0) self = 0; else if (self > 32) self = 32; } CUSTOM_CVARD(Int, in_mousedeadzone, 0, CVAR_GLOBALCONFIG|CVAR_ARCHIVE, "amount of mouse movement to filter out") { if (self < 0) self = 0; else if (self > 512) self = 512; } CVARD(Bool, in_mousesmoothing, false, CVAR_GLOBALCONFIG|CVAR_ARCHIVE, "enable/disable mouse input smoothing") CUSTOM_CVARD(Float, in_mousesensitivity, 1, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "changes the mouse sensitivity") { if (self < 0) self = 0; else if (self > 6) self = 6; } CUSTOM_CVARD(Float, in_mousescalex, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "changes the mouse sensitivity") { if (self < -4) self = 4; else if (self > 4) self = 4; } CUSTOM_CVARD(Float, in_mousescaley, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "changes the mouse sensitivity") { if (self < -4) self = 4; else if (self > 4) self = 4; } CUSTOM_CVARD(Int, r_drawweapon, 1, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enable/disable weapon drawing") { if (self < 0 || self > 2) self = 1; } ADD_STAT(fps) { return gi->statFPS(); } CUSTOM_CVARD(Int, r_showfps, 0, 0, "show the frame rate counter") { if (self < 0 || self > 3) self = 1; FStat::EnableStat("fps", self != 0); } CUSTOM_CVARD(Int, r_showfpsperiod, 0, 0, "time in seconds before averaging min and max stats for r_showfps 2+") { if (self < 0 || self > 5) self = 1; } float r_ambientlightrecip; CUSTOM_CVARD(Float, r_ambientlight, 1.0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "sets the global map light level") { if (self < 0.1f) self = 0.1f; else if (self > 10.f) self = 10.f; else r_ambientlightrecip = 1.f / self; } CVARD(Bool, r_shadows, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enable/disable sprite and model shadows") // Gross hack stuff. Only settable from the command line CVARD(Bool, r_rotatespritenowidescreen, false, CVAR_NOSET, "pass bit 1024 to all CON rotatesprite calls") CVARD(Bool, r_precache, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "enable/disable the pre-level caching routine") CUSTOM_CVARD(Int, r_maxfps, 200, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "limit the frame rate") { if (self < 0) self = 0; else if (self > 0 && self < 30) self = 30; else if (self > 1000) self = 1000; } int G_FPSLimit(void) { if (r_maxfps <= 0) return 1; auto frameDelay = timerGetFreqU64()/(double)r_maxfps; static double nextPageDelay; static uint64_t lastFrameTicks; nextPageDelay = clamp(nextPageDelay, 0.0, frameDelay); uint64_t const frameTicks = timerGetTicksU64(); uint64_t const elapsedTime = frameTicks - lastFrameTicks; double const dElapsedTime = elapsedTime; if (dElapsedTime >= nextPageDelay) { if (dElapsedTime <= nextPageDelay+frameDelay) nextPageDelay += frameDelay-dElapsedTime; lastFrameTicks = frameTicks; return 1; } return 0; } CUSTOM_CVARD(String, wchoice, "3457860291", CVAR_ARCHIVE | CVAR_NOINITCALL | CVAR_FRONTEND_DUKELIKE, "sets weapon autoselection order") { char dest[11]; char const* c = self; if (*c) { int j = 0; while (*c && j < 10) { dest[j] = *c - '0'; c++; j++; } while (j < 10) { if (j == 9) dest[9] = 1; else dest[j] = 2; j++; } // if (!gi->SetWeaponChoice(dest)) OSD_Printf("Weapon ordering not supported\n"); } else { OSD_Printf("Using default weapon orders.\n"); self = "3457860291"; } } CVARD(Bool, r_voxels, true, CVAR_ARCHIVE, "enable/disable automatic sprite->voxel rendering") //========================================================================== // // Global setup that formerly wasn't CVARs but merely global stuff saved in the config. // //========================================================================== CVAR(Bool, displaysetup, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) bool gNoAutoLoad; // for overrides from the def files CVAR(Bool, noautoload, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) bool G_AllowAutoload() { if (noautoload || gNoAutoLoad || Args->CheckParm("-noautoload")) return false; return true; } CVAR(Int, ScreenMode, 0, CVAR_ARCHIVE | CVAR_VIDEOCONFIG) CVAR(Int, ScreenWidth, 1024, CVAR_ARCHIVE | CVAR_VIDEOCONFIG) CVAR(Int, ScreenHeight, 768, CVAR_ARCHIVE | CVAR_VIDEOCONFIG) CVAR(Int, ScreenBPP, 32, CVAR_ARCHIVE | CVAR_VIDEOCONFIG) CVAR(Bool, adult_lockout, false, CVAR_ARCHIVE) CUSTOM_CVAR(String, playername, "Player", CVAR_ARCHIVE | CVAR_USERINFO) { TArray buffer(strlen(self)+1, 1); OSD_StripColors(buffer.Data(), self); if (buffer.Size() < strlen(self)) { self = buffer.Data(); } //Net_SendClientInfo(); This is in the client code. Todo. } CUSTOM_CVARD(Float, vid_gamma, 1.f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "adjusts gamma component of gamma ramp") { if (self < 0) self = 0; else if (self > 5) self = 5; // todo: tell the system to update } CUSTOM_CVARD(Float, vid_contrast, 1.f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "adjusts contrast component of gamma ramp") { if (self < 0) self = 0; else if (self > 5) self = 5; // todo: tell the system to update } CUSTOM_CVARD(Float, vid_brightness, 0.f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "adjusts brightness component of gamma ramp") { if (self < 0) self = 0; else if (self > 5) self = 5; // todo: tell the system to update } CUSTOM_CVARD(Float, vid_saturation, 0.f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG, "adjusts saturation component of gamma ramp") { if (self < -3) self = -3; else if (self > 3) self = 3; // todo: tell the system to update } CVAR(Int, gl_satformula, 1, CVAR_ARCHIVE|CVAR_GLOBALCONFIG); CCMD (bumpgamma) { // [RH] Gamma correction tables are now generated on the fly for *any* gamma level // Q: What are reasonable limits to use here? float newgamma = vid_gamma + 0.1f; if (newgamma > 3.0) newgamma = 1.0; vid_gamma = newgamma; Printf ("Gamma correction level %g\n", newgamma); } //{ "vid_contrast","adjusts contrast component of gamma ramp",(void *) &vid_contrast, CVAR_FLOAT|CVAR_FUNCPTR, 0, 10 }, //{ "vid_brightness","adjusts brightness component of gamma ramp",(void *) &vid_brightness, CVAR_FLOAT|CVAR_FUNCPTR, 0, 10 }, CUSTOM_CVAR(String, rtsname, "", CVAR_ARCHIVE | CVAR_USERINFO) { RTS_Init(self); } CVAR(String, usermapfolder, "", CVAR_ARCHIVE); CUSTOM_CVAR(Int, playercolor, 0, CVAR_ARCHIVE|CVAR_USERINFO) { if (self < 0 || self > 10) self = 0; else ;// gi->UpdatePlayerColor(); // this part is game specific } CUSTOM_CVAR(Int, playerteam, 0, CVAR_USERINFO) // this one is transient and won't be saved. { if (self < 0 || self > 3) self = 0; else ;// gi->UpdatePlayerTeam(); // this part is game specific } // Will only become useful if the obituary system gets overhauled. CUSTOM_CVAR(Int, playergender, 0, CVAR_USERINFO|CVAR_ARCHIVE) { if (self < 0 || self > 3) self = 0; } // Internal settings for demo recording and the multiplayer menu. These won't get saved and only are CVARs so that the menu code can use them. CVAR(Bool, m_recstat, false, CVAR_NOSET) CVAR(Int, m_coop, 0, CVAR_NOSET) CVAR(Int, m_ffire, 1, CVAR_NOSET) CVAR(Int, m_monsters, 1, CVAR_NOSET) CVAR(Int, m_marker, 1, CVAR_NOSET) CVAR(Int, m_level_number, 0, CVAR_NOSET) CVAR(Int, m_episode_number, 0, CVAR_NOSET) CVAR(Int, m_noexits, 0, CVAR_NOSET) CVAR(String, m_server, "localhost", CVAR_NOSET) CVAR(String, m_netport, "19014", CVAR_NOSET) #if 0 /* // Currently unavailable due to dependency on an obsolete OpenGL feature { "deliriumblur", "enable/disable delirium blur effect(polymost)", (void *)&gDeliriumBlur, CVAR_BOOL, 0, 1 }, // This one gets changed at run time by the game code, so making it persistent does not work // This option is not really useful anymore { "r_camrefreshdelay", "minimum delay between security camera sprite updates, 120 = 1 second", (void *)&ud.camera_time, CVAR_INT, 1, 240 }, // This requires a different approach, because it got used like a CCMD, not a CVAR. { "skill","changes the game skill setting", (void *)&ud.m_player_skill, CVAR_INT|CVAR_FUNCPTR|CVAR_NOSAVE/*|CVAR_NOMULTI*/, 0, 5 }, // just as a reminder: /* else if (!Bstrcasecmp(parm->name, "vid_gamma")) { } else if (!Bstrcasecmp(parm->name, "vid_brightness") || !Bstrcasecmp(parm->name, "vid_contrast")) { } */ /* Baselayer CVARs. Some are pointless, some not worth bothering before the backend is swappewd out, the only relevant one was r_voxels. static osdcvardata_t cvars_engine[] = { { "r_screenaspect","if using r_usenewaspect and in fullscreen, screen aspect ratio in the form XXYY, e.g. 1609 for 16:9", (void *) &r_screenxy, SCREENASPECT_CVAR_TYPE, 0, 9999 }, }; */ #endif