hedgewars/GSHandlers.inc
changeset 503 2cfdc4bfc2be
parent 498 9c8b385dc9a1
child 505 fcba7d7aea0d
equal deleted inserted replaced
502:bc178daca088 503:2cfdc4bfc2be
    62 if hwRound(Gear^.Y) > Gear^.Radius + cWaterLine + cVisibleWater then DeleteGear(Gear)
    62 if hwRound(Gear^.Y) > Gear^.Radius + cWaterLine + cVisibleWater then DeleteGear(Gear)
    63 end;
    63 end;
    64 
    64 
    65 ////////////////////////////////////////////////////////////////////////////////
    65 ////////////////////////////////////////////////////////////////////////////////
    66 procedure doStepFallingGear(Gear: PGear);
    66 procedure doStepFallingGear(Gear: PGear);
    67 var b: boolean;
    67 begin
    68 begin
    68 Gear^.State:= Gear^.State and not gstCollision;
    69 if TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) then
    69 
    70    begin
    70 if Gear^.dY.isNegative then
    71    Gear^.dX:=   Gear^.dX * Gear^.Friction;
    71    begin
    72    Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
    72    Gear^.State:= Gear^.State or gstFalling;
    73    b:= false
    73    if TestCollisionYwithGear(Gear, -1) then
    74    end else b:= true;
    74       begin
       
    75       Gear^.dX:=   Gear^.dX * Gear^.Friction;
       
    76       Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
       
    77       Gear^.State:= Gear^.State or gstCollision
       
    78       end
       
    79    end else
       
    80    if TestCollisionYwithGear(Gear, 1) then
       
    81       begin
       
    82       Gear^.State:= Gear^.State and not gstFalling;
       
    83       Gear^.dX:=   Gear^.dX * Gear^.Friction;
       
    84       Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
       
    85       Gear^.State:= Gear^.State or gstCollision
       
    86       end else Gear^.State:= Gear^.State or gstFalling;
       
    87 
    75 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
    88 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
    76    begin
    89    begin
    77    Gear^.dX:= - Gear^.dX * Gear^.Elasticity;
    90    Gear^.dX:= - Gear^.dX * Gear^.Elasticity;
    78 //   Gear^.dY:=   Gear^.dY;
       
    79    b:= false
       
    80    end;
       
    81 if b then
       
    82    begin
       
    83    Gear^.dY:= Gear^.dY + cGravity;
       
    84    Gear^.State:= Gear^.State and not gstCollision
       
    85    end else
       
    86    begin
       
    87    if hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _1div100000 then
       
    88       if (Gear^.Timer = 0) then Gear^.Active:= false
       
    89                           else begin
       
    90                           Gear^.dX:= _0;
       
    91                           Gear^.dY:= _0
       
    92                           end;
       
    93    Gear^.State:= Gear^.State or gstCollision
    91    Gear^.State:= Gear^.State or gstCollision
    94    end;
    92    end;
       
    93 
       
    94 if (Gear^.State and gstFalling) <> 0 then Gear^.dY:= Gear^.dY + cGravity;
       
    95 
       
    96 
    95 Gear^.X:= Gear^.X + Gear^.dX;
    97 Gear^.X:= Gear^.X + Gear^.dX;
    96 Gear^.Y:= Gear^.Y + Gear^.dY;
    98 Gear^.Y:= Gear^.Y + Gear^.dY;
    97 CheckGearDrowning(Gear);
    99 CheckGearDrowning(Gear);
    98 if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _0_003) then Gear^.State:= Gear^.State and not gstMoving
   100 if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _0_0002) and
    99                                          else Gear^.State:= Gear^.State or      gstMoving
   101    ((Gear^.State and gstFalling) = 0) then Gear^.State:= Gear^.State and not gstMoving
       
   102                                       else Gear^.State:= Gear^.State or      gstMoving
   100 end;
   103 end;
   101 
   104 
   102 ////////////////////////////////////////////////////////////////////////////////
   105 ////////////////////////////////////////////////////////////////////////////////
   103 procedure doStepCloud(Gear: PGear);
   106 procedure doStepCloud(Gear: PGear);
   104 begin
   107 begin
   728 end;
   731 end;
   729 
   732 
   730 ////////////////////////////////////////////////////////////////////////////////
   733 ////////////////////////////////////////////////////////////////////////////////
   731 procedure doStepMine(Gear: PGear);
   734 procedure doStepMine(Gear: PGear);
   732 begin
   735 begin
   733 if (Gear^.dX.QWordValue <> 0) or (Gear^.dY.QWordValue <> 0) then
   736 if (Gear^.State and (gstMoving or gstFalling)) <> 0 then
   734    begin
   737    begin
   735    if Gear^.CollIndex < High(Longword) then DeleteCI(Gear);
   738    DeleteCI(Gear);
   736    doStepFallingGear(Gear);
   739    doStepFallingGear(Gear);
   737    if Gear^.Active = false then
   740    if (Gear^.State and (gstMoving or gstFalling)) = 0 then
   738       begin
   741       begin
   739       if Gear^.CollIndex = High(Longword) then AddGearCI(Gear);
   742       AddGearCI(Gear);
   740       Gear^.dX:= _0;
   743       Gear^.dX:= _0;
   741       Gear^.dY:= _0
   744       Gear^.dY:= _0
   742       end;
   745       end;
   743    CalcRotationDirAngle(Gear);
   746    CalcRotationDirAngle(Gear);
   744    AllInactive:= false
   747    AllInactive:= false