DEADSOFTWARE

shitlight experiment
[d2df-sdl.git] / src / game / g_weapons.pas
index 2e2521b72f9956912574ac8a2eba69f71fe2ede4..baf71083a364a4808f2ea94424ac3cacdbcbe0e9 100644 (file)
@@ -88,6 +88,8 @@ procedure g_Weapon_DestroyShot(I: Integer; X, Y: Integer; Loud: Boolean = True);
 procedure g_Weapon_SaveState(var Mem: TBinMemoryWriter);
 procedure g_Weapon_LoadState(var Mem: TBinMemoryReader);
 
+procedure g_Weapon_AddDynLights();
+
 const
   WEAPON_KASTET         = 0;
   WEAPON_SAW            = 1;
@@ -554,7 +556,6 @@ begin
         Animation := nil;
         TextureID := 0;
         g_Frames_Get(TextureID, 'FRAMES_FLAME');
-        Stopped := 0;
       end;
     end;
 
@@ -663,6 +664,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;
 
@@ -683,6 +688,7 @@ 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 
@@ -1350,7 +1356,7 @@ end;
 procedure g_Weapon_flame(x, y, xd, yd: Integer; SpawnerUID: Word; WID: Integer = -1;
   Silent: Boolean = False);
 var
-  find_id, FramesID: DWORD;
+  find_id: DWORD;
   dx, dy: Integer;
 begin
   if WID < 0 then
@@ -1379,7 +1385,6 @@ begin
     Animation := nil;
     TextureID := 0;
     g_Frames_Get(TextureID, 'FRAMES_FLAME');
-    Stopped := 0;
   end;
 
   Shots[find_id].SpawnerUID := SpawnerUID;
@@ -1708,6 +1713,7 @@ var
   o: TObj;
   spl: Boolean;
   Loud: Boolean;
+  tcx, tcy: Integer;
 begin
   if Shots = nil then
     Exit;
@@ -1725,7 +1731,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
@@ -1759,7 +1765,10 @@ begin
              (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
@@ -1813,6 +1822,7 @@ begin
                     Anim := TAnimation.Create(TextureID, False, 8);
                     Anim.Blending := False;
                     g_GFX_OnceAnim((Obj.X+32)-58, (Obj.Y+8)-36, Anim);
+                    g_DynLightExplosion((Obj.X+32), (Obj.Y+8), 64, 1, 0, 0);
                     Anim.Free();
                   end;
                 end
@@ -1823,6 +1833,7 @@ begin
                     Anim := TAnimation.Create(TextureID, False, 6);
                     Anim.Blending := False;
                     g_GFX_OnceAnim(cx-64, cy-64, Anim);
+                    g_DynLightExplosion(cx, cy, 64, 1, 0, 0);
                     Anim.Free();
                   end;
                 end;
@@ -1880,6 +1891,7 @@ begin
                 Anim.Blending := False;
                 g_GFX_OnceAnim(cx-16, cy-16, Anim);
                 Anim.Free();
+                g_DynLightExplosion(cx, cy, 32, 0, 0.5, 0.5);
               end;
 
               g_Sound_PlayExAt('SOUND_WEAPON_EXPLODEPLASMA', Obj.X, Obj.Y);
@@ -1905,8 +1917,10 @@ begin
                 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),
+                  tcx := Random(8);
+                  tcy := Random(8);
+                  g_GFX_OnceAnim(cx-4+tcx-(Anim.Width div 2),
+                    cy-4+tcy-(Anim.Height div 2),
                     Anim, ONCEANIM_SMOKE);
                   Anim.Free();
                 end;
@@ -1955,20 +1969,14 @@ begin
               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);
-                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);
+                MOVE_HITWALL: begin tcx := cx-4+Random(8); tcy := cy-12+Random(24); end;
+                MOVE_HITLAND: begin tcx := cx-12+Random(24); tcy := cy-10+Random(8); end;
+                MOVE_HITCEIL: begin tcx := cx-12+Random(24); tcy := cy+6+Random(8); end;
+                else begin tcx := cx-4+Random(8); tcy := cy-4+Random(8); end;
               end;
+              g_GFX_OnceAnim(tcx-(Anim.Width div 2), tcy-(Anim.Height div 2), Anim, ONCEANIM_SMOKE);
               Anim.Free();
+              //g_DynLightExplosion(tcx, tcy, 1, 1, 0.8, 0.3);
             end;
           end;
 
@@ -1998,6 +2006,7 @@ begin
                 Anim.Blending := False;
                 g_GFX_OnceAnim(cx-64, cy-64, Anim);
                 Anim.Free();
+                g_DynLightExplosion(cx, cy, 96, 0, 1, 0);
               end;
 
               g_Sound_PlayExAt('SOUND_WEAPON_EXPLODEBFG', Obj.X, Obj.Y);
@@ -2422,4 +2431,38 @@ begin
   end;
 end;
 
+
+procedure g_Weapon_AddDynLights();
+var
+  i: Integer;
+begin
+  if Shots = nil then Exit;
+  for i := 0 to High(Shots) do
+  begin
+    if Shots[i].ShotType = 0 then continue;
+    if (Shots[i].ShotType = WEAPON_ROCKETLAUNCHER) or
+       (Shots[i].ShotType = WEAPON_BARON_FIRE) or
+       (Shots[i].ShotType = WEAPON_MANCUB_FIRE) or
+       (Shots[i].ShotType = WEAPON_SKEL_FIRE) or
+       (Shots[i].ShotType = WEAPON_IMP_FIRE) or
+       (Shots[i].ShotType = WEAPON_CACO_FIRE) or
+       (Shots[i].ShotType = WEAPON_MANCUB_FIRE) or
+       (Shots[i].ShotType = WEAPON_BSP_FIRE) or
+       (Shots[i].ShotType = WEAPON_PLASMA) or
+       (Shots[i].ShotType = WEAPON_BFG) or
+       (Shots[i].ShotType = WEAPON_FLAMETHROWER) or
+       false then
+    begin
+      if (Shots[i].ShotType = WEAPON_PLASMA) then
+        g_AddDynLight(Shots[i].Obj.X+(Shots[i].Obj.Rect.Width div 2), Shots[i].Obj.Y+(Shots[i].Obj.Rect.Height div 2), 128,  0, 0.3, 1, 0.4)
+      else if (Shots[i].ShotType = WEAPON_BFG) then
+        g_AddDynLight(Shots[i].Obj.X+(Shots[i].Obj.Rect.Width div 2), Shots[i].Obj.Y+(Shots[i].Obj.Rect.Height div 2), 128,  0, 1, 0, 0.5)
+      else if (Shots[i].ShotType = WEAPON_FLAMETHROWER) then
+        g_AddDynLight(Shots[i].Obj.X+(Shots[i].Obj.Rect.Width div 2), Shots[i].Obj.Y+(Shots[i].Obj.Rect.Height div 2), 42,  1, 0.8, 0, 0.4)
+      else
+        g_AddDynLight(Shots[i].Obj.X+(Shots[i].Obj.Rect.Width div 2), Shots[i].Obj.Y+(Shots[i].Obj.Rect.Height div 2), 128,  1, 0, 0, 0.4);
+    end;
+  end;
+end;
+
 end.