DEADSOFTWARE

more flame tweaks
[d2df-sdl.git] / src / game / g_weapons.pas
index 6021daff58ecda40d6a0aceb210d69520ae25395..b5e46d11e930755b647728f1c8f9eae179555c98 100644 (file)
@@ -143,7 +143,7 @@ const
 
   SHOT_FLAME_WIDTH = 4;
   SHOT_FLAME_HEIGHT = 4;
-  SHOT_FLAME_LIFETIME = 360; 
+  SHOT_FLAME_LIFETIME = 180; 
 
   SHOT_SIGNATURE = $544F4853; // 'SHOT'
 
@@ -358,7 +358,7 @@ begin
     else
       Result := True;
     if t = HIT_FLAME then
-      m.CatchFire();
+      m.CatchFire(SpawnerUID);
   end
   else
     Result := True;
@@ -377,7 +377,7 @@ begin
     if (t <> HIT_FLAME) or (p.FFireTime = 0) or (vx <> 0) or (vy <> 0) then
       p.Damage(d, SpawnerUID, vx, vy, t);
     if (t = HIT_FLAME) then
-      p.CatchFire();
+      p.CatchFire(SpawnerUID);
   end;
 
   Result := True;
@@ -553,7 +553,7 @@ begin
         ShotType := WEAPON_FLAMETHROWER;
         Animation := nil;
         TextureID := 0;
-        Stopped := 0;
+        g_Frames_Get(TextureID, 'FRAMES_FLAME');
       end;
     end;
 
@@ -662,6 +662,10 @@ begin
   Shots[find_id].Obj.Accel.X := 0;
   Shots[find_id].Obj.Accel.Y := 0;
   Shots[find_id].SpawnerUID := Spawner;
+  if (ShotType = WEAPON_FLAMETHROWER) and (XV = 0) and (YV = 0) then
+    Shots[find_id].Stopped := 255
+  else
+    Shots[find_id].Stopped := 0;
   Result := find_id;
 end;
 
@@ -682,12 +686,16 @@ begin
   Shots[i].Obj.Vel.Y := (yd*s) div a;
   Shots[i].Obj.Accel.X := 0;
   Shots[i].Obj.Accel.Y := 0;
+  Shots[i].Stopped := 0;
   if Shots[i].ShotType in [WEAPON_ROCKETLAUNCHER, WEAPON_BFG] then
     Shots[i].Timeout := 900 // ~25 sec
-  else if Shots[i].ShotType = WEAPON_FLAMETHROWER then
-    Shots[i].Timeout := SHOT_FLAME_LIFETIME
-  else
-    Shots[i].Timeout := 550 // ~15 sec
+  else 
+  begin
+    if Shots[i].ShotType = WEAPON_FLAMETHROWER then
+      Shots[i].Timeout := SHOT_FLAME_LIFETIME
+    else
+      Shots[i].Timeout := 550; // ~15 sec
+  end;
 end;
 
 function g_Weapon_Hit(obj: PObj; d: Integer; SpawnerUID: Word; t: Byte; HitCorpses: Boolean = True): Byte;
@@ -1249,11 +1257,12 @@ begin
 
     dx := IfThen(xd > x, -Obj.Rect.Width, 0);
     dy := -(Obj.Rect.Height div 2);
+
+    ShotType := WEAPON_ROCKETLAUNCHER;
     throw(find_id, x+dx, y+dy, xd+dx, yd+dy, 12);
 
     Animation := nil;
     triggers := nil;
-    ShotType := WEAPON_ROCKETLAUNCHER;
     g_Texture_Get('TEXTURE_WEAPON_ROCKET', TextureID);
   end;
 
@@ -1287,10 +1296,11 @@ begin
 
     dx := -(Obj.Rect.Width div 2);
     dy := -(Obj.Rect.Height div 2);
+
+    ShotType := WEAPON_SKEL_FIRE;
     throw(find_id, x+dx, y+dy, xd+dx, yd+dy, 12);
 
     triggers := nil;
