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; |