# HG changeset patch # User nemo # Date 1342059523 14400 # Node ID 16ae2e1c9005ed9115bf76f620f96c25a9cbc204 # Parent fcc00265883269bbf1df89419c6e0d37029ffbaf Tell AI to avoid edges, especially ones over water (this does not include checking whether a knock could drown yet). Also make flakes pick a new random dx/dy on respawn to further reduce patterns. Also disable a couple of weapons for the particularly dumb AI levels, and disable switching for the dumbest. diff -r fcc002658832 -r 16ae2e1c9005 hedgewars/VGSHandlers.inc --- a/hedgewars/VGSHandlers.inc Mon Jul 09 23:28:02 2012 -0400 +++ b/hedgewars/VGSHandlers.inc Wed Jul 11 22:18:43 2012 -0400 @@ -27,6 +27,7 @@ procedure doStepFlake(Gear: PVisualGear; Steps: Longword); var sign: real; + moved: boolean; begin if vobCount = 0 then exit; @@ -84,21 +85,37 @@ end else begin + moved:= false; if round(X) < cLeftScreenBorder then - X:= X + cScreenSpace + begin + X:= X + cScreenSpace; + moved:= true + end else if round(X) > cRightScreenBorder then + begin X:= X - cScreenSpace; + moved:= true + end; // if round(Y) < (LAND_HEIGHT - 1024 - 75) then Y:= Y + 25.0; // For if flag is set for flakes rising upwards? if (Gear^.Layer = 2) and (round(Y) - 225 > LAND_HEIGHT) then begin X:= cLeftScreenBorder + random(cScreenSpace); - Y:= Y - (1024 + 250 + random(50)) // TODO - configure in theme (jellies for example could use limited range) + Y:= Y - (1024 + 250 + random(50)); // TODO - configure in theme (jellies for example could use limited range) + moved:= true end else if (Gear^.Layer <> 2) and (round(Y) + 50 > LAND_HEIGHT) then begin X:= cLeftScreenBorder + random(cScreenSpace); - Y:= Y - (1024 + random(25)) + Y:= Y - (1024 + random(25)); + moved:= true + end; + if moved then + begin + Angle:= random(360); + dx:= 0.0000038654705 * random(10000); + dy:= 0.000003506096 * random(7000); + if random(2) = 0 then dx := -dx end; Timer:= 0; tdX:= 0; diff -r fcc002658832 -r 16ae2e1c9005 hedgewars/uAI.pas --- a/hedgewars/uAI.pas Mon Jul 09 23:28:02 2012 -0400 +++ b/hedgewars/uAI.pas Wed Jul 11 22:18:43 2012 -0400 @@ -336,7 +336,9 @@ switchesNum:= 0; switchImmediatelyAvailable:= (CurAmmoGear <> nil) and (CurAmmoGear^.Kind = gtSwitcher); -switchCount:= HHHasAmmo(PGear(Me)^.Hedgehog^, amSwitch); +if PGear(Me)^.Hedgehog^.BotLevel <> 5 then + switchCount:= HHHasAmmo(PGear(Me)^.Hedgehog^, amSwitch) +else switchCount:= 0; if (PGear(Me)^.State and gstAttacked) = 0 then if Targets.Count > 0 then @@ -390,6 +392,11 @@ BackMe:= PGear(Me)^; while (not StopThinking) and (BestActions.Count = 0) do begin +(* + // Maybe this would get a bit of movement out of them? Hopefully not *toward* water. Need to check how often he'd choose that strategy + if SuddenDeathDmg and ((hwRound(BackMe.Y)+cWaterRise*2) > cWaterLine) then + AddBonus(hwRound(BackMe.X), hwRound(BackMe.Y), 250, -40); +*) FillBonuses(true); WalkMe:= BackMe; Actions.Count:= 0; diff -r fcc002658832 -r 16ae2e1c9005 hedgewars/uAIAmmoTests.pas --- a/hedgewars/uAIAmmoTests.pas Mon Jul 09 23:28:02 2012 -0400 +++ b/hedgewars/uAIAmmoTests.pas Wed Jul 11 22:18:43 2012 -0400 @@ -599,6 +599,7 @@ d: Longword; fallDmg, valueResult: LongInt; begin +if Me^.Hedgehog^.BotLevel > 3 then exit(BadTurn); dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent; Level:= Level; // avoid compiler hint ap.ExplR:= 0; @@ -648,6 +649,7 @@ d: Longword; fallDmg, valueResult: LongInt; begin +if Me^.Hedgehog^.BotLevel > 3 then exit(BadTurn); dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent; Level:= Level; // avoid compiler hint ap.ExplR:= 0; diff -r fcc002658832 -r 16ae2e1c9005 hedgewars/uAIMisc.pas --- a/hedgewars/uAIMisc.pas Mon Jul 09 23:28:02 2012 -0400 +++ b/hedgewars/uAIMisc.pas Wed Jul 11 22:18:43 2012 -0400 @@ -54,6 +54,7 @@ procedure freeModule; procedure FillTargets; +procedure AddBonus(x, y: LongInt; r: Longword; s: LongInt); inline; procedure FillBonuses(isAfterAttack: boolean); procedure AwareOfExplosion(x, y, r: LongInt); inline; @@ -80,6 +81,11 @@ ar: array[0..Pred(MAXBONUS)] of TBonus; end; + walkbonuses: record + Count: Longword; + ar: array[0..Pred(MAXBONUS div 4)] of TBonus; // don't use too many + end; + implementation uses uCollisions, uVariables, uUtils, uDebug, uLandTexture; @@ -140,9 +146,22 @@ end; end; +procedure AddWalkBonus(x, y: LongInt; r: Longword; s: LongInt); inline; +begin +if(walkbonuses.Count < MAXBONUS div 4) then + begin + walkbonuses.ar[walkbonuses.Count].x:= x; + walkbonuses.ar[walkbonuses.Count].y:= y; + walkbonuses.ar[walkbonuses.Count].Radius:= r; + walkbonuses.ar[walkbonuses.Count].Score:= s; + inc(walkbonuses.Count); + end; +end; + procedure FillBonuses(isAfterAttack: boolean); var Gear: PGear; MyClan: PClan; + i: Longint; begin bonuses.Count:= 0; MyClan:= ThinkingHH^.Hedgehog^.Team^.Clan; @@ -190,6 +209,11 @@ if isAfterAttack and (KnownExplosion.Radius > 0) then with KnownExplosion do AddBonus(X, Y, Radius + 10, -Radius); +if isAfterAttack then + for i:= 0 to Pred(walkbonuses.Count) do + with walkbonuses.ar[i] do + AddBonus(X, Y, Radius, Score); +walkbonuses.Count:= 0 end; procedure AwareOfExplosion(x, y, r: LongInt); inline; @@ -642,7 +666,7 @@ end; function HHGo(Gear, AltGear: PGear; var GoInfo: TGoInfo): boolean; -var pX, pY: LongInt; +var pX, pY, tY: LongInt; begin HHGo:= false; AltGear^:= Gear^; @@ -650,12 +674,16 @@ GoInfo.Ticks:= 0; GoInfo.FallPix:= 0; GoInfo.JumpType:= jmpNone; - +tY:= hwRound(Gear^.Y); repeat pX:= hwRound(Gear^.X); pY:= hwRound(Gear^.Y); if pY + cHHRadius >= cWaterLine then - exit(false); + begin + if AltGear^.Hedgehog^.BotLevel < 4 then + AddWalkBonus(pX, tY, 250, -40); + exit(false) + end; // hog is falling if (Gear^.State and gstMoving) <> 0 then @@ -667,6 +695,8 @@ Goinfo.FallPix:= 0; // try ljump instead of fall with damage HHJump(AltGear, jmpLJump, GoInfo); + if AltGear^.Hedgehog^.BotLevel < 4 then + AddWalkBonus(pX, tY, 175, -20); exit(false) end; Gear^.Y:= Gear^.Y + Gear^.dY; diff -r fcc002658832 -r 16ae2e1c9005 hedgewars/uGearsHedgehog.pas --- a/hedgewars/uGearsHedgehog.pas Mon Jul 09 23:28:02 2012 -0400 +++ b/hedgewars/uGearsHedgehog.pas Wed Jul 11 22:18:43 2012 -0400 @@ -355,7 +355,6 @@ newGear:= AddGear(hwRound(lx), hwRound(ly), gtResurrector, 0, _0, _0, 0); newGear^.SoundChannel := LoopSound(sndResurrector); end; - //amMelonStrike: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 4, _0, _0, 0); amStructure: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtStructure, gstWait, SignAs(_0_02, dX), _0, 3000); amTardis: newGear:= AddGear(hwRound(X), hwRound(Y), gtTardis, 0, _0, _0, 5000); amIceGun: newGear:= AddGear(hwRound(X), hwRound(Y), gtIceGun, 0, _0, _0, 0);