anchor.diff:      fGoldShortage := True;
   
     // Woodcutters have huge delay (8 min) + trunk is used only to produce wood -> decide shortage based on actual consumption and reserves
  -  TrunkBalance := (gHands[fOwner].Stats.GetWareBalance(wt_Trunk) + gHands[fOwner].Stats.GetWareBalance(wt_Wood) / 2) / Max(0.1,WareBalance[wt_Trunk].ActualConsumption);
  +  Trunk := gHands[fOwner].Stats.GetWareBalance(wt_Trunk);
  +  Wood := gHands[fOwner].Stats.GetWareBalance(wt_Wood);
  +  WoodReserves := Trunk * 2 + Wood;
  +  TrunkBalance := WoodReserves / (2 * Max(0.1, WareBalance[wt_Trunk].ActualConsumption));
     if (TrunkBalance < GA_BUILDER_TRUNK_SHORTAGE) then
       fTrunkShortage := True;
  -
  -  // 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 // Max 2 chop-only woodcutters
  -    fPlanner.FindForestAround(KMPOINT_ZERO, True);
  -
  -  // Build woodcutter when is forest near new house (or when is woodcutter destroyed but this is not primarly intended)
  -  HT := htWoodcutters;
  -  if (gHands[fOwner].Stats.GetHouseTotal(HT) < fPlanner.PlannedHouses[HT].Count)
  -    AND not fGoldShortage
  -    AND not fStoneShortage
  -    AND (AddToConstruction(HT, True, True) = cs_HousePlaced) then
  -  begin
  -    MaxPlans := MaxPlans - 1;
  -    RequiredHouses[htWoodcutters] := 0;
  -  end;
   
     // Compute building materials
     RequiredStones := gHands[fOwner].BuildList.HousePlanList.GetPlansStoneDemands();
  
positive.code:     GOLD_SHORTAGE_IDX = 7;
      FULL_SET = 28;
    var
      I,K, MaxIdx: Integer;
      HT: TKMHouseType;
    begin
      if fStoneShortage then
        MaxIdx := STONE_SHORTAGE_IDX
      else if fTrunkShortage then
  
negative.code: 
  procedure TKMCityBuilder.UnlockPointOfNode(aPoint: TKMPoint; aCheckHousePlan: Boolean = False);
  var
    AB: Byte;
    X,Y: Integer;
  begin
    if aCheckHousePlan then
  