DEADSOFTWARE

sound muting should work on first window deactivation now
[d2df-sdl.git] / src / game / g_game.pas
index 9adfa22fdb090e853788b848391d0312a645827a..b6f747401cf1a180bbb20fb3178138ec9089de1e 100644 (file)
@@ -244,7 +244,7 @@ var
   gWinPosX, gWinPosY: Integer;
   gWinSizeX, gWinSizeY: Integer;
   gWinFrameX, gWinFrameY, gWinCaption: Integer;
-  gWinActive: Boolean = False;
+  gWinActive: Boolean = True; // by default window is active, lol
   gResolutionChange: Boolean = False;
   gRC_Width, gRC_Height: Word;
   gRC_FullScreen, gRC_Maximized: Boolean;
@@ -294,7 +294,8 @@ uses
   g_playermodel, g_gfx, g_options, g_weapons, Math,
   g_triggers, MAPDEF, g_monsters, e_sound, CONFIG,
   BinEditor, g_language, g_net, SDL,
-  ENet, e_fixedbuffer, g_netmsg, g_netmaster, GL, GLExt;
+  ENet, e_fixedbuffer, g_netmsg, g_netmaster, GL, GLExt,
+  utils, sfs;
 
 type
   TEndCustomGameStat = record
@@ -821,6 +822,9 @@ var
   wad, map: string;
   mapstr: string;
 begin
+  s1 := '';
+  s2 := '';
+  s3 := '';
   pc := g_Player_GetCount;
   e_TextureFontGetSize(gStdFont, cw, ch);
 
@@ -1016,66 +1020,86 @@ begin
   gMapToDelete := '';
   gTempDelete := False;
 
