hedgewars/uAIAmmoTests.pas
changeset 15685 78e383fff605
parent 15680 3224d0d970ac
child 15686 034955e721a1
--- a/hedgewars/uAIAmmoTests.pas	Mon Jul 06 00:25:13 2020 +0200
+++ b/hedgewars/uAIAmmoTests.pas	Mon Jul 06 01:46:22 2020 +0200
@@ -64,6 +64,7 @@
 function TestPiano(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
 function TestHammer(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
+function TestResurrector(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
 function TestCake(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
 function TestSeduction(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
 function TestDynamite(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
@@ -130,7 +131,7 @@
             (proc: nil;              flags: 0), // amFlamethrower
             (proc: @TestSMine;       flags: 0), // amSMine
             (proc: @TestHammer;      flags: amtest_NoTarget or amtest_NoInvulnerable), // amHammer
-            (proc: nil;              flags: 0), // amResurrector
+            (proc: @TestResurrector; flags: amtest_NoTarget or amtest_NoInvulnerable or amtest_NoVampiric), // amResurrector
             (proc: @TestDrillStrike; flags: amtest_Rare), // amDrillStrike
             (proc: nil;              flags: 0), // amSnowball
             (proc: nil;              flags: 0), // amTardis
@@ -1487,6 +1488,40 @@
 TestAirAttack:= valueResult;
 end;
 
+function TestResurrector(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
+var rate, heal: LongInt;
+begin
+Flags:= Flags; // avoid compiler hint
+Targ:= Targ;
+
+if (Level = 5) then
+    exit(BadTurn);
+
+if (Me^.Health <= 1) then
+    exit(BadTurn);
+
+if (Level <= 2) and (Me^.Hedgehog^.Effects[hePoisoned] > 0) then
+    // Sacrifice almost all health if poisoned
+    heal:= Me^.Health - 1
+else
+    // Sacrifice up to 10% of own health
+    heal:= (Me^.Health div 10);
+
+ap.ExplR:= 0;
+ap.Time:= 0;
+if (GameFlags and gfInfAttack) = 0 then
+    ap.Power:= max(min(500 * heal - 500, 10000), 10)
+else
+    // Shorter attack duration in inf attack because the clock is ticking!
+    ap.Power:= max(min(500 * heal - 500, 3000), 10);
+ap.Angle:= 0;
+
+rate:= RateResurrector(Me);
+if rate <= 0 then
+    rate:= BadTurn;
+TestResurrector:= rate;
+end;
+
 function TestDrillStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
 const cShift = 4;
       Density : real = 1.0;