diff -r 35103b1a014c -r fcb29a13b1b1 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Thu May 09 18:19:17 2013 -0400 +++ b/hedgewars/GSHandlers.inc Thu May 09 23:11:56 2013 -0400 @@ -1427,12 +1427,8 @@ if (Gear^.Health = 0) then begin dxdy:= hwAbs(Gear^.dX)+hwAbs(Gear^.dY); - if (dxdy > _0_35) and - ((TestCollisionYwithGear(Gear, 1) <> 0) or - TestCollisionXwithGear(Gear, 1) or - (TestCollisionYwithGear(Gear, -1) <> 0) or - TestCollisionXwithGear(Gear, -1)) then - inc(Gear^.Damage, hwRound(dxdy * _25)); + if (dxdy > _0_4) and (Gear^.State and gstCollision <> 0) then + inc(Gear^.Damage, hwRound(dxdy * _50)); if ((GameTicks and $FF) = 0) and (Gear^.Damage > random(30)) then begin @@ -1582,23 +1578,21 @@ DeleteCI(Gear); AllInactive := false; dxdy:= hwAbs(Gear^.dX)+hwAbs(Gear^.dY); - if (dxdy > _0_35) then + doStepFallingGear(Gear); + if (Gear^.State and gstCollision <> 0) and(dxdy > _0_4) then begin if (TestCollisionYwithGear(Gear, 1) <> 0) then begin Gear^.State := Gear^.State or gsttmpFlag; - inc(Gear^.Damage, hwRound(dxdy * _25)); for i:= min(12, hwRound(dxdy*_10)) downto 0 do begin particle := AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12,vgtDust); if particle <> nil then particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480) end - end - else if TestCollisionXwithGear(Gear, 1) or (TestCollisionYwithGear(Gear, -1) <> 0) or TestCollisionXwithGear(Gear, -1) then - inc(Gear^.Damage, hwRound(dxdy * _25)) + end; + inc(Gear^.Damage, hwRound(dxdy * _50)) end; - doStepFallingGear(Gear); CalcRotationDirAngle(Gear); //CheckGearDrowning(Gear) end @@ -1637,23 +1631,19 @@ dec(Gear^.Health, Gear^.Damage); Gear^.Damage := 0; if Gear^.Health <= 0 then - Gear^.doStep := @doStepCase; - // Hand off to doStepCase for the explosion - + doStepCase(Gear); end; procedure doStepCase(Gear: PGear); var i, x, y: LongInt; k: TGearType; - exBoom: boolean; dX, dY: HWFloat; hog: PHedgehog; sparkles: PVisualGear; gi: PGear; begin k := Gear^.Kind; - exBoom := false; if (Gear^.Message and gmDestroy) > 0 then begin @@ -1667,6 +1657,35 @@ exit end; + if ((Gear^.Kind <> gtExplosives) and (Gear^.Damage > 0)) or (Gear^.Health<=0) then + begin + x := hwRound(Gear^.X); + y := hwRound(Gear^.Y); + hog:= Gear^.Hedgehog; + + DeleteGear(Gear); + // <-- delete gear! + + if k = gtCase then + begin + doMakeExplosion(x, y, 25, hog, EXPLAutoSound); + for i:= 0 to 63 do + AddGear(x, y, gtFlame, 0, _0, _0, 0); + end + else if k = gtExplosives then + begin + doMakeExplosion(x, y, 75, hog, EXPLAutoSound); + for i:= 0 to 31 do + begin + dX := AngleCos(i * 64) * _0_5 * (getrandomf + _1); + dY := AngleSin(i * 64) * _0_5 * (getrandomf + _1); + AddGear(x, y, gtFlame, 0, dX, dY, 0); + AddGear(x, y, gtFlame, gstTmpFlag, -dX, -dY, 0); + end + end; + exit + end; + if k = gtExplosives then begin //if V > _0_03 then Gear^.State:= Gear^.State or gstAnimation; @@ -1677,15 +1696,13 @@ end else Gear^.dX:= _0; - if (Gear^.Health > 0) and ((Gear^.Health * 100 div cBarrelHealth) < random(90)) and ((GameTicks and $FF) = 0) then + if ((Gear^.Health * 100 div cBarrelHealth) < random(90)) and ((GameTicks and $FF) = 0) then if (cBarrelHealth div Gear^.Health) > 2 then AddVisualGear(hwRound(Gear^.X) - 16 + Random(32), hwRound(Gear^.Y) - 2, vgtSmoke) - else - AddVisualGear(hwRound(Gear^.X) - 16 + Random(32), hwRound(Gear^.Y) - 2, vgtSmokeWhite); + else + AddVisualGear(hwRound(Gear^.X) - 16 + Random(32), hwRound(Gear^.Y) - 2, vgtSmokeWhite); dec(Gear^.Health, Gear^.Damage); Gear^.Damage := 0; - if Gear^.Health <= 0 then - exBoom := true; end else begin @@ -1737,34 +1754,6 @@ end end; - if (Gear^.Damage > 0) or exBoom then - begin - x := hwRound(Gear^.X); - y := hwRound(Gear^.Y); - hog:= Gear^.Hedgehog; - - DeleteGear(Gear); - // <-- delete gear! - - if k = gtCase then - begin - doMakeExplosion(x, y, 25, hog, EXPLAutoSound); - for i:= 0 to 63 do - AddGear(x, y, gtFlame, 0, _0, _0, 0); - end - else if k = gtExplosives then - begin - doMakeExplosion(x, y, 75, hog, EXPLAutoSound); - for i:= 0 to 31 do - begin - dX := AngleCos(i * 64) * _0_5 * (getrandomf + _1); - dY := AngleSin(i * 64) * _0_5 * (getrandomf + _1); - AddGear(x, y, gtFlame, 0, dX, dY, 0); - AddGear(x, y, gtFlame, gstTmpFlag, -dX, -dY, 0); - end - end; - exit - end; if (Gear^.dY.QWordValue <> 0) or (TestCollisionYwithGear(Gear, 1) = 0) then