DEADSOFTWARE

render: use TAnimationState for projectiles
[d2df-sdl.git] / src / game / opengl / r_weapons.pas
index 3b1f085cbe140966178d4e60c19cedf425ae754e..648ff507201165d6cdcd9ad20b5017dbd61b7b6b 100644 (file)
@@ -17,6 +17,8 @@ unit r_weapons;
 
 interface
 
+  procedure r_Weapon_Load;
+  procedure r_Weapon_Free;
   procedure r_Weapon_Draw;
 
 implementation
@@ -24,11 +26,103 @@ implementation
   uses
     SysUtils, Classes, Math,
     MAPDEF,
-    e_graphics,
-    g_basic, g_game,
+    r_graphics, r_animations, r_textures,
+    g_base, g_basic, g_game, g_options,
     g_weapons
   ;
 
+  var
+    ShotTexture, ShotFrames: array [WEAPON_KASTET..WEAPON_SKEL_FIRE] of DWORD;
+
+  procedure r_Weapon_Load;
+  begin
+    g_Texture_CreateWADEx('TEXTURE_WEAPON_ROCKET', GameWAD+':TEXTURES\BROCKET');
+    g_Frames_CreateWAD(nil, 'FRAMES_WEAPON_SKELFIRE', GameWAD+':TEXTURES\BSKELFIRE', 64, 16, 2);
+    g_Frames_CreateWAD(nil, 'FRAMES_WEAPON_BFG', GameWAD+':TEXTURES\BBFG', 64, 64, 2);
+    g_Frames_CreateWAD(nil, 'FRAMES_WEAPON_PLASMA', GameWAD+':TEXTURES\BPLASMA', 16, 16, 2);
+    g_Frames_CreateWAD(nil, 'FRAMES_WEAPON_IMPFIRE', GameWAD+':TEXTURES\BIMPFIRE', 16, 16, 2);
+    g_Frames_CreateWAD(nil, 'FRAMES_WEAPON_BSPFIRE', GameWAD+':TEXTURES\BBSPFIRE', 16, 16, 2);
+    g_Frames_CreateWAD(nil, 'FRAMES_WEAPON_CACOFIRE', GameWAD+':TEXTURES\BCACOFIRE', 16, 16, 2);
+    g_Frames_CreateWAD(nil, 'FRAMES_WEAPON_BARONFIRE', GameWAD+':TEXTURES\BBARONFIRE', 64, 16, 2);
+    g_Frames_CreateWAD(nil, 'FRAMES_WEAPON_MANCUBFIRE', GameWAD+':TEXTURES\BMANCUBFIRE', 64, 32, 2);
+    g_Frames_CreateWAD(nil, 'FRAMES_EXPLODE_ROCKET', GameWAD+':TEXTURES\EROCKET', 128, 128, 6);
+    g_Frames_CreateWAD(nil, 'FRAMES_EXPLODE_SKELFIRE', GameWAD+':TEXTURES\ESKELFIRE', 64, 64, 3);
+    g_Frames_CreateWAD(nil, 'FRAMES_EXPLODE_BFG', GameWAD+':TEXTURES\EBFG', 128, 128, 6);
+    g_Frames_CreateWAD(nil, 'FRAMES_EXPLODE_IMPFIRE', GameWAD+':TEXTURES\EIMPFIRE', 64, 64, 3);
+    g_Frames_CreateWAD(nil, 'FRAMES_BFGHIT', GameWAD+':TEXTURES\BFGHIT', 64, 64, 4);
+    g_Frames_CreateWAD(nil, 'FRAMES_FIRE', GameWAD+':TEXTURES\FIRE', 64, 128, 8);
+    g_Frames_CreateWAD(nil, 'FRAMES_FLAME', GameWAD+':TEXTURES\FLAME', 32, 32, 11);
+    g_Frames_CreateWAD(nil, 'FRAMES_EXPLODE_PLASMA', GameWAD+':TEXTURES\EPLASMA', 32, 32, 4, True);
+    g_Frames_CreateWAD(nil, 'FRAMES_EXPLODE_BSPFIRE', GameWAD+':TEXTURES\EBSPFIRE', 32, 32, 5);
+    g_Frames_CreateWAD(nil, 'FRAMES_EXPLODE_CACOFIRE', GameWAD+':TEXTURES\ECACOFIRE', 64, 64, 3);
+    g_Frames_CreateWAD(nil, 'FRAMES_EXPLODE_BARONFIRE', GameWAD+':TEXTURES\EBARONFIRE', 64, 64, 3);
+    g_Frames_CreateWAD(nil, 'FRAMES_SMOKE', GameWAD+':TEXTURES\SMOKE', 32, 32, 10, False);
+
+    g_Texture_CreateWADEx('TEXTURE_SHELL_BULLET', GameWAD+':TEXTURES\EBULLET');
+    g_Texture_CreateWADEx('TEXTURE_SHELL_SHELL', GameWAD+':TEXTURES\ESHELL');
+
+    (* WEAPON_ROCKETLAUNCHER *)
+    g_Texture_Get('TEXTURE_WEAPON_ROCKET', ShotTexture[WEAPON_ROCKETLAUNCHER]);
+
+    (* WEAPON_PLASMA *)
+    g_Frames_Get(ShotFrames[WEAPON_PLASMA], 'FRAMES_WEAPON_PLASMA');
+    // Animation := TAnimation.Create(FramesID, True, 5);
+
+    (* WEAPON_BFG *)
+    g_Frames_Get(ShotFrames[WEAPON_BFG], 'FRAMES_WEAPON_BFG');
+    // Animation := TAnimation.Create(FramesID, True, 6);
+
+    (* WEAPON_FLAMETHROWER *)
+    //g_Frames_Get(ShotTexture[WEAPON_FLAMETHROWER], 'FRAMES_FLAME');
+    //g_Frames_Get(ShotFrames[WEAPON_FLAMETHROWER], 'FRAMES_FLAME');
+
+    (* WEAPON_IMP_FIRE *)
+    g_Frames_Get(ShotFrames[WEAPON_IMP_FIRE], 'FRAMES_WEAPON_IMPFIRE');
+    // Animation := TAnimation.Create(FramesID, True, 4);
+
+    (* WEAPON_CACO_FIRE *)
+    g_Frames_Get(ShotFrames[WEAPON_CACO_FIRE], 'FRAMES_WEAPON_CACOFIRE');
+    // Animation := TAnimation.Create(FramesID, True, 4);
+
+    (* WEAPON_MANCUB_FIRE *)
+    g_Frames_Get(ShotFrames[WEAPON_MANCUB_FIRE], 'FRAMES_WEAPON_MANCUBFIRE');
+    // Animation := TAnimation.Create(FramesID, True, 4);
+
+    (* WEAPON_BARON_FIRE *)
+    g_Frames_Get(ShotFrames[WEAPON_BARON_FIRE], 'FRAMES_WEAPON_BARONFIRE');
+    // Animation := TAnimation.Create(FramesID, True, 4);
+
+    (* WEAPON_BSP_FIRE *)
+    g_Frames_Get(ShotFrames[WEAPON_BSP_FIRE], 'FRAMES_WEAPON_BSPFIRE');
+    // Animation := TAnimation.Create(FramesID, True, 4);
+
+    (* WEAPON_SKEL_FIRE *)
+    g_Frames_Get(ShotFrames[WEAPON_SKEL_FIRE], 'FRAMES_WEAPON_SKELFIRE');
+    // Animation := TAnimation.Create(FramesID, True, 5);
+  end;
+
+  procedure r_Weapon_Free;
+  begin
+    g_Texture_Delete('TEXTURE_WEAPON_ROCKET');
+    g_Frames_DeleteByName('FRAMES_WEAPON_BFG');
+    g_Frames_DeleteByName('FRAMES_WEAPON_PLASMA');
+    g_Frames_DeleteByName('FRAMES_WEAPON_IMPFIRE');
+    g_Frames_DeleteByName('FRAMES_WEAPON_BSPFIRE');
+    g_Frames_DeleteByName('FRAMES_WEAPON_CACOFIRE');
+    g_Frames_DeleteByName('FRAMES_WEAPON_MANCUBFIRE');
+    g_Frames_DeleteByName('FRAMES_EXPLODE_ROCKET');
+    g_Frames_DeleteByName('FRAMES_EXPLODE_BFG');
+    g_Frames_DeleteByName('FRAMES_EXPLODE_IMPFIRE');
+    g_Frames_DeleteByName('FRAMES_BFGHIT');
+    g_Frames_DeleteByName('FRAMES_FIRE');
+    g_Frames_DeleteByName('FRAMES_EXPLODE_PLASMA');
+    g_Frames_DeleteByName('FRAMES_EXPLODE_BSPFIRE');
+    g_Frames_DeleteByName('FRAMES_EXPLODE_CACOFIRE');
+    g_Frames_DeleteByName('FRAMES_SMOKE');
+    g_Frames_DeleteByName('FRAMES_WEAPON_BARONFIRE');
+    g_Frames_DeleteByName('FRAMES_EXPLODE_BARONFIRE');
+  end;
+
   procedure r_Weapon_Draw;
     var i, fX, fY, xx, yy: Integer; a: SmallInt; p: TDFPoint;
   begin
