anchor.diff:  begin
     if (aTick mod MAX_HANDS = fOwner) then
     begin
  +    fBalanceText := '';
       fPredictor.UpdateState(aTick);
  +    if not SKIP_RENDER then
  +      fPredictor.LogStatus(fBalanceText);
       FreeWorkersCnt := 0;
       fBuilder.UpdateState(aTick, FreeWorkersCnt);
  -    fBuilder.ChooseHousesToBuild(Max(0,Ceil(FreeWorkersCnt/WORKER_COEF)), fPredictor.RequiredHouses, fPredictor.WareBalance);
  -    if not SKIP_RENDER then
  -    begin
  -      fPredictor.LogStatus(fBalanceText);
  +    fBuilder.ChooseHousesToBuild(Max(0,Ceil(FreeWorkersCnt/WORKER_COEF)));
  +    if not SKIP_RENDER then // Builder change required houses so builder LogStatus cannot be merged with predictor
         fBuilder.LogStatus(fBalanceText);
  -      //LogStatus(fBalanceText);
  -    end;
  +    LogStatus(fBalanceText);
     end;
   
     if (aTick mod LONG_UPDATE = fOwner) then
  
positive.code: 
  procedure TKMCityManagement.LogStatus(var aBalanceText: UnicodeString);
  const
    WARFARE: array[WARFARE_MIN..WARFARE_MAX] of UnicodeString = ('Shield', 'MetalShield', 'Armor', 'MetalArmor', 'Axe', 'Sword', 'Pike', 'Hallebard', 'Bow', 'Arbalet', 'wt_Horse');
  var
    WT: TWareType;
  begin
    //aBalanceText := '';
    for WT := Low(POMARR) to High(POMARR) do
      aBalanceText := aBalanceText + WARFARE[WT] + ': ' + IntToStr(POMARR[WT].Avaiable) + '; ' + IntToStr(POMARR[WT].Required) + '; ' + FloatToStr(POMARR[WT].Fraction) +';|';
  end;
  
  end.
  
negative.code:     gHands[fOwner].Houses.UpdateResRequest;
    end;
  const
    WORKER_COEF = 125.0; // Max build cnt ~ 5400
  var
    GoldCnt, IronCnt, FieldCnt, BuildCnt, FreeWorkersCnt, I, Cnt: Integer;
  begin
    SetWareDistribution();
  
    fSetup.ApplyAgressiveBuilderSetup; // DELETE DEBUG DELETE DEBUG DELETE DEBUG DELETE DEBUG DELETE DEBUG DELETE DEBUG DELETE DEBUG DELETE DEBUG
  
    fPredictor.AfterMissionInit();
  
    // Find resources around Loc and change building policy
    GoldCnt := 0;
    IronCnt := 0;
    FieldCnt := 0;
    BuildCnt := 0;
    gAIFields.Eye.ScanLocResources(GoldCnt, IronCnt, FieldCnt, BuildCnt);
  
    // Decide count of workers + build nodes
    gHands[fOwner].AI.Setup.WorkerCount := Min(35, Round((BuildCnt+1000) / WORKER_COEF));
  
    fBuilder.AfterMissionInit(GoldCnt, IronCnt, FieldCnt, BuildCnt);
  
    fPredictor.CityInitialization(GoldCnt, IronCnt, FieldCnt, BuildCnt);
  
    // Place all houses AfterMissionInit (only for GA_PLANNER tuning parameters)
    Cnt := 0;
    //GA_PLANNER := True;
    if GA_PLANNER AND (fOwner = 1) then
      for I := 0 to 100 do
      begin
        fBuilder.UpdateState(0, FreeWorkersCnt);
        fPredictor.UpdateState(0);
        if not fBuilder.ChooseHousesToBuild(1) then
        begin
          Cnt := Cnt + 1;
          if (Cnt > 5) then
  