anchor.diff:    // City builder (build nodes, selection from required houses)
     TKMCityBuilder = class
     private
  +    fStoneShortage, fWoodShortage, fTrunkShortage, fGoldShortage: Boolean;
       fOwner: TKMHandIndex;
       fBuildNodes: array of TBuildNode;
       fWorkersPos: TKMPointArray;
  
positive.code:     if fBuildNodes[I].Active then
        cnt := cnt + 1;
    aBalanceText := aBalanceText + '|Active nodes:' + IntToStr(cnt);
    if (fPredictor.WareBalance[wt_Stone].Exhaustion < GA_BUILDER_STONE_SHORTAGE) then
      aBalanceText := aBalanceText + '|Stone shortage';
    if ((gHands[fOwner].Stats.GetWareBalance(wt_Trunk) + gHands[fOwner].Stats.GetWareBalance(wt_Wood) / 2) / Max(0.1,fPredictor.WareBalance[wt_Trunk].ActualConsumption) < GA_BUILDER_TRUNK_SHORTAGE) then
      aBalanceText := aBalanceText + '|Trunk shortage';
    if (fPredictor.WareBalance[wt_Wood].Exhaustion < GA_BUILDER_WOOD_SHORTAGE) then
      aBalanceText := aBalanceText + 'Wood shortage';
    if (fPredictor.WareBalance[wt_Gold].Exhaustion < GA_BUILDER_GOLD_SHORTAGE) then
      aBalanceText := aBalanceText + '|Gold shortage';
  end;
  
  
negative.code:              OR ((FieldType = ft_Corn) AND IsPlan(FieldList.Items[I], tlFieldWork, ft_Corn)) then
          begin
            ActiveWorkers := ActiveWorkers + 1;
            if (MaxReqWorkers <= ActiveWorkers) then
              break;
          end
          // ... else try build it
          else
          begin
            BuildField(I, FieldType);
            if (FreeWorkers <= 0) then
              break;
          end;
          // When node reached all plans disable it
          if (RequiredWorkers <= 0) OR (I = FieldList.Count-1) then
  