Changeset - 19b1680b1a64
[Not reviewed]
default
0 1 0
Jason Maltzen - 5 years ago 2019-11-02 11:33:19
jason@hiddenachievement.com
Handle a few profile load errors better.
1 file changed with 16 insertions and 6 deletions:
0 comments (0 inline, 0 general)
ReagentManager.cs
Show inline comments
...
 
@@ -22,238 +22,248 @@
 
using System;
 
using System.IO;
 
using System.Collections.Generic;
 
using System.Text.RegularExpressions;
 

	
 
namespace DesertPaintLab
 
{
 
	public class ReagentManager
 
	{
 
        // PP format
 
		static Regex reagentRegex = new Regex(@"(?<name>\w+)\s*\|\s*(?<red>\d+),\s*(?<green>\d+),\s*(?<blue>\d+)\s*\|\s*(?<cost>\d+)\s*\|\s*(?<enabled>[YN])\s*\|\s*(?<bulk>(bulk|normal))\s*\|\s*(?<max>\d+).*");
 
		static Regex catalystRegex = new Regex(@"(?<name>\w+)\s*\|\s*catalyst\s*\|\s*(?<cost>\d+)\s*\|\s*(?<enabled>[YN])\s*\|\s*(?<bulk>(bulk|normal)).*");
 
        static Regex internalReagentRegex = new Regex(@"(?<name>(\w*\s)*\w+)\s*\|\s*(?<ppname>\w+)\s*\|\s*(?<red>\d+),\s*(?<green>\d+),\s*(?<blue>\d+).*");
 
        static Regex internalCatalystRegex = new Regex(@"(?<name>(\w+\s)*\w+)\s*\|\s*(?<ppname>\w+)\s*\|\s*catalyst.*");
 
		
 
		static SortedDictionary<string,Reagent> reagents = new SortedDictionary<string, Reagent>();
 
        static List<string> names = new List<string>();
 
        static Dictionary<string, string> nameLookup = new Dictionary<string, string>(); // pp name to our name
 
		
 
		static Gtk.ListStore nameStore = new Gtk.ListStore(typeof(string));
 

	
 
		static public Gtk.ListStore NameListModel
 
		{
 
			get
 
			{
 
				return nameStore;	
 
			}
 
		}
 

	
 
        static public List<string> Names
 
        {
 
            get
 
            {
 
                return names;
 
            }
 
        }
 
		
 
		public ReagentManager ()
 
		{
 
			
 
		}
 

	
 
        // Loads reagent name/colors
 
        public static void Load(string file)
 
        {
 
            Match match;
 
            string line;
 
            reagents.Clear();
 
            using (StreamReader reader = new StreamReader(file))
 
            {
 
                while ((line = reader.ReadLine()) != null) 
 
                {
 
                    match = internalReagentRegex.Match(line); 
 
                    if (match.Success)
 
                    {
 
                        string name = match.Groups["name"].Value;
 
                        string ppname = match.Groups["ppname"].Value;
 
                        reagents.Add(name,
 
                            new Reagent(name, ppname,
 
                                byte.Parse(match.Groups["red"].Value),
 
                                byte.Parse(match.Groups["green"].Value),
 
                                byte.Parse(match.Groups["blue"].Value)));
 
                        nameStore.AppendValues(name);
 
                        names.Add(name);
 
                        nameLookup.Add(ppname, name);
 
                    }
 
                    else
 
                    {
 
                        match = internalCatalystRegex.Match(line);
 
                        if (match.Success)
 
                        {
 
                            string name = match.Groups["name"].Value;
 
                            string ppname = match.Groups["ppname"].Value;
 
                            reagents.Add(name, new Reagent(ppname, ppname));
 
                            nameStore.AppendValues(name);
 
                            names.Add(name);
 
                            nameLookup.Add(ppname, name);
 
                        }
 
                    }
 
                }
 
            }
 
        }
 
		
 
		public static void LoadProfileReagents(string file)
 
		{	
 
			Match match;
 
			string line;
 
			using (StreamReader reader = new StreamReader(file))
 
			{
 
				while ((line = reader.ReadLine()) != null) 
 
                {
 
					match = reagentRegex.Match(line); 
 
					if (match.Success)
 
					{
 
						string ppname = match.Groups["name"].Value;
 
                        string name = null;
 
                        nameLookup.TryGetValue(ppname, out name);
 
                        if (nameLookup.TryGetValue(ppname, out name))
 
                        {
 
                        Reagent reagent = GetReagent(name);
 
                        if (reagent != null && !reagent.IsCatalyst)
 
                        {
 
                            reagent.Enabled = match.Groups["enabled"].Value.Equals("Y");
 
                            reagent.Cost = uint.Parse(match.Groups["cost"].Value);
 
                            reagent.RecipeMax = uint.Parse(match.Groups["max"].Value);
 
                        }
 
					}
 
					else
 
					{
 
                            // bad name?
 
                        }
 
					}
 
					else
 
					{
 
						match = catalystRegex.Match(line);
 
						if (match.Success)
 
						{
 
							string ppname = match.Groups["name"].Value;
 
                            string name = null;
 
                            nameLookup.TryGetValue(ppname, out name);
 
                            if (nameLookup.TryGetValue(ppname, out name))
 
                            {
 
                            Reagent reagent = GetReagent(name);
 
                            if (reagent != null && reagent.IsCatalyst)
 
                            {
 
                                reagent.Enabled = match.Groups["enabled"].Value.Equals("Y");
 
                                reagent.Cost = uint.Parse(match.Groups["cost"].Value);
 
                            }
 
						}
 
                            else
 
                            {
 
                                // bad name?
 
                            }
 
						}
 
					}
 
                }
 
			}
 
		}
 

	
 