-    ShotType := WEAPON_SKEL_FIRE;
     target := TargetUID;
     g_Frames_Get(FramesID, 'FRAMES_WEAPON_SKELFIRE');
     Animation := TAnimation.Create(FramesID, True, 5);
@@ -1326,10 +1336,11 @@ begin
 
     dx := IfThen(xd>x, -Obj.Rect.Width, 0);
     dy := -(Obj.Rect.Height div 2);
+
+    ShotType := WEAPON_PLASMA;
     throw(find_id, x+dx, y+dy, xd+dx, yd+dy, 16);
 
     triggers := nil;
-    ShotType := WEAPON_PLASMA;
     g_Frames_Get(FramesID, 'FRAMES_WEAPON_PLASMA');
     Animation := TAnimation.Create(FramesID, True, 5);
   end;
@@ -1364,13 +1375,14 @@ begin
 
     dx := IfThen(xd>x, -Obj.Rect.Width, 0);
     dy := -(Obj.Rect.Height div 2);
+
+    ShotType := WEAPON_FLAMETHROWER;
     throw(find_id, x+dx, y+dy, xd+dx, yd+dy, 16);
 
     triggers := nil;
-    ShotType := WEAPON_FLAMETHROWER;
     Animation := nil;
     TextureID := 0;
-    Stopped := 0;
+    g_Frames_Get(TextureID, 'FRAMES_FLAME');
   end;
 
   Shots[find_id].SpawnerUID := SpawnerUID;
@@ -1403,10 +1415,11 @@ begin
 
     dx := IfThen(xd>x, -Obj.Rect.Width, 0);
     dy := -(Obj.Rect.Height div 2);
+
+    ShotType := WEAPON_IMP_FIRE;
     throw(find_id, x+dx, y+dy, xd+dx, yd+dy, 16);
 
     triggers := nil;
-    ShotType := WEAPON_IMP_FIRE;
     g_Frames_Get(FramesID, 'FRAMES_WEAPON_IMPFIRE');
     Animation := TAnimation.Create(FramesID, True, 4);
   end;
@@ -1441,10 +1454,11 @@ begin
 
     dx := IfThen(xd>x, -Obj.Rect.Width, 0);
     dy := -(Obj.Rect.Height div 2);
+
+    ShotType := WEAPON_CACO_FIRE;
     throw(find_id, x+dx, y+dy, xd+dx, yd+dy, 16);
 
     triggers := nil;
-    ShotType := WEAPON_CACO_FIRE;
     g_Frames_Get(FramesID, 'FRAMES_WEAPON_CACOFIRE');
     Animation := TAnimation.Create(FramesID, True, 4);
   end;
@@ -1479,10 +1493,11 @@ begin
 
     dx := IfThen(xd>x, -Obj.Rect.Width, 0);
     dy := -(Obj.Rect.Height div 2);
+
+    ShotType := WEAPON_BARON_FIRE;
     throw(find_id, x+dx, y+dy, xd+dx, yd+dy, 16);
 
     triggers := nil;
-    ShotType := WEAPON_BARON_FIRE;
     g_Frames_Get(FramesID, 'FRAMES_WEAPON_BARONFIRE');
     Animation := TAnimation.Create(FramesID, True, 4);
   end;
@@ -1517,10 +1532,12 @@ begin
 
     dx := IfThen(xd>x, -Obj.Rect.Width, 0);
     dy := -(Obj.Rect.Height div 2);
+
+    ShotType := WEAPON_BSP_FIRE;
     throw(find_id, x+dx, y+dy, xd+dx, yd+dy, 16);
 
     triggers := nil;
-    ShotType := WEAPON_BSP_FIRE;
+    
     g_Frames_Get(FramesID, 'FRAMES_WEAPON_BSPFIRE');
     Animation := TAnimation.Create(FramesID, True, 4);
   end;
