Пример #1
0
        /// <summary>
        ///     planet builds only!
        /// </summary>
        /// <param name="planetId"></param>
        /// <param name="buildItemNativeName"></param>
        /// <exception cref="ArgumentNullException">Error.ConnectionUserNotExist</exception>
        /// <exception cref="ArgumentNullException">Error.ConnectionUserNotConnected</exception>
        /// <returns>updated progress for build item </returns>
        public async Task <ItemProgress> BuildItemUpgraded(int planetId, string buildItemNativeName)
        {
            BuildNativeNames nativeName = default(BuildNativeNames);

            _tryCatch(() =>
            {
                if (planetId == 0)
                {
                    throw new Exception(Error.InputDataIncorrect);
                }

                var suc = Enum.TryParse(buildItemNativeName, out nativeName);
                if (!suc)
                {
                    throw new Exception(Error.InputDataIncorrect);
                }
            });


            return(await _contextAction(connection =>
            {
                var cr = _getCurrentUser(connection);
                var planet = _gDetailPlanetService.GetUserPlanet(connection, planetId, cr.UserId);
                if (planet == null)
                {
                    throw new ArgumentNullException(Error.PlanetChangeOwner);
                }
                var crPremium = cr.GetPremiumWorkModel(connection, _storeService);
                planet = _synchronizer.UserPlanet(connection, planet, crPremium, _gDetailPlanetService);

                switch (nativeName)
                {
                case BuildNativeNames.EnergyConverter:
                    return _energyConverter.Upgraded(connection, planet, cr.UserId, crPremium.IsActive, _svp);

                case BuildNativeNames.ExtractionModule:
                    return _extractionModule.Upgraded(connection, planet, cr.UserId, crPremium.IsActive, _svp);

                case BuildNativeNames.SpaceShipyard:
                    return _spaceShipyard.Upgraded(connection, planet, cr.UserId, crPremium.IsActive, _svp);

                case BuildNativeNames.Storage:
                    return _storage.Upgraded(connection, planet, cr.UserId, crPremium.IsActive, _svp);

                case BuildNativeNames.Turel:
                    return _turels.Upgraded(connection, planet, cr.UserId, crPremium.IsActive, _svp);

                default:
                    throw new ArgumentException(Error.InputDataIncorrect);
                }
            }));
        }
