DEADSOFTWARE

Reserved key range for virtual keyboard + alternative virtkbd layout
[d2df-sdl.git] / src / game / g_options.pas
index c24efc2b48f00e4f51489e251eeb548302ea25d1..b3b2f5a3234ca3fdf5bb5b518cf3b97a1dfe7345 100644 (file)
@@ -1,9 +1,25 @@
+(* Copyright (C)  Doom 2D: Forever Developers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *)
+{$INCLUDE ../shared/a_modes.inc}
 unit g_options;
 
 interface
 
 uses
-  g_language;
+  g_language, g_weapons;
 
 type
   TPlayerControl = record
@@ -16,6 +32,20 @@ type
     KeyNextWeapon: Word;
     KeyPrevWeapon: Word;
     KeyOpen:       Word;
+    KeyStrafe:     Word;
+    KeyWeapon:     array [WP_FIRST..WP_LAST] of Word;
+
+    KeyRight2:      Word;
+    KeyLeft2:       Word;
+    KeyUp2:         Word;
+    KeyDown2:       Word;
+    KeyFire2:       Word;
+    KeyJump2:       Word;
+    KeyNextWeapon2: Word;
+    KeyPrevWeapon2: Word;
+    KeyOpen2:       Word;
+    KeyStrafe2:     Word;
+    KeyWeapon2:     array [WP_FIRST..WP_LAST] of Word;
   end;
 
   TGameControls = record
@@ -41,6 +71,8 @@ procedure g_Options_Write_Gameplay_Net(FileName: String);
 procedure g_Options_Write_Net_Server(FileName: String);
 procedure g_Options_Write_Net_Client(FileName: String);
 
+const DF_Default_Megawad_Start = 'megawads/DOOM2D.WAD:\MAP01';
+
 var
   gGameControls: TControls;
   gScreenWidth: Word          = 800;
@@ -96,13 +128,20 @@ var
   gsSDLBufferSize: Integer    = 2048;
   gSFSDebug: Boolean          = False;
   gSFSFastMode: Boolean       = False;
+  gDefaultMegawadStart: AnsiString = DF_Default_Megawad_Start;
+  gBerserkAutoswitch: Boolean = True;
 
 implementation
 
 uses
+{$IFDEF USE_NANOGL}
+  nanoGL,
+{$ELSE}
+  GL, GLExt,
+{$ENDIF}
   e_log, e_input, g_window, g_sound, g_gfx, g_player, Math,
-  g_map, g_net, g_netmaster, SysUtils, CONFIG, g_game, g_main, e_textures,
-  g_items, GL, GLExt;
+  g_map, g_net, g_netmaster, SysUtils, CONFIG, g_game, g_main, e_texture,
+  g_items, wadreader, e_graphics;
 
 procedure g_Options_SetDefault();
 var
@@ -113,6 +152,7 @@ begin
   gMuteWhenInactive := False;
   gAnnouncer := ANNOUNCE_MEPLUS;
   gSoundEffectsDF := True;
+  gUseChatSounds := True;
   g_GFX_SetMax(2000);
   g_Gibs_SetMax(150);
   g_Corpses_SetMax(20);
@@ -149,6 +189,25 @@ begin
     KeyNextWeapon := 73;
     KeyPrevWeapon := 71;
     KeyOpen := 54;
+    KeyStrafe := 0;
+    for i := 0 to 9 do
+      KeyWeapon[i] := 30 + i;
+    KeyWeapon[10] := 45;
+    for i := 10 to High(KeyWeapon) do
+      KeyWeapon[i] := 0;
+
+    KeyRight2 := VK_RIGHT;
+    KeyLeft2 := VK_LEFT;
+    KeyUp2 := VK_UP;
+    KeyDown2 := VK_DOWN;
+    KeyFire2 := VK_FIRE;
+    KeyJump2 := VK_JUMP;
+    KeyNextWeapon2 := VK_NEXT;
+    KeyPrevWeapon2 := VK_PREV;
+    KeyOpen2 := VK_OPEN;
+    KeyStrafe2 := VK_STRAFE;
+    for i := 0 to High(KeyWeapon2) do
+      KeyWeapon2[i] := VK_0 + i;
   end;
 
   with gGameControls.P2Control do
