From: DeaDDooMER <deaddoomer@deadsoftware.ru>
Date: Tue, 18 Jan 2022 21:16:26 +0000 (+0300)
Subject: render: fix monster animations
X-Git-Url: http://deadsoftware.ru/gitweb?a=commitdiff_plain;h=17ca3896bbe664f64e6c302023b8010d4ebd02ff;p=d2df-sdl.git

render: fix monster animations
---

diff --git a/src/game/opengl/r_animations.pas b/src/game/opengl/r_animations.pas
index f50ce92..8af7830 100644
--- a/src/game/opengl/r_animations.pas
+++ b/src/game/opengl/r_animations.pas
@@ -30,6 +30,7 @@ interface
   function g_Frames_Dup (const NewName, OldName: AnsiString): Boolean;
   function g_Frames_Get (out ID: LongWord; const FramesName: AnsiString): Boolean;
   function g_Frames_GetTexture (out ID: LongWord; const FramesName: AnsiString; Frame: Word): Boolean;
+  procedure g_Frames_GetFrameSize (ID: DWORD; out w, h: Integer);
   function g_Frames_Exists (const FramesName: AnsiString): Boolean;
   procedure g_Frames_DeleteByName (const FramesName: AnsiString);
   procedure g_Frames_DeleteByID (ID: LongWord);
@@ -56,6 +57,17 @@ implementation
     g_language, g_game
   ;
 
+  procedure g_Frames_GetFrameSize (ID: DWORD; out w, h: Integer);
+  begin
+    w := 0;
+    h := 0;
+    if framesArray <> nil then
+    begin
+      w := framesArray[ID].frameWidth;
+      h := framesArray[ID].frameHeight;
+    end
+  end;
+
   procedure r_AnimationState_Draw (FID: DWORD; t: TAnimationState; x, y: Integer; alpha: Byte; mirror: TMirrorType; blending: Boolean);
   begin
     if t.enabled then
diff --git a/src/game/opengl/r_monsters.pas b/src/game/opengl/r_monsters.pas
index 7b1fcc4..6ae4510 100644
--- a/src/game/opengl/r_monsters.pas
+++ b/src/game/opengl/r_monsters.pas
@@ -33,8 +33,7 @@ implementation
   ;
 
   type
-    TMonsterDirected = array [TDirection.D_LEFT..TDirection.D_RIGHT] of DWORD;
-    TMonsterAnims = array [ANIM_SLEEP..ANIM_PAIN] of TMonsterDirected;
+    TMonsterAnims = array [ANIM_SLEEP..ANIM_PAIN, TDirection.D_LEFT..TDirection.D_RIGHT] of DWORD;
 
   var
     VileFire: DWORD;
@@ -372,7 +371,7 @@ implementation
   end;
 
   procedure r_Monsters_Draw (constref monster: TMonster);
-    var m: TMirrorType; dx, dy, c, fX, fY: Integer; o: TObj;
+    var m: TMirrorType; dx, dy, c, fX, fY, mw, mh: Integer; o: TObj;
   begin
     with monster do
     begin
@@ -422,8 +421,8 @@ implementation
             // Расстояние от края текстуры до края визуального положения объекта на текстуре:
             c := (MONSTERTABLE[MonsterType].Rect.X - dx) + MONSTERTABLE[MonsterType].Rect.Width;
             // Расстояние от края хит бокса до края визуального положения объекта на текстуре:
-            //dx := DirAnim[MonsterAnim, GameDirection].Width - c - MONSTERTABLE[MonsterType].Rect.X;
-            dx := 64 - c - MONSTERTABLE[MonsterType].Rect.X; // !!! ^^^
+            g_Frames_GetFrameSize(monFrames[MonsterType, MonsterAnim, GameDirection], mw, mh);
+            dx := mw - c - MONSTERTABLE[MonsterType].Rect.X; // !!! ^^^
             // Т.к. двигать текстуру нужно будет в противоположном направлении:
             dx := -dx;
             // Это значит: dX := -frameWidth - animDeltaX + hitX + hitWidth + hitX