public static void ChangeCurrency(string type, int valueChange)
 {
     if (_currentPlayer != null)
     {
         if (_currentPlayer.wallet != null)
         {
             bool isFound = false;
             foreach (PlayerCurrencyData currency in _currentPlayer.wallet)
             {
                 if (currency.currencyType == type)
                 {
                     currency.value += valueChange;
                     isFound         = true;
                     break;
                 }
             }
             if (!isFound)
             {
                 PlayerCurrencyData newCurrency = new PlayerCurrencyData();
                 newCurrency.id           = _currentPlayer.wallet.Count + 1;
                 newCurrency.currencyType = type;
                 newCurrency.value        = valueChange;
                 _currentPlayer.wallet.Add(newCurrency);
             }
             SaveData();
         }
     }
 }
示例#2
0
        public void ResetWallet()
        {
            // For currencies already in the player wallet reset the amount to the initialValue.

            foreach (PlayerCurrencyData playerCurrency in SpilUnityEditorImplementation.pData.Wallet.currencies)
            {
                int initialValue = SpilUnityEditorImplementation.gData.currencies.FirstOrDefault(a => a.id == playerCurrency.id).initialValue;
                int newDelta     = initialValue - playerCurrency.currentBalance;

                playerCurrency.currentBalance = initialValue;
                playerCurrency.delta          = newDelta + playerCurrency.delta;
            }

            // Check the currencies in the game data, if a currency is not currently in the wallet but has an initialvalue > 0 then add it.

            foreach (SpilCurrencyData gameDataCurrency in SpilUnityEditorImplementation.gData.currencies)
            {
                if (gameDataCurrency.initialValue > 0 && !SpilUnityEditorImplementation.pData.Wallet.currencies.Any(a => a.id == gameDataCurrency.id))
                {
                    PlayerCurrencyData playerCurrency = new PlayerCurrencyData(gameDataCurrency);

                    playerCurrency.currentBalance = gameDataCurrency.initialValue;
                    playerCurrency.delta          = gameDataCurrency.initialValue;

                    SpilUnityEditorImplementation.pData.Wallet.currencies.Add(playerCurrency);
                }
            }
        }
示例#3
0
 private void UpdateCurrency(PlayerCurrencyData currency)
 {
     foreach (PlayerCurrencyData playerCurrency in Wallet.currencies)
     {
         if (playerCurrency.id != currency.id)
         {
             continue;
         }
         playerCurrency.currentBalance = currency.currentBalance;
         playerCurrency.delta          = currency.delta;
     }
 }
 private void UpdateCurrency(PlayerCurrencyData currency)
 {
     for (int i = 0; i < Wallet.currencies.Count; i++) {
         if (Wallet.currencies [i].id == currency.id) {
             Wallet.currencies [i].currentBalance = currency.currentBalance;
             Wallet.currencies [i].delta = currency.delta;
         }
     }
 }
        public void ProcessPlayerDataResponse(ResponseEvent response)
        {
            WalletData receivedWallet = null;
            InventoryData receivedInventory = null;

            if (response.data.HasField ("wallet")) {

                JSONObject walletJSON = response.data.GetField ("wallet");

                receivedWallet = new WalletData ();

                if (walletJSON.HasField ("currencies")) {
                    receivedWallet.currencies = new List<PlayerCurrencyData> ();

                    JSONObject currenciesJSON = walletJSON.GetField ("currencies");

                    for (int i = 0; i < currenciesJSON.Count; i++) {
                        PlayerCurrencyData currency = new PlayerCurrencyData ();

                        currency.id = (int)currenciesJSON.list [i].GetField ("id").n;
                        currency.currentBalance = (int)currenciesJSON.list [i].GetField ("currentBalance").n;
                        currency.delta = (int)currenciesJSON.list [i].GetField ("delta").n;

                        receivedWallet.currencies.Add (currency);
                    }
                }

                receivedWallet.offset = (int)walletJSON.GetField ("offset").n;
                receivedWallet.logic = walletJSON.GetField ("logic").str;

            }

            if (response.data.HasField ("inventory")) {

                JSONObject inventoryJSON = response.data.GetField ("inventory");

                receivedInventory = new InventoryData ();

                if (inventoryJSON.HasField ("items")) {
                    receivedInventory.items = new List<PlayerItemData> ();

                    JSONObject itemsJSON = inventoryJSON.GetField ("items");

                    for (int i = 0; i < itemsJSON.Count; i++) {
                        PlayerItemData item = new PlayerItemData ();

                        item.id = (int)itemsJSON.list [i].GetField ("id").n;
                        item.amount = (int)itemsJSON.list [i].GetField ("amount").n;
                        item.delta = (int)itemsJSON.list [i].GetField ("delta").n;

                        receivedInventory.items.Add (item);
                    }
                }

                receivedInventory.offset = (int)inventoryJSON.GetField ("offset").n;
                receivedInventory.logic = inventoryJSON.GetField ("logic").str;

            }

            CalculatePlayerDataResponse (receivedWallet, receivedInventory);
        }