Пример #2
0
        /// <summary>
        ///     planet builds only!
        /// </summary>
        /// <param name="data"></param>
        /// <param name="buildItemNativeName"></param>
        /// <exception cref="ArgumentNullException">Error.ConnectionUserNotExist</exception>
        /// <exception cref="ArgumentNullException">Error.ConnectionUserNotConnected</exception>
        /// <returns> bool (true - upgrade added and data was changed) || int => wen buy for cc retturn new result cc</returns>
        public async Task <object> BuildItemUpgrade(UnitTurnOut data, string buildItemNativeName)
        {
            BuildNativeNames nativeName = default(BuildNativeNames);

            _tryCatch(() =>
            {
                if (data == null)
                {
                    throw new ArgumentNullException(nameof(data), Error.InputDataIncorrect);
                }
                if (data.OwnId == 0)
                {
                    throw new ArgumentException(Error.InputDataIncorrect);
                }

                var suc = Enum.TryParse(buildItemNativeName, out nativeName);
                if (!suc)
                {
                    throw new ArgumentException(Error.InputDataIncorrect);
                }
            });

            return(await _contextAction <object>(connection =>
            {
                var cr = _getCurrentUser(connection);

                var planet = _gDetailPlanetService.GetUserPlanet(connection, data.OwnId, cr.UserId);
                if (planet == null)
                {
                    throw new ArgumentNullException(Error.PlanetChangeOwner);
                }
                var crPremium = cr.GetPremiumWorkModel(connection, _storeService);
                planet = _synchronizer.UserPlanet(connection, planet, crPremium, _gDetailPlanetService);


                if (nativeName == BuildNativeNames.EnergyConverter)
                {
                    var preResult = new BuildUpgrade(planet.Resources, planet.BuildEnergyConverter,
                                                     BuildNativeNames.EnergyConverter.ToString());


                    //todo  проверить премиум (непонятно что а коммент)
                    if (data.ForCc)
                    {
                        return _energyConverter.UpgradeForCc(connection, planet, cr.UserId, crPremium.IsActive,
                                                             preResult,
                                                             _svp);
                    }

                    var newResult = BuildUpgrade.SetUpgrade(preResult,
                                                            _energyConverter.CalcPrice(preResult.GetLevel(), crPremium.IsActive));
                    if (preResult.Equals(newResult))
                    {
                        return false;
                    }
                    preResult = newResult;
                    preResult.Progress.StartTime = UnixTime.UtcNow();
                    planet.Resources = preResult.StorageResources;
                    planet.BuildEnergyConverter = preResult.Progress;
                }
                else if (nativeName == BuildNativeNames.ExtractionModule)
                {
                    var preResult = new BuildUpgrade(planet.Resources, planet.BuildExtractionModule,
                                                     BuildNativeNames.ExtractionModule.ToString());


                    //todo  проверить премиум (непонятно что а коммент)
                    if (data.ForCc)
                    {
                        return _extractionModule.UpgradeForCc(connection, planet, cr.UserId, crPremium.IsActive, preResult, _svp);
                    }

                    var newResult = BuildUpgrade.SetUpgrade(preResult,
                                                            _extractionModule.CalcPrice(preResult.GetLevel(), crPremium.IsActive));

                    if (preResult.Equals(newResult))
                    {
                        return false;
                    }
                    preResult = newResult;
                    preResult.Progress.StartTime = UnixTime.UtcNow();
                    planet.Resources = preResult.StorageResources;
                    planet.BuildExtractionModule = preResult.Progress;
                }
                else if (nativeName == BuildNativeNames.SpaceShipyard)
                {
                    var preResult = new BuildUpgrade(planet.Resources, planet.BuildSpaceShipyard,
                                                     BuildNativeNames.SpaceShipyard.ToString());

                    //todo  проверить премиум (непонятно что за коммент)
                    if (data.ForCc)
                    {
                        return _spaceShipyard.UpgradeForCc(connection, planet, cr.UserId, crPremium.IsActive, preResult,
                                                           _svp);
                    }

                    var newResult = BuildUpgrade.SetUpgrade(preResult,
                                                            _spaceShipyard.CalcPrice(preResult.GetLevel(), crPremium.IsActive));

                    if (preResult.Equals(newResult))
                    {
                        return false;
                    }
                    preResult = newResult;
                    preResult.Progress.StartTime = UnixTime.UtcNow();
                    planet.Resources = preResult.StorageResources;
                    planet.BuildSpaceShipyard = preResult.Progress;
                }
                else if (nativeName == BuildNativeNames.Storage)
                {
                    var preResult = new BuildUpgrade(planet.Resources, planet.BuildStorage,
                                                     BuildNativeNames.Storage.ToString());


                    if (data.ForCc)
                    {
                        return _storage.UpgradeForCc(connection, planet, cr.UserId, crPremium.IsActive, preResult,
                                                     _svp);
                    }

                    var newResult = BuildUpgrade.SetUpgrade(preResult,
                                                            _storage.CalcPrice(preResult.GetLevel(), crPremium.IsActive));

                    if (preResult.Equals(newResult))
                    {
                        return false;
                    }
                    preResult = newResult;
                    preResult.Progress.StartTime = UnixTime.UtcNow();

                    planet.Resources = preResult.StorageResources;
                    planet.BuildStorage = preResult.Progress;
                }
                else if (nativeName == BuildNativeNames.Turel)
                {
                    var preResult = new BuildUpgrade(planet.Resources, planet.Turels,
                                                     BuildNativeNames.Turel.ToString());


                    if (data.ForCc)
                    {
                        return _turels.UpgradeForCc(connection, planet, cr.UserId, crPremium.IsActive, preResult,
                                                    _svp);
                    }
                    var newResult = BuildUpgrade.SetUpgrade(preResult, _turels.CalcPrice(1, crPremium.IsActive));

                    if (preResult.Equals(newResult))
                    {
                        return false;
                    }
                    preResult = newResult;
                    preResult.Progress.StartTime = UnixTime.UtcNow();

                    planet.Resources = preResult.StorageResources;
                    planet.Turels = preResult.Progress;
                }
                else
                {
                    throw new ArgumentException(Error.InputDataIncorrect);
                }
                _gDetailPlanetService.AddOrUpdate(connection, planet);

                return true;
            }));
        }