public bool CanAPurchaseBeMade(int softCurrency, int warshipPowerLevel, int warshipPowerPoints,
                                       out FaultReason?faultReason)
        {
            // Console.WriteLine($"{nameof(warshipPowerLevel)} {warshipPowerLevel} {nameof(warshipPowerPoints)} {warshipPowerPoints}");
            //Достать цену улучшения
            WarshipImprovementModel improvementModel = WarshipPowerScale.GetModel(warshipPowerLevel);

            if (improvementModel == null)
            {
                Console.WriteLine("У корабля уже максимальный уровень");
                faultReason = FaultReason.MaximumLevelAlreadyReached;
                return(false);
            }

            if (softCurrency < improvementModel.SoftCurrencyCost)
            {
                faultReason = FaultReason.InsufficientSoftCurrency;
                return(false);
            }

            if (warshipPowerPoints < improvementModel.PowerPointsCost)
            {
                faultReason = FaultReason.InsufficientWarshipPowerPoints;
                return(false);
            }

            faultReason = null;
            return(true);
        }
        public WarshipImprovementModel GetImprovementModel(int warshipPowerLevel)
        {
            WarshipImprovementModel improvementModel = WarshipPowerScale.GetModel(warshipPowerLevel);

            return(improvementModel);
        }
예제 #3
0
        public async Task <bool> TryBuyLevel([NotNull] string serviceId, int warshipId)
        {
            //Аккаунт существует?
            AccountDbDto accountDbDto = await accountDbReaderService.ReadAccountAsync(serviceId);

            if (accountDbDto == null)
            {
                throw new Exception("Такого аккаунта не существует");
            }

            //Корабль существует?
            WarshipDbDto warshipDbDto = accountDbDto.Warships.SingleOrDefault(dto => dto.Id == warshipId);

            if (warshipDbDto == null)
            {
                throw new Exception("Этому аккаунту не принаждлежит этот корабль");
            }

            bool canAPurchaseBeMade = warshipImprovementCostChecker
                                      .CanAPurchaseBeMade(accountDbDto.SoftCurrency, warshipDbDto.WarshipPowerLevel, warshipDbDto.WarshipPowerPoints, out var faultReason);

            if (!canAPurchaseBeMade)
            {
                throw new Exception("Невозможно осуществить покупку улучшения для корабля по причине " + faultReason);
            }

            WarshipImprovementModel improvementModel = warshipImprovementCostChecker.GetImprovementModel(warshipDbDto.WarshipPowerLevel);

            Console.WriteLine("текущий  wpp " + warshipDbDto.WarshipPowerLevel);
            //Записать транзакцию
            Transaction transaction = new Transaction
            {
                AccountId         = accountDbDto.Id,
                DateTime          = DateTime.UtcNow,
                TransactionTypeId = TransactionTypeEnum.WarshipImprovement,
                WasShown          = false,
                Increments        = new List <Increment>
                {
                    new Increment
                    {
                        IncrementTypeId = IncrementTypeEnum.WarshipLevel,
                        Amount          = warshipDbDto.WarshipPowerLevel + 1,
                        WarshipId       = warshipId
                    }
                },
                Decrements = new List <Decrement>
                {
                    new Decrement
                    {
                        DecrementTypeId = DecrementTypeEnum.SoftCurrency,
                        Amount          = improvementModel.SoftCurrencyCost
                    },
                    new Decrement
                    {
                        DecrementTypeId = DecrementTypeEnum.WarshipPowerPoints,
                        Amount          = improvementModel.PowerPointsCost,
                        WarshipId       = warshipDbDto.Id
                    }
                }
            };

            await dbContext.Transactions.AddAsync(transaction);

            await dbContext.SaveChangesAsync();

            return(true);
        }