예제 #1
0
  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);
          }
        }
      }
    }
  }
예제 #2
0
 /**
  * Method that writes to a channel to inform others that an artillery has been seen. Primarily
  * used by HQ to know to build a shields encampment.
  *
  * @throws GameActionException
  */
 public void reportArtillerySighting() throws GameActionException {
   Robot[] nearbyEnemyRobots = rc.senseNearbyGameObjects(Robot.class, 14, rc.getTeam().opponent());
   for (Robot robot : nearbyEnemyRobots) {
     RobotInfo robotInfo = rc.senseRobotInfo(robot);
     if (robotInfo.type == RobotType.ARTILLERY) {
       BroadcastSystem.write(ChannelType.ARTILLERY_SEEN, Constants.TRUE);
     }
   }
 }
예제 #3
0
  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();
      //			}
    }
  }
예제 #4
0
  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();
    }
  }
예제 #5
0
  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();
    }
  }
예제 #6
0
  @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();
    }
  }
예제 #7
0
  @Override
  public void run() {
    try {
      //			System.out.println("start: " + Clock.getBytecodeNum());
      BroadcastSystem.write(powerChannel, (int) rc.getTeamPower());
      //			System.out.println("end: " + Clock.getBytecodeNum());
      DataCache.updateRoundVariables();

      // Check if enemy's nuke is half done
      if (!enemyNukeHalfDone) {
        enemyNukeHalfDone = rc.senseEnemyNukeHalfDone();
      }
      if (enemyNukeHalfDone) {
        // Broadcast this
        BroadcastSystem.write(ChannelType.ENEMY_NUKE_HALF_DONE, 1);
      }

      //			if (Clock.getRoundNum() < 20) {
      //				BroadcastSystem.write(ChannelType.CHANNEL1, 0);
      //				BroadcastSystem.read(ChannelType.CHANNEL1);
      //				BroadcastSystem.write(ChannelType.CHANNEL1, 0);
      //			} else {
      //				rc.resign();
      //			}
      //

      if (Clock.getRoundNum() % Constants.CHANNEL_CYCLE == 0 && Clock.getRoundNum() > 0) {
        EncampmentJobSystem.updateJobsOnCycle();
      } else {
        EncampmentJobSystem.updateJobsAfterChecking();
      }

      if (rc.isActive()) {

        boolean upgrade = false;
        if (!rc.hasUpgrade(Upgrade.DEFUSION)
            && enemyNukeHalfDone
            && DataCache.numAlliedSoldiers > 5) {
          upgrade = true;
          rc.researchUpgrade(Upgrade.DEFUSION);
        } else if (rc.getTeamPower() < 100) {
          if (!rc.hasUpgrade(Upgrade.DEFUSION)) {
            upgrade = true;
            rc.researchUpgrade(Upgrade.DEFUSION);
          } else if (!rc.hasUpgrade(Upgrade.PICKAXE)) {
            upgrade = true;
            rc.researchUpgrade(Upgrade.PICKAXE);
          } else if (!rc.hasUpgrade(Upgrade.FUSION)) {
            upgrade = true;
            rc.researchUpgrade(Upgrade.FUSION);
          }
        }
        if (!upgrade) {

          // Spawn a soldier
          Direction desiredDir = rc.getLocation().directionTo(rc.senseEnemyHQLocation());
          Direction dir = getSpawnDirection(rc, desiredDir);
          if (dir != null) {
            EncampmentJobSystem.updateJobs();
            rc.spawn(dir);
          }
        }
        //				if (Clock.getRoundNum() < 5) {
        //					Direction dir = rc.getLocation().directionTo(rc.senseEnemyHQLocation());
        //					rc.spawn(dir);
        //				}
      }

      //			// TODO: find out what strategy to switch to?
      //			// this.strategy = HQStrategy.xxx
      //			if (rc.isActive()) {
      //				switch (strategy) {
      //				case CREATE_SOLDIER:
      //					create_soldier();
      //					break;
      //				case RESEARCH_DEFUSION:
      //					if (!rc.hasUpgrade(Upgrade.DEFUSION)) {
      //						rc.researchUpgrade(Upgrade.DEFUSION);
      //					}
      //					break;
      //				case RESEARCH_FUSION:
      //					if (!rc.hasUpgrade(Upgrade.FUSION)) {
      //						rc.researchUpgrade(Upgrade.FUSION);
      //					}
      //					break;
      //				case RESEARCH_NUKE:
      //					if (!rc.hasUpgrade(Upgrade.NUKE)) {
      //						rc.researchUpgrade(Upgrade.NUKE);
      //					}
      //					break;
      //				case RESEARCH_PICKAXE:
      //					if (!rc.hasUpgrade(Upgrade.PICKAXE)) {
      //						rc.researchUpgrade(Upgrade.PICKAXE);
      //					}
      //					break;
      //				case RESEARCH_VISION:
      //					if (!rc.hasUpgrade(Upgrade.VISION)) {
      //						rc.researchUpgrade(Upgrade.VISION);
      //					}
      //					break;
      //				default:
      //					break;
      //				}
      //			}
    } catch (Exception e) {
      System.out.println("caught exception before it killed us:");
      System.out.println(rc.getRobot().getID());
      e.printStackTrace();
    }
  }