コード例 #1
0
        public static TurnedUnit CalculateTrickyUnitTimeProduction(TimeLineStatus premiumTimeLine,
                                                                   TurnedUnit turnedUnit,
                                                                   int currTime, int shipyardLevel)
        {
            var lastUpgrade = turnedUnit.DateLastUpgrade;

            var index = premiumTimeLine.Points.FindLastIndex(j => j <= lastUpgrade);
            var baseUnitProductionTime = UnitHelper.GetBaseUnit(turnedUnit.UnitType).BasePrice.TimeProduction;

            // 0-1 true
            // 1-2 false
            // 2-3 true


            for (var i = index; i < premiumTimeLine.Points.Count(); i++)
            {
                var statusPremiumIsActive = false;
                if (i != -1)
                {
                    statusPremiumIsActive = premiumTimeLine.Status[i];
                }


                var oneUnitProductionSpeedPerSecond = CalculateTimeProduction(baseUnitProductionTime,
                                                                              statusPremiumIsActive, shipyardLevel);
                int duration;

                var hasNextPoint = (premiumTimeLine.Points.Count() - 1 > i);

                if (hasNextPoint)
                {
                    var nextPoint = premiumTimeLine.Points[i + 1];

                    duration    = nextPoint - lastUpgrade;
                    lastUpgrade = nextPoint;
                }
                else
                {
                    duration    = currTime - lastUpgrade;
                    lastUpgrade = currTime;
                }

                if (duration > (turnedUnit.TotalCount - turnedUnit.ReadyUnits) * oneUnitProductionSpeedPerSecond)
                {
                    turnedUnit.ReadyUnits += (currTime - turnedUnit.DateLastUpgrade) / oneUnitProductionSpeedPerSecond;
                    if (turnedUnit.ReadyUnits >= turnedUnit.TotalCount)
                    {
                        turnedUnit.ReadyUnits = turnedUnit.TotalCount;
                    }
                    lastUpgrade = currTime;
                    break;
                }
                turnedUnit.ReadyUnits += duration / oneUnitProductionSpeedPerSecond;
            }

            turnedUnit.DateLastUpgrade = lastUpgrade;

            return(turnedUnit);
        }
コード例 #2
0
        private Dictionary <string, TurnedUnit> SetUnitProgress()
        {
            var time  = UnixTime.UtcNow();
            var delay = 11000;
            var units = new Dictionary <string, TurnedUnit>();

            var turFrig = new TurnedUnit
            {
                DateLastUpgrade = time - delay,
                DateCreate      = time - delay,
                ReadyUnits      = 0,
                TotalCount      = 100,
                UnitName        = Frigate.NativeName
            };

            units.Add(Frigate.NativeName, turFrig);
            return(units);
        }
コード例 #3
0
        private static int CalcUnitDurationRemainTime(TurnedUnit tu, int baseTimeProduction, int buildLevel,
                                                      UserPremiumWorkModel userPremium, double?remainToComplete = null)
        {
            double rem;

            var modifedTime = CalculateTimeProduction(baseTimeProduction, userPremium.IsActive, buildLevel);


            if (remainToComplete == null)
            {
                rem = tu.TotalCount - tu.ReadyUnits;
            }
            else
            {
                rem = (double)remainToComplete;
            }


            if (!userPremium.IsActive)
            {
                if (buildLevel == 1)
                {
                    return((int)Math.Ceiling(baseTimeProduction * rem));
                }

                return((int)Math.Ceiling(modifedTime * rem));
            }

            var premiumRemainDuration = userPremium.EndTime - tu.DateLastUpgrade;
            var premiumUnitCount      = premiumRemainDuration / modifedTime;

            if (premiumUnitCount >= rem)
            {
                return((int)Math.Ceiling(modifedTime * rem));
            }
            var deltaUnit = rem - premiumUnitCount;

            return((int)Math.Ceiling((modifedTime * premiumUnitCount) + (deltaUnit * baseTimeProduction)));
        }
コード例 #4
0
        private static ItemProgress CalculateUnitProgress(TurnedUnit turnedUnit, int baseTimeProduction, int builLevel,
                                                          UserPremiumWorkModel userPremium, int hangarCount)
        {
            var remainToComplete = turnedUnit.TotalCount - turnedUnit.ReadyUnits;

            int?duration = null;

            if (remainToComplete > 0)
            {
                duration = CalcUnitDurationRemainTime(turnedUnit, baseTimeProduction, builLevel, userPremium,
                                                      remainToComplete);
            }

            return(new ItemProgress
            {
                Advanced = turnedUnit,
                StartTime = UnixTime.UtcNow(),
                Duration = duration,
                IsProgress = (duration != null),
                Level = hangarCount,
                RemainToComplete = remainToComplete
            });
        }
