anchor.diff:    fOwner := aPlayer;
     fSetup := aSetup;
   
  -  fBuilder := TKMCityBuilder.Create(aPlayer);
     fPredictor := TKMCityPredictor.Create(aPlayer);
  +  fBuilder := TKMCityBuilder.Create(aPlayer, fPredictor);
   end;
   
   
   destructor TKMCityManagement.Destroy();
   begin
  +  fPredictor.Free;
     fBuilder.Free;
  -  fPredictor.Free;
   
     inherited;
   end;
  
positive.code:     for UT := Low(UnitReq) to High(UnitReq) do
        Dec(UnitReq[UT], P.Stats.GetUnitQty(UT));
      //UnitReq[ut_Serf] := Round(fSetup.SerfsPerHouse * (P.Stats.GetHouseQty(ht_Any) + P.Stats.GetUnitQty(ut_Worker)/2));
      if (P.Stats.GetWareBalance(wt_Gold) < 15) AND (P.Stats.GetHouseQty(ht_Metallurgists) = 0) then
      begin
        UnitReq[ut_Serf] := 0;
        UnitReq[ut_Worker] := 0;
  
negative.code: 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)));
      if not SKIP_RENDER then // Builder change required houses so builder LogStatus cannot be merged with predictor
        fBuilder.LogStatus(fBalanceText);
      LogStatus(fBalanceText);
    end;
  
    if (aTick mod LONG_UPDATE = fOwner) then
  