hedgewars/GSHandlers.inc
changeset 2455 cc54dd148cc2
parent 2440 7274a82fddbb
child 2457 ecf0c7e7995b
equal deleted inserted replaced
2454:c8b1fb10003c 2455:cc54dd148cc2
   107         AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble)
   107         AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble)
   108 end;
   108 end;
   109 
   109 
   110 ////////////////////////////////////////////////////////////////////////////////
   110 ////////////////////////////////////////////////////////////////////////////////
   111 procedure doStepFallingGear(Gear: PGear);
   111 procedure doStepFallingGear(Gear: PGear);
   112 var isFalling, isCollV, isCollH: boolean;
   112 var isFalling: boolean;
   113 tmp: QWord;
       
   114 begin
   113 begin
   115 Gear^.State:= Gear^.State and not gstCollision;
   114 Gear^.State:= Gear^.State and not gstCollision;
   116 isCollV:= false; 
       
   117 isCollH:= false;
       
   118 
   115 
   119 if Gear^.dY.isNegative then
   116 if Gear^.dY.isNegative then
   120 	begin
   117 	begin
   121 	isFalling:= true;
   118 	isFalling:= true;
   122 	if TestCollisionYwithGear(Gear, -1) then
   119 	if TestCollisionYwithGear(Gear, -1) then
   123 		begin
   120 		begin
   124 		isCollV:= true;
       
   125 		Gear^.dX:=   Gear^.dX * Gear^.Friction;
   121 		Gear^.dX:=   Gear^.dX * Gear^.Friction;
   126 		Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   122 		Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   127 		Gear^.State:= Gear^.State or gstCollision
   123 		Gear^.State:= Gear^.State or gstCollision
   128 		end
   124 		end
   129 	end else
   125 	end else
   130 	if TestCollisionYwithGear(Gear, 1) then
   126 	if TestCollisionYwithGear(Gear, 1) then
   131 		begin
   127 		begin
   132 		isCollV:= true;
       
   133 		isFalling:= false;
   128 		isFalling:= false;
   134 		Gear^.dX:=   Gear^.dX * Gear^.Friction;
   129 		Gear^.dX:=   Gear^.dX * Gear^.Friction;
   135 		Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   130 		Gear^.dY:= - Gear^.dY * Gear^.Elasticity;
   136 		Gear^.State:= Gear^.State or gstCollision
   131 		Gear^.State:= Gear^.State or gstCollision
   137 		end else isFalling:= true;
   132 		end else isFalling:= true;
   138 
   133 
   139 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   134 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   140 	begin
   135 	begin
   141 	isCollH:= true;
       
   142 	Gear^.dX:= - Gear^.dX * Gear^.Elasticity;
   136 	Gear^.dX:= - Gear^.dX * Gear^.Elasticity;
   143 	Gear^.dY:=   Gear^.dY * Gear^.Elasticity;
   137 	Gear^.dY:=   Gear^.dY * Gear^.Elasticity;
   144 	Gear^.State:= Gear^.State or gstCollision
   138 	Gear^.State:= Gear^.State or gstCollision
   145 	end else
       
   146 	if TestCollisionXwithGear(Gear, -hwSign(Gear^.dX)) then
       
   147 		isCollH:= true;
       
   148 
       
   149 if isCollV and isCollH then
       
   150 	begin
       
   151 	tmp:= Gear^.dX.QWordValue;
       
   152 	Gear^.dX.QWordValue:= Gear^.dY.QWordValue;
       
   153 	Gear^.dY.QWordValue:= tmp;
       
   154 	end;
   139 	end;
   155 
   140 
   156 if isFalling then Gear^.dY:= Gear^.dY + cGravity;
   141 if isFalling then Gear^.dY:= Gear^.dY + cGravity;
   157 
   142 
   158 Gear^.X:= Gear^.X + Gear^.dX;
   143 Gear^.X:= Gear^.X + Gear^.dX;