hedgewars/uGearsHandlersRope.pas
changeset 9706 5178d2263521
parent 9683 a342837fc875
child 9809 1e32628eb167
equal deleted inserted replaced
9704:055fee9da6a0 9706:5178d2263521
    34     tX:     hwFloat;
    34     tX:     hwFloat;
    35 begin
    35 begin
    36     HHGear := Gear^.Hedgehog^.Gear;
    36     HHGear := Gear^.Hedgehog^.Gear;
    37     tX:= HHGear^.X;
    37     tX:= HHGear^.X;
    38     if WorldWrap(HHGear) and (WorldEdge = weWrap) and 
    38     if WorldWrap(HHGear) and (WorldEdge = weWrap) and 
    39        (TestCollisionXwithGear(HHGear, 1) or TestCollisionXwithGear(HHGear, -1))  then
    39        ((TestCollisionXwithGear(HHGear, 1) <> 0) or (TestCollisionXwithGear(HHGear, -1) <> 0))  then
    40         begin
    40         begin
    41         HHGear^.X:= tX;
    41         HHGear^.X:= tX;
    42         HHGear^.dX.isNegative:= (hwRound(tX) > leftX+HHGear^.Radius*2)
    42         HHGear^.dX.isNegative:= (hwRound(tX) > leftX+HHGear^.Radius*2)
    43         end;
    43         end;
    44 
    44 
    60         exit
    60         exit
    61         end;
    61         end;
    62 
    62 
    63     HedgehogChAngle(HHGear);
    63     HedgehogChAngle(HHGear);
    64 
    64 
    65     if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then
    65     if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) <> 0 then
    66         SetLittle(HHGear^.dX);
    66         SetLittle(HHGear^.dX);
    67 
    67 
    68     if HHGear^.dY.isNegative and (TestCollisionYwithGear(HHGear, -1) <> 0) then
    68     if HHGear^.dY.isNegative and (TestCollisionYwithGear(HHGear, -1) <> 0) then
    69         HHGear^.dY := _0;
    69         HHGear^.dY := _0;
    70     HHGear^.X := HHGear^.X + HHGear^.dX;
    70     HHGear^.X := HHGear^.X + HHGear^.dX;
   125 
   125 
   126     HHGear := Gear^.Hedgehog^.Gear;
   126     HHGear := Gear^.Hedgehog^.Gear;
   127 
   127 
   128     tX:= HHGear^.X;
   128     tX:= HHGear^.X;
   129     if WorldWrap(HHGear) and (WorldEdge = weWrap) and 
   129     if WorldWrap(HHGear) and (WorldEdge = weWrap) and 
   130        (TestCollisionXwithGear(HHGear, 1) or TestCollisionXwithGear(HHGear, -1))  then
   130        ((TestCollisionXwithGear(HHGear, 1) <> 0) or (TestCollisionXwithGear(HHGear, -1) <> 0))  then
   131         begin
   131         begin
   132         PlaySound(sndRopeRelease);
   132         PlaySound(sndRopeRelease);
   133         RopeDeleteMe(Gear, HHGear);
   133         RopeDeleteMe(Gear, HHGear);
   134         HHGear^.X:= tX;
   134         HHGear^.X:= tX;
   135         HHGear^.dX.isNegative:= (hwRound(tX) > leftX+HHGear^.Radius*2);
   135         HHGear^.dX.isNegative:= (hwRound(tX) > leftX+HHGear^.Radius*2);
   145         exit
   145         exit
   146         end;
   146         end;
   147 
   147 
   148     HHGear^.dX.QWordValue:= HHGear^.dX.QWordValue shl 2;
   148     HHGear^.dX.QWordValue:= HHGear^.dX.QWordValue shl 2;
   149     HHGear^.dY.QWordValue:= HHGear^.dY.QWordValue shl 2;
   149     HHGear^.dY.QWordValue:= HHGear^.dY.QWordValue shl 2;
   150     if (Gear^.Message and gmLeft  <> 0) and (not TestCollisionXwithGear(HHGear, -1)) then
   150     if (Gear^.Message and gmLeft  <> 0) and (TestCollisionXwithGear(HHGear, -1) = 0) then
   151         HHGear^.dX := HHGear^.dX - _0_0032;
   151         HHGear^.dX := HHGear^.dX - _0_0032;
   152 
   152 
   153     if (Gear^.Message and gmRight <> 0) and (not TestCollisionXwithGear(HHGear,  1)) then
   153     if (Gear^.Message and gmRight <> 0) and (TestCollisionXwithGear(HHGear,  1) = 0) then
   154         HHGear^.dX := HHGear^.dX + _0_0032;
   154         HHGear^.dX := HHGear^.dX + _0_0032;
   155 
   155 
   156     // vector between hedgehog and rope attaching point
   156     // vector between hedgehog and rope attaching point
   157     ropeDx := HHGear^.X - Gear^.X;
   157     ropeDx := HHGear^.X - Gear^.X;
   158     ropeDy := HHGear^.Y - Gear^.Y;
   158     ropeDy := HHGear^.Y - Gear^.Y;
   159 
   159 
   160     if not TestCollisionYwithXYShift(HHGear, 0, 1, 1) then
   160     if TestCollisionYwithXYShift(HHGear, 0, 1, 1) = 0 then
   161         begin
   161         begin
   162 
   162 
   163         // depending on the rope vector we know which X-side to check for collision
   163         // depending on the rope vector we know which X-side to check for collision
   164         // in order to find out if the hog can still be moved by gravity
   164         // in order to find out if the hog can still be moved by gravity
   165         if ropeDx.isNegative = RopeDy.IsNegative then
   165         if ropeDx.isNegative = RopeDy.IsNegative then
   166             cd:= -1
   166             cd:= -1
   167         else
   167         else
   168             cd:= 1;
   168             cd:= 1;
   169 
   169 
   170         // apply gravity if there is no obstacle
   170         // apply gravity if there is no obstacle
   171         if not (TestCollisionXwithXYShift(HHGear, _2*cd, 0, cd, true)) then
   171         if TestCollisionXwithXYShift(HHGear, _2*cd, 0, cd, true) = 0 then
   172             HHGear^.dY := HHGear^.dY + cGravity * 16;
   172             HHGear^.dY := HHGear^.dY + cGravity * 16;
   173 
   173 
   174         if (GameFlags and gfMoreWind) <> 0 then
   174         if (GameFlags and gfMoreWind) <> 0 then
   175             // apply wind if there's no obstacle
   175             // apply wind if there's no obstacle
   176             if not TestCollisionXwithGear(HHGear, hwSign(cWindSpeed)) then
   176             if TestCollisionXwithGear(HHGear, hwSign(cWindSpeed)) = 0 then
   177                 HHGear^.dX := HHGear^.dX + cWindSpeed * 16 / HHGear^.Density;
   177                 HHGear^.dX := HHGear^.dX + cWindSpeed * 16 / HHGear^.Density;
   178         end;
   178         end;
   179 
   179 
   180     mdX := ropeDx + HHGear^.dX;
   180     mdX := ropeDx + HHGear^.dX;
   181     mdY := ropeDy + HHGear^.dY;
   181     mdY := ropeDy + HHGear^.dY;
   191     /////
   191     /////
   192     tx := HHGear^.X;
   192     tx := HHGear^.X;
   193     ty := HHGear^.Y;
   193     ty := HHGear^.Y;
   194 
   194 
   195     if ((Gear^.Message and gmDown) <> 0) and (Gear^.Elasticity < Gear^.Friction) then
   195     if ((Gear^.Message and gmDown) <> 0) and (Gear^.Elasticity < Gear^.Friction) then
   196         if not (TestCollisionXwithXYShift(HHGear, _2*hwSign(ropeDx), 0, hwSign(ropeDx), true)
   196         if not ((TestCollisionXwithXYShift(HHGear, _2*hwSign(ropeDx), 0, hwSign(ropeDx), true) <> 0)
   197         or ((ropeDy.QWordValue <> 0) and TestCollisionYwithXYShift(HHGear, 0, 1*hwSign(ropeDy), hwSign(ropeDy)))) then
   197         or ((ropeDy.QWordValue <> 0) and (TestCollisionYwithXYShift(HHGear, 0, 1*hwSign(ropeDy), hwSign(ropeDy)) <> 0))) then
   198             Gear^.Elasticity := Gear^.Elasticity + _1_2;
   198             Gear^.Elasticity := Gear^.Elasticity + _1_2;
   199 
   199 
   200     if ((Gear^.Message and gmUp) <> 0) and (Gear^.Elasticity > _30) then
   200     if ((Gear^.Message and gmUp) <> 0) and (Gear^.Elasticity > _30) then
   201         if not (TestCollisionXwithXYShift(HHGear, -_2*hwSign(ropeDx), 0, -hwSign(ropeDx), true)
   201         if not ((TestCollisionXwithXYShift(HHGear, -_2*hwSign(ropeDx), 0, -hwSign(ropeDx), true) <> 0)
   202         or ((ropeDy.QWordValue <> 0) and TestCollisionYwithXYShift(HHGear, 0, 1*-hwSign(ropeDy), -hwSign(ropeDy)))) then
   202         or ((ropeDy.QWordValue <> 0) and (TestCollisionYwithXYShift(HHGear, 0, 1*-hwSign(ropeDy), -hwSign(ropeDy)) <> 0))) then
   203             Gear^.Elasticity := Gear^.Elasticity - _1_2;
   203             Gear^.Elasticity := Gear^.Elasticity - _1_2;
   204 
   204 
   205     HHGear^.X := Gear^.X + mdX * Gear^.Elasticity;
   205     HHGear^.X := Gear^.X + mdX * Gear^.Elasticity;
   206     HHGear^.Y := Gear^.Y + mdY * Gear^.Elasticity;
   206     HHGear^.Y := Gear^.Y + mdY * Gear^.Elasticity;
   207 
   207 
   313                     end;
   313                     end;
   314                 end
   314                 end
   315             end;
   315             end;
   316 
   316 
   317     haveCollision := false;
   317     haveCollision := false;
   318     if TestCollisionXwithXYShift(HHGear, _2*hwSign(HHGear^.dX), 0, hwSign(HHGear^.dX), true) then
   318     if TestCollisionXwithXYShift(HHGear, _2*hwSign(HHGear^.dX), 0, hwSign(HHGear^.dX), true) <> 0 then
   319         begin
   319         begin
   320         HHGear^.dX := -_0_6 * HHGear^.dX;
   320         HHGear^.dX := -_0_6 * HHGear^.dX;
   321         haveCollision := true
   321         haveCollision := true
   322         end;
   322         end;
   323     if TestCollisionYwithXYShift(HHGear, 0, 1*hwSign(HHGear^.dY), hwSign(HHGear^.dY)) then
   323     if TestCollisionYwithXYShift(HHGear, 0, 1*hwSign(HHGear^.dY), hwSign(HHGear^.dY)) <> 0 then
   324         begin
   324         begin
   325         HHGear^.dY := -_0_6 * HHGear^.dY;
   325         HHGear^.dY := -_0_6 * HHGear^.dY;
   326         haveCollision := true
   326         haveCollision := true
   327         end;
   327         end;
   328 
   328 
   416     HHGear := Gear^.Hedgehog^.Gear;
   416     HHGear := Gear^.Hedgehog^.Gear;
   417     DeleteCI(HHGear);
   417     DeleteCI(HHGear);
   418 
   418 
   419     if (HHGear^.State and gstMoving) <> 0 then
   419     if (HHGear^.State and gstMoving) <> 0 then
   420         begin
   420         begin
   421         if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then
   421         if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) <> 0 then
   422             SetLittle(HHGear^.dX);
   422             SetLittle(HHGear^.dX);
   423         if HHGear^.dY.isNegative and (TestCollisionYwithGear(HHGear, -1) <> 0) then
   423         if HHGear^.dY.isNegative and (TestCollisionYwithGear(HHGear, -1) <> 0) then
   424             HHGear^.dY := _0;
   424             HHGear^.dY := _0;
   425 
   425 
   426         HHGear^.X := HHGear^.X + HHGear^.dX;
   426         HHGear^.X := HHGear^.X + HHGear^.dX;