IdleGirl/Assets/Plugins/DarkTonic/MasterAudio/Scripts/Utility/PlayerPrefs.cs

280 lines
9.1 KiB
C#

/*
PreviewLabs.PlayerPrefs
Public Domain
To the extent possible under law, PreviewLabs has waived all copyright and related or neighboring rights to this document. This work is published from: Belgium.
http://www.previewlabs.com
*/
using System;
using System.Collections;
using System.IO;
using UnityEngine;
/*! \cond PRIVATE */
#if UNITY_WEBPLAYER || UNITY_WP8 || UNITY_METRO
// can't compile this class
#else
// ReSharper disable once CheckNamespace
namespace DarkTonic.MasterAudio {
public static class FilePlayerPrefs {
private static readonly Hashtable PlayerPrefsHashtable = new Hashtable();
private static bool _hashTableChanged;
private static string _serializedOutput = "";
private static readonly string SerializedInput = "";
private const string ParametersSeperator = ";";
private const string KeyValueSeperator = ":";
private static readonly string FileName = Application.persistentDataPath + "/MAPlayerPrefs.txt";
static FilePlayerPrefs() {
//load previous settings
// ReSharper disable once JoinDeclarationAndInitializer
StreamReader fileReader;
if (!File.Exists(FileName))
{
return;
}
fileReader = new StreamReader(FileName);
SerializedInput = fileReader.ReadLine();
Deserialize();
fileReader.Close();
}
public static bool HasKey(string key) {
return PlayerPrefsHashtable.ContainsKey(key);
}
public static void SetString(string key, string value) {
if (!PlayerPrefsHashtable.ContainsKey(key)) {
PlayerPrefsHashtable.Add(key, value);
} else {
PlayerPrefsHashtable[key] = value;
}
_hashTableChanged = true;
}
public static void SetInt(string key, int value) {
if (!PlayerPrefsHashtable.ContainsKey(key)) {
PlayerPrefsHashtable.Add(key, value);
} else {
PlayerPrefsHashtable[key] = value;
}
_hashTableChanged = true;
}
public static void SetFloat(string key, float value) {
if (!PlayerPrefsHashtable.ContainsKey(key)) {
PlayerPrefsHashtable.Add(key, value);
} else {
PlayerPrefsHashtable[key] = value;
}
_hashTableChanged = true;
}
public static void SetBool(string key, bool value) {
if (!PlayerPrefsHashtable.ContainsKey(key)) {
PlayerPrefsHashtable.Add(key, value);
} else {
PlayerPrefsHashtable[key] = value;
}
_hashTableChanged = true;
}
public static string GetString(string key) {
if (PlayerPrefsHashtable.ContainsKey(key)) {
return PlayerPrefsHashtable[key].ToString();
}
return null;
}
public static string GetString(string key, string defaultValue) {
if (PlayerPrefsHashtable.ContainsKey(key)) {
return PlayerPrefsHashtable[key].ToString();
} else {
PlayerPrefsHashtable.Add(key, defaultValue);
_hashTableChanged = true;
return defaultValue;
}
}
public static int GetInt(string key) {
if (!PlayerPrefsHashtable.ContainsKey(key))
{
return 0;
}
var val = PlayerPrefsHashtable[key];
if (val is int)
{
return (int) val;
}
var converted = int.Parse(val.ToString());
PlayerPrefsHashtable[key] = converted;
val = converted;
// ReSharper disable once PossibleInvalidCastException
return (int)val;
}
public static int GetInt(string key, int defaultValue) {
if (PlayerPrefsHashtable.ContainsKey(key)) {
return (int)PlayerPrefsHashtable[key];
} else {
PlayerPrefsHashtable.Add(key, defaultValue);
_hashTableChanged = true;
return defaultValue;
}
}
public static float GetFloat(string key) {
if (!PlayerPrefsHashtable.ContainsKey(key))
{
return 0.0f;
}
var val = PlayerPrefsHashtable[key];
if (val is float)
{
return (float) val;
}
var converted = float.Parse(val.ToString());
PlayerPrefsHashtable[key] = converted;
val = converted;
// ReSharper disable once PossibleInvalidCastException
return (float)val;
}
public static float GetFloat(string key, float defaultValue) {
if (PlayerPrefsHashtable.ContainsKey(key)) {
return (float)PlayerPrefsHashtable[key];
} else {
PlayerPrefsHashtable.Add(key, defaultValue);
_hashTableChanged = true;
return defaultValue;
}
}
public static bool GetBool(string key) {
if (PlayerPrefsHashtable.ContainsKey(key)) {
return (bool)PlayerPrefsHashtable[key];
}
return false;
}
public static bool GetBool(string key, bool defaultValue) {
if (PlayerPrefsHashtable.ContainsKey(key)) {
return (bool)PlayerPrefsHashtable[key];
} else {
PlayerPrefsHashtable.Add(key, defaultValue);
_hashTableChanged = true;
return defaultValue;
}
}
public static void DeleteKey(string key) {
PlayerPrefsHashtable.Remove(key);
}
public static void DeleteAll() {
PlayerPrefsHashtable.Clear();
}
public static void Flush() {
if (!_hashTableChanged)
{
return;
}
Serialize();
var fileWriter = File.CreateText(FileName);
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
// ReSharper disable HeuristicUnreachableCode
if (fileWriter == null) {
Debug.LogWarning("PlayerPrefs::Flush() opening file for writing failed: " + FileName);
}
// ReSharper restore HeuristicUnreachableCode
fileWriter.WriteLine(_serializedOutput);
fileWriter.Close();
_serializedOutput = "";
}
private static void Serialize() {
var myEnumerator = PlayerPrefsHashtable.GetEnumerator();
while (myEnumerator.MoveNext()) {
if (_serializedOutput != "") {
_serializedOutput += " " + ParametersSeperator + " ";
}
_serializedOutput += EscapeNonSeperators(myEnumerator.Key.ToString()) + " " + KeyValueSeperator + " " + EscapeNonSeperators(myEnumerator.Value.ToString()) + " " + KeyValueSeperator + " " + myEnumerator.Value.GetType();
}
}
private static void Deserialize() {
var parameters = SerializedInput.Split(new[] { " " + ParametersSeperator + " " }, StringSplitOptions.None);
foreach (var parameter in parameters) {
var parameterContent = parameter.Split(new[] { " " + KeyValueSeperator + " " }, StringSplitOptions.None);
PlayerPrefsHashtable.Add(DeEscapeNonSeperators(parameterContent[0]), GetTypeValue(parameterContent[2], DeEscapeNonSeperators(parameterContent[1])));
if (parameterContent.Length > 3) {
Debug.LogWarning("PlayerPrefs::Deserialize() parameterContent has " + parameterContent.Length + " elements");
}
}
}
private static string EscapeNonSeperators(string inputToEscape) {
inputToEscape = inputToEscape.Replace(KeyValueSeperator, "\\" + KeyValueSeperator);
inputToEscape = inputToEscape.Replace(ParametersSeperator, "\\" + ParametersSeperator);
return inputToEscape;
}
private static string DeEscapeNonSeperators(string inputToDeEscape) {
inputToDeEscape = inputToDeEscape.Replace("\\" + KeyValueSeperator, KeyValueSeperator);
inputToDeEscape = inputToDeEscape.Replace("\\" + ParametersSeperator, ParametersSeperator);
return inputToDeEscape;
}
public static object GetTypeValue(string typeName, string value) {
switch (typeName)
{
case "System.String":
return value;
case "System.Int32":
return Convert.ToInt32(value);
case "System.Boolean":
return Convert.ToBoolean(value);
case "System.Single":
return Convert.ToSingle(value);
default:
Debug.Log("Unsupported type: " + typeName);
break;
}
return null;
}
}
}
#endif
/*! \endcond */