In progress, trying to make a fire for molotov cocktail. Normal fire should still work fairly normally.
authornemo
Mon, 12 Oct 2009 13:44:34 +0000
changeset 2424 b52344de23ae
parent 2423 32213ae19ba9
child 2425 a4af95e6382c
In progress, trying to make a fire for molotov cocktail. Normal fire should still work fairly normally.
hedgewars/GSHandlers.inc
hedgewars/uGears.pas
--- a/hedgewars/GSHandlers.inc	Mon Oct 12 00:14:42 2009 +0000
+++ b/hedgewars/GSHandlers.inc	Mon Oct 12 13:44:34 2009 +0000
@@ -1231,7 +1231,7 @@
 procedure doStepFlame(Gear: PGear);
 var i: Integer;
 begin
-AllInactive:= false;
+    if (Gear^.State and gsttmpFlag) = 0 then AllInactive:= false;
 
 if not TestCollisionYwithGear(Gear, 1) then
 	begin
@@ -1254,21 +1254,35 @@
 		DeleteGear(Gear);
 		exit
 		end
-	end else begin
-	if Gear^.Timer > 0 then dec(Gear^.Timer)
-		else begin
-		Gear^.Radius:= 9;
-		AmmoShove(Gear, 4, 100);
-		Gear^.Radius:= 1;
-		doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 4, EXPLNoDamage);
-		dec(Gear^.Health);
-		Gear^.Timer:= 450 - Gear^.Tag * 8
-		end
-	end;
-
-//if (((GameTicks div 8) mod 64) = Gear^.Tag) then
-//	AmmoFlameWork(Gear);
-
+    end else begin
+        if (Gear^.State and gsttmpFlag) <> 0 then 
+            begin
+            Gear^.Radius:= 9;
+            AmmoShove(Gear, 4, 100);
+            Gear^.Radius:= 1
+            end;
+	    if Gear^.Timer > 0 then dec(Gear^.Timer)
+        else begin
+// Standard fire
+            if (Gear^.State and gsttmpFlag) = 0 then
+                begin
+                Gear^.Radius:= 9;
+                AmmoShove(Gear, 4, 100);
+                Gear^.Radius:= 1;
+                doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 4, EXPLNoDamage);
+                if Gear^.Health > 0 then dec(Gear^.Health);
+                Gear^.Timer:= 450 - Gear^.Tag * 8
+                end
+                else begin
+// Modified fire
+                if ((GameTicks and $1FF) = 0) and ((GameFlags and gfSolidLand) = 0) then
+                    DrawExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 4);
+                // This one is interesting.  I think I understand the purpose, but I wonder if a bit more fuzzy of kicking could be done with getrandom.
+        	    Gear^.Timer:= 100 - Gear^.Tag * 3;
+                if ((GameTicks and $FF) = 0) then Gear^.Health:= 0
+                end
+            end
+        end;
 if Gear^.Health = 0 then
 	DeleteGear(Gear)
 end;
--- a/hedgewars/uGears.pas	Mon Oct 12 00:14:42 2009 +0000
+++ b/hedgewars/uGears.pas	Mon Oct 12 13:44:34 2009 +0000
@@ -330,7 +330,7 @@
                 end;
       gtShover: Result^.Radius:= 20;
        gtFlame: begin
-                Result^.Tag:= Counter mod 32;
+                Result^.Tag:= GetRandom(32);
                 Result^.Radius:= 1;
                 Result^.Health:= 5;
                 if (Result^.dY.QWordValue = 0) and (Result^.dX.QWordValue = 0) then
@@ -1631,6 +1631,7 @@
 
 procedure AmmoShove(Ammo: PGear; Damage, Power: LongInt);
 var t: PGearArray;
+    Gear: PGear;
     i: LongInt;
 begin
 t:= CheckGearsCollision(Ammo);
@@ -1641,39 +1642,41 @@
 while i > 0 do
 	begin
 	dec(i);
-	if (t^.ar[i]^.State and gstNoDamage) = 0 then
-		case t^.ar[i]^.Kind of
+    Gear:= t^.ar[i];
+    if (Gear^.State and gstNoDamage) = 0 then
+        case Gear^.Kind of
 			gtHedgehog,
 			gtMine,
 			gtTarget,
 			gtCase: begin
 					if (Ammo^.Kind = gtDrill) then begin Ammo^.Timer:= 0; exit; end;
-                    if (not t^.ar[i]^.Invulnerable) then
-                        ApplyDamage(t^.ar[i], Damage)
+                    if (Ammo^.Kind = gtFlame) then Ammo^.Health:= 0;
+                    if (not Gear^.Invulnerable) then
+                        ApplyDamage(Gear, Damage)
                     else
-                        t^.ar[i]^.State:= t^.ar[i]^.State or gstWinner;
+                        Gear^.State:= Gear^.State or gstWinner;
 
-					DeleteCI(t^.ar[i]);
-					t^.ar[i]^.dX:= Ammo^.dX * Power * _0_01;
-					t^.ar[i]^.dY:= Ammo^.dY * Power * _0_01;
-					t^.ar[i]^.Active:= true;
-					t^.ar[i]^.State:= t^.ar[i]^.State or gstMoving;
+					DeleteCI(Gear);
+					Gear^.dX:= Ammo^.dX * Power * _0_01;
+					Gear^.dY:= Ammo^.dY * Power * _0_01;
+					Gear^.Active:= true;
+					Gear^.State:= Gear^.State or gstMoving;
 
-					if TestCollisionXwithGear(t^.ar[i], hwSign(t^.ar[i]^.dX)) then
+					if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
 						begin
-						if not (TestCollisionXwithXYShift(t^.ar[i], _0, -3, hwSign(t^.ar[i]^.dX))
-							or TestCollisionYwithGear(t^.ar[i], -1)) then t^.ar[i]^.Y:= t^.ar[i]^.Y - _1;
-						if not (TestCollisionXwithXYShift(t^.ar[i], _0, -2, hwSign(t^.ar[i]^.dX))
-							or TestCollisionYwithGear(t^.ar[i], -1)) then t^.ar[i]^.Y:= t^.ar[i]^.Y - _1;
-						if not (TestCollisionXwithXYShift(t^.ar[i], _0, -1, hwSign(t^.ar[i]^.dX))
-							or TestCollisionYwithGear(t^.ar[i], -1)) then t^.ar[i]^.Y:= t^.ar[i]^.Y - _1;
+						if not (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX))
+							or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1;
+						if not (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX))
+							or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1;
+						if not (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX))
+							or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1;
 						end;
-
-					FollowGear:= t^.ar[i]
+					
+					FollowGear:= Gear
 					end;
 		end
 	end;
-SetAllToActive
+if i <> 0 then SetAllToActive
 end;
 
 procedure AssignHHCoords;