using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System;
public class DataRecord : MonoBehaviour {
public static DataRecord self;
private static Hashtable table;
// Use this for initialization
void Awake()
{
self = this;
}
public static int AddPet(PetXmlData data)
{
Hashtable tmp = new Hashtable();
tmp.Add("id", data.id);
tmp.Add("name", data.name);
tmp.Add("level", data.level);
tmp.Add("hp", data.hp);
tmp.Add("attack", data.attack);
tmp.Add("catchcost", data.catchcost);
tmp.Add("worth", data.worth);
tmp.Add("probability", data.probability);
tmp.Add("headImage", data.headImage);
tmp.Add("curHp", data.hp); //当前血量
tmp.Add("isFight", 0); //是否出战
int index = 0;
foreach (DictionaryEntry var in table)
{
if (var.Key.ToString().Contains("FightId") || var.Key.ToString().Contains("secret key"))
continue;
if(index < int.Parse(var.Key.ToString()))
index = int.Parse(var.Key.ToString());
}
table.Add((index+1).ToString(), tmp);
Save();
return (index + 1);
}
public static Hashtable GetPet(int id)//人物宠物表table索引id(不同于xml中宠物唯一id)
{
Hashtable tmp = table[id.ToString()] as Hashtable;
return tmp;
}
/// <summary>
///
/// </summary>
/// <param name="id">索引</param>
/// <returns></returns>
public static bool DelPet(int id)
{ //索引id
if (table.Contains(id.ToString()))
{
table.Remove(id.ToString());
return true;
}
else
return false;
}
public static bool SetFight(int id, int index, bool Fight = true)
{ //(拥有所有宠物列表中索引id,出战队伍索引位置index,是否出战Fight)
Hashtable tmp = table[id.ToString()] as Hashtable;
//if (int.Parse(tmp["isFight"].ToString()) == 1)//去掉后,即使选中已出战的宠物,也可继续(位置和你确认队伍一致)
//{
// Debug.Log(id + "已出战");
// return false;
//}
tmp["isFight"] = Fight ? 1 : 0;
table[id.ToString()] = tmp;
if (!table.ContainsKey("FightId" + index))
table.Add("FightId" + index, id);
else
table["FightId" + index] = id;
Save();
return true;
}
public static Hashtable GetFightData(int index)//位置
{
if(table.ContainsKey("FightId" + index))
{
int i = int.Parse(table["FightId" + index].ToString());
return GetPet(i);
}
else
return null;
}
public static int GetRecordIdByPos(int index)
{
if(table.ContainsKey("FightId" + index))
{
return int.Parse(table["FightId" + index].ToString());
}
return 0;
}
public static Hashtable GetPetList()
{
Hashtable tmp = new Hashtable();
foreach(DictionaryEntry var in table)
{
if (var.Key.ToString().Contains("FightId") || var.Key.ToString().Contains("secret key"))
continue;
Hashtable temp = var.Value as Hashtable;
tmp.Add(var.Key,temp);
}
return tmp;
}
public static bool GetFight(int id)
{
Hashtable tmp = table[id.ToString()] as Hashtable;
return int.Parse(tmp["isFight"].ToString()) == 1 ;
}
public static void AddPetHp(int id,int add)//索引为id 的宠物数据中 Hp变化
{
Hashtable tmp = table[id.ToString()] as Hashtable;
int hp = int.Parse(tmp["curHp"].ToString());
hp += add;
if (hp < 0) { hp = 0; }//hp小于0,置为0
tmp["curHp"] = hp;
table[id.ToString()] = tmp;
Save();
}
public static PetXmlData TranslateData(Hashtable data)
{
PetXmlData tmp = new PetXmlData();
tmp.id = int.Parse(data["id"].ToString());
tmp.hp = int.Parse(data["curHp"].ToString());
tmp.level = int.Parse(data["level"].ToString());
tmp.name = data["name"].ToString();
tmp.headImage = data["headImage"].ToString();
tmp.attack = int.Parse(data["attack"].ToString());
return tmp;
}
public static bool IsHavePet(int petID)//该宠物角色是否拥有
{
foreach(Hashtable tmp in table)
{
if(tmp.ContainsKey("id") && tmp["id"].ToString() == petID.ToString())
{
return true;
}
}
return false;
}
public static int GetPetHp(int id)
{
Hashtable tmp = table[id.ToString()] as Hashtable;
if(tmp !=null)
return int.Parse(tmp["curHp"].ToString());
return 0;
}
public static void Load()
{
if (PlayerPrefs.HasKey("data"))
{
string json = Decrypt(PlayerPrefs.GetString("data"));
if (!string.IsNullOrEmpty(json))
{
table = json.hashtableFromJson();
#if UNITY_ANDROID
string identity = SystemInfo.deviceUniqueIdentifier;
if (string.IsNullOrEmpty(identity))
{
identity = "datadata";
}
Debug.Log("device uniqueIdentifier = " + identity);
if (table.ContainsKey("secret key"))
{
if ((string)table["secret key"] != identity)
{
ClearData();
}
}
else
{
table.Add("secret key", identity);
}
#endif
return;
}
PlayerPrefs.DeleteKey("data");
}
table = new Hashtable();
}
public static void Save()
{
string json = table.toJson();
//Debug.Log("save data = " + json );
string encryptJson = Encrypt(json);
PlayerPrefs.SetString("data", encryptJson);
PlayerPrefs.Save();
}
public static void ClearData()
{
table.Clear();
Save();
}
private static string Encrypt(string toE)
{
// Monodevelop9Unity1File8Edit2View
byte[] keyArray = UTF8Encoding.UTF8.GetBytes("Monodevelop9Unity1File8Edit2View");
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toE);
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
private static string Decrypt(string toD)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes("Monodevelop9Unity1File8Edit2View");
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] toEncryptArray = Convert.FromBase64String(toD);
try
{
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
}
catch (Exception ex)
{
Debug.Log("Decrypt data failed, reset data. " + ex.Message);
return null;
}
}
}
DataRecord
最新推荐文章于 2022-11-15 19:10:07 发布