@@ -162,6 +221,22 @@ begin
     KeyNextWeapon := 19;
     KeyPrevWeapon := 17;
     KeyOpen := 58;
+    KeyStrafe := 0;
+    for i := 0 to High(KeyWeapon) do
+      KeyWeapon[i] := 0;
+
+    KeyRight2 := 0;
+    KeyLeft2 := 0;
+    KeyUp2 := 0;
+    KeyDown2 := 0;
+    KeyFire2 := 0;
+    KeyJump2 := 0;
+    KeyNextWeapon2 := 0;
+    KeyPrevWeapon2 := 0;
+    KeyOpen2 := 0;
+    KeyStrafe2 := 0;
+    for i := 0 to High(KeyWeapon2) do
+      KeyWeapon2[i] := 0;
   end;
 
   with gPlayer1Settings do
@@ -185,6 +260,7 @@ begin
   end;
 
   NetUseMaster := True;
+  NetForwardPorts := False;
   g_Net_Slist_Set('mpms.doom2d.org', 25665);
 end;
 
@@ -195,11 +271,11 @@ var
   i: Integer;
 begin
   gAskLanguage := True;
-  e_WriteLog('Reading config', MSG_NOTIFY);
+  e_WriteLog('Reading config', TMsgType.Notify);
 
   if not FileExists(FileName) then
   begin
-    e_WriteLog('Config file '+FileName+' not found', MSG_WARNING);
+    e_WriteLog('Config file '+FileName+' not found', TMsgType.Warning);
     g_Options_SetDefault();
 
   // Default video options:
@@ -225,12 +301,12 @@ begin
   gScreenHeight := config.ReadInt('Video', 'ScreenHeight', 600);
   if gScreenHeight < 480 then
     gScreenHeight := 480;
-  gWinRealPosX := config.ReadInt('Video', 'WinPosX', 0);
+  gWinRealPosX := config.ReadInt('Video', 'WinPosX', 60);
   if gWinRealPosX < 0 then
-    gWinRealPosX := 0;
-  gWinRealPosY := config.ReadInt('Video', 'WinPosY', 0);
+    gWinRealPosX := 60;
+  gWinRealPosY := config.ReadInt('Video', 'WinPosY', 60);
   if gWinRealPosY < 0 then
-    gWinRealPosY := 0;
+    gWinRealPosY := 60;
   gFullScreen := config.ReadBool('Video', 'Fullscreen', False);
   gWinMaximized := config.ReadBool('Video', 'Maximized', False);
   gBPP := config.ReadInt('Video', 'BPP', 32);
@@ -246,6 +322,7 @@ begin
   gMuteWhenInactive := config.ReadBool('Sound', 'MuteInactive', False);
   gAnnouncer := Min(Max(config.ReadInt('Sound', 'Announcer', ANNOUNCE_MEPLUS), ANNOUNCE_NONE), ANNOUNCE_ALL);
   gSoundEffectsDF := config.ReadBool('Sound', 'SoundEffectsDF', True);
+  gUseChatSounds := config.ReadBool('Sound', 'ChatSounds', True);
   gsSDLSampleRate := Min(Max(config.ReadInt('Sound', 'SDLSampleRate', 44100), 11025), 96000);
   gsSDLBufferSize := Min(Max(config.ReadInt('Sound', 'SDLBufferSize', 2048), 64), 16384);
 
@@ -268,6 +345,22 @@ begin
     KeyNextWeapon := ReadInt('Player1', 'KeyNextWeapon', 19);
     KeyPrevWeapon := ReadInt('Player1', 'KeyPrevWeapon', 17);
     KeyOpen := ReadInt('Player1', 'KeyOpen', 58);
