Beispiel #1
0
    private void SaveGame(string saveName)
    {
        if (!SaveUtilities.IsValidName(saveName))
        {
            Debug.Log($"Error saving {saveName}");
            return;
        }
        var savePath = Path.Combine(SaveUtilities.GetSaveFolderPath(), saveName + Path.DirectorySeparatorChar);

        Directory.CreateDirectory(savePath);
        var mapPath  = Path.Combine(savePath, SaveUtilities.MapFileName);
        var statPath = Path.Combine(savePath, SaveUtilities.StatFileName);

        SaveTextureToFile(ClassManager.MainScript.mainTexture, mapPath);
        File.WriteAllText(statPath, JsonUtility.ToJson(ClassManager.InventoryScript.GetSaveState(), true));

        Debug.Log($"Game {saveName} saved!");
    }
Beispiel #2
0
    public void Populate()
    {
        SaveUtilities.EnsureSaveFolderPath();
        var potentialSaves = Directory.GetDirectories(SaveUtilities.GetSaveFolderPath());
        var saves          = potentialSaves.Where(s => SaveUtilities.IsValidSave(s)).ToList();

        Debug.Log($"Got {saves.Count} saves.");
        foreach (Transform child in ContentPanel.transform)
        {
            Destroy(child.gameObject);
        }
        for (int saveIndex = 0; saveIndex < saves.Count; saveIndex++)
        {
            string s     = saves[saveIndex];
            var    panel = Instantiate(SavePanelAsset, ContentPanel.transform);
            panel.GetComponent <SaveItemPanelScript>().Init(new DirectoryInfo(s).Name, s);
            panel.GetComponent <RectTransform>().anchoredPosition = new Vector2(0, -70 * saveIndex);
            panel.GetComponent <Button>().onClick.AddListener(() => { SetSaveGameNameFromButton(panel.GetComponent <SaveItemPanelScript>()); });
        }
    }
Beispiel #3
0
    static object GetValue(System.Type fieldType, object data)
    {
        object value = null;

        // Generics
        if (fieldType.IsGenericType)
        {
            //List<>
            if (fieldType.GetGenericTypeDefinition() == typeof(List <>))
            {
                if (data is IList)
                {
                    // Create list
                    IList newList = System.Activator.CreateInstance(fieldType) as IList;
                    // If we are a list of Classes, 2d array/list, not primitive types
                    System.Type listItemType = fieldType.GetGenericArguments()[0];
                    bool        isClassType  = listItemType.IsClass && listItemType != typeof(string);
                    bool        isGeneric    = listItemType.IsGenericType;
                    bool        isArray      = listItemType.IsArray;
                    // Add from list
                    foreach (object listValue in (data as IList))
                    {
                        object v = null;
                        if (isClassType || isGeneric || isArray)
                        {
                            v = GetValue(listItemType, listValue);
                        }
                        else
                        {
                            v = ChangeType(listValue, listItemType);
                        }
                        newList.Add(v);
                    }
                    value = newList;
                }
                else
                {
                    Debug.LogError("Incorrect data format for a List<>. {0} but should be IList" + data.GetType().Name);
                }
            }
            else
            {
                Debug.LogError("No support to read in the type " + fieldType.Name);
            }
            // No support for any other generics yet
        }
        // Array
        else if (fieldType.IsArray)
        {
            if (data is IList)
            {
                // Create array
                System.Array array = System.Array.CreateInstance(fieldType.GetElementType(), (data as IList).Count);
                // If we are a list of Classes, 2d array/list, not primitive types
                System.Type arrayItemType = fieldType.GetElementType();
                bool        isClassType   = arrayItemType.IsClass && arrayItemType != typeof(string);
                bool        isGeneric     = arrayItemType.IsGenericType;
                bool        isArray       = arrayItemType.IsArray;
                // Add from list
                int i = 0;
                foreach (object listValue in (data as IList))
                {
                    object v = null;
                    if (isClassType || isGeneric || isArray)
                    {
                        v = GetValue(arrayItemType, listValue);
                    }
                    else
                    {
                        v = ChangeType(listValue, arrayItemType);
                    }
                    array.SetValue(v, i++);
                }
                value = array;
            }
            else
            {
                value = null; // Empty arrays are now set to null
                              //Debug.LogError("Incorrect data format for an array. {0} but should be IList" + data.GetType().Name);
            }
        }
        // Object field
        else if (fieldType.IsClass && fieldType != typeof(string))
        {
            Dictionary <string, object> objectData = data as Dictionary <string, object>;
            if (objectData != null)
            {
                value = System.Activator.CreateInstance(fieldType);
                ApplyData(value, objectData, "", "");
            }
            else
            {
                Debug.LogError("Incorrect data format for a class. {0} but should be Dictionary<string, object>" + data.GetType().Name);
            }
        }
        else if (fieldType == typeof(DateTime))
        {
            if (data != null)
            {
                string strData = (string)data;
                if (strData.Equals(""))        //If it's null it's an error, if it's empty means default value.
                {
                    value = DateTime.MinValue; //If field was left empty on DB, use a default value.
                }
                else if (strData != null)
                {
                    value = (object)SaveUtilities.ParseDateTime(strData, DateTime.Now, "GameData.GetValue: ");
                }
                else
                {
                    Debug.LogError("Incorrect data format for a Date. {0} but should be a valid DateTime using format DD/MM/YYYY hh:mm:ss" + data.GetType().Name);
                }
            }
            else
            {
                Debug.LogError("Incorrect data format for a Date. {0} but should be a valid DateTime using format DD/MM/YYYY hh:mm:ss" + data.GetType().Name);
            }
        }
        // Individual field
        else
        {
            try
            {
                System.Type valueType = data.GetType();
                if (fieldType.IsEnum && (valueType == typeof(int) || valueType == typeof(long)))
                {
                    value = System.Enum.ToObject(fieldType, data);
                }
                else
                {
                    value = ChangeType(data, fieldType);
                    if (fieldType.IsEnum)
                    {
                        if (value == null)
                        {
                            Debug.LogError(string.Format("Unable to convert {0} to type {1}", data, fieldType));
                        }
                    }
                }
            }
            catch (System.Exception e)
            {
                Debug.LogError(e.Message);
                Debug.LogError(string.Format("Unable to convert {0} to type {1}", data.GetType(), fieldType));
            }
        }
        return(value);
    }