hedgewars/GSHandlers.inc
changeset 1689 3d0eee01f734
parent 1669 b709e061577e
child 1696 bb1e305320a1
equal deleted inserted replaced
1688:d94ac781a8e3 1689:3d0eee01f734
     1 (*
     1 (*
     2  * Hedgewars, a free turn based strategy game
     2  * Hedgewars, a free turn based strategy game
     3  * Copyright (c) 2004-2008 Andrey Korotaev <unC0Rr@gmail.com>
     3  * Copyright (c) 2004-2009 Andrey Korotaev <unC0Rr@gmail.com>
     4  *
     4  *
     5  * This program is free software; you can redistribute it and/or modify
     5  * This program is free software; you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation; version 2 of the License
     7  * the Free Software Foundation; version 2 of the License
     8  *
     8  *
  1945 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1945 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1946 HHGear^.Message:= HHGear^.Message and not (gm_Up or gm_Down);
  1946 HHGear^.Message:= HHGear^.Message and not (gm_Up or gm_Down);
  1947 HHGear^.State:= HHGear^.State or gstNotKickable;
  1947 HHGear^.State:= HHGear^.State or gstNotKickable;
  1948 Gear^.doStep:= @doStepBallgunWork
  1948 Gear^.doStep:= @doStepBallgunWork
  1949 end;
  1949 end;
       
  1950 
       
  1951 procedure doStepRCPlaneWork(Gear: PGear);
       
  1952 const cAngleSpeed = 3;
       
  1953 var HHGear: PGear;
       
  1954 	i: LongInt;
       
  1955 	dX, dY: hwFloat;
       
  1956 	fChanged: boolean;
       
  1957 	trueAngle: Longword;
       
  1958 	t: PGear;
       
  1959 begin
       
  1960 AllInactive:= false;
       
  1961 
       
  1962 dec(Gear^.Timer);
       
  1963 
       
  1964 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
       
  1965 FollowGear:= Gear;
       
  1966 
       
  1967 fChanged:= false;
       
  1968 if ((Gear^.Message and gm_Left) <> 0) then
       
  1969 	begin
       
  1970 	fChanged:= true;
       
  1971 	Gear^.Angle:= (Gear^.Angle + (4096 - cAngleSpeed)) mod 4096
       
  1972 	end;
       
  1973 
       
  1974 if ((Gear^.Message and gm_Right) <> 0) then
       
  1975 	begin
       
  1976 	fChanged:= true;
       
  1977 	Gear^.Angle:= (Gear^.Angle + cAngleSpeed) mod 4096
       
  1978 	end;
       
  1979 
       
  1980 if fChanged then
       
  1981 	begin
       
  1982 	Gear^.dX.isNegative:= (Gear^.Angle > 2048);
       
  1983 	if Gear^.dX.isNegative then
       
  1984 		trueAngle:= 4096 - Gear^.Angle
       
  1985 	else
       
  1986 		trueAngle:= Gear^.Angle;
       
  1987 
       
  1988 	Gear^.dX:= SignAs(AngleSin(trueAngle), Gear^.dX) * _0_25;
       
  1989 	Gear^.dY:= AngleCos(trueAngle) * -_0_25;
       
  1990 	end;
       
  1991 
       
  1992 
       
  1993 Gear^.X:= Gear^.X + Gear^.dX;
       
  1994 Gear^.Y:= Gear^.Y + Gear^.dY;
       
  1995 
       
  1996 if (GameTicks and $FF) = 0 then
       
  1997 	AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0);
       
  1998 
       
  1999 if ((HHGear^.Message and gm_Attack) <> 0)and(Gear^.Health <> 0) then
       
  2000 	begin
       
  2001 	HHGear^.Message := HHGear^.Message and not gm_Attack;
       
  2002 	AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, cBombsSpeed * Gear^.Tag, _0, 0);
       
  2003 	dec(Gear^.Health)
       
  2004 	end;
       
  2005 
       
  2006 // pickup bonuses
       
  2007 t:= CheckGearNear(Gear, gtCase, 36, 36);
       
  2008 if t <> nil then
       
  2009 	PickUp(HHGear, t);
       
  2010 
       
  2011 CheckCollision(Gear);
       
  2012 
       
  2013 if ((Gear^.State and gstCollision) <> 0) or (Gear^.Timer = 0) then
       
  2014 	begin
       
  2015 	HHGear^.Message:= 0;
       
  2016 	//HHGear^.State:= HHGear^.State and (not gstNotKickable);
       
  2017 	doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLAutoSound);
       
  2018 	for i:= 0 to 25 do
       
  2019 		begin
       
  2020 		dX:= AngleCos(i * 16) * _0_5 * (GetRandom + _1);
       
  2021 		dY:= AngleSin(i * 16) * _0_5 * (GetRandom + _1);
       
  2022 		AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, dY, 0);
       
  2023 		AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, -dY, 0);
       
  2024 		end;
       
  2025 	DeleteGear(Gear);
       
  2026 	AfterAttack;
       
  2027 	end;
       
  2028 
       
  2029 if CheckGearDrowning(Gear) then
       
  2030 	AfterAttack
       
  2031 end;
       
  2032 
       
  2033 procedure doStepRCPlane(Gear: PGear);
       
  2034 var HHGear: PGear;
       
  2035 begin
       
  2036 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
       
  2037 HHGear^.Message:= 0;
       
  2038 HHGear^.State:= HHGear^.State or gstNotKickable;
       
  2039 Gear^.Angle:= HHGear^.Angle;
       
  2040 if HHGear^.dX.isNegative then Gear^.Angle:= 4096 - Gear^.Angle;
       
  2041 Gear^.doStep:= @doStepRCPlaneWork
       
  2042 end;