DEADSOFTWARE

game: do not use absolute path in wad selection widgets (it looks ugly, and [almost...
[d2df-sdl.git] / src / game / g_menu.pas
index 4d2da495216be1983b5f6e38ae4454fc3f7dc6a0..72a5c8ceeb16317cfbaf60d737cd667dcb8726d1 100644 (file)
@@ -45,11 +45,11 @@ uses
   {$INCLUDE ../nogl/noGLuses.inc}
   g_gui, g_textures, e_graphics, g_main, g_window, g_game, g_map,
   g_basic, g_console, g_sound, g_gfx, g_player, g_options, g_weapons,
-  e_log, SysUtils, CONFIG, g_playermodel, DateUtils, sdl2,
+  e_log, SysUtils, CONFIG, g_playermodel, DateUtils,
   MAPDEF, Math, g_saveload,
-  e_texture, g_language,
+  e_texture, g_language, e_res,
   g_net, g_netmsg, g_netmaster, g_items, e_input, g_touch,
-  utils, wadreader;
+  utils, wadreader, g_system;
 
 
 type TYNCallback = procedure (yes:Boolean);
@@ -108,6 +108,7 @@ var
   menu: TGUIMenu;
   i: Integer;
   ovs: Boolean;
+  s: AnsiString;
 begin
   menu := TGUIMenu(g_GUI_GetWindow('OptionsVideoMenu').GetControl('mOptionsVideoMenu'));
 
@@ -118,10 +119,11 @@ begin
 
   ovs := gVSync;
   gVSync := TGUISwitch(menu.GetControl('swVSync')).ItemIndex = 0;
-  if (ovs <> gVSync) then g_SetVSync(gVSync);
+  if (ovs <> gVSync) then
+    sys_EnableVSync(gVSync);
 
   gTextureFilter := TGUISwitch(menu.GetControl('swTextureFilter')).ItemIndex = 0;
-  glLegacyNPOT := not (TGUISwitch(menu.GetControl('swLegacyNPOT')).ItemIndex = 0);
+  glNPOTOverride := not (TGUISwitch(menu.GetControl('swLegacyNPOT')).ItemIndex = 0);
 
   menu := TGUIMenu(g_GUI_GetWindow('OptionsSoundMenu').GetControl('mOptionsSoundMenu'));
 
@@ -373,8 +375,10 @@ begin
 
   if g_Game_IsClient then MC_SEND_PlayerSettings;
 
-  g_Options_Write(GameDir+'/'+CONFIG_FILENAME);
-  g_Console_WriteGameConfig();
+  s := e_GetWriteableDir(ConfigDirs);
+  if s <> '' then
+    g_Options_Write(s + '/' + CONFIG_FILENAME);
+  g_Console_WriteGameConfig;
 end;
 
 procedure ReadOptions();
@@ -397,7 +401,7 @@ begin
     if gVSync then ItemIndex := 0 else ItemIndex := 1;
 
   with TGUISwitch(menu.GetControl('swLegacyNPOT')) do
-    if not glLegacyNPOT then ItemIndex := 0 else ItemIndex := 1;
+    if not glNPOTOverride then ItemIndex := 0 else ItemIndex := 1;
 
   menu := TGUIMenu(g_GUI_GetWindow('OptionsSoundMenu').GetControl('mOptionsSoundMenu'));
 
@@ -646,6 +650,7 @@ var
   Map: String;
   GameMode: Byte;
   Options: LongWord;
+  s: AnsiString;
 begin
   with TGUIMenu(g_ActiveWindow.GetControl('mCustomGameMenu')) do
   begin
@@ -694,7 +699,9 @@ begin
     gcMap := Map;
   end;
 
-  g_Options_Write_Gameplay_Custom(GameDir+'/'+CONFIG_FILENAME);
+  s := e_GetWriteableDir(ConfigDirs);
+  if s <> '' then
+    g_Options_Write_Gameplay_Custom(s + '/' + CONFIG_FILENAME);
 
   g_Game_StartCustom(Map, GameMode, gcTimeLimit, gcGoalLimit,
                      gcMaxLives, Options, gcPlayers);
@@ -706,6 +713,7 @@ var
   Map: String;
   GameMode: Byte;
   Options: LongWord;
+  s: AnsiString;
 begin
   with TGUIMenu(g_ActiveWindow.GetControl('mNetServerMenu')) do
   begin
@@ -760,8 +768,12 @@ begin
     NetUseMaster := TGUISwitch(GetControl('swUseMaster')).ItemIndex = 0;
   end;
 
-  g_Options_Write_Net_Server(GameDir+'/'+CONFIG_FILENAME);
-  g_Options_Write_Gameplay_Net(GameDir+'/'+CONFIG_FILENAME);
+  s := e_GetWriteableDir(ConfigDirs);
+  if s <> '' then
+  begin
+    g_Options_Write_Net_Server(s + '/' + CONFIG_FILENAME);
+    g_Options_Write_Gameplay_Net(s + '/' + CONFIG_FILENAME)
+  end;
 
   g_Game_StartServer(Map, GameMode, gnTimeLimit, gnGoalLimit, gnMaxLives,
                      Options, gnPlayers, 0, NetPort);
@@ -770,6 +782,7 @@ end;
 procedure ProcConnectNetGame();
 var
   PW: String;
+  s: AnsiString;
 begin
   with TGUIMenu(g_ActiveWindow.GetControl('mNetClientMenu')) do
   begin
@@ -778,13 +791,16 @@ begin
     PW := TGUIEdit(GetControl('edPW')).Text;
   end;
 
-  g_Options_Write_Net_Client(GameDir+'/'+CONFIG_FILENAME);
+  s := e_GetWriteableDir(ConfigDirs);
+  if s <> '' then
+    g_Options_Write_Net_Client(s + '/' + CONFIG_FILENAME);
   g_Game_StartClient(NetClientIP, NetClientPort, PW);
 end;
 
 procedure ProcEnterPassword();
 var
   PW: string;
+  s: AnsiString;
 begin
   with TGUIMenu(g_ActiveWindow.GetControl('mClientPasswordMenu')) do
   begin
@@ -793,7 +809,9 @@ begin
     PW := TGUIEdit(GetControl('edPW')).Text;
   end;
 
-  g_Options_Write_Net_Client(GameDir+'/'+CONFIG_FILENAME);
+  s := e_GetWriteableDir(ConfigDirs);
+  if s <> '' then
+    g_Options_Write_Net_Client(s + '/' + CONFIG_FILENAME);
   g_Game_StartClient(NetClientIP, NetClientPort, PW);
 end;
 
@@ -810,7 +828,7 @@ begin
       NetInitDone := True;
   end;
 
-  g_Net_Slist_Set(NetSlistIP, NetSlistPort);
+  g_Net_Slist_Set(NetSlistIP, NetSlistPort, NetSlistList);
 
   gState := STATE_SLIST;
   g_ActiveWindow := nil;
@@ -818,7 +836,7 @@ begin
   slWaitStr := _lc[I_NET_SLIST_WAIT];
 
   g_Game_Draw;
-  ReDrawWindow;
+  sys_Repaint;
 
   slReturnPressed := True;
   if g_Net_Slist_Fetch(slCurrent) then
@@ -839,9 +857,10 @@ var
 begin
   with TGUIMenu(g_ActiveWindow.GetControl('mCampaignMenu')) do
   begin
-    WAD := ExtractRelativePath(MapsDir, TGUIFileListBox(GetControl('lsWAD')).SelectedItem());
+    WAD := TGUIFileListBox(GetControl('lsWAD')).SelectedItem();
     TwoPlayers := TGUISwitch(GetControl('swPlayers')).ItemIndex = 1;
   end;
+  WAD := e_FindWadRel(MegawadDirs, WAD);
 
   if TwoPlayers then
     n := 2
@@ -1259,14 +1278,26 @@ begin
   end;
 end;
 
-procedure ProcSingle1Player();
+procedure ProcSinglePlayer (n: Integer);
+  var wad, map: AnsiString;
 begin
-  g_Game_StartSingle(gDefaultMegawadStart, False, 1);
+  wad := g_ExtractWadName(gDefaultMegawadStart);
+  map := g_ExtractFilePathName(gDefaultMegawadStart);
+  if e_FindResource(AllMapDirs, wad) then
+  begin
+    wad := ExpandFileName(wad);
+    g_Game_StartSingle(wad + ':\' + map, False, n);
+  end;
 end;
 
-procedure ProcSingle2Players();
+procedure ProcSingle1Player;
 begin
-  g_Game_StartSingle(gDefaultMegawadStart, True, 2);
+  ProcSinglePlayer(1)
+end;
+
+procedure ProcSingle2Players;
+begin
+  ProcSinglePlayer(2)
 end;
 
 procedure ProcSelectMapMenu();
@@ -1320,13 +1351,15 @@ var
 begin
   with TGUIMenu(g_ActiveWindow.GetControl('mSelectMapMenu')) do
   begin
-    wad := ExtractRelativePath(MapsDir, TGUIFileListBox(GetControl('lsMapWAD')).SelectedItem());
+    wad := TGUIFileListBox(GetControl('lsMapWAD')).SelectedItem();
     map := TGUIListBox(GetControl('lsMapRes')).SelectedItem();
   end;
 
   if (wad = '') or (map = '') then
     Exit;
 
+  wad := e_FindWadRel(MapDirs, WAD);
+
   res := wad+':\'+map;
 
   TGUILabel(TGUIMenu(g_GUI_GetWindow('CustomGameMenu').GetControl('mCustomGameMenu')).GetControl('lbMap')).Text := res;
@@ -1622,7 +1655,8 @@ begin
   if yes then gExit := EXIT_SIMPLE else g_GUI_HideWindow;
 end;
 
-procedure ProcSetRussianLanguage();
+procedure ProcSetRussianLanguage;
+  var s: AnsiString;
 begin
   if gLanguage <> LANGUAGE_RUSSIAN then
   begin
@@ -1630,14 +1664,17 @@ begin
     gLanguageChange := True;
     gAskLanguage := False;
 
-    g_Options_Write_Language(GameDir+'/'+CONFIG_FILENAME);
+    s := e_GetWriteableDir(ConfigDirs);
+    if s <> '' then
+      g_Options_Write_Language(s + '/' + CONFIG_FILENAME);
 
   // Ñîõðàíÿåì èçìåíåíèÿ âñåõ íàñòðîåê:
     ProcApplyOptions();
   end;
 end;
 
-procedure ProcSetEnglishLanguage();
+procedure ProcSetEnglishLanguage;
+  var s: AnsiString;
 begin
   if gLanguage <> LANGUAGE_ENGLISH then
   begin
@@ -1645,7 +1682,9 @@ begin
     gLanguageChange := True;
     gAskLanguage := False;
 
-    g_Options_Write_Language(GameDir+'/'+CONFIG_FILENAME);
+    s := e_GetWriteableDir(ConfigDirs);
+    if s <> '' then
+      g_Options_Write_Language(s + '/' + CONFIG_FILENAME);
 
   // Ñîõðàíÿåì èçìåíåíèÿ âñåõ íàñòðîåê:
     ProcApplyOptions();
@@ -1824,7 +1863,6 @@ procedure ProcVideoOptionsRes();
 var
   menu: TGUIMenu;
   list: SSArray;
-  SR: DWORD;
 begin
   menu := TGUIMenu(g_GUI_GetWindow('OptionsVideoResMenu').GetControl('mOptionsVideoResMenu'));
 
@@ -1835,15 +1873,16 @@ begin
 
   with TGUIListBox(menu.GetControl('lsResolution')) do
   begin
-    list := GetDisplayModes(gBPP, SR);
-
+    list := sys_GetDispalyModes(gBPP);
     if list <> nil then
-      begin
-        Items := list;
-        ItemIndex := SR;
-      end
+    begin
+      Items := list;
+      ItemIndex := Length(list)
+    end
     else
-      Clear();
+    begin
+      Clear
+    end
   end;
 
   with TGUISwitch(menu.GetControl('swFullScreen')) do
@@ -1882,22 +1921,28 @@ begin
   ProcApplyOptions();
 end;
 
-procedure ProcSetFirstRussianLanguage();
+procedure ProcSetFirstRussianLanguage;
+  var s: AnsiString;
 begin
   gLanguage := LANGUAGE_RUSSIAN;
   gLanguageChange := True;
   gAskLanguage := False;
 
-  g_Options_Write_Language(GameDir+'/'+CONFIG_FILENAME);
+  s := e_GetWriteableDir(ConfigDirs);
+  if s <> '' then
+    g_Options_Write_Language(s + '/' + CONFIG_FILENAME)
 end;
 
-procedure ProcSetFirstEnglishLanguage();
+procedure ProcSetFirstEnglishLanguage;
+  var s: AnsiString;
 begin
   gLanguage := LANGUAGE_ENGLISH;
   gLanguageChange := True;
   gAskLanguage := False;
 
-  g_Options_Write_Language(GameDir+'/'+CONFIG_FILENAME);
+  s := e_GetWriteableDir(ConfigDirs);
+  if s <> '' then
+    g_Options_Write_Language(s + '/' + CONFIG_FILENAME)
 end;
 
 procedure ProcRecallAddress();
@@ -2436,7 +2481,7 @@ begin
       Sort := True;
       Dirs := True;
       FileMask := '*.wad|*.pk3|*.zip|*.dfz';
-      SetBase(MapsDir+'megawads/');
+      SetBase(MegawadDirs);
     end;
 
     with AddLabel(_lc[I_MENU_MAP_NAME]) do
@@ -2491,7 +2536,7 @@ begin
       Sort := True;
       Dirs := True;
       FileMask := '*.wad|*.pk3|*.zip|*.dfz';
-      SetBase(MapsDir);
+      SetBase(MapDirs);
     end;
     with AddList(_lc[I_MENU_MAP_RESOURCE], 12, 4) do
     begin
@@ -2898,12 +2943,11 @@ begin
   begin
     Name := 'mOptionsControlsJoystickMenu';
     for i := 0 to e_MaxJoys - 1 do
-      if e_JoystickAvailable[i] then
-        with AddScroll(Format(_lc[I_MENU_CONTROL_DEADZONE], [i + 1])) do
-        begin
-          Name := 'scDeadzone' + IntToStr(i);
-          Max := 20
-        end
+      with AddScroll(Format(_lc[I_MENU_CONTROL_DEADZONE], [i + 1])) do
+      begin
+        Name := 'scDeadzone' + IntToStr(i);
+        Max := 20
+      end
   end;
   Menu.DefControl := 'mOptionsControlsJoystickMenu';
   g_GUI_AddWindow(Menu);