140 AllInactive:= false; |
140 AllInactive:= false; |
141 DeleteCI(Gear); |
141 DeleteCI(Gear); |
142 if (TurnTimeLeft = 0) or (Gear.Damage > 0) then |
142 if (TurnTimeLeft = 0) or (Gear.Damage > 0) then |
143 begin |
143 begin |
144 TurnTimeLeft:= 0; |
144 TurnTimeLeft:= 0; |
145 if ((Gear.State and (gstMoving or gstFalling)) = 0) |
|
146 and (CurAmmoGear = nil) then Gear.dX:= 0.0000001 * hwSign(Gear.dX); |
|
147 Gear.State:= Gear.State and not gstHHDriven; |
145 Gear.State:= Gear.State and not gstHHDriven; |
148 if Gear.Damage > 0 then |
146 if Gear.Damage > 0 then |
149 Gear.State:= Gear.State and not gstHHJumping; |
147 Gear.State:= Gear.State and not gstHHJumping; |
150 exit |
148 exit |
151 end; |
149 end; |
170 if (Gear.State and gstFalling) <> 0 then |
168 if (Gear.State and gstFalling) <> 0 then |
171 begin |
169 begin |
172 // it could be the source to trick: double-backspace jump -> vertical wall |
170 // it could be the source to trick: double-backspace jump -> vertical wall |
173 // collision - > (abs(Gear.dX) < 0.0000002) -> backspace -> even more high jump |
171 // collision - > (abs(Gear.dX) < 0.0000002) -> backspace -> even more high jump |
174 if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then |
172 if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then |
175 if (abs(Gear.dX) < 0.0000002) and (Gear.dY < -0.02) then |
173 if (abs(Gear.dX) < 2 * cLittle) and (Gear.dY < -0.02) then |
176 begin |
174 begin |
177 Gear.dY:= -0.25; |
175 Gear.dY:= -0.25; |
178 Gear.dX:= hwSign(Gear.dX) * 0.02 |
176 Gear.dX:= hwSign(Gear.dX) * 0.02 |
179 end; |
177 end; |
180 Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump); |
178 Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump); |
181 if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then Gear.dX:= 0.0000001 * hwSign(Gear.dX); |
179 if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then SetLittle(Gear.dX); |
182 Gear.X:= Gear.X + Gear.dX; |
180 Gear.X:= Gear.X + Gear.dX; |
183 Gear.dY:= Gear.dY + cGravity; |
181 Gear.dY:= Gear.dY + cGravity; |
184 if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; |
182 if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; |
185 Gear.Y:= Gear.Y + Gear.dY; |
183 Gear.Y:= Gear.Y + Gear.dY; |
186 if (Gear.dY >= 0)and TestCollisionYwithGear(Gear, 1) then |
184 if (Gear.dY >= 0)and TestCollisionYwithGear(Gear, 1) then |
187 begin |
185 begin |
188 CheckHHDamage(Gear); |
186 CheckHHDamage(Gear); |
189 if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55) |
187 if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55) |
190 and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * hwSign(Gear.dX); |
188 and ((Gear.State and gstHHJumping) <> 0) then SetLittle(Gear.dX); |
191 Gear.State:= Gear.State and not (gstFalling or gstHHJumping); |
189 Gear.State:= Gear.State and not (gstFalling or gstHHJumping); |
192 StepTicks:= 300; |
190 StepTicks:= 300; |
193 Gear.dY:= 0 |
191 Gear.dY:= 0 |
194 end; |
192 end; |
195 CheckGearDrowning(Gear); |
193 CheckGearDrowning(Gear); |
231 Gear.State:= Gear.State or gstFalling or gstHHJumping; |
229 Gear.State:= Gear.State or gstFalling or gstHHJumping; |
232 exit |
230 exit |
233 end; |
231 end; |
234 end; |
232 end; |
235 PrevdX:= hwSign(Gear.dX); |
233 PrevdX:= hwSign(Gear.dX); |
236 if (Gear.Message and gm_Left )<>0 then Gear.dX:= -1.0 else |
234 if (Gear.Message and gm_Left )<>0 then Gear.dX:= -cLittle else |
237 if (Gear.Message and gm_Right )<>0 then Gear.dX:= 1.0 else exit; |
235 if (Gear.Message and gm_Right )<>0 then Gear.dX:= cLittle else exit; |
238 StepTicks:= cHHStepTicks; |
236 StepTicks:= cHHStepTicks; |
239 if PrevdX <> hwSign(Gear.dX) then exit; |
237 if PrevdX <> hwSign(Gear.dX) then exit; |
240 PHedgehog(Gear.Hedgehog).visStepPos:= (PHedgehog(Gear.Hedgehog).visStepPos + 1) and 7; |
238 PHedgehog(Gear.Hedgehog).visStepPos:= (PHedgehog(Gear.Hedgehog).visStepPos + 1) and 7; |
241 if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then |
239 if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then |
242 begin |
240 begin |
251 if not (TestCollisionXwithXYShift(Gear, 0, -2, hwSign(Gear.dX)) |
249 if not (TestCollisionXwithXYShift(Gear, 0, -2, hwSign(Gear.dX)) |
252 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
250 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
253 if not (TestCollisionXwithXYShift(Gear, 0, -1, hwSign(Gear.dX)) |
251 if not (TestCollisionXwithXYShift(Gear, 0, -1, hwSign(Gear.dX)) |
254 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
252 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
255 end; |
253 end; |
256 if not TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then Gear.X:= Gear.X + Gear.dX; |
254 if not TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then Gear.X:= Gear.X + hwSign(Gear.dX); |
257 Gear.dX:= 0.0000001 * hwSign(Gear.dX); |
255 |
258 SetAllHHToActive; |
256 SetAllHHToActive; |
259 |
257 |
260 if not TestCollisionYwithGear(Gear, 1) then |
258 if not TestCollisionYwithGear(Gear, 1) then |
261 begin |
259 begin |
262 Gear.Y:= Gear.Y + 1; |
260 Gear.Y:= Gear.Y + 1; |
301 Gear.State:= Gear.State or gstFalling or gstMoving; |
298 Gear.State:= Gear.State or gstFalling or gstMoving; |
302 Gear.dY:= Gear.dY + cGravity |
299 Gear.dY:= Gear.dY + cGravity |
303 end else begin |
300 end else begin |
304 CheckHHDamage(Gear); |
301 CheckHHDamage(Gear); |
305 if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55) |
302 if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55) |
306 and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * hwSign(Gear.dX); |
303 and ((Gear.State and gstHHJumping) <> 0) then SetLittle(Gear.dX); |
307 Gear.State:= Gear.State and not (gstFalling or gstHHJumping); |
304 Gear.State:= Gear.State and not (gstFalling or gstHHJumping); |
308 if Gear.dY > 0 then Gear.dY:= 0; |
305 if Gear.dY > 0 then Gear.dY:= 0; |
309 if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction |
306 if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction |
310 end; |
307 end; |
311 |
308 |
321 if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -4, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.87; Gear.Y:= Gear.Y - 4 end else |
318 if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -4, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.87; Gear.Y:= Gear.Y - 4 end else |
322 if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -5, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.84; Gear.Y:= Gear.Y - 5 end else |
319 if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -5, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.84; Gear.Y:= Gear.Y - 5 end else |
323 if abs(Gear.dX) > 0.02 then Gear.dX:= -Gear.Elasticity * Gear.dX |
320 if abs(Gear.dX) > 0.02 then Gear.dX:= -Gear.Elasticity * Gear.dX |
324 else begin |
321 else begin |
325 Gear.State:= Gear.State and not gstMoving; |
322 Gear.State:= Gear.State and not gstMoving; |
326 Gear.dX:= 0.0000001 * hwSign(Gear.dX) |
323 SetLittle(Gear.dX) |
327 end |
324 end |
328 else begin |
325 else begin |
329 Gear.State:= Gear.State and not gstMoving; |
326 Gear.State:= Gear.State and not gstMoving; |
330 Gear.dX:= 0.0000001 * hwSign(Gear.dX) |
327 SetLittle(Gear.dX) |
331 end |
328 end |
332 else Gear.dX:= -Gear.Elasticity * Gear.dX; |
329 else Gear.dX:= -Gear.Elasticity * Gear.dX; |
333 |
330 |
334 if ((Gear.State and gstFalling) = 0)and |
331 if ((Gear.State and gstFalling) = 0)and |
335 (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then |
332 (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then |
336 begin |
333 begin |
337 Gear.State:= Gear.State and not gstMoving; |
334 Gear.State:= Gear.State and not gstMoving; |
338 Gear.dX:= 0.0000001 * hwSign(Gear.dX); |
335 SetLittle(Gear.dX); |
339 Gear.dY:= 0 |
336 Gear.dY:= 0 |
340 end else Gear.State:= Gear.State or gstMoving; |
337 end else Gear.State:= Gear.State or gstMoving; |
341 |
338 |
342 if (Gear.State and gstMoving) <> 0 then |
339 if (Gear.State and gstMoving) <> 0 then |
343 begin |
340 begin |