hedgewars/GSHandlers.inc
changeset 5013 04789ba3f200
parent 4977 c89cca0a8785
child 5016 9347d82a26cc
equal deleted inserted replaced
5012:8767878e08e2 5013:04789ba3f200
  4622         AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtSmokeTrace);
  4622         AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtSmokeTrace);
  4623     dec(Gear^.Timer)
  4623     dec(Gear^.Timer)
  4624 end;
  4624 end;
  4625 
  4625 
  4626 ////////////////////////////////////////////////////////////////////////////////
  4626 ////////////////////////////////////////////////////////////////////////////////
  4627 procedure doStepPlaceStructure(Gear: PGear);
       
  4628 var 
       
  4629     HHGear: PGear;
       
  4630     x, y, tx, ty: hwFloat;
       
  4631 begin
       
  4632     AllInactive := false;
       
  4633 
       
  4634     HHGear := Gear^.Hedgehog^.Gear;
       
  4635     tx := int2hwFloat(TargetPoint.X);
       
  4636     ty := int2hwFloat(TargetPoint.Y);
       
  4637     x := HHGear^.X;
       
  4638     y := HHGear^.Y;
       
  4639 
       
  4640     if (Distance(tx - x, ty - y) > _256) or
       
  4641        not TryPlaceOnLand(TargetPoint.X - SpritesData[sprAmGirder].Width div 2,
       
  4642        TargetPoint.Y - SpritesData[sprAmGirder].Height div 2,
       
  4643        sprAmGirder, Gear^.State, true, false) then
       
  4644     begin
       
  4645         PlaySound(sndDenied);
       
  4646         HHGear^.Message := HHGear^.Message and not gmAttack;
       
  4647         HHGear^.State := HHGear^.State and not gstAttacking;
       
  4648         HHGear^.State := HHGear^.State or gstHHChooseTarget;
       
  4649         isCursorVisible := true;
       
  4650         DeleteGear(Gear)
       
  4651     end
       
  4652     else 
       
  4653     begin
       
  4654         PlaySound(sndPlaced);
       
  4655         DeleteGear(Gear);
       
  4656         AfterAttack;
       
  4657     end;
       
  4658 
       
  4659     HHGear^.State := HHGear^.State and not (gstAttacking or gstAttacked);
       
  4660     HHGear^.Message := HHGear^.Message and not gmAttack;
       
  4661     TargetPoint.X := NoPointX
       
  4662 end;
       
  4663 
       
  4664 procedure doStepStructure(Gear: PGear);
  4627 procedure doStepStructure(Gear: PGear);
  4665 var 
  4628 var 
  4666     i, x, y: LongInt;
  4629     i, x, y: LongInt;
  4667     dX, dY: HWFloat;
  4630     dX, dY: HWFloat;
  4668     hog: PHedgehog;
  4631     hog: PHedgehog;
  4669 begin
  4632 begin
  4670     if Gear^.Hedgehog <> nil then
  4633     if (Gear^.Hedgehog <> nil) and (Gear^.Tag = TotalRounds) then
  4671         if Gear^.Tag = 0 then
       
  4672         begin
       
  4673             hog:= Gear^.Hedgehog;
       
  4674             hog^.GearHidden:= hog^.Gear;
       
  4675             RemoveGearFromList(hog^.Gear);
       
  4676             hog^.Gear:= nil;
       
  4677             Gear^.Tag:= TotalRounds + 3;
       
  4678         end
       
  4679         else if Gear^.Tag = TotalRounds then
       
  4680         begin
  4634         begin
  4681             hog:= Gear^.Hedgehog;
  4635             hog:= Gear^.Hedgehog;
  4682             hog^.Gear:= hog^.GearHidden;
  4636             hog^.Gear:= hog^.GearHidden;
  4683             hog^.Gear^.X:= Gear^.X;
  4637             hog^.Gear^.X:= Gear^.X;
  4684             hog^.Gear^.Y:= Gear^.Y - Int2hwFloat(Gear^.Radius);
  4638             hog^.Gear^.Y:= Gear^.Y - Int2hwFloat(Gear^.Radius);
  4687             InsertGearToList(hog^.Gear);
  4641             InsertGearToList(hog^.Gear);
  4688             hog^.GearHidden:= nil;
  4642             hog^.GearHidden:= nil;
  4689             Gear^.Hedgehog:= nil;
  4643             Gear^.Hedgehog:= nil;
  4690         end;
  4644         end;
  4691 
  4645 
  4692     if (Gear^.dY.QWordValue <> 0) or (not TestCollisionYwithGear(Gear, 1)) then
       
  4693     begin
       
  4694         AllInactive := false;
       
  4695         Gear^.dY := Gear^.dY + cGravity;
       
  4696         Gear^.Y := Gear^.Y + Gear^.dY;
       
  4697         if (not Gear^.dY.isNegative) and (Gear^.dY > _0_001) then SetAllHHToActive;
       
  4698         if (Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, -1) then Gear^.dY := _0;
       
  4699         if (not Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, 1) then
       
  4700         begin
       
  4701             if Gear^.dY > _0_2 then
       
  4702                 for i:= min(12, hwRound(Gear^.dY*_10)) downto 0 do
       
  4703                     AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust);
       
  4704             Gear^.dY := - Gear^.dY * Gear^.Elasticity;
       
  4705             if Gear^.dY > - _0_001 then Gear^.dY := _0
       
  4706             else if Gear^.dY < - _0_03 then
       
  4707                     PlaySound(Gear^.ImpactSound);
       
  4708         end;
       
  4709         CheckGearDrowning(Gear);
       
  4710     end;
       
  4711 
       
  4712     if (Gear^.dY.QWordValue = 0) then AddGearCI(Gear)
       
  4713     else if (Gear^.dY.QWordValue <> 0) then DeleteCI(Gear);
       
  4714 
       
  4715     dec(Gear^.Health, Gear^.Damage);
  4646     dec(Gear^.Health, Gear^.Damage);
  4716     Gear^.Damage := 0;
  4647     Gear^.Damage := 0;
  4717 
  4648 
  4718     if Gear^.Health <= 0 then
  4649     if Gear^.Health <= 0 then
  4719     begin
  4650     begin
  4735 
  4666 
  4736         doMakeExplosion(x, y, 50, CurrentHedgehog, EXPLAutoSound);
  4667         doMakeExplosion(x, y, 50, CurrentHedgehog, EXPLAutoSound);
  4737     end;
  4668     end;
  4738 end;
  4669 end;
  4739 
  4670 
       
  4671 procedure doStepPlaceStructure(Gear: PGear);
       
  4672 var 
       
  4673     hog: PHedgehog;
       
  4674     HHGear: PGear;
       
  4675     x, y, tx, ty: hwFloat;
       
  4676 begin
       
  4677     AllInactive := false;
       
  4678 
       
  4679     HHGear := Gear^.Hedgehog^.Gear;
       
  4680     tx := int2hwFloat(TargetPoint.X);
       
  4681     ty := int2hwFloat(TargetPoint.Y);
       
  4682     x := HHGear^.X;
       
  4683     y := HHGear^.Y;
       
  4684 
       
  4685     HHGear := Gear^.Hedgehog^.Gear;
       
  4686     if (Distance(tx - x, ty - y) > _256) or
       
  4687        not TryPlaceOnLand(TargetPoint.X - SpritesData[sprHHTelepMask].Width div 2,
       
  4688        TargetPoint.Y - SpritesData[sprHHTelepMask].Height div 2,
       
  4689        sprHHTelepMask, 0, false, false) then
       
  4690     begin
       
  4691         HHGear^.Message := HHGear^.Message and not gmAttack;
       
  4692         HHGear^.State := HHGear^.State and not gstAttacking;
       
  4693         HHGear^.State := HHGear^.State or gstHHChooseTarget;
       
  4694         DeleteGear(Gear);
       
  4695         isCursorVisible := true;
       
  4696         PlaySound(sndDenied)
       
  4697     end
       
  4698     else
       
  4699     begin
       
  4700         DeleteCI(HHGear);
       
  4701         SetAllHHToActive;
       
  4702         PlaySound(sndPlaced);
       
  4703         CurAmmoGear:= nil;
       
  4704         AfterAttack;
       
  4705         Gear^.X := tx;
       
  4706         Gear^.Y := ty;
       
  4707         Gear^.Tag := TotalRounds + Gear^.Tag;
       
  4708         hog:= CurrentHedgehog;
       
  4709         hog^.GearHidden:= hog^.Gear;
       
  4710         RemoveGearFromList(hog^.Gear);
       
  4711         hog^.Gear:= nil;
       
  4712         Gear^.Hedgehog := hog;
       
  4713         Gear^.doStep := @doStepStructure;
       
  4714     end;
       
  4715     TargetPoint.X := NoPointX;
       
  4716 end;
       
  4717