+    KeyStrafe := ReadInt('Player1', 'KeyStrafe', 0);
+    for i := 0 to High(KeyWeapon) do
+      KeyWeapon[i] := ReadInt('Player1', 'KeyWeapon' + IntToStr(i), 0);
+
+    KeyRight2 := ReadInt('Player1', 'KeyRight2', 0);
+    KeyLeft2 := ReadInt('Player1', 'KeyLeft2', 0);
+    KeyUp2 := ReadInt('Player1', 'KeyUp2', 0);
+    KeyDown2 := ReadInt('Player1', 'KeyDown2', 0);
+    KeyFire2 := ReadInt('Player1', 'KeyFire2', 0);
+    KeyJump2 := ReadInt('Player1', 'KeyJump2', 0);
+    KeyNextWeapon2 := ReadInt('Player1', 'KeyNextWeapon2', 0);
+    KeyPrevWeapon2 := ReadInt('Player1', 'KeyPrevWeapon2', 0);
+    KeyOpen2 := ReadInt('Player1', 'KeyOpen2', 0);
+    KeyStrafe2 := ReadInt('Player1', 'KeyStrafe2', 0);
+    for i := 0 to High(KeyWeapon2) do
+      KeyWeapon2[i] := ReadInt('Player1', 'KeyWeapon2' + IntToStr(i), 0);
   end;
 
   with gPlayer1Settings, config do
@@ -293,6 +386,22 @@ begin
     KeyNextWeapon := ReadInt('Player2', 'KeyNextWeapon', 73);
     KeyPrevWeapon := ReadInt('Player2', 'KeyPrevWeapon', 71);
     KeyOpen := ReadInt('Player2', 'KeyOpen', 54);
+    KeyStrafe := ReadInt('Player2', 'KeyStrafe', 0);
+    for i := 0 to High(KeyWeapon) do
+      KeyWeapon[i] := ReadInt('Player2', 'KeyWeapon' + IntToStr(i), 0);
+
+    KeyRight2 := ReadInt('Player2', 'KeyRight2', 0);
+    KeyLeft2 := ReadInt('Player2', 'KeyLeft2', 0);
+    KeyUp2 := ReadInt('Player2', 'KeyUp2', 0);
+    KeyDown2 := ReadInt('Player2', 'KeyDown2', 0);
+    KeyFire2 := ReadInt('Player2', 'KeyFire2', 0);
+    KeyJump2 := ReadInt('Player2', 'KeyJump2', 0);
+    KeyNextWeapon2 := ReadInt('Player2', 'KeyNextWeapon2', 0);
+    KeyPrevWeapon2 := ReadInt('Player2', 'KeyPrevWeapon2', 0);
+    KeyOpen2 := ReadInt('Player2', 'KeyOpen2', 0);
+    KeyStrafe2 := ReadInt('Player2', 'KeyStrafe2', 0);
+    for i := 0 to High(KeyWeapon2) do
+      KeyWeapon2[i] := ReadInt('Player2', 'KeyWeapon2' + IntToStr(i), 0);
   end;
 
   with gPlayer2Settings, config do
@@ -334,7 +443,12 @@ begin
   gRevertPlayers := config.ReadBool('Game', 'RevertPlayers', False);
   gChatBubble := Min(Max(config.ReadInt('Game', 'ChatBubble', 4), 0), 4);
   gSFSDebug := config.ReadBool('Game', 'SFSDebug', False);
+  wadoptDebug := gSFSDebug;
   gSFSFastMode := config.ReadBool('Game', 'SFSFastMode', False);
+  wadoptFast := gSFSFastMode;
+  e_FastScreenshots := config.ReadBool('Game', 'FastScreenshots', True);
+  gDefaultMegawadStart := config.ReadStr('Game', 'DefaultMegawadStart', DF_Default_Megawad_Start);
+  gBerserkAutoswitch := config.ReadBool('Game', 'BerserkAutoswitching', True);
 
 // Ãåéìïëåé â ñâîåé èãðå
   gcMap := config.ReadStr('GameplayCustom', 'Map', '');
@@ -405,6 +519,7 @@ begin
   NetUpdateRate := Max(0, config.ReadInt('Server', 'UpdateInterval', 0));
   NetRelupdRate := Max(0, config.ReadInt('Server', 'ReliableUpdateInterval', 18));
   NetMasterRate := Max(1, config.ReadInt('Server', 'MasterSyncInterval', 60000));
+  NetForwardPorts := config.ReadBool('Server', 'ForwardPorts', False);
 
 // Êëèåíò
   NetInterpLevel := Max(0, config.ReadInt('Client', 'InterpolationSteps', 2));
@@ -426,10 +541,7 @@ begin
 
   config.Free();
 
-  if gTextureFilter then
-    TEXTUREFILTER := GL_LINEAR
-  else
-    TEXTUREFILTER := GL_NEAREST;
+  //if gTextureFilter then TEXTUREFILTER := GL_LINEAR else TEXTUREFILTER := GL_NEAREST;
 end;
 
 procedure g_Options_Write(FileName: String);
