anchor.diff:    fPerfIdx := 255; // fPerfArr will be reset in next step
     SetLength(fPerfArr, gTerrain.MapY, gTerrain.MapX);
     // Actual houses will be added in UpdateState (script may remove / add something after mission init ...)
  +  UpdateState(0);
   end;
   
   procedure TKMCityPlanner.OwnerUpdate(aPlayer: TKMHandIndex);
  
positive.code:   RADIUS = 5;
    MIN_BID = -100000;
  var
    Output: Boolean;
    X,Y: Integer;
    Bid, BestBid: Single;
    Loc, BestLoc: TKMPoint;
  begin
    Output := False;
    BestBid := MIN_BID;
    for Y := Max(1, aCenter.Y - RADIUS) to Min(gTerrain.MapY, aCenter.Y + RADIUS) do
    for X := Max(1, aCenter.X - RADIUS) to Min(gTerrain.MapX, aCenter.X + RADIUS) do
    begin
      Loc := KMPoint(X,Y);
      if (gTerrain.TileIsCoal(X, Y) = 0) AND gAIFields.Eye.CanAddHousePlan(Loc, htWoodcutters, not aChopOnly, False, False) then
      //if gAIFields.Eye.CanAddHousePlan(Loc, ht_Woodcutters, True, False, False) then
      begin
        Bid := - GA_PLANNER_PlaceWoodcutter_DistFromForest * KMDistanceAbs(aCenter, Loc)
  
negative.code:              //- Byte(gAIFields.Influences.AvoidBuilding[Loc.Y, Loc.X] >= AVOID_BUILDING_COAL_TILE) * 100000; // Try not to place woodcutter into full forest or coal tile
        if (Bid > BestBid) then
        begin
          Check := True;
          for I := Low(HMA[htWoodcutters].Tiles) to High(HMA[htWoodcutters].Tiles) do
          begin
            Point := KMPointAdd( Loc, HMA[htWoodcutters].Tiles[I] );
            if (gTerrain.TileIsCoal(Point.X, Point.Y) <> 0) then
            begin
              Check := False;
              break;
            end;
          end;
          if Check then
          begin
            BestBid := Bid;
            BestLoc := Loc;
          end;
        end;
      end;
    end;
  