diff --git a/PlayerProfile.cs b/PlayerProfile.cs --- a/PlayerProfile.cs +++ b/PlayerProfile.cs @@ -29,27 +29,32 @@ using System.Text.RegularExpressions; 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: (?(\w*\s)*\w+)\s*"); static Regex recipeIngredientRegex = new Regex(@"(?(\w+\s)?\w+)\s*\|\s*(?\d+)\s*"); ReactionSet reactions = new ReactionSet(); // ingredient -> [ingredient, reaction] - //SortedDictionary> reactions = - // new SortedDictionary>(); + //SortedDictionary> reactions = + // new SortedDictionary>(); SortedDictionary recipes; SortedDictionary ribbonRecipes; Settings settings = new Settings(); - public Settings ProfileSettings { - get { + public Settings ProfileSettings + { + get + { return settings; } } @@ -58,18 +63,22 @@ namespace DesertPaintLab static PlayerProfile Current { - get { + get + { return current; } } - 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"); this.settingsFile = System.IO.Path.Combine(directory, "settings"); this.recipes = new SortedDictionary(); @@ -82,46 +91,52 @@ namespace DesertPaintLab { this.ribbonRecipes.Add(color.Name, new PaintRecipe()); } - } + } public string Directory { - get { + get + { return this.directory; } } public ReactionSet Reactions { - get { + get + { return this.reactions; } } public string ReagentFile { - get { + get + { return this.reagentFile; } } public SortedDictionary Recipes { - get { + get + { return this.recipes; } } public SortedDictionary RibbonRecipes { - get { + get + { return this.ribbonRecipes; } } public int RecipeCount { - get { + get + { int count = 0; foreach (PaintRecipe recipe in this.recipes.Values) { @@ -136,7 +151,8 @@ namespace DesertPaintLab public int RibbonCount { - get { + get + { int count = 0; foreach (PaintRecipe recipe in this.ribbonRecipes.Values) { @@ -148,95 +164,99 @@ namespace DesertPaintLab return count; } } - - public bool Initialize() - { + + public bool Initialize() + { // Copy template files into new directory. string templatePath = FileUtils.FindApplicationResourceDirectory("template"); - + if (!System.IO.Directory.Exists(templatePath)) { LastError = "Failed to find profile template folder."; return false; } - // 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)) { LastError = "Failed to copy template file " + file.Name + "."; 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) { // TODO: could be more efficient by only iterating over the names after reagent1 @@ -254,35 +274,35 @@ namespace DesertPaintLab reaction2 = reactions.Find(reagent2, reagent1); if (reaction2 != null) { - 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) { // TODO: could be more efficient by only iterating over the names after reagent1 @@ -296,7 +316,7 @@ namespace DesertPaintLab Reagent reagent2 = ReagentManager.GetReagent(reagentName2); reaction1 = reactions.Find(reagent1, reagent2); if (reaction1 != null) - { + { reaction1.Exported = false; } reaction2 = reactions.Find(reagent2, reagent1); @@ -304,81 +324,89 @@ namespace DesertPaintLab { reaction2.Exported = false; } - } - } - 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) { ZipFile.ExtractToDirectory(file, directory); } - 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); } else { LastError = "Failed to find profile reagents file."; return false; } - ReagentManager.InitializeReactions(ref reactions); + ReagentManager.InitializeReactions(ref reactions); if (!File.Exists(reactFile)) { LastError = "Failed to find profile reactions file."; return false; } - 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) { // TODO: could be more efficient by only iterating over the names after reagent1 @@ -391,15 +419,15 @@ namespace DesertPaintLab Reagent reagent1 = ReagentManager.GetReagent(reagentName1); Reagent reagent2 = ReagentManager.GetReagent(reagentName2); 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); + } + } + } } - } + } private void LoadRecipes(SortedDictionary recipeDict, string filename, uint concentration) { @@ -418,9 +446,9 @@ namespace DesertPaintLab { using (StreamReader reader = new StreamReader(recipeFile)) { - while ((line = reader.ReadLine()) != null) + while ((line = reader.ReadLine()) != null) { - match = recipeHeaderRegex.Match(line); + match = recipeHeaderRegex.Match(line); if (match.Success) { if (testRecipe != null && currentRecipeColor != null) @@ -492,18 +520,18 @@ namespace DesertPaintLab StreamWriter writer = new StreamWriter(file); ExportWikiFormat(writer, this.recipes); } - + public void ExportWikiRibbons(string file) { StreamWriter writer = new StreamWriter(file); ExportWikiFormat(writer, this.ribbonRecipes); } - + public void ExportWikiRecipes(TextWriter writer) { ExportWikiFormat(writer, this.recipes); } - + public void ExportWikiRibbons(TextWriter writer) { ExportWikiFormat(writer, this.ribbonRecipes); @@ -589,13 +617,13 @@ namespace DesertPaintLab { colorLine += " " + ingredient.ToString(); } - } + } else { // no recipe } colorLine += " || "; - + if (recipe.CheckMissingReactions(ref missing) == true) { colorLine += "Y"; @@ -611,16 +639,16 @@ namespace DesertPaintLab writer.WriteLine("|}"); } } - - 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); - } + } public void ClearReaction(Reagent reagent1, Reagent reagent2) { @@ -639,6 +667,6 @@ namespace DesertPaintLab ribbonRecipes[colorName].CopyFrom(recipe); } - } + } }