DEADSOFTWARE

net: it is now possible to use more than one master (use "List=host:port,host:port...
[d2df-sdl.git] / src / game / g_options.pas
index 506fc186424753429b21151925830bb1a0b6376d..a80d682cc3fdfcc5764377011b4a3d9c2821afe7 100644 (file)
@@ -2,8 +2,7 @@
  *
  * 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.
+ * the Free Software Foundation, version 3 of the License ONLY.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,46 +20,6 @@ interface
 uses
   g_language, g_weapons;
 
-type
-  TPlayerControl = record
-    KeyRight:      Word;
-    KeyLeft:       Word;
-    KeyUp:         Word;
-    KeyDown:       Word;
-    KeyFire:       Word;
-    KeyJump:       Word;
-    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
-    TakeScreenshot: Word;
-    Stat:           Word;
-    Chat:           Word;
-    TeamChat:       Word;
-  end;
-
-  TControls = record
-    GameControls: TGameControls;
-    P1Control:    TPlayerControl;
-    P2Control:    TPlayerControl;
-  end;
-
 function GenPlayerName (n: Integer): String;
 
 procedure g_Options_SetDefault();
@@ -76,7 +35,7 @@ procedure g_Options_Write_Net_Client(FileName: String);
 const DF_Default_Megawad_Start = 'megawads/DOOM2D.WAD:\MAP01';
 
 var
-  gGameControls: TControls;
+//  gGameControls: TControls;
   gScreenWidth: Word;
   gScreenHeight: Word;
   gWinRealPosX: Integer;
@@ -137,9 +96,12 @@ implementation
 
 uses
   {$INCLUDE ../nogl/noGLuses.inc}
-  e_log, e_input, g_window, g_sound, g_gfx, g_player, Math,
+  {$IFDEF USE_SDL2}
+    SDL2,
+  {$ENDIF}
+  e_log, e_input, g_console, g_window, g_sound, g_gfx, g_player, Math,
   g_map, g_net, g_netmaster, SysUtils, CONFIG, g_game, g_main, e_texture,
-  g_items, wadreader, e_graphics, g_touch, SDL2, envvars;
+  g_items, wadreader, e_graphics, g_touch, envvars;
 
   var
     machine: Integer;
@@ -148,23 +110,35 @@ uses
   begin
     ASSERT(n >= 1);
     Result := GetUserName;
-    if Result = '' then Result := 'Player' + IntToStr(machine MOD 10000);
-    if n > 1 then Result := Copy(Result, 1, 10) + (' ' + IntToStr(n))
+    if Result = '' then
+      Result := 'Player' + IntToStr(machine MOD 10000);
+    if n = 1 then
+      Result := Copy(Result, 1, 12) + ' '
+    else
+      Result := Copy(Result, 1, 10) + ' ' + IntToStr(n)
   end;
 
+{$IFDEF USE_SDL2}
 procedure g_Options_SetDefaultVideo;
 var
   target, closest, display: TSDL_DisplayMode;
   percentage: Integer;
 begin
   (* Display 0 = Primary display *)
-  SDL_GetDesktopDisplayMode(0, @display);
-  {$IF DEFINED(ANDROID)}
+  gScreenWidth := 640;
+  gScreenHeight := 480;
+  //gBPP := SDL_BITSPERPIXEL(dispaly.format);
+  gBPP := 32;
+  {$IFDEF ANDROID}
+    gFullScreen := True; (* rotation not allowed? *)
+  {$ELSE}
+    gFullScreen := False;
+  {$ENDIF}
+  if SDL_GetDesktopDisplayMode(0, @display) = 0 then
+  begin
+  {$IFDEF ANDROID}
     gScreenWidth := display.w;
     gScreenHeight := display.h;
-    //gBPP := SDL_BITSPERPIXEL(dispaly.format);
-    gBPP := 32;
-    gFullScreen := True; (* rotation not allowed? *)
   {$ELSE}
     (* Window must be smaller than display *)
     closest.w := display.w;
@@ -189,9 +163,12 @@ begin
     gScreenWidth := closest.w;
     gScreenHeight := closest.h;
     //gBPP := SDL_BITSPERPIXEL(closest.format); (* Resolution list didn't work for some reason *)
-    gBPP := 32;
-    gFullScreen := False;
   {$ENDIF}
+  end
+  else
+  begin
+    e_LogWritefln('SDL: Failed to get desktop display mode: %s', [SDL_GetError])
+  end;
   (* Must be positioned on primary display *)
   gWinRealPosX := SDL_WINDOWPOS_CENTERED;
   gWinRealPosY := SDL_WINDOWPOS_CENTERED;
@@ -200,7 +177,25 @@ begin
   gTextureFilter := True;
   glLegacyNPOT := False;
   e_LogWriteLn('g_Options_SetDefaultVideo: w = ' + IntToStr(gScreenWidth) + ' h = ' + IntToStr(gScreenHeight));
+  g_Console_ResetBinds;
+end;
+{$ELSE}
+procedure g_Options_SetDefaultVideo;
+begin
+  gScreenWidth := 640;
+  gScreenHeight := 480;
+  gBPP := 32;
+  gFullScreen := False;
+  gWinRealPosX := 0;
+  gWinRealPosY := 0;
+  gWinMaximized := False;
+  gVSync := True;
+  gTextureFilter := True;
+  glLegacyNPOT := False;
+  e_LogWriteLn('g_Options_SetDefaultVideo: w = ' + IntToStr(gScreenWidth) + ' h = ' + IntToStr(gScreenHeight));
+  g_Console_ResetBinds;
 end;
+{$ENDIF}
 
 procedure g_Options_SetDefault();
 var
@@ -220,56 +215,6 @@ begin
 
   g_Sound_SetupAllVolumes(gSoundLevel, gMusicLevel);
 
-  (* section GameControls *)
-  with gGameControls.GameControls do
-  begin
-    TakeScreenshot := SDL_SCANCODE_F12;
-    Stat := SDL_SCANCODE_TAB;
-    Chat := SDL_SCANCODE_T;
-    TeamChat := SDL_SCANCODE_Y;
-  end;
-
-  (* section Player1 *)
-  with gGameControls.P1Control do
-  begin
-    KeyRight := SDL_SCANCODE_KP_6;
-    KeyLeft := SDL_SCANCODE_KP_4;
-    KeyUp := SDL_SCANCODE_KP_8;
-    KeyDown := SDL_SCANCODE_KP_5;
-    KeyFire := SDL_SCANCODE_SLASH;
-    KeyJump := SDL_SCANCODE_RCTRL;
-    KeyNextWeapon := SDL_SCANCODE_KP_9;
-    KeyPrevWeapon := SDL_SCANCODE_KP_7;
-    KeyOpen := SDL_SCANCODE_RSHIFT;
-    KeyStrafe := SDL_SCANCODE_PERIOD;
-
-    for i := 0 to 9 do
-    begin
-      KeyWeapon[i] := SDL_SCANCODE_1 + i (* 1, ..., 9, 0 *)
-    end;
-    KeyWeapon[10] := SDL_SCANCODE_MINUS;
-    for i := 11 to High(KeyWeapon) do
-    begin
-      KeyWeapon[i] := 0
-    end;
-
-    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
-    begin
-      KeyWeapon2[i] := VK_0 + i
-    end;
-  end;
-
   with gPlayer1Settings do
   begin
     Name := GenPlayerName(1);
@@ -280,41 +225,6 @@ begin
     Team := TEAM_RED;
   end;
 
-  (* section Player2 *)
-  with gGameControls.P2Control do
-  begin
-    KeyRight := SDL_SCANCODE_D;
-    KeyLeft := SDL_SCANCODE_A;
-    KeyUp := SDL_SCANCODE_W;
-    KeyDown := SDL_SCANCODE_S;
-    KeyFire := SDL_SCANCODE_G;
-    KeyJump := SDL_SCANCODE_SPACE;
-    KeyNextWeapon := SDL_SCANCODE_E;
-    KeyPrevWeapon := SDL_SCANCODE_Q;
-    KeyOpen := SDL_SCANCODE_F;
-    KeyStrafe := SDL_SCANCODE_LSHIFT;
-    for i := 0 to High(KeyWeapon) do
-    begin
-      KeyWeapon[i] := 0
-    end;
-
-    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
-    begin
-      KeyWeapon2[i] := 0;
-    end
-  end;
-
   with gPlayer2Settings do
   begin
     Name := GenPlayerName(2);
@@ -331,12 +241,6 @@ begin
     e_JoystickDeadzones[i] := 8192
   end;
 
-  (* section Touch *)
-  g_touch_size := 1.0;
-  g_touch_fire := True;
-  g_touch_offset := 50;
-  g_touch_alt := False;
-  
   (* section Game *)
   g_GFX_SetMax(2000);
   g_Shells_SetMax(300);
@@ -392,7 +296,7 @@ begin
   (* section MasterServer *)
   NetSlistIP := 'mpms.doom2d.org';
   NetSlistPort := 25665;
-  g_Net_Slist_Set(NetSlistIP, NetSlistPort);
+  g_Net_Slist_Set(NetSlistIP, NetSlistPort, NetSlistList);
 
   (* section Server *)
   NetServerName := 'Unnamed Server';
@@ -490,51 +394,6 @@ begin
   ReadInteger(gsSDLSampleRate, 'SDLSampleRate', 11025, 96000);
   ReadInteger(gsSDLBufferSize, 'SDLBufferSize', 64, 16384);
 
-  section := 'GameControls';
-  with gGameControls.GameControls do
-  begin
-    ReadInteger(TakeScreenshot, 'TakeScreenshot');
-    ReadInteger(Stat, 'Stat');
-    ReadInteger(Chat, 'Chat');
-    ReadInteger(TeamChat, 'TeamChat');
-  end;
-
-  section := 'Player1';
-  with gGameControls.P1Control do
-  begin
-    ReadInteger(KeyRight, 'KeyRight');
-    ReadInteger(KeyLeft, 'KeyLeft');
-    ReadInteger(KeyUp, 'KeyUp');
-    ReadInteger(KeyDown, 'KeyDown');
-    ReadInteger(KeyFire, 'KeyFire');
-    ReadInteger(KeyJump, 'KeyJump');
-    ReadInteger(KeyNextWeapon, 'KeyNextWeapon');
-    ReadInteger(KeyPrevWeapon, 'KeyPrevWeapon');
-    ReadInteger(KeyOpen, 'KeyOpen');
-    ReadInteger(KeyStrafe, 'KeyStrafe');
-
-    for i := 0 to High(KeyWeapon) do
-    begin
-      ReadInteger(KeyWeapon[i], 'KeyWeapon' + IntToStr(i))
-    end;
-
-    ReadInteger(KeyRight2, 'KeyRight2');
-    ReadInteger(KeyLeft2, 'KeyLeft2');
-    ReadInteger(KeyUp2, 'KeyUp2');
-    ReadInteger(KeyDown2, 'KeyDown2');
-    ReadInteger(KeyFire2, 'KeyFire2');
-    ReadInteger(KeyJump2, 'KeyJump2');
-    ReadInteger(KeyNextWeapon2, 'KeyNextWeapon2');
-    ReadInteger(KeyPrevWeapon2, 'KeyPrevWeapon2');
-    ReadInteger(KeyOpen2, 'KeyOpen2');
-    ReadInteger(KeyStrafe2, 'KeyStrafe2');
-
-    for i := 0 to High(KeyWeapon2) do
-    begin
-      ReadInteger(KeyWeapon2[i], 'KeyWeapon2' + IntToStr(i))
-    end;
-  end;
-
   section := 'Player1';
   with gPlayer1Settings do
   begin
@@ -548,42 +407,6 @@ begin
       Team := TEAM_RED;
   end;
 
-  section := 'Player2';
-  with gGameControls.P2Control do
-  begin
-    ReadInteger(KeyRight, 'KeyRight');
-    ReadInteger(KeyLeft, 'KeyLeft');
-    ReadInteger(KeyUp, 'KeyUp');
-    ReadInteger(KeyDown, 'KeyDown');
-    ReadInteger(KeyFire, 'KeyFire');
-    ReadInteger(KeyJump, 'KeyJump');
-    ReadInteger(KeyNextWeapon, 'KeyNextWeapon');
-    ReadInteger(KeyPrevWeapon, 'KeyPrevWeapon');
-    ReadInteger(KeyOpen, 'KeyOpen');
-    ReadInteger(KeyStrafe, 'KeyStrafe');
-
-    for i := 0 to High(KeyWeapon) do
-    begin
-      ReadInteger(KeyWeapon[i], 'KeyWeapon' + IntToStr(i))
-    end;
-
-    ReadInteger(KeyRight2, 'KeyRight2');
-    ReadInteger(KeyLeft2, 'KeyLeft2');
-    ReadInteger(KeyUp2, 'KeyUp2');
-    ReadInteger(KeyDown2, 'KeyDown2');
-    ReadInteger(KeyFire2, 'KeyFire2');
-    ReadInteger(KeyJump2, 'KeyJump2');
-    ReadInteger(KeyNextWeapon2, 'KeyNextWeapon2');
-    ReadInteger(KeyPrevWeapon2, 'KeyPrevWeapon2');
-    ReadInteger(KeyOpen2, 'KeyOpen2');
-    ReadInteger(KeyStrafe2, 'KeyStrafe2');
-
-    for i := 0 to High(KeyWeapon2) do
-    begin
-      ReadInteger(KeyWeapon2[i], 'KeyWeapon2' + IntToStr(i))
-    end;
-  end;
-
   section := 'Player2';
   with gPlayer2Settings do
   begin
@@ -603,17 +426,11 @@ begin
     ReadInteger(e_JoystickDeadzones[i], 'Deadzone' + IntToStr(i))
   end;
 
-  section := 'Touch';
-  i := Trunc(g_touch_size * 10); ReadInteger(i, 'Size', 0); g_touch_size := i / 10;
-  ReadBoolean(g_touch_fire, 'Fire');
-  i := Round(g_touch_offset); ReadInteger(i, 'Offset', 0, 100); g_touch_offset := i;
-  ReadBoolean(g_touch_alt, 'Alt');
-
   section := 'Game';
-  ReadInteger(i, 'MaxParticles', 1000, 50000); g_GFX_SetMax(i);
-  ReadInteger(i, 'MaxShells', 300, 600); g_Shells_SetMax(i);
-  ReadInteger(i, 'MaxGibs', 150, 500); g_Gibs_SetMax(i);
-  ReadInteger(i, 'MaxCorpses', 20, 100); g_Corpses_SetMax(i);
+  ReadInteger(i, 'MaxParticles', 0, 50000); g_GFX_SetMax(i);
+  ReadInteger(i, 'MaxShells', 0, 600); g_Shells_SetMax(i);
+  ReadInteger(i, 'MaxGibs', 0, 500); g_Gibs_SetMax(i);
+  ReadInteger(i, 'MaxCorpses', 0, 100); g_Corpses_SetMax(i);
   ReadInteger(i, 'GibsCount');
   case i of
     0: gGibsCount := 0;
@@ -701,7 +518,8 @@ begin
   section := 'MasterServer';
   ReadString(NetSlistIP, 'IP');
   ReadInteger(NetSlistPort, 'Port', 0, 65535);
-  g_Net_Slist_Set(NetSlistIP, NetSlistPort);
+  ReadString(NetSlistList, 'List');
+  g_Net_Slist_Set(NetSlistIP, NetSlistPort, NetSlistList);
 
   section := 'Server';
   ReadString(NetServerName, 'Name');
@@ -759,42 +577,8 @@ begin
   config.WriteInt('Sound', 'SDLSampleRate', gsSDLSampleRate);
   config.WriteInt('Sound', 'SDLBufferSize', gsSDLBufferSize);
 
-  with config, gGameControls.GameControls do
-  begin
-    WriteInt('GameControls', 'TakeScreenshot', TakeScreenshot);
-    WriteInt('GameControls', 'Stat', Stat);
-    WriteInt('GameControls', 'Chat', Chat);
-    WriteInt('GameControls', 'TeamChat', TeamChat);
-  end;
-
-  with config, gGameControls.P1Control, gPlayer1Settings do
+  with config, gPlayer1Settings do
   begin
-    WriteInt('Player1', 'KeyRight', KeyRight);
-    WriteInt('Player1', 'KeyLeft', KeyLeft);
-    WriteInt('Player1', 'KeyUp', KeyUp);
-    WriteInt('Player1', 'KeyDown', KeyDown);
-    WriteInt('Player1', 'KeyFire', KeyFire);
-    WriteInt('Player1', 'KeyJump', KeyJump);
-    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);
     WriteInt('Player1', 'red', Color.R);
