public void enemyPosition(ScannedRobotEvent e, double x, double y) { // poll subtargetters for their opinions virtualBulletTick++; lastEnemyScanTime = owner.getTime(); // only log it when we actually fire: the enemy may respond to that if (owner.shouldFireShot(e)) { double bulletPower = e.getDistance() > 500.0 ? 2.0 : 3.0; for (int i = 0; i < numVirtualGuns; i++) { double angle = targetters[i].target(e, bulletPower); VirtualBullet bullet = new VirtualBullet(); bullet.targetter = i; bullet.x = owner.getX(); bullet.y = owner.getY(); bullet.velX = Targetting.bulletSpeed(bulletPower) * Math.sin(angle); bullet.velY = Targetting.bulletSpeed(bulletPower) * Math.cos(angle); bullet.lastUpdateTime = lastEnemyScanTime; virtualBullets.add(bullet); } } for (int i = 0; i < numVirtualGuns; i++) { targetters[i].enemyPosition(e, x, y); } enemyX = x; enemyY = y; }
public void update() { // update all the virtual bullets double battleFieldX = owner.getBattleFieldWidth(); double battleFieldY = owner.getBattleFieldHeight(); for (int i = 0; i < virtualBullets.size(); i++) { VirtualBullet bullet = virtualBullets.get(i); long dt = lastEnemyScanTime - bullet.lastUpdateTime; if (dt <= 0) continue; bullet.x += bullet.velX * dt; bullet.y += bullet.velY * dt; bullet.lastUpdateTime = lastEnemyScanTime; if (bullet.x > battleFieldX || bullet.y > battleFieldY || bullet.x < 0.0 || bullet.y < 0.0) { // missed virtualBullets.remove(i); i--; } else if (Point2D.Double.distance(bullet.x, bullet.y, enemyX, enemyY) < 30.0) { // log in array successes[bullet.targetter]++; // hit! virtualBullets.remove(i); i--; } } owner.setDebugProperty("VGVBCount", "" + virtualBullets.size()); owner.setDebugProperty( "VGHits", "circ=" + successes[0] + " naive=" + successes[1] + " linear=" + successes[2] + " rc=" + successes[3] + " rN=" + successes[4] + " rW=" + successes[5]); for (int i = 0; i < numVirtualGuns; i++) { targetters[i].update(); } }