# HG changeset patch # User Wuzzy # Date 1508498868 -7200 # Node ID 31f7e0a317361b274489e38350e16c19ae2cc3e1 # Parent 20dbb3a03e615eaf5e24cd2bc0d06aff2f6651e3 AI player checks if it can use tardis before selecting it diff -r 20dbb3a03e61 -r 31f7e0a31736 hedgewars/uAI.pas --- a/hedgewars/uAI.pas Wed Oct 18 20:33:20 2017 -0400 +++ b/hedgewars/uAI.pas Fri Oct 20 13:27:48 2017 +0200 @@ -31,7 +31,8 @@ implementation uses uConsts, SDLh, uAIMisc, uAIAmmoTests, uAIActions, uAmmos, uTypes, - uVariables, uCommands, uUtils, uDebug, uAILandMarks; + uVariables, uCommands, uUtils, uDebug, uAILandMarks, + uGearsUtils; var BestActions: TActions; CanUseAmmo: array [TAmmoType] of boolean; @@ -473,7 +474,7 @@ // Hog has no idea what to do. Use tardis or skip if not bonuses.activity then - if ((HHHasAmmo(Me^.Hedgehog^, amTardis) > 0)) and (random(3) < 1) then + if ((HHHasAmmo(Me^.Hedgehog^, amTardis) > 0)) and (CanUseTardis(Me^.Hedgehog^.Gear)) and (random(3) < 1) then // Tardis brings hog to a random place. Perfect for clueless AI begin AddAction(BestActions, aia_Weapon, Longword(amTardis), 80, 0, 0); diff -r 20dbb3a03e61 -r 31f7e0a31736 hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Wed Oct 18 20:33:20 2017 -0400 +++ b/hedgewars/uGearsHandlersMess.pas Fri Oct 20 13:27:48 2017 +0200 @@ -5854,46 +5854,17 @@ end; procedure doStepTardis(Gear: PGear); -var i,j,cnt: LongWord; - HH: PHedgehog; +var HH: PHedgehog; begin -(* - Conditions for not activating. - 1. Hog is last of his clan - 2. Sudden Death is in play - 3. Hog is a king -*) HH:= Gear^.Hedgehog; - if HH^.Gear <> nil then - if (HH^.Gear = nil) or (HH^.King) or (SuddenDeathDmg) then - begin - if HH^.Gear <> nil then - begin - HH^.Gear^.Message := HH^.Gear^.Message and (not gmAttack); - HH^.Gear^.State:= HH^.Gear^.State and (not gstAttacking); - end; + if (not CanUseTardis(HH^.Gear)) then + begin + HH^.Gear^.Message := HH^.Gear^.Message and (not gmAttack); + HH^.Gear^.State:= HH^.Gear^.State and (not gstAttacking); PlaySound(sndDenied); - DeleteGear(gear); + DeleteGear(Gear); exit - end; - cnt:= 0; - for j:= 0 to Pred(HH^.Team^.Clan^.TeamsNumber) do - for i:= 0 to Pred(HH^.Team^.Clan^.Teams[j]^.HedgehogsNumber) do - if (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear <> nil) - and ((HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.State and gstDrowning) = 0) - and (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Health > HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then - inc(cnt); - if cnt < 2 then - begin - if HH^.Gear <> nil then - begin - HH^.Gear^.Message := HH^.Gear^.Message and (not gmAttack); - HH^.Gear^.State:= HH^.Gear^.State and (not gstAttacking); - end; - PlaySound(sndDenied); - DeleteGear(gear); - exit - end; + end; Gear^.SoundChannel := LoopSound(sndTardis); Gear^.doStep:= @doStepTardisWarp end; diff -r 20dbb3a03e61 -r 31f7e0a31736 hedgewars/uGearsUtils.pas --- a/hedgewars/uGearsUtils.pas Wed Oct 18 20:33:20 2017 -0400 +++ b/hedgewars/uGearsUtils.pas Fri Oct 20 13:27:48 2017 +0200 @@ -47,6 +47,7 @@ function GearsNear(X, Y: hwFloat; Kind: TGearType; r: LongInt): PGearArrayS; procedure SpawnBoxOfSmth; procedure ShotgunShot(Gear: PGear); +function CanUseTardis(HHGear: PGear): boolean; procedure SetAllToActive; procedure SetAllHHToActive(Ice: boolean); @@ -1172,6 +1173,35 @@ DrawExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), cShotgunRadius) end; +// Returns true if the given hog gear can use the tardis +function CanUseTardis(HHGear: PGear): boolean; +var usable: boolean; + i, j, cnt: LongInt; + HH: PHedgehog; +begin +(* + Conditions for not activating. + 1. Hog is last of his clan + 2. Sudden Death is in play + 3. Hog is a king +*) + usable:= true; + HH:= HHGear^.Hedgehog; + if HHGear <> nil then + if (HHGear = nil) or (HH^.King) or (SuddenDeathDmg) then + usable:= false; + cnt:= 0; + for j:= 0 to Pred(HH^.Team^.Clan^.TeamsNumber) do + for i:= 0 to Pred(HH^.Team^.Clan^.Teams[j]^.HedgehogsNumber) do + if (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear <> nil) + and ((HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.State and gstDrowning) = 0) + and (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Health > HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then + inc(cnt); + if (cnt < 2) then + usable:= false; + CanUseTardis:= usable; +end; + procedure AmmoShove(Ammo: PGear; Damage, Power: LongInt); var t: PGearArray; Gear: PGear;