33 |
33 |
34 procedure doStepDrowningGear(Gear: PGear); forward; |
34 procedure doStepDrowningGear(Gear: PGear); forward; |
35 |
35 |
36 function CheckGearDrowning(Gear: PGear): boolean; |
36 function CheckGearDrowning(Gear: PGear): boolean; |
37 begin |
37 begin |
38 Result:= Gear.Y + Gear.HalfHeight >= cWaterLine; |
38 Result:= Gear.Y + Gear.Radius >= cWaterLine; |
39 if Result then |
39 if Result then |
40 begin |
40 begin |
41 Gear.State:= gstDrowning; |
41 Gear.State:= gstDrowning; |
42 Gear.doStep:= doStepDrowningGear; |
42 Gear.doStep:= doStepDrowningGear; |
43 PlaySound(sndSplash) |
43 PlaySound(sndSplash) |
71 //////////////////////////////////////////////////////////////////////////////// |
71 //////////////////////////////////////////////////////////////////////////////// |
72 procedure doStepDrowningGear(Gear: PGear); |
72 procedure doStepDrowningGear(Gear: PGear); |
73 begin |
73 begin |
74 AllInactive:= false; |
74 AllInactive:= false; |
75 Gear.Y:= Gear.Y + cDrownSpeed; |
75 Gear.Y:= Gear.Y + cDrownSpeed; |
76 if round(Gear.Y) > Gear.HalfHeight + cWaterLine + 48 + cVisibleWater then DeleteGear(Gear) |
76 if round(Gear.Y) > Gear.Radius + cWaterLine + 48 + cVisibleWater then DeleteGear(Gear) |
77 end; |
77 end; |
78 |
78 |
79 //////////////////////////////////////////////////////////////////////////////// |
79 //////////////////////////////////////////////////////////////////////////////// |
80 procedure doStepFallingGear(Gear: PGear); |
80 procedure doStepFallingGear(Gear: PGear); |
81 var b: boolean; |
81 var b: boolean; |
169 //////////////////////////////////////////////////////////////////////////////// |
169 //////////////////////////////////////////////////////////////////////////////// |
170 procedure doStepGrave(Gear: PGear); |
170 procedure doStepGrave(Gear: PGear); |
171 begin |
171 begin |
172 AllInactive:= false; |
172 AllInactive:= false; |
173 if Gear.dY < 0 then |
173 if Gear.dY < 0 then |
174 if TestCollisionY(Gear, -1) then Gear.dY:= 0; |
174 if TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; |
175 |
175 |
176 if Gear.dY >=0 then |
176 if Gear.dY >=0 then |
177 if TestCollisionY(Gear, 1) then |
177 if TestCollisionYwithGear(Gear, 1) then |
178 begin |
178 begin |
179 Gear.dY:= - Gear.dY * Gear.Elasticity; |
179 Gear.dY:= - Gear.dY * Gear.Elasticity; |
180 if Gear.dY > - 0.001 then |
180 if Gear.dY > - 0.001 then |
181 begin |
181 begin |
182 Gear.Active:= false; |
182 Gear.Active:= false; |
248 Gear.X:= Gear.X + Gear.dX; |
247 Gear.X:= Gear.X + Gear.dX; |
249 Gear.Y:= Gear.Y + Gear.dY; |
248 Gear.Y:= Gear.Y + Gear.dY; |
250 CheckCollision(Gear); |
249 CheckCollision(Gear); |
251 if (Gear.State and gstCollision) <> 0 then |
250 if (Gear.State and gstCollision) <> 0 then |
252 begin |
251 begin |
253 t:= CheckGearsCollision(Gear, Sign(Gear.dX), true); |
252 AmmoShove(Gear, 25); |
254 if t = nil then t:= CheckGearsCollision(Gear, Sign(Gear.dY), false); |
|
255 if t <> nil then |
|
256 AmmoShove(Gear, t, 25); |
|
257 doMakeExplosion(round(Gear.X), round(Gear.Y), 25, EXPLNoDamage or EXPLDoNotTouchHH); |
253 doMakeExplosion(round(Gear.X), round(Gear.Y), 25, EXPLNoDamage or EXPLDoNotTouchHH); |
258 DeleteGear(Gear); |
254 DeleteGear(Gear); |
259 exit |
255 exit |
260 end; |
256 end; |
261 dec(i) |
257 dec(i) |
279 Gear.Y:= Gear.Y + Gear.dY; |
274 Gear.Y:= Gear.Y + Gear.dY; |
280 x:= round(Gear.X); |
275 x:= round(Gear.X); |
281 y:= round(Gear.Y); |
276 y:= round(Gear.Y); |
282 if ((y and $FFFFFC00) = 0) and ((x and $FFFFF800) = 0) |
277 if ((y and $FFFFFC00) = 0) and ((x and $FFFFF800) = 0) |
283 and (Land[y, x] <> 0) then inc(Gear.Damage); |
278 and (Land[y, x] <> 0) then inc(Gear.Damage); |
284 t:= CheckGearsCollision(Gear, Sign(Gear.dX), true); |
279 AmmoShove(Gear, 12); |
285 if t = nil then t:= CheckGearsCollision(Gear, Sign(Gear.dY), false); |
|
286 if t <> nil then |
|
287 begin |
|
288 AmmoShove(Gear, t, 12); |
|
289 inc(Gear.Damage, 10); |
|
290 if t.CollIndex < High(Longword) then DeleteCR(t) |
|
291 end; |
|
292 dec(i) |
280 dec(i) |
293 until (i = 0) or (Gear.Damage > Gear.Health); |
281 until (i = 0) or (Gear.Damage > Gear.Health); |
294 if Gear.Damage > 0 then |
282 if Gear.Damage > 0 then |
295 begin |
283 begin |
296 DrawTunnel(oX, oY, Gear.dX, Gear.dY, 82 - i, 1); |
284 DrawTunnel(oX, oY, Gear.dX, Gear.dY, 82 - i, 1); |
338 exit |
326 exit |
339 end; |
327 end; |
340 HHGear:= PHedgehog(Gear.Hedgehog).Gear; |
328 HHGear:= PHedgehog(Gear.Hedgehog).Gear; |
341 if (Gear.Timer and $3F) = 0 then |
329 if (Gear.Timer and $3F) = 0 then |
342 begin |
330 begin |
343 i:= round(Gear.X) - Gear.HalfWidth - GetRandom(2); |
331 i:= round(Gear.X) - Gear.Radius - GetRandom(2); |
344 ei:= round(Gear.X) + Gear.HalfWidth + GetRandom(2); |
332 ei:= round(Gear.X) + Gear.Radius + GetRandom(2); |
345 while i <= ei do |
333 while i <= ei do |
346 begin |
334 begin |
347 doMakeExplosion(i, round(Gear.Y) + 3, 3, 0); |
335 doMakeExplosion(i, round(Gear.Y) + 3, 3, 0); |
348 inc(i, 1) |
336 inc(i, 1) |
349 end; |
337 end; |
363 if Gear.Y > 1024 then Gear.Timer:= 1 |
351 if Gear.Y > 1024 then Gear.Timer:= 1 |
364 end; |
352 end; |
365 |
353 |
366 Gear.X:= Gear.X + HHGear.dX; |
354 Gear.X:= Gear.X + HHGear.dX; |
367 HHGear.X:= Gear.X; |
355 HHGear.X:= Gear.X; |
368 HHGear.Y:= Gear.Y - cHHHalfHeight; |
356 HHGear.Y:= Gear.Y - cHHRadius; |
369 |
357 |
370 if (Gear.Message and gm_Attack) <> 0 then |
358 if (Gear.Message and gm_Attack) <> 0 then |
371 if (Gear.State and gsttmpFlag) <> 0 then Gear.Timer:= 1 else else |
359 if (Gear.State and gsttmpFlag) <> 0 then Gear.Timer:= 1 else else |
372 if (Gear.State and gsttmpFlag) = 0 then Gear.State:= Gear.State or gsttmpFlag; |
360 if (Gear.State and gsttmpFlag) = 0 then Gear.State:= Gear.State or gsttmpFlag; |
373 if ((Gear.Message and gm_Left) <> 0) then Gear.dX:= -0.3 else |
361 if ((Gear.Message and gm_Left) <> 0) then Gear.dX:= -0.3 else |
378 procedure doStepPickHammer(Gear: PGear); |
366 procedure doStepPickHammer(Gear: PGear); |
379 var i, y: integer; |
367 var i, y: integer; |
380 ar: TRangeArray; |
368 ar: TRangeArray; |
381 begin |
369 begin |
382 i:= 0; |
370 i:= 0; |
383 y:= round(Gear.Y) - cHHHalfHeight*2; |
371 y:= round(Gear.Y) - cHHRadius*2; |
384 while y < round(Gear.Y) do |
372 while y < round(Gear.Y) do |
385 begin |
373 begin |
386 ar[i].Left := round(Gear.X) - Gear.HalfWidth - GetRandom(2); |
374 ar[i].Left := round(Gear.X) - Gear.Radius - GetRandom(2); |
387 ar[i].Right:= round(Gear.X) + Gear.HalfWidth + GetRandom(2); |
375 ar[i].Right:= round(Gear.X) + Gear.Radius + GetRandom(2); |
388 inc(y, 2); |
376 inc(y, 2); |
389 inc(i) |
377 inc(i) |
390 end; |
378 end; |
391 DrawHLinesExplosions(@ar, 3, round(Gear.Y) - cHHHalfHeight*2, 2, Pred(i)); |
379 DrawHLinesExplosions(@ar, 3, round(Gear.Y) - cHHRadius*2, 2, Pred(i)); |
392 Gear.dY:= PHedgehog(Gear.Hedgehog).Gear.dY; |
380 Gear.dY:= PHedgehog(Gear.Hedgehog).Gear.dY; |
393 doStepPickHammerWork(Gear); |
381 doStepPickHammerWork(Gear); |
394 Gear.doStep:= doStepPickHammerWork |
382 Gear.doStep:= doStepPickHammerWork |
395 end; |
383 end; |
396 |
384 |
607 //////////////////////////////////////////////////////////////////////////////// |
595 //////////////////////////////////////////////////////////////////////////////// |
608 procedure doStepMine(Gear: PGear); |
596 procedure doStepMine(Gear: PGear); |
609 begin |
597 begin |
610 if (Gear.dX <> 0) or (Gear.dY <> 0) then |
598 if (Gear.dX <> 0) or (Gear.dY <> 0) then |
611 begin |
599 begin |
612 if Gear.CollIndex < High(Longword) then DeleteCR(Gear); |
600 if Gear.CollIndex < High(Longword) then DeleteCI(Gear); |
613 doStepFallingGear(Gear); |
601 doStepFallingGear(Gear); |
614 if Gear.Active = false then |
602 if Gear.Active = false then |
615 begin |
603 begin |
616 if Gear.CollIndex = High(Longword) then AddGearCR(Gear); |
604 if Gear.CollIndex = High(Longword) then AddGearCI(Gear); |
617 Gear.dX:= 0; |
605 Gear.dX:= 0; |
618 Gear.dY:= 0 |
606 Gear.dY:= 0 |
619 end; |
607 end; |
620 CalcRotationDirAngle(Gear); |
608 CalcRotationDirAngle(Gear); |
621 AllInactive:= false |
609 AllInactive:= false |
661 begin |
649 begin |
662 DeleteGear(Gear); |
650 DeleteGear(Gear); |
663 exit |
651 exit |
664 end; |
652 end; |
665 |
653 |
666 if (Gear.dY <> 0) or (not TestCollisionY(Gear, 1)) then |
654 if (Gear.dY <> 0) or (not TestCollisionYwithGear(Gear, 1)) then |
667 begin |
655 begin |
668 AllInactive:= false; |
656 AllInactive:= false; |
669 Gear.dY:= Gear.dY + cGravity; |
657 Gear.dY:= Gear.dY + cGravity; |
670 Gear.Y:= Gear.Y + Gear.dY; |
658 Gear.Y:= Gear.Y + Gear.dY; |
671 if (Gear.dY < 0) and TestCollisionY(Gear, -1) then Gear.dY:= 0 else |
659 if (Gear.dY < 0) and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0 else |
672 if (Gear.dY >= 0) and TestCollisionY(Gear, 1) then |
660 if (Gear.dY >= 0) and TestCollisionYwithGear(Gear, 1) then |
673 begin |
661 begin |
674 Gear.dY:= - Gear.dY * Gear.Elasticity; |
662 Gear.dY:= - Gear.dY * Gear.Elasticity; |
675 if Gear.dY > - 0.001 then Gear.dY:= 0 |
663 if Gear.dY > - 0.001 then Gear.dY:= 0 |
676 else if Gear.dY < - 0.03 then PlaySound(sndGraveImpact); |
664 else if Gear.dY < - 0.03 then PlaySound(sndGraveImpact); |
677 end; |
665 end; |
678 CheckGearDrowning(Gear); |
666 CheckGearDrowning(Gear); |
679 end; |
667 end; |
680 |
668 |
681 if (Gear.CollIndex = High(Longword)) and (Gear.dY = 0) then AddGearCR(Gear) |
669 if (Gear.CollIndex = High(Longword)) and (Gear.dY = 0) then AddGearCI(Gear) |
682 else if (Gear.CollIndex < High(Longword)) and (Gear.dY <> 0) then DeleteCR(Gear); |
670 else if (Gear.CollIndex < High(Longword)) and (Gear.dY <> 0) then DeleteCI(Gear); |
683 |
671 |
684 if Gear.Damage > 0 then |
672 if Gear.Damage > 0 then |
685 begin |
673 begin |
686 DeleteGear(Gear); |
674 DeleteGear(Gear); |
687 doMakeExplosion(round(Gear.X), round(Gear.Y), 20, EXPLAutoSound) |
675 doMakeExplosion(round(Gear.X), round(Gear.Y), 20, EXPLAutoSound) |