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 |