306 //////////////////////////////////////////////////////////////////////////////// |
306 //////////////////////////////////////////////////////////////////////////////// |
307 procedure doStepHedgehogFree(Gear: PGear); |
307 procedure doStepHedgehogFree(Gear: PGear); |
308 begin |
308 begin |
309 //DeleteCI(Gear); |
309 //DeleteCI(Gear); |
310 if not TestCollisionYwithGear(Gear, 1) then |
310 if not TestCollisionYwithGear(Gear, 1) then |
|
311 if TestCollisionYwithXYShift(Gear, 0, 1, 1) then Gear.Y:= Gear.Y + 1 else |
311 begin |
312 begin |
312 if (Gear.dY < 0) and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; |
313 if (Gear.dY < 0) and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; |
313 Gear.State:= Gear.State or gstFalling or gstMoving; |
314 Gear.State:= Gear.State or gstFalling or gstMoving; |
314 Gear.dY:= Gear.dY + cGravity |
315 Gear.dY:= Gear.dY + cGravity |
315 end else begin |
316 end else begin |
325 |
326 |
326 if (Gear.State and gstMoving) <> 0 then |
327 if (Gear.State and gstMoving) <> 0 then |
327 if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then |
328 if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then |
328 if ((Gear.State and gstFalling) = 0) then |
329 if ((Gear.State and gstFalling) = 0) then |
329 if abs(Gear.dX) > 0.01 then |
330 if abs(Gear.dX) > 0.01 then |
330 if not TestCollisionXwithXYShift(Gear, 0, -1, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.90; Gear.Y:= Gear.Y - 1 end else |
331 if not TestCollisionXwithXYShift(Gear, 0, -1, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.99; Gear.Y:= Gear.Y - 1 end else |
331 if not TestCollisionXwithXYShift(Gear, 0, -2, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.88; Gear.Y:= Gear.Y - 2 end else |
332 if not TestCollisionXwithXYShift(Gear, 0, -2, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.98; Gear.Y:= Gear.Y - 2 end else |
332 if not TestCollisionXwithXYShift(Gear, 0, -3, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.84; Gear.Y:= Gear.Y - 3 end else |
333 if not TestCollisionXwithXYShift(Gear, 0, -3, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.97; Gear.Y:= Gear.Y - 3 end else |
333 if not TestCollisionXwithXYShift(Gear, 0, -4, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.81; Gear.Y:= Gear.Y - 4 end else |
334 if not TestCollisionXwithXYShift(Gear, 0, -4, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.96; Gear.Y:= Gear.Y - 4 end else |
334 if not TestCollisionXwithXYShift(Gear, 0, -5, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.78; Gear.Y:= Gear.Y - 5 end else |
335 if not TestCollisionXwithXYShift(Gear, 0, -5, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.95; Gear.Y:= Gear.Y - 5 end else |
335 if abs(Gear.dX) > 0.02 then Gear.dX:= -0.5 * Gear.dX |
336 if abs(Gear.dX) > 0.02 then Gear.dX:= -0.3 * Gear.dX |
336 else begin |
337 else begin |
337 Gear.State:= Gear.State and not gstMoving; |
338 Gear.State:= Gear.State and not gstMoving; |
338 Gear.dX:= 0.0000001 * Sign(Gear.dX) |
339 Gear.dX:= 0.0000001 * Sign(Gear.dX) |
339 end |
340 end |
340 else begin |
341 else begin |
347 (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then |
348 (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then |
348 begin |
349 begin |
349 Gear.State:= Gear.State and not gstMoving; |
350 Gear.State:= Gear.State and not gstMoving; |
350 Gear.dX:= 0.0000001 * Sign(Gear.dX); |
351 Gear.dX:= 0.0000001 * Sign(Gear.dX); |
351 Gear.dY:= 0 |
352 Gear.dY:= 0 |
352 end else Gear.State:= Gear.State or gstMoving; |
353 end else Gear.State:= Gear.State or gstMoving; |
353 |
354 |
354 if (Gear.State and gstMoving) <> 0 then |
355 if (Gear.State and gstMoving) <> 0 then |
355 begin |
356 begin |
356 Gear.X:= Gear.X + Gear.dX; |
357 Gear.X:= Gear.X + Gear.dX; |
357 Gear.Y:= Gear.Y + Gear.dY |
358 Gear.Y:= Gear.Y + Gear.dY |