78 var isFalling: boolean; |
81 var isFalling: boolean; |
79 begin |
82 begin |
80 Gear^.State:= Gear^.State and not gstCollision; |
83 Gear^.State:= Gear^.State and not gstCollision; |
81 |
84 |
82 if Gear^.dY.isNegative then |
85 if Gear^.dY.isNegative then |
83 begin |
86 begin |
84 isFalling:= true; |
87 isFalling:= true; |
85 if TestCollisionYwithGear(Gear, -1) then |
88 if TestCollisionYwithGear(Gear, -1) then |
86 begin |
89 begin |
87 Gear^.dX:= Gear^.dX * Gear^.Friction; |
90 Gear^.dX:= Gear^.dX * Gear^.Friction; |
88 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
91 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
89 Gear^.State:= Gear^.State or gstCollision |
92 Gear^.State:= Gear^.State or gstCollision |
90 end |
93 end |
91 end else |
94 end else |
92 if TestCollisionYwithGear(Gear, 1) then |
95 if TestCollisionYwithGear(Gear, 1) then |
93 begin |
96 begin |
94 isFalling:= false; |
97 isFalling:= false; |
95 Gear^.dX:= Gear^.dX * Gear^.Friction; |
98 Gear^.dX:= Gear^.dX * Gear^.Friction; |
96 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
99 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
97 Gear^.State:= Gear^.State or gstCollision |
100 Gear^.State:= Gear^.State or gstCollision |
98 end else isFalling:= true; |
101 end else isFalling:= true; |
99 |
102 |
100 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then |
103 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then |
101 begin |
104 begin |
102 Gear^.dX:= - Gear^.dX * Gear^.Elasticity; |
105 Gear^.dX:= - Gear^.dX * Gear^.Elasticity; |
103 Gear^.dY:= Gear^.dY * Gear^.Elasticity; |
106 Gear^.dY:= Gear^.dY * Gear^.Elasticity; |
104 Gear^.State:= Gear^.State or gstCollision |
107 Gear^.State:= Gear^.State or gstCollision |
105 end; |
108 end; |
106 |
109 |
107 if isFalling then Gear^.dY:= Gear^.dY + cGravity; |
110 if isFalling then Gear^.dY:= Gear^.dY + cGravity; |
108 |
111 |
109 Gear^.X:= Gear^.X + Gear^.dX; |
112 Gear^.X:= Gear^.X + Gear^.dX; |
110 Gear^.Y:= Gear^.Y + Gear^.dY; |
113 Gear^.Y:= Gear^.Y + Gear^.dY; |
111 CheckGearDrowning(Gear); |
114 CheckGearDrowning(Gear); |
112 if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _0_0002) and |
115 if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _0_0002) and |
113 (not isFalling) then Gear^.State:= Gear^.State and not gstMoving |
116 (not isFalling) then |
114 else Gear^.State:= Gear^.State or gstMoving |
117 Gear^.State:= Gear^.State and not gstMoving |
|
118 else |
|
119 Gear^.State:= Gear^.State or gstMoving |
115 end; |
120 end; |
116 |
121 |
117 //////////////////////////////////////////////////////////////////////////////// |
122 //////////////////////////////////////////////////////////////////////////////// |
118 procedure doStepBomb(Gear: PGear); |
123 procedure doStepBomb(Gear: PGear); |
119 var i: LongInt; |
124 var i: LongInt; |
121 begin |
126 begin |
122 AllInactive:= false; |
127 AllInactive:= false; |
123 doStepFallingGear(Gear); |
128 doStepFallingGear(Gear); |
124 dec(Gear^.Timer); |
129 dec(Gear^.Timer); |
125 if Gear^.Timer = 0 then |
130 if Gear^.Timer = 0 then |
126 begin |
131 begin |
127 case Gear^.Kind of |
132 case Gear^.Kind of |
128 gtAmmo_Bomb: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); |
133 gtAmmo_Bomb: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); |
129 gtClusterBomb: begin |
134 gtClusterBomb: begin |
130 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, EXPLAutoSound); |
135 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, EXPLAutoSound); |
131 for i:= 0 to 4 do |
136 for i:= 0 to 4 do |
132 begin |
137 begin |
133 dX:= rndSign(GetRandom * _0_1); |
138 dX:= rndSign(GetRandom * _0_1); |
134 dY:= (GetRandom - _3) * _0_08; |
139 dY:= (GetRandom - _3) * _0_08; |
135 AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtCluster, 0, dX, dY, 0); |
140 AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtCluster, 0, dX, dY, 0); |
136 end |
141 end |
137 end |
142 end |
138 end; |
143 end; |
139 DeleteGear(Gear); |
144 DeleteGear(Gear); |
140 exit |
145 exit |
141 end; |
146 end; |
142 CalcRotationDirAngle(Gear); |
147 CalcRotationDirAngle(Gear); |
143 if (Gear^.State and (gstCollision or gstMoving)) = (gstCollision or gstMoving) then PlaySound(sndGrenadeImpact, false) |
148 if (Gear^.State and (gstCollision or gstMoving)) = (gstCollision or gstMoving) then PlaySound(sndGrenadeImpact, false) |
144 end; |
149 end; |
145 |
150 |
146 procedure doStepCluster(Gear: PGear); |
151 procedure doStepCluster(Gear: PGear); |
147 begin |
152 begin |
148 AllInactive:= false; |
153 AllInactive:= false; |
149 doStepFallingGear(Gear); |
154 doStepFallingGear(Gear); |
150 if (Gear^.State and gstCollision) <> 0 then |
155 if (Gear^.State and gstCollision) <> 0 then |
151 begin |
156 begin |
152 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLAutoSound); |
157 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLAutoSound); |
153 DeleteGear(Gear); |
158 DeleteGear(Gear); |
154 exit |
159 exit |
155 end; |
160 end; |
156 if (GameTicks and $1F) = 0 then |
161 if (GameTicks and $1F) = 0 then |
157 AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0) |
162 AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0) |
158 end; |
163 end; |
159 |
164 |
160 //////////////////////////////////////////////////////////////////////////////// |
165 //////////////////////////////////////////////////////////////////////////////// |
161 procedure doStepGrenade(Gear: PGear); |
166 procedure doStepGrenade(Gear: PGear); |
162 begin |
167 begin |
163 AllInactive:= false; |
168 AllInactive:= false; |
164 Gear^.dX:= Gear^.dX + cWindSpeed; |
169 Gear^.dX:= Gear^.dX + cWindSpeed; |
165 doStepFallingGear(Gear); |
170 doStepFallingGear(Gear); |
166 if (Gear^.State and gstCollision) <> 0 then |
171 if (Gear^.State and gstCollision) <> 0 then |
167 begin |
172 begin |
168 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); |
173 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); |
169 DeleteGear(Gear); |
174 DeleteGear(Gear); |
170 exit |
175 exit |
171 end; |
176 end; |
172 if (GameTicks and $3F) = 0 then |
177 if (GameTicks and $3F) = 0 then |
173 AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0) |
178 AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, _0, _0, 0) |
174 end; |
179 end; |
175 |
180 |
176 //////////////////////////////////////////////////////////////////////////////// |
181 //////////////////////////////////////////////////////////////////////////////// |
177 procedure doStepHealthTagWork(Gear: PGear); |
182 procedure doStepHealthTagWork(Gear: PGear); |
178 begin |
183 begin |
179 if Gear^.Kind = gtHealthTag then |
184 if Gear^.Kind = gtHealthTag then |
180 AllInactive:= false; |
185 AllInactive:= false; |
181 dec(Gear^.Timer); |
186 dec(Gear^.Timer); |
182 Gear^.Y:= Gear^.Y + Gear^.dY; |
187 Gear^.Y:= Gear^.Y + Gear^.dY; |
183 if Gear^.Timer = 0 then |
188 if Gear^.Timer = 0 then |
184 begin |
189 begin |
185 if Gear^.Kind = gtHealthTag then |
190 if Gear^.Kind = gtHealthTag then |
186 PHedgehog(Gear^.Hedgehog)^.Gear^.Active:= true; // to let current hh die |
191 PHedgehog(Gear^.Hedgehog)^.Gear^.Active:= true; // to let current hh die |
187 DeleteGear(Gear) |
192 DeleteGear(Gear) |
188 end |
193 end |
189 end; |
194 end; |
190 |
195 |
191 procedure doStepHealthTagWorkUnderWater(Gear: PGear); |
196 procedure doStepHealthTagWorkUnderWater(Gear: PGear); |
192 begin |
197 begin |
193 AllInactive:= false; |
198 AllInactive:= false; |
825 end else |
830 end else |
826 if ((GameTicks and $3F) = 25) then |
831 if ((GameTicks and $3F) = 25) then |
827 doStepFallingGear(Gear); |
832 doStepFallingGear(Gear); |
828 |
833 |
829 if ((Gear^.State and gsttmpFlag) <> 0) then |
834 if ((Gear^.State and gsttmpFlag) <> 0) then |
830 if ((Gear^.State and gstAttacking) = 0) then |
835 if ((Gear^.State and gstAttacking) = 0) then |
831 begin |
836 begin |
832 if ((GameTicks and $1F) = 0) then |
837 if ((GameTicks and $1F) = 0) then |
833 if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then Gear^.State:= Gear^.State or gstAttacking |
838 if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then Gear^.State:= Gear^.State or gstAttacking |
834 end else // gstAttacking <> 0 |
839 end else // gstAttacking <> 0 |
835 begin |
840 begin |
836 AllInactive:= false; |
841 AllInactive:= false; |
837 if (Gear^.Timer and $FF) = 0 then PlaySound(sndMineTick, false); |
842 if (Gear^.Timer and $FF) = 0 then PlaySound(sndMineTick, false); |
838 if Gear^.Timer = 0 then |
843 if Gear^.Timer = 0 then |
839 begin |
844 begin |
840 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); |
845 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); |
841 DeleteGear(Gear); |
846 DeleteGear(Gear); |
842 exit |
847 exit |
843 end; |
848 end; |
844 dec(Gear^.Timer); |
849 dec(Gear^.Timer); |
845 end else // gsttmpFlag = 0 |
850 end else // gsttmpFlag = 0 |
846 if TurnTimeLeft = 0 then Gear^.State:= Gear^.State or gsttmpFlag; |
851 if TurnTimeLeft = 0 then Gear^.State:= Gear^.State or gsttmpFlag; |
847 end; |
852 end; |
848 |
853 |
849 //////////////////////////////////////////////////////////////////////////////// |
854 //////////////////////////////////////////////////////////////////////////////// |
850 procedure doStepDynamite(Gear: PGear); |
855 procedure doStepDynamite(Gear: PGear); |
851 begin |
856 begin |
852 doStepFallingGear(Gear); |
857 doStepFallingGear(Gear); |
853 AllInactive:= false; |
858 AllInactive:= false; |
854 if Gear^.Timer mod 166 = 0 then inc(Gear^.Tag); |
859 if Gear^.Timer mod 166 = 0 then inc(Gear^.Tag); |
855 if Gear^.Timer = 0 then |
860 if Gear^.Timer = 0 then |
856 begin |
861 begin |
857 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, EXPLAutoSound); |
862 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, EXPLAutoSound); |
858 DeleteGear(Gear); |
863 DeleteGear(Gear); |
859 exit |
864 exit |
860 end; |
865 end; |
861 dec(Gear^.Timer); |
866 dec(Gear^.Timer); |
862 end; |
867 end; |
863 |
868 |
864 /////////////////////////////////////////////////////////////////////////////// |
869 /////////////////////////////////////////////////////////////////////////////// |
865 procedure doStepCase(Gear: PGear); |
870 procedure doStepCase(Gear: PGear); |
866 var i, x, y: LongInt; |
871 var i, x, y: LongInt; |
867 begin |
872 begin |
868 if (Gear^.Message and gm_Destroy) > 0 then |
873 if (Gear^.Message and gm_Destroy) > 0 then |
869 begin |
874 begin |
870 DeleteGear(Gear); |
875 DeleteGear(Gear); |
871 FreeActionsList; |
876 FreeActionsList; |
872 SetAllToActive; // something (hh, mine, etc...) could be on top of the case |
877 SetAllToActive; // something (hh, mine, etc...) could be on top of the case |
873 with CurrentHedgehog^ do |
878 with CurrentHedgehog^ do |
874 if Gear <> nil then Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump); |
879 if Gear <> nil then Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump); |
875 exit |
880 exit |
876 end; |
881 end; |
877 |
882 |
878 if Gear^.Damage > 0 then |
883 if Gear^.Damage > 0 then |
879 begin |
884 begin |
880 x:= hwRound(Gear^.X); |
885 x:= hwRound(Gear^.X); |
881 y:= hwRound(Gear^.Y); |
886 y:= hwRound(Gear^.Y); |
882 DeleteGear(Gear); |
887 DeleteGear(Gear); |
883 if Gear^.Kind = gtCase then |
888 if Gear^.Kind = gtCase then |
884 begin |
889 begin |
885 doMakeExplosion(x, y, 25, EXPLAutoSound); |
890 doMakeExplosion(x, y, 25, EXPLAutoSound); |
886 for i:= 0 to 63 do |
891 for i:= 0 to 63 do |
887 AddGear(x, y, gtFlame, 0, _0, _0, 0); |
892 AddGear(x, y, gtFlame, 0, _0, _0, 0); |
888 end; |
893 end; |
889 exit |
894 exit |
890 end; |
895 end; |
891 |
896 |
892 if (Gear^.dY.QWordValue <> 0) or (not TestCollisionYwithGear(Gear, 1)) then |
897 if (Gear^.dY.QWordValue <> 0) or (not TestCollisionYwithGear(Gear, 1)) then |
893 begin |
898 begin |
894 AllInactive:= false; |
899 AllInactive:= false; |
895 Gear^.dY:= Gear^.dY + cGravity; |
900 Gear^.dY:= Gear^.dY + cGravity; |
896 Gear^.Y:= Gear^.Y + Gear^.dY; |
901 Gear^.Y:= Gear^.Y + Gear^.dY; |
897 if (Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= _0 else |
902 if (Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= _0 else |
898 if (not Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, 1) then |
903 if (not Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, 1) then |
899 begin |
904 begin |
900 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
905 Gear^.dY:= - Gear^.dY * Gear^.Elasticity; |
901 if Gear^.dY > - _0_001 then Gear^.dY:= _0 |
906 if Gear^.dY > - _0_001 then Gear^.dY:= _0 |
902 else if Gear^.dY < - _0_03 then PlaySound(sndGraveImpact, false); |
907 else if Gear^.dY < - _0_03 then PlaySound(sndGraveImpact, false); |
903 end; |
908 end; |
904 CheckGearDrowning(Gear); |
909 CheckGearDrowning(Gear); |
905 end; |
910 end; |
906 |
911 |
907 if (Gear^.dY.QWordValue = 0) then AddGearCI(Gear) |
912 if (Gear^.dY.QWordValue = 0) then AddGearCI(Gear) |
908 else if (Gear^.dY.QWordValue <> 0) then DeleteCI(Gear) |
913 else if (Gear^.dY.QWordValue <> 0) then DeleteCI(Gear) |
909 end; |
914 end; |
910 |
915 |
911 //////////////////////////////////////////////////////////////////////////////// |
916 //////////////////////////////////////////////////////////////////////////////// |
912 const cSorterWorkTime = 640; |
917 const cSorterWorkTime = 640; |
913 var thexchar: array[0..cMaxTeams] of |
918 var thexchar: array[0..cMaxTeams] of |
914 record |
919 record |
915 dy, ny, dw: LongInt; |
920 dy, ny, dw: LongInt; |
916 team: PTeam; |
921 team: PTeam; |
917 SortFactor: QWord; |
922 SortFactor: QWord; |
918 end; |
923 end; |
919 currsorter: PGear = nil; |
924 currsorter: PGear = nil; |
920 |
925 |
921 procedure doStepTeamHealthSorterWork(Gear: PGear); |
926 procedure doStepTeamHealthSorterWork(Gear: PGear); |
922 var i: LongInt; |
927 var i: LongInt; |
923 begin |
928 begin |
924 AllInactive:= false; |
929 AllInactive:= false; |
925 dec(Gear^.Timer); |
930 dec(Gear^.Timer); |
926 if (Gear^.Timer and 15) = 0 then |
931 if (Gear^.Timer and 15) = 0 then |
927 for i:= 0 to Pred(TeamsCount) do |
932 for i:= 0 to Pred(TeamsCount) do |
928 with thexchar[i] do |
933 with thexchar[i] do |
929 begin |
934 begin |
930 {$WARNINGS OFF} |
935 {$WARNINGS OFF} |
931 team^.DrawHealthY:= ny + dy * Gear^.Timer div 640; |
936 team^.DrawHealthY:= ny + dy * Gear^.Timer div 640; |
932 team^.TeamHealthBarWidth:= team^.NewTeamHealthBarWidth + dw * Gear^.Timer div cSorterWorkTime; |
937 team^.TeamHealthBarWidth:= team^.NewTeamHealthBarWidth + dw * Gear^.Timer div cSorterWorkTime; |
933 {$WARNINGS ON} |
938 {$WARNINGS ON} |
934 end; |
939 end; |
|
940 |
935 if (Gear^.Timer = 0) or (currsorter <> Gear) then |
941 if (Gear^.Timer = 0) or (currsorter <> Gear) then |
936 begin |
942 begin |
937 if currsorter = Gear then currsorter:= nil; |
943 if currsorter = Gear then currsorter:= nil; |
938 DeleteGear(Gear) |
944 DeleteGear(Gear) |
939 end |
945 end |
940 end; |
946 end; |
941 |
947 |
942 procedure doStepTeamHealthSorter(Gear: PGear); |
948 procedure doStepTeamHealthSorter(Gear: PGear); |
943 var i, t: Longword; |
949 var i: Longword; |
944 b: boolean; |
950 b: boolean; |
|
951 t: LongInt; |
945 begin |
952 begin |
946 AllInactive:= false; |
953 AllInactive:= false; |
947 |
954 |
948 for t:= 0 to Pred(TeamsCount) do |
955 for t:= 0 to Pred(TeamsCount) do |
949 with thexchar[t] do |
956 with thexchar[t] do |
950 begin |
957 begin |
951 dy:= TeamsArray[t]^.DrawHealthY; |
958 dy:= TeamsArray[t]^.DrawHealthY; |
952 dw:= TeamsArray[t]^.TeamHealthBarWidth - TeamsArray[t]^.NewTeamHealthBarWidth; |
959 dw:= TeamsArray[t]^.TeamHealthBarWidth - TeamsArray[t]^.NewTeamHealthBarWidth; |
953 team:= TeamsArray[t]; |
960 team:= TeamsArray[t]; |
954 SortFactor:= TeamsArray[t]^.Clan^.ClanHealth; |
961 SortFactor:= TeamsArray[t]^.Clan^.ClanHealth; |
955 SortFactor:= (SortFactor shl 3) + TeamsArray[t]^.Clan^.ClanIndex; |
962 SortFactor:= (SortFactor shl 3) + TeamsArray[t]^.Clan^.ClanIndex; |
956 SortFactor:= (SortFactor shl 30) + TeamsArray[t]^.TeamHealth; |
963 SortFactor:= (SortFactor shl 30) + TeamsArray[t]^.TeamHealth; |
957 end; |
964 end; |
958 |
965 |
959 if TeamsCount > 1 then |
966 if TeamsCount > 1 then |
960 repeat |
967 repeat |
961 b:= true; |
968 b:= true; |
962 for t:= 0 to TeamsCount - 2 do |
969 for t:= 0 to TeamsCount - 2 do |
963 if (thexchar[t].SortFactor > thexchar[Succ(t)].SortFactor) then |
970 if (thexchar[t].SortFactor > thexchar[Succ(t)].SortFactor) then |
964 begin |
971 begin |
965 thexchar[cMaxTeams]:= thexchar[t]; |
972 thexchar[cMaxTeams]:= thexchar[t]; |
966 thexchar[t]:= thexchar[Succ(t)]; |
973 thexchar[t]:= thexchar[Succ(t)]; |
967 thexchar[Succ(t)]:= thexchar[cMaxTeams]; |
974 thexchar[Succ(t)]:= thexchar[cMaxTeams]; |
968 b:= false |
975 b:= false |
969 end |
976 end |
970 until b; |
977 until b; |
971 |
978 |
972 t:= - 4; |
979 t:= - 4; |
973 for i:= 0 to Pred(TeamsCount) do |
980 for i:= 0 to Pred(TeamsCount) do |
974 with thexchar[i] do |
981 with thexchar[i] do |
975 begin |
982 begin |
976 dec(t, team^.HealthTex^.h + 2); |
983 dec(t, team^.HealthTex^.h + 2); |
977 ny:= t; |
984 ny:= t; |
978 dy:= dy - ny |
985 dy:= dy - ny |
979 end; |
986 end; |
980 |
987 |
981 Gear^.Timer:= cSorterWorkTime; |
988 Gear^.Timer:= cSorterWorkTime; |
982 Gear^.doStep:= @doStepTeamHealthSorterWork; |
989 Gear^.doStep:= @doStepTeamHealthSorterWork; |
983 currsorter:= Gear |
990 currsorter:= Gear |
984 end; |
991 end; |
1032 //////////////////////////////////////////////////////////////////////////////// |
1039 //////////////////////////////////////////////////////////////////////////////// |
1033 procedure doStepFlame(Gear: PGear); |
1040 procedure doStepFlame(Gear: PGear); |
1034 begin |
1041 begin |
1035 AllInactive:= false; |
1042 AllInactive:= false; |
1036 if not TestCollisionYwithGear(Gear, 1) then |
1043 if not TestCollisionYwithGear(Gear, 1) then |
1037 begin |
1044 begin |
1038 Gear^.dX:= Gear^.dX + cWindSpeed; |
1045 Gear^.dX:= Gear^.dX + cWindSpeed; |
1039 Gear^.dY:= Gear^.dY + cGravity; |
1046 Gear^.dY:= Gear^.dY + cGravity; |
1040 if hwAbs(Gear^.dX) > _0_1 then Gear^.dX:= Gear^.dX * _0_5; |
1047 if hwAbs(Gear^.dX) > _0_1 then Gear^.dX:= Gear^.dX * _0_5; |
1041 if Gear^.dY > _0_1 then Gear^.dY:= Gear^.dY * _0_995; |
1048 if Gear^.dY > _0_1 then Gear^.dY:= Gear^.dY * _0_995; |
1042 Gear^.X:= Gear^.X + Gear^.dX; |
1049 Gear^.X:= Gear^.X + Gear^.dX; |
1043 Gear^.Y:= Gear^.Y + Gear^.dY; |
1050 Gear^.Y:= Gear^.Y + Gear^.dY; |
1044 if not (Gear^.Y < _1024) then |
1051 if not (Gear^.Y < _1024) then |
1045 begin |
1052 begin |
1046 DeleteGear(Gear); |
1053 DeleteGear(Gear); |
1047 exit |
1054 exit |
1048 end |
1055 end |
1049 end else begin |
1056 end else begin |
1050 if Gear^.Timer > 0 then dec(Gear^.Timer) |
1057 if Gear^.Timer > 0 then dec(Gear^.Timer) |
1051 else begin |
1058 else begin |
1052 // doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 2, 0); |
1059 // doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 2, 0); |
1053 dec(Gear^.Health); |
1060 dec(Gear^.Health); |
1054 Gear^.Timer:= 1250 - Gear^.Angle * 12 |
1061 Gear^.Timer:= 1250 - Gear^.Angle * 12 |
1055 end |
1062 end |
1056 end; |
1063 end; |
1057 |
1064 |
1058 if (((GameTicks div 8) mod 64) = Gear^.Angle) then |
1065 if (((GameTicks div 8) mod 64) = Gear^.Angle) then |
1059 AmmoFlameWork(Gear); |
1066 AmmoFlameWork(Gear); |
1060 |
1067 |
1061 if Gear^.Health = 0 then |
1068 if Gear^.Health = 0 then |
1062 DeleteGear(Gear) |
1069 DeleteGear(Gear) |
1063 end; |
1070 end; |
1064 |
1071 |
1065 //////////////////////////////////////////////////////////////////////////////// |
1072 //////////////////////////////////////////////////////////////////////////////// |
1066 procedure doStepFirePunchWork(Gear: PGear); |
1073 procedure doStepFirePunchWork(Gear: PGear); |
1067 var HHGear: PGear; |
1074 var HHGear: PGear; |
1068 begin |
1075 begin |
1069 AllInactive:= false; |
1076 AllInactive:= false; |
1070 if ((Gear^.Message and gm_Destroy) <> 0) then |
1077 if ((Gear^.Message and gm_Destroy) <> 0) then |
1071 begin |
1078 begin |
1072 DeleteGear(Gear); |
1079 DeleteGear(Gear); |
1073 AfterAttack; |
1080 AfterAttack; |
1074 exit |
1081 exit |
1075 end; |
1082 end; |
1076 |
1083 |
1077 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
1084 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
1078 if hwRound(HHGear^.Y) <= Gear^.Tag - 2 then |
1085 if hwRound(HHGear^.Y) <= Gear^.Tag - 2 then |
1079 begin |
1086 begin |
1080 Gear^.Tag:= hwRound(HHGear^.Y); |
1087 Gear^.Tag:= hwRound(HHGear^.Y); |
1081 DrawTunnel(HHGear^.X - int2hwFloat(cHHRadius), HHGear^.Y - _1, _0_5, _0, cHHRadius * 4, 2); |
1088 DrawTunnel(HHGear^.X - int2hwFloat(cHHRadius), HHGear^.Y - _1, _0_5, _0, cHHRadius * 4, 2); |
1082 HHGear^.State:= HHGear^.State or gstNoDamage; |
1089 HHGear^.State:= HHGear^.State or gstNoDamage; |
1083 Gear^.Y:= HHGear^.Y; |
1090 Gear^.Y:= HHGear^.Y; |
1084 AmmoShove(Gear, 30, 40); |
1091 AmmoShove(Gear, 30, 40); |
1085 HHGear^.State:= HHGear^.State and not gstNoDamage |
1092 HHGear^.State:= HHGear^.State and not gstNoDamage |
1086 end; |
1093 end; |
1087 |
1094 |
1088 HHGear^.dY:= HHGear^.dY + cGravity; |
1095 HHGear^.dY:= HHGear^.dY + cGravity; |
1089 if not (HHGear^.dY.isNegative) then |
1096 if not (HHGear^.dY.isNegative) then |
1090 begin |
1097 begin |
1091 HHGear^.State:= HHGear^.State or gstMoving; |
1098 HHGear^.State:= HHGear^.State or gstMoving; |
1092 DeleteGear(Gear); |
1099 DeleteGear(Gear); |
1093 AfterAttack; |
1100 AfterAttack; |
1094 exit |
1101 exit |
1095 end; |
1102 end; |
1096 HHGear^.Y:= HHGear^.Y + HHGear^.dY |
1103 HHGear^.Y:= HHGear^.Y + HHGear^.dY |
1097 end; |
1104 end; |
1098 |
1105 |
1099 procedure doStepFirePunch(Gear: PGear); |
1106 procedure doStepFirePunch(Gear: PGear); |
1100 var HHGear: PGear; |
1107 var HHGear: PGear; |
1314 Msg, State: Longword; |
1321 Msg, State: Longword; |
1315 begin |
1322 begin |
1316 AllInactive:= false; |
1323 AllInactive:= false; |
1317 |
1324 |
1318 if ((Gear^.Message and not gm_Switch) <> 0) or (TurnTimeLeft = 0) then |
1325 if ((Gear^.Message and not gm_Switch) <> 0) or (TurnTimeLeft = 0) then |
1319 begin |
1326 begin |
1320 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
1327 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
1321 Msg:= Gear^.Message and not gm_Switch; |
1328 Msg:= Gear^.Message and not gm_Switch; |
1322 DeleteGear(Gear); |
1329 DeleteGear(Gear); |
1323 OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^); |
1330 OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^); |
1324 ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); |
1331 ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); |
1325 |
1332 |
1326 HHGear:= CurrentHedgehog^.Gear; |
1333 HHGear:= CurrentHedgehog^.Gear; |
1327 ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); |
1334 ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); |
1328 HHGear^.Message:= Msg; |
1335 HHGear^.Message:= Msg; |
1329 exit |
1336 exit |
1330 end; |
1337 end; |
1331 |
1338 |
1332 if (Gear^.Message and gm_Switch) <> 0 then |
1339 if (Gear^.Message and gm_Switch) <> 0 then |
1333 begin |
1340 begin |
1334 HHGear:= CurrentHedgehog^.Gear; |
1341 HHGear:= CurrentHedgehog^.Gear; |
1335 HHGear^.Message:= HHGear^.Message and not gm_Switch; |
1342 HHGear^.Message:= HHGear^.Message and not gm_Switch; |
1336 Gear^.Message:= Gear^.Message and not gm_Switch; |
1343 Gear^.Message:= Gear^.Message and not gm_Switch; |
1337 State:= HHGear^.State; |
1344 State:= HHGear^.State; |
1338 HHGear^.State:= 0; |
1345 HHGear^.State:= 0; |
1339 HHGear^.Active:= false; |
1346 HHGear^.Active:= false; |
1340 HHGear^.Z:= cHHZ; |
1347 HHGear^.Z:= cHHZ; |
1341 RemoveGearFromList(HHGear); |
1348 RemoveGearFromList(HHGear); |
1342 InsertGearToList(HHGear); |
1349 InsertGearToList(HHGear); |
1343 |
1350 |
1344 repeat |
1351 repeat |
1345 CurrentTeam^.CurrHedgehog:= Succ(CurrentTeam^.CurrHedgehog) mod (CurrentTeam^.HedgehogsNumber); |
1352 CurrentTeam^.CurrHedgehog:= Succ(CurrentTeam^.CurrHedgehog) mod (CurrentTeam^.HedgehogsNumber); |
1346 until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil); |
1353 until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil); |
1347 |
1354 |
1348 CurrentHedgehog:= @CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog]; |
1355 CurrentHedgehog:= @CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog]; |
1349 |
1356 |
1350 HHGear:= CurrentHedgehog^.Gear; |
1357 HHGear:= CurrentHedgehog^.Gear; |
1351 HHGear^.State:= State; |
1358 HHGear^.State:= State; |
1352 HHGear^.Active:= true; |
1359 HHGear^.Active:= true; |
1353 FollowGear:= HHGear; |
1360 FollowGear:= HHGear; |
1354 HHGear^.Z:= cCurrHHZ; |
1361 HHGear^.Z:= cCurrHHZ; |
1355 RemoveGearFromList(HHGear); |
1362 RemoveGearFromList(HHGear); |
1356 InsertGearToList(HHGear); |
1363 InsertGearToList(HHGear); |
1357 Gear^.X:= HHGear^.X; |
1364 Gear^.X:= HHGear^.X; |
1358 Gear^.Y:= HHGear^.Y |
1365 Gear^.Y:= HHGear^.Y |
1359 end; |
1366 end; |
1360 end; |
1367 end; |
1361 |
1368 |
1362 procedure doStepSwitcher(Gear: PGear); |
1369 procedure doStepSwitcher(Gear: PGear); |
1363 var HHGear: PGear; |
1370 var HHGear: PGear; |
1364 begin |
1371 begin |
1365 Gear^.doStep:= @doStepSwitcherWork; |
1372 Gear^.doStep:= @doStepSwitcherWork; |
1366 |
1373 |
1367 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
1374 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
1368 with HHGear^ do |
1375 with HHGear^ do |
1369 begin |
1376 begin |
1370 State:= State and not gstAttacking; |
1377 State:= State and not gstAttacking; |
1371 Message:= Message and not gm_Attack |
1378 Message:= Message and not gm_Attack |
1372 end |
1379 end |
1373 end; |
1380 end; |
1374 |
1381 |
1375 //////////////////////////////////////////////////////////////////////////////// |
1382 //////////////////////////////////////////////////////////////////////////////// |
1376 procedure doStepMortar(Gear: PGear); |
1383 procedure doStepMortar(Gear: PGear); |
1377 var dX, dY: hwFloat; |
1384 var dX, dY: hwFloat; |