-  g_Texture_CreateWADEx('MENU_BACKGROUND', GameWAD+':TEXTURES\TITLE');
-  g_Texture_CreateWADEx('INTER', GameWAD+':TEXTURES\INTER');
-  g_Texture_CreateWADEx('ENDGAME_EN', GameWAD+':TEXTURES\ENDGAME_EN');
-  g_Texture_CreateWADEx('ENDGAME_RU', GameWAD+':TEXTURES\ENDGAME_RU');
-
-  LoadStdFont('STDTXT', 'STDFONT', gStdFont);
-  LoadFont('MENUTXT', 'MENUFONT', gMenuFont);
-  LoadFont('SMALLTXT', 'SMALLFONT', gMenuSmallFont);
-
-  g_Game_ClearLoading();
-  g_Game_SetLoadingText(Format('Doom 2D: Forever %s', [GAME_VERSION]), 0, False);
-  g_Game_SetLoadingText('', 0, False);
-
-  g_Game_SetLoadingText(_lc[I_LOAD_CONSOLE], 0, False);
-  g_Console_Init();
-
-  g_Game_SetLoadingText(_lc[I_LOAD_MODELS], 0, False);
-  g_PlayerModel_LoadData();
-
-  if FindFirst(ModelsDir+'*.wad', faAnyFile, SR) = 0 then
-    repeat
-      if not g_PlayerModel_Load(ModelsDir+SR.Name) then
-        e_WriteLog(Format('Error loading model %s', [SR.Name]), MSG_WARNING);
-    until FindNext(SR) <> 0;
-  FindClose(SR);
-
-  gGameOn := False;
-  gPause := False;
-  gTime := 0;
-  LastScreenShot := 0;
-
-  {e_MouseInfo.Accel := 1.0;}
-
-  g_Game_SetLoadingText(_lc[I_LOAD_GAME_DATA], 0, False);
-  g_Game_LoadData();
-
-  g_Game_SetLoadingText(_lc[I_LOAD_MUSIC], 0, False);
-  g_Sound_CreateWADEx('MUSIC_INTERMUS', GameWAD+':MUSIC\INTERMUS', True);
-  g_Sound_CreateWADEx('MUSIC_MENU', GameWAD+':MUSIC\MENU', True);
-  g_Sound_CreateWADEx('MUSIC_ROUNDMUS', GameWAD+':MUSIC\ROUNDMUS');
-  g_Sound_CreateWADEx('MUSIC_STDENDMUS', GameWAD+':MUSIC\ENDMUS', True);
-
-  g_Game_SetLoadingText(_lc[I_LOAD_MENUS], 0, False);
-  g_Menu_Init();
-
-  gMusic := TMusic.Create();
-  gMusic.SetByName('MUSIC_MENU');
-  gMusic.Play();
-
-  gGameSettings.WarmupTime := 30;
-
-  gState := STATE_MENU;
-
-  SetLength(gEvents, 6);
-  gEvents[0].Name := 'ongamestart';
-  gEvents[1].Name := 'ongameend';
-  gEvents[2].Name := 'onmapstart';
-  gEvents[3].Name := 'onmapend';
-  gEvents[4].Name := 'oninter';
-  gEvents[5].Name := 'onwadend';
+  sfsGCDisable(); // temporary disable removing of temporary volumes
+
+  try
+    g_Texture_CreateWADEx('MENU_BACKGROUND', GameWAD+':TEXTURES\TITLE');
+    g_Texture_CreateWADEx('INTER', GameWAD+':TEXTURES\INTER');
+    g_Texture_CreateWADEx('ENDGAME_EN', GameWAD+':TEXTURES\ENDGAME_EN');
+    g_Texture_CreateWADEx('ENDGAME_RU', GameWAD+':TEXTURES\ENDGAME_RU');
+
+    LoadStdFont('STDTXT', 'STDFONT', gStdFont);
+    LoadFont('MENUTXT', 'MENUFONT', gMenuFont);
+    LoadFont('SMALLTXT', 'SMALLFONT', gMenuSmallFont);
+
+    g_Game_ClearLoading();
+    g_Game_SetLoadingText(Format('Doom 2D: Forever %s', [GAME_VERSION]), 0, False);
+    g_Game_SetLoadingText('', 0, False);
+
+    g_Game_SetLoadingText(_lc[I_LOAD_CONSOLE], 0, False);
+    g_Console_Init();
+
+    g_Game_SetLoadingText(_lc[I_LOAD_MODELS], 0, False);
+    g_PlayerModel_LoadData();
+
+    if FindFirst(ModelsDir+'*.wad', faAnyFile, SR) = 0 then
+      repeat
+        if not g_PlayerModel_Load(ModelsDir+SR.Name) then
+          e_WriteLog(Format('Error loading model %s', [SR.Name]), MSG_WARNING);
+      until FindNext(SR) <> 0;
+    FindClose(SR);
+
+    if FindFirst(ModelsDir+'*.pk3', faAnyFile, SR) = 0 then
+      repeat
+        if not g_PlayerModel_Load(ModelsDir+SR.Name) then
+          e_WriteLog(Format('Error loading model %s', [SR.Name]), MSG_WARNING);
+      until FindNext(SR) <> 0;
+    FindClose(SR);
+
+    if FindFirst(ModelsDir+'*.zip', faAnyFile, SR) = 0 then
+      repeat
+        if not g_PlayerModel_Load(ModelsDir+SR.Name) then
+          e_WriteLog(Format('Error loading model %s', [SR.Name]), MSG_WARNING);
+      until FindNext(SR) <> 0;
+    FindClose(SR);
+
+    gGameOn := False;
+    gPause := False;
+    gTime := 0;
+    LastScreenShot := 0;
+
+    {e_MouseInfo.Accel := 1.0;}
+
+    g_Game_SetLoadingText(_lc[I_LOAD_GAME_DATA], 0, False);
+    g_Game_LoadData();
+
+    g_Game_SetLoadingText(_lc[I_LOAD_MUSIC], 0, False);
+    g_Sound_CreateWADEx('MUSIC_INTERMUS', GameWAD+':MUSIC\INTERMUS', True);
+    g_Sound_CreateWADEx('MUSIC_MENU', GameWAD+':MUSIC\MENU', True);
+    g_Sound_CreateWADEx('MUSIC_ROUNDMUS', GameWAD+':MUSIC\ROUNDMUS', True);
+    g_Sound_CreateWADEx('MUSIC_STDENDMUS', GameWAD+':MUSIC\ENDMUS', True);
+
+    g_Game_SetLoadingText(_lc[I_LOAD_MENUS], 0, False);
+    g_Menu_Init();
+
+    gMusic := TMusic.Create();
+    gMusic.SetByName('MUSIC_MENU');
+    gMusic.Play();
+
+    gGameSettings.WarmupTime := 30;
+
+    gState := STATE_MENU;
+
+    SetLength(gEvents, 6);
+    gEvents[0].Name := 'ongamestart';
+    gEvents[1].Name := 'ongameend';
+    gEvents[2].Name := 'onmapstart';
+    gEvents[3].Name := 'onmapend';
+    gEvents[4].Name := 'oninter';
+    gEvents[5].Name := 'onwadend';
+  finally
+    sfsGCEnable(); // enable releasing unused volumes
+  end;
 end;
 
 procedure g_Game_Free();
