hedgewars/GSHandlers.inc
changeset 2989 b49d87499398
parent 2983 25b6b554c516
child 2994 7ae3067546f2
equal deleted inserted replaced
2988:42fa7fbee89a 2989:b49d87499398
   162         AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble)
   162         AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble)
   163 end;
   163 end;
   164 
   164 
   165 ////////////////////////////////////////////////////////////////////////////////
   165 ////////////////////////////////////////////////////////////////////////////////
   166 procedure doStepFallingGear(Gear: PGear);
   166 procedure doStepFallingGear(Gear: PGear);
   167 var isFalling: boolean;
   167 var isFalling, isCollV, isCollH: boolean;
       
   168     tmp: QWord;
   168 begin
   169 begin
   169 Gear^.State:= Gear^.State and not gstCollision;
   170 Gear^.State:= Gear^.State and not gstCollision;
       
   171 isCollV:= false; 
       
   172 isCollH:= false;
   170 
   173 
   171 if Gear^.dY.isNegative then
   174 if Gear^.dY.isNegative then
   172     begin
   175     begin
   173     isFalling:= true;
   176     isFalling:= true;
   174     if TestCollisionYwithGear(Gear, -1) then
   177     if TestCollisionYwithGear(Gear, -1) then
   175         begin
   178         begin
       
   179         isCollV:= true;
   176         Gear^.dX:=   Gear^.dX * Gear^.Friction;
   180         Gear^.dX:=   Gear^.dX * Gear^.Friction;
   177         Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   181         Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   178         Gear^.State:= Gear^.State or gstCollision
   182         Gear^.State:= Gear^.State or gstCollision
   179         end
   183         end
   180     end else
   184     end else
   181     if TestCollisionYwithGear(Gear, 1) then
   185     if TestCollisionYwithGear(Gear, 1) then
   182         begin
   186         begin
       
   187         isCollV:= true;
   183         isFalling:= false;
   188         isFalling:= false;
   184         Gear^.dX:=   Gear^.dX * Gear^.Friction;
   189         Gear^.dX:=   Gear^.dX * Gear^.Friction;
   185         Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   190         Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   186         Gear^.State:= Gear^.State or gstCollision
   191         Gear^.State:= Gear^.State or gstCollision
   187         end else isFalling:= true;
   192         end else isFalling:= true;
   188 
   193 
       
   194 
   189 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   195 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   190     begin
   196     begin
       
   197     isCollH:= true;
   191     Gear^.dX:= - Gear^.dX * Gear^.Elasticity;
   198     Gear^.dX:= - Gear^.dX * Gear^.Elasticity;
   192     Gear^.dY:=   Gear^.dY * Gear^.Elasticity;
   199     Gear^.dY:=   Gear^.dY * Gear^.Elasticity;
   193     Gear^.State:= Gear^.State or gstCollision
   200     Gear^.State:= Gear^.State or gstCollision
   194     end;
   201     end 
       
   202 else if Gear^.AdvBounce and TestCollisionXwithGear(Gear, -hwSign(Gear^.dX)) then isCollH:= true;
       
   203 
       
   204 if isCollV and isCollH and Gear^.AdvBounce then
       
   205        begin
       
   206        tmp:= Gear^.dX.QWordValue;
       
   207        Gear^.dX.QWordValue:= Gear^.dY.QWordValue;
       
   208        Gear^.dY.QWordValue:= tmp;
       
   209        end;
   195 
   210 
   196 if isFalling then Gear^.dY:= Gear^.dY + cGravity;
   211 if isFalling then Gear^.dY:= Gear^.dY + cGravity;
   197 
   212 
   198 Gear^.X:= Gear^.X + Gear^.dX;
   213 Gear^.X:= Gear^.X + Gear^.dX;
   199 Gear^.Y:= Gear^.Y + Gear^.dY;
   214 Gear^.Y:= Gear^.Y + Gear^.dY;