public void fireWave(boolean isFiringWave) { int timeSinceEnemyFired = (int) ScanLog.getLastFireOffset(); double bulletPower = ScanLog.getLastEnemyBulletPower(); try { Point2D.Double myTargetLocation = ScanLog.getLocation(timeSinceEnemyFired); Point2D.Double enemyFireLocation = ScanLog.getEnemyLocation(timeSinceEnemyFired); BotScan enemySegmentationScan = ScanLog.getEnemyScan(timeSinceEnemyFired + 1); Wave enemyWave = new Wave( enemySegmentationScan, enemyFireLocation, myTargetLocation, _robot.getTime() - timeSinceEnemyFired, isFiringWave ? Wave.FIRING_WAVE : Wave.NON_FIRING_WAVE, enemySegmentationScan.getAbsBearingRadians(), bulletPower, "Surf Wave", Wave.TRADITIONAL_MAX_ESCAPE_ANGLE, enemySegmentationScan.getHeadingRadians(), enemySegmentationScan.getVelocity(), _lastEnemyWaveOrientation, SURF_ORIENTATION_VELOCITY_THRESHOLD); _waves.add(enemyWave); _lastEnemyWaveOrientation = enemyWave.orientation; } catch (IndexOutOfBoundsException noScanDataYet) { } }