anchor.diff:        MaxIdx := GOLD_SHORTAGE_IDX
       else
         MaxIdx := FULL_SET;
  +
       for I := 0 to MaxIdx do
       begin
         HT := RESERVATION_FullSet[I];
         for K := 0 to fPlanner.PlannedHouses[HT].Count - 1 do
           with fPlanner.PlannedHouses[HT].Plans[K] do
  -          if not Placed
  -             AND (HouseReservation OR RemoveTreeInPlanProcedure)
  -             AND (cs_HousePlaced = AddToConstruction(HT,False,True)) then
  -          begin
  -            MaxPlace := MaxPlace - 1;
  -            RequiredHouses[HT] := 0;
  -            if (MaxPlace <= 0) then
  -              Exit;
  +          if not Placed AND (HouseReservation OR RemoveTreeInPlanProcedure) then
  +            Inc(ReservationsCntArr[HT], 1);
  +    end;
  +
  +    Overflow := 0;
  +    while (MaxPlace > 0) AND (Overflow <= MaxIdx) do
  +    begin
  +      Overflow := Overflow + 1;
  +      BestGain := 0;
  +      for I := 0 to MaxIdx do
  +        if (ReservationsCntArr[ RESERVATION_FullSet[I] ] > 0) then
  +        begin
  +          HT := RESERVATION_FullSet[I];
  +          Gain := ReservationsCntArr[HT] * 2 + MaxIdx - I;
  +          if (Gain > BestGain) then
  +          begin
  +            BestHT := HT;
  +            BestGain := Gain;
             end;
  +        end;
  +      if (BestGain = 0) then
  +        Exit;
  +      if (cs_HousePlaced = AddToConstruction(BestHT,False,True)) then
  +      begin
  +        MaxPlace := MaxPlace - 1;
  +        RequiredHouses[BestHT] := 0;
  +      end;
  +      ReservationsCntArr[BestHT] := 0; // Dont place more than 1 reserved house type in 1 tick
       end;
     end;
   
  
positive.code:     end;
    end;
    //fStoneShortage := fStoneShortage OR (gHands[fOwner].Stats.GetWareBalance(wt_Stone) < RequiredStones);
    fTrunkShortage := fTrunkShortage OR (gHands[fOwner].Stats.GetWareBalance(wt_Wood) < RequiredWood);
    MaxPlace := Round((gHands[fOwner].Stats.GetWareBalance(wt_Trunk)*2 + gHands[fOwner].Stats.GetWareBalance(wt_Wood) - RequiredWood) / 3 - 0.5);
  
    if fTrunkShortage then
      RequiredHouses[htWineyard] := 0; // Dont try to place wine we are out of wood
  
    if (MaxPlace > 0) then
      CheckHouseReservation();
  
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
    I, RequiredStones, RequiredWood, WoodReserves, Wood, Trunk: Integer;
    TrunkBalance: Single;
    HT: TKMHouseType;
    H: TKMHouse;
  