public override void AdjustModuleStatsForStep(BuildItemStatistics stats)
        {
            // if boost timer completed -> move it to not boosted nexus back and recalculate building time for currently building item
            var chronoTimers = stats.GetStatsWithKeyContains("ChronoTimer");

            foreach (var timer in chronoTimers)
            {
                if (timer.Value != 0)
                {
                    stats.ChangeItemCountForName(timer.Key, -1);
                }
            }

            var chronoBuzyTimers = stats.GetStatsWithKeyContains("ChronoBuzyTimer");

            foreach (var timer in chronoBuzyTimers)
            {
                if (timer.Value != 0)
                {
                    stats.ChangeItemCountForName(timer.Key, -1);
                }
                else
                {
                    stats.ChangeItemCountForName("NexusBoostedBuzy", 1);
                    stats.RemoveStat(timer.Key);
                }
            }
        }
        private void ChangeTimerForItems(IEnumerable <KeyValuePair <string, int> > list, BuildItemStatistics stats)
        {
            foreach (var prodBuilding in list)
            {
                stats.ChangeItemCountForName(prodBuilding.Key, -1);

                if (stats.GetStatValueByName(prodBuilding.Key) == 0)
                {
                    stats.RemoveStat(prodBuilding.Key);
                }
            }
        }
        public override void AdjustModuleStatsByFinishedItems(IEnumerable <BuildOrderProcessorItem> finishedItems, BuildItemStatistics stats)
        {
            foreach (var item in finishedItems)
            {
                if (item.ItemName == "Nexus")
                {
                    stats.ChangeItemCountForName("BoostedNexusCount", 1);
                    continue;
                }

                var entity = this.BuildManagerConfiguration.BuildItemsDictionary.GetItem(item.ItemName);
                if (entity.ProductionBuildingName == "Nexus")
                {
                    int initialBuildTime = entity.BuildTimeInSeconds;
                    int realBuildTime    = item.FinishedSecond - item.SecondInTimeLine;

                    if (realBuildTime < initialBuildTime)
                    {
                        stats.ChangeItemCountForName("NexusBoostedBuzy", -1);
                    }
                }
            }

            var chronoTimers = stats.GetStatsWithKeyContains("ChronoTimer");

            foreach (var timer in chronoTimers)
            {
                if (timer.Value == 0)
                {
                    var boostedNexusCount = stats.GetStatValueByName("BoostedNexusCount");
                    var nexusCount        = stats.GetStatValueByName("Nexus");

                    if (nexusCount > boostedNexusCount)
                    {
                        stats.ChangeItemCountForName("BoostedNexusCount", 1);
                        // recalculate current building item from unboosted nexus
                    }

                    stats.RemoveStat(timer.Key);
                }
            }
        }