@@ -53,16 +147,16 @@ implementation
           if Animation <> nil then
           begin
             if Shots[i].ShotType in [WEAPON_BARON_FIRE, WEAPON_MANCUB_FIRE, WEAPON_SKEL_FIRE] then
-              Animation.DrawEx(fX, fY, TMirrorType.None, p, a)
+              r_AnimationState_DrawEx(ShotFrames[Shots[i].ShotType], Animation, fX, fY, TMirrorType.None, p, a)
             else
-              Animation.Draw(fX, fY, TMirrorType.None);
+              r_AnimationState_Draw(ShotFrames[Shots[i].ShotType], Animation, fX, fY, TMirrorType.None);
           end
-          else if TextureID <> 0 then
+          else if ShotTexture[Shots[i].ShotType] <> 0 then
           begin
             if (Shots[i].ShotType = WEAPON_ROCKETLAUNCHER) then
-              e_DrawAdv(TextureID, fX, fY, 0, True, False, a, @p, TMirrorType.None)
+              e_DrawAdv(ShotTexture[Shots[i].ShotType], fX, fY, 0, True, False, a, @p, TMirrorType.None)
             else if (Shots[i].ShotType <> WEAPON_FLAMETHROWER) then
-              e_Draw(TextureID, fX, fY, 0, True, False);
+              e_Draw(ShotTexture[Shots[i].ShotType], fX, fY, 0, True, False);
           end;
 
           if g_debug_Frames then