        public static void SaveProfileReagents(string file)
 
        {
 
            using (StreamWriter writer = new StreamWriter(file))
 
            {
 
                writer.WriteLine("// Ingredients are in the form:");
 
                writer.WriteLine("// Name | RGB values | cost | enabled (Y/N) | bulk/normal | max items per paint (1-20)");
 
                writer.WriteLine("//");
 
                writer.WriteLine("// It is recommended to only change the cost value");
 
                writer.WriteLine("// It is not recommended to set many of the ingredients above 10 per paint");
 

	
 
                List<Reagent> sortedReagents = new List<Reagent>(reagents.Count);
 
                foreach (KeyValuePair<string, Reagent> pair in reagents)
 
                {
 
                    sortedReagents.Add(pair.Value);
 
                }
 
                sortedReagents.Sort( (x,y) => ((x.IsCatalyst && !y.IsCatalyst) ? 1 : ((y.IsCatalyst && !x.IsCatalyst) ? -1 : x.PracticalPaintName.CompareTo(y.PracticalPaintName))) );
 
                foreach (Reagent reagent in sortedReagents)
 
                {
 
                    if (!reagent.IsCatalyst)
 
                    {
 
                        writer.WriteLine("{0,-10} | {1,3}, {2,3}, {3,3} | {4,7} | {5} | {6} | {7}",
 
                            reagent.PracticalPaintName, 
 
                            reagent.Color.Red, reagent.Color.Blue, reagent.Color.Green,
 
                            reagent.Cost,
 
                            reagent.Enabled ? "Y" : "N",
 
                            reagent.RecipeMax >= 10 ? "  bulk" : "normal",
 
                            reagent.RecipeMax);
 
                    }
 
                    else
 
                    {
 
                        writer.WriteLine("{0,-10} | catalyst | {1,7} | {2} | normal | 1",
 
                            reagent.PracticalPaintName, 
 
                            reagent.Cost,
 
                            reagent.Enabled ? "Y" : "N");
 
                    }
 
                }
 
            }
 
        }
 

	
 
		
 
		public static void InitializeReactions(ref ReactionSet reactions)
 
		{
 
			foreach (KeyValuePair<string, Reagent> pair1 in reagents)
 
			{
 
				foreach (KeyValuePair<string, Reagent> pair2 in reagents)
 
				{
 
					if (pair1.Key != pair2.Key)
 
					{
 
                        reactions.Set(pair1.Value, pair2.Value, null);
 
					}
 
				}
 
			}
 
		}
 
		
 
		public static void PopulateReagents(ref Gtk.ComboBox comboBox)
 
		{
 
			comboBox.Clear();
 
			
 
			Gtk.CellRendererText cell = new Gtk.CellRendererText();
 
	        comboBox.PackStart(cell, false);
 
	        comboBox.AddAttribute(cell, "text", 0);
 
	        Gtk.ListStore store = new Gtk.ListStore(typeof(string));
 
	        comboBox.Model = store;
 
			
 
			store.AppendValues("");
 
            foreach (string name in names)
 
			{
 
				store.AppendValues(name);
 
			}
 
		}
 
		
 
		/*
 
		public static void PopulatePigments(ref Gtk.ComboBox comboBox)
 
		{
 
			comboBox.Clear();
 
			
 
			Gtk.CellRendererText cell = new Gtk.CellRendererText();
 
	        comboBox.PackStart(cell, false);
 
	        comboBox.AddAttribute(cell, "text", 0);
 
	        Gtk.ListStore store = new Gtk.ListStore(typeof(string));
 
	        comboBox.Model = store;
 
			
 
			store.AppendValues("");
 
			foreach (KeyValuePair<string, Reagent> pair in reagents)
 
			{
 
				if (!pair.Value.IsCatalyst)
 
				{
 
					store.AppendValues(pair.Key);
 
				}
 
			}			
 
		}
 
		*/
 
		
 
		public static Reagent GetReagent(string reagentName)
 
		{
 
			Reagent returnVal;
 
			reagents.TryGetValue(reagentName, out returnVal);
 
            if (returnVal == null)
 
			if (!reagents.TryGetValue(reagentName, out returnVal))
 
            {
 
                // convert pp name to our internal name
 
                string otherName = null;
 
                nameLookup.TryGetValue(reagentName, out otherName);
 
                if (otherName != null)
 
                if (nameLookup.TryGetValue(reagentName, out otherName))
 
                {
 
                    reagents.TryGetValue(otherName, out returnVal);
 
                }
 
            }
 
			return returnVal;
 
		}
 
	}
 
	
 
}
 

	
0 comments (0 inline, 0 general)