Beispiel #4
0
        public override void AdjustModuleStatsForStep(BuildItemStatistics stats)
        {
            var larvaTimers   = stats.GetStatsWithKeyContains("LarvaTimer");
            var larvaCounts   = stats.GetStatsWithKeyContains("LarvaCount");
            var injectedTimer = stats.GetStatsWithKeyContains("InjectedTimer");

            if (larvaTimers.Count == 0 && injectedTimer.Count == 0)
            {
                return;
            }

            foreach (var timer in larvaTimers)
            {
                var hatcheryName   = timer.Key.Substring(0, timer.Key.Length - "LarvaTimer".Length);
                var larvaCountStat = larvaCounts.FirstOrDefault(p => p.Key.Contains(hatcheryName));

                if (larvaCountStat.Value < 3)
                {
                    stats.ChangeItemCountForName(timer.Key, 1);
                }
                else
                {
                    stats.SetItemCountForName(timer.Key, 0);
                }

                var newTime = stats.GetStatValueByName(timer.Key);

                if (newTime == SpawnLarvaTime)
                {
                    stats.ChangeItemCountForName(larvaCountStat.Key, 1);
                    stats.SetItemCountForName(timer.Key, 0);
                }
            }

            foreach (var injectTimer in injectedTimer)
            {
                string hatcheryName = injectTimer.Key.Substring(0, injectTimer.Key.Length - "InjectedTimer".Length);
                int    larvaCount   = stats.GetStatValueByName(hatcheryName + "LarvaCount");

                stats.ChangeItemCountForName(hatcheryName + "InjectedTimer", 1);

                var newInjectTimerValue = stats.GetStatValueByName(injectTimer.Key);

                int injectTime = this.BuildManagerConfiguration.BuildItemsDictionary.GetItem("InjectLarva").BuildTimeInSeconds;

                if (newInjectTimerValue > injectTime)
                {
                    int larvaChange = InjectedLarvaAdd;
                    if ((larvaCount + larvaChange) > 19)
                    {
                        larvaChange = 19 - larvaCount;
                    }

                    stats.ChangeItemCountForName(hatcheryName + "LarvaCount", larvaChange);
                    stats.ChangeItemCountForName("TotalLarva", larvaChange);
                    stats.RemoveStat(hatcheryName + "InjectedTimer");
                }
            }

            this.ResetTotalLarva(stats);
        }
        private void ProcessChronoboostItem(BuildOrderProcessorItem boItem, BuildItemEntity item, BuildItemStatistics stats)
        {
            if (item.ItemType == BuildItemTypeEnum.Special && item.Name == "Chronoboost")
            {
                if (stats.GetStatValueByName("ChronoboostAvailable") == 0)
                {
                    throw new ApplicationException("It is not possible to apply chronoboost at this moment!");
                }

                // Apply chronoboost calculations
                int boostItemOrder = stats.GetStatValueByName("LastItemOrder");
                int boostProdIndex = stats.GetStatValueByName("LastItemProdBuildingIndex");

                if (boostItemOrder == 0)
                {
                    return;
                }

                int boostLength = this.BuildManagerConfiguration.BuildItemsDictionary.GetItem("Chronoboost").BuildTimeInSeconds;

                BuildOrderProcessorItem boostBoItem = this.BuildOrder.GetBuildOrderItemsClone().First(p => p.Order == boostItemOrder);
                BuildItemEntity         boostItem   = this.BuildManagerConfiguration.BuildItemsDictionary.GetItem(boostBoItem.ItemName);

                int previousChronoTimer = stats.GetStatValueByName("ChronoTimer" + boostItem.ProductionBuildingName + boostProdIndex);

                //int boostApplyPoint = boostBoItem.SecondInTimeLine + previousChronoTimer;

                int buildTime = boostBoItem.FinishedSecond - (boostBoItem.SecondInTimeLine + previousChronoTimer);

                int  secondsToChronoboost;
                bool isEnoughEnergy = this.IsChronoboostPossibleWhileBuilding(boostBoItem.FinishedSecond - boostBoItem.SecondInTimeLine, stats, out secondsToChronoboost);
                if (!isEnoughEnergy)
                {
                    throw new ApplicationException("Chronoboost is unavailable");
                }

                if (previousChronoTimer < secondsToChronoboost)
                {
                    buildTime -= (secondsToChronoboost - previousChronoTimer);
                }

                int boostAmount = (buildTime - this.CalculateBuildTimeForItem(buildTime, boostLength));
                boostBoItem.FinishedSecond -= boostAmount;

                int normalBuzy = stats.GetStatValueByName("NormalBuzy" + boostItem.ProductionBuildingName + boostProdIndex);

                if (normalBuzy - (boostLength + boostAmount) > 0)
                {
                    stats.SetItemCountForName("NormalBuzy" + boostItem.ProductionBuildingName + boostProdIndex, normalBuzy - (boostLength + boostAmount));
                }
                else
                {
                    stats.RemoveStat("NormalBuzy" + boostItem.ProductionBuildingName + boostProdIndex);
                }

                stats.SetItemCountForName("ChronoTimer" + boostItem.ProductionBuildingName + boostProdIndex, boostLength + previousChronoTimer);

                int chronoBuzyTimer = (boostBoItem.FinishedSecond - boItem.SecondInTimeLine) > (boostLength + previousChronoTimer)
                                          ? (boostLength + previousChronoTimer)
                                          : (boostBoItem.FinishedSecond - boItem.SecondInTimeLine);
                stats.SetItemCountForName("ChronoBuzy" + boostItem.ProductionBuildingName + boostProdIndex, chronoBuzyTimer);

                var castModule = this.BuildManagerConfiguration.BuildManagerModules.First(p => p is CastModule) as CastModule;
                castModule.UseCast(stats);
            }
        }