public BuildingUpgradeStatisticsCalculatorResponse CalculateStatistics(
            BuildingUpgradeStatisticsCalculatorRequest statisticsRequest)
        {
            if (statisticsRequest.BuildingUpgrades == null)
                return new BuildingUpgradeStatisticsCalculatorResponse();
            foreach (var upgrade in statisticsRequest.BuildingUpgrades)
            {
                var durationRequest = new BuildingUpgradeDurationCalculatorRequest
                {
                    BuildingUpgrade = upgrade,
                    ProductTypes = statisticsRequest.ProductTypes,
                    CityStorage = statisticsRequest.CityStorage.Clone(),
                    DecrementPassedStorage = true
                };
                upgrade.RemainingUpgradeTime = _buildingUpgradeCalculator.CalculateRemainingTime(durationRequest).RemainingUpgradeTime;
            }
            //need to go through each building upgrade and
            //  calculate time left.
            //  update product list with quantity left after storage

            return new BuildingUpgradeStatisticsCalculatorResponse();
        }
 public BuildingUpgradeStatisticsCalculatorResponse CalculateStatistics(
     BuildingUpgradeStatisticsCalculatorRequest statisticsRequest)
 {
     throw new System.NotImplementedException();
 }
Ejemplo n.º 3
0
        public BuildingUpgradeHandlerResponse CalculateBuildQueue(BuildingUpgradeHandlerRequest request)
        {
            //Early out if we don't have required data.
            if (request == null || request.City == null)
                return new BuildingUpgradeHandlerResponse
                {
                    RequiredProductQueue = new Product[]{},
                    CityStorage = request != null && request.City != null ? request.City.CurrentCityStorage : new CityStorage(),
                    PendingInventory = new Product[0],
                    TotalProductQueue = new Product[0],
                    RequiredProductsInCityStorageQueue = new Product[0],
                    OrderedUpgrades = new BuildingUpgrade[0],
                    AvailableStorage = new Product[0]
                };

            _productTypes = GetProductTypes(request).Select(Mapper.Map<ProductType>).ToArray();

            request.City.CurrentCityStorage.CurrentInventory = PopulateRequiredProducts(_productTypes, request.City.CurrentCityStorage.CurrentInventory);
            var handlerResponse = new BuildingUpgradeHandlerResponse
            {
                CityStorage = request.City.CurrentCityStorage,
                //Get property upgrade orders in the order requested (currently only sorted by shortest to longest duration)
                //  should be able to sort by priority etc...
                OrderedUpgrades = ReorderUpgradesByDuration(request)
            };

            //Get the list of inventory items from the orders including prerequisites to be queued.

            if (request.ReturnInventory)
            {
                var buildingUpgradeProductConsolidatorResponse = _buildingUpgradeProductConsolidator.GetConsolidatedProductQueue(new BuildingUpgradeProductConsoldatorRequest
                {
                    BuildingUpgrades = handlerResponse.OrderedUpgrades,
                    CityStorage = handlerResponse.CityStorage,
                    ProductTypes = _productTypes
                });
                handlerResponse.RequiredProductQueue = PopulateRequiredProducts(_productTypes, buildingUpgradeProductConsolidatorResponse.ConsolidatedRequiredProductQueue.ToArray());
                handlerResponse.TotalProductQueue = PopulateRequiredProducts(_productTypes, buildingUpgradeProductConsolidatorResponse.ConsolidatedTotalProductQueue.ToArray());
                handlerResponse.AvailableStorage = PopulateRequiredProducts(_productTypes, buildingUpgradeProductConsolidatorResponse.AvailableStorage.ToArray());
                handlerResponse.RequiredProductsInCityStorageQueue = PopulateRequiredProducts(_productTypes, buildingUpgradeProductConsolidatorResponse.ConsolidatedRequiredProductsInStorage.ToArray());
            }
            else
            {
                handlerResponse.RequiredProductQueue = new Product[0];
                handlerResponse.TotalProductQueue = new Product[0];
                handlerResponse.AvailableStorage = new Product[0];
                handlerResponse.RequiredProductsInCityStorageQueue = new Product[0];
            }

            if (request.CalculateBuidingUpgradeStatistics)
            {
                var statisticsRequest = new BuildingUpgradeStatisticsCalculatorRequest();
                _buildingUpgradeStatisticsCalculator.CalculateStatistics(statisticsRequest);
            }

            //now create manufacturing order to be placed.
            //  NOTE only creates one order where it maxes out supply chain limits.
            //            List<LegacyProduct> pendingInventory;
            //            var manufactingOrder = CreateManufacturingOrder(request, orderedInventoryQueue, out pendingInventory);

            return handlerResponse;
        }