public static Level Read(string line)
            {
                var parts         = line.Split(' ');
                int loadedVersion = int.Parse(parts[0]);

                if (Version != loadedVersion)
                {
                    if (loadedVersion >= LowestSupportedVersion)
                    {
                        Debug.Log(string.Format(
                                      "Current save version is {0}, but {1} found. Will be upgraded.", Version, loadedVersion));
                    }
                    else
                    {
                        Debug.LogError(string.Format("Expected version {0} but {1} found", Version, loadedVersion));
                        return(null);
                    }
                }

                string levelName = In(parts[1]);
                var    level     = new Level(levelName);

                // load properties
                for (int i = 2; i < parts.Length; i += 2)
                {
                    string        key = In(parts[i]);
                    PropertyValue value;

                    if (loadedVersion == 1)
                    {
                        bool val = bool.Parse(In(parts[i + 1]));
                        value = PropertyValue.FromBoolean(val);
                    }
                    else
                    {
                        value = PropertyValue.Read(parts[i + 1]);
                    }

                    // in versions 1 and 2 level select screen was saving 'locked' property
                    // with the wrong key
                    if (loadedVersion <= 2 && key == "locked")
                    {
                        key = PropertyLocked;
                        if (!level.properties.ContainsKey(key))
                        {
                            level.properties.Add(key, value);
                        }
                    }
                    else
                    {
                        level.properties.Add(key, value);
                    }
                }

                return(level);
            }
            public bool SetPropertyBoolean(string key, bool val)
            {
                var prop = PropertyValue.FromBoolean(val);

                if (properties.ContainsKey(key) && properties[key].Equals(prop))
                {
                    return(false);
                }

                properties[key] = prop;
                return(true);
            }