コード例 #5
0
        /// <summary>
        ///     Вычисляет данные для записи нового эллемента очереди юнита на мезере ил планете
        /// </summary>
        /// <param name="unitType">Native name Unit</param>
        /// <param name="count">Желаемое количество для покупки</param>
        /// <param name="resource">текушие ресурсы пользователя</param>
        /// <param name="unit">тип юнита который мы покупаем</param>
        /// <param name="resultPrice">Итоговая стоимость пачки с учетом проверки на нехватку ресурсов</param>
        /// <param name="unitTurnModel">новый эллемент очереди (еще не просумированный с основной очередью)</param>
        private static void InitializeUnitTurn(UnitType unitType, int count, StorageResources resource, UnitModel unit, out MaterialResource resultPrice, out TurnedUnit unitTurnModel)
        {
            var basePrice = unit.BasePrice;

            //вычисляем стоимость пачки
            var price = MaterialResource.CalcUnitsPrice(basePrice, count);
            int resultCount;

            //проверяем хватает ли ресурсов
            if (MaterialResource.EnoughResourses(resource.Current, price))
            {
                resultCount = count;
                resultPrice = price;
            }
            else
            {
                var newCount = CalculateMaxCount(basePrice, resource.Current);
                if (newCount == 0)
                {
                    throw new Exception(Error.NotEnoughResources);
                }
                resultCount = newCount;
                resultPrice = MaterialResource.CalcUnitsPrice(basePrice, newCount);
            }

            //устанавливаем модель
            var time = UnixTime.UtcNow();

            unitTurnModel = new TurnedUnit
            {
                TotalCount      = resultCount,
                DateCreate      = time,
                UnitType        = unitType,
                DateLastUpgrade = time
            };
        }
コード例 #6
0
        private static void FixProgreses(UserMothershipDataModel mother, UserPremiumWorkModel userPremium)
        {
            #region Premium

            var pt = userPremium.TimeLineStatus;

            #endregion

            #region CalcResource

            var lastUpgradeProductionTime = mother.LastUpgradeProductionTime;

            var beforeResource = mother.Resources.CloneDeep();

            var last    = pt?.Status?.Last();
            var curPrem = (last != null && (bool)last);

            //  var motherExtatracionLevel = 1;
            var motherExtatracionLevel = 22;

            StorageResources.CalculateProductionResources(beforeResource,
                                                          mother.ExtractionProportin, ref lastUpgradeProductionTime, motherExtatracionLevel,
                                                          curPrem,
                                                          ExtractionModule.BaseProportion.Ir,
                                                          ExtractionModule.BaseProportion.Dm,
                                                          ExtractionModule.GetPower,
                                                          (res) => { StorageResourcesService.FixCurrentResources(res); }
                                                          );

            if (!mother.Resources.Equals(beforeResource))
            {
                mother.Resources = beforeResource;
            }

            #region Laboratory

            if (mother.TechProgress.Select(i => i.Value).ToList().Any(i => i.IsProgress == true))
            {
                var techService = new BattleTeches(mother.TechProgress);
                if (techService.CalculateTechProgreses(techService.GetTeches(false), userPremium))
                {
                    mother.TechProgress = techService.ConvertToDbTeches();
                }
            }

            #endregion

            mother.LastUpgradeProductionTime = lastUpgradeProductionTime;

            #endregion


            if (mother.UnitProgress == null || !mother.UnitProgress.Any())
            {
                if (mother.UnitProgress == null)
                {
                    mother.UnitProgress = new Dictionary <UnitType, TurnedUnit>();
                }
                return;
            }

            #region Calc UnitProgress

            const int shipyardLevel = 1;
            var       pureTurn      = mother.UnitProgress;
            var       hangarUnits   = mother.Hangar;
            bool      unitInProgress;


            TurnedUnit.CalculateUserUnits(pt, ref pureTurn, out unitInProgress, ref hangarUnits, shipyardLevel,
                                          Unit.CalculateTrickyUnitTimeProduction,
                                          (unitType) => UnitHelper.GetBaseUnit(unitType).BasePrice.TimeProduction, Unit.CalculateTimeProduction);


            mother.UnitProgress = unitInProgress ? pureTurn : new Dictionary <UnitType, TurnedUnit>();
            mother.Hangar       = hangarUnits;

            #endregion
        }
コード例 #7
0
 private static void AddUnitToCurrenUnitTurn(ref Dictionary <UnitType, TurnedUnit> collection, TurnedUnit newItem)
 {
     if (collection.ContainsKey(newItem.UnitType))
     {
         collection[newItem.UnitType].TotalCount += newItem.TotalCount;
     }
     else
     {
         collection.Add(newItem.UnitType, newItem);
     }
 }
