anchor.diff:          if Placed then // House was placed
           begin
             fConstructedHouses := fConstructedHouses + Byte((House = nil) OR not House.IsComplete);
  -          if (HT = htWoodcutters) AND (House <> nil) AND (House.IsComplete) then
  -            CheckWoodcutter(fPlannedHouses[HT].Plans[I], CheckChopOnly);
  +          if (HT = htWoodcutters) then // Another exception for woodcutters
  +          begin
  +            if ChopOnly then // Dont consider choponly woodcutters
  +              SumCalculated := SumCalculated - 1;
  +            if (House <> nil) AND (House.IsComplete) then
  +              CheckWoodcutter(fPlannedHouses[HT].Plans[I], CheckChopOnly);
  +          end;
           end
           else if (HouseReservation OR RemoveTreeInPlanProcedure) then // House was reserved
           begin
  
positive.code: const
    MIN_CORN_FIELDS = 15;
    MIN_WINE_FIELDS = 9;
    DECREASE_CRIT = 100;
  var
    X,Y,I,Dist: Integer;
    Fields, Obstacles: Single;
    Dir: TDirection;
    HMA: THouseMappingArray;
  begin
    HMA := gAIFields.Eye.HousesMapping;
    Fields := 0;
    Obstacles := 0;
    for Dist := 1 to (Byte(aHT = htWineyard) shl 1) + (Byte(aHT = htFarm) * 5) do
    for Dir := Low(HMA[aHT].Surroundings[Dist]) to High(HMA[aHT].Surroundings[Dist]) do
    for I := Low(HMA[aHT].Surroundings[Dist,Dir]) + Dist to High(HMA[aHT].Surroundings[Dist,Dir]) - Dist + 1 do
    begin
      X := aLoc.X + HMA[aHT].Surroundings[Dist,Dir,I].X;
      Y := aLoc.Y + HMA[aHT].Surroundings[Dist,Dir,I].Y;
      if gTerrain.TileInMapCoords(X,Y) then
      begin
        if gHands[fOwner].CanAddFieldPlan(KMPoint(X,Y), ftCorn) then
          Fields := Fields + 1;
        //if not gRes.Tileset.TileIsRoadable( gTerrain.Land[Y,X].Terrain ) then
        //  Obstacles := Obstacles + 1;
      end;
    end;
    Result := - GA_PLANNER_FieldCrit_MissingFields * (
                + Max(0, MIN_WINE_FIELDS - Fields) * Byte(aHT = htWineyard) * DECREASE_CRIT
                + Max(0, MIN_CORN_FIELDS - Fields) * Byte(aHT = htFarm) * DECREASE_CRIT + Obstacles
              )
              - gAIFields.Eye.PolygonRoutes[ gAIFields.NavMesh.KMPoint2Polygon[aLoc] ] * GA_PLANNER_FieldCrit_FarmPosition;
  end;
  
  
  
negative.code:   SQR_DEC_SPEED = AVOID_BUILDING_FOREST_RANGE / (BLOCK_RAD * BLOCK_RAD);
  var
    Output, PartOfForest: Boolean;
    I,K, Cnt: Integer;
    Point: TKMPoint;
  begin
    Output := False;
  
    gAIFields.Eye.GetForests(fForestsNearby);
    // Delete used forests (used by woodcutter - no matter if in chop only or chop and plant mode)
    for I := 0 to fForestsNearby.Count - 1 do
      if not (fForestsNearby.Tag2[I] > 0) AND ( // Skip detection of exist forest (map maker should be able to produce good forest)
          (gAIFields.Influences.AvoidBuilding[  fForestsNearby.Items[I].Y, fForestsNearby.Items[I].X  ] >= 250) // Skip center point inside of exist forest
           OR not EnoughTreeSeedTiles( fForestsNearby.Items[I] ) // Check count of good terrain
        ) then
      begin
        // Delete will remove element and move all others to left -> this array is not sorted yet so just switch actual and last
        Cnt := fForestsNearby.Count - 1;
        fForestsNearby.Items[I] := fForestsNearby.Items[Cnt];
        fForestsNearby.Tag[I] := fForestsNearby.Tag[Cnt];
        fForestsNearby.Tag2[I] := fForestsNearby.Tag2[Cnt];
        fForestsNearby.Delete(Cnt);
      end
      else // Remove potential forests around chop only woodcutters
        for K := 0 to fPlannedHouses[htWoodcutters].Count - 1 do
        begin
          Point := fPlannedHouses[htWoodcutters].Plans[K].SpecPoint;
          if (fPlannedHouses[htWoodcutters].Plans[K].ChopOnly) // Chop-only mode
            AND (KMDistanceSqr(fForestsNearby.Items[I], Point) < SQR_MIN_DIST_FROM_CHOP_ONLY) then
          begin
            Cnt := fForestsNearby.Count - 1;
            fForestsNearby.Items[I] := fForestsNearby.Items[Cnt];
            fForestsNearby.Tag[I] := fForestsNearby.Tag[Cnt];
            fForestsNearby.Tag2[I] := fForestsNearby.Tag2[Cnt];
            fForestsNearby.Delete(Cnt);
            break;
          end;
        end;
  