@@ -437,7 +549,7 @@ var
   config: TConfig;
   i: Integer;
 begin
-  e_WriteLog('Writing config', MSG_NOTIFY);
+  e_WriteLog('Writing config', TMsgType.Notify);
 
   config := TConfig.CreateFile(FileName);
 
@@ -459,6 +571,7 @@ begin
   config.WriteBool('Sound', 'MuteInactive', gMuteWhenInactive);
   config.WriteInt('Sound', 'Announcer', gAnnouncer);
   config.WriteBool('Sound', 'SoundEffectsDF', gSoundEffectsDF);
+  config.WriteBool('Sound', 'ChatSounds', gUseChatSounds);
   config.WriteInt('Sound', 'SDLSampleRate', gsSDLSampleRate);
   config.WriteInt('Sound', 'SDLBufferSize', gsSDLBufferSize);
 
@@ -481,6 +594,22 @@ begin
     WriteInt('Player1', 'KeyNextWeapon', KeyNextWeapon);
     WriteInt('Player1', 'KeyPrevWeapon', KeyPrevWeapon);
     WriteInt('Player1', 'KeyOpen', KeyOpen);
+    WriteInt('Player1', 'KeyStrafe', KeyStrafe);
+    for i := 0 to High(KeyWeapon) do
+      WriteInt('Player1', 'KeyWeapon' + IntToStr(i), KeyWeapon[i]);
+
+    WriteInt('Player1', 'KeyRight2', KeyRight2);
+    WriteInt('Player1', 'KeyLeft2', KeyLeft2);
+    WriteInt('Player1', 'KeyUp2', KeyUp2);
+    WriteInt('Player1', 'KeyDown2', KeyDown2);
+    WriteInt('Player1', 'KeyFire2', KeyFire2);
+    WriteInt('Player1', 'KeyJump2', KeyJump2);
+    WriteInt('Player1', 'KeyNextWeapon2', KeyNextWeapon2);
+    WriteInt('Player1', 'KeyPrevWeapon2', KeyPrevWeapon2);
+    WriteInt('Player1', 'KeyOpen2', KeyOpen2);
+    WriteInt('Player1', 'KeyStrafe2', KeyStrafe2);
+    for i := 0 to High(KeyWeapon2) do
+      WriteInt('Player1', 'KeyWeapon2' + IntToStr(i), KeyWeapon2[i]);
 
     WriteStr('Player1', 'Name', Name);
     WriteStr('Player1', 'model', Model);
@@ -501,6 +630,22 @@ begin
     WriteInt('Player2', 'KeyNextWeapon', KeyNextWeapon);
     WriteInt('Player2', 'KeyPrevWeapon', KeyPrevWeapon);
     WriteInt('Player2', 'KeyOpen', KeyOpen);
+    WriteInt('Player2', 'KeyStrafe', KeyStrafe);
+    for i := 0 to High(KeyWeapon) do
+      WriteInt('Player2', 'KeyWeapon' + IntToStr(i), KeyWeapon[i]);
+
+    WriteInt('Player2', 'KeyRight2', KeyRight2);
+    WriteInt('Player2', 'KeyLeft2', KeyLeft2);
+    WriteInt('Player2', 'KeyUp2', KeyUp2);
+    WriteInt('Player2', 'KeyDown2', KeyDown2);
+    WriteInt('Player2', 'KeyFire2', KeyFire2);
+    WriteInt('Player2', 'KeyJump2', KeyJump2);
+    WriteInt('Player2', 'KeyNextWeapon2', KeyNextWeapon2);
+    WriteInt('Player2', 'KeyPrevWeapon2', KeyPrevWeapon2);
+    WriteInt('Player2', 'KeyOpen2', KeyOpen2);
+    WriteInt('Player2', 'KeyStrafe2', KeyStrafe2);
+    for i := 0 to High(KeyWeapon2) do
+      WriteInt('Player2', 'KeyWeapon2' + IntToStr(i), KeyWeapon2[i]);
 
     WriteStr('Player2', 'Name', Name);
     WriteStr('Player2', 'model', Model);