示例#6
0
        public void BuyBundle(int bundleId, string reason, string reasonDetails, string location, string transactionId)
        {
            PlayerDataUpdatedData updatedData = new PlayerDataUpdatedData();

            SpilBundleData bundle = GetBundleFromObjects(bundleId);

            if (bundle == null || reason == null)
            {
                SpilLogging.Error("Error adding bundle to player inventory!");
                return;
            }

            Promotion promotion        = Spil.Instance.GetPromotions().GetBundlePromotion(bundleId);
            bool      isPromotionValid = false;

            if (promotion != null)
            {
                isPromotionValid = promotion.IsValid();
            }

            List <SpilBundlePriceData> bundlePrices = new List <SpilBundlePriceData>();

            if (isPromotionValid)
            {
                foreach (PriceOverride priceOverride in promotion.PriceOverride)
                {
                    SpilBundlePriceData bundlePriceData = new SpilBundlePriceData();
                    bundlePriceData.currencyId = priceOverride.Id;
                    bundlePriceData.value      = priceOverride.Amount;

                    bundlePrices.Add(bundlePriceData);
                }
            }
            else
            {
                bundlePrices = bundle.prices;
            }

            foreach (SpilBundlePriceData bundlePrice in bundlePrices)
            {
                PlayerCurrencyData currency = GetCurrencyFromWallet(bundlePrice.currencyId);

                if (currency == null)
                {
                    SpilLogging.Error("Currency does not exist!");
                    return;
                }

                int currentBalance = currency.currentBalance;
                int updatedBalance = currentBalance - bundlePrice.value;

                if (updatedBalance < 0)
                {
                    SpilLogging.Error("Not enough balance for currency!");
                    return;
                }

                int updatedDelta = -bundlePrice.value + currency.delta;

                if (updatedDelta == 0)
                {
                    updatedDelta = -bundlePrice.value;
                }

                currency.delta          = updatedDelta;
                currency.currentBalance = updatedBalance;

                UpdateCurrency(currency);
                updatedData.currencies.Add(currency);
            }

            foreach (SpilBundleItemData bundleItem in bundle.items)
            {
                SpilItemData gameItem = GetItemFromObjects(bundleItem.id);

                if (gameItem == null)
                {
                    SpilLogging.Error("Item does not exist!");
                    return;
                }
                ;
                PlayerItemData item = new PlayerItemData();
                item.id                 = gameItem.id;
                item.name               = gameItem.name;
                item.type               = gameItem.type;
                item.displayName        = gameItem.displayName;
                item.displayDescription = gameItem.displayDescription;
                item.isGacha            = gameItem.isGacha;
                item.content            = gameItem.content;

                PlayerItemData inventoryItem = GetItemFromInventory(bundleItem.id);

                int inventoryItemAmount;

                if (inventoryItem != null)
                {
                    inventoryItemAmount = inventoryItem.amount;

                    inventoryItemAmount = inventoryItemAmount + bundleItem.amount;

                    inventoryItem.delta  = bundleItem.amount;
                    inventoryItem.amount = inventoryItemAmount;

                    UpdateItem(inventoryItem);

                    updatedData.items.Add(inventoryItem);
                }
                else
                {
                    inventoryItemAmount = bundleItem.amount;

                    item.delta  = inventoryItemAmount;
                    item.amount = inventoryItemAmount;

                    Inventory.items.Add(item);

                    updatedData.items.Add(item);
                }
            }

            if (isPromotionValid)
            {
                foreach (ExtraEntity extraEntity in promotion.ExtraEntities)
                {
                    if (extraEntity.Type.Equals("CURRENCY"))
                    {
                        PlayerCurrencyData currency = GetCurrencyFromWallet(extraEntity.Id);

                        if (currency == null)
                        {
                            SpilLogging.Error("Currency does not exist!");
                            return;
                        }

                        currency.currentBalance = currency.currentBalance + extraEntity.Amount;
                        currency.delta          = currency.delta + extraEntity.Amount;

                        UpdateCurrency(currency);

                        PlayerCurrencyData temp = null;

                        foreach (PlayerCurrencyData playerCurrency in updatedData.currencies)
                        {
                            if (playerCurrency.id == extraEntity.Id)
                            {
                                temp = playerCurrency;
                            }
                        }

                        if (temp != null)
                        {
                            updatedData.currencies.Remove(temp);
                        }

                        updatedData.currencies.Add(currency);
                    }
                    else if (extraEntity.Type.Equals("ITEM") || extraEntity.Type.Equals("GACHA"))
                    {
                        SpilItemData gameItem = GetItemFromObjects(extraEntity.Id);

                        if (gameItem == null)
                        {
                            SpilLogging.Error("Item does not exist!");
                            return;
                        }
                        ;
                        PlayerItemData item = new PlayerItemData();
                        item.id                 = gameItem.id;
                        item.name               = gameItem.name;
                        item.type               = gameItem.type;
                        item.displayName        = gameItem.displayName;
                        item.displayDescription = gameItem.displayDescription;
                        item.isGacha            = gameItem.isGacha;
                        item.content            = gameItem.content;

                        PlayerItemData inventoryItem = GetItemFromInventory(extraEntity.Id);

                        int inventoryItemAmount;

                        if (inventoryItem != null)
                        {
                            inventoryItemAmount = inventoryItem.amount;

                            inventoryItemAmount = inventoryItemAmount + extraEntity.Amount;

                            inventoryItem.delta  = extraEntity.Amount;
                            inventoryItem.amount = inventoryItemAmount;

                            UpdateItem(inventoryItem);

                            PlayerItemData temp = null;

                            foreach (PlayerItemData playerItem in updatedData.items)
                            {
                                if (playerItem.id == extraEntity.Id)
                                {
                                    temp = playerItem;
                                }
                            }

                            if (temp != null)
                            {
                                updatedData.items.Remove(temp);
                            }

                            updatedData.items.Add(inventoryItem);
                        }
                        else
                        {
                            inventoryItemAmount = extraEntity.Amount;

                            item.delta  = inventoryItemAmount;
                            item.amount = inventoryItemAmount;

                            Inventory.items.Add(item);

                            updatedData.items.Add(item);
                        }
                    }
                }
            }

            UserDataManager.UpdateUserDataVersions();
            UserDataManager.UpdateUserDataMeta();

            updatedData.reason = reason;

            SpilUnityImplementationBase.firePlayerDataUpdated(JsonHelper.getJSONFromObject(updatedData));

            if (isPromotionValid)
            {
                PromotionsManager.PromotionData.First(a => a.id == promotion.Id).amountPurchased++;

                PromotionsManager.SendBoughtPromotion(promotion.Id);
            }

            SendUpdatePlayerDataEvent(bundle, reason, reasonDetails, location, transactionId);
        }
