private void chargeShieldsCode() throws GameActionException { if (DataCache.numEnemyRobots > 0) { nextSoldierState = SoldierState.PUSHING; pushingCode(); } else { if (!ourNukeHalfDone && enemyNukeHalfDone) { nextSoldierState = SoldierState.ALL_IN; allInCode(); } else { // either charge up shields next to the shields encampment, or wait at another location // until there is space // MapLocation shieldQueueLocation = rallyPoint; // find an empty space next to the shields encampment int distanceSquaredToShields = rc.getLocation().distanceSquaredTo(shieldLocation); if (distanceSquaredToShields > 2) { // not charging yet for (int i = 8; --i >= 0; ) { // Check to see if it's empty MapLocation iterLocation = shieldLocation.add(DataCache.directionArray[i]); if (rc.senseObjectAtLocation(iterLocation) == null) { // Oh, there's an empty space! let's go to it NavSystem.goToLocation(iterLocation); return; } } // we found the shields encampment, but there are no empty spaces, so wait at the queue // location // NavSystem.goToLocation(EncampmentJobSystem.shieldsQueueLoc); NavSystem.goToLocation(shieldQueueLocation); } else { // already charging mineDensity = rc.senseMineLocations(findMidPoint(), rSquared, Team.NEUTRAL).length / (3.0 * rSquared); shieldsCutoff = (int) (DataCache.rushDist + 5 * (mineDensity * DataCache.rushDist)) + 50; // rc.setIndicatorString(1, "cutoff: " + Integer.toString(shieldsCutoff)); if (rc.getShields() > shieldsCutoff) { // leave if (!ourNukeHalfDone && enemyNukeHalfDone) { nextSoldierState = SoldierState.ALL_IN; allInCode(); } else { nextSoldierState = SoldierState.RALLYING; rallyingCode(); } } } } } }
public void rallyingCode() throws GameActionException { if (enemyNukeHalfDone && !ourNukeHalfDone) { // nextSoldierState = SoldierState.ALL_IN; // allInCode(); // charge up if (shieldExists()) { nextSoldierState = SoldierState.CHARGE_SHIELDS; chargeShieldsCode(); } else { nextSoldierState = SoldierState.ALL_IN; allInCode(); } } else { // int hqPowerLevel2 = Integer.MAX_VALUE; // Message message2 = BroadcastSystem.read(powerChannel); // if (message2.isValid) { // hqPowerLevel2 = message2.body; // } else { // hqPowerLevel2 = (int) rc.getTeamPower(); // } int genCount = Integer.MAX_VALUE; Message message = BroadcastSystem.read(genCountChannel); if (message.isValid) { genCount = message.body; } // If there are enemies nearby, trigger FIGHTING SoldierState if (DataCache.numEnemyRobots > 0) { nextSoldierState = SoldierState.FIGHTING; fightingCode(); // } else if (hqPowerLevel2 < 10*(1+DataCache.numAlliedEncampments) || hqPowerLevel2 < // 100) { } else if (DataCache.numAlliedSoldiers >= (40 + 10 * genCount) / 1.5) { nextSoldierState = SoldierState.PUSHING; pushingCode(); } else { mineDensity = rc.senseMineLocations(findMidPoint(), rSquared, Team.NEUTRAL).length / (3.0 * rSquared); shieldsCutoff = (int) (DataCache.rushDist + 5 * (mineDensity * DataCache.rushDist)) + 50; if (rc.getShields() < shieldsCutoff - 50 && shieldExists()) { // not enough shields nextSoldierState = SoldierState.CHARGE_SHIELDS; chargeShieldsCode(); } else { boolean layedMine = false; if (rc.senseMine(currentLocation) == null) { if (rc.isActive() && Util.Random() < 0.1) { rc.layMine(); layedMine = true; } } if (!layedMine) { NavSystem.goToLocation(rallyPoint); } } } } }
public void clearOutHQMinesCode() throws GameActionException { // Clear out a path to the HQ Team mineTeam1 = rc.senseMine(rc.getLocation()); if (mineTeam1 == null || mineTeam1 == rc.getTeam() && rc.getLocation().distanceSquaredTo(DataCache.ourHQLocation) > 2) { NavSystem.goToLocation(DataCache.ourHQLocation); } else { // We're done if (strategy == Strategy.NUKE) { nextSoldierState = SoldierState.FINDING_START_MINE_POSITIONS; findingStartMinePositionsCode(); } else { nextSoldierState = SoldierState.RALLYING; rallyingCode(); } } }
public void miningCode() throws GameActionException { int hqPowerLevel = Integer.MAX_VALUE; Message message = BroadcastSystem.read(powerChannel); if (message.isValid) { hqPowerLevel = message.body; } else { hqPowerLevel = (int) rc.getTeamPower(); } if (DataCache.numEnemyRobots > 0 && strategy != Strategy.NUKE) { // nextSoldierState = SoldierState.FIGHTING; // fightingCode(); if (shieldExists()) { nextSoldierState = SoldierState.CHARGE_SHIELDS; chargeShieldsCode(); } else { // nextSoldierState = SoldierState.RALLYING; // rallyingCode(); if (Clock.getRoundNum() < 200) { nextSoldierState = SoldierState.PUSHING; pushingCode(); } else { nextSoldierState = SoldierState.RALLYING; rallyingCode(); } } } else if (strategy == Strategy.NUKE && DataCache.numEnemyRobots > 1) { // nextSoldierState = SoldierState.FIGHTING; // fightingCode(); if (shieldExists()) { nextSoldierState = SoldierState.CHARGE_SHIELDS; chargeShieldsCode(); } else { // nextSoldierState = SoldierState.RALLYING; // rallyingCode(); if (Clock.getRoundNum() < 200) { nextSoldierState = SoldierState.PUSHING; pushingCode(); } else { nextSoldierState = SoldierState.RALLYING; rallyingCode(); } } } else if (strategy == Strategy.NUKE && DataCache.numEnemyRobots == 1) { Robot[] enemyRobots = rc.senseNearbyGameObjects(Robot.class, 14, rc.getTeam().opponent()); if (enemyRobots.length == 1) { RobotInfo rinfo = rc.senseRobotInfo(enemyRobots[0]); NavSystem.goToLocation(rinfo.location); } else { miningSubroutine(); } } else if (strategy != Strategy.NUKE && (hqPowerLevel < 10 * (1 + DataCache.numAlliedEncampments) || hqPowerLevel < 100)) { // nextSoldierState = SoldierState.PUSHING; // pushingCode(); if (shieldExists()) { nextSoldierState = SoldierState.CHARGE_SHIELDS; chargeShieldsCode(); } } else { miningSubroutine(); } }