DEADSOFTWARE

turned on "SCOPEDENUMS" fpc option
[d2df-sdl.git] / src / game / g_textures.pas
index 02098004a6432c4d64385e6d6f208c1380e2a569..6f239e4df78266d2ca749f9588727224a1004b7f 100644 (file)
@@ -19,7 +19,9 @@ unit g_textures;
 interface
 
 uses
-  e_graphics, MAPDEF, BinEditor, ImagingTypes, Imaging, ImagingUtility;
+  SysUtils, Classes,
+  mempool,
+  e_graphics, MAPDEF, ImagingTypes, Imaging, ImagingUtility;
 
 Type
   TLevelTexture = record
@@ -35,7 +37,7 @@ Type
 
   TLevelTextureArray = Array of TLevelTexture;
 
-  TAnimation = class(TObject)
+  TAnimation = class(TPoolObject)
   private
     ID:            DWORD;
     FAlpha:        Byte;
@@ -62,8 +64,8 @@ Type
     procedure   Enable();
     procedure   Disable();
     procedure   Revert(r: Boolean);
-    procedure   SaveState(Var Mem: TBinMemoryWriter);
-    procedure   LoadState(Var Mem: TBinMemoryReader);
+    procedure   SaveState(st: TStream);
+    procedure   LoadState(st: TStream);
     function    TotalFrames(): Integer;
 
     property    Played: Boolean read FPlayed;
@@ -84,7 +86,7 @@ Type
 
 function g_Texture_CreateWAD(var ID: DWORD; Resource: String): Boolean;
 function g_Texture_CreateFile(var ID: DWORD; FileName: String): Boolean;
-function g_Texture_CreateWADEx(TextureName: ShortString; Resource: String): Boolean;
+function g_Texture_CreateWADEx(TextureName: ShortString; Resource: String; altrsrc: AnsiString=''): Boolean;
 function g_Texture_CreateFileEx(TextureName: ShortString; FileName: String): Boolean;
 function g_Texture_Get(TextureName: ShortString; var ID: DWORD): Boolean;
 procedure g_Texture_Delete(TextureName: ShortString);
@@ -114,8 +116,8 @@ function g_Texture_Light(): Integer;
 implementation
 
 uses
-  g_game, e_log, g_basic, SysUtils, g_console, wadreader,
-  g_language, GL;
+  g_game, e_log, g_basic, g_console, wadreader,
+  g_language, GL, utils, xstreams;
 
 type
   _TTexture = record
@@ -184,7 +186,7 @@ begin
   end
   else
   begin
-    e_WriteLog(Format('Error loading texture %s', [Resource]), MSG_WARNING);
+    e_WriteLog(Format('Error loading texture %s', [Resource]), TMsgType.Warning);
     //e_WriteLog(Format('WAD Reader error: %s', [WAD.GetLastErrorStr]), MSG_WARNING);
   end;
   WAD.Free();
@@ -195,12 +197,12 @@ begin
   Result := True;
   if not e_CreateTexture(FileName, ID) then
   begin
-    e_WriteLog(Format('Error loading texture %s', [FileName]), MSG_WARNING);
+    e_WriteLog(Format('Error loading texture %s', [FileName]), TMsgType.Warning);
     Result := False;
   end;
 end;
 
-function g_Texture_CreateWADEx(TextureName: ShortString; Resource: String): Boolean;
+function texture_CreateWADExInternal (TextureName: ShortString; Resource: String; showmsg: Boolean): Boolean;
 var
   WAD: TWADFile;
   FileName: String;
@@ -217,25 +219,39 @@ begin
 
   if WAD.GetResource(g_ExtractFilePathName(Resource), TextureData, ResourceLength) then
   begin
-    Result := e_CreateTextureMem(TextureData, ResourceLength, TexturesArray[find_id].ID);
-    if Result then
+    result := e_CreateTextureMem(TextureData, ResourceLength, TexturesArray[find_id].ID);
+    if result then
     begin
-      e_GetTextureSize(TexturesArray[find_id].ID, @TexturesArray[find_id].Width,
-                       @TexturesArray[find_id].Height);
+      e_GetTextureSize(TexturesArray[find_id].ID, @TexturesArray[find_id].Width, @TexturesArray[find_id].Height);
       TexturesArray[find_id].Name := LowerCase(TextureName);
     end
     else
