/// <summary> /// Principles: /// 1) max concurrent orders per building per type is capped per MAX_TTL day period /// 2) /// </summary> /// <param name="material"></param> /// <param name="requestBuilding"></param> /// <param name="responseBuilding"></param> /// <returns></returns> public bool IsRestricted(TransferManager.TransferReason material, ushort requestBuilding, ushort responseBuilding) { if (!Events.TryGetValue(requestBuilding, out var list)) { return(false); } var isRequestBuildingOutside = TransferManagerInfo.IsOutsideBuilding(requestBuilding); var isResponseBuildingOutside = TransferManagerInfo.IsOutsideBuilding(responseBuilding); if (!Settings.enableDummyCargoTraffic.value && isRequestBuildingOutside && isResponseBuildingOutside) { return(true); } var concurrentOrderCount = list.Count; var concurrentOrderCountToOutsideConnection = 0; var concurrentOrderCountToResponseBuilding = 0; for (int i = 0; i < list.Count; i++) { if (TransferManagerInfo.IsOutsideBuilding(list[i].ResponseBuilding)) { concurrentOrderCountToOutsideConnection++; } if (list[i].ResponseBuilding == responseBuilding) { concurrentOrderCountToResponseBuilding++; } } var vehicleCount1 = TransferManagerInfo.GetCargoVehicleCount(requestBuilding, material); var vehicleCount2 = TransferManagerInfo.GetCargoVehicleCount(responseBuilding, material); var maxConcurrentOrderCount = Math.Ceiling(Constraints.GlobalOutsideConnectionIntensity() / 10.0); // 500 setting = 50 count if (isRequestBuildingOutside && TransferManagerInfo.IsOutsideRoadConnection(requestBuilding)) { maxConcurrentOrderCount *= 4; } else { maxConcurrentOrderCount *= 2; } var maxConcurrentOrderCountToResponseBuilding = Math.Ceiling(maxConcurrentOrderCount / 2.0); var maxConcurrentOrderCountToOutsideConnection = Math.Ceiling(0.25 * maxConcurrentOrderCount * Constraints.GlobalOutsideToOutsidePerc() / 100.0); var maxVehicleCount = Math.Ceiling(maxConcurrentOrderCount / 4.0); // Logger.LogVerbose($"TransferHistory::IsRestricted: request={requestBuilding}, response={responseBuilding}, concurrentOrderCount = {concurrentOrderCount}, maxConcurrentOrderCount={maxConcurrentOrderCount}, concurrentOrderCountToOutsideConnection={concurrentOrderCountToOutsideConnection}, maxConcurrentOrderCountToOutsideConnection={maxConcurrentOrderCountToOutsideConnection}, vehicleCount1={vehicleCount1}, vehicleCount2={vehicleCount2}, maxVehicleCount={maxVehicleCount}"); bool isRestrictedConcurrent = concurrentOrderCount >= maxConcurrentOrderCount; bool isRestrictedConcurrentToBuilding = concurrentOrderCountToResponseBuilding >= maxConcurrentOrderCountToResponseBuilding; bool isRestrictedConcurrentToOutsideConnection = isRequestBuildingOutside && isResponseBuildingOutside && concurrentOrderCountToOutsideConnection >= maxConcurrentOrderCountToOutsideConnection; bool isVehicleConstrained = vehicleCount1 >= maxVehicleCount || vehicleCount2 >= maxVehicleCount; return(isRestrictedConcurrent || isRestrictedConcurrentToBuilding || isRestrictedConcurrentToOutsideConnection || isVehicleConstrained); }