hedgewars/uGearsHandlersRope.pas
changeset 10017 de822cd3df3a
parent 9998 736015b847e3
child 10108 c68cf030eded
equal deleted inserted replaced
10015:4feced261c68 10017:de822cd3df3a
    27 implementation
    27 implementation
    28 uses uConsts, uFloat, uCollisions, uVariables, uGearsList, uSound, uGearsUtils,
    28 uses uConsts, uFloat, uCollisions, uVariables, uGearsList, uSound, uGearsUtils,
    29     uAmmos, uDebug, uUtils, uGearsHedgehog, uGearsRender;
    29     uAmmos, uDebug, uUtils, uGearsHedgehog, uGearsRender;
    30 
    30 
    31 procedure doStepRopeAfterAttack(Gear: PGear);
    31 procedure doStepRopeAfterAttack(Gear: PGear);
    32 var 
    32 var
    33     HHGear: PGear;
    33     HHGear: PGear;
    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) <> 0) or (TestCollisionXwithGear(HHGear, -1) <> 0))  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) > LongInt(leftX) + HHGear^.Radius * 2
    42         HHGear^.dX.isNegative:= hwRound(tX) > LongInt(leftX) + HHGear^.Radius * 2
    43         end;
    43         end;
    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;
    71     HHGear^.Y := HHGear^.Y + HHGear^.dY;
    71     HHGear^.Y := HHGear^.Y + HHGear^.dY;
    72     HHGear^.dY := HHGear^.dY + cGravity;
    72     HHGear^.dY := HHGear^.dY + cGravity;
    73     
    73 
    74     if (GameFlags and gfMoreWind) <> 0 then
    74     if (GameFlags and gfMoreWind) <> 0 then
    75         HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density;
    75         HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density;
    76 
    76 
    77     if (Gear^.Message and gmAttack) <> 0 then
    77     if (Gear^.Message and gmAttack) <> 0 then
    78         begin
    78         begin
   111     Gear^.Elasticity := _0;
   111     Gear^.Elasticity := _0;
   112     Gear^.doStep := @doStepRopeAfterAttack
   112     Gear^.doStep := @doStepRopeAfterAttack
   113 end;
   113 end;
   114 
   114 
   115 procedure doStepRopeWork(Gear: PGear);
   115 procedure doStepRopeWork(Gear: PGear);
   116 var 
   116 var
   117     HHGear: PGear;
   117     HHGear: PGear;
   118     len, tx, ty, nx, ny, ropeDx, ropeDy, mdX, mdY: hwFloat;
   118     len, tx, ty, nx, ny, ropeDx, ropeDy, mdX, mdY: hwFloat;
   119     lx, ly, cd: LongInt;
   119     lx, ly, cd: LongInt;
   120     haveCollision,
   120     haveCollision,
   121     haveDivided: boolean;
   121     haveDivided: boolean;
   124     if GameTicks mod 4 <> 0 then exit;
   124     if GameTicks mod 4 <> 0 then exit;
   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) <> 0) or (TestCollisionXwithGear(HHGear, -1) <> 0))  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;
   403         end;
   403         end;
   404     ApplyAmmoChanges(HHGear^.Hedgehog^)
   404     ApplyAmmoChanges(HHGear^.Hedgehog^)
   405 end;
   405 end;
   406 
   406 
   407 procedure doStepRopeAttach(Gear: PGear);
   407 procedure doStepRopeAttach(Gear: PGear);
   408 var 
   408 var
   409     HHGear: PGear;
   409     HHGear: PGear;
   410     tx, ty, tt: hwFloat;
   410     tx, ty, tt: hwFloat;
   411 begin
   411 begin
   412     Gear^.X := Gear^.X - Gear^.dX;
   412     Gear^.X := Gear^.X - Gear^.dX;
   413     Gear^.Y := Gear^.Y - Gear^.dY;
   413     Gear^.Y := Gear^.Y - Gear^.dY;