134 (proc: nil; flags: 0), // amFlamethrower |
134 (proc: nil; flags: 0), // amFlamethrower |
135 (proc: @TestSMine; flags: 0), // amSMine |
135 (proc: @TestSMine; flags: 0), // amSMine |
136 (proc: @TestHammer; flags: amtest_NoTarget or amtest_NoInvulnerable), // amHammer |
136 (proc: @TestHammer; flags: amtest_NoTarget or amtest_NoInvulnerable), // amHammer |
137 (proc: @TestResurrector; flags: amtest_NoTarget or amtest_NoInvulnerable or amtest_NoVampiric or amtest_NoLowGravity), // amResurrector |
137 (proc: @TestResurrector; flags: amtest_NoTarget or amtest_NoInvulnerable or amtest_NoVampiric or amtest_NoLowGravity), // amResurrector |
138 (proc: @TestDrillStrike; flags: amtest_Rare), // amDrillStrike |
138 (proc: @TestDrillStrike; flags: amtest_Rare), // amDrillStrike |
139 (proc: nil; flags: 0), // amSnowball |
139 (proc: @TestSnowball; flags: amtest_NoInvulnerable or amtest_NoVampiric), // amSnowball |
140 (proc: nil; flags: 0), // amTardis |
140 (proc: nil; flags: 0), // amTardis |
141 (proc: nil; flags: 0), // amLandGun |
141 (proc: nil; flags: 0), // amLandGun |
142 (proc: nil; flags: 0), // amIceGun |
142 (proc: nil; flags: 0), // amIceGun |
143 (proc: @TestKnife; flags: 0), // amKnife |
143 (proc: @TestKnife; flags: 0), // amKnife |
144 (proc: nil; flags: 0), // amRubber |
144 (proc: nil; flags: 0), // amRubber |
530 ap.ExplR:= 0; |
532 ap.ExplR:= 0; |
531 valueResult:= BadTurn; |
533 valueResult:= BadTurn; |
532 if (WorldEdge = weWrap) then |
534 if (WorldEdge = weWrap) then |
533 if (Targ.Point.X < meX) then |
535 if (Targ.Point.X < meX) then |
534 targXWrap:= Targ.Point.X + (RightX-LeftX) |
536 targXWrap:= Targ.Point.X + (RightX-LeftX) |
535 else targXWrap:= Targ.Point.X - (RightX-LeftX); |
537 else |
|
538 targXWrap:= Targ.Point.X - (RightX-LeftX); |
536 repeat |
539 repeat |
537 rTime:= rTime + 300 + Level * 50 + random(1000); |
540 rTime:= rTime + 300 + Level * 50 + random(300); |
538 if (WorldEdge = weWrap) and (random(2)=0) then |
541 if (WorldEdge = weWrap) and (random(2)=0) then |
539 Vx:= - aiWindSpeed * rTime * 0.5 + ((targXWrap + AIrndSign(2)) - meX) / rTime |
542 Vx:= (targXWrap - meX) / rTime |
540 else Vx:= - aiWindSpeed * rTime * 0.5 + ((Targ.Point.X + AIrndSign(2)) - meX) / rTime; |
543 else |
|
544 Vx:= (Targ.Point.X - meX) / rTime; |
|
545 if (GameFlags and gfMoreWind) <> 0 then |
|
546 Vx:= -(aiWindSpeed / Density) * rTime * 0.5 + Vx |
|
547 else |
|
548 Vx:= -aiWindSpeed * rTime * 0.5 + Vx; |
541 Vy:= aiGravityf * rTime * 0.5 - (Targ.Point.Y - meY) / rTime; |
549 Vy:= aiGravityf * rTime * 0.5 - (Targ.Point.Y - meY) / rTime; |
542 r:= sqr(Vx) + sqr(Vy); |
550 r:= sqr(Vx) + sqr(Vy); |
|
551 |
543 if not (r > 1) then |
552 if not (r > 1) then |
544 begin |
553 begin |
545 x:= meX; |
554 x:= meX; |
546 y:= meY; |
555 y:= meY; |
547 dX:= Vx; |
556 dX:= Vx; |
548 dY:= -Vy; |
557 dY:= -Vy; |
549 t:= rTime; |
558 t:= rTime; |
550 repeat |
559 repeat |
551 x:= CheckWrap(x); |
560 x:= CheckWrap(x); |
552 x:= x + dX; |
561 x:= x + dX; |
|
562 if (GameFlags and gfMoreWind) <> 0 then |
|
563 dX:= dX + aiWindSpeed / Density |
|
564 else |
|
565 dX:= dX + aiWindSpeed; |
|
566 |
553 y:= y + dY; |
567 y:= y + dY; |
554 dX:= dX + aiWindSpeed; |
|
555 dY:= dY + aiGravityf; |
568 dY:= dY + aiGravityf; |
556 dec(t) |
569 dec(t) |
557 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or |
570 until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 4)) or |
558 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t <= 0); |
571 ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 4))) or (trunc(y) > cWaterLine) or (t < -timeLimit); |
|
572 |
559 EX:= trunc(x); |
573 EX:= trunc(x); |
560 EY:= trunc(y); |
574 EY:= trunc(y); |
561 |
575 |
562 value:= RateShove(Me, trunc(x), trunc(y), 5, 1, trunc((abs(dX)+abs(dY))*20), -dX, -dY, afTrackFall); |
576 // Sanity check: Make sure we're not too close to impact location |
563 // LOL copypasta: this is score for digging with... snowball |
577 if (Metric(trunc(meX), trunc(meY), EX, EY) <= 40) then |
564 //if value = 0 then |
578 value:= BadTurn |
565 // value:= - Metric(Targ.Point.X, Targ.Point.Y, EX, EY) div 64; |
579 // Rate attack |
566 |
580 else if (t >= -timeLimit) and (EY <= cWaterLine) then |
567 if valueResult <= value then |
581 // radius intentionally set to 16 for shove because lower values don't work reliably |
|
582 value:= RateShove(Me, EX, EY, 16, 0, trunc((abs(dX)+abs(dY))*20), dX, dY, afTrackFall) |
|
583 else |
|
584 value:= BadTurn; |
|
585 |
|
586 if (value = 0) and (Targ.Kind = gtHedgehog) and (Targ.Score > 0) then |
|
587 value := BadTurn; |
|
588 |
|
589 if (valueResult < value) or ((valueResult = value) and (Level = 1)) then |
568 begin |
590 begin |
569 ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random((Level - 1) * 9)); |
591 ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random((Level - 1) * 12)); |
570 ap.Power:= trunc(sqrt(r) * cMaxPower) - random((Level - 1) * 17 + 1); |
592 ap.Power:= trunc(sqrt(r) * cMaxPower) - random((Level - 1) * 22 + 1); |
571 ap.ExplR:= 0; |
|
572 ap.ExplX:= EX; |
593 ap.ExplX:= EX; |
573 ap.ExplY:= EY; |
594 ap.ExplY:= EY; |
574 valueResult:= value |
595 valueResult:= value |
575 end; |
596 end; |
576 end |
597 end |
577 until (rTime > 5050 - Level * 800); |
598 until rTime > 5050 - Level * 800; |
578 TestSnowball:= valueResult |
599 TestSnowball:= valueResult |
579 end; |
600 end; |
580 |
601 |
581 function TestMolotov(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
602 function TestMolotov(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
582 const timeLimit = 50; |
603 const timeLimit = 50; |