61 if (Ammo[CurSlot, CurAmmo].Propz and ammoprop_Power) <> 0 then |
61 if (Ammo[CurSlot, CurAmmo].Propz and ammoprop_Power) <> 0 then |
62 begin |
62 begin |
63 StopTPUSound; |
63 StopTPUSound; |
64 PlaySound(sndThrowRelease); |
64 PlaySound(sndThrowRelease); |
65 end; |
65 end; |
66 xx:= Sign(dX)*Sin(Angle*pi/cMaxAngle); |
66 xx:= hwSign(dX)*Sin(Angle*pi/cMaxAngle); |
67 yy:= -Cos(Angle*pi/cMaxAngle); |
67 yy:= -Cos(Angle*pi/cMaxAngle); |
68 case Ammo[CurSlot, CurAmmo].AmmoType of |
68 case Ammo[CurSlot, CurAmmo].AmmoType of |
69 amGrenade: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Bomb, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo[CurSlot, CurAmmo].Timer); |
69 amGrenade: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Bomb, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo[CurSlot, CurAmmo].Timer); |
70 amClusterBomb: FollowGear:= AddGear(round(X), round(Y), gtClusterBomb, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo[CurSlot, CurAmmo].Timer); |
70 amClusterBomb: FollowGear:= AddGear(round(X), round(Y), gtClusterBomb, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo[CurSlot, CurAmmo].Timer); |
71 amBazooka: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Grenade, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor); |
71 amBazooka: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Grenade, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor); |
75 CurAmmoGear:= AddGear(round(X), round(Y), gtShotgunShot, 0, xx * 0.5, yy * 0.5); |
75 CurAmmoGear:= AddGear(round(X), round(Y), gtShotgunShot, 0, xx * 0.5, yy * 0.5); |
76 end; |
76 end; |
77 amPickHammer: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y) + cHHRadius, gtPickHammer, 0); |
77 amPickHammer: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y) + cHHRadius, gtPickHammer, 0); |
78 amSkip: TurnTimeLeft:= 0; |
78 amSkip: TurnTimeLeft:= 0; |
79 amRope: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y), gtRope, 0, xx, yy); |
79 amRope: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y), gtRope, 0, xx, yy); |
80 amMine: AddGear(round(X) + Sign(dX) * 7, round(Y), gtMine, 0, Sign(dX) * 0.02, 0, 3000); |
80 amMine: AddGear(round(X) + hwSign(dX) * 7, round(Y), gtMine, 0, hwSign(dX) * 0.02, 0, 3000); |
81 amDEagle: AddGear(round(X), round(Y), gtDEagleShot, 0, xx * 0.5, yy * 0.5); |
81 amDEagle: AddGear(round(X), round(Y), gtDEagleShot, 0, xx * 0.5, yy * 0.5); |
82 amDynamite: AddGear(round(X) + Sign(dX) * 7, round(Y), gtDynamite, 0, Sign(dX) * 0.035, 0, 5000); |
82 amDynamite: AddGear(round(X) + hwSign(dX) * 7, round(Y), gtDynamite, 0, hwSign(dX) * 0.035, 0, 5000); |
83 amBaseballBat: AddGear(round(X) + Sign(dX) * 10, round(Y), gtShover, 0, xx * 0.5, yy * 0.5).Radius:= 20; |
83 amBaseballBat: AddGear(round(X) + hwSign(dX) * 10, round(Y), gtShover, 0, xx * 0.5, yy * 0.5).Radius:= 20; |
84 amFirePunch: CurAmmoGear:= AddGear(round(X) + Sign(dX) * 10, round(Y), gtFirePunch, 0); |
84 amFirePunch: CurAmmoGear:= AddGear(round(X) + hwSign(dX) * 10, round(Y), gtFirePunch, 0); |
85 end; |
85 end; |
86 Power:= 0; |
86 Power:= 0; |
87 if CurAmmoGear <> nil then |
87 if CurAmmoGear <> nil then |
88 begin |
88 begin |
89 Message:= Message or gm_Attack; |
89 Message:= Message or gm_Attack; |
174 // collision - > (abs(Gear.dX) < 0.0000002) -> backspace -> even more high jump |
174 // collision - > (abs(Gear.dX) < 0.0000002) -> backspace -> even more high jump |
175 if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then |
175 if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then |
176 if (abs(Gear.dX) < 0.0000002) and (Gear.dY < -0.02) then |
176 if (abs(Gear.dX) < 0.0000002) and (Gear.dY < -0.02) then |
177 begin |
177 begin |
178 Gear.dY:= -0.25; |
178 Gear.dY:= -0.25; |
179 Gear.dX:= Sign(Gear.dX) * 0.02 |
179 Gear.dX:= hwSign(Gear.dX) * 0.02 |
180 end; |
180 end; |
181 Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump); |
181 Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump); |
182 if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then Gear.dX:= 0.0000001 * Sign(Gear.dX); |
182 if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then Gear.dX:= 0.0000001 * hwSign(Gear.dX); |
183 Gear.X:= Gear.X + Gear.dX; |
183 Gear.X:= Gear.X + Gear.dX; |
184 Gear.dY:= Gear.dY + cGravity; |
184 Gear.dY:= Gear.dY + cGravity; |
185 if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; |
185 if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; |
186 Gear.Y:= Gear.Y + Gear.dY; |
186 Gear.Y:= Gear.Y + Gear.dY; |
187 if (Gear.dY >= 0)and TestCollisionYwithGear(Gear, 1) then |
187 if (Gear.dY >= 0)and TestCollisionYwithGear(Gear, 1) then |
188 begin |
188 begin |
189 CheckHHDamage(Gear); |
189 CheckHHDamage(Gear); |
190 if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55) |
190 if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55) |
191 and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * Sign(Gear.dX); |
191 and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * hwSign(Gear.dX); |
192 Gear.State:= Gear.State and not (gstFalling or gstHHJumping); |
192 Gear.State:= Gear.State and not (gstFalling or gstHHJumping); |
193 StepTicks:= 300; |
193 StepTicks:= 300; |
194 Gear.dY:= 0 |
194 Gear.dY:= 0 |
195 end; |
195 end; |
196 CheckGearDrowning(Gear); |
196 CheckGearDrowning(Gear); |
208 begin |
208 begin |
209 if ((Gear.Message and gm_LJump ) <> 0) then |
209 if ((Gear.Message and gm_LJump ) <> 0) then |
210 begin |
210 begin |
211 Gear.Message:= 0; |
211 Gear.Message:= 0; |
212 if not TestCollisionYwithGear(Gear, -1) then |
212 if not TestCollisionYwithGear(Gear, -1) then |
213 if not TestCollisionXwithXYShift(Gear, 0, -2, Sign(Gear.dX)) then Gear.Y:= Gear.Y - 2 else |
213 if not TestCollisionXwithXYShift(Gear, 0, -2, hwSign(Gear.dX)) then Gear.Y:= Gear.Y - 2 else |
214 if not TestCollisionXwithXYShift(Gear, 0, -1, Sign(Gear.dX)) then Gear.Y:= Gear.Y - 1; |
214 if not TestCollisionXwithXYShift(Gear, 0, -1, hwSign(Gear.dX)) then Gear.Y:= Gear.Y - 1; |
215 if not (TestCollisionXwithGear(Gear, Sign(Gear.dX)) |
215 if not (TestCollisionXwithGear(Gear, hwSign(Gear.dX)) |
216 or TestCollisionYwithGear(Gear, -1)) then |
216 or TestCollisionYwithGear(Gear, -1)) then |
217 begin |
217 begin |
218 Gear.dY:= -0.15; |
218 Gear.dY:= -0.15; |
219 Gear.dX:= Sign(Gear.dX) * 0.15; |
219 Gear.dX:= hwSign(Gear.dX) * 0.15; |
220 Gear.State:= Gear.State or gstFalling or gstHHJumping; |
220 Gear.State:= Gear.State or gstFalling or gstHHJumping; |
221 exit |
221 exit |
222 end; |
222 end; |
223 end; |
223 end; |
224 if ((Gear.Message and gm_HJump ) <> 0) then |
224 if ((Gear.Message and gm_HJump ) <> 0) then |
225 begin |
225 begin |
226 Gear.Message:= 0; |
226 Gear.Message:= 0; |
227 if not TestCollisionYwithGear(Gear, -1) then |
227 if not TestCollisionYwithGear(Gear, -1) then |
228 begin |
228 begin |
229 Gear.dY:= -0.20; |
229 Gear.dY:= -0.20; |
230 Gear.dX:= 0.0000001 * Sign(Gear.dX); |
230 Gear.dX:= 0.0000001 * hwSign(Gear.dX); |
231 Gear.X:= Gear.X - Sign(Gear.dX)*0.00008; // shift compensation |
231 Gear.X:= Gear.X - hwSign(Gear.dX)*0.00008; // shift compensation |
232 Gear.State:= Gear.State or gstFalling or gstHHJumping; |
232 Gear.State:= Gear.State or gstFalling or gstHHJumping; |
233 exit |
233 exit |
234 end; |
234 end; |
235 end; |
235 end; |
236 PrevdX:= Sign(Gear.dX); |
236 PrevdX:= hwSign(Gear.dX); |
237 if (Gear.Message and gm_Left )<>0 then Gear.dX:= -1.0 else |
237 if (Gear.Message and gm_Left )<>0 then Gear.dX:= -1.0 else |
238 if (Gear.Message and gm_Right )<>0 then Gear.dX:= 1.0 else exit; |
238 if (Gear.Message and gm_Right )<>0 then Gear.dX:= 1.0 else exit; |
239 StepTicks:= cHHStepTicks; |
239 StepTicks:= cHHStepTicks; |
240 if PrevdX <> Sign(Gear.dX) then exit; |
240 if PrevdX <> hwSign(Gear.dX) then exit; |
241 PHedgehog(Gear.Hedgehog).visStepPos:= (PHedgehog(Gear.Hedgehog).visStepPos + 1) and 7; |
241 PHedgehog(Gear.Hedgehog).visStepPos:= (PHedgehog(Gear.Hedgehog).visStepPos + 1) and 7; |
242 if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then |
242 if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then |
243 begin |
243 begin |
244 if not (TestCollisionXwithXYShift(Gear, 0, -6, Sign(Gear.dX)) |
244 if not (TestCollisionXwithXYShift(Gear, 0, -6, hwSign(Gear.dX)) |
245 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
245 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
246 if not (TestCollisionXwithXYShift(Gear, 0, -5, Sign(Gear.dX)) |
246 if not (TestCollisionXwithXYShift(Gear, 0, -5, hwSign(Gear.dX)) |
247 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
247 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
248 if not (TestCollisionXwithXYShift(Gear, 0, -4, Sign(Gear.dX)) |
248 if not (TestCollisionXwithXYShift(Gear, 0, -4, hwSign(Gear.dX)) |
249 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
249 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
250 if not (TestCollisionXwithXYShift(Gear, 0, -3, Sign(Gear.dX)) |
250 if not (TestCollisionXwithXYShift(Gear, 0, -3, hwSign(Gear.dX)) |
251 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
251 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
252 if not (TestCollisionXwithXYShift(Gear, 0, -2, Sign(Gear.dX)) |
252 if not (TestCollisionXwithXYShift(Gear, 0, -2, hwSign(Gear.dX)) |
253 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
253 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
254 if not (TestCollisionXwithXYShift(Gear, 0, -1, Sign(Gear.dX)) |
254 if not (TestCollisionXwithXYShift(Gear, 0, -1, hwSign(Gear.dX)) |
255 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
255 or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; |
256 end; |
256 end; |
257 if not TestCollisionXwithGear(Gear, Sign(Gear.dX)) then Gear.X:= Gear.X + Gear.dX; |
257 if not TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then Gear.X:= Gear.X + Gear.dX; |
258 Gear.dX:= 0.0000001 * Sign(Gear.dX); |
258 Gear.dX:= 0.0000001 * hwSign(Gear.dX); |
259 SetAllHHToActive; |
259 SetAllHHToActive; |
260 |
260 |
261 if not TestCollisionYwithGear(Gear, 1) then |
261 if not TestCollisionYwithGear(Gear, 1) then |
262 begin |
262 begin |
263 Gear.Y:= Gear.Y + 1; |
263 Gear.Y:= Gear.Y + 1; |
302 Gear.State:= Gear.State or gstFalling or gstMoving; |
302 Gear.State:= Gear.State or gstFalling or gstMoving; |
303 Gear.dY:= Gear.dY + cGravity |
303 Gear.dY:= Gear.dY + cGravity |
304 end else begin |
304 end else begin |
305 CheckHHDamage(Gear); |
305 CheckHHDamage(Gear); |
306 if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55) |
306 if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55) |
307 and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * Sign(Gear.dX); |
307 and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * hwSign(Gear.dX); |
308 Gear.State:= Gear.State and not (gstFalling or gstHHJumping); |
308 Gear.State:= Gear.State and not (gstFalling or gstHHJumping); |
309 if Gear.dY > 0 then Gear.dY:= 0; |
309 if Gear.dY > 0 then Gear.dY:= 0; |
310 if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction |
310 if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction |
311 end; |
311 end; |
312 |
312 |
313 if (Gear.State <> 0) then DeleteCI(Gear); |
313 if (Gear.State <> 0) then DeleteCI(Gear); |
314 |
314 |
315 if (Gear.State and gstMoving) <> 0 then |
315 if (Gear.State and gstMoving) <> 0 then |
316 if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then |
316 if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then |
317 if ((Gear.State and gstFalling) = 0) then |
317 if ((Gear.State and gstFalling) = 0) then |
318 if abs(Gear.dX) > 0.01 then |
318 if abs(Gear.dX) > 0.01 then |
319 if not TestCollisionXwithXYShift(Gear, Sign(Gear.dX) - Gear.dX, -1, Sign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.96; Gear.Y:= Gear.Y - 1 end else |
319 if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -1, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.96; Gear.Y:= Gear.Y - 1 end else |
320 if not TestCollisionXwithXYShift(Gear, Sign(Gear.dX) - Gear.dX, -2, Sign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.93; Gear.Y:= Gear.Y - 2 end else |
320 if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -2, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.93; Gear.Y:= Gear.Y - 2 end else |
321 if not TestCollisionXwithXYShift(Gear, Sign(Gear.dX) - Gear.dX, -3, Sign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.90; Gear.Y:= Gear.Y - 3 end else |
321 if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -3, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.90; Gear.Y:= Gear.Y - 3 end else |
322 if not TestCollisionXwithXYShift(Gear, Sign(Gear.dX) - Gear.dX, -4, Sign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.87; Gear.Y:= Gear.Y - 4 end else |
322 if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -4, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.87; Gear.Y:= Gear.Y - 4 end else |
323 if not TestCollisionXwithXYShift(Gear, Sign(Gear.dX) - Gear.dX, -5, Sign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.84; Gear.Y:= Gear.Y - 5 end else |
323 if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -5, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.84; Gear.Y:= Gear.Y - 5 end else |
324 if abs(Gear.dX) > 0.02 then Gear.dX:= -0.5 * Gear.dX |
324 if abs(Gear.dX) > 0.02 then Gear.dX:= -0.5 * Gear.dX |
325 else begin |
325 else begin |
326 Gear.State:= Gear.State and not gstMoving; |
326 Gear.State:= Gear.State and not gstMoving; |
327 Gear.dX:= 0.0000001 * Sign(Gear.dX) |
327 Gear.dX:= 0.0000001 * hwSign(Gear.dX) |
328 end |
328 end |
329 else begin |
329 else begin |
330 Gear.State:= Gear.State and not gstMoving; |
330 Gear.State:= Gear.State and not gstMoving; |
331 Gear.dX:= 0.0000001 * Sign(Gear.dX) |
331 Gear.dX:= 0.0000001 * hwSign(Gear.dX) |
332 end |
332 end |
333 else Gear.dX:= -Gear.dX; |
333 else Gear.dX:= -Gear.dX; |
334 |
334 |
335 if ((Gear.State and gstFalling) = 0)and |
335 if ((Gear.State and gstFalling) = 0)and |
336 (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then |
336 (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then |
337 begin |
337 begin |
338 Gear.State:= Gear.State and not gstMoving; |
338 Gear.State:= Gear.State and not gstMoving; |
339 Gear.dX:= 0.0000001 * Sign(Gear.dX); |
339 Gear.dX:= 0.0000001 * hwSign(Gear.dX); |
340 Gear.dY:= 0 |
340 Gear.dY:= 0 |
341 end else Gear.State:= Gear.State or gstMoving; |
341 end else Gear.State:= Gear.State or gstMoving; |
342 |
342 |
343 if (Gear.State and gstMoving) <> 0 then |
343 if (Gear.State and gstMoving) <> 0 then |
344 begin |
344 begin |