51 function TestBaseballBat(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
51 function TestBaseballBat(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
52 function TestFirePunch(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
52 function TestFirePunch(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
53 function TestWhip(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
53 function TestWhip(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
54 function TestKamikaze(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
54 function TestKamikaze(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
55 function TestAirAttack(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
55 function TestAirAttack(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
|
56 function TestDrillStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
56 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
57 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
57 function TestHammer(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
58 function TestHammer(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
58 function TestCake(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
59 function TestCake(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
59 function TestDynamite(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
60 function TestDynamite(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
60 function TestMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
61 function TestMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
116 (proc: @TestShotgun; flags: 0), // amSineGun |
117 (proc: @TestShotgun; flags: 0), // amSineGun |
117 (proc: nil; flags: 0), // amFlamethrower |
118 (proc: nil; flags: 0), // amFlamethrower |
118 (proc: @TestGrenade; flags: 0), // amSMine |
119 (proc: @TestGrenade; flags: 0), // amSMine |
119 (proc: @TestHammer; flags: amtest_NoTarget), // amHammer |
120 (proc: @TestHammer; flags: amtest_NoTarget), // amHammer |
120 (proc: nil; flags: 0), // amResurrector |
121 (proc: nil; flags: 0), // amResurrector |
121 (proc: nil; flags: 0), // amDrillStrike |
122 (proc: @TestDrillStrike; flags: amtest_Rare), // amDrillStrike |
122 (proc: nil; flags: 0), // amSnowball |
123 (proc: nil; flags: 0), // amSnowball |
123 (proc: nil; flags: 0), // amTardis |
124 (proc: nil; flags: 0), // amTardis |
124 (proc: nil; flags: 0), // amLandGun |
125 (proc: nil; flags: 0), // amLandGun |
125 (proc: nil; flags: 0), // amIceGun |
126 (proc: nil; flags: 0), // amIceGun |
126 (proc: nil; flags: 0), // amKnife |
127 (proc: nil; flags: 0), // amKnife |
1304 if valueResult <= 0 then |
1305 if valueResult <= 0 then |
1305 valueResult:= BadTurn; |
1306 valueResult:= BadTurn; |
1306 TestAirAttack:= valueResult; |
1307 TestAirAttack:= valueResult; |
1307 end; |
1308 end; |
1308 |
1309 |
|
1310 function TestDrillStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
|
1311 const cShift = 4; |
|
1312 var bombsSpeed, X, Y, dX, dY, drillX, drillY: real; |
|
1313 t2: real; |
|
1314 b: array[0..9] of boolean; |
|
1315 dmg: array[0..9] of LongInt; |
|
1316 fexit, collided: boolean; |
|
1317 i, t, value, valueResult, attackTime, drillTimer, targetX: LongInt; |
|
1318 begin |
|
1319 Flags:= Flags; // avoid compiler hint |
|
1320 ap.ExplR:= 0; |
|
1321 if (Level > 3) or (cGravityf = 0) then |
|
1322 exit(BadTurn); |
|
1323 |
|
1324 ap.Angle:= 0; |
|
1325 targetX:= Targ.Point.X; |
|
1326 ap.AttackPutY:= Targ.Point.Y; |
|
1327 |
|
1328 bombsSpeed:= hwFloat2Float(cBombsSpeed); |
|
1329 X:= Targ.Point.X - 135 - cShift; // hh center - cShift |
|
1330 X:= X - bombsSpeed * sqrt(((Targ.Point.Y + 128) * 2) / cGravityf); |
|
1331 Y:= -128; |
|
1332 dX:= bombsSpeed; |
|
1333 dY:= 0; |
|
1334 |
|
1335 valueResult:= 0; |
|
1336 |
|
1337 attackTime:= 0; |
|
1338 while attackTime <= 4000 do |
|
1339 begin |
|
1340 inc(attackTime, 1000); |
|
1341 value:= 0; |
|
1342 for i:= 0 to 9 do |
|
1343 begin |
|
1344 b[i]:= true; |
|
1345 dmg[i]:= 0 |
|
1346 end; |
|
1347 |
|
1348 repeat |
|
1349 X:= X + dX; |
|
1350 Y:= Y + dY; |
|
1351 dY:= dY + cGravityf; |
|
1352 fexit:= true; |
|
1353 |
|
1354 for i:= 0 to 9 do |
|
1355 if b[i] then |
|
1356 begin |
|
1357 fexit:= false; |
|
1358 collided:= false; |
|
1359 drillX:= trunc(X) + LongWord(i * 30); |
|
1360 drillY:= trunc(Y); |
|
1361 // Collided with land ... simulate drilling |
|
1362 if TestCollExcludingObjects(trunc(drillX), trunc(drillY), 4) and |
|
1363 (Abs(Targ.Point.X - trunc(X)) + Abs(Targ.Point.Y - trunc(Y)) > 21) then |
|
1364 begin |
|
1365 drillTimer := attackTime; |
|
1366 t2 := 0.5 / sqrt(sqr(dX) + sqr(dY)); |
|
1367 dX := dX * t2; |
|
1368 dY := dY * t2; |
|
1369 repeat |
|
1370 drillX:= drillX + dX; |
|
1371 drillY:= drillY + dY; |
|
1372 dec(drillTimer, 10); |
|
1373 until (Abs(Targ.Point.X - drillX) + Abs(Targ.Point.Y - drillY) < 22) |
|
1374 or (drillX < 0) |
|
1375 or (drillY < 0) |
|
1376 or (trunc(drillX) > LAND_WIDTH) |
|
1377 or (trunc(drillY) > LAND_HEIGHT) |
|
1378 // TODO: Simulate falling again when rocket has left terrain again |
|
1379 or (drillTimer <= 0); |
|
1380 collided:= true; |
|
1381 end |
|
1382 // Collided with something else ... record collision |
|
1383 else if TestColl(trunc(drillX), trunc(drillY), 4) then |
|
1384 collided:= true; |
|
1385 |
|
1386 // Simulate explosion |
|
1387 if collided then |
|
1388 begin |
|
1389 b[i]:= false; |
|
1390 dmg[i]:= RateExplosion(Me, trunc(drillX), trunc(drillY), 58); |
|
1391 // 58 (instead of 60) for better prediction (hh moves after explosion of one of the rockets) |
|
1392 end; |
|
1393 end; |
|
1394 until fexit or (Y > cWaterLine); |
|
1395 |
|
1396 for i:= 0 to 5 do |
|
1397 if dmg[i] <> BadTurn then |
|
1398 inc(value, dmg[i]); |
|
1399 t:= value; |
|
1400 targetX:= Targ.Point.X - 60; |
|
1401 |
|
1402 for i:= 0 to 3 do |
|
1403 if dmg[i] <> BadTurn then |
|
1404 begin |
|
1405 dec(t, dmg[i]); |
|
1406 inc(t, dmg[i + 6]); |
|
1407 if t > value then |
|
1408 begin |
|
1409 value:= t; |
|
1410 targetX:= Targ.Point.X - 30 - cShift + i * 30 |
|
1411 end |
|
1412 end; |
|
1413 |
|
1414 if value > valueResult then |
|
1415 begin |
|
1416 valueResult:= value; |
|
1417 ap.AttackPutX:= targetX; |
|
1418 ap.Time:= attackTime; |
|
1419 end; |
|
1420 end; |
|
1421 |
|
1422 if valueResult <= 0 then |
|
1423 valueResult:= BadTurn |
|
1424 else |
|
1425 begin |
|
1426 // Weaker AI has chance to get the time wrong by 1-3 seconds |
|
1427 if Level = 5 then |
|
1428 // +/- 3 seconds |
|
1429 ap.Time:= ap.Time + (3 - random(7)) * 1000 |
|
1430 else if Level = 4 then |
|
1431 // +/- 2 seconds |
|
1432 ap.Time:= ap.Time + (2 - random(5)) * 1000 |
|
1433 else if Level = 3 then |
|
1434 // +/- 1 second |
|
1435 if (random(2) = 0) then |
|
1436 ap.Time:= ap.Time + (1 - random(3)) * 1000 |
|
1437 else if Level = 2 then |
|
1438 // 50% chance for +/- 1 second |
|
1439 if (random(2) = 0) then |
|
1440 ap.Time:= ap.Time + (1 - random(3)) * 1000; |
|
1441 ap.Time:= Min(5000, Max(1000, ap.Time)); |
|
1442 end; |
|
1443 |
|
1444 TestDrillStrike:= valueResult; |
|
1445 end; |
1309 |
1446 |
1310 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
1447 function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; |
1311 var |
1448 var |
1312 i, failNum: longword; |
1449 i, failNum: longword; |
1313 maxTop: longword; |
1450 maxTop: longword; |