@Override
 public double getFlavorMatch(Faction faction) {
   return (((Globals.MAX_REPUTATION - faction.getReputationNumber(world.getControllingFaction()))
           / Globals.MAX_REPUTATION)
       * (faction.getDiplomacy() + faction.getAggression())
       / 2.0);
 }
 @Override
 public Task getNextStep(Faction faction) {
   Task task = getFlavorMatchTask(faction);
   if (!world.hasSpy(faction)) {
     if (new PlantSpyFromPlanetTask(world, this).canPerform(faction))
       return new PlantSpyFromPlanetTask(world, this);
     if (new PlantSpyByGateTask(faction.getHomeWorld(), world, this).canPerform(faction))
       return new PlantSpyByGateTask(faction.getHomeWorld(), world, this);
     if (new PlantSpyByShipTask(faction.getHomeWorld(), world, this).canPerform(faction))
       return new PlantSpyByShipTask(faction.getHomeWorld(), world, this);
   } else if (world.hasSpy(faction)) return task;
   return null;
 }
 @Override
 public int stepsToCompletion(Faction faction) {
   Task task = getFlavorMatchTask(faction);
   return new TransportTroopsTask(faction.getHomeWorld(), world, 1, this)
           .stepsToCompletion(faction)
       + task.stepsToCompletion(faction);
 }
 public void perform(Faction faction) {
   System.out.println("Doing " + name);
   if (random.nextBoolean()) // Spy was caught
   world.exposeSpy(faction);
   else {
     target.reduceTechLevel();
     if (parent != null) parent.reportFinished(this);
   }
 }
 @Override
 public boolean canPerform(Faction faction) {
   Task task = getFlavorMatchTask(faction);
   if (!world.hasSpy(faction) && world.getTroopCount(faction) == 0)
     return new TransportTroopsTask(faction.getHomeWorld(), world, 1, this).canPerform(faction);
   if (!world.hasSpy(faction) && world.getTroopCount(faction) > 0)
     return new PlantSpyFromPlanetTask(world, this).canPerform(faction);
   else return task.canPerform(faction);
 }
 @Override
 public double getFlavorMatch(Faction faction) {
   return ((target.getTechLevel().getTotalTechLevel() / Globals.MAX_TECH_LEVEL)
       * (faction.getDiplomacy() + faction.getAggression())
       / 2.0);
 }
 @Override
 public boolean canPerform(Faction faction) {
   return world.hasSpy(faction) && !target.getTechLevel().isMinimum();
 }