@Override
 public void scoreBarn(FarmScoreContext ctx, Barn meeple) {
   int points = ctx.getBarnPoints();
   meeple.getPlayer().addPoints(points, PointCategory.FARM);
   ScoreEvent ev = new ScoreEvent(meeple.getFeature(), points, PointCategory.FARM, meeple);
   ev.setFinal(true);
   game.post(ev);
 }
  private void scoreFollowersOnBarnFarm(Farm farm, Map<City, CityScoreContext> cityCache) {
    FarmScoreContext ctx = farm.getScoreContext();
    ctx.setCityCache(cityCache);
    farm.walk(ctx);

    boolean hasBarn = false;
    for (Meeple m : ctx.getSpecialMeeples()) {
      if (m instanceof Barn) {
        hasBarn = true;
        break;
      }
    }
    if (hasBarn) {
      for (Player p : ctx.getMajorOwners()) {
        int points = ctx.getPointsWhenBarnIsConnected(p);
        game.scoreFeature(points, ctx, p);
      }
      for (Meeple m : ctx.getMeeples()) {
        if (!(m instanceof Barn)) {
          m.undeploy(false);
        }
      }
    }
  }
 @Override
 public void scoreFarm(FarmScoreContext ctx, Player p) {
   int points = ctx.getPoints(p);
   game.scoreFeature(points, ctx, p);
 }
 protected double getFarmPoints(Farm farm, Player p, FarmScoreContext ctx) {
   if (isMe(p)) {
     openCount[OPEN_COUNT_FARM]++;
   }
   return ctx.getPoints(p);
 }
 @Override
 public void scoreBarn(FarmScoreContext ctx, Barn meeple) {
   // prefer barn placement - magic constant
   rank += reducePoints(1.2 * ctx.getBarnPoints(), meeple.getPlayer());
 }
 @Override
 public void scoreFarm(FarmScoreContext ctx, Player player) {
   double points = getFarmPoints((Farm) ctx.getMasterFeature(), player, ctx);
   rank += reducePoints(points, player);
 }