コード例 #8
0
        private static void FixProgreses(GDetailPlanetDataModel planet, UserPremiumWorkModel userPremium)
        {
            #region  Calc BuildProgress

            var pt = userPremium.TimeLineStatus;

            if (planet.BuildEnergyConverter.CheckProgressIsDone())
            {
                ItemProgress.ProgressUpdateComplite(planet.BuildEnergyConverter);
            }
            if (planet.BuildExtractionModule.CheckProgressIsDone())
            {
                ItemProgress.ProgressUpdateComplite(planet.BuildExtractionModule);
            }
            if (planet.BuildSpaceShipyard.CheckProgressIsDone())
            {
                ItemProgress.ProgressUpdateComplite(planet.BuildSpaceShipyard);
            }
            if (planet.BuildStorage.CheckProgressIsDone())
            {
                ItemProgress.ProgressUpdateComplite(planet.BuildStorage);
            }
            if (planet.Turels.CheckProgressIsDone())
            {
                ItemProgress.ProgressUpdateComplite(planet.Turels);
            }

            var extractionLevel = 1;
            if (planet.BuildExtractionModule?.Level != null)
            {
                extractionLevel = (int)planet.BuildExtractionModule.Level;
            }

            #endregion

            #region CalcResource

            var lastUpgradeProductionTime = planet.LastUpgradeProductionTime;

            var beforeResource = planet.Resources.CloneDeep();

            var last    = pt?.Status?.Last();
            var curPrem = (last != null && (bool)last);

            StorageResources.CalculateProductionResources(beforeResource,
                                                          planet.ExtractionProportin, ref lastUpgradeProductionTime, extractionLevel,
                                                          curPrem,
                                                          ExtractionModule.BaseProportion.Ir,
                                                          ExtractionModule.BaseProportion.Dm,
                                                          ExtractionModule.GetPower, (res) => { StorageResourcesService.FixCurrentResources(res); });


            if (!planet.Resources.Equals(beforeResource))
            {
                planet.Resources = beforeResource;
            }
            planet.LastUpgradeProductionTime = lastUpgradeProductionTime;

            #endregion

            if (planet.UnitProgress == null || !planet.UnitProgress.Any())
            {
                return;
            }

            #region Calc UnitProgress

            var  shipyardLevel = planet.BuildSpaceShipyard.Level ?? 1;
            var  pureTurn      = planet.UnitProgress;
            var  hangarUnits   = planet.Hangar;
            bool unitInProgress;


            TurnedUnit.CalculateUserUnits(pt, ref pureTurn, out unitInProgress, ref hangarUnits, shipyardLevel,
                                          Unit.CalculateTrickyUnitTimeProduction,
                                          (unitType) => UnitHelper.GetBaseUnit(unitType).BasePrice.TimeProduction, Unit.CalculateTimeProduction);


            planet.UnitProgress = unitInProgress ? pureTurn : new Dictionary <UnitType, TurnedUnit>();
            planet.Hangar       = hangarUnits;

            #endregion
        }
コード例 #9
0
        private static BuildItemUnitView GetUnitViewInSpaceShipyard(UnitType unitType, int hangarCount,
                                                                    TurnedUnit upgrade, ItemProgress spaceShipyard, UserPremiumWorkModel userPremium)
        {
            var unit = UnitHelper.GetBaseUnit(unitType);

            var baseTime = unit.BasePrice.TimeProduction;

            var buildLevel = 1;

            if (spaceShipyard?.Level != null)
            {
                buildLevel = (int)spaceShipyard.Level;
            }
            var price = unit.BasePrice.CreateNewFromThis();

            //=================

            price.TimeProduction =
                (int)Math.Ceiling(CalculateTimeProduction(baseTime, userPremium.IsActive, buildLevel));


            var progress = ((upgrade != null)
                ? CalculateUnitProgress(upgrade, baseTime, buildLevel, userPremium, hangarCount)
                : new ItemProgress
            {
                Level = hangarCount,
                IsProgress = false
            });


            var unitText = unit.Text;
            var model    = new BuildItemUnitView
            {
                Progress      = progress,
                TranslateName = unitText.Name,
                NativeName    = unit.Key,
                IconSelf      = unit.SpriteImages.Icon,
                Info          = new BuildDropItemInfo
                {
                    Description = unitText.Description,
                    DropImage   = unit.SpriteImages.Detail,
                    Data        = new BuildItemUnitData(true, unit.UnitStats)
                },
                //Action = new BuildDropItemAction
                //{
                //    ViewPath = BuildExtractionModuleActions.ViewPath,
                //    Data = new BuildExtractionModuleActions
                //    {
                //        //todo  реализовать
                //        Power = power,
                //        Percent = new MaterialResource().Init(percentE, percentIr, percentDm),
                //        ExtractionPerHour = new MaterialResource().Init(valE, valIr, valDm),
                //    }
                //},
                Update = new BuildDropItemUpdate
                {
                    Price         = price,
                    IsUnitUpgrade = true
                },
                IsBuildItem = false
            };

            model.SetComplexButtonView();
            model.Update.SetButtons();
            return(model);
        }