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