anchor.diff:  
     // Get positions of workes with nil task (no task)
     aFreeWorkersCnt := 0;
  -  SetLength(WorkersPos, gHands[fOwner].Stats.GetUnitQty(ut_Worker));
  +  WorkerCnt := gHands[fOwner].Stats.GetUnitQty(ut_Worker);
  +  if (Length(fWorkersPos) <> WorkerCnt) then
  +    SetLength(fWorkersPos, WorkerCnt);
  +  SetLength(WorkersPos, WorkerCnt);
     for I := 0 to gHands[fOwner].Units.Count - 1 do
       if not gHands[fOwner].Units[I].IsDeadOrDying
  -       AND (gHands[fOwner].Units[I] is TKMUnitWorker)
  -       AND (    (gHands[fOwner].Units[I].UnitTask = nil)
  -             //OR ( (gHands[fOwner].Units[I].UnitTask.TaskName = utn_BuildRoad) AND (gHands[fOwner].Units[I].UnitTask.Phase > 7) )
  -             //OR ( (gHands[fOwner].Units[I].UnitTask.TaskName = utn_BuildField) AND (gHands[fOwner].Units[I].UnitTask.Phase > 4) )
  -             //OR ( (gHands[fOwner].Units[I].UnitTask.TaskName = utn_BuildWine) AND (gHands[fOwner].Units[I].UnitTask.Phase > 7) )
  -             //OR (gHands[fOwner].Units[I].UnitTask.TaskName = utn_BuildRoad)
  -             //OR (gHands[fOwner].Units[I].UnitTask.TaskName = utn_BuildField)
  -             //OR (gHands[fOwner].Units[I].UnitTask.TaskName = utn_BuildWine)
  -           ) then
  -    begin
  -      WorkersPos[aFreeWorkersCnt] := gHands[fOwner].Units[I].GetPosition;
  -      aFreeWorkersCnt := aFreeWorkersCnt + 1;
  -    end;
  +       AND (gHands[fOwner].Units[I] is TKMUnitWorker) then
  +       //AND ((gHands[fOwner].Units[I].UnitTask = nil) OR (gHands[fOwner].Units[I].UnitTask.TaskName <> utn_SelfTrain)) then
  +    begin
  +      //WorkerCnt := WorkerCnt - 1;
  +      //fWorkersPos[WorkerCnt] := gHands[fOwner].Units[I].GetPosition;
  +      if (    (gHands[fOwner].Units[I].UnitTask = nil)
  +               //OR ( (gHands[fOwner].Units[I].UnitTask.TaskName = utn_BuildRoad) AND (gHands[fOwner].Units[I].UnitTask.Phase > 7) )
  +               //OR ( (gHands[fOwner].Units[I].UnitTask.TaskName = utn_BuildField) AND (gHands[fOwner].Units[I].UnitTask.Phase > 4) )
  +               //OR ( (gHands[fOwner].Units[I].UnitTask.TaskName = utn_BuildWine) AND (gHands[fOwner].Units[I].UnitTask.Phase > 7) )
  +               //OR (gHands[fOwner].Units[I].UnitTask.TaskName = utn_BuildRoad)
  +               //OR (gHands[fOwner].Units[I].UnitTask.TaskName = utn_BuildField)
  +               //OR (gHands[fOwner].Units[I].UnitTask.TaskName = utn_BuildWine)
  +             ) then
  +      begin
  +        WorkersPos[aFreeWorkersCnt] := gHands[fOwner].Units[I].GetPosition;
  +        aFreeWorkersCnt := aFreeWorkersCnt + 1;
  +      end;
  +    end;
  +  SetLength(WorkersPos, aFreeWorkersCnt);
   
     // Find closest build-node to each free worker and allow to expand it in next update
     while (aFreeWorkersCnt > 0) do
  
positive.code:       RequiredWorkers := FieldList.Count;
        for I := FieldList.Count - 1 downto 0 do
        begin
          // Does we have free workers?
          if (FreeWorkers <= 0) then
            break;
          // Is there already road / plan / work in progress?
          if IsRoad(FieldList.Items[I]) then
          begin
            RequiredWorkers := RequiredWorkers - 1;
            CenterPoint := FieldList.Items[I]; // Actualize center point (distribution of workers by distance)
          end
          // When cannot place new plan try find another way by calling pathfinding
          else if not BuildField(I, ft_Road) then
          begin
            if ShortcutMode then
            begin
              UnlockPointOfNode(FieldList.Items[I]);
              FieldList.Delete(I);
            end
            else
            begin
              UnlockNode(aNode);
              // If is not possible to connect 2 points by road destroy node
              if not fPlanner.GetRoadBetweenPoints(CenterPoint, FieldList.Items[0], FieldList, FieldType) then
              begin
                FieldList.Clear;
                Active := False;
              end;
              LockNode(aNode);
              RequiredWorkers := FieldList.Count;
              Exit; // Node will be updated in next calling
            end;
          end;
        end;
      end;
    end;
  
    // Build Wine or Corn fields
    procedure BuildFields();
    var
      I,K: Integer;
    begin
      with aNode do
      begin
        RequiredWorkers := FieldList.Count;
        for I := 0 to FieldList.Count - 1 do
        begin
          if (FreeWorkers <= 0) then
            Exit;
          // Check if field already exists ...
          if   ((FieldType = ft_Wine) AND (IsCornField(FieldList.Items[I])))
            OR ((FieldType = ft_Corn) AND (IsWineField(FieldList.Items[I]))) then
          begin
            RequiredWorkers := RequiredWorkers - 1;
          end
          // ... else try build it
          else
            BuildField(I, FieldType);
          // When node reached all plans disable it
          if (RequiredWorkers <= 0) OR (I = FieldList.Count-1) then
          begin
            for K := 0 to FieldList.Count-1 do
              if   ((FieldType = ft_Wine) AND (IsCornField(FieldList.Items[I])))
                OR ((FieldType = ft_Corn) AND (IsWineField(FieldList.Items[I]))) then
                UnlockPointOfNode(FieldList.Items[K]);
            FieldList.Clear;
            Active := False;
          end;
        end;
      end;
    end;
  
  
negative.code:       begin
          Output := cs_HouseReservation; // House is already reserved -> no nodes will be updated and workers still have nothing to do so we can build another house
          if not aHouseReservation then
          begin
            fPlanner.PlannedHouses[aHT].Plans[HouseIdx].HouseReservation := False;
            FieldsComplete := True; // Fields was completed in reservation (only for farm and wine)
          end;
        end;
  
        // if house is not reserved (or will be reserved in this tick)
  