anchor.diff:      procedure UnlockPointOfNode(aPoint: TKMPoint; aCheckHousePlan: Boolean = False);
       procedure UnlockNode(var aNode: TBuildNode; aCheckHousePlan: Boolean = False);
   
  +    procedure CheckBasicMaterials(var aFreeWorkersCnt, aMaxPlans, aMaxPlace: Integer; var aTrunkBalance: Single; aTick: Cardinal);
       procedure CreateShortcuts();
     public
       constructor Create(aPlayer: TKMHandIndex; aPredictor: TKMCityPredictor);
  
positive.code: 
  
  procedure TKMCityBuilder.UpdateState(aTick: Cardinal; out aFreeWorkersCnt: Integer);
  begin
    if (aTick mod MAX_HANDS = fOwner) then
    begin
      fPlanner.UpdateState(aTick); // Planner must be updated as first to secure that completed houses are actualized
      UpdateBuildNodes(aFreeWorkersCnt);
    end;
  end;
  
  
negative.code:   BUILD_TOWER_DELAY = 17 * 60 * 10; // 17 minutes before end of peace
    MINIMAL_TOWER_DELAY = 50 * 60 * 10; // Towers will not be build before 50 minute
  var
    TrunkBalance: Single;
    HT: TKMHouseType;
  begin
    // Get shortage info
    CheckBasicMaterials(aFreeWorkersCnt, MaxPlans,MaxPlace, TrunkBalance, aTick);
  
    RequiredHouses := fPredictor.RequiredHouses;
    WareBalance := fPredictor.WareBalance;
  
    // Dont try to place wine we are out of wood
    RequiredHouses[htWineyard] := RequiredHouses[htWineyard] * Byte(not(fTrunkShortage OR (MaxPlace < 3)));
  
    // Find place for chop-only woodcutters when we start to be out of wood
    if ((GA_BUILDER_ChHTB_TrunkBalance - TrunkBalance) / GA_BUILDER_ChHTB_TrunkFactor - GetChopOnlyCnt() > 0) then
  