示例#7
0
        public void WalletOperation(string action, int currencyId, int amount, string reason, string reasonDetails, string location, string transactionId)
        {
            if (currencyId <= 0 || reason == null)
            {
                SpilLogging.Error("Error updating wallet!");
                return;
            }

            PlayerCurrencyData currency = null;

            foreach (PlayerCurrencyData playerCurrency in Wallet.currencies)
            {
                if (playerCurrency.id == currencyId)
                {
                    currency = playerCurrency;
                }
            }

            if (currency == null)
            {
                SpilLogging.Error("Currency does not exist!");
                return;
            }

            int currentBalance = currency.currentBalance;

            if (action.Equals("subtract"))
            {
                amount = -amount;
            }

            int updatedBalance = currentBalance + amount;

            if (updatedBalance < 0)
            {
                SpilLogging.Error("Not enough balance for currency!");
                return;
            }

            int updatedDelta = amount + currency.delta;

            if (updatedDelta == 0)
            {
                updatedDelta = amount;
            }

            currency.delta          = updatedDelta;
            currency.currentBalance = updatedBalance;

            if (Wallet.logic.Equals("CLIENT"))
            {
                UpdateCurrency(currency);

                UserDataManager.UpdateUserDataVersions();
                UserDataManager.UpdateUserDataMeta();

                PlayerDataUpdatedData updatedData = new PlayerDataUpdatedData();
                updatedData.currencies.Add(currency);
                updatedData.reason = reason;

                SpilUnityImplementationBase.firePlayerDataUpdated(JsonHelper.getJSONFromObject(updatedData));

                SendUpdatePlayerDataEvent(null, reason, reasonDetails, location, transactionId);
            }
            else if (Wallet.logic.Equals("SERVER"))
            {
            }
        }
