# HG changeset patch # User unc0rr # Date 1169906789 0 # Node ID c75410fe3133d6e8b5c7d24438f70f8885f31bca # Parent 2aed85310727b3485452eec57af952c62623737a - Repair bots: they can walk and use bazooka, possible cannot jump (why?) - Calculate real angle based on direction vector diff -r 2aed85310727 -r c75410fe3133 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Fri Jan 26 22:36:21 2007 +0000 +++ b/hedgewars/GSHandlers.inc Sat Jan 27 14:06:29 2007 +0000 @@ -554,7 +554,7 @@ begin X:= Gear^.X; Y:= Gear^.Y; - if RopePoints.Count = 0 then RopePoints.HookAngle:= 0;//DxDy2Angle32(Gear^.dY, Gear^.dX); + if RopePoints.Count = 0 then RopePoints.HookAngle:= DxDy2Angle32(Gear^.dY, Gear^.dX); b:= (cc * HHGear^.dY) > (cs * HHGear^.dX); dLen:= len end; diff -r 2aed85310727 -r c75410fe3133 hedgewars/uAI.pas --- a/hedgewars/uAI.pas Fri Jan 26 22:36:21 2007 +0000 +++ b/hedgewars/uAI.pas Sat Jan 27 14:06:29 2007 +0000 @@ -46,7 +46,6 @@ a, aa: TAmmoType; begin BotLevel:= PHedgehog(Me^.Hedgehog)^.BotLevel; - for i:= 0 to Pred(Targets.Count) do if (Targets.ar[i].Score >= 0) then begin @@ -117,7 +116,7 @@ AddAction(Actions, Me^.Message, aim_push, 10, 0, 0); if (Me^.Message and gm_Left) <> 0 then AddAction(Actions, aia_WaitXL, hwRound(Me^.X), 0, 0, 0) - else AddAction(Actions, aia_WaitXR, hwRound(Me^.X), 0, 0, 0); + else AddAction(Actions, aia_WaitXR, hwRound(Me^.X), 0, 0, 0); AddAction(Actions, Me^.Message, aim_release, 0, 0, 0); steps:= 0; if ((Me^.State and gstAttacked) = 0) then TestAmmos(Actions, Me); @@ -145,7 +144,6 @@ if (Me^.dX < 0) then AddAction(MadeActions, aia_WaitXL, hwRound(AltMe.X), 0, 0, 0) else AddAction(MadeActions, aia_WaitXR, hwRound(AltMe.X), 0, 0, 0); end; - if not CanGo then break; inc(steps); Actions.actions[Actions.Count - 2].Param:= hwRound(Me^.X); diff -r 2aed85310727 -r c75410fe3133 hedgewars/uAIAmmoTests.pas --- a/hedgewars/uAIAmmoTests.pas Fri Jan 26 22:36:21 2007 +0000 +++ b/hedgewars/uAIAmmoTests.pas Sat Jan 27 14:06:29 2007 +0000 @@ -20,19 +20,19 @@ interface uses SDLh, uGears, uConsts, uFloat; -(*function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; -function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; -function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; -function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; -function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; -function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; +function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; +(*function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; +function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; +function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; +function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; +function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; *) type TAmmoTestProc = function (Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; const AmmoTests: array[TAmmoType] of TAmmoTestProc = ( {amGrenade} nil,//TestGrenade, {amClusterBomb} nil, -{amBazooka} nil,//TestBazooka, +{amBazooka} @TestBazooka, {amUFO} nil, {amShotgun} nil,//TestShotgun, {amPickHammer} nil, @@ -54,37 +54,40 @@ implementation uses uMisc, uAIMisc, uLand; -{ + function Metric(x1, y1, x2, y2: integer): integer; begin -Result:= abs(x1 - x2) + abs(y1 - y2) +Metric:= abs(x1 - x2) + abs(y1 - y2) end; -function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; +function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; var Vx, Vy, r: hwFloat; rTime: hwFloat; Score, EX, EY: integer; + Result: integer; function CheckTrace: integer; var x, y, dX, dY: hwFloat; t: integer; + Result: integer; begin - x:= Me.X; - y:= Me.Y; + x:= Me^.X; + y:= Me^.Y; dX:= Vx; dY:= -Vy; - t:= trunc(rTime); + t:= hwRound(rTime); repeat x:= x + dX; y:= y + dY; dX:= dX + cWindSpeed; dY:= dY + cGravity; dec(t) - until TestColl(round(x), round(y), 5) or (t <= 0); - EX:= round(x); - EY:= round(y); - Result:= RateExplosion(Me, round(x), round(y), 101); - if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64 + until TestColl(hwRound(x), hwRound(y), 5) or (t <= 0); + EX:= hwRound(x); + EY:= hwRound(y); + Result:= RateExplosion(Me, EX, EY, 101); + if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, EX, EY) div 64; + CheckTrace:= Result end; begin @@ -93,28 +96,28 @@ ExplR:= 0; Result:= BadTurn; repeat - rTime:= rTime + 300 + Level * 50 + random * 200; - Vx:= - cWindSpeed * rTime / 2 + (Targ.X - Me.X) / rTime; - Vy:= cGravity * rTime / 2 - (Targ.Y - Me.Y) / rTime; - r:= sqr(Vx) + sqr(Vy); - if r <= 1 then + rTime:= rTime + 300 + Level * 50 + random(200); + Vx:= - cWindSpeed * rTime * _0_5 + (Targ.X - hwRound(Me^.X)) / rTime; + Vy:= cGravity * rTime * _0_5 - (Targ.Y - hwRound(Me^.Y)) / rTime; + r:= Distance(Vx, Vy); + if not (r > 1) then begin Score:= CheckTrace; if Result <= Score then begin - r:= sqrt(r); - Angle:= DxDy2AttackAngle(Vx, Vy) + rndSign(random((Level - 1) * 8)); - Power:= round(r * cMaxPower) - random((Level - 1) * 15 + 1); + Angle:= DxDy2AttackAngle(Vx, Vy) + AIrndSign(random((Level - 1) * 8)); + Power:= hwRound(r * cMaxPower) - random((Level - 1) * 15 + 1); ExplR:= 100; ExplX:= EX; ExplY:= EY; Result:= Score end; end -until (rTime >= 4500) +until (rTime > 4500); +TestBazooka:= Result end; - -function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; +{ +function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; const tDelta = 24; var Vx, Vy, r: hwFloat; Score, EX, EY: integer; @@ -167,7 +170,7 @@ until (TestTime = 5000) end; -function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; +function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; var Vx, Vy, x, y: hwFloat; begin ExplR:= 0; @@ -197,7 +200,7 @@ Result:= BadTurn end; -function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; +function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; var Vx, Vy, x, y, t: hwFloat; d: Longword; begin @@ -226,7 +229,7 @@ else Result:= Low(integer) end; -function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; +function TestBaseballBat(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; begin ExplR:= 0; if (Level > 2) and (abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) >= 25) then @@ -241,7 +244,7 @@ if Result <= 0 then Result:= BadTurn end; -function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; +function TestFirePunch(Me: PGear; Targ: TPoint; Level: Integer; var Time: Longword; var Angle, Power: integer; var ExplX, ExplY, ExplR: integer): integer; var i: integer; begin ExplR:= 0; diff -r 2aed85310727 -r c75410fe3133 hedgewars/uAIMisc.pas --- a/hedgewars/uAIMisc.pas Fri Jan 26 22:36:21 2007 +0000 +++ b/hedgewars/uAIMisc.pas Sat Jan 27 14:06:29 2007 +0000 @@ -44,7 +44,7 @@ function RateExplosion(Me: PGear; x, y, r: integer): integer; function RateShove(Me: PGear; x, y, r, power: integer): integer; function HHGo(Gear, AltGear: PGear; var GoInfo: TGoInfo): boolean; -//function rndSign(num: integer): integer; +function AIrndSign(num: integer): integer; var ThinkingHH: PGear; Targets: TTargets; @@ -346,7 +346,7 @@ if not TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then begin - Gear^.X:= Gear^.X + Gear^.dX; + Gear^.X:= Gear^.X + hwSign(Gear^.dX); inc(GoInfo.Ticks, cHHStepTicks) end; if not TestCollisionYwithGear(Gear, 1) then @@ -388,10 +388,10 @@ HHJump(AltGear, jmpHJump, GoInfo) end; -{function rndSign(num: integer): integer; +function AIrndSign(num: integer): integer; begin -if random(2) = 0 then Result:= num - else Result:= - num -end; } +if random(2) = 0 then AIrndSign:= num + else AIrndSign:= - num +end; end. diff -r 2aed85310727 -r c75410fe3133 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Fri Jan 26 22:36:21 2007 +0000 +++ b/hedgewars/uGears.pas Sat Jan 27 14:06:29 2007 +0000 @@ -557,7 +557,7 @@ gtCloud: DrawSprite(sprCloud , hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.State, Surface); gtAmmo_Bomb: DrawSprite(sprBomb , hwRound(Gear^.X) - 8 + WorldDx, hwRound(Gear^.Y) - 8 + WorldDy, hwRound(Gear^.DirAngle), Surface); gtHedgehog: DrawHH(Gear, Surface); - gtAmmo_Grenade: DrawSprite(sprGrenade , hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, DxDy2Angle32(Gear^.dY.QWordValue, Gear^.dX.QWordValue), Surface); + gtAmmo_Grenade: DrawSprite(sprGrenade , hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, DxDy2Angle32(Gear^.dY, Gear^.dX), Surface); gtHealthTag: if Gear^.Surf <> nil then DrawCentered(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Surf, Surface); gtGrave: DrawSpriteFromRect(PHedgehog(Gear^.Hedgehog)^.Team^.GraveRect, hwRound(Gear^.X) + WorldDx - 16, hwRound(Gear^.Y) + WorldDy - 16, 32, (GameTicks shr 7) and 7, Surface); gtUFO: DrawSprite(sprUFO, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, (GameTicks shr 7) mod 4, Surface); @@ -582,7 +582,7 @@ begin DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, hwRound(PHedgehog(Gear^.Hedgehog)^.Gear^.X) + WorldDx, hwRound(PHedgehog(Gear^.Hedgehog)^.Gear^.Y) + WorldDy); - DrawSprite(sprRopeHook, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, DxDy2Angle32(Gear^.dY.QWordValue, Gear^.dX.QWordValue), Surface); + DrawSprite(sprRopeHook, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, DxDy2Angle32(Gear^.dY, Gear^.dX), Surface); end; end; gtExplosion: DrawSprite(sprExplosion50, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.State, Surface); @@ -597,7 +597,7 @@ gtClusterBomb: DrawSprite(sprClusterBomb, hwRound(Gear^.X) - 8 + WorldDx, hwRound(Gear^.Y) - 8 + WorldDy, hwRound(Gear^.DirAngle), Surface); gtCluster: DrawSprite(sprClusterParticle, hwRound(Gear^.X) - 8 + WorldDx, hwRound(Gear^.Y) - 8 + WorldDy, 0, Surface); gtFlame: DrawSprite(sprFlame, hwRound(Gear^.X) - 8 + WorldDx, hwRound(Gear^.Y) - 8 + WorldDy,(GameTicks div 128 + Gear^.Angle) mod 8, Surface); - gtAirBomb: DrawSprite(sprAirBomb , hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, DxDy2Angle32(Gear^.dY.QWordValue, Gear^.dX.QWordValue), Surface); + gtAirBomb: DrawSprite(sprAirBomb , hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, DxDy2Angle32(Gear^.dY, Gear^.dX), Surface); gtAirAttack: DrawSprite(sprAirplane, hwRound(Gear^.X) - 60 + WorldDx, hwRound(Gear^.Y) - 25 + WorldDy, 0, Surface); end; Gear:= Gear^.NextGear diff -r 2aed85310727 -r c75410fe3133 hedgewars/uMisc.pas --- a/hedgewars/uMisc.pas Fri Jan 26 22:36:21 2007 +0000 +++ b/hedgewars/uMisc.pas Sat Jan 27 14:06:29 2007 +0000 @@ -92,8 +92,8 @@ procedure SDLTry(Assert: boolean; isFatal: boolean); function IntToStr(n: LongInt): shortstring; function FloatToStr(n: hwFloat): shortstring; -function DxDy2Angle32(const _dY, _dX: Extended): integer; -function DxDy2AttackAngle(const _dY, _dX: Extended): integer; +function DxDy2Angle32(const _dY, _dX: hwFloat): integer; +function DxDy2AttackAngle(const _dY, _dX: hwFloat): integer; procedure AdjustColor(var Color: Longword); {$IFDEF DEBUGFILE} procedure AddFileLog(s: shortstring); @@ -177,16 +177,26 @@ end; {$ENDIF} -function DxDy2Angle32(const _dY, _dX: Extended): integer; +function DxDy2Angle32(const _dY, _dX: hwFloat): integer; const _16divPI: Extended = 16/pi; +var dY, dX: Extended; begin -DxDy2Angle32:= trunc(arctan2(_dY, _dX) * _16divPI) and $1f +dY:= _dY.QWordValue / $100000000; +if _dY.isNegative then dY:= - dY; +dX:= _dX.QWordValue / $100000000; +if _dX.isNegative then dX:= - dX; +DxDy2Angle32:= trunc(arctan2(dY, dX) * _16divPI) and $1f end; -function DxDy2AttackAngle(const _dY, _dX: Extended): integer; +function DxDy2AttackAngle(const _dY, _dX: hwFloat): integer; const MaxAngleDivPI: Extended = cMaxAngle/pi; +var dY, dX: Extended; begin -DxDy2AttackAngle:= trunc(arctan2(_dY, _dX) * MaxAngleDivPI) mod cMaxAngle +dY:= _dY.QWordValue / $100000000; +if _dY.isNegative then dY:= - dY; +dX:= _dX.QWordValue / $100000000; +if _dX.isNegative then dX:= - dX; +DxDy2AttackAngle:= trunc(arctan2(dY, dX) * MaxAngleDivPI) mod cMaxAngle end; procedure SetKB(n: Longword);