+    begin
       FreeMem(TextureData);
+    end;
   end
   else
   begin
-    e_WriteLog(Format('Error loading texture %s', [Resource]), MSG_WARNING);
+    if showmsg then
+    begin
+      e_WriteLog(Format('Error loading texture %s', [Resource]), TMsgType.Warning);
+    end;
     //e_WriteLog(Format('WAD Reader error: %s', [WAD.GetLastErrorStr]), MSG_WARNING);
-    Result := False;
+    result := false;
   end;
   WAD.Free();
 end;
 
+function g_Texture_CreateWADEx(TextureName: ShortString; Resource: String; altrsrc: AnsiString=''): Boolean;
+begin
+  if (Length(altrsrc) > 0) then
+  begin
+    result := texture_CreateWADExInternal(TextureName, altrsrc, false);
+    if result then exit;
+  end;
+  result := texture_CreateWADExInternal(TextureName, Resource, true);
+end;
+
 function g_Texture_CreateFileEx(TextureName: ShortString; FileName: String): Boolean;
 var
   find_id: DWORD;
@@ -249,7 +265,7 @@ begin
     e_GetTextureSize(TexturesArray[find_id].ID, @TexturesArray[find_id].Width,
                      @TexturesArray[find_id].Height);
   end
-  else e_WriteLog(Format('Error loading texture %s', [FileName]), MSG_WARNING);
+  else e_WriteLog(Format('Error loading texture %s', [FileName]), TMsgType.Warning);
 end;
 
 function g_Texture_Get(TextureName: ShortString; var ID: DWORD): Boolean;
@@ -473,7 +489,7 @@ begin
   if not WAD.GetResource(g_ExtractFilePathName(Resource), TextureData, ResourceLength) then
   begin
     WAD.Free();
-    e_WriteLog(Format('Error loading texture %s', [Resource]), MSG_WARNING);
+    e_WriteLog(Format('Error loading texture %s', [Resource]), TMsgType.Warning);
     //e_WriteLog(Format('WAD Reader error: %s', [WAD.GetLastErrorStr]), MSG_WARNING);
     Exit;
   end;
@@ -669,15 +685,15 @@ procedure DumpTextureNames();
 var
   i: Integer;
 begin
-  e_WriteLog('BEGIN Textures:', MSG_NOTIFY);
+  e_WriteLog('BEGIN Textures:', TMsgType.Notify);
   for i := 0 to High(TexturesArray) do
-    e_WriteLog('   '+IntToStr(i)+'. '+TexturesArray[i].Name, MSG_NOTIFY);
-  e_WriteLog('END Textures.', MSG_NOTIFY);
+    e_WriteLog('   '+IntToStr(i)+'. '+TexturesArray[i].Name, TMsgType.Notify);
+  e_WriteLog('END Textures.', TMsgType.Notify);
 
-  e_WriteLog('BEGIN Frames:', MSG_NOTIFY);
+  e_WriteLog('BEGIN Frames:', TMsgType.Notify);
   for i := 0 to High(FramesArray) do
-    e_WriteLog('   '+IntToStr(i)+'. '+FramesArray[i].Name, MSG_NOTIFY);
-  e_WriteLog('END Frames.', MSG_NOTIFY);
+    e_WriteLog('   '+IntToStr(i)+'. '+FramesArray[i].Name, TMsgType.Notify);
+  e_WriteLog('END Frames.', TMsgType.Notify);
 end;
 
 { TAnimation }
@@ -806,71 +822,60 @@ begin
   Reset();
 end;
 
