DEADSOFTWARE

render: fix monster animations
[d2df-sdl.git] / src / game / opengl / r_monsters.pas
index c9b4ff7a3c9119d30a16411c8d7cfa9d3ad52144..6ae4510555fba9f331f156adbfcca768e6aba966 100644 (file)
@@ -26,15 +26,14 @@ implementation
 
   uses
     SysUtils, Classes, Math, e_log,
-    r_graphics, g_options, r_animations,
+    r_graphics, g_options, r_animations, r_game,
     MAPDEF,
     g_base, g_basic, g_game, g_phys,
     g_monsters
   ;
 
   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;
@@ -178,7 +177,7 @@ implementation
   end;
 
   procedure r_Monsters_Load;
-    var m, a: Integer; s, info: String; FramesID: DWORD;
+    var m, a: Integer; s: String; FramesID: DWORD;
   begin
     g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARREL_SLEEP', GameWAD+':MTEXTURES\BARREL_SLEEP', 64, 64, 3);
     g_Frames_CreateWAD(nil, 'FRAMES_MONSTER_BARREL_DIE', GameWAD+':MTEXTURES\BARREL_DIE', 64, 64, 4);
@@ -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
@@ -385,7 +384,7 @@ implementation
       if MonsterType = MONSTER_VILE then
         if MonsterState = MONSTATE_SHOOT then
           if GetPos(MonsterTargetUID, @o) then
-            r_AnimationState_Draw(VileFire, VileFireAnim, o.X + o.Rect.X + (o.Rect.Width div 2) - 32, o.Y + o.Rect.Y + o.Rect.Height - 128, TMirrorType.None);
+            r_AnimationState_Draw(VileFire, VileFireAnim, o.X + o.Rect.X + (o.Rect.Width div 2) - 32, o.Y + o.Rect.Y + o.Rect.Height - 128, 0, TMirrorType.None, False);
 
       // Не в области рисования не ресуем:
       //FIXME!
@@ -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
@@ -435,7 +434,7 @@ implementation
           dy := MONSTER_ANIMTABLE[MonsterType].AnimDeltaRight[MonsterAnim].Y;
         end;
 
-        r_AnimationState_Draw(monFrames[MonsterType, MonsterAnim, GameDirection], DirAnim[MonsterAnim, GameDirection], fX + dx, fY + dy, m);
+        r_AnimationState_Draw(monFrames[MonsterType, MonsterAnim, GameDirection], DirAnim[MonsterAnim, GameDirection], fX + dx, fY + dy, 0, m, False);
       end;
 
       if g_debug_Frames then