hedgewars/GSHandlers.inc
changeset 3001 a1d1e0d0067a
parent 2998 5b74906c14bb
child 3002 9bf51d5a8a80
equal deleted inserted replaced
3000:2b9405b6dc5d 3001:a1d1e0d0067a
   163         AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble)
   163         AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble)
   164 end;
   164 end;
   165 
   165 
   166 ////////////////////////////////////////////////////////////////////////////////
   166 ////////////////////////////////////////////////////////////////////////////////
   167 procedure doStepFallingGear(Gear: PGear);
   167 procedure doStepFallingGear(Gear: PGear);
   168 var isFalling, isCollV, isCollH: boolean;
   168 var isFalling: boolean;
   169     tmp: QWord;
   169     tmp: QWord;
   170     tdX, tdY: hwFloat;
   170     tdX, tdY: hwFloat;
       
   171     collV, collH: LongInt;
   171 begin
   172 begin
   172 Gear^.State:= Gear^.State and not gstCollision;
   173 Gear^.State:= Gear^.State and not gstCollision;
   173 isCollV:= false; 
   174 collV:= 0; 
   174 isCollH:= false;
   175 collH:= 0;
   175 tdX:= Gear^.dX;
   176 tdX:= Gear^.dX;
   176 tdY:= Gear^.dY;
   177 tdY:= Gear^.dY;
   177 
   178 
   178 if Gear^.dY.isNegative then
   179 if Gear^.dY.isNegative then
   179     begin
   180     begin
   180     isFalling:= true;
   181     isFalling:= true;
   181     if TestCollisionYwithGear(Gear, -1) then
   182     if TestCollisionYwithGear(Gear, -1) then
   182         begin
   183         begin
   183         isCollV:= true;
   184         collV:= -1;
   184         Gear^.dX:=   Gear^.dX * Gear^.Friction;
   185         Gear^.dX:=   Gear^.dX * Gear^.Friction;
   185         Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   186         Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   186         Gear^.State:= Gear^.State or gstCollision
   187         Gear^.State:= Gear^.State or gstCollision
   187         end
   188         end
   188     end else
   189     end else
   189     if TestCollisionYwithGear(Gear, 1) then
   190     if TestCollisionYwithGear(Gear, 1) then
   190         begin
   191         begin
   191         isCollV:= true;
   192         collV:= 1;
   192         isFalling:= false;
   193         isFalling:= false;
   193         Gear^.dX:=   Gear^.dX * Gear^.Friction;
   194         Gear^.dX:=   Gear^.dX * Gear^.Friction;
   194         Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   195         Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   195         Gear^.State:= Gear^.State or gstCollision
   196         Gear^.State:= Gear^.State or gstCollision
   196         end else isFalling:= true;
   197         end else isFalling:= true;
   197 
   198 
   198 
   199 
   199 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   200 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   200     begin
   201     begin
   201     isCollH:= true;
   202     collH:= hwSign(Gear^.dX);
   202     Gear^.dX:= - Gear^.dX * Gear^.Elasticity;
   203     Gear^.dX:= - Gear^.dX * Gear^.Elasticity;
   203     Gear^.dY:=   Gear^.dY * Gear^.Elasticity;
   204     Gear^.dY:=   Gear^.dY * Gear^.Elasticity;
   204     Gear^.State:= Gear^.State or gstCollision
   205     Gear^.State:= Gear^.State or gstCollision
   205     end 
   206     end 
   206 else if Gear^.AdvBounce and TestCollisionXwithGear(Gear, -hwSign(Gear^.dX)) then isCollH:= true;
   207 else if Gear^.AdvBounce and TestCollisionXwithGear(Gear, -hwSign(Gear^.dX)) then collH:= -hwSign(Gear^.dX);
   207 
   208 
   208 if isCollV and isCollH and Gear^.AdvBounce then
   209 if (collV <>0) and (collH <> 0) and Gear^.AdvBounce then
   209        begin
   210     begin
   210        Gear^.dX:= hwAbs(tdY)*hwSign(Gear^.dX)*Gear^.Elasticity*Gear^.Friction;
   211     Gear^.dX:= tdY*Gear^.Elasticity*Gear^.Friction;
   211        Gear^.dY:= hwAbs(tdX)*hwSign(Gear^.dY)*Gear^.Elasticity;
   212     Gear^.dY:= tdX*Gear^.Elasticity*Gear^.Friction;
   212        //tmp:= Gear^.dX.QWordValue;
   213     if ((collV > 0) and (collH > 0)) or ((collV < 0) and (collH < 0)) then Gear^.dX.isNegative:=not tdY.isNegative
   213        //Gear^.dX.QWordValue:= Gear^.dY.QWordValue;
   214     else if (collV < 0) and (collH > 0) then Gear^.dY.isNegative:= not tdX.isNegative;
   214        //Gear^.dY.QWordValue:= tmp;
   215 
   215        end;
   216     //tmp:= Gear^.dX.QWordValue;
       
   217     //Gear^.dX.QWordValue:= Gear^.dY.QWordValue;
       
   218     //Gear^.dY.QWordValue:= tmp;
       
   219     end;
   216 
   220 
   217 if isFalling then Gear^.dY:= Gear^.dY + cGravity;
   221 if isFalling then Gear^.dY:= Gear^.dY + cGravity;
   218 
   222 
   219 Gear^.X:= Gear^.X + Gear^.dX;
   223 Gear^.X:= Gear^.X + Gear^.dX;
   220 Gear^.Y:= Gear^.Y + Gear^.dY;
   224 Gear^.Y:= Gear^.Y + Gear^.dY;