636 Gear^.doStep:= @doStepBlowTorchWork |
636 Gear^.doStep:= @doStepBlowTorchWork |
637 end; |
637 end; |
638 |
638 |
639 //////////////////////////////////////////////////////////////////////////////// |
639 //////////////////////////////////////////////////////////////////////////////// |
640 |
640 |
|
641 procedure doStepRope(Gear: PGear); forward; |
|
642 |
|
643 procedure doStepRopeAfterAttack(Gear: PGear); |
|
644 var HHGear: PGear; |
|
645 begin |
|
646 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
|
647 if ((HHGear^.State and gstHHDriven) = 0) |
|
648 or (CheckGearDrowning(HHGear)) |
|
649 or TestCollisionYwithGear(HHGear, 1) then |
|
650 begin |
|
651 DeleteGear(Gear); |
|
652 exit |
|
653 end; |
|
654 |
|
655 if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then SetLittle(HHGear^.dX); |
|
656 if HHGear^.dY.isNegative and TestCollisionYwithGear(HHGear, -1) then HHGear^.dY:= _0; |
|
657 HHGear^.X:= HHGear^.X + HHGear^.dX; |
|
658 HHGear^.Y:= HHGear^.Y + HHGear^.dY; |
|
659 HHGear^.dY:= HHGear^.dY + cGravity; |
|
660 |
|
661 if (Gear^.Message and gm_Attack) <> 0 then |
|
662 begin |
|
663 Gear^.X:= HHGear^.X; |
|
664 Gear^.Y:= HHGear^.Y; |
|
665 Gear^.dX:= SignAs(AngleSin(HHGear^.Angle), HHGear^.dX); |
|
666 Gear^.dY:= -AngleCos(HHGear^.Angle); |
|
667 Gear^.Friction:= _450; |
|
668 Gear^.Elasticity:= _0; |
|
669 Gear^.State:= Gear^.State and not gsttmpflag; |
|
670 Gear^.doStep:= @doStepRope |
|
671 end |
|
672 end; |
|
673 |
641 procedure doStepRopeWork(Gear: PGear); |
674 procedure doStepRopeWork(Gear: PGear); |
642 var HHGear: PGear; |
675 var HHGear: PGear; |
643 len, tx, ty, nx, ny, ropeDx, ropeDy, mdX, mdY: hwFloat; |
676 len, tx, ty, nx, ny, ropeDx, ropeDy, mdX, mdY: hwFloat; |
644 lx, ly: LongInt; |
677 lx, ly: LongInt; |
645 haveCollision, |
678 haveCollision, |
651 begin |
684 begin |
652 Message:= Message and not gm_Attack; |
685 Message:= Message and not gm_Attack; |
653 State:= State or gstMoving; |
686 State:= State or gstMoving; |
654 end; |
687 end; |
655 DeleteGear(Gear) |
688 DeleteGear(Gear) |
|
689 end; |
|
690 |
|
691 procedure WaitCollision; |
|
692 begin |
|
693 with HHGear^ do |
|
694 begin |
|
695 Message:= Message and not gm_Attack; |
|
696 State:= State or gstMoving; |
|
697 end; |
|
698 RopePoints.Count:= 0; |
|
699 Gear^.Elasticity:= _0; |
|
700 Gear^.doStep:= @doStepRopeAfterAttack |
656 end; |
701 end; |
657 |
702 |
658 begin |
703 begin |
659 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
704 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
660 |
705 |
780 HHGear^.dY:= HHGear^.dY * len; |
825 HHGear^.dY:= HHGear^.dY * len; |
781 end; |
826 end; |
782 |
827 |
783 if (Gear^.Message and gm_Attack) <> 0 then |
828 if (Gear^.Message and gm_Attack) <> 0 then |
784 if (Gear^.State and gsttmpFlag) <> 0 then |
829 if (Gear^.State and gsttmpFlag) <> 0 then |
785 DeleteMe |
830 WaitCollision |
786 else |
831 else |
787 else |
832 else |
788 if (Gear^.State and gsttmpFlag) = 0 then |
833 if (Gear^.State and gsttmpFlag) = 0 then |
789 Gear^.State:= Gear^.State or gsttmpFlag; |
834 Gear^.State:= Gear^.State or gsttmpFlag; |
790 end; |
835 end; |
791 |
836 |
792 |
|
793 procedure doStepRopeAttach(Gear: PGear); |
837 procedure doStepRopeAttach(Gear: PGear); |
794 var HHGear: PGear; |
838 var HHGear: PGear; |
795 tx, ty, tt: hwFloat; |
839 tx, ty, tt: hwFloat; |
|
840 |
|
841 procedure RemoveFromAmmo; |
|
842 begin |
|
843 if (Gear^.State and gstAttacked) = 0 then |
|
844 begin |
|
845 OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^); |
|
846 ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); |
|
847 Gear^.State:= Gear^.State or gstAttacked |
|
848 end |
|
849 end; |
|
850 |
796 begin |
851 begin |
797 Gear^.X:= Gear^.X - Gear^.dX; |
852 Gear^.X:= Gear^.X - Gear^.dX; |
798 Gear^.Y:= Gear^.Y - Gear^.dY; |
853 Gear^.Y:= Gear^.Y - Gear^.dY; |
799 Gear^.Elasticity:= Gear^.Elasticity + _1; |
854 Gear^.Elasticity:= Gear^.Elasticity + _1; |
800 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
855 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
824 Gear^.X:= Gear^.X + tx; |
879 Gear^.X:= Gear^.X + tx; |
825 Gear^.Y:= Gear^.Y + ty; |
880 Gear^.Y:= Gear^.Y + ty; |
826 Gear^.Elasticity:= tt; |
881 Gear^.Elasticity:= tt; |
827 Gear^.doStep:= @doStepRopeWork; |
882 Gear^.doStep:= @doStepRopeWork; |
828 with HHGear^ do State:= State and not (gstAttacking or gstMoving or gstHHHJump); |
883 with HHGear^ do State:= State and not (gstAttacking or gstMoving or gstHHHJump); |
|
884 |
|
885 RemoveFromAmmo; |
|
886 |
829 tt:= _0; |
887 tt:= _0; |
830 exit |
888 exit |
831 end; |
889 end; |
832 tx:= tx + Gear^.dX + Gear^.dX; |
890 tx:= tx + Gear^.dX + Gear^.dX; |
833 ty:= ty + Gear^.dY + Gear^.dY; |
891 ty:= ty + Gear^.dY + Gear^.dY; |
840 if (Gear^.State and gstCollision) <> 0 then |
898 if (Gear^.State and gstCollision) <> 0 then |
841 begin |
899 begin |
842 Gear^.doStep:= @doStepRopeWork; |
900 Gear^.doStep:= @doStepRopeWork; |
843 with HHGear^ do State:= State and not (gstAttacking or gstHHHJump); |
901 with HHGear^ do State:= State and not (gstAttacking or gstHHHJump); |
844 |
902 |
845 OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^); |
903 RemoveFromAmmo; |
846 ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); |
|
847 |
904 |
848 if Gear^.Elasticity < _10 then |
905 if Gear^.Elasticity < _10 then |
849 Gear^.Elasticity:= _10000; |
906 Gear^.Elasticity:= _10000; |
850 end; |
907 end; |
851 |
908 |