@@ -803,34 +587,8 @@ begin
     WriteInt('Player1', 'team', Team);
   end;
 
-  with config, gGameControls.P2Control, gPlayer2Settings do
+  with config, gPlayer2Settings do
   begin
-    WriteInt('Player2', 'KeyRight', KeyRight);
-    WriteInt('Player2', 'KeyLeft', KeyLeft);
-    WriteInt('Player2', 'KeyUp', KeyUp);
-    WriteInt('Player2', 'KeyDown', KeyDown);
-    WriteInt('Player2', 'KeyFire', KeyFire);
-    WriteInt('Player2', 'KeyJump', KeyJump);
-    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);
     WriteInt('Player2', 'red', Color.R);
@@ -842,11 +600,6 @@ begin
   for i := 0 to e_MaxJoys-1 do
     config.WriteInt('Joysticks', 'Deadzone' + IntToStr(i), e_JoystickDeadzones[i]);
 
-  config.WriteInt('Touch', 'Size', Round(g_touch_size * 10));
-  config.WriteBool('Touch', 'Fire', g_touch_fire);
-  config.WriteInt('Touch', 'Offset', Round(g_touch_offset));
-  config.WriteBool('Touch', 'Alt', g_touch_alt);
-
   with config do
     case gGibsCount of
       0: config.WriteInt('Game', 'GibsCount', 0);
@@ -903,6 +656,7 @@ begin
 
   config.WriteStr('MasterServer', 'IP', NetSlistIP);
   config.WriteInt('MasterServer', 'Port', NetSlistPort);
+  config.WriteStr('MasterServer', 'List', NetSlistList);
 
   config.WriteStr ('Server', 'Name', NetServerName);
   config.WriteStr ('Server', 'Password', NetPassword);
@@ -966,6 +720,9 @@ begin
   config.WriteBool('Video', 'Fullscreen', gFullscreen);
   config.WriteBool('Video', 'Maximized', gWinMaximized);
 
+  config.WriteStr('Player1', 'Name', gPlayer1Settings.Name);
+  config.WriteStr('Player2', 'Name', gPlayer2Settings.Name);
+
   config.SaveFile(FileName);
   config.Free();
 end;
@@ -1053,5 +810,6 @@ begin
 end;
 
 initialization
+  Randomize;
   machine := Random(10000)
 end.