hedgewars/uGearsHandlersMess.pas
changeset 9769 5814e0c47c99
parent 9768 08799c901a42
child 9809 1e32628eb167
equal deleted inserted replaced
9768:08799c901a42 9769:5814e0c47c99
   279 procedure doStepFallingGear(Gear: PGear);
   279 procedure doStepFallingGear(Gear: PGear);
   280 var
   280 var
   281     isFalling: boolean;
   281     isFalling: boolean;
   282     //tmp: QWord;
   282     //tmp: QWord;
   283     tX, tdX, tdY: hwFloat;
   283     tX, tdX, tdY: hwFloat;
   284     collV, collH: LongInt;
   284     collV, collH, gX, gY: LongInt;
   285     land, xland: word;
   285     land, xland: word;
       
   286     boing: PVisualGear;
   286 begin
   287 begin
   287     tX:= Gear^.X;
   288     tX:= Gear^.X;
       
   289     gX:= hwRound(Gear^.X);
       
   290     gY:= hwRound(Gear^.Y);
   288     if (Gear^.Kind <> gtGenericFaller) and WorldWrap(Gear) and (WorldEdge = weWrap) and (Gear^.AdvBounce <> 0) and
   291     if (Gear^.Kind <> gtGenericFaller) and WorldWrap(Gear) and (WorldEdge = weWrap) and (Gear^.AdvBounce <> 0) and
   289       ((TestCollisionXwithGear(Gear, 1) <> 0) or (TestCollisionXwithGear(Gear, -1) <> 0))  then
   292       ((TestCollisionXwithGear(Gear, 1) <> 0) or (TestCollisionXwithGear(Gear, -1) <> 0))  then
   290         begin
   293         begin
   291         Gear^.X:= tX;
   294         Gear^.X:= tX;
   292         Gear^.dX.isNegative:= (hwRound(tX) > leftX+Gear^.Radius*2)
   295         Gear^.dX.isNegative:= (gX > leftX+Gear^.Radius*2)
   293         end;
   296         end;
   294 
   297 
   295     // clip velocity at 2 - over 1 per pixel, but really shouldn't cause many actual problems.
   298     // clip velocity at 2 - over 1 per pixel, but really shouldn't cause many actual problems.
   296     if Gear^.dX.Round > 2 then
   299     if Gear^.dX.Round > 2 then
   297         Gear^.dX.QWordValue:= 8589934592;
   300         Gear^.dX.QWordValue:= 8589934592;
   298     if Gear^.dY.Round > 2 then
   301     if Gear^.dY.Round > 2 then
   299         Gear^.dY.QWordValue:= 8589934592;
   302         Gear^.dY.QWordValue:= 8589934592;
   300 
   303 
   301     if (Gear^.State and gstSubmersible <> 0) and (hwRound(Gear^.Y) > cWaterLine) then
   304     if (Gear^.State and gstSubmersible <> 0) and (gY > cWaterLine) then
   302         begin
   305         begin
   303         Gear^.dX:= Gear^.dX * _0_999;
   306         Gear^.dX:= Gear^.dX * _0_999;
   304         Gear^.dY:= Gear^.dY * _0_999
   307         Gear^.dY:= Gear^.dY * _0_999
   305         end;
   308         end;
   306 
   309 
   309     collH := 0;
   312     collH := 0;
   310     tdX := Gear^.dX;
   313     tdX := Gear^.dX;
   311     tdY := Gear^.dY;
   314     tdY := Gear^.dY;
   312 
   315 
   313 // might need some testing/adjustments - just to avoid projectiles to fly forever (accelerated by wind/skips)
   316 // might need some testing/adjustments - just to avoid projectiles to fly forever (accelerated by wind/skips)
   314     if (hwRound(Gear^.X) < min(LAND_WIDTH div -2, -2048))
   317     if (gX < min(LAND_WIDTH div -2, -2048))
   315     or (hwRound(Gear^.X) > max(LAND_WIDTH * 3 div 2, 6144)) then
   318     or (gX > max(LAND_WIDTH * 3 div 2, 6144)) then
   316         Gear^.State := Gear^.State or gstCollision;
   319         Gear^.State := Gear^.State or gstCollision;
   317 
   320 
   318     if Gear^.dY.isNegative then
   321     if Gear^.dY.isNegative then
   319         begin
   322         begin
   320         isFalling := true;
   323         isFalling := true;
   432         Gear^.State := Gear^.State or gstMoving;
   435         Gear^.State := Gear^.State or gstMoving;
   433 
   436 
   434     if ((xland or land) and lfBouncy <> 0) and (Gear^.dX.QWordValue < _0_15.QWordValue) and (Gear^.dY.QWordValue < _0_15.QWordValue) then
   437     if ((xland or land) and lfBouncy <> 0) and (Gear^.dX.QWordValue < _0_15.QWordValue) and (Gear^.dY.QWordValue < _0_15.QWordValue) then
   435         Gear^.State := Gear^.State or gstCollision;
   438         Gear^.State := Gear^.State or gstCollision;
   436     
   439     
   437     if ((xland or land) and lfBouncy <> 0) and
   440     if ((xland or land) and lfBouncy <> 0) and (Gear^.Radius >= 3) and
   438         (((Gear^.Radius < 3) and (Gear^.dY < -_0_1)) or
   441        ((Gear^.dX.QWordValue > _0_15.QWordValue) or (Gear^.dY.QWordValue > _0_15.QWordValue)) then
   439             ((Gear^.Radius >= 3) and
   442         begin
   440                 ((Gear^.dX.QWordValue > _0_15.QWordValue) or (Gear^.dY.QWordValue > _0_15.QWordValue)))) then
   443         boing:= AddVisualGear(gX, gY, vgtStraightShot, 0, false, 1);
       
   444         if boing <> nil then
       
   445             with boing^ do
       
   446                 begin
       
   447                 Angle:= random(360);
       
   448                 dx:= 0;
       
   449                 dy:= 0;
       
   450                 FrameTicks:= 200;
       
   451                 tX:= _0;
       
   452                 tX.QWordValue:= Gear^.dY.QWordValue + Gear^.dX.QWordValue;
       
   453                 Scale:= hwFloat2Float(Gear^.Density * tX) / 1.5;
       
   454                 State:= ord(sprBoing)
       
   455                 end;
   441         PlaySound(sndMelonImpact, true)
   456         PlaySound(sndMelonImpact, true)
       
   457         end
   442     else if (Gear^.nImpactSounds > 0) and
   458     else if (Gear^.nImpactSounds > 0) and
   443         (Gear^.State and gstCollision <> 0) and
   459         (Gear^.State and gstCollision <> 0) and
   444         (((Gear^.Kind <> gtMine) and (Gear^.Damage <> 0)) or (Gear^.State and gstMoving <> 0)) and
   460         (((Gear^.Kind <> gtMine) and (Gear^.Damage <> 0)) or (Gear^.State and gstMoving <> 0)) and
   445         (((Gear^.Radius < 3) and (Gear^.dY < -_0_1)) or
   461         (((Gear^.Radius < 3) and (Gear^.dY < -_0_1)) or
   446             ((Gear^.Radius >= 3) and
   462             ((Gear^.Radius >= 3) and