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 allInCode() throws GameActionException { if (DataCache.numEnemyRobots > 0) { // aggressiveMicroCode(); microCode(); } else { int genCount = Integer.MAX_VALUE; Message message = BroadcastSystem.read(genCountChannel); if (message.isValid) { genCount = message.body; } // if (DataCache.numAlliedSoldiers >= (40 + 10 * genCount)/1.5) { pushCodeGetCloser(); // } } }
public SoldierRobot(RobotController rc) throws GameActionException { super(rc); NavSystem.init(this); if (Clock.getRoundNum() < 10) { soldierState = soldierState.SCOUTING; } else { ChannelType channel = EncampmentJobSystem.findJob(); if (channel != null) { unassigned = false; EncampmentJobSystem.updateJobTaken(); } // TODO: this will f**k up if we ever build artillery for non-nuke bots // LEARN THE STRATEGY Message message = BroadcastSystem.read(ChannelType.STRATEGY); if (message.isValid && message.body < Strategy.values().length && message.body >= 0) { strategy = Strategy.values()[message.body]; } else { // we couldn't read the strategy channel MapLocation[] alliedEncampmentSquares = rc.senseAlliedEncampmentSquares(); if (alliedEncampmentSquares.length == 0) { strategy = Strategy.ECON; } else { Robot robot = (Robot) rc.senseObjectAtLocation(alliedEncampmentSquares[0]); RobotInfo robotInfo = rc.senseRobotInfo(robot); if (robotInfo.type == RobotType.ARTILLERY) { strategy = Strategy.NUKE; } else { strategy = Strategy.ECON; } } } // rc.setIndicatorString(2, strategy.toString()); rallyPoint = findRallyPoint(); rSquared = DataCache.rushDistSquared / 4; initializeMining(); } }
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(); } }
@Override public void run() { try { rc.setIndicatorString(0, soldierState.toString()); DataCache.updateRoundVariables(); currentLocation = rc.getLocation(); // LEAVE THIS HERE UNDER ALL CIRCUMSTANCES if (unassigned) { // If this is not an encampment worker // Check if our nuke is half done if (!ourNukeHalfDone) { Message message = BroadcastSystem.read(ChannelType.OUR_NUKE_HALF_DONE); if (message.isValid && message.body == 1) { ourNukeHalfDone = true; } } // Check if enemy nuke is half done if (!enemyNukeHalfDone) { Message message = BroadcastSystem.read(ChannelType.ENEMY_NUKE_HALF_DONE); if (message.isValid && message.body == 1) { enemyNukeHalfDone = true; } } if (enemyNukeHalfDone && !ourNukeHalfDone && soldierState != SoldierState.ALL_IN) { // soldierState = SoldierState.ALL_IN; soldierState = SoldierState.CHARGE_SHIELDS; } switch (soldierState) { case NEW: newCode(); break; case FINDING_START_MINE_POSITIONS: findingStartMinePositionsCode(); break; case CHARGE_SHIELDS: if (shieldExists()) { chargeShieldsCode(); } else { nextSoldierState = SoldierState.RALLYING; rallyingCode(); } break; case MINING: miningCode(); break; case ESCAPE_HQ_MINES: escapeHQMinesCode(); break; case CLEAR_OUT_HQ_MINES: clearOutHQMinesCode(); break; case ALL_IN: allInCode(); break; case PUSHING: pushingCode(); break; case FIGHTING: fightingCode(); break; case RALLYING: rallyingCode(); break; case SCOUTING: scoutingCode(); break; default: break; } } else { // This soldier has an encampment job, so it should go do that job captureCode(); } reportArtillerySighting(); if (nextSoldierState != null) { soldierState = nextSoldierState; nextSoldierState = null; // clear the state for the next call of run() to use } } catch (Exception e) { System.out.println("caught exception before it killed us:"); System.out.println(rc.getRobot().getID()); e.printStackTrace(); } }