/** * Durandal.java */ package rampancy_old; import rampancy_old.management.*; import rampancy_old.statistics.WeaponStatistic; import rampancy_old.util.*; import java.awt.geom.*; import java.awt.*; import java.awt.event.*; import java.awt.event.KeyEvent; import java.util.*; import robocode.*; import robocode.util.*; /** * Main class * * Durandal is a WaveSurfing, Guess Factor targeting megabot. * * @author Matthew Chun-Lum * */ public class Durandal extends RampantRobot { private static EnemyManager enemyManager = new EnemyManager(); private static WaveManager waveManager = new WaveManager(); private static StatisticsManager statsManager = new StatisticsManager(); private static MovementManager movementManager = new MovementManager(); private static TargetingManager targetingManager = new TargetingManager(); private Point2D.Double location; private static boolean willPaintWaves = false; private static boolean willPaintMovement = false; /** * Run method. Invoked at the start of every round. */ public void run() { updateLocation(); setInitialState(); while(getRadarTurnRemainingRadians() == 0) { turnRadarRightRadians(Constants.MAX_RADAR_TRACKING_AMOUNT); } } /** * Invoked when we scan another robot */ public void onScannedRobot(ScannedRobotEvent e) { focusRadar(e); updateLocation(); EnemyRobot enemy = enemyManager.processScannedRobotEvent(e); waveManager.update(); if(enemy != null) { movementManager.updateCurrentState(enemy); movementManager.computeNextMove(enemy); targetingManager.targetEnemy(enemy); } } /** * Invoked when Durandal is hit by a bullet */ public void onHitByBullet(HitByBulletEvent e) { waveManager.processHitEvent(e); } public void onBulletHit(BulletHitEvent e) { WeaponStatistic stat = statsManager.getWeaponStatsForEnemy(e.getName()); if(stat != null) { stat.getGFGunStats().noteShotHit(); } } /** * If there's a skipped turn, print it out to the console */ public void onSkippedTurn(SkippedTurnEvent e) { System.out.println("Skipped turn! " + e.getTime()); } /** * Invoked if Durandal wins a round */ public void onBattleEnded(BattleEndedEvent e) { statsManager.printBattleStats(); } /** * Invoked when the paint option is enabled */ public void onPaint(Graphics2D g) { if(willPaintWaves) waveManager.draw(g); } /** * Handles key typed events (used for debugging) * @param e */ public void onKeyReleased(KeyEvent e) { switch(e.getKeyCode()) { case KeyEvent.VK_W: willPaintWaves = !willPaintWaves; } } // --------- Private Helpers ---------- // /* * Sets the initial state of Durandal and Durandal's managers */ private void setInitialState() { setColors(Color.black, Color.cyan, Color.green, Color.white, Color.blue); movementManager.setInitialState(this, getBattleFieldWidth(), getBattleFieldHeight()); targetingManager.setInitialState(this); targetingManager.addListener(waveManager); enemyManager.setInitialState(this); waveManager.setInitialState(this); statsManager.setInitialState(this); setAdjustGunForRobotTurn(true); setAdjustRadarForGunTurn(true); noteMaxVelocity(8.0); } /* * Updates Durandal's location */ private void updateLocation() { location = new Point2D.Double(getX(), getY()); } /** * Credit: Voidious * Focuses the radar * @param e */ private void focusRadar(ScannedRobotEvent e) { double factor = 2; if(getOthers() > 1) { // cause Durandal to occasionally lose the lock. factor = 0.2; } double radarBearingOffset = Utils.normalRelativeAngle(getRadarHeadingRadians() - (e.getBearingRadians() + getHeadingRadians())); setTurnRadarLeftRadians(radarBearingOffset + (Util.nonZeroSign(radarBearingOffset) * (Constants.MAX_RADAR_TRACKING_AMOUNT / factor))); } // ------------- Getters and Setters ------------ // /** * @return a reference to the wave manager */ public WaveManager getWaveManager() { return waveManager; } /** * @return a reference to the statistics manager */ public StatisticsManager getStatisticsManager() { return statsManager; } /** * @return a reference to the enemy manager */ public EnemyManager getEnemyManager() { return enemyManager; } /** * @return a reference to the movement manager */ public MovementManager getMovementManager() { return movementManager; } /** * @return a reference to the targeting manager */ public TargetingManager getTargetingManager() { return targetingManager; } /** * @return Durandal's current location */ public Point2D.Double getLocation() { return location; } /** * @return a String representation of Durandal */ public String toString() { return "Durandal"; } }