示例#8
0
        public void CalculatePlayerDataResponse(WalletData receivedWallet, InventoryData receivedInventory, bool fromInit)
        {
            bool updated = false;
            PlayerDataUpdatedData updatedData = new PlayerDataUpdatedData();

            if (receivedWallet != null)
            {
                foreach (PlayerCurrencyData playerCurrency in Wallet.currencies)
                {
                    playerCurrency.delta = 0;
                }

                if (Wallet.offset < receivedWallet.offset && receivedWallet.currencies.Count > 0)
                {
                    foreach (PlayerCurrencyData playerCurrency in receivedWallet.currencies)
                    {
                        if (receivedWallet.logic.Equals("CLIENT"))
                        {
                            PlayerCurrencyData currency =
                                Wallet.currencies.FirstOrDefault(a => a.id == playerCurrency.id);

                            if (currency == null)
                            {
                                continue;
                            }
                            if (Wallet.offset == 0 && receivedWallet.offset != 0)
                            {
                                currency.currentBalance = playerCurrency.currentBalance;
                            }
                            else
                            {
                                if (playerCurrency.delta != 0)
                                {
                                    int updatedBalance =
                                        currency.currentBalance + playerCurrency.delta;

                                    if (updatedBalance < 0)
                                    {
                                        updatedBalance = 0;
                                    }

                                    currency.currentBalance = updatedBalance;
                                }
                            }

                            updated = true;
                            updatedData.currencies.Add(currency);
                        }
                        else if (receivedWallet.logic.Equals("SERVER"))
                        {
                        }
                    }
                }

                Wallet.offset = receivedWallet.offset;
                Wallet.logic  = receivedWallet.logic;
            }

            if (receivedInventory != null)
            {
                foreach (PlayerItemData playerItem in Inventory.items)
                {
                    playerItem.delta = 0;
                }

                if (Inventory.offset < receivedInventory.offset && receivedInventory.items.Count > 0)
                {
                    List <PlayerItemData> itemsToBeAdded = new List <PlayerItemData>();

                    foreach (PlayerItemData playerItem in receivedInventory.items)
                    {
                        if (receivedInventory.logic.Equals("CLIENT"))
                        {
                            PlayerItemData item = Inventory.items.FirstOrDefault(a => a.id == playerItem.id);
                            if (item != null && playerItem.delta != 0)
                            {
                                item.amount = item.amount + playerItem.delta;
                            }
                            else
                            {
                                itemsToBeAdded.Add(playerItem);
                            }

                            updated = true;
                        }
                        else if (receivedInventory.logic.Equals("SERVER"))
                        {
                        }

                        updatedData.items.Add(playerItem);
                    }

                    foreach (PlayerItemData itemToAdd in itemsToBeAdded)
                    {
                        SpilItemData item = GetItemFromObjects(itemToAdd.id);

                        if (item != null && itemToAdd.amount > 0)
                        {
                            PlayerItemData playerItem = new PlayerItemData();
                            playerItem.id     = item.id;
                            playerItem.name   = item.name;
                            playerItem.type   = item.type;
                            playerItem.amount = itemToAdd.amount;
                            playerItem.value  = itemToAdd.value;
                            playerItem.delta  = 0;

                            playerItem.displayName        = item.displayName;
                            playerItem.displayDescription = item.displayDescription;
                            playerItem.isGacha            = item.isGacha;
                            playerItem.content            = item.content;

                            Inventory.items.Add(playerItem);

                            updated = true;
                        }
                    }
                }

                Inventory.offset = receivedInventory.offset;
                Inventory.logic  = receivedInventory.logic;
            }

            if (updated)
            {
                UserDataManager.UpdateUserDataVersions();
                updatedData.reason = PlayerDataUpdateReasons.ServerUpdate;

                SpilUnityImplementationBase.firePlayerDataUpdated(JsonHelper.getJSONFromObject(updatedData));
            }

            if (!fromInit)
            {
                SpilUnityImplementationBase.fireUserDataAvailable();
            }
        }