@@ -1555,10 +1572,12 @@ begin
 
     dx := IfThen(xd>x, -Obj.Rect.Width, 0);
     dy := -(Obj.Rect.Height div 2);
+
+    ShotType := WEAPON_MANCUB_FIRE;
     throw(find_id, x+dx, y+dy, xd+dx, yd+dy, 16);
 
     triggers := nil;
-    ShotType := WEAPON_MANCUB_FIRE;
+
     g_Frames_Get(FramesID, 'FRAMES_WEAPON_MANCUBFIRE');
     Animation := TAnimation.Create(FramesID, True, 4);
   end;
@@ -1593,10 +1612,11 @@ begin
 
     dx := IfThen(xd>x, -Obj.Rect.Width, 0);
     dy := -(Obj.Rect.Height div 2);
+
+    ShotType := WEAPON_BFG;
     throw(find_id, x+dx, y+dy, xd+dx, yd+dy, 16);
 
     triggers := nil;
-    ShotType := WEAPON_BFG;
     g_Frames_Get(FramesID, 'FRAMES_WEAPON_BFG');
     Animation := TAnimation.Create(FramesID, True, 6);
   end;
@@ -1682,7 +1702,7 @@ end;
 
 procedure g_Weapon_Update();
 var
-  i, a, h, cx, cy, oldvx, oldvy: Integer;
+  i, a, h, cx, cy, oldvx, oldvy, tf: Integer;
   _id: DWORD;
   Anim: TAnimation;
   t: DWArray;
@@ -1708,7 +1728,7 @@ begin
       oldvx := Obj.Vel.X;
       oldvy := Obj.Vel.Y;
     // Àêòèâèðîâàòü òðèããåðû ïî ïóòè (êðîìå óæå àêòèâèðîâàííûõ):
-      if g_Game_IsServer then
+      if (Stopped = 0) and g_Game_IsServer then
         t := g_Triggers_PressR(Obj.X, Obj.Y, Obj.Rect.Width, Obj.Rect.Height,
                                SpawnerUID, ACTIVATE_SHOT, triggers)
       else
@@ -1739,9 +1759,13 @@ begin
     // Äâèæåíèå:
       spl := (ShotType <> WEAPON_PLASMA) and
              (ShotType <> WEAPON_BFG) and
-             (ShotType <> WEAPON_BSP_FIRE);
+             (ShotType <> WEAPON_BSP_FIRE) and
+             (ShotType <> WEAPON_FLAMETHROWER);
 
-      st := g_Obj_Move(@Obj, False, spl);
+      if Stopped = 0 then
+        st := g_Obj_Move(@Obj, False, spl)
+      else
+        st := 0;
 
       if WordBool(st and MOVE_FALLOUT) or (Obj.X < -1000) or
         (Obj.X > gMapInfo.Width+1000) or (Obj.Y < -1000) then
@@ -1872,9 +1896,29 @@ begin
 
         WEAPON_FLAMETHROWER: // Îãíåìåò
           begin
-          // Ïîä âîäîé íå ñòðåëÿåò, ñî âðåìåíåì óìèðàåò
-            if (Timeout < 1) or WordBool(st and (MOVE_INWATER)) then
+          // Ñî âðåìåíåì óìèðàåò
+            if (Timeout < 1) then
+            begin
+              ShotType := 0;
+              Continue;
+            end;
+          // Ïîä âîäîé òîæå
+            if WordBool(st and (MOVE_HITWATER or MOVE_INWATER)) then
             begin
+              if WordBool(st and MOVE_HITWATER) then
+              begin
+                if g_Frames_Get(_id, 'FRAMES_SMOKE') then
+                begin
+                  Anim := TAnimation.Create(_id, False, 3);
+                  Anim.Alpha := 0;
+                  g_GFX_OnceAnim(cx-4+Random(8)-(Anim.Width div 2),
+                    cy-4+Random(8)-(Anim.Height div 2),
+                    Anim, ONCEANIM_SMOKE);
+                  Anim.Free();
+                end;
+              end
+              else
+                g_GFX_Bubbles(cx, cy, 1+Random(3), 16, 16);
               ShotType := 0;
               Continue;
             end;
