1 (* Copyright (C) Doom 2D: Forever Developers
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, version 3 of the License ONLY.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 {$INCLUDE ../shared/a_modes.inc}
21 g_language
, g_weapons
, utils
;
23 function GenPlayerName (n
: Integer): String;
25 procedure g_Options_SetDefault
;
26 procedure g_Options_SetDefaultVideo
;
27 procedure g_Options_ApplyGameSettings
;
29 const DF_Default_Megawad_Start
= 'megawads/DOOM2D.WAD:\MAP01';
35 gWinSizeX
, gWinSizeY
: Integer;
36 gWinMaximized
: Boolean;
38 glLegacyNPOT
: Boolean;
39 glRenderToFBO
: Boolean = True;
40 gTextureFilter
: Boolean;
41 gLerpActors
: Boolean = True;
42 gFrameTime
: Integer = 5;
43 gMaxFPS
: Integer = 200;
47 gMaxSimSounds
: Integer;
48 gMuteWhenInactive
: Boolean;
54 gDrawBackGround
: Boolean;
55 gShowMessages
: Boolean;
56 gRevertPlayers
: Boolean;
58 gAskLanguage
: Boolean;
59 gSaveStats
: Boolean = False;
60 gScreenshotStats
: Boolean = False;
61 gsSDLSampleRate
: Integer;
62 gsSDLBufferSize
: Integer;
63 gDefaultMegawadStart
: AnsiString;
64 glNPOTOverride
: Boolean = false;
66 (* Latched game settings *)
73 gsGameFlags
: LongWord;
74 gsSpawnInvul
: Integer = 0;
75 gsItemRespawnTime
: Word = 60;
76 gsWarmupTime
: Word = 30;
79 e_NoGraphics
: Boolean = True;
81 e_NoGraphics
: Boolean = False;
83 e_FastScreenshots
: Boolean = true; // it's REALLY SLOW with `false`
84 g_dbg_scale
: Single = 1.0;
85 r_pixel_scale
: Single = 1.0;
87 gwin_has_stencil
: Boolean = false;
88 gwin_k8_enable_light_experiments
: Boolean = false;
89 g_dbg_aimline_on
: Boolean = false;
90 g_dbg_input
: Boolean = False;
93 g_touch_enabled
: Boolean = False;
94 g_touch_size
: Single = 1.0;
95 g_touch_offset
: Single = 50.0;
96 g_touch_fire
: Boolean = True;
97 g_touch_alt
: Boolean = False;
99 {--- Read-only dirs ---}
103 MegawadDirs
: SSArray
;
106 AllMapDirs
: SSArray
; // Maps + Megawads
108 {--- Read-Write dirs ---}
114 ScreenshotDirs
: SSArray
;
116 MapDownloadDirs
: SSArray
;
117 WadDownloadDirs
: SSArray
;
119 GameWADName
: string = 'GAME';
133 {$IFDEF ENABLE_SHELLS}
136 {$IFDEF ENABLE_CORPSES}
139 e_log
, e_input
, g_console
, g_sound
, g_player
, Math
,
140 g_map
, g_net
, g_netmaster
, SysUtils
, CONFIG
, g_game
,
141 g_items
, wadreader
, envvars
;
146 function GenPlayerName (n
: Integer): String;
149 Result
:= GetUserName
;
151 Result
:= 'Player' + IntToStr(machine
MOD 10000);
153 Result
:= Copy(Result
, 1, 12) + ' '
155 Result
:= Copy(Result
, 1, 10) + ' ' + IntToStr(n
)
159 procedure g_Options_SetDefaultVideo
;
160 var display
: TSDL_DisplayMode
;
162 var target
, closest
: TSDL_DisplayMode
; percentage
: Integer;
165 (* Display 0 = Primary display *)
167 gScreenHeight
:= 480;
170 //gBPP := SDL_BITSPERPIXEL(display.format);
173 gFullScreen
:= True; (* rotation not allowed? *)
175 gFullScreen
:= False;
177 if SDL_GetDesktopDisplayMode(0, @display
) = 0 then
180 gWinSizeX
:= display
.w
;
181 gWinSizeY
:= display
.h
;
183 (* Window must be smaller than display *)
184 closest
.w
:= display
.w
;
185 closest
.h
:= display
.h
;
187 while (display
.w
- closest
.w
< 48) or (display
.h
- closest
.h
< 48) do
189 if percentage
< 25 then
191 closest
.w
:= display
.w
* 75 div 100;
192 closest
.h
:= display
.h
* 75 div 100;
195 target
.w
:= display
.w
* percentage
div 100;
196 target
.h
:= display
.h
* percentage
div 100;
197 target
.format
:= 0; (* didn't care *)
198 target
.refresh_rate
:= 0; (* didn't care *)
199 target
.driverdata
:= nil; (* init *)
200 SDL_GetClosestDisplayMode(0, @target
, @closest
);
203 gWinSizeX
:= closest
.w
;
204 gWinSizeY
:= closest
.h
;
205 //gBPP := SDL_BITSPERPIXEL(closest.format); (* Resolution list didn't work for some reason *)
210 e_LogWritefln('SDL: Failed to get desktop display mode: %s', [SDL_GetError
])
212 (* Must be positioned on primary display *)
213 gWinMaximized
:= False;
215 gTextureFilter
:= True;
216 glLegacyNPOT
:= False;
217 gRC_Width
:= gWinSizeX
;
218 gRC_Height
:= gWinSizeY
;
219 gRC_FullScreen
:= gFullScreen
;
220 gRC_Maximized
:= gWinMaximized
;
221 e_LogWriteLn('g_Options_SetDefaultVideo: w = ' + IntToStr(gWinSizeX
) + ' h = ' + IntToStr(gWinSizeY
));
222 g_Console_ResetBinds
;
225 procedure g_Options_SetDefaultVideo
;
230 gFullScreen
:= False;
231 gWinMaximized
:= False;
233 gTextureFilter
:= True;
234 glLegacyNPOT
:= False;
235 gScreenWidth
:= gWinSizeX
;
236 gScreenHeight
:= gWinSizeY
;
237 gRC_Width
:= gWinSizeX
;
238 gRC_Height
:= gWinSizeY
;
239 gRC_FullScreen
:= gFullScreen
;
240 gRC_Maximized
:= gWinMaximized
;
241 e_LogWriteLn('g_Options_SetDefaultVideo: w = ' + IntToStr(gWinSizeX
) + ' h = ' + IntToStr(gWinSizeY
));
242 g_Console_ResetBinds
;
246 procedure g_Options_SetDefault();
255 gMuteWhenInactive
:= False;
256 gAnnouncer
:= ANNOUNCE_MEPLUS
;
257 gSoundEffectsDF
:= True;
258 gUseChatSounds
:= True;
259 gsSDLSampleRate
:= 44100;
260 gsSDLBufferSize
:= 2048;
262 g_Sound_SetupAllVolumes(gSoundLevel
, gMusicLevel
);
264 with gPlayer1Settings
do
266 Name
:= GenPlayerName(1);
267 Model
:= STD_PLAYER_MODEL
;
268 Color
.R
:= PLAYER1_DEF_COLOR
.R
;
269 Color
.G
:= PLAYER1_DEF_COLOR
.G
;
270 Color
.B
:= PLAYER1_DEF_COLOR
.B
;
274 with gPlayer2Settings
do
276 Name
:= GenPlayerName(2);
277 Model
:= STD_PLAYER_MODEL
;
278 Color
.R
:= PLAYER2_DEF_COLOR
.R
;
279 Color
.G
:= PLAYER2_DEF_COLOR
.G
;
280 Color
.B
:= PLAYER2_DEF_COLOR
.B
;
284 (* section Joysticks *)
285 for i
:= 0 to e_MaxJoys
- 1 do
287 e_JoystickDeadzones
[i
] := 8192
294 {$IFDEF ENABLE_SHELLS}
295 g_Shells_SetMax(DefaultShellMax
);
297 {$IFDEF ENABLE_CORPSES}
298 g_Corpses_SetMax(DefaultCorpsesMax
);
301 g_Gibs_SetMax(DefaultGibsMax
);
302 gGibsCount
:= DefaultGibsCount
;
309 gDrawBackGround
:= True;
310 gShowMessages
:= True;
311 gRevertPlayers
:= False;
313 wadoptDebug
:= False;
315 e_FastScreenshots
:= True;
316 gDefaultMegawadStart
:= DF_Default_Megawad_Start
;
320 gAskLanguage
:= True;
321 gLanguage
:= LANGUAGE_ENGLISH
;
324 gsGameMode
:= _lc
[I_MENU_GAME_TYPE_DM
];
330 gsItemRespawnTime
:= 60;
331 gsGameFlags
:= GAME_OPTION_ALLOWEXIT
or GAME_OPTION_DMKEYS
or
332 GAME_OPTION_BOTVSPLAYER
or GAME_OPTION_BOTVSMONSTER
or
333 GAME_OPTION_TEAMHITTRACE
or GAME_OPTION_TEAMHITPROJECTILE
or
334 GAME_OPTION_ALLOWDROPFLAG
;
338 g_Options_ApplyGameSettings
;
340 (* section MasterServer *)
341 NetMasterList
:= 'mpms.doom2d.org:25665, deadsoftware.ru:25665, terminalcorner.ru:25665';
342 g_Net_Slist_Set(NetMasterList
);
345 NetServerName
:= 'Unnamed Server';
349 NetAllowRCON
:= False;
350 NetRCONPassword
:= 'default';
351 NetUseMaster
:= True;
354 NetMasterRate
:= 60000;
355 NetForwardPorts
:= False;
359 NetForcePlayerUpdate
:= False;
360 NetPredictSelf
:= True;
361 NetClientIP
:= '127.0.0.1';
362 NetClientPort
:= NetPort
;
365 procedure g_Options_ApplyGameSettings
;
367 with gGameSettings
do
369 GameMode
:= g_Game_TextToMode(gsGameMode
);
370 if GameMode
= GM_NONE
then
372 if GameMode
= GM_SINGLE
then
374 TimeLimit
:= gsTimeLimit
;
375 ScoreLimit
:= gsScoreLimit
;
376 MaxLives
:= gsMaxLives
;
377 SpawnInvul
:= gsSpawnInvul
;
378 ItemRespawnTime
:= gsItemRespawnTime
;
379 WarmupTime
:= gsWarmupTime
;
380 Options
:= gsGameFlags
;
386 machine
:= Random(10000);
389 conRegVar('r_width', @gRC_Width
, '', '');
390 conRegVar('r_height', @gRC_Height
, '', '');
391 conRegVar('r_fullscreen', @gRC_FullScreen
, '', '');
392 conRegVar('r_maximized', @gRC_Maximized
, '', '');
393 conRegVar('r_bpp', @gBPP
, '', '');
394 conRegVar('r_vsync', @gVSync
, '', '');
395 conRegVar('r_texfilter', @gTextureFilter
, '', '');
396 conRegVar('r_npot', @glNPOTOverride
, '', '');
397 conRegVar('r_interp', @gLerpActors
, '', 'interpolate actors');
398 conRegVar('r_scale', @g_dbg_scale
, 0.01, 100.0, 'render scale', '', false);
399 conRegVar('r_resolution_scale', @r_pixel_scale
, 0.01, 100.0, 'upscale factor', '', false);
402 conRegVar('s_nosound', @gNoSound
, '', '');
403 conRegVar('s_soundvolume', @gSoundLevel
, '', '');
404 conRegVar('s_musicvolume', @gMusicLevel
, '', '');
405 conRegVar('s_maxsim', @gMaxSimSounds
, '', ''); // e_sound_fmod/sdl?
406 conRegVar('s_muteinactive', @gMuteWhenInactive
, '', '');
407 conRegVar('s_announcer', @gAnnouncer
, '', '');
408 conRegVar('s_sfx', @gSoundEffectsDF
, '', '');
409 conRegVar('s_chatsounds', @gUseChatSounds
, '', '');
410 {$IFDEF USE_SDLMIXER}
411 conRegVar('sdl_mixer_samplerate', @gsSDLSampleRate
, '', '');
412 conRegVar('sdl_mixer_buffersize', @gsSDLBufferSize
, '', '');
417 conRegVar('g_gibs_count', @gGibsCount
, '', '');
419 conRegVar('g_blood_count', @gBloodCount
, '', '');
420 conRegVar('g_adv_blood', @gAdvBlood
, '', '');
421 conRegVar('g_adv_corpses', @gAdvCorpses
, '', '');
422 conRegVar('g_adv_gibs', @gAdvGibs
, '', '');
423 conRegVar('r_flash', @gFlash
, '', '');
424 conRegVar('r_background', @gDrawBackGround
, '', '');
425 conRegVar('g_show_messages', @gShowMessages
, '', '');
426 conRegVar('r_revert_players', @gRevertPlayers
, '', '');
427 conRegVar('r_chat_bubble', @gChatBubble
, '', '');
428 conRegVar('sfs_debug', @wadoptDebug
, '', '');
429 conRegVar('sfs_fastmode', @wadoptFast
, '', '');
430 conRegVar('g_fast_screenshots', @e_FastScreenshots
, '', '');
431 conRegVar('g_default_megawad', @gDefaultMegawadStart
, '', '');
432 conRegVar('g_save_stats', @gSaveStats
, '', '');
433 conRegVar('g_screenshot_stats', @gScreenshotStats
, '', '');
434 conRegVar('g_lastmap', @gsMap
, '', '');
436 conRegVar('d_input', @g_dbg_input
, '', '');
439 conRegVar('touch_enable', @g_touch_enabled
, 'enable/disable virtual buttons', 'draw buttons');
440 conRegVar('touch_fire', @g_touch_fire
, 'enable/disable fire when press virtual up/down', 'fire when press up/down');
441 conRegVar('touch_size', @g_touch_size
, 0.1, 10, 'size of virtual buttons', 'button size');
442 conRegVar('touch_offset', @g_touch_offset
, 0, 100, '', '');
443 conRegVar('touch_alt', @g_touch_alt
, 'althernative virtual buttons layout', 'althernative layout');