Advertisement
MaGuSware2012

Untitled

Dec 26th, 2012
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.57 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5.  
  6. public class SaverLoader
  7. {
  8.     static string SAVPATH = Application.dataPath+"\\save_games\\";
  9.    
  10.     FileStream file;
  11.     List<SavableStaticInstance> savableObjects;
  12.     Hashtable savableTempObjects;
  13.    
  14.     static SaverLoader instance = null;
  15.    
  16.     GameObject def;
  17.    
  18.     public static SaverLoader GetInstance()
  19.     {
  20.         if (instance == null)
  21.             instance = new SaverLoader();
  22.        
  23.         return instance;           
  24.     }
  25.    
  26.     private SaverLoader()
  27.     {
  28.         savableObjects = new List<SavableStaticInstance>();
  29.         savableTempObjects = new Hashtable();
  30.        
  31.         if (!Directory.Exists(SAVPATH))
  32.             Directory.CreateDirectory(SAVPATH);
  33.     }
  34.    
  35.     ~SaverLoader()
  36.     {}
  37.    
  38.     public int RegisterSavable(SavableStaticInstance obj)
  39.     {
  40.         savableObjects.Add(obj);
  41.         return savableObjects.Count - 1;
  42.     }
  43.    
  44.     int nb = 0;
  45.     public int RegisterTempObject(SavableDynamicInstance obj)
  46.     {
  47.         savableTempObjects.Add( nb, obj );
  48.         nb++;
  49.         return nb - 1;
  50.     }
  51.    
  52.     public void KillTempObject(int id)
  53.     {
  54.         savableTempObjects.Remove(id);
  55.     }
  56.    
  57.     public void SaveGame(string save)
  58.     {
  59.         file = File.Open(SAVPATH + save + ".sav", FileMode.OpenOrCreate);
  60.        
  61.         byte[] levelName = System.Convert.FromBase64String( Application.loadedLevelName );
  62.         byte[] len = System.BitConverter.GetBytes(levelName.Length);
  63.        
  64.         file.Write(len, 0, sizeof(int));
  65.         file.Write(levelName, 0, levelName.Length);
  66.                
  67.         for (int i = 0; i < savableObjects.Count; i++)
  68.         {
  69.             savableObjects[i].Serialize(file);
  70.         }
  71.        
  72.         file.Write( System.BitConverter.GetBytes( savableTempObjects.Count ), 0, sizeof(int) );
  73.        
  74.         foreach(SavableDynamicInstance i in savableTempObjects.Values)
  75.         {  
  76.             string s = i.gameObject.name;
  77.             s = s.Replace("(Clone)", "");
  78.             Debug.Log(s);
  79.            
  80.             len = System.BitConverter.GetBytes(s.Length);
  81.             file.Write(len, 0, sizeof(int));
  82.            
  83.             for (int j = 0; j < s.Length; j++)
  84.             {
  85.                 byte[] b = System.BitConverter.GetBytes(s[j]);
  86.                
  87.                 file.Write(b, 0, sizeof(char));
  88.             }
  89.            
  90.             i.Serialize(file); 
  91.         }
  92.        
  93.         file.Close();
  94.     }
  95.    
  96.     public void LoadGame(string save)
  97.     {
  98.         file = File.Open(SAVPATH + save + ".sav", FileMode.Open);
  99.        
  100.         byte[] len = new byte[sizeof(int)];
  101.         file.Read(len, 0, sizeof(int));
  102.  
  103.         int iLen = System.BitConverter.ToInt32(len,0);
  104.  
  105.         byte[] levelName = new byte[iLen];
  106.         file.Read(levelName, 0, iLen);
  107.  
  108.         string lName = System.Convert.ToBase64String( levelName );
  109.  
  110.         if (lName != Application.loadedLevelName)
  111.         {
  112.             savableObjects.Clear();
  113.             Application.LoadLevel(lName);
  114.             def = new GameObject();
  115.             def.AddComponent<LoadDeferrer>();
  116.         }
  117.         else
  118.         {      
  119.             foreach(SavableDynamicInstance i in savableTempObjects.Values)
  120.             {  
  121.                 GameObject.Destroy(i.gameObject);
  122.             }
  123.            
  124.             FinalizeLoad();
  125.         }
  126.     }
  127.    
  128.     public void FinalizeLoad()
  129.     {
  130.         for(int i = 0; i < savableObjects.Count; i++)
  131.         {
  132.             savableObjects[i].Deserialize(file);   
  133.         }
  134.        
  135.         byte[] b = new byte[sizeof(int)];
  136.         file.Read(b, 0, sizeof(int));
  137.        
  138.         int max = System.BitConverter.ToInt32(b, 0);
  139.  
  140.         for (int i = 0; i < max; i++)
  141.         {
  142.             //GET PREFAB NAME AS "string s"
  143.             b = new byte[sizeof(int)];
  144.             file.Read(b, 0, sizeof(int));
  145.             int len = System.BitConverter.ToInt32(b, 0);
  146.             Debug.Log(len);
  147.            
  148.             string s = "";
  149.             for ( int j = 0; j < len; j++ )
  150.             {
  151.                 b = new byte[sizeof(char)];
  152.                 file.Read(b, 0, sizeof(char));
  153.            
  154.                 s += System.BitConverter.ToChar(b, 0);     
  155.             }
  156.             //----------------------
  157.            
  158.             //Instantiate the prefab
  159.             if(s != "")
  160.             {
  161.                 //Debug.Log(s);
  162.                 //Debug.Log(GameObject.Instantiate(Resources.Load(s)));
  163.                
  164.                 GameObject go = (GameObject)GameObject.Instantiate(Resources.Load(s));
  165.                 go.GetComponent<SavableDynamicInstance>().Deserialize(file);
  166.                
  167.                 //Deserialize the prefab
  168.                 //((SavableDynamicInstance)savableTempObjects[i]).Deserialize(file);
  169.             }
  170.         }
  171.        
  172.         file.Close();
  173.        
  174.         GameObject.Destroy(def);
  175.         def = null;
  176.        
  177.         GUIMessage.GetInstance().DisplayMessage("Game Loaded!");
  178.     }
  179.    
  180.     static public List<string> GetSaveFiles()
  181.     {
  182.         List<string> saveFiles = new List<string>();
  183.        
  184.         DirectoryInfo info = new DirectoryInfo(SAVPATH);
  185.         FileInfo[] fileInfo = info.GetFiles();
  186.         foreach (FileInfo file in fileInfo)
  187.         {
  188.             string path = file.ToString();
  189.             path.Replace(SAVPATH, "");
  190.             int idx = path.LastIndexOf("\\");
  191.             path = path.Substring(idx+1);
  192.             idx = path.LastIndexOf(".");
  193.             path = path.Remove(idx);
  194.             saveFiles.Add(path);       
  195.         }
  196.        
  197.         return saveFiles;      
  198.     }
  199.    
  200.     public void Reset()
  201.     {
  202.         savableObjects.Clear();
  203.         savableTempObjects.Clear();
  204.         nb = 0;
  205.     }
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement