DEADSOFTWARE

screenshots now in PNG format
[d2df-sdl.git] / src / game / g_game.pas
index d369831615c5ff4bc92cc6dbbc0a737c814d7772..6379821eaf14e92508ab607c4eef8b66c41c02ec 100644 (file)
@@ -1,10 +1,11 @@
+{$MODE DELPHI}
 unit g_game;
 
 interface
 
 uses
   g_basic, g_player, e_graphics, Classes, g_res_downloader,
-  SysUtils, g_sound, g_gui, MAPSTRUCT, WADEDITOR, md5;
+  SysUtils, g_sound, g_gui, MAPSTRUCT, wadreader, md5;
 
 type
   TGameSettings = record
@@ -106,6 +107,7 @@ function  g_Game_IsTestMap(): Boolean;
 procedure g_Game_DeleteTestMap();
 procedure GameCVars(P: SArray);
 procedure GameCommands(P: SArray);
+procedure GameCheats(P: SArray);
 procedure DebugCommands(P: SArray);
 procedure g_Game_Process_Params;
 procedure g_Game_SetLoadingText(Text: String; Max: Integer; reWrite: Boolean);
@@ -469,7 +471,7 @@ end;
 
 function g_Game_GetMegaWADInfo(WAD: String): TMegaWADInfo;
 var
-  w: TWADEditor_1;
+  w: TWADFile;
   cfg: TConfig;
   p: Pointer;
   len: Integer;
@@ -478,7 +480,7 @@ begin
   Result.description := '';
   Result.author := '';
 
-  w := TWADEditor_1.Create();
+  w := TWADFile.Create();
   w.ReadFile(WAD);
 
   if not w.GetResource('', 'INTERSCRIPT', p, len) then
@@ -524,7 +526,7 @@ end;
 
 procedure g_Game_LoadWAD(WAD: string);
 var
-  w: TWADEditor_1;
+  w: TWADFile;
   cfg: TConfig;
   p: Pointer;
   {b, }len: Integer;
@@ -537,7 +539,7 @@ begin
 
   MegaWAD.info := g_Game_GetMegaWADInfo(MapsDir + WAD);
 
-  w := TWADEditor_1.Create();
+  w := TWADFile.Create();
   w.ReadFile(MapsDir + WAD);
 
   if not w.GetResource('', 'INTERSCRIPT', p, len) then
@@ -653,7 +655,7 @@ begin
   gDelayedEvents[n].DENum := Num;
   gDelayedEvents[n].DEStr := Str;
   if DEType = DE_GLOBEVENT then
-    gDelayedEvents[n].Time := (GetTimer() div 1000) + Time
+    gDelayedEvents[n].Time := (GetTimer() {div 1000}) + Time
   else
     gDelayedEvents[n].Time := gTime + Time;
   Result := n;
@@ -1753,7 +1755,7 @@ begin
 
 // Äåëàåì ñêðèíøîò (íå ÷àùå 200 ìèëëèñåêóíä):
   if e_KeyPressed(gGameControls.GameControls.TakeScreenshot) then
-    if (GetTimer()-LastScreenShot) > 200000 then
+    if (GetTimer()-LastScreenShot) > 200000 div 1000 then
     begin
       g_TakeScreenShot();
       LastScreenShot := GetTimer();
@@ -1768,7 +1770,7 @@ begin
     KeyPress(IK_F10);
   end;
 
-  Time := GetTimer() div 1000;
+  Time := GetTimer() {div 1000};
 
 // Îáðàáîòêà îòëîæåííûõ ñîáûòèé:
   if gDelayedEvents <> nil then
@@ -2684,7 +2686,7 @@ var
 begin
   if gExit = EXIT_QUIT then Exit;
 
-  Time := GetTimer() div 1000;
+  Time := GetTimer() {div 1000};
   FPSCounter := FPSCounter+1;
   if Time - FPSTime >= 1000 then
   begin
@@ -4069,7 +4071,7 @@ var
   MapName: Char16;
   WadName: string;
 {
-  WAD: TWADEditor_1;
+  WAD: TWADFile;
   MapList: SArray;
   time: Integer;
 }
@@ -4093,7 +4095,7 @@ begin
   if not gTempDelete then
   begin
     time := g_GetFileTime(WadName);
-    WAD := TWADEditor_1.Create();
+    WAD := TWADFile.Create();
 
   // ×èòàåì Wad-ôàéë:
     if not WAD.ReadFile(WadName) then
@@ -4773,6 +4775,132 @@ begin
       g_Console_Add(_lc[I_MSG_NOT_DEBUG]);
 end;
 
