2 interface |
2 interface |
3 uses SDLh, uGears, uConsts; |
3 uses SDLh, uGears, uConsts; |
4 |
4 |
5 function TestBazooka(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer; |
5 function TestBazooka(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer; |
6 function TestGrenade(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer; |
6 function TestGrenade(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer; |
|
7 function TestShotgun(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer; |
7 |
8 |
8 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer; |
9 type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer; |
9 const AmmoTests: array[TAmmoType] of TAmmoTestProc = |
10 const AmmoTests: array[TAmmoType] of TAmmoTestProc = |
10 ( |
11 ( |
11 {amGrenade} TestGrenade, |
12 {amGrenade} TestGrenade, |
12 {amBazooka} TestBazooka, |
13 {amBazooka} TestBazooka, |
13 {amUFO} nil, |
14 {amUFO} nil, |
14 {amShotgun} nil, |
15 {amShotgun} TestShotgun, |
15 {amPickHammer} nil, |
16 {amPickHammer} nil, |
16 {amSkip} nil, |
17 {amSkip} nil, |
17 {amRope} nil, |
18 {amRope} nil, |
18 {amMine} nil, |
19 {amMine} nil, |
19 {amDEagle} nil, |
20 {amDEagle} nil, |
20 {amDynamite} nil |
21 {amDynamite} nil |
21 ); |
22 ); |
22 |
23 |
23 implementation |
24 implementation |
24 uses uMisc, uAIMisc; |
25 uses uMisc, uAIMisc; |
|
26 const BadTurn = Low(integer); |
25 |
27 |
26 function Metric(x1, y1, x2, y2: integer): integer; |
28 function Metric(x1, y1, x2, y2: integer): integer; |
27 begin |
29 begin |
28 Result:= abs(x1 - x2) + abs(y1 - y2) |
30 Result:= abs(x1 - x2) + abs(y1 - y2) |
29 end; |
31 end; |
47 y:= y + dY; |
49 y:= y + dY; |
48 dX:= dX + cWindSpeed; |
50 dX:= dX + cWindSpeed; |
49 dY:= dY + cGravity; |
51 dY:= dY + cGravity; |
50 dec(t) |
52 dec(t) |
51 until TestColl(round(x), round(y), 5) or (t <= 0); |
53 until TestColl(round(x), round(y), 5) or (t <= 0); |
52 Result:= RateExplosion(Me, round(x), round(y), 101) - Metric(Targ.X, Targ.Y, round(x), round(y)) div 16 |
54 Result:= RateExplosion(Me, round(x), round(y), 101); |
|
55 if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64 |
53 end; |
56 end; |
54 |
57 |
55 begin |
58 begin |
56 Time:= 0; |
59 Time:= 0; |
57 rTime:= 10; |
60 rTime:= 10; |
58 Result:= Low(integer); |
61 Result:= BadTurn; |
59 repeat |
62 repeat |
60 rTime:= rTime + 100 + random*250; |
63 rTime:= rTime + 100 + random*250; |
61 Vx:= - cWindSpeed * rTime / 2 + (Targ.X - Me.X) / rTime; |
64 Vx:= - cWindSpeed * rTime / 2 + (Targ.X - Me.X) / rTime; |
62 Vy:= cGravity * rTime / 2 - (Targ.Y - Me.Y) / rTime; |
65 Vy:= cGravity * rTime / 2 - (Targ.Y - Me.Y) / rTime; |
63 r:= sqr(Vx) + sqr(Vy); |
66 r:= sqr(Vx) + sqr(Vy); |
98 if t < 50 then Result:= RateExplosion(Me, round(x), round(y), 101) |
101 if t < 50 then Result:= RateExplosion(Me, round(x), round(y), 101) |
99 else Result:= Low(integer) |
102 else Result:= Low(integer) |
100 end; |
103 end; |
101 |
104 |
102 begin |
105 begin |
103 Result:= Low(integer); |
106 Result:= BadTurn; |
104 TestTime:= 0; |
107 TestTime:= 0; |
105 repeat |
108 repeat |
106 inc(TestTime, 1000); |
109 inc(TestTime, 1000); |
107 Vx:= (Targ.X - Me.X) / (TestTime + tDelta); |
110 Vx:= (Targ.X - Me.X) / (TestTime + tDelta); |
108 Vy:= cGravity*((TestTime + tDelta) div 2) - (Targ.Y - Me.Y) / (TestTime + tDelta); |
111 Vy:= cGravity*((TestTime + tDelta) div 2) - (Targ.Y - Me.Y) / (TestTime + tDelta); |
109 r:= sqr(Vx) + sqr(Vy); |
112 r:= sqr(Vx) + sqr(Vy); |
110 if r <= 1 then |
113 if r <= 1 then |
111 begin |
114 begin |
112 Score:= CheckTrace; |
115 Score:= CheckTrace; |
113 if Result <= Score then |
116 if Result < Score then |
114 begin |
117 begin |
115 r:= sqrt(r); |
118 r:= sqrt(r); |
116 Angle:= DxDy2AttackAngle(Vx, Vy); |
119 Angle:= DxDy2AttackAngle(Vx, Vy); |
117 Power:= round(r * cMaxPower); |
120 Power:= round(r * cMaxPower); |
118 Time:= TestTime; |
121 Time:= TestTime; |
120 end; |
123 end; |
121 end |
124 end |
122 until (TestTime = 5000) |
125 until (TestTime = 5000) |
123 end; |
126 end; |
124 |
127 |
|
128 function TestShotgun(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer): integer; |
|
129 var Vx, Vy, x, y: real; |
|
130 begin |
|
131 if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then |
|
132 begin |
|
133 Result:= BadTurn; |
|
134 exit |
|
135 end; |
|
136 Time:= 0; |
|
137 Power:= 1; |
|
138 Vx:= (Targ.X - Me.X)/1024; |
|
139 Vy:= (Targ.Y - Me.Y)/1024; |
|
140 x:= Me.X; |
|
141 y:= Me.Y; |
|
142 Angle:= DxDy2AttackAngle(Vx, -Vy); |
|
143 repeat |
|
144 x:= x + vX; |
|
145 y:= y + vY; |
|
146 if TestColl(round(x), round(y), 2) then |
|
147 begin |
|
148 Result:= RateExplosion(Me, round(x), round(y), 25) * 2; |
|
149 if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, round(x), round(y)) div 64; |
|
150 exit |
|
151 end |
|
152 until (abs(Targ.X - x) + abs(Targ.Y - y) < 4) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024); |
|
153 Result:= BadTurn |
|
154 end; |
|
155 |
125 end. |
156 end. |