private void ApplySkinnerBoxItemInfo(SkinnerBoxItemInfo skinnerBoxItemInfo)
        {
            ValueSkinnerBoxItemInfo valueSkinnerBoxItemInfo = skinnerBoxItemInfo as ValueSkinnerBoxItemInfo;

            if (valueSkinnerBoxItemInfo != null)
            {
                ServiceLocator.Resolve <IUserManagementService>().AddScoreAndBalance(0, valueSkinnerBoxItemInfo.Value);
            }
            PurchasableItemSkinnerBoxItemInfo purchasableItemSkinnerBoxItemInfo = skinnerBoxItemInfo as PurchasableItemSkinnerBoxItemInfo;

            if (purchasableItemSkinnerBoxItemInfo != null)
            {
                RentSkinnerBoxItemInfo rentSkinnerBoxItemInfo = purchasableItemSkinnerBoxItemInfo as RentSkinnerBoxItemInfo;
                if (rentSkinnerBoxItemInfo != null)
                {
                    if (rentSkinnerBoxItemInfo.PurchaseDatas != null)
                    {
                        foreach (PurchaseData purchaseData in rentSkinnerBoxItemInfo.PurchaseDatas.Where(data => data != null))
                        {
                            PurchaseNoneLevelBaseData purchaseNoneLevelBaseData = purchaseData as PurchaseNoneLevelBaseData;
                            if (purchaseNoneLevelBaseData != null && purchaseNoneLevelBaseData.PurchasableItemInfo != null)
                            {
                                ServiceLocator.Resolve <IStoreService>().RentItem(purchaseNoneLevelBaseData.PurchasableItemInfo, 100, TimeSpan.FromSeconds(rentSkinnerBoxItemInfo.RentDuration));
                            }
                            PurchaseLevelBaseData purchaseLevelBaseData = purchaseData as PurchaseLevelBaseData;
                            if (purchaseLevelBaseData != null && purchaseLevelBaseData.PurchasableItemInfo != null)
                            {
                                PurchasableLevelInfo[] purchasableLevelInfos = purchaseLevelBaseData.PurchasableItemInfo.GetPurchasableLevelInfos();
                                if (purchaseLevelBaseData.Level >= 0 && purchaseLevelBaseData.Level < purchasableLevelInfos.Length)
                                {
                                    ((StoreService)ServiceLocator.Resolve <IStoreService>()).RentItem(purchasableLevelInfos[purchaseLevelBaseData.Level], 100, TimeSpan.FromSeconds(rentSkinnerBoxItemInfo.RentDuration));
                                }
                            }
                        }
                    }
                }
                else
                {
                    if (purchasableItemSkinnerBoxItemInfo.PurchaseDatas != null)
                    {
                        foreach (PurchaseData purchaseData in purchasableItemSkinnerBoxItemInfo.PurchaseDatas.Where(data => data != null))
                        {
                            PurchaseNoneLevelBaseData purchaseNoneLevelBaseData = purchaseData as PurchaseNoneLevelBaseData;
                            if (purchaseNoneLevelBaseData != null && purchaseNoneLevelBaseData.PurchasableItemInfo != null)
                            {
                                ServiceLocator.Resolve <IStoreService>().PurchaseItem(purchaseNoneLevelBaseData.PurchasableItemInfo, 100);
                            }
                            PurchaseLevelBaseData purchaseLevelBaseData = purchaseData as PurchaseLevelBaseData;
                            if (purchaseLevelBaseData != null && purchaseLevelBaseData.PurchasableItemInfo != null)
                            {
                                ((StoreService)ServiceLocator.Resolve <IStoreService>()).InternalPurchaseItem(purchaseLevelBaseData.PurchasableItemInfo, 100, purchaseLevelBaseData.Level);
                            }
                        }
                    }
                }
            }
        }
        private SkinnerBoxItemInfo PickItem(SkinnerBoxItemInfo[] items)
        {
            int                total   = items.Sum(info => info.Chance == 0 ? 1 : info.Chance);
            Random             random  = new Random();
            int                rand    = random.Next(total);
            int                counter = 0;
            SkinnerBoxItemInfo result  = items.First();

            foreach (SkinnerBoxItemInfo boxItemInfo in items)
            {
                counter += (boxItemInfo.Chance == 0 ? 1 : boxItemInfo.Chance);
                if (rand < counter)
                {
                    result = boxItemInfo;
                    break;
                }
            }
            return(result);
        }
        public SkinnerBoxItemInfo OpenBox(SkinnerBoxInfo boxInfo)
        {
            SkinnerBoxSavedData skinnerBoxSavedData =
                ServiceLocator.Resolve <IStorageService>().ResolveData <SkinnerBoxSavedData>() ??
                new SkinnerBoxSavedData();
            FreeSkinnerBoxInfo freeSkinnerBoxInfo = boxInfo as FreeSkinnerBoxInfo;

            if (freeSkinnerBoxInfo != null)
            {
                if (!IsFreeSkinnerBoxAvailable(freeSkinnerBoxInfo))
                {
                    throw new Exception("no free skinner box avialable.");
                }
                SkinnerBoxItemInfo skinnerBoxItemInfo = PickItem(freeSkinnerBoxInfo.Items);
                skinnerBoxSavedData.FreeItemUseTime[boxInfo.Id] = DateTime.Now +
                                                                  TimeSpan.FromSeconds(freeSkinnerBoxInfo.UseDelay);
                ServiceLocator.Resolve <IStorageService>().UpdateData(skinnerBoxSavedData);
                ApplySkinnerBoxItemInfo(skinnerBoxItemInfo);
                return(skinnerBoxItemInfo);
            }
            PurchableSkinnerBoxInfo purchableSkinnerBoxInfo = boxInfo as PurchableSkinnerBoxInfo;

            if (purchableSkinnerBoxInfo != null)
            {
                if (GetPurchableskinnerBoxCount(purchableSkinnerBoxInfo) <= 0)
                {
                    throw new Exception("no purchasable skinner box avialable.");
                }
                SkinnerBoxItemInfo skinnerBoxItemInfo = PickItem(purchableSkinnerBoxInfo.Items);
                skinnerBoxSavedData.ItemCount[purchableSkinnerBoxInfo.Id]--;
                ServiceLocator.Resolve <IStorageService>().UpdateData(skinnerBoxSavedData);
                ApplySkinnerBoxItemInfo(skinnerBoxItemInfo);
                return(skinnerBoxItemInfo);
            }
            return(null);
        }