DEADSOFTWARE

added `.positionChanged()` to (almost) all entities; don't forget to call it after...
[d2df-sdl.git] / src / game / g_weapons.pas
index 22fc69dd520dd148c7206a2d803607342fc22251..3585ef2b4d136f148003fcc717d9a172bc28f4e6 100644 (file)
@@ -13,7 +13,7 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *)
-{$INCLUDE g_amodes.inc}
+{$INCLUDE ../shared/a_modes.inc}
 unit g_weapons;
 
 interface
@@ -45,8 +45,11 @@ type
     TextureID: DWORD;
     Timeout: DWORD;
     Stopped: Byte;
+
+    procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
   end;
 
+
 var
   Shots: array of TShot = nil;
   LastShotID: Integer = 0;
@@ -145,7 +148,7 @@ const
 
   SHOT_FLAME_WIDTH = 4;
   SHOT_FLAME_HEIGHT = 4;
-  SHOT_FLAME_LIFETIME = 180; 
+  SHOT_FLAME_LIFETIME = 180;
 
   SHOT_SIGNATURE = $544F4853; // 'SHOT'
 
@@ -727,8 +730,9 @@ var
           if ChkTeam then
             if HitPlayer(gPlayers[i], d, obj^.Vel.X, obj^.Vel.Y, SpawnerUID, t) then
             begin
-              gPlayers[i].Push((obj^.Vel.X+obj^.Accel.X)*IfThen(t = HIT_BFG, 8, 1) div 4,
-                               (obj^.Vel.Y+obj^.Accel.Y)*IfThen(t = HIT_BFG, 8, 1) div 4);
+              if t <> HIT_FLAME then
+                gPlayers[i].Push((obj^.Vel.X+obj^.Accel.X)*IfThen(t = HIT_BFG, 8, 1) div 4,
+                                 (obj^.Vel.Y+obj^.Accel.Y)*IfThen(t = HIT_BFG, 8, 1) div 4);
               if t = HIT_BFG then
                 g_Game_DelayEvent(DE_BFGHIT, 1000, SpawnerUID);
               Result := True;
@@ -748,8 +752,9 @@ var
         if (gMonsters[i] <> nil) and gMonsters[i].Live and g_Obj_Collide(obj, @gMonsters[i].Obj) then
           if HitMonster(gMonsters[i], d, obj^.Vel.X, obj^.Vel.Y, SpawnerUID, t) then
           begin
-            gMonsters[i].Push((obj^.Vel.X+obj^.Accel.X)*IfThen(t = HIT_BFG, 8, 1) div 4,
-                              (obj^.Vel.Y+obj^.Accel.Y)*IfThen(t = HIT_BFG, 8, 1) div 4);
+            if t <> HIT_FLAME then
+              gMonsters[i].Push((obj^.Vel.X+obj^.Accel.X)*IfThen(t = HIT_BFG, 8, 1) div 4,
+                                (obj^.Vel.Y+obj^.Accel.Y)*IfThen(t = HIT_BFG, 8, 1) div 4);
             Result := True;
             break;
           end;
@@ -959,6 +964,7 @@ begin
                                Obj.Y+Obj.Rect.Y+(Obj.Rect.Height div 2), X, Y);
 
             g_Obj_PushA(@Obj, Round(15*(rad-m)/rad), _angle);
+            positionChanged(); // this updates spatial accelerators
           end;
         end;
 end;
@@ -1766,9 +1772,14 @@ begin
              (ShotType <> WEAPON_FLAMETHROWER);
 
       if Stopped = 0 then
-        st := g_Obj_Move(@Obj, False, spl)
+      begin
+        st := g_Obj_Move(@Obj, False, spl);
+      end
       else
+      begin
         st := 0;
+      end;
+      positionChanged(); // this updates spatial accelerators
 
       if WordBool(st and MOVE_FALLOUT) or (Obj.X < -1000) or
         (Obj.X > gMapInfo.Width+1000) or (Obj.Y < -1000) then
@@ -2465,4 +2476,8 @@ begin
   end;
 end;
 
+
+procedure TShot.positionChanged (); begin end;
+
+
 end.