hedgewars/GSHandlers.inc
changeset 1781 28f674367d68
parent 1776 dd5648e250e4
child 1784 dfe9bafb4590
equal deleted inserted replaced
1780:9b26e9f6ee96 1781:28f674367d68
   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