private static void broadcastingAttack(RobotController rc, RobotInfo enemy)
     throws GameActionException {
   if (enemy.health <= RobotType.SOLDIER.attackPower) {
     if (enemy.type == RobotType.ZOMBIEDEN) {
       rc.attackLocation(enemy.location);
       Message.sendBasicGivenRange(rc, Message.FULL_MAP_RANGE);
       denLocations.remove(enemy.location);
       nearestDenLocation = denLocations.getClosest(myLoc);
     } else {
       rc.attackLocation(enemy.location);
     }
   } else {
     rc.attackLocation(enemy.location);
   }
 }
 private static void removeTurretLocations(RobotController rc) throws GameActionException {
   MapLocation[] removedLocations = new MapLocation[turretLocations.size()];
   int removedLength = 0;
   for (MapLocation location : turretLocations) {
     if (rc.canSenseLocation(location)) {
       RobotInfo info = rc.senseRobotAtLocation(location);
       if (info == null) {
         removedLocations[removedLength++] = location;
       } else if (info.team != enemyTeam
           || (info.team == enemyTeam && info.type != RobotType.TURRET)) {
         removedLocations[removedLength++] = location;
       }
     }
   }
   for (int i = 0; i < removedLength; i++) {
     turretLocations.remove(removedLocations[i]);
   }
 }
 // reads the message signals and sets the nearestTurretLocation and currentDestination static
 // variables
 public static void readMessages(RobotController rc) {
   List<Message> messages = Message.readMessageSignals(rc);
   // we want to loop through each message and get the ones that are relevant to the soldier
   distressedArchonTurns++;
   for (Message m : messages) {
     // if the message is a turret, try to get the nearest turret location
     if (m.type == Message.TURRET) {
       turretLocations.add(m.location);
       if (nearestTurretLocation == null) {
         nearestTurretLocation = m.location;
       } else if (myLoc.distanceSquaredTo(m.location)
           < myLoc.distanceSquaredTo(nearestTurretLocation)) {
         nearestTurretLocation = m.location;
       }
     } else
     // if the message is to remove a turret, and if it's our nearestTurret, remove it
     if (m.type == Message.TURRETKILLED) {
       turretLocations.remove(m.location);
       // Compute the new closest turret
       if (m.location.equals(nearestTurretLocation)) {
         nearestTurretLocation = turretLocations.getClosest(myLoc);
       }
     } else
     // if the message is an enemy, get the closet one
     if (m.type == Message.ENEMY) {
       if (nearestEnemyLocation == null) {
         nearestEnemyLocation = m.location;
       } else if (myLoc.distanceSquaredTo(m.location)
           < myLoc.distanceSquaredTo(nearestEnemyLocation)) {
         nearestEnemyLocation = m.location;
       }
     } else
     // if the message is a den, get the closest one
     if (m.type == Message.ZOMBIEDEN) {
       denLocations.add(m.location);
       if (nearestDenLocation == null) {
         nearestDenLocation = m.location;
       } else if (myLoc.distanceSquaredTo(m.location)
           < myLoc.distanceSquaredTo(nearestDenLocation)) {
         nearestDenLocation = m.location;
       }
     } else
     // if zombie killed message, then recompute the nearest den and remove den location.
     if (m.type == Message.ZOMBIEDENKILLED) {
       denLocations.remove(m.location);
       if (m.location.equals(nearestDenLocation)) {
         nearestDenLocation = denLocations.getClosest(myLoc);
       }
     } else
     // if the message is an archon location, store the nearest current archon location
     if (m.type == Message.ARCHONLOC) {
       if (newArchonLoc == null) {
         newArchonLoc = m.location;
       } else if (myLoc.distanceSquaredTo(m.location) < myLoc.distanceSquaredTo(newArchonLoc)) {
         newArchonLoc = m.location;
       }
     } else
     // if we get a rush signal, we want to rush towards the nearest turret
     if (m.type == Message.RUSH) {
       MapLocation closestTurret = turretLocations.getClosest(myLoc);
       if (closestTurret != null) {
         if (myLoc.distanceSquaredTo(closestTurret) <= 400) {
           rush = true;
           rushLocation = closestTurret;
         }
       }
     } else
     // if we get an archon in distressed signal, needs to take priority
     if (m.type == Message.ARCHONINDANGER) {
       distressedArchonTurns = 0;
       if (nearestDistressedArchon == null) {
         nearestDistressedArchon = m.location;
       } else if (myLoc.distanceSquaredTo(m.location)
           < myLoc.distanceSquaredTo(nearestDistressedArchon)) {
         nearestDistressedArchon = m.location;
       }
     } else
     // if we get a basic message, then remove the closest den location
     if (m.type == Message.BASIC) {
       MapLocation reference = m.signal.getLocation();
       MapLocation closestDen = denLocations.getClosest(reference);
       denLocations.remove(closestDen);
       nearestDenLocation = denLocations.getClosest(myLoc);
     }
   }
   // if we actually have a destination, set it to currentDestination
   setCurrentDestination(rc);
 }