2066 targ, tmpG: PGear; |
2066 targ, tmpG: PGear; |
2067 trackSpeed, airFriction, tX, tY: hwFloat; |
2067 trackSpeed, airFriction, tX, tY: hwFloat; |
2068 isUnderwater: Boolean; |
2068 isUnderwater: Boolean; |
2069 sparkle: PVisualGear; |
2069 sparkle: PVisualGear; |
2070 begin |
2070 begin |
2071 targ:= nil; |
2071 targ:= nil; |
2072 if (Gear^.State and gstFrozen) <> 0 then |
2072 if (Gear^.State and gstFrozen) <> 0 then |
2073 begin |
2073 begin |
2074 if Gear^.Damage > 0 then |
2074 if Gear^.Damage > 0 then |
2075 begin |
2075 begin |
2076 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound or EXPLForceDraw); |
2076 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound or EXPLForceDraw); |
2077 DeleteGear(Gear) |
2077 DeleteGear(Gear) |
2078 end; |
2078 end; |
2079 exit |
2079 doStepFallingGear(Gear); |
2080 end; |
2080 exit |
|
2081 end; |
2081 isUnderwater:= CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y) + Gear^.Radius); |
2082 isUnderwater:= CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y) + Gear^.Radius); |
2082 if Gear^.Pos > 0 then |
2083 if Gear^.Pos > 0 then |
2083 begin |
2084 begin |
2084 airFriction:= _1; |
2085 airFriction:= _1; |
2085 if isUnderwater then |
2086 if isUnderwater then |
2702 Gear^.dY.isNegative:= true; |
2703 Gear^.dY.isNegative:= true; |
2703 AmmoShove(Gear, Gear^.Boom, 125); |
2704 AmmoShove(Gear, Gear^.Boom, 125); |
2704 Gear^.dX:= tdX; |
2705 Gear^.dX:= tdX; |
2705 Gear^.dY:= tdY; |
2706 Gear^.dY:= tdY; |
2706 Gear^.Radius := 1 |
2707 Gear^.Radius := 1 |
2707 end; |
2708 end; |
2708 |
2709 |
2709 if ((GameTicks mod 100) = 0) then |
2710 if ((GameTicks mod 100) = 0) then |
2710 begin |
2711 begin |
2711 vgt:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtFire, gstTmpFlag); |
2712 vgt:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtFire, gstTmpFlag); |
2712 if vgt <> nil then |
2713 if vgt <> nil then |
5651 begin |
5652 begin |
5652 flame:= AddGear(gx, gy, gtFlame, 0, |
5653 flame:= AddGear(gx, gy, gtFlame, 0, |
5653 SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx, |
5654 SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx, |
5654 AngleCos(HHGear^.Angle) * ( - speed) + ry, 0); |
5655 AngleCos(HHGear^.Angle) * ( - speed) + ry, 0); |
5655 flame^.CollisionMask:= lfNotCurHogCrate; |
5656 flame^.CollisionMask:= lfNotCurHogCrate; |
5656 //flame^.FlightTime:= 500; |
5657 //flame^.FlightTime:= 500; |
5657 end |
5658 end |
5658 end; |
5659 end; |
5659 Gear^.Timer:= Gear^.Tag |
5660 Gear^.Timer:= Gear^.Tag |
5660 end; |
5661 end; |
5661 |
5662 |
5837 dmg:= dmg div Gear^.Boom; |
5838 dmg:= dmg div Gear^.Boom; |
5838 |
5839 |
5839 if dmg > 0 then |
5840 if dmg > 0 then |
5840 ApplyDamage(tmp, CurrentHedgehog, dmg, dsHammer); |
5841 ApplyDamage(tmp, CurrentHedgehog, dmg, dsHammer); |
5841 end; |
5842 end; |
5842 tmp^.dY:= _0_03 * Gear^.Boom |
5843 tmp^.dY:= _0_03 * Gear^.Boom |
5843 end; |
5844 end; |
5844 |
5845 |
5845 if (tmp^.Kind <> gtHedgehog) or (dmg > 0) or (tmp^.Health > tmp^.Damage) then |
5846 if (tmp^.Kind <> gtHedgehog) or (dmg > 0) or (tmp^.Health > tmp^.Damage) then |
5846 begin |
5847 begin |
5847 //DrawTunnel(tmp^.X, tmp^.Y - _1, _0, _0_5, cHHRadius * 6, cHHRadius * 3); |
5848 //DrawTunnel(tmp^.X, tmp^.Y - _1, _0, _0_5, cHHRadius * 6, cHHRadius * 3); |
6467 iter^.State:= iter^.State or gstFrozen; |
6468 iter^.State:= iter^.State or gstFrozen; |
6468 AddCI(iter) |
6469 AddCI(iter) |
6469 end |
6470 end |
6470 else if iter^.Kind = gtAirMine then |
6471 else if iter^.Kind = gtAirMine then |
6471 begin |
6472 begin |
6472 iter^.Damage:= 0; |
6473 iter^.Damage:= 0; |
6473 iter^.State:= iter^.State or gstFrozen; |
6474 iter^.State:= iter^.State or gstFrozen; |
6474 AddCI(iter); |
6475 AddCI(iter); |
6475 if (hwRound(iter^.X) < RightX) and (hwRound(iter^.X) > 0) and |
6476 if (hwRound(iter^.X) < RightX-16) and (hwRound(iter^.X) > LeftX+16) and |
6476 (hwRound(iter^.Y) < LAND_HEIGHT) and (hwRound(iter^.Y) > 0) then |
6477 (hwRound(iter^.Y) > topY+16) and (hwRound(iter^.Y) < LAND_HEIGHT-16) then |
|
6478 begin |
|
6479 iter^.X:= int2hwFloat(min(RightX-16,max(hwRound(iter^.X), LeftX+16))); |
|
6480 iter^.Y:= int2hwFloat(min(LAND_HEIGHT-16,max(hwRound(iter^.Y),TopY+16))); |
|
6481 ForcePlaceOnLand(hwRound(iter^.X)-16, hwRound(iter^.Y)-16, sprFrozenAirMine, 0, lfIce, $FFFFFFFF, false, false, false); |
|
6482 iter^.State:= iter^.State or gstInvisible |
|
6483 end |
|
6484 else |
6477 begin |
6485 begin |
6478 iter^.X:= int2hwFloat(min(RightX-16,max(hwRound(iter^.X), 16))); |
6486 updateTarget(Gear, ndX, ndY); |
6479 iter^.Y:= int2hwFloat(min(LAND_HEIGHT-16,max(hwRound(iter^.Y),16))); |
6487 FlightTime := 0; |
6480 ForcePlaceOnLand(hwRound(iter^.X)-16, hwRound(iter^.Y)-16, sprFrozenAirMine, 0, lfIce, $FFFFFFFF, false, false, false); |
6488 Timer := iceWaitCollision; |
6481 iter^.State:= iter^.State or gstInvisible |
6489 Power := GameTicks; |
|
6490 iter^.State:= iter^.State and not gstNoGravity |
6482 end |
6491 end |
6483 end |
6492 end |
6484 else // gtExplosives |
6493 else // gtExplosives |
6485 begin |
6494 begin |
6486 iter^.State:= iter^.State or gstFrozen; |
6495 iter^.State:= iter^.State or gstFrozen; |
6491 end; |
6500 end; |
6492 |
6501 |
6493 // FillRoundInLandWithIce(Target.X, Target.Y, iceRadius); |
6502 // FillRoundInLandWithIce(Target.X, Target.Y, iceRadius); |
6494 SetAllHHToActive; |
6503 SetAllHHToActive; |
6495 Timer := iceWaitCollision; |
6504 Timer := iceWaitCollision; |
6496 Power:= GameTicks |
6505 Power:= GameTicks |
6497 end; |
6506 end; |
6498 |
6507 |
6499 if (Timer = iceCollideWithWater) and ((GameTicks - Power) > groundFreezingTime div 2) then |
6508 if (Timer = iceCollideWithWater) and ((GameTicks - Power) > groundFreezingTime div 2) then |
6500 begin |
6509 begin |
6501 PlaySound(sndHogFreeze); |
6510 PlaySound(sndHogFreeze); |
6551 Target.X:= gX; |
6560 Target.X:= gX; |
6552 Target.Y:= gY; |
6561 Target.Y:= gY; |
6553 X:= HHGear^.X; |
6562 X:= HHGear^.X; |
6554 Y:= HHGear^.Y |
6563 Y:= HHGear^.Y |
6555 end |
6564 end |
6556 else |
6565 else |
6557 begin |
6566 begin |
6558 iter:= CheckGearNear(Gear, gtAirMine, Gear^.Radius*2, Gear^.Radius*2); |
6567 iter:= CheckGearNear(Gear, gtAirMine, Gear^.Radius*2, Gear^.Radius*2); |
6559 if (iter <> nil) and (iter^.State <> gstFrozen) then |
6568 if (iter <> nil) and (iter^.State <> gstFrozen) then |
6560 begin |
6569 begin |
6561 Target.X:= gX; |
6570 Target.X:= gX; |
6562 Target.Y:= gY; |
6571 Target.Y:= gY; |
6563 X:= HHGear^.X; |
6572 X:= HHGear^.X; |
6564 Y:= HHGear^.Y |
6573 Y:= HHGear^.Y |
6565 end |
6574 end |
6566 end; |
6575 end; |
6567 if (gX > max(LAND_WIDTH,4096)*2) or |
6576 if (gX > max(LAND_WIDTH,4096)*2) or |
6568 (gX < -max(LAND_WIDTH,4096)) or |
6577 (gX < -max(LAND_WIDTH,4096)) or |
6569 (gY < -max(LAND_HEIGHT,4096)) or |
6578 (gY < -max(LAND_HEIGHT,4096)) or |
6570 (gY > max(LAND_HEIGHT,4096)+512) then |
6579 (gY > max(LAND_HEIGHT,4096)+512) then |
6571 begin |
6580 begin |
6631 var i,t,targDist,tmpDist: LongWord; |
6640 var i,t,targDist,tmpDist: LongWord; |
6632 targ, tmpG: PGear; |
6641 targ, tmpG: PGear; |
6633 tX, tY: hwFloat; |
6642 tX, tY: hwFloat; |
6634 vg: PVisualGear; |
6643 vg: PVisualGear; |
6635 begin |
6644 begin |
6636 targ:= nil; |
6645 targ:= nil; |
6637 doStepFallingGear(Gear); |
6646 doStepFallingGear(Gear); |
6638 if (Gear^.State and gstFrozen) <> 0 then |
6647 if (Gear^.State and gstFrozen) <> 0 then |
6639 begin |
6648 begin |
6640 if Gear^.Damage > 0 then |
6649 if Gear^.Damage > 0 then |
6641 begin |
6650 begin |
6642 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound); |
6651 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound); |
6643 DeleteGear(Gear) |
6652 DeleteGear(Gear) |
6644 end; |
6653 end; |
6645 exit |
6654 exit |
6646 end; |
6655 end; |
6647 if (TurnTimeLeft = 0) or (Gear^.Angle = 0) or (Gear^.Hedgehog = nil) or (Gear^.Hedgehog^.Gear = nil) then |
6656 if (TurnTimeLeft = 0) or (Gear^.Angle = 0) or (Gear^.Hedgehog = nil) or (Gear^.Hedgehog^.Gear = nil) then |
6648 begin |
6657 begin |
6649 Gear^.Hedgehog:= nil; |
6658 Gear^.Hedgehog:= nil; |
6650 targ:= nil; |
6659 targ:= nil; |
6651 end |
6660 end |