+
+procedure GameCheats(P: SArray);
+var
+  cmd: string;
+  f, a: Integer;
+  plr: TPlayer;
+begin
+  if (not gGameOn) or (not gCheats) or ((gGameSettings.GameType <> GT_SINGLE) and
+     (gGameSettings.GameMode <> GM_COOP) and (not gDebugMode)) or g_Game_IsNet then
+  begin
+    g_Console_Add('not available');
+    exit;
+  end;
+  plr := gPlayer1;
+  if plr = nil then
+  begin
+    g_Console_Add('where is the player?!');
+    exit;
+  end;
+  cmd := LowerCase(P[0]);
+  // god
+  if cmd = 'god' then
+  begin
+    plr.GodMode := not plr.GodMode;
+    if plr.GodMode then g_Console_Add('player is godlike now') else g_Console_Add('player is mortal now');
+    exit;
+  end;
+  // give <health|exit|weapons|air|suit|jetpack|berserk|all>
+  if cmd = 'give' then
+  begin
+    if length(P) < 2 then begin g_Console_Add('give what?!'); exit; end;
+    for f := 1 to High(P) do
+    begin
+      cmd := LowerCase(P[f]);
+      if cmd = 'health' then begin plr.RestoreHealthArmor(); g_Console_Add('player feels himself better'); continue; end;
+      if (cmd = 'all') or (cmd = 'weapons') then begin plr.AllRulez(False); g_Console_Add('player got the gifts'); continue; end;
+      if cmd = 'exit' then
+      begin
+        if gTriggers <> nil then
+        begin
+          for a := 0 to High(gTriggers) do
+          begin
+            if gTriggers[a].TriggerType = TRIGGER_EXIT then
+            begin
+              g_Console_Add('player left the map');
+              gExitByTrigger := True;
+              g_Game_ExitLevel(gTriggers[a].Data.MapName);
+              break;
+            end;
+          end;
+        end;
+        continue;
+      end;
+      if cmd = 'air' then begin plr.GiveItem(ITEM_OXYGEN); g_Console_Add('player got some air'); continue; end;
+      if cmd = 'jetpack' then begin plr.GiveItem(ITEM_JETPACK); g_Console_Add('player got jetpack'); continue; end;
+      if cmd = 'suit' then begin plr.GiveItem(ITEM_SUIT); g_Console_Add('player got envirosuit'); continue; end;
+      if cmd = 'berserk' then begin plr.GiveItem(ITEM_MEDKIT_BLACK); g_Console_Add('player got berserk pack'); continue; end;
+      g_Console_Add('i don''t know how to give '''+cmd+'''!');
+    end;
+    exit;
+  end;
+  // open
+  if cmd = 'open' then
+  begin
+    g_Console_Add('player activated sesame');
+    g_Triggers_OpenAll();
+    exit;
+  end;
+  // fly
+  if cmd = 'fly' then
+  begin
+    gFly := not gFly;
+    if gFly then g_Console_Add('player feels himself lighter') else g_Console_Add('player lost his wings');
+    exit;
+  end;
+  // noclip
+  if cmd = 'noclip' then
+  begin
+    plr.SwitchNoClip;
+    g_Console_Add('wall hardeness adjusted');
+    exit;
+  end;
+  // notarget
+  if cmd = 'notarget' then
+  begin
+    plr.NoTarget := not plr.NoTarget;
+    if plr.NoTarget then g_Console_Add('player hides in shadows') else g_Console_Add('player is brave again');
+    exit;
+  end;
+  // noreload
+  if cmd = 'noreload' then
+  begin
+    plr.NoReload := not plr.NoReload;
+    if plr.NoReload then g_Console_Add('player is action hero now') else g_Console_Add('player is ordinary man now');
+    exit;
+  end;
+  // speedy
+  if cmd = 'speedy' then
+  begin
+    MAX_RUNVEL := 32-MAX_RUNVEL;
+    g_Console_Add('speed adjusted');
+    exit;
+  end;
+  // jumpy
+  if cmd = 'jumpy' then
+  begin
+    VEL_JUMP := 30-VEL_JUMP;
+    g_Console_Add('jump height adjusted');
+    exit;
+  end;
+  // automap
+  if cmd = 'automap' then
+  begin
+    gShowMap := not gShowMap;
+    if gShowMap then g_Console_Add('player gains second sight') else g_Console_Add('player lost second sight');
+    exit;
+  end;
+  // aimline
+  if cmd = 'aimline' then
+  begin
+    gAimLine := not gAimLine;
+    if gAimLine then g_Console_Add('player gains laser sight') else g_Console_Add('player lost laser sight');
+    exit;
+  end;
+end;
+
 procedure GameCommands(P: SArray);
 var
   a, b: Integer;
@@ -5724,17 +5852,43 @@ end;
 procedure g_TakeScreenShot();
 var
   a: Word;
-  FileName: String;
+  FileName: string;
+  ssdir, t: string;
+  st: TStream;
+  ok: Boolean;
 begin
-  for a := 1 to High(Word) do
-  begin
-    FileName := Format(GameDir+'/Screenshots/Screenshot%.3d.bmp', [a]);
-    if not FileExists(FileName) then
+  if e_NoGraphics then Exit;
+  ssdir := GameDir+'/screenshots';
+  if not findFileCI(ssdir, true) then
+  begin
+    // try to create dir
+    try
+      CreateDir(ssdir);
+    except
+    end;
+    if not findFileCI(ssdir, true) then exit; // alas
+  end;
+  try
+    for a := 1 to High(Word) do
     begin
-      e_MakeScreenshot(FileName, gScreenWidth, gScreenHeight);
-      g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [ExtractFileName(FileName)]));
-      Break;
+      FileName := Format(ssdir+'screenshot%.3d.png', [a]);
+      t := FileName;
+      if findFileCI(t, true) then continue;
+      if not findFileCI(FileName) then
+      begin
+        ok := false;
+        st := createDiskFile(FileName);
+        try
+          e_MakeScreenshot(st, gScreenWidth, gScreenHeight);
+          ok := true;
+        finally
+          st.Free();
+        end;
+        if not ok then try DeleteFile(FileName); except end else g_Console_Add(Format(_lc[I_CONSOLE_SCREENSHOT], [ExtractFileName(FileName)]));
+        break;
+      end;
     end;
+  except
   end;
 end;
 
@@ -6306,7 +6460,7 @@ begin
     if (s <> '') then
     begin
       gMapToDelete := MapsDir + map;
-      e_WriteLog('"--testdelete" argument doesn''t supported anymore!', MSG_FATALERROR);
+      e_WriteLog('"--testdelete" is deprecated, use --tempdelete.', MSG_FATALERROR);
       Halt(1);
     end;