hedgewars/GSHandlers.inc
changeset 1696 bb1e305320a1
parent 1689 3d0eee01f734
child 1697 ea3eddd73f2c
equal deleted inserted replaced
1695:028e1a1a86e0 1696:bb1e305320a1
  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 
  1950 
       
  1951 ////////////////////////////////////////////////////////////////////////////////
  1951 procedure doStepRCPlaneWork(Gear: PGear);
  1952 procedure doStepRCPlaneWork(Gear: PGear);
  1952 const cAngleSpeed = 3;
  1953 const cAngleSpeed = 3;
  1953 var HHGear: PGear;
  1954 var HHGear: PGear;
  1954 	i: LongInt;
  1955 	i: LongInt;
  1955 	dX, dY: hwFloat;
  1956 	dX, dY: hwFloat;
  1957 	trueAngle: Longword;
  1958 	trueAngle: Longword;
  1958 	t: PGear;
  1959 	t: PGear;
  1959 begin
  1960 begin
  1960 AllInactive:= false;
  1961 AllInactive:= false;
  1961 
  1962 
  1962 dec(Gear^.Timer);
  1963 if Gear^.Timer > 0 then dec(Gear^.Timer);
  1963 
  1964 
  1964 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1965 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  1965 FollowGear:= Gear;
  1966 FollowGear:= Gear;
  1966 
  1967 
  1967 fChanged:= false;
  1968 fChanged:= false;
  1968 if ((Gear^.Message and gm_Left) <> 0) then
  1969 if ((HHGear^.State and gstHHDriven) = 0) or (Gear^.Timer = 0) then
  1969 	begin
  1970 	begin
  1970 	fChanged:= true;
  1971 	fChanged:= true;
  1971 	Gear^.Angle:= (Gear^.Angle + (4096 - cAngleSpeed)) mod 4096
  1972 	if Gear^.Angle > 2048 then dec(Gear^.Angle) else
  1972 	end;
  1973 		if Gear^.Angle < 2048 then inc(Gear^.Angle) else fChanged:= false
  1973 
  1974 	end
  1974 if ((Gear^.Message and gm_Right) <> 0) then
  1975 else
  1975 	begin
  1976 	begin
  1976 	fChanged:= true;
  1977 	if ((Gear^.Message and gm_Left) <> 0) then
  1977 	Gear^.Angle:= (Gear^.Angle + cAngleSpeed) mod 4096
  1978 		begin
       
  1979 		fChanged:= true;
       
  1980 		Gear^.Angle:= (Gear^.Angle + (4096 - cAngleSpeed)) mod 4096
       
  1981 		end;
       
  1982 
       
  1983 	if ((Gear^.Message and gm_Right) <> 0) then
       
  1984 		begin
       
  1985 		fChanged:= true;
       
  1986 		Gear^.Angle:= (Gear^.Angle + cAngleSpeed) mod 4096
       
  1987 		end
  1978 	end;
  1988 	end;
  1979 
  1989 
  1980 if fChanged then
  1990 if fChanged then
  1981 	begin
  1991 	begin
  1982 	Gear^.dX.isNegative:= (Gear^.Angle > 2048);
  1992 	Gear^.dX.isNegative:= (Gear^.Angle > 2048);
  1987 
  1997 
  1988 	Gear^.dX:= SignAs(AngleSin(trueAngle), Gear^.dX) * _0_25;
  1998 	Gear^.dX:= SignAs(AngleSin(trueAngle), Gear^.dX) * _0_25;
  1989 	Gear^.dY:= AngleCos(trueAngle) * -_0_25;
  1999 	Gear^.dY:= AngleCos(trueAngle) * -_0_25;
  1990 	end;
  2000 	end;
  1991 
  2001 
  1992 
       
  1993 Gear^.X:= Gear^.X + Gear^.dX;
  2002 Gear^.X:= Gear^.X + Gear^.dX;
  1994 Gear^.Y:= Gear^.Y + Gear^.dY;
  2003 Gear^.Y:= Gear^.Y + Gear^.dY;
  1995 
  2004 
  1996 if (GameTicks and $FF) = 0 then
  2005 if (GameTicks and $FF) = 0 then
  1997 	AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0);
  2006 	if Gear^.Timer < 2500 then
  1998 
  2007 		AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtEvilTrace, 0, _0, _0, 0)
  1999 if ((HHGear^.Message and gm_Attack) <> 0)and(Gear^.Health <> 0) then
  2008 	else
       
  2009 		AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0);
       
  2010 
       
  2011 if ((HHGear^.Message and gm_Attack) <> 0) and (Gear^.Health <> 0) then
  2000 	begin
  2012 	begin
  2001 	HHGear^.Message := HHGear^.Message and not gm_Attack;
  2013 	HHGear^.Message := HHGear^.Message and not gm_Attack;
  2002 	AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, cBombsSpeed * Gear^.Tag, _0, 0);
  2014 	AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, cBombsSpeed * Gear^.Tag, _0, 0);
  2003 	dec(Gear^.Health)
  2015 	dec(Gear^.Health)
  2004 	end;
  2016 	end;
  2008 if t <> nil then
  2020 if t <> nil then
  2009 	PickUp(HHGear, t);
  2021 	PickUp(HHGear, t);
  2010 
  2022 
  2011 CheckCollision(Gear);
  2023 CheckCollision(Gear);
  2012 
  2024 
  2013 if ((Gear^.State and gstCollision) <> 0) or (Gear^.Timer = 0) then
  2025 if ((Gear^.State and gstCollision) <> 0) then
  2014 	begin
  2026 	begin
  2015 	HHGear^.Message:= 0;
  2027 	HHGear^.Message:= 0;
  2016 	//HHGear^.State:= HHGear^.State and (not gstNotKickable);
  2028 	//HHGear^.State:= HHGear^.State and (not gstNotKickable);
  2017 	doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLAutoSound);
  2029 	doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLAutoSound);
  2018 	for i:= 0 to 25 do
  2030 	for i:= 0 to 25 do
  2035 begin
  2047 begin
  2036 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  2048 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  2037 HHGear^.Message:= 0;
  2049 HHGear^.Message:= 0;
  2038 HHGear^.State:= HHGear^.State or gstNotKickable;
  2050 HHGear^.State:= HHGear^.State or gstNotKickable;
  2039 Gear^.Angle:= HHGear^.Angle;
  2051 Gear^.Angle:= HHGear^.Angle;
       
  2052 Gear^.Tag:= hwSign(HHGear^.dX);
  2040 if HHGear^.dX.isNegative then Gear^.Angle:= 4096 - Gear^.Angle;
  2053 if HHGear^.dX.isNegative then Gear^.Angle:= 4096 - Gear^.Angle;
  2041 Gear^.doStep:= @doStepRCPlaneWork
  2054 Gear^.doStep:= @doStepRCPlaneWork
  2042 end;
  2055 end;