DEADSOFTWARE

set vsync after window creation (it should work better this way)
[d2df-sdl.git] / src / game / g_menu.pas
index 60750aa8aa5b133a4f4441624e7f5821f63deaad..0a9cc7f395614e11759408dd027d5807d0298784 100644 (file)
@@ -1,4 +1,4 @@
-(* Copyright (C)  DooM 2D:Forever Developers
+(* 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
@@ -26,7 +26,7 @@ procedure LoadFont(txtres, fntres: string; var FontID: DWORD);
 procedure g_Menu_AskLanguage();
 
 procedure g_Menu_Show_SaveMenu();
-procedure g_Menu_Show_LoadMenu();
+procedure g_Menu_Show_LoadMenu(standalone: Boolean=false);
 procedure g_Menu_Show_GameSetGame();
 procedure g_Menu_Show_OptionsVideo();
 procedure g_Menu_Show_OptionsSound();
@@ -44,10 +44,11 @@ implementation
 uses
   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,
-  MAPDEF, wadreader, Math, g_saveload,
+  e_log, SysUtils, CONFIG, g_playermodel, DateUtils, sdl2,
+  MAPDEF, Math, g_saveload,
   e_texture, GL, GLExt, g_language,
-  g_net, g_netmsg, g_netmaster, g_items, e_input;
+  g_net, g_netmsg, g_netmaster, g_items, e_input,
+  utils, wadreader;
 
 
 type TYNCallback = procedure (yes:Boolean);
@@ -105,6 +106,7 @@ procedure ProcApplyOptions();
 var
   menu: TGUIMenu;
   i: Integer;
+  ovs: Boolean;
 begin
   menu := TGUIMenu(g_GUI_GetWindow('OptionsVideoMenu').GetControl('mOptionsVideoMenu'));
 
@@ -112,7 +114,11 @@ begin
     gBPP := 16
   else
     gBPP := 32;
+
+  ovs := gVSync;
   gVSync := TGUISwitch(menu.GetControl('swVSync')).ItemIndex = 0;
+  if (ovs <> gVSync) then g_SetVSync(gVSync);
+
   gTextureFilter := TGUISwitch(menu.GetControl('swTextureFilter')).ItemIndex = 0;
   glLegacyNPOT := not (TGUISwitch(menu.GetControl('swLegacyNPOT')).ItemIndex = 0);
 
@@ -127,6 +133,7 @@ begin
   gMuteWhenInactive := TGUISwitch(menu.GetControl('swInactiveSounds')).ItemIndex = 1;
   gAnnouncer := TGUISwitch(menu.GetControl('swAnnouncer')).ItemIndex;
   gSoundEffectsDF := TGUISwitch(menu.GetControl('swSoundEffects')).ItemIndex = 1;
+  gUseChatSounds := TGUISwitch(menu.GetControl('swChatSpeech')).ItemIndex = 0;
 
   menu := TGUIMenu(g_GUI_GetWindow('OptionsGameMenu').GetControl('mOptionsGameMenu'));
 
@@ -345,6 +352,12 @@ begin
     else
       ItemIndex := 0;
 
+  with TGUISwitch(menu.GetControl('swChatSpeech')) do
+    if gUseChatSounds then
+      ItemIndex := 0
+    else
+      ItemIndex := 1;
+
   menu := TGUIMenu(g_GUI_GetWindow('OptionsControlsP1Menu').GetControl('mOptionsControlsP1Menu'));
   with menu, gGameControls.P1Control do
   begin
@@ -506,12 +519,14 @@ end;
 
 procedure ProcSwitchMonstersCustom(Sender: TGUIControl);
 begin
-    // don't turn off monsters in DM
+  // don't turn off monsters in DM
+  {
   with TGUIMenu(g_ActiveWindow.GetControl('mCustomGameMenu')) do
     if TGUISwitch(GetControl('swGameMode')).GetText <> _lc[I_MENU_GAME_TYPE_CTF] then
       TGUISwitch(GetControl('swMonsters')).ItemIndex := 0
     else
       TGUISwitch(GetControl('swMonsters')).ItemIndex := 1;
+  }
   {
     if TGUISwitch(GetControl('swGameMode')).GetText = _lc[I_MENU_GAME_TYPE_COOP] then
       TGUISwitch(GetControl('swMonsters')).ItemIndex := 0
@@ -523,11 +538,13 @@ end;
 procedure ProcSwitchMonstersNet(Sender: TGUIControl);
 begin
   // don't turn off monsters in DM
+  {
   with TGUIMenu(g_ActiveWindow.GetControl('mNetServerMenu')) do
     if TGUISwitch(GetControl('swGameMode')).GetText <> _lc[I_MENU_GAME_TYPE_CTF] then
       TGUISwitch(GetControl('swMonsters')).ItemIndex := 0
     else
       TGUISwitch(GetControl('swMonsters')).ItemIndex := 1;
+  }
     {
     if TGUISwitch(GetControl('swGameMode')).GetText = _lc[I_MENU_GAME_TYPE_COOP] then
       TGUISwitch(GetControl('swMonsters')).ItemIndex := 0
@@ -547,7 +564,7 @@ begin
     Map := TGUILabel(GetControl('lbMap')).Text;
     if Map = '' then
       Exit;
-    if Pos(':\', Map) = 0 then
+    if not isWadPath(Map) then
       Exit;
 
     GameMode := TGUISwitch(GetControl('swGameMode')).ItemIndex+1;
@@ -607,7 +624,7 @@ begin
     Map := TGUILabel(GetControl('lbMap')).Text;
     if Map = '' then
       Exit;
-    if Pos(':\', Map) = 0 then
+    if not isWadPath(Map) then
       Exit;
 
     GameMode := TGUISwitch(GetControl('swGameMode')).ItemIndex+1;
@@ -785,7 +802,7 @@ end;
 procedure ProcSelectWAD(Sender: TGUIControl);
 var
   wad: String;
-  list: SArray;
+  list: SSArray;
 begin
   with TGUIMenu(g_GUI_GetWindow('SelectMapMenu').GetControl('mSelectMapMenu')) do
   begin
@@ -969,7 +986,7 @@ end;
 
 procedure MenuLoadData();
 begin
-  e_WriteLog('Loading menu data...', MSG_NOTIFY);
+  e_WriteLog('Loading menu data...', TMsgType.Notify);
 
   g_Texture_CreateWADEx('MAINMENU_MARKER1', GameWAD+':TEXTURES\MARKER1');
   g_Texture_CreateWADEx('MAINMENU_MARKER2', GameWAD+':TEXTURES\MARKER2');
@@ -1095,19 +1112,28 @@ end;
 procedure ProcLoadMenu();
 var
   a: Integer;
+  valid: Boolean;
 begin
   for a := 1 to 8 do
-    TGUIEdit(TGUIMenu(g_GUI_GetWindow('LoadMenu').GetControl('mmLoadMenu')).GetControl('edSlot'+IntToStr(a))).Text :=
-    g_GetSaveName(a);
+  begin
+    TGUIEdit(TGUIMenu(g_GUI_GetWindow('LoadMenu').GetControl('mmLoadMenu')).GetControl('edSlot'+IntToStr(a))).Text := g_GetSaveName(a, valid);
+    TGUIEdit(TGUIMenu(g_GUI_GetWindow('LoadMenu').GetControl('mmLoadMenu')).GetControl('edSlot'+IntToStr(a))).Invalid := not valid;
+    //TGUIMenu(g_GUI_GetWindow('LoadMenu').GetControl('mmLoadMenu')).GetControl('edSlot'+IntToStr(a)).Enabled := valid;
+  end;
 end;
 
 procedure ProcSaveMenu();
 var
   a: Integer;
+  valid: Boolean;
+  name: AnsiString;
 begin
   for a := 1 to 8 do
-    TGUIEdit(TGUIMenu(g_GUI_GetWindow('SaveMenu').GetControl('mmSaveMenu')).GetControl('edSlot'+IntToStr(a))).Text :=
-    g_GetSaveName(a);
+  begin
+    name := g_GetSaveName(a, valid);
+    TGUIEdit(TGUIMenu(g_GUI_GetWindow('SaveMenu').GetControl('mmSaveMenu')).GetControl('edSlot'+IntToStr(a))).Text := name;
+    TGUIEdit(TGUIMenu(g_GUI_GetWindow('SaveMenu').GetControl('mmSaveMenu')).GetControl('edSlot'+IntToStr(a))).Invalid := (name <> '') and (not valid);
+  end;
 end;
 
 procedure ProcSaveGame(Sender: TGUIControl);
@@ -1131,9 +1157,15 @@ begin
   if g_Game_IsNet then Exit;
   a := StrToInt(Copy(Sender.Name, Length(Sender.Name), 1));
   if g_LoadGame(a) then
+  begin
     g_Game_PauseAllSounds(False)
+  end
   else // Íå çàãðóçèëîñü - âîçâðàò â ìåíþ
+  begin
+    g_Console_Add(_lc[I_MSG_BAD_SAVE_VERSION], true);
     g_GUI_GetWindow('LoadMenu').SetActive(g_GUI_GetWindow('LoadMenu').GetControl('mmLoadMenu'));
+    //g_ActiveWindow := nil;
+  end;
 end;
 
 procedure ProcSingle1Player();
@@ -1286,7 +1318,9 @@ var
 begin
   if g_ActiveWindow.Name = 'OptionsPlayersP1Menu' then s := 'P1' else s := 'P2';
   with TGUIModelView(g_ActiveWindow.GetControl('mv'+s+'Model')).Model do
-    if Direction = D_LEFT then Direction := D_RIGHT else Direction := D_LEFT;
+  begin
+    if Direction = TDirection.D_LEFT then Direction := TDirection.D_RIGHT else Direction := TDirection.D_LEFT;
+  end;
 end;
 
 procedure ProcDefaultMenuKeyDown (yes: Boolean);
@@ -1323,8 +1357,8 @@ var
 begin
   Enabled := True;
   if (gGameSettings.GameType = GT_SINGLE) and
-     ((gPlayer1 = nil) or (not gPlayer1.Live)) and
-     ((gPlayer2 = nil) or (not gPlayer2.Live)) then
+     ((gPlayer1 = nil) or (not gPlayer1.alive)) and
+     ((gPlayer2 = nil) or (not gPlayer2.alive)) then
     Enabled := False; // Îäèí èç èãðîêîâ ïîãèá â ñèíãëå
   if not gGameOn then
     Enabled := False; // Çàïðåòèòü ñîõðàíåíèå â èíòåðìèññèè (íå ðåàëèçîâàíî)
@@ -1676,7 +1710,7 @@ end;
 procedure ProcVideoOptionsRes();
 var
   menu: TGUIMenu;
-  list: SArray;
+  list: SSArray;
   SR: DWORD;
 begin
   menu := TGUIMenu(g_GUI_GetWindow('OptionsVideoResMenu').GetControl('mOptionsVideoResMenu'));
@@ -1858,7 +1892,7 @@ var
   Menu: TGUIWindow;
   //SR: TSearchRec;
   a, cx, _y, i: Integer;
-  //list: SArray;
+  //list: SSArray;
 begin
   Menu := TGUIWindow.Create('MainMenu');
   with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, _lc[I_MENU_MAIN_MENU]))) do
@@ -2522,6 +2556,13 @@ begin
       AddItem(_lc[I_MENU_COMPAT_DOOM2]);
       AddItem(_lc[I_MENU_COMPAT_DF]);
     end;
+    // Ïåðåêëþ÷àòåëü çâóêîâ ÷àòà
+    with AddSwitch (_lc[I_MENU_SOUND_CHAT]) do
+    begin;
+      Name := 'swChatSpeech';
+      AddItem(_lc[I_MENU_YES]);
+      AddItem(_lc[I_MENU_NO]);
+    end;
     with AddSwitch(_lc[I_MENU_SOUND_INACTIVE_SOUNDS]) do
     begin
       Name := 'swInactiveSounds';
@@ -3084,19 +3125,18 @@ begin
   g_Sound_PlayEx('MENU_OPEN');
 end;
 
-procedure g_Menu_Show_LoadMenu();
+procedure g_Menu_Show_LoadMenu (standalone: Boolean=false);
 begin
+  if (g_ActiveWindow <> nil) and (g_ActiveWindow.name = 'LoadMenu') then exit; // nothing to do
   if gGameSettings.GameType = GT_SINGLE then
-    g_GUI_ShowWindow('GameSingleMenu')
+  begin
+    if not standalone then g_GUI_ShowWindow('GameSingleMenu')
+  end
   else
   begin
-    if g_Game_IsClient then
-      Exit
-    else
-      if g_Game_IsNet then
-        Exit
-      else
-        g_GUI_ShowWindow('GameCustomMenu');
+    if g_Game_IsClient then exit;
+    if g_Game_IsNet then exit;
+    if not standalone then g_GUI_ShowWindow('GameCustomMenu');
   end;
   g_GUI_ShowWindow('LoadMenu');
   g_Sound_PlayEx('MENU_OPEN');
@@ -3184,7 +3224,7 @@ procedure g_Menu_Free();
 begin
   g_GUI_Destroy();
 
-  e_WriteLog('Releasing menu data...', MSG_NOTIFY);
+  e_WriteLog('Releasing menu data...', TMsgType.Notify);
 
   MenuFreeData();
 end;
@@ -3198,7 +3238,7 @@ begin
 
   if ex then
   begin
-    e_WriteLog('Recreating menu...', MSG_NOTIFY);
+    e_WriteLog('Recreating menu...', TMsgType.Notify);
 
     CreateAllMenus();