DEADSOFTWARE

gl: rotate shots
[d2df-sdl.git] / src / game / g_textures.pas
index dcfbd1a045f2179aee421ad6b6c25ffeb96cf680..8a215c0e157c2e5ca995b23b81a3ab5c4cb9a05c 100644 (file)
@@ -31,7 +31,7 @@ type
 
   TLevelTextureArray = array of TLevelTexture;
 
-  TAnimationState = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
+  TAnimState = record
   private
     mCounter: Byte; // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
     mSpeed: Byte; // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
@@ -46,7 +46,7 @@ type
 
   public
     constructor Create (aloop: Boolean; aspeed: Byte; len: Integer);
-    destructor  Destroy (); override;
+    procedure Invalidate;
 
     procedure reset ();
     procedure update ();
@@ -58,6 +58,8 @@ type
     procedure loadState (st: TStream; out mAlpha: Byte; out mBlending: Boolean);
 
     function totalFrames (): Integer; inline;
+    function IsInvalid (): Boolean;
+    function IsValid (): Boolean;
 
   public
     property played: Boolean read mPlayed;
@@ -78,8 +80,10 @@ uses
   g_game, e_log, g_basic, g_console, wadreader,
   g_language, utils, xstreams;
 
-constructor TAnimationState.Create (aloop: Boolean; aspeed: Byte; len: Integer);
+constructor TAnimState.Create (aloop: Boolean; aspeed: Byte; len: Integer);
 begin
+  Self := Default(TAnimState);
+
   assert(len >= 0);
   mLength := len;
 
@@ -91,12 +95,12 @@ begin
   mPlayed := false;
 end;
 
-destructor TAnimationState.Destroy;
+procedure TAnimState.Invalidate;
 begin
-  inherited;
+  Self := Default(TAnimState);
 end;
 
-procedure TAnimationState.update;
+procedure TAnimState.update;
 begin
   if (not mEnabled) then exit;
 
@@ -104,11 +108,8 @@ begin
 
   if (mCounter >= mSpeed) then
   begin
-    // Îæèäàíèå ìåæäó êàäðàìè çàêîí÷èëîñü
-    // Îáðàòíûé ïîðÿäîê êàäðîâ?
     if mRevert then
     begin
-      // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
       if (mCurrentFrame = 0) then
       begin
         if (mLength * mSpeed + mCounter < mMinLength) then exit;
@@ -117,7 +118,6 @@ begin
       mCurrentFrame -= 1;
       mPlayed := (mCurrentFrame < 0);
 
-      // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
       if mPlayed then
       begin
         if mLoop then
@@ -130,8 +130,6 @@ begin
     end
     else
     begin
-      // Ïðÿìîé ïîðÿäîê êàäðîâ
-      // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
       if (mCurrentFrame = mLength - 1) then
       begin
         if (mLength * mSpeed + mCounter < mMinLength) then exit;
@@ -140,7 +138,6 @@ begin
       mCurrentFrame += 1;
       mPlayed := (mCurrentFrame > mLength - 1);
 
-      // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
       if mPlayed then
       begin
         if mLoop then mCurrentFrame := 0 else mCurrentFrame -= 1;
@@ -151,7 +148,7 @@ begin
   end;
 end;
 
-procedure TAnimationState.reset;
+procedure TAnimState.reset;
 begin
   if mRevert then
     mCurrentFrame := mLength - 1
@@ -161,82 +158,73 @@ begin
   mPlayed := false
 end;
 
-procedure TAnimationState.disable;
+procedure TAnimState.disable;
 begin
   mEnabled := false
 end;
 
-procedure TAnimationState.enable;
+procedure TAnimState.enable;
 begin
   mEnabled := true
 end;
 
-procedure TAnimationState.revert (r: Boolean);
+procedure TAnimState.revert (r: Boolean);
 begin
   mRevert := r;
   reset
 end;
 
-function TAnimationState.totalFrames (): Integer; inline;
+function TAnimState.totalFrames (): Integer; inline;
 begin
   result := mLength
 end;
 
-procedure TAnimationState.saveState (st: TStream; mAlpha: Byte; mBlending: Boolean);
+function TAnimState.IsInvalid (): Boolean;
+begin
+  result := mLength <= 0
+end;
+
+function TAnimState.IsValid (): Boolean;
+begin
+  result := mLength > 0
+end;
+
+procedure TAnimState.saveState (st: TStream; mAlpha: Byte; mBlending: Boolean);
 begin
   if (st = nil) then exit;
 
   utils.writeSign(st, 'ANIM');
   utils.writeInt(st, Byte(0)); // version
-  // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
   utils.writeInt(st, Byte(mCounter));
-  // Òåêóùèé êàäð
   utils.writeInt(st, LongInt(mCurrentFrame));
-  // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
   utils.writeBool(st, mPlayed);
-  // Alpha-êàíàë âñåé òåêñòóðû
   utils.writeInt(st, Byte(mAlpha));
-  // Ðàçìûòèå òåêñòóðû
   utils.writeInt(st, Byte(mBlending));
-  // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
   utils.writeInt(st, Byte(mSpeed));
-  // Çàöèêëåíà ëè àíèìàöèÿ
   utils.writeBool(st, mLoop);
-  // Âêëþ÷åíà ëè
   utils.writeBool(st, mEnabled);
-  // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
   utils.writeInt(st, Byte(mMinLength));
-  // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
   utils.writeBool(st, mRevert);
 end;
 
 
-procedure TAnimationState.loadState (st: TStream; out mAlpha: Byte; out mBlending: Boolean);
+procedure TAnimState.loadState (st: TStream; out mAlpha: Byte; out mBlending: Boolean);
 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');
-  // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
   mCounter := utils.readByte(st);
-  // Òåêóùèé êàäð
   mCurrentFrame := utils.readLongInt(st);
-  // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
   mPlayed := utils.readBool(st);
-  // Alpha-êàíàë âñåé òåêñòóðû
   mAlpha := utils.readByte(st);
-  // Ðàçìûòèå òåêñòóðû
   mBlending := utils.readBool(st);
-  // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
   mSpeed := utils.readByte(st);
-  // Çàöèêëåíà ëè àíèìàöèÿ
   mLoop := utils.readBool(st);
-  // Âêëþ÷åíà ëè
   mEnabled := utils.readBool(st);
-  // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
   mMinLength := utils.readByte(st);
-  // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
   mRevert := utils.readBool(st);
 end;
 
+
 end.