equal
deleted
inserted
replaced
28 amtest_NoTrackFall = $00000008; // skip fall tracing. |
28 amtest_NoTrackFall = $00000008; // skip fall tracing. |
29 amtest_LaserSight = $00000010; // supports laser sighting |
29 amtest_LaserSight = $00000010; // supports laser sighting |
30 amtest_NoVampiric = $00000020; // don't use vampirism with this ammo |
30 amtest_NoVampiric = $00000020; // don't use vampirism with this ammo |
31 amtest_NoInvulnerable = $00000040; // don't use invulnerable with this with ammo |
31 amtest_NoInvulnerable = $00000040; // don't use invulnerable with this with ammo |
32 |
32 |
33 var windSpeed: real; |
33 var aiWindSpeed: real; |
34 aiLaserSighting: boolean; |
34 aiLaserSighting: boolean; |
35 |
35 |
36 type TAttackParams = record |
36 type TAttackParams = record |
37 Time, Bounce, AttacksNum: Longword; |
37 Time, Bounce, AttacksNum: Longword; |
38 Angle, Power: LongInt; |
38 Angle, Power: LongInt; |
175 else targXWrap:= Targ.Point.X - (RightX-LeftX); |
175 else targXWrap:= Targ.Point.X - (RightX-LeftX); |
176 valueResult:= BadTurn; |
176 valueResult:= BadTurn; |
177 repeat |
177 repeat |
178 rTime:= rTime + 300 + Level * 50 + random(300); |
178 rTime:= rTime + 300 + Level * 50 + random(300); |
179 if (WorldEdge = weWrap) and (random(2)=0) then |
179 if (WorldEdge = weWrap) and (random(2)=0) then |
180 Vx:= - windSpeed * rTime * 0.5 + (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - mX) / rTime |
180 Vx:= - aiWindSpeed * rTime * 0.5 + (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - mX) / rTime |
181 else Vx:= - windSpeed * rTime * 0.5 + (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - mX) / rTime; |
181 else Vx:= - aiWindSpeed * rTime * 0.5 + (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - mX) / rTime; |
182 Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - mY) / rTime; |
182 Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - mY) / rTime; |
183 r:= sqr(Vx) + sqr(Vy); |
183 r:= sqr(Vx) + sqr(Vy); |
184 if not (r > 1) then |
184 if not (r > 1) then |
185 begin |
185 begin |
186 x:= mX; |
186 x:= mX; |
191 repeat |
191 repeat |
192 x:= CheckWrap(x); |
192 x:= CheckWrap(x); |
193 x:= x + dX; |
193 x:= x + dX; |
194 |
194 |
195 y:= y + dY; |
195 y:= y + dY; |
196 dX:= dX + windSpeed; |
196 dX:= dX + aiWindSpeed; |
197 //dX:= CheckBounce(x,dX); |
197 //dX:= CheckBounce(x,dX); |
198 dY:= dY + cGravityf; |
198 dY:= dY + cGravityf; |
199 dec(t) |
199 dec(t) |
200 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
200 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
201 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t < -cExtraTime); |
201 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t < -cExtraTime); |
365 else targXWrap:= Targ.Point.X - (RightX-LeftX); |
365 else targXWrap:= Targ.Point.X - (RightX-LeftX); |
366 timer:= 0; |
366 timer:= 0; |
367 repeat |
367 repeat |
368 rTime:= rTime + 300 + Level * 50 + random(300); |
368 rTime:= rTime + 300 + Level * 50 + random(300); |
369 if (WorldEdge = weWrap) and (random(2)=0) then |
369 if (WorldEdge = weWrap) and (random(2)=0) then |
370 Vx:= - windSpeed * rTime * 0.5 + (targXWrap + AIrndSign(2) - mX) / rTime |
370 Vx:= - aiWindSpeed * rTime * 0.5 + (targXWrap + AIrndSign(2) - mX) / rTime |
371 else Vx:= - windSpeed * rTime * 0.5 + (Targ.Point.X + AIrndSign(2) - mX) / rTime; |
371 else Vx:= - aiWindSpeed * rTime * 0.5 + (Targ.Point.X + AIrndSign(2) - mX) / rTime; |
372 Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y - 35 - mY) / rTime; |
372 Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y - 35 - mY) / rTime; |
373 r:= sqr(Vx) + sqr(Vy); |
373 r:= sqr(Vx) + sqr(Vy); |
374 if not (r > 1) then |
374 if not (r > 1) then |
375 begin |
375 begin |
376 x:= mX; |
376 x:= mX; |
380 t:= rTime; |
380 t:= rTime; |
381 repeat |
381 repeat |
382 x:= CheckWrap(x); |
382 x:= CheckWrap(x); |
383 x:= x + dX; |
383 x:= x + dX; |
384 y:= y + dY; |
384 y:= y + dY; |
385 dX:= dX + windSpeed; |
385 dX:= dX + aiWindSpeed; |
386 dY:= dY + cGravityf; |
386 dY:= dY + cGravityf; |
387 dec(t) |
387 dec(t) |
388 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
388 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
389 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (y > cWaterLine); |
389 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (y > cWaterLine); |
390 |
390 |
487 exit(BadTurn); |
487 exit(BadTurn); |
488 |
488 |
489 // If impact location is close, above us and wind blows in our direction, |
489 // If impact location is close, above us and wind blows in our direction, |
490 // there's a risk of fire flying towards us, so fail in this case. |
490 // there's a risk of fire flying towards us, so fail in this case. |
491 if (Level < 3) and (range <= 600) and (meY >= ry) and |
491 if (Level < 3) and (range <= 600) and (meY >= ry) and |
492 (((ap.Angle < 0) and (windSpeed > 0)) or ((ap.Angle > 0) and (windSpeed < 0))) then |
492 (((ap.Angle < 0) and (aiWindSpeed > 0)) or ((ap.Angle > 0) and (aiWindSpeed < 0))) then |
493 exit(BadTurn); |
493 exit(BadTurn); |
494 |
494 |
495 // Apply inaccuracy |
495 // Apply inaccuracy |
496 if (not aiLaserSighting) then |
496 if (not aiLaserSighting) then |
497 inc(ap.Angle, AIrndSign(random((Level - 1) * 9))); |
497 inc(ap.Angle, AIrndSign(random((Level - 1) * 9))); |
531 targXWrap:= Targ.Point.X + (RightX-LeftX) |
531 targXWrap:= Targ.Point.X + (RightX-LeftX) |
532 else targXWrap:= Targ.Point.X - (RightX-LeftX); |
532 else targXWrap:= Targ.Point.X - (RightX-LeftX); |
533 repeat |
533 repeat |
534 rTime:= rTime + 300 + Level * 50 + random(1000); |
534 rTime:= rTime + 300 + Level * 50 + random(1000); |
535 if (WorldEdge = weWrap) and (random(2)=0) then |
535 if (WorldEdge = weWrap) and (random(2)=0) then |
536 Vx:= - windSpeed * rTime * 0.5 + ((targXWrap + AIrndSign(2)) - meX) / rTime |
536 Vx:= - aiWindSpeed * rTime * 0.5 + ((targXWrap + AIrndSign(2)) - meX) / rTime |
537 else Vx:= - windSpeed * rTime * 0.5 + ((Targ.Point.X + AIrndSign(2)) - meX) / rTime; |
537 else Vx:= - aiWindSpeed * rTime * 0.5 + ((Targ.Point.X + AIrndSign(2)) - meX) / rTime; |
538 Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y - meY) / rTime; |
538 Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y - meY) / rTime; |
539 r:= sqr(Vx) + sqr(Vy); |
539 r:= sqr(Vx) + sqr(Vy); |
540 if not (r > 1) then |
540 if not (r > 1) then |
541 begin |
541 begin |
542 x:= meX; |
542 x:= meX; |
546 t:= rTime; |
546 t:= rTime; |
547 repeat |
547 repeat |
548 x:= CheckWrap(x); |
548 x:= CheckWrap(x); |
549 x:= x + dX; |
549 x:= x + dX; |
550 y:= y + dY; |
550 y:= y + dY; |
551 dX:= dX + windSpeed; |
551 dX:= dX + aiWindSpeed; |
552 dY:= dY + cGravityf; |
552 dY:= dY + cGravityf; |
553 dec(t) |
553 dec(t) |
554 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
554 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
555 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t <= 0); |
555 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t <= 0); |
556 EX:= trunc(x); |
556 EX:= trunc(x); |
602 if (WorldEdge = weWrap) and (random(2)=0) then |
602 if (WorldEdge = weWrap) and (random(2)=0) then |
603 Vx:= (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime |
603 Vx:= (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime |
604 else |
604 else |
605 Vx:= (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime; |
605 Vx:= (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime; |
606 if (GameFlags and gfMoreWind) <> 0 then |
606 if (GameFlags and gfMoreWind) <> 0 then |
607 Vx:= -(windSpeed / Density) * rTime * 0.5 + Vx; |
607 Vx:= -(aiWindSpeed / Density) * rTime * 0.5 + Vx; |
608 Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime; |
608 Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime; |
609 r:= sqr(Vx) + sqr(Vy); |
609 r:= sqr(Vx) + sqr(Vy); |
610 |
610 |
611 if not (r > 1) then |
611 if not (r > 1) then |
612 begin |
612 begin |
617 t:= rTime; |
617 t:= rTime; |
618 repeat |
618 repeat |
619 x:= CheckWrap(x); |
619 x:= CheckWrap(x); |
620 x:= x + dX; |
620 x:= x + dX; |
621 if (GameFlags and gfMoreWind) <> 0 then |
621 if (GameFlags and gfMoreWind) <> 0 then |
622 dX:= dX + windSpeed / Density; |
622 dX:= dX + aiWindSpeed / Density; |
623 |
623 |
624 y:= y + dY; |
624 y:= y + dY; |
625 dY:= dY + cGravityf; |
625 dY:= dY + cGravityf; |
626 dec(t) |
626 dec(t) |
627 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
627 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
636 exit(BadTurn); |
636 exit(BadTurn); |
637 |
637 |
638 // Sanity check 2: If impact location is close, above us and wind blows |
638 // Sanity check 2: If impact location is close, above us and wind blows |
639 // towards us, there's a risk of fire flying towards us, so fail in this case. |
639 // towards us, there's a risk of fire flying towards us, so fail in this case. |
640 if (Level < 3) and (range <= 600) and (trunc(meY) >= EX) and |
640 if (Level < 3) and (range <= 600) and (trunc(meY) >= EX) and |
641 (((ap.Angle < 0) and (windSpeed > 0)) or ((ap.Angle > 0) and (windSpeed < 0))) then |
641 (((ap.Angle < 0) and (aiWindSpeed > 0)) or ((ap.Angle > 0) and (aiWindSpeed < 0))) then |
642 exit(BadTurn); |
642 exit(BadTurn); |
643 |
643 |
644 if t >= -timeLimit then |
644 if t >= -timeLimit then |
645 value:= RateExplosion(Me, EX, EY, 97) // average of 17 attempts, most good, but some failing spectacularly |
645 value:= RateExplosion(Me, EX, EY, 97) // average of 17 attempts, most good, but some failing spectacularly |
646 else |
646 else |
687 if (WorldEdge = weWrap) and (random(2)=0) then |
687 if (WorldEdge = weWrap) and (random(2)=0) then |
688 Vx:= (targXWrap + AIrndOffset(Targ, Level) - meX) / (TestTime + tDelta) |
688 Vx:= (targXWrap + AIrndOffset(Targ, Level) - meX) / (TestTime + tDelta) |
689 else |
689 else |
690 Vx:= (Targ.Point.X + AIrndOffset(Targ, Level) - meX) / (TestTime + tDelta); |
690 Vx:= (Targ.Point.X + AIrndOffset(Targ, Level) - meX) / (TestTime + tDelta); |
691 if (GameFlags and gfMoreWind) <> 0 then |
691 if (GameFlags and gfMoreWind) <> 0 then |
692 Vx:= -(windSpeed / Density) * (TestTime + tDelta) * 0.5 + Vx; |
692 Vx:= -(aiWindSpeed / Density) * (TestTime + tDelta) * 0.5 + Vx; |
693 Vy:= cGravityf * ((TestTime + tDelta) div 2) - (Targ.Point.Y - meY) / (TestTime + tDelta); |
693 Vy:= cGravityf * ((TestTime + tDelta) div 2) - (Targ.Point.Y - meY) / (TestTime + tDelta); |
694 r:= sqr(Vx) + sqr(Vy); |
694 r:= sqr(Vx) + sqr(Vy); |
695 if not (r > 1) then |
695 if not (r > 1) then |
696 begin |
696 begin |
697 x:= meX; |
697 x:= meX; |
701 t:= TestTime; |
701 t:= TestTime; |
702 repeat |
702 repeat |
703 x:= CheckWrap(x); |
703 x:= CheckWrap(x); |
704 x:= x + dX; |
704 x:= x + dX; |
705 if (GameFlags and gfMoreWind) <> 0 then |
705 if (GameFlags and gfMoreWind) <> 0 then |
706 dX:= dX + windSpeed / Density; |
706 dX:= dX + aiWindSpeed / Density; |
707 y:= y + dY; |
707 y:= y + dY; |
708 dY:= dY + cGravityf; |
708 dY:= dY + cGravityf; |
709 dec(t) |
709 dec(t) |
710 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
710 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
711 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t = 0); |
711 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t = 0); |
751 meX:= hwFloat2Float(Me^.X); |
751 meX:= hwFloat2Float(Me^.X); |
752 meY:= hwFloat2Float(Me^.Y); |
752 meY:= hwFloat2Float(Me^.Y); |
753 repeat |
753 repeat |
754 inc(TestTime, 900); |
754 inc(TestTime, 900); |
755 if (GameFlags and gfMoreWind) <> 0 then |
755 if (GameFlags and gfMoreWind) <> 0 then |
756 Vx:= (-(windSpeed / Density) * (TestTime + tDelta) * 0.5) + ((Targ.Point.X - meX) / (TestTime + tDelta)) |
756 Vx:= (-(aiWindSpeed / Density) * (TestTime + tDelta) * 0.5) + ((Targ.Point.X - meX) / (TestTime + tDelta)) |
757 // Try to overshoot slightly, seems to pay slightly better dividends in terms of hitting cluster |
757 // Try to overshoot slightly, seems to pay slightly better dividends in terms of hitting cluster |
758 else if meX<Targ.Point.X then |
758 else if meX<Targ.Point.X then |
759 Vx:= ((Targ.Point.X+10) - meX) / (TestTime + tDelta) |
759 Vx:= ((Targ.Point.X+10) - meX) / (TestTime + tDelta) |
760 else |
760 else |
761 Vx:= ((Targ.Point.X-10) - meX) / (TestTime + tDelta); |
761 Vx:= ((Targ.Point.X-10) - meX) / (TestTime + tDelta); |
769 dY:= -Vy; |
769 dY:= -Vy; |
770 t:= TestTime; |
770 t:= TestTime; |
771 repeat |
771 repeat |
772 x:= x + dX; |
772 x:= x + dX; |
773 if (GameFlags and gfMoreWind) <> 0 then |
773 if (GameFlags and gfMoreWind) <> 0 then |
774 dX:= dX + windSpeed / Density; |
774 dX:= dX + aiWindSpeed / Density; |
775 y:= y + dY; |
775 y:= y + dY; |
776 dY:= dY + cGravityf; |
776 dY:= dY + cGravityf; |
777 dec(t) |
777 dec(t) |
778 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
778 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
779 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t = 0); |
779 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t = 0); |
823 if (WorldEdge = weWrap) and (random(2)=0) then |
823 if (WorldEdge = weWrap) and (random(2)=0) then |
824 Vx:= (targXWrap - meX) / (TestTime + tDelta) |
824 Vx:= (targXWrap - meX) / (TestTime + tDelta) |
825 else |
825 else |
826 Vx:= (Targ.Point.X - meX) / (TestTime + tDelta); |
826 Vx:= (Targ.Point.X - meX) / (TestTime + tDelta); |
827 if (GameFlags and gfMoreWind) <> 0 then |
827 if (GameFlags and gfMoreWind) <> 0 then |
828 Vx:= -(windSpeed / Density) * (TestTime + tDelta) * 0.5 + Vx; |
828 Vx:= -(aiWindSpeed / Density) * (TestTime + tDelta) * 0.5 + Vx; |
829 |
829 |
830 Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Point.Y-50) - meY) / (TestTime + tDelta); |
830 Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Point.Y-50) - meY) / (TestTime + tDelta); |
831 r:= sqr(Vx)+sqr(Vy); |
831 r:= sqr(Vx)+sqr(Vy); |
832 if not (r > 1) then |
832 if not (r > 1) then |
833 begin |
833 begin |
838 t:= TestTime; |
838 t:= TestTime; |
839 repeat |
839 repeat |
840 x:= CheckWrap(x); |
840 x:= CheckWrap(x); |
841 x:= x + dX; |
841 x:= x + dX; |
842 if (GameFlags and gfMoreWind) <> 0 then |
842 if (GameFlags and gfMoreWind) <> 0 then |
843 dX:= dX + windSpeed / Density; |
843 dX:= dX + aiWindSpeed / Density; |
844 y:= y + dY; |
844 y:= y + dY; |
845 dY:= dY + cGravityf; |
845 dY:= dY + cGravityf; |
846 dec(t) |
846 dec(t) |
847 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 6)) or |
847 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 6)) or |
848 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 6))) or (t = 0); |
848 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 6))) or (t = 0); |
913 if TestTime = 0 then |
913 if TestTime = 0 then |
914 exit(BadTurn); |
914 exit(BadTurn); |
915 |
915 |
916 Vx:= (Targ.Point.X - meX) / TestTime; |
916 Vx:= (Targ.Point.X - meX) / TestTime; |
917 if (GameFlags and gfMoreWind) <> 0 then |
917 if (GameFlags and gfMoreWind) <> 0 then |
918 Vx:= -(windSpeed / Density) * TestTime * 0.5 + Vx; |
918 Vx:= -(aiWindSpeed / Density) * TestTime * 0.5 + Vx; |
919 Vy:= cGravityf * (TestTime div 2) - (Targ.Point.Y - meY) / TestTime; |
919 Vy:= cGravityf * (TestTime div 2) - (Targ.Point.Y - meY) / TestTime; |
920 |
920 |
921 x:= meX; |
921 x:= meX; |
922 dX:= Vx; |
922 dX:= Vx; |
923 y:= meY; |
923 y:= meY; |
924 dY:= -Vy; |
924 dY:= -Vy; |
925 |
925 |
926 repeat |
926 repeat |
927 x:= x + dX; |
927 x:= x + dX; |
928 if (GameFlags and gfMoreWind) <> 0 then |
928 if (GameFlags and gfMoreWind) <> 0 then |
929 dX:= dX + windSpeed / Density; |
929 dX:= dX + aiWindSpeed / Density; |
930 y:= y + dY; |
930 y:= y + dY; |
931 dY:= dY + cGravityf; |
931 dY:= dY + cGravityf; |
932 EX:= trunc(x); |
932 EX:= trunc(x); |
933 EY:= trunc(y); |
933 EY:= trunc(y); |
934 until (((Me = CurrentHedgehog^.Gear) and TestColl(EX, EY, 4)) or |
934 until (((Me = CurrentHedgehog^.Gear) and TestColl(EX, EY, 4)) or |
1432 firstHit:= false; |
1432 firstHit:= false; |
1433 |
1433 |
1434 repeat |
1434 repeat |
1435 X:= X + dX; |
1435 X:= X + dX; |
1436 if (GameFlags and gfMoreWind) <> 0 then |
1436 if (GameFlags and gfMoreWind) <> 0 then |
1437 dX:= dX + windSpeed / Density; |
1437 dX:= dX + aiWindSpeed / Density; |
1438 Y:= Y + dY; |
1438 Y:= Y + dY; |
1439 dY:= dY + cGravityf; |
1439 dY:= dY + cGravityf; |
1440 fexit:= true; |
1440 fexit:= true; |
1441 |
1441 |
1442 for i:= 0 to 9 do |
1442 for i:= 0 to 9 do |
1573 repeat |
1573 repeat |
1574 // Simulate in-air movement |
1574 // Simulate in-air movement |
1575 drillX:= drillX + dX; |
1575 drillX:= drillX + dX; |
1576 drillY:= drillY + dY; |
1576 drillY:= drillY + dY; |
1577 if (GameFlags and gfMoreWind) <> 0 then |
1577 if (GameFlags and gfMoreWind) <> 0 then |
1578 dX:= dX + windSpeed / Density; |
1578 dX:= dX + aiWindSpeed / Density; |
1579 dY:= dY + cGravityf; |
1579 dY:= dY + cGravityf; |
1580 |
1580 |
1581 if timerRuns then |
1581 if timerRuns then |
1582 dec(drillTimer); |
1582 dec(drillTimer); |
1583 |
1583 |
1722 firstHit:= false; |
1722 firstHit:= false; |
1723 |
1723 |
1724 repeat |
1724 repeat |
1725 X:= X + dX; |
1725 X:= X + dX; |
1726 if (GameFlags and (gfMoreWind or gfInfAttack)) <> 0 then |
1726 if (GameFlags and (gfMoreWind or gfInfAttack)) <> 0 then |
1727 dX:= dX + windSpeed / Density; |
1727 dX:= dX + aiWindSpeed / Density; |
1728 Y:= Y + dY; |
1728 Y:= Y + dY; |
1729 dY:= dY + cGravityf; |
1729 dY:= dY + cGravityf; |
1730 fexit:= true; |
1730 fexit:= true; |
1731 |
1731 |
1732 for i:= 0 to 9 do |
1732 for i:= 0 to 9 do |
1802 if (WorldEdge = weWrap) and (random(2)=0) then |
1802 if (WorldEdge = weWrap) and (random(2)=0) then |
1803 Vx:= (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime |
1803 Vx:= (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime |
1804 else |
1804 else |
1805 Vx:= (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime; |
1805 Vx:= (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime; |
1806 if (GameFlags and gfMoreWind) <> 0 then |
1806 if (GameFlags and gfMoreWind) <> 0 then |
1807 Vx:= -(windSpeed / Density) * rTime * 0.5 + Vx; |
1807 Vx:= -(aiWindSpeed / Density) * rTime * 0.5 + Vx; |
1808 Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime; |
1808 Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime; |
1809 r:= sqr(Vx) + sqr(Vy); |
1809 r:= sqr(Vx) + sqr(Vy); |
1810 |
1810 |
1811 if not (r > 1) then |
1811 if not (r > 1) then |
1812 begin |
1812 begin |
1817 t:= rTime; |
1817 t:= rTime; |
1818 repeat |
1818 repeat |
1819 x:= CheckWrap(x); |
1819 x:= CheckWrap(x); |
1820 x:= x + dX; |
1820 x:= x + dX; |
1821 if (GameFlags and gfMoreWind) <> 0 then |
1821 if (GameFlags and gfMoreWind) <> 0 then |
1822 dX:= dX + windSpeed / Density; |
1822 dX:= dX + aiWindSpeed / Density; |
1823 |
1823 |
1824 y:= y + dY; |
1824 y:= y + dY; |
1825 dY:= dY + cGravityf; |
1825 dY:= dY + cGravityf; |
1826 dec(t) |
1826 dec(t) |
1827 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 2)) or |
1827 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 2)) or |
2088 |
2088 |
2089 x:= hwFloat2Float(Me^.X) + hwSign(Me^.dX) * 7; |
2089 x:= hwFloat2Float(Me^.X) + hwSign(Me^.dX) * 7; |
2090 y:= hwFloat2Float(Me^.Y); |
2090 y:= hwFloat2Float(Me^.Y); |
2091 dx:= hwSign(Me^.dX) * 0.03; |
2091 dx:= hwSign(Me^.dX) * 0.03; |
2092 if (GameFlags and gfMoreWind) <> 0 then |
2092 if (GameFlags and gfMoreWind) <> 0 then |
2093 dx:= -(windSpeed / Density) + dx; |
2093 dx:= -(aiWindSpeed / Density) + dx; |
2094 dy:= 0; |
2094 dy:= 0; |
2095 t:= 5000; |
2095 t:= 5000; |
2096 repeat |
2096 repeat |
2097 dec(t); |
2097 dec(t); |
2098 if (GameFlags and gfMoreWind) <> 0 then |
2098 if (GameFlags and gfMoreWind) <> 0 then |
2099 dx:= dx + windSpeed / Density; |
2099 dx:= dx + aiWindSpeed / Density; |
2100 x:= x + dx; |
2100 x:= x + dx; |
2101 dy:= dy + cGravityf; |
2101 dy:= dy + cGravityf; |
2102 y:= y + dy; |
2102 y:= y + dy; |
2103 |
2103 |
2104 if TestColl(trunc(x), trunc(y), 3) then |
2104 if TestColl(trunc(x), trunc(y), 3) then |
2138 |
2138 |
2139 x:= hwFloat2Float(Me^.X) + hwSign(Me^.dX) * 7; |
2139 x:= hwFloat2Float(Me^.X) + hwSign(Me^.dX) * 7; |
2140 y:= hwFloat2Float(Me^.Y); |
2140 y:= hwFloat2Float(Me^.Y); |
2141 dx:= hwSign(Me^.dX) * 0.02; |
2141 dx:= hwSign(Me^.dX) * 0.02; |
2142 if (GameFlags and gfMoreWind) <> 0 then |
2142 if (GameFlags and gfMoreWind) <> 0 then |
2143 dx:= -(windSpeed / Density) + dx; |
2143 dx:= -(aiWindSpeed / Density) + dx; |
2144 dy:= 0; |
2144 dy:= 0; |
2145 t:= 10000; |
2145 t:= 10000; |
2146 repeat |
2146 repeat |
2147 dec(t); |
2147 dec(t); |
2148 if (GameFlags and gfMoreWind) <> 0 then |
2148 if (GameFlags and gfMoreWind) <> 0 then |
2149 dx:= dx + windSpeed / Density; |
2149 dx:= dx + aiWindSpeed / Density; |
2150 x:= x + dx; |
2150 x:= x + dx; |
2151 dy:= dy + cGravityf; |
2151 dy:= dy + cGravityf; |
2152 y:= y + dy; |
2152 y:= y + dy; |
2153 if ((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 2)) or |
2153 if ((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 2)) or |
2154 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 2)) then |
2154 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 2)) then |
2210 if (WorldEdge = weWrap) and (random(2)=0) then |
2210 if (WorldEdge = weWrap) and (random(2)=0) then |
2211 Vx:= (targXWrap - meX) / rTime |
2211 Vx:= (targXWrap - meX) / rTime |
2212 else |
2212 else |
2213 Vx:= (Targ.Point.X - meX) / rTime; |
2213 Vx:= (Targ.Point.X - meX) / rTime; |
2214 if (GameFlags and gfMoreWind) <> 0 then |
2214 if (GameFlags and gfMoreWind) <> 0 then |
2215 Vx:= -(windSpeed / Density) * rTime * 0.5 + Vx; |
2215 Vx:= -(aiWindSpeed / Density) * rTime * 0.5 + Vx; |
2216 Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime; |
2216 Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime; |
2217 r:= sqr(Vx) + sqr(Vy); |
2217 r:= sqr(Vx) + sqr(Vy); |
2218 |
2218 |
2219 if not (r > 1) then |
2219 if not (r > 1) then |
2220 begin |
2220 begin |
2225 t:= rTime; |
2225 t:= rTime; |
2226 repeat |
2226 repeat |
2227 x:= CheckWrap(x); |
2227 x:= CheckWrap(x); |
2228 x:= x + dX; |
2228 x:= x + dX; |
2229 if (GameFlags and gfMoreWind) <> 0 then |
2229 if (GameFlags and gfMoreWind) <> 0 then |
2230 dX:= dX + windSpeed / Density; |
2230 dX:= dX + aiWindSpeed / Density; |
2231 |
2231 |
2232 y:= y + dY; |
2232 y:= y + dY; |
2233 dY:= dY + cGravityf; |
2233 dY:= dY + cGravityf; |
2234 dec(t) |
2234 dec(t) |
2235 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 7)) or |
2235 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 7)) or |