--- 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;