-procedure TAnimation.SaveState(Var Mem: TBinMemoryWriter);
-var
-  sig: DWORD;
-begin
-  if Mem = nil then
-    Exit;
-
-// Ñèãíàòóðà àíèìàöèè:
-  sig := ANIM_SIGNATURE; // 'ANIM'
-  Mem.WriteDWORD(sig);
-// Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè:
-  Mem.WriteByte(FCounter);
-// Òåêóùèé êàäð:
-  Mem.WriteInt(FCurrentFrame);
-// Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì:
-  Mem.WriteBoolean(FPlayed);
-// Alpha-êàíàë âñåé òåêñòóðû:
-  Mem.WriteByte(FAlpha);
-// Ðàçìûòèå òåêñòóðû:
-  Mem.WriteBoolean(FBlending);
-// Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè:
-  Mem.WriteByte(FSpeed);
-// Çàöèêëåíà ëè àíèìàöèÿ:
-  Mem.WriteBoolean(FLoop);
-// Âêëþ÷åíà ëè:
-  Mem.WriteBoolean(FEnabled);
-// Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ:
-  Mem.WriteByte(FMinLength);
-// Îáðàòíûé ëè ïîðÿäîê êàäðîâ:
-  Mem.WriteBoolean(FRevert);
-end;
-
-procedure TAnimation.LoadState(Var Mem: TBinMemoryReader);
-var
-  sig: DWORD;
-begin
-  if Mem = nil then
-    Exit;
-
-// Ñèãíàòóðà àíèìàöèè:
-  Mem.ReadDWORD(sig);
-  if sig <> ANIM_SIGNATURE then // 'ANIM'
-  begin
-    raise EBinSizeError.Create('TAnimation.LoadState: Wrong Animation Signature');
-  end;
-// Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè:
-  Mem.ReadByte(FCounter);
-// Òåêóùèé êàäð:
-  Mem.ReadInt(FCurrentFrame);
-// Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì:
-  Mem.ReadBoolean(FPlayed);
-// Alpha-êàíàë âñåé òåêñòóðû:
-  Mem.ReadByte(FAlpha);
-// Ðàçìûòèå òåêñòóðû:
-  Mem.ReadBoolean(FBlending);
-// Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè:
-  Mem.ReadByte(FSpeed);
-// Çàöèêëåíà ëè àíèìàöèÿ:
-  Mem.ReadBoolean(FLoop);
-// Âêëþ÷åíà ëè:
-  Mem.ReadBoolean(FEnabled);
-// Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ:
-  Mem.ReadByte(FMinLength);
-// Îáðàòíûé ëè ïîðÿäîê êàäðîâ:
-  Mem.ReadBoolean(FRevert);
+procedure TAnimation.SaveState (st: TStream);
+begin
+  if (st = nil) then exit;
+
+  utils.writeSign(st, 'ANIM');
+  utils.writeInt(st, Byte(0)); // version
+  // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
+  utils.writeInt(st, Byte(FCounter));
+  // Òåêóùèé êàäð
+  utils.writeInt(st, LongInt(FCurrentFrame));
+  // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
+  utils.writeBool(st, FPlayed);
+  // Alpha-êàíàë âñåé òåêñòóðû
+  utils.writeInt(st, Byte(FAlpha));
+  // Ðàçìûòèå òåêñòóðû
+  utils.writeInt(st, Byte(FBlending));
+  // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
+  utils.writeInt(st, Byte(FSpeed));
+  // Çàöèêëåíà ëè àíèìàöèÿ
+  utils.writeBool(st, FLoop);
+  // Âêëþ÷åíà ëè
+  utils.writeBool(st, FEnabled);
+  // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
+  utils.writeInt(st, Byte(FMinLength));
+  // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
+  utils.writeBool(st, FRevert);
+end;
+
+procedure TAnimation.LoadState (st: TStream);
+begin
+  if (st = nil) then exit;
+
+  if not utils.checkSign(st, 'ANIM') then raise XStreamError.Create('animation chunk expected');
+  if (utils.readByte(st) <> 0) then raise XStreamError.Create('invalid animation chunk version');
+  // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
+  FCounter := utils.readByte(st);
+  // Òåêóùèé êàäð
+  FCurrentFrame := utils.readLongInt(st);
+  // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
+  FPlayed := utils.readBool(st);
+  // Alpha-êàíàë âñåé òåêñòóðû
+  FAlpha := utils.readByte(st);
+  // Ðàçìûòèå òåêñòóðû
+  FBlending := utils.readBool(st);
+  // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
+  FSpeed := utils.readByte(st);
+  // Çàöèêëåíà ëè àíèìàöèÿ
+  FLoop := utils.readBool(st);
+  // Âêëþ÷åíà ëè
+  FEnabled := utils.readBool(st);
+  // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
+  FMinLength := utils.readByte(st);
+  // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
+  FRevert := utils.readBool(st);
 end;