示例#1
0
        private CraftMetadata UpdateMetadataOnCraft(
            ICraftingStep craftingStep,
            CraftMetadata craftMetadata,
            Dictionary <string, int> currencyAmounts,
            ProgressManager progressManager)
        {
            if (!craftMetadata.CraftingStepMetadata.ContainsKey(craftingStep))
            {
                CraftingStepMetadata stepMetadata = new CraftingStepMetadata {
                    TimesVisited = 0, CurrencyAmounts = currencyAmounts
                };
                craftMetadata.CraftingStepMetadata.Add(craftingStep, stepMetadata);
            }

            craftMetadata.CraftingStepMetadata[craftingStep].TimesVisited++;

            if (currencyAmounts.Any())
            {
                craftMetadata.CraftingStepMetadata[craftingStep].TimesModified++;
            }

            foreach (var currency in currencyAmounts)
            {
                progressManager.SpendCurrency(currency.Key, currency.Value);
            }

            return(craftMetadata);
        }
示例#2
0
        public CraftMetadata Craft(
            List <ICraftingStep> craftingSteps,
            Equipment equipment,
            AffixManager affixManager,
            CancellationToken ct,
            ProgressManager progressManager)
        {
            CraftMetadata metadata = new CraftMetadata();

            metadata.Result = equipment;
            return(this.Craft(craftingSteps, equipment, affixManager, ct, metadata, progressManager));
        }
示例#3
0
        public CraftMetadata Craft(
            List <ICraftingStep> craftingSteps,
            Equipment equipment,
            AffixManager affixManager,
            CancellationToken ct,
            CraftMetadata metadata,
            ProgressManager progressManager)
        {
            foreach (var craftingStep in craftingSteps)
            {
                if (equipment.Completed)
                {
                    return(metadata);
                }

                if (progressManager.Progress >= 100)
                {
                    return(metadata);
                }

                if (ct.IsCancellationRequested)
                {
                    ct.ThrowIfCancellationRequested();
                }

                var currency = craftingStep.Craft(equipment, affixManager);
                UpdateMetadataOnCraft(craftingStep, metadata, currency, progressManager);

                var    times            = 0;
                double previousProgress = 0;
                while (craftingStep.ShouldVisitChildren(equipment, times))
                {
                    metadata = Craft(craftingStep.Children, equipment, affixManager, ct, metadata, progressManager);
                    UpdateMetadataOnChildrenVisit(craftingStep, metadata);
                    times++;

                    if (times > 1)
                    {
                        // Check for no crafting steps
                        if (Math.Abs(previousProgress - progressManager.Progress) < double.Epsilon)
                        {
                            throw new ArgumentException("Crafting steps do not spend currency");
                        }

                        previousProgress = progressManager.Progress;
                    }
                }
            }

            return(metadata);
        }
示例#4
0
 private void UpdateMetadataOnChildrenVisit(ICraftingStep craftingStep, CraftMetadata craftMetadata)
 {
     craftMetadata.CraftingStepMetadata[craftingStep].TimesChildrenVisited++;
 }