Changeset - 3154dda31272
[Not reviewed]
default
0 1 0
Jason Maltzen - 5 years ago 2019-11-02 02:23:43
jason@hiddenachievement.com
Slightly safer parsing of reaction files
1 file changed with 234 insertions and 206 deletions:
0 comments (0 inline, 0 general)
PlayerProfile.cs
Show inline comments
...
 
@@ -31,10 +31,13 @@ namespace DesertPaintLab
 
{
 
	public class PlayerProfile
 
	{
 
        public string Name { get; private set; }
 
		string directory;
 
		string reactFile;
 
    public class PlayerProfile
 
    {
 
        public string Name
 
        {
 
            get; private set;
 
        }
 
        string directory;
 
        string reactFile;
 
        string reagentFile;
 
        string settingsFile;
 
		
 

	
 
        static Regex recipeHeaderRegex = new Regex(@"^--- Recipe: (?<colorname>(\w*\s)*\w+)\s*");
...
 
@@ -44,4 +47,4 @@ namespace DesertPaintLab
 
        // ingredient -> [ingredient, reaction]
 
		//SortedDictionary<string, SortedDictionary<string, Reaction>> reactions =
 
		//	new SortedDictionary<string, SortedDictionary<string, Reaction>>();
 
        //SortedDictionary<string, SortedDictionary<string, Reaction>> reactions =
 
        //	new SortedDictionary<string, SortedDictionary<string, Reaction>>();
 
        SortedDictionary<string, PaintRecipe> recipes;
...
 
@@ -50,4 +53,6 @@ namespace DesertPaintLab
 
        Settings settings = new Settings();
 
        public Settings ProfileSettings { 
 
            get { 
 
        public Settings ProfileSettings
 
        {
 
            get
 
            {
 
                return settings;
...
 
@@ -60,3 +65,4 @@ namespace DesertPaintLab
 
        {
 
            get {
 
            get
 
            {
 
                return current;
...
 
@@ -65,9 +71,12 @@ namespace DesertPaintLab
 

	
 
        public string LastError { get; private set; }
 
		
 
		public PlayerProfile(string name, string directory)
 
		{
 
			this.Name = name;
 
			this.directory = directory;
 
			this.reactFile = System.IO.Path.Combine(directory, "dp_reactions.txt");
 
        public string LastError
 
        {
 
            get; private set;
 
        }
 

	
 
        public PlayerProfile(string name, string directory)
 
        {
 
            this.Name = name;
 
            this.directory = directory;
 
            this.reactFile = System.IO.Path.Combine(directory, "dp_reactions.txt");
 
            this.reagentFile = System.IO.Path.Combine(directory, "ingredients.txt");
...
 
@@ -84,3 +93,3 @@ namespace DesertPaintLab
 
            }
 
		}
 
        }
 

	
...
 
@@ -88,3 +97,4 @@ namespace DesertPaintLab
 
        {
 
            get {
 
            get
 
            {
 
                return this.directory;
...
 
@@ -95,3 +105,4 @@ namespace DesertPaintLab
 
        {
 
            get {
 
            get
 
            {
 
                return this.reactions;
...
 
@@ -102,3 +113,4 @@ namespace DesertPaintLab
 
        {
 
            get {
 
            get
 
            {
 
                return this.reagentFile;
...
 
@@ -109,3 +121,4 @@ namespace DesertPaintLab
 
        {
 
            get {
 
            get
 
            {
 
                return this.recipes;
...
 
@@ -116,3 +129,4 @@ namespace DesertPaintLab
 
        {
 
            get {
 
            get
 
            {
 
                return this.ribbonRecipes;
...
 
@@ -123,3 +137,4 @@ namespace DesertPaintLab
 
        {
 
            get {
 
            get
 
            {
 
                int count = 0;
...
 
@@ -138,3 +153,4 @@ namespace DesertPaintLab
 
        {
 
            get {
 
            get
 
            {
 
                int count = 0;
...
 
@@ -150,8 +166,8 @@ namespace DesertPaintLab
 
        }
 
		
 
		public bool Initialize()
 
		{
 

	
 
        public bool Initialize()
 
        {
 
            // Copy template files into new directory.
 
            string templatePath = FileUtils.FindApplicationResourceDirectory("template");
 
            
 

 
            if (!System.IO.Directory.Exists(templatePath))
...
 
@@ -162,12 +178,12 @@ namespace DesertPaintLab
 

	
 
			// Create new directory.
 
			System.IO.Directory.CreateDirectory(directory);
 
		    
 
			DirectoryInfo di = new DirectoryInfo(templatePath);
 
			FileInfo[] templateFiles = di.GetFiles();
 
            // Create new directory.
 
            System.IO.Directory.CreateDirectory(directory);
 

	
 
			foreach (FileInfo file in templateFiles)
 
			{
 
            DirectoryInfo di = new DirectoryInfo(templatePath);
 
            FileInfo[] templateFiles = di.GetFiles();
 

	
 
            foreach (FileInfo file in templateFiles)
 
            {
 
                string destFile = System.IO.Path.Combine(directory, file.Name);
 
				System.IO.File.Copy(file.FullName, destFile, true);
 
                System.IO.File.Copy(file.FullName, destFile, true);
 
                if (!File.Exists(destFile))
...
 
@@ -176,65 +192,69 @@ namespace DesertPaintLab
 
                    return false;
 
                }					
 
			}
 
                }
 
            }
 
            return true;
 
		}
 
		
 
		public void ConvertFromPP(string ppFile, string dpFile)
 
		{
 
			string line;
 
			using (StreamReader reader = new StreamReader(ppFile))
 
			{
 
				using (StreamWriter writer = new StreamWriter(dpFile))
 
				{
 
					while ((line = reader.ReadLine()) != null) 
 
                	{
 
						string[] tokens = line.Split(null);
 
						if ((tokens.Length > 0) && (tokens[0] != "//"))
 
						{							
 
							// Write reaction.
 
							writer.Write(tokens[0] + " " + tokens[2] + " ");
 
							switch (tokens[4])
 
							{
 
							case "W":
 
								writer.WriteLine(tokens[6] + " " + tokens[6] + " " + tokens[6]);
 
								break;
 
							case "R":
 
								writer.WriteLine(tokens[6] + " 0 0");
 
								break;
 
							case "G":
 
								writer.WriteLine("0 " + tokens[6] + " 0");
 
								break;
 
							case "B":
 
								writer.WriteLine("0 0 " + tokens[6]);
 
								break;	
 
							}
 
							
 
							// Write reverse reaction.
 
							writer.Write(tokens[2] + " " + tokens[0] + " ");
 
							switch (tokens[4])
 
							{
 
							case "W":
 
								writer.WriteLine(tokens[8] + " " + tokens[8] + " " + tokens[8]);
 
								break;
 
							case "R":
 
								writer.WriteLine(tokens[8] + " 0 0");
 
								break;
 
							case "G":
 
								writer.WriteLine("0 " + tokens[8] + " 0");
 
								break;
 
							case "B":
 
								writer.WriteLine("0 0 " + tokens[8]);
 
								break;	
 
							}							
 
						}
 
					}
 
				}
 
			}
 
		}
 
		
 
		public bool SaveToPP(string ppFile)
 
		{
 
			Reaction reaction1, reaction2;
 
			using (StreamWriter writer = new StreamWriter(ppFile))
 
			{
 
        }
 

	
 
        private void WriteReaction(StreamWriter writer, string reagent1, string reagent2, string r, string g, string b)
 
        {
 
            writer.Write(reagent1);
 
            writer.Write(" ");
 
            writer.Write(reagent2);
 
            writer.Write(" ");
 
            writer.Write(r);
 
            writer.Write(" ");
 
            writer.Write(g);
 
            writer.Write(" ");
 
            writer.WriteLine(b);
 
        }
 

	
 
        public void ConvertFromPP(string ppFile, string dpFile)
 
        {
 
            string line;
 
            using (StreamReader reader = new StreamReader(ppFile))
 
            {
 
                using (StreamWriter writer = new StreamWriter(dpFile))
 
                {
 
                    while ((line = reader.ReadLine()) != null)
 
                    {
 
                        string[] tokens = line.Split('|');
 
                        //if ((tokens.Length > 0) && (tokens [0] != "//"))
 
                        if ((tokens.Length != 5) && (tokens[0].Trim() != "//"))
 
                        {
 
                            string reagent1 = tokens[0].Trim();
 
                            string reagent2 = tokens[1].Trim();
 
                            string colorCode = tokens[2].Trim();
 
                            string change1 = tokens[3].Trim();
 
                            string change2 = tokens[4].Trim();
 
                            // Write reaction.
 
                            switch (colorCode)
 
                            {
 
                            case "W":
 
                                WriteReaction(writer, reagent1, reagent2, change1, change1, change1);
 
                                WriteReaction(writer, reagent2, reagent1, change2, change2, change2);
 
                                break;
 
                            case "R":
 
                                WriteReaction(writer, reagent1, reagent2, change1, "0", "0");
 
                                WriteReaction(writer, reagent2, reagent1, change2, "0", "0");
 
                                break;
 
                            case "G":
 
                                WriteReaction(writer, reagent1, reagent2, "0", change1, "0");
 
                                WriteReaction(writer, reagent2, reagent1, "0", change2, "0");
 
                                break;
 
                            case "B":
 
                                WriteReaction(writer, reagent1, reagent2, "0", "0", change1);
 
                                WriteReaction(writer, reagent2, reagent1, "0", "0", change2);
 
                                break;
 
                            }
 
                        }
 
                    }
 
                }
 
            }
 
        }
 

	
 
        public bool SaveToPP(string ppFile)
 
        {
 
            Reaction reaction1, reaction2;
 
            using (StreamWriter writer = new StreamWriter(ppFile))
 
            {
 
                foreach (string reagentName1 in ReagentManager.Names)
...
 
@@ -256,31 +276,31 @@ namespace DesertPaintLab
 
                            {
 
								writer.Write(reagent1.PracticalPaintName + " | " + reagent2.PracticalPaintName + " | ");
 
								if ((Math.Abs(reaction1.Red) > Math.Abs(reaction1.Green)) ||
 
								    (Math.Abs(reaction2.Red) > Math.Abs(reaction2.Green)))
 
								{
 
									writer.WriteLine("R | " + reaction1.Red + " | " + reaction2.Red);	
 
								}
 
								else if ((Math.Abs(reaction1.Green) > Math.Abs(reaction1.Red)) ||
 
									(Math.Abs(reaction2.Green) > Math.Abs(reaction2.Red)))
 
								{
 
									writer.WriteLine("G | " + reaction1.Green + " | " + reaction2.Green);	
 
								}
 
								else if ((Math.Abs(reaction1.Blue) > Math.Abs(reaction1.Red)) ||
 
									(Math.Abs(reaction2.Blue) > Math.Abs(reaction2.Red)))
 
								{
 
									writer.WriteLine("B | " + reaction1.Blue + " | " + reaction2.Blue);
 
								}
 
								else
 
								{
 
									writer.WriteLine("W | " + reaction1.Red + " | " + reaction2.Red);	
 
								}
 
								reaction1.Exported = true;
 
								reaction2.Exported = true;
 
							}
 
						}
 
					}
 
				}
 
			}
 
			
 
			// Clear Exported flags.
 
                                writer.Write(reagent1.PracticalPaintName + " | " + reagent2.PracticalPaintName + " | ");
 
                                if ((Math.Abs(reaction1.Red) > Math.Abs(reaction1.Green)) ||
 
                                    (Math.Abs(reaction2.Red) > Math.Abs(reaction2.Green)))
 
                                {
 
                                    writer.WriteLine("R | " + reaction1.Red + " | " + reaction2.Red);
 
                                }
 
                                else if ((Math.Abs(reaction1.Green) > Math.Abs(reaction1.Red)) ||
 
                                    (Math.Abs(reaction2.Green) > Math.Abs(reaction2.Red)))
 
                                {
 
                                    writer.WriteLine("G | " + reaction1.Green + " | " + reaction2.Green);
 
                                }
 
                                else if ((Math.Abs(reaction1.Blue) > Math.Abs(reaction1.Red)) ||
 
                                    (Math.Abs(reaction2.Blue) > Math.Abs(reaction2.Red)))
 
                                {
 
                                    writer.WriteLine("B | " + reaction1.Blue + " | " + reaction2.Blue);
 
                                }
 
                                else
 
                                {
 
                                    writer.WriteLine("W | " + reaction1.Red + " | " + reaction2.Red);
 
                                }
 
                                reaction1.Exported = true;
 
                                reaction2.Exported = true;
 
                            }
 
                        }
 
                    }
 
                }
 
            }
 

	
 
            // Clear Exported flags.
 
            foreach (string reagentName1 in ReagentManager.Names)
...
 
@@ -298,3 +318,3 @@ namespace DesertPaintLab
 
                    if (reaction1 != null)
 
                    {   
 
                    {
 
                        reaction1.Exported = false;
...
 
@@ -306,27 +326,27 @@ namespace DesertPaintLab
 
                    }
 
				}
 
			}
 
			return true;
 
		}
 
		
 
		public void ImportFromPP(string importDir)
 
		{
 
			// Convert old file.
 
			ConvertFromPP(
 
			    System.IO.Path.Combine(importDir, "reactions.txt"),
 
				reactFile);
 
			try
 
			{
 
				// If there is an ingredients file, move it in.
 
				System.IO.File.Copy(
 
				    System.IO.Path.Combine(importDir, "ingredients.txt"),
 
				    System.IO.Path.Combine(directory, "ingredients.txt"),
 
				    true);
 
			}
 
			catch (Exception)
 
			{
 
				// If there is no ingredients file, we don't really care.	
 
			}
 
		}
 
		
 
                }
 
            }
 
            return true;
 
        }
 

	
 
        public void ImportFromPP(string importDir)
 
        {
 
            // Convert old file.
 
            ConvertFromPP(
 
                System.IO.Path.Combine(importDir, "reactions.txt"),
 
                reactFile);
 
            try
 
            {
 
                // If there is an ingredients file, move it in.
 
                System.IO.File.Copy(
 
                    System.IO.Path.Combine(importDir, "ingredients.txt"),
 
                    System.IO.Path.Combine(directory, "ingredients.txt"),
 
                    true);
 
            }
 
            catch (Exception)
 
            {
 
                // If there is no ingredients file, we don't really care.	
 
            }
 
        }
 

	
 
        public void Import(string file)
...
 
@@ -336,16 +356,16 @@ namespace DesertPaintLab
 

	
 
		public void Export(string file)
 
		{
 
        public void Export(string file)
 
        {
 
            ZipFile.CreateFromDirectory(directory, file);
 
		}
 
		
 
		public bool Load()
 
		{
 
			string line;
 
        }
 

	
 
        public bool Load()
 
        {
 
            string line;
 
            settings.Reset();
 
            settings.Load(settingsFile);
 
			reactions.Clear();
 
            reactions.Clear();
 
            if (File.Exists(reagentFile))
 
            {
 
    			ReagentManager.LoadProfileReagents(reagentFile);
 
                ReagentManager.LoadProfileReagents(reagentFile);
 
            }
...
 
@@ -356,3 +376,3 @@ namespace DesertPaintLab
 
            }
 
			ReagentManager.InitializeReactions(ref reactions);
 
            ReagentManager.InitializeReactions(ref reactions);
 
            if (!File.Exists(reactFile))
...
 
@@ -362,21 +382,29 @@ namespace DesertPaintLab
 
            }
 
			using (StreamReader reader = new StreamReader(reactFile))
 
			{
 
				while ((line = reader.ReadLine()) != null) 
 
               	{
 
					string[] tokens = line.Split(null);
 
                    Reagent reagent1 = ReagentManager.GetReagent(tokens[0]);
 
                    Reagent reagent2 = ReagentManager.GetReagent(tokens[1]);
 
					reactions.Set(reagent1, reagent2, new Reaction(int.Parse(tokens[2]), int.Parse(tokens[3]), int.Parse(tokens[4])));
 
				}
 
			}
 
            using (StreamReader reader = new StreamReader(reactFile))
 
            {
 
                while ((line = reader.ReadLine()) != null)
 
                {
 
                    string[] tokens = line.Split(' ');
 
                    if (tokens.Length == 5)
 
                    {
 
                        Reagent reagent1 = ReagentManager.GetReagent(tokens[0].Trim());
 
                        Reagent reagent2 = ReagentManager.GetReagent(tokens[1].Trim());
 
                        Reaction reaction = new Reaction(
 
                            int.Parse(tokens[2].Trim()),
 
                            int.Parse(tokens[3].Trim()),
 
                            int.Parse(tokens[4].Trim())
 
                            );
 
                        reactions.Set(reagent1, reagent2, reaction);
 
                    }
 
                }
 
            }
 
            return true;
 
		}
 
		
 
		public void Save()
 
		{
 
        }
 

	
 
        public void Save()
 
        {
 
            settings.Save(settingsFile);
 
			Reaction reaction;
 
			using (StreamWriter writer = new StreamWriter(reactFile, false))
 
			{
 
            Reaction reaction;
 
            using (StreamWriter writer = new StreamWriter(reactFile, false))
 
            {
 
                foreach (string reagentName1 in ReagentManager.Names)
...
 
@@ -393,11 +421,11 @@ namespace DesertPaintLab
 
                        reaction = reactions.Find(reagent1, reagent2);
 
    					if (reaction != null)
 
    					{
 
                                writer.WriteLine(reagent1.PracticalPaintName + " " + reagent2.PracticalPaintName + " " +
 
    							reaction.Red + " " + reaction.Green + " " + reaction.Blue);
 
    					}
 
    				}
 
    			}
 
                        if (reaction != null)
 
                        {
 
                            writer.WriteLine(reagent1.PracticalPaintName + " " + reagent2.PracticalPaintName + " " +
 
                            reaction.Red + " " + reaction.Green + " " + reaction.Blue);
 
                        }
 
                    }
 
                }
 
            }
 
		}
 
        }
 

	
...
 
@@ -420,5 +448,5 @@ namespace DesertPaintLab
 
                {
 
                    while ((line = reader.ReadLine()) != null) 
 
                    while ((line = reader.ReadLine()) != null)
 
                    {
 
                        match = recipeHeaderRegex.Match(line); 
 
                        match = recipeHeaderRegex.Match(line);
 
                        if (match.Success)
...
 
@@ -494,3 +522,3 @@ namespace DesertPaintLab
 
        }
 
		
 

	
 
        public void ExportWikiRibbons(string file)
...
 
@@ -500,3 +528,3 @@ namespace DesertPaintLab
 
        }
 
        
 

 
        public void ExportWikiRecipes(TextWriter writer)
...
 
@@ -505,3 +533,3 @@ namespace DesertPaintLab
 
        }
 
        
 

 
        public void ExportWikiRibbons(TextWriter writer)
...
 
@@ -591,3 +619,3 @@ namespace DesertPaintLab
 
                        }
 
                    } 
 
                    }
 
                    else
...
 
@@ -597,3 +625,3 @@ namespace DesertPaintLab
 
                    colorLine += " || ";
 
                    
 

 
                    if (recipe.CheckMissingReactions(ref missing) == true)
...
 
@@ -613,12 +641,12 @@ namespace DesertPaintLab
 
        }
 
 
 
		public Reaction FindReaction(Reagent reagent1, Reagent reagent2)
 
		{
 

	
 
        public Reaction FindReaction(Reagent reagent1, Reagent reagent2)
 
        {
 
            return reactions.Find(reagent1, reagent2);
 
		}
 
		
 
		public void SetReaction(Reagent reagent1, Reagent reagent2, Reaction reaction)
 
		{
 
        }
 

	
 
        public void SetReaction(Reagent reagent1, Reagent reagent2, Reaction reaction)
 
        {
 
            reactions.Set(reagent1, reagent2, reaction);
 
		}
 
        }
 

	
...
 
@@ -641,3 +669,3 @@ namespace DesertPaintLab
 

	
 
	}
 
    }
 
}
0 comments (0 inline, 0 general)