@@ -1227,7 +1251,7 @@ begin
         if (not g_Game_IsClient) and
         (
           (
-            (e_KeyPressed(IK_RETURN) or e_KeyPressed(IK_SPACE))
+            (e_KeyPressed(IK_RETURN) or e_KeyPressed(IK_KPRETURN) or e_KeyPressed(IK_SPACE))
             and (not gJustChatted) and (not gConsoleShow) and (not gChatShow)
             and (g_ActiveWindow = nil)
           )
@@ -2982,7 +3006,7 @@ begin
   g_Texture_DeleteAll();
   g_Frames_DeleteAll();
   g_Menu_Free();
-  
+
   if NetInitDone then g_Net_Free;
 
 // Íàäî óäàëèòü êàðòó ïîñëå òåñòà:
@@ -3585,7 +3609,7 @@ begin
     ProcessLoading();
 
     e_PollInput();
-    
+
     if e_KeyPressed(IK_ESCAPE) or e_KeyPressed(IK_SPACE) then
     begin
       State := 0;
@@ -3674,7 +3698,7 @@ begin
       gWADHash := MD5File(MapsDir + NewWAD);
       g_Game_LoadWAD(NewWAD);
     end else
-      // hash recieved in MC_RECV_GameEvent -> NET_EV_MAPSTART 
+      // hash recieved in MC_RECV_GameEvent -> NET_EV_MAPSTART
       g_Game_ClientWAD(NewWAD, gWADHash);
   end else
     ResName := Map;
@@ -3779,7 +3803,7 @@ begin
     gCoopTotalSecrets := 0;
     gLastMap := False;
   end;
-  
+
   g_Game_ExecuteEvent('onmapstart');
 end;
 
@@ -4042,11 +4066,14 @@ end;
 
 procedure g_Game_DeleteTestMap();
 var
-  WAD: TWADEditor_1;
+  a: Integer;
   MapName: Char16;
-  MapList: SArray;
-  a, time: Integer;
   WadName: string;
+{
+  WAD: TWADEditor_1;
+  MapList: SArray;
+  time: Integer;
+}
 begin
   a := Pos('.wad:\', gMapToDelete);
   if a = 0 then
@@ -4059,6 +4086,7 @@ begin
   MapName := '';
   CopyMemory(@MapName[0], @gMapToDelete[1], Min(16, Length(gMapToDelete)));
 
+{
 // Èìÿ êàðòû íå ñòàíäàðòíîå òåñòîâîå:
   if MapName <> TEST_MAP_NAME then
     Exit;
@@ -4092,7 +4120,8 @@ begin
     WAD.Free();
     g_SetFileTime(WadName, time);
   end else
-    DeleteFile(WadName);
+}
+  if gTempDelete then DeleteFile(WadName);
 end;
 
 procedure GameCVars(P: SArray);
@@ -4190,7 +4219,7 @@ begin
         else
           Options := Options and (not GAME_OPTION_ALLOWEXIT);
       end;
-        
+
       if (LongBool(Options and GAME_OPTION_ALLOWEXIT)) then
         g_Console_Add(_lc[I_MSG_ALLOWEXIT_ON])
       else
@@ -4234,7 +4263,7 @@ begin
         else
           Options := Options and (not GAME_OPTION_BOTVSPLAYER);
       end;
-        
+
       if (LongBool(Options and GAME_OPTION_BOTVSPLAYER)) then
         g_Console_Add(_lc[I_MSG_BOTSVSPLAYERS_ON])
       else
@@ -4751,7 +4780,7 @@ var
   s, pw: String;
   chstr: string;
   cmd: string;
-  pl: pTNetClient;
+  pl: pTNetClient = nil;
   plr: TPlayer;
   prt: Word;
   nm: Boolean;
@@ -5165,9 +5194,7 @@ begin
       Exit;
     end;
     // Èãðà åù¸ íå çàïóùåíà, ñíà÷àëà íàì íàäî çàãðóçèòü êàêîé-òî WAD
-    if Pos('.wad', LowerCase(P[1])) = 0 then
-      P[1] := P[1] + '.wad';
-
+    P[1] := addWadExtension(P[1]);
     if FileExists(MapsDir + P[1]) then
     begin
       // Åñëè êàðòà íå óêàçàíà, áåð¸ì ïåðâóþ êàðòó â ôàéëå
@@ -5221,9 +5248,7 @@ begin
       Exit;
     prt := StrToIntDef(P[2], 25666);
 
-    if Pos('.wad', LowerCase(P[3])) = 0 then
-      P[3] := P[3] + '.wad';
-
+    P[3] := addWadExtension(P[3]);
     if FileExists(MapsDir + P[3]) then
     begin
       // Åñëè êàðòà íå óêàçàíà, áåð¸ì ïåðâóþ êàðòó â ôàéëå
@@ -5293,9 +5318,7 @@ begin
           begin
             g_Console_Add(Format(_lc[I_MSG_NO_MAP], [s]));
             // Òàêîé êàðòû íåò, èùåì WAD ôàéë
-            if Pos('.wad', LowerCase(P[1])) = 0 then
-              P[1] := P[1] + '.wad';
-
+            P[1] := addWadExtension(P[1]);
             if FileExists(MapsDir + P[1]) then
             begin
               // Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà
@@ -5325,9 +5348,7 @@ begin
         end else
         begin
           // Óêàçàíî äâà ïàðàìåòðà, çíà÷èò ïåðâûé - WAD ôàéë, à âòîðîé - êàðòà
-          if Pos('.wad', LowerCase(P[1])) = 0 then
-            P[1] := P[1] + '.wad';
-
+          P[1] := addWadExtension(P[1]);
           if FileExists(MapsDir + P[1]) then
           begin
             // Íàøëè WAD ôàéë
@@ -5386,9 +5407,7 @@ begin
             begin
               g_Console_Add(Format(_lc[I_MSG_NO_MAP], [s]));
               // Òàêîé êàðòû íåò, èùåì WAD ôàéë
-              if Pos('.wad', LowerCase(P[1])) = 0 then
-                P[1] := P[1] + '.wad';
-
+              P[1] := addWadExtension(P[1]);
               if FileExists(MapsDir + P[1]) then
               begin
                 // Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà
@@ -5413,9 +5432,7 @@ begin
           end else
           begin
             // Óêàçàíî äâà ïàðàìåòðà, çíà÷èò ïåðâûé - WAD ôàéë, à âòîðîé - êàðòà
-            if Pos('.wad', LowerCase(P[1])) = 0 then
-              P[1] := P[1] + '.wad';
-
+            P[1] := addWadExtension(P[1]);
             if FileExists(MapsDir + P[1]) then
             begin
               // Íàøëè WAD ôàéë
@@ -6065,7 +6082,7 @@ begin
   MapList := nil;
   MapIndex := -1;
 
-  if not FileExists(FileName) then Exit; 
+  if not FileExists(FileName) then Exit;
 
   AssignFile(ListFile, FileName);
   Reset(ListFile);
@@ -6242,7 +6259,7 @@ begin
 
 // Start map when game loads:
   map := LowerCase(Find_Param_Value(pars, '-map'));
-  if (map <> '') and (Pos('.wad:\', map) > 0) then
+  if isWadPath(map) then
   begin
   // Game mode:
     s := Find_Param_Value(pars, '-gm');
@@ -6288,7 +6305,11 @@ begin
   // Delete test map after play:
     s := Find_Param_Value(pars, '--testdelete');
     if (s <> '') then
+    begin
       gMapToDelete := MapsDir + map;
+      e_WriteLog('"--testdelete" argument doesn''t supported anymore!', MSG_FATALERROR);
+      Halt(1);
+    end;
 
   // Delete temporary WAD after play:
     s := Find_Param_Value(pars, '--tempdelete');