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 |