@@ -1889,13 +1933,15 @@ begin
               Obj.Vel.X := 0;
               Obj.Vel.Y := 0;
               Obj.Accel.Y := 0;
-              if WordBool(st and (MOVE_HITWALL or MOVE_HITWATER)) then
-                Stopped := 1
-              else
-                Stopped := 2;
+              if WordBool(st and MOVE_HITWALL) then
+                Stopped := MOVE_HITWALL
+              else if WordBool(st and MOVE_HITLAND) then
+                Stopped := MOVE_HITLAND
+              else if WordBool(st and MOVE_HITCEIL) then
+                Stopped := MOVE_HITCEIL;
             end;
 
-            a := IfThen(Stopped = 0, 2, 1);
+            a := IfThen(Stopped = 0, 3, 1);
           // Åñëè â êîãî-òî ïîïàëè
             if g_Weapon_Hit(@Obj, a, SpawnerUID, HIT_FLAME, False) <> 0 then
             begin
@@ -1905,20 +1951,28 @@ begin
                 ShotType := 0;
             end;
 
-            if g_Frames_Get(_id, 'FRAMES_FLAME') then
+            if Stopped = 0 then
+              tf := 2
+            else
+              tf := 3;
+
+            if (gTime mod tf = 0) then
             begin
-              Anim := TAnimation.Create(_id, False, 3);
+              Anim := TAnimation.Create(TextureID, False, 2 + Random(2));
               Anim.Alpha := 0;
               case Stopped of
-                0: g_GFX_OnceAnim(cx-4+Random(8)-(Anim.Width div 2),
-                               cy-4+Random(8)-(Anim.Height div 2),
-                               Anim, ONCEANIM_SMOKE);
-                1: g_GFX_OnceAnim(cx-4+Random(8)-(Anim.Width div 2),
-                               cy-12+Random(24)-(Anim.Height div 2),
-                               Anim, ONCEANIM_SMOKE);
-                2: g_GFX_OnceAnim(cx-12+Random(24)-(Anim.Width div 2),
-                               cy-4+Random(8)-(Anim.Height div 2),
-                               Anim, ONCEANIM_SMOKE);
+                MOVE_HITWALL:  g_GFX_OnceAnim(cx-4+Random(8)-(Anim.Width div 2),
+                                 cy-12+Random(24)-(Anim.Height div 2),
+                                 Anim, ONCEANIM_SMOKE);
+                MOVE_HITLAND:  g_GFX_OnceAnim(cx-12+Random(24)-(Anim.Width div 2),
+                                 cy-10+Random(8)-(Anim.Height div 2),
+                                 Anim, ONCEANIM_SMOKE);
+                MOVE_HITCEIL:  g_GFX_OnceAnim(cx-12+Random(24)-(Anim.Width div 2),
+                                 cy+6+Random(8)-(Anim.Height div 2),
+                                 Anim, ONCEANIM_SMOKE);
+                else           g_GFX_OnceAnim(cx-4+Random(8)-(Anim.Width div 2),
+                                 cy-4+Random(8)-(Anim.Height div 2),
+                                 Anim, ONCEANIM_SMOKE);
               end;
               Anim.Free();
             end;
@@ -2083,7 +2137,7 @@ begin
           begin
             if (Shots[i].ShotType = WEAPON_ROCKETLAUNCHER) then
               e_DrawAdv(TextureID, Obj.X, Obj.Y, 0, True, False, a, @p, M_NONE)
-            else
+            else if (Shots[i].ShotType <> WEAPON_FLAMETHROWER) then
               e_Draw(TextureID, Obj.X, Obj.Y, 0, True, False);
           end;