279 procedure doStepFallingGear(Gear: PGear); |
279 procedure doStepFallingGear(Gear: PGear); |
280 var |
280 var |
281 isFalling: boolean; |
281 isFalling: boolean; |
282 //tmp: QWord; |
282 //tmp: QWord; |
283 tX, tdX, tdY: hwFloat; |
283 tX, tdX, tdY: hwFloat; |
284 collV, collH: LongInt; |
284 collV, collH, gX, gY: LongInt; |
285 land, xland: word; |
285 land, xland: word; |
|
286 boing: PVisualGear; |
286 begin |
287 begin |
287 tX:= Gear^.X; |
288 tX:= Gear^.X; |
|
289 gX:= hwRound(Gear^.X); |
|
290 gY:= hwRound(Gear^.Y); |
288 if (Gear^.Kind <> gtGenericFaller) and WorldWrap(Gear) and (WorldEdge = weWrap) and (Gear^.AdvBounce <> 0) and |
291 if (Gear^.Kind <> gtGenericFaller) and WorldWrap(Gear) and (WorldEdge = weWrap) and (Gear^.AdvBounce <> 0) and |
289 ((TestCollisionXwithGear(Gear, 1) <> 0) or (TestCollisionXwithGear(Gear, -1) <> 0)) then |
292 ((TestCollisionXwithGear(Gear, 1) <> 0) or (TestCollisionXwithGear(Gear, -1) <> 0)) then |
290 begin |
293 begin |
291 Gear^.X:= tX; |
294 Gear^.X:= tX; |
292 Gear^.dX.isNegative:= (hwRound(tX) > leftX+Gear^.Radius*2) |
295 Gear^.dX.isNegative:= (gX > leftX+Gear^.Radius*2) |
293 end; |
296 end; |
294 |
297 |
295 // clip velocity at 2 - over 1 per pixel, but really shouldn't cause many actual problems. |
298 // clip velocity at 2 - over 1 per pixel, but really shouldn't cause many actual problems. |
296 if Gear^.dX.Round > 2 then |
299 if Gear^.dX.Round > 2 then |
297 Gear^.dX.QWordValue:= 8589934592; |
300 Gear^.dX.QWordValue:= 8589934592; |
298 if Gear^.dY.Round > 2 then |
301 if Gear^.dY.Round > 2 then |
299 Gear^.dY.QWordValue:= 8589934592; |
302 Gear^.dY.QWordValue:= 8589934592; |
300 |
303 |
301 if (Gear^.State and gstSubmersible <> 0) and (hwRound(Gear^.Y) > cWaterLine) then |
304 if (Gear^.State and gstSubmersible <> 0) and (gY > cWaterLine) then |
302 begin |
305 begin |
303 Gear^.dX:= Gear^.dX * _0_999; |
306 Gear^.dX:= Gear^.dX * _0_999; |
304 Gear^.dY:= Gear^.dY * _0_999 |
307 Gear^.dY:= Gear^.dY * _0_999 |
305 end; |
308 end; |
306 |
309 |
309 collH := 0; |
312 collH := 0; |
310 tdX := Gear^.dX; |
313 tdX := Gear^.dX; |
311 tdY := Gear^.dY; |
314 tdY := Gear^.dY; |
312 |
315 |
313 // might need some testing/adjustments - just to avoid projectiles to fly forever (accelerated by wind/skips) |
316 // might need some testing/adjustments - just to avoid projectiles to fly forever (accelerated by wind/skips) |
314 if (hwRound(Gear^.X) < min(LAND_WIDTH div -2, -2048)) |
317 if (gX < min(LAND_WIDTH div -2, -2048)) |
315 or (hwRound(Gear^.X) > max(LAND_WIDTH * 3 div 2, 6144)) then |
318 or (gX > max(LAND_WIDTH * 3 div 2, 6144)) then |
316 Gear^.State := Gear^.State or gstCollision; |
319 Gear^.State := Gear^.State or gstCollision; |
317 |
320 |
318 if Gear^.dY.isNegative then |
321 if Gear^.dY.isNegative then |
319 begin |
322 begin |
320 isFalling := true; |
323 isFalling := true; |
432 Gear^.State := Gear^.State or gstMoving; |
435 Gear^.State := Gear^.State or gstMoving; |
433 |
436 |
434 if ((xland or land) and lfBouncy <> 0) and (Gear^.dX.QWordValue < _0_15.QWordValue) and (Gear^.dY.QWordValue < _0_15.QWordValue) then |
437 if ((xland or land) and lfBouncy <> 0) and (Gear^.dX.QWordValue < _0_15.QWordValue) and (Gear^.dY.QWordValue < _0_15.QWordValue) then |
435 Gear^.State := Gear^.State or gstCollision; |
438 Gear^.State := Gear^.State or gstCollision; |
436 |
439 |
437 if ((xland or land) and lfBouncy <> 0) and |
440 if ((xland or land) and lfBouncy <> 0) and (Gear^.Radius >= 3) and |
438 (((Gear^.Radius < 3) and (Gear^.dY < -_0_1)) or |
441 ((Gear^.dX.QWordValue > _0_15.QWordValue) or (Gear^.dY.QWordValue > _0_15.QWordValue)) then |
439 ((Gear^.Radius >= 3) and |
442 begin |
440 ((Gear^.dX.QWordValue > _0_15.QWordValue) or (Gear^.dY.QWordValue > _0_15.QWordValue)))) then |
443 boing:= AddVisualGear(gX, gY, vgtStraightShot, 0, false, 1); |
|
444 if boing <> nil then |
|
445 with boing^ do |
|
446 begin |
|
447 Angle:= random(360); |
|
448 dx:= 0; |
|
449 dy:= 0; |
|
450 FrameTicks:= 200; |
|
451 tX:= _0; |
|
452 tX.QWordValue:= Gear^.dY.QWordValue + Gear^.dX.QWordValue; |
|
453 Scale:= hwFloat2Float(Gear^.Density * tX) / 1.5; |
|
454 State:= ord(sprBoing) |
|
455 end; |
441 PlaySound(sndMelonImpact, true) |
456 PlaySound(sndMelonImpact, true) |
|
457 end |
442 else if (Gear^.nImpactSounds > 0) and |
458 else if (Gear^.nImpactSounds > 0) and |
443 (Gear^.State and gstCollision <> 0) and |
459 (Gear^.State and gstCollision <> 0) and |
444 (((Gear^.Kind <> gtMine) and (Gear^.Damage <> 0)) or (Gear^.State and gstMoving <> 0)) and |
460 (((Gear^.Kind <> gtMine) and (Gear^.Damage <> 0)) or (Gear^.State and gstMoving <> 0)) and |
445 (((Gear^.Radius < 3) and (Gear^.dY < -_0_1)) or |
461 (((Gear^.Radius < 3) and (Gear^.dY < -_0_1)) or |
446 ((Gear^.Radius >= 3) and |
462 ((Gear^.Radius >= 3) and |