@@ -538,6 +683,9 @@ begin
   config.WriteInt('Game', 'ChatBubble', gChatBubble);
   config.WriteBool('Game', 'SFSDebug', gSFSDebug);
   config.WriteBool('Game', 'SFSFastMode', gSFSFastMode);
+  config.WriteBool('Game', 'FastScreenshots', e_FastScreenshots);
+  config.WriteStr('Game', 'DefaultMegawadStart', gDefaultMegawadStart);
+  config.WriteBool('Game', 'BerserkAutoswitching', gBerserkAutoswitch);
 
   config.WriteStr ('GameplayCustom', 'Map', gcMap);
   config.WriteStr ('GameplayCustom', 'GameMode', gcGameMode);
@@ -573,6 +721,7 @@ begin
   config.WriteBool('Server', 'RCON', NetAllowRCON);
   config.WriteStr ('Server', 'RCONPassword', NetRCONPassword);
   config.WriteBool('Server', 'SyncWithMaster', NetUseMaster);
+  config.WriteBool('Server', 'ForwardPorts', NetForwardPorts);
   config.WriteInt ('Server', 'UpdateInterval', NetUpdateRate);
   config.WriteInt ('Server', 'ReliableUpdateInterval', NetRelupdRate);
   config.WriteInt ('Server', 'MasterSyncInterval', NetMasterRate);
@@ -591,7 +740,7 @@ procedure g_Options_Write_Language(FileName: String);
 var
   config: TConfig;
 begin
-  e_WriteLog('Writing language config', MSG_NOTIFY);
+  e_WriteLog('Writing language config', TMsgType.Notify);
 
   config := TConfig.CreateFile(FileName);
   config.WriteStr('Game', 'Language', gLanguage);
@@ -604,7 +753,7 @@ var
   config: TConfig;
   sW, sH: Integer;
 begin
-  e_WriteLog('Writing resolution to config', MSG_NOTIFY);
+  e_WriteLog('Writing resolution to config', TMsgType.Notify);
 
   config := TConfig.CreateFile(FileName);
 
@@ -618,6 +767,7 @@ begin
       sW := gScreenWidth;
       sH := gScreenHeight;
     end;
+  e_LogWritefln('  (ws=%dx%d) (ss=%dx%d)', [gWinSizeX, gWinSizeY, gScreenWidth, gScreenHeight]);
 
   config.WriteInt('Video', 'ScreenWidth', sW);
   config.WriteInt('Video', 'ScreenHeight', sH);
@@ -634,7 +784,7 @@ procedure g_Options_Write_Gameplay_Custom(FileName: String);
 var
   config: TConfig;
 begin
-  e_WriteLog('Writing custom gameplay config', MSG_NOTIFY);
+  e_WriteLog('Writing custom gameplay config', TMsgType.Notify);
 
   config := TConfig.CreateFile(FileName);
 
@@ -658,7 +808,7 @@ procedure g_Options_Write_Gameplay_Net(FileName: String);
 var
   config: TConfig;
 begin
-  e_WriteLog('Writing network gameplay config', MSG_NOTIFY);
+  e_WriteLog('Writing network gameplay config', TMsgType.Notify);
 
   config := TConfig.CreateFile(FileName);
 
@@ -682,7 +832,7 @@ procedure g_Options_Write_Net_Server(FileName: String);
 var
   config: TConfig;
 begin
-  e_WriteLog('Writing server config', MSG_NOTIFY);
+  e_WriteLog('Writing server config', TMsgType.Notify);
 
   config := TConfig.CreateFile(FileName);
 
@@ -691,6 +841,7 @@ begin
   config.WriteInt ('Server', 'Port', NetPort);
   config.WriteInt ('Server', 'MaxClients', NetMaxClients);
   config.WriteBool('Server', 'SyncWithMaster', NetUseMaster);
+  config.WriteBool('Server', 'ForwardPorts', NetForwardPorts);
 
   config.SaveFile(FileName);
   config.Free();
@@ -700,7 +851,7 @@ procedure g_Options_Write_Net_Client(FileName: String);
 var
   config: TConfig;
 begin
-  e_WriteLog('Writing client config', MSG_NOTIFY);
+  e_WriteLog('Writing client config', TMsgType.Notify);
 
   config := TConfig.CreateFile(FileName);