hedgewars/uGearsHandlersMess.pas
changeset 14341 d5317635f368
parent 14340 05c1d471694f
child 14342 d738a03da740
equal deleted inserted replaced
14340:05c1d471694f 14341:d5317635f368
  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