示例#9
0
        public static void ProcessPlayerDataResponse(ResponseEvent response)
        {
            WalletData    receivedWallet    = null;
            InventoryData receivedInventory = null;

            if (response.data.HasField("wallet"))
            {
                JSONObject walletJSON = response.data.GetField("wallet");

                receivedWallet = new WalletData();

                if (walletJSON.HasField("currencies"))
                {
                    receivedWallet.currencies = new List <PlayerCurrencyData>();

                    JSONObject currenciesJSON = walletJSON.GetField("currencies");

                    for (int i = 0; i < currenciesJSON.Count; i++)
                    {
                        PlayerCurrencyData currency = new PlayerCurrencyData();

                        currency.id             = (int)currenciesJSON.list[i].GetField("id").n;
                        currency.currentBalance = (int)currenciesJSON.list[i].GetField("currentBalance").n;
                        currency.delta          = (int)currenciesJSON.list[i].GetField("delta").n;

                        receivedWallet.currencies.Add(currency);
                    }
                }

                receivedWallet.offset = (long)walletJSON.GetField("offset").n;
                receivedWallet.logic  = walletJSON.GetField("logic").str;
            }

            if (response.data.HasField("inventory"))
            {
                JSONObject inventoryJSON = response.data.GetField("inventory");

                receivedInventory = new InventoryData();

                if (inventoryJSON.HasField("items"))
                {
                    receivedInventory.items = new List <PlayerItemData>();

                    JSONObject itemsJSON = inventoryJSON.GetField("items");

                    for (int i = 0; i < itemsJSON.Count; i++)
                    {
                        PlayerItemData item = new PlayerItemData();

                        item.id     = (int)itemsJSON.list[i].GetField("id").n;
                        item.amount = (int)itemsJSON.list[i].GetField("amount").n;
                        item.delta  = (int)itemsJSON.list[i].GetField("delta").n;

                        receivedInventory.items.Add(item);
                    }
                }

                receivedInventory.offset = (long)inventoryJSON.GetField("offset").n;
                receivedInventory.logic  = inventoryJSON.GetField("logic").str;
            }

            if (response.action.ToLower().Trim().Equals("update"))
            {
                SpilUnityEditorImplementation.pData.CalculatePlayerDataResponse(receivedWallet, receivedInventory, false);
            }
            else if (response.action.ToLower().Trim().Equals("syncerror"))
            {
                UserDataManager.ProcessSyncError();
            }
            else if (response.action.ToLower().Trim().Equals("dropped"))
            {
                UserDataManager.ProcessDroppedResponse("Event dropped!");
            }
            else if (response.action.ToLower().Trim().Equals("lockerror"))
            {
                UserDataManager.ProcessLockError();
            }
        }
        public static void ProcessUserDataResponse(ResponseEvent responseEvent)
        {
            WalletData             receivedWallet    = null;
            InventoryData          receivedInventory = null;
            string                 gameStateData     = null;
            List <UserDataVersion> userDataVersions  = null;
            UserDataMeta           userDataMeta      = null;
            bool externalChange = false;

            if (responseEvent.data.HasField("playerData"))
            {
                JSONObject playerDataJSON = responseEvent.data.GetField("playerData");
                if (playerDataJSON.HasField("wallet"))
                {
                    JSONObject walletJSON = playerDataJSON.GetField("wallet");

                    receivedWallet = new WalletData();

                    if (walletJSON.HasField("currencies"))
                    {
                        receivedWallet.currencies = new List <PlayerCurrencyData>();

                        JSONObject currenciesJSON = walletJSON.GetField("currencies");

                        for (int i = 0; i < currenciesJSON.Count; i++)
                        {
                            PlayerCurrencyData currency = new PlayerCurrencyData();

                            currency.id             = (int)currenciesJSON.list[i].GetField("id").n;
                            currency.currentBalance = (int)currenciesJSON.list[i].GetField("currentBalance").n;
                            currency.delta          = (int)currenciesJSON.list[i].GetField("delta").n;

                            receivedWallet.currencies.Add(currency);
                        }
                    }

                    receivedWallet.offset = (long)walletJSON.GetField("offset").n;
                    receivedWallet.logic  = walletJSON.GetField("logic").str;
                }

                if (playerDataJSON.HasField("inventory"))
                {
                    JSONObject inventoryJSON = playerDataJSON.GetField("inventory");

                    receivedInventory = new InventoryData();

                    if (inventoryJSON.HasField("items"))
                    {
                        receivedInventory.items = new List <PlayerItemData>();

                        JSONObject itemsJSON = inventoryJSON.GetField("items");

                        for (int i = 0; i < itemsJSON.Count; i++)
                        {
                            PlayerItemData item = new PlayerItemData();

                            item.id     = (int)itemsJSON.list[i].GetField("id").n;
                            item.amount = (int)itemsJSON.list[i].GetField("amount").n;
                            item.delta  = (int)itemsJSON.list[i].GetField("delta").n;

                            receivedInventory.items.Add(item);
                        }
                    }

                    receivedInventory.offset = (long)inventoryJSON.GetField("offset").n;
                    receivedInventory.logic  = inventoryJSON.GetField("logic").str;
                }
            }

            if (responseEvent.data.HasField("gameState"))
            {
                gameStateData = responseEvent.data.GetField("gameState").Print();
            }

            if (responseEvent.data.HasField("externalChange"))
            {
                externalChange = responseEvent.data.GetField("externalChange").b;
            }

            if (responseEvent.data.HasField("deviceVersions"))
            {
                JSONObject deviceVersionsJSON = responseEvent.data.GetField("deviceVersions");
                userDataVersions = new List <UserDataVersion>();

                if (deviceVersionsJSON.Count > 0)
                {
                    for (int i = 0; i < deviceVersionsJSON.Count; i++)
                    {
                        UserDataVersion userDataVersion = new UserDataVersion();
                        userDataVersion.deviceId = deviceVersionsJSON.keys[i];
                        userDataVersion.version  = (int)deviceVersionsJSON.list[i].i;

                        userDataVersions.Add(userDataVersion);
                    }
                }
            }

            if (responseEvent.data.HasField("metaData"))
            {
                JSONObject metaDataJSON = responseEvent.data.GetField("metaData");

                userDataMeta = new UserDataMeta();

                if (metaDataJSON.HasField("serverTime"))
                {
                    userDataMeta.serverTime = metaDataJSON.GetField("serverTime").i;
                }

                if (metaDataJSON.HasField("clientTime"))
                {
                    userDataMeta.clientTime = metaDataJSON.GetField("clientTime").i;
                }

                if (metaDataJSON.HasField("timezoneOffset"))
                {
                    userDataMeta.timezoneOffset = (int)metaDataJSON.GetField("timezoneOffset").i;
                }

                if (metaDataJSON.HasField("deviceModel"))
                {
                    userDataMeta.deviceModel = metaDataJSON.GetField("deviceModel").str;
                }

                if (metaDataJSON.HasField("appVersion"))
                {
                    userDataMeta.appVersion = metaDataJSON.GetField("appVersion").str;
                }
            }

            if (responseEvent.action.ToLower().Trim().Equals("request"))
            {
                UserDataManager.ProcessRequestUserData(receivedWallet, receivedInventory, externalChange, gameStateData, userDataVersions, userDataMeta);
            }
            else if (responseEvent.action.ToLower().Trim().Equals("mergeconflict"))
            {
                UserDataManager.ProcessMergeConflict(receivedWallet, receivedInventory, gameStateData, userDataVersions, userDataMeta);
            }
            else if (responseEvent.action.ToLower().Trim().Equals("merge"))
            {
                UserDataManager.ProcessMergeUserData(userDataVersions);
            }
            else if (responseEvent.action.ToLower().Trim().Equals("lockerror"))
            {
                UserDataManager.ProcessLockError();
            }
            else if (responseEvent.action.ToLower().Trim().Equals("syncerror"))
            {
                UserDataManager.ProcessSyncError();
            }
        }