public void DrawingElements() { factory = new GamesXmlFactory (); factory.Read ("test_games.xml"); definitions = factory.Definitions; definition = definitions [0]; Assert.AreEqual (2, definition.DrawingObjects.Length); // Check image drawing object Assert.AreEqual (typeof (gbrainy.Core.Main.Xml.ImageDrawingObject), definition.DrawingObjects [0].GetType ()); ImageDrawingObject image = definition.DrawingObjects [0] as ImageDrawingObject; Assert.AreEqual ("clock.svg", image.Filename); Assert.AreEqual (0.30, image.X); Assert.AreEqual (0.40, image.Y); Assert.AreEqual (0.50, image.Width); Assert.AreEqual (0.60, image.Height); // Check text drawing object Assert.AreEqual (typeof (gbrainy.Core.Main.Xml.TextDrawingObject), definition.DrawingObjects [1].GetType ()); TextDrawingObject text = definition.DrawingObjects [1] as TextDrawingObject; Assert.AreEqual ("Sample text for unit tests", text.Text); Assert.AreEqual (0.5, text.X); Assert.AreEqual (0.4, text.Y); Assert.AreEqual (true, text.Centered); Assert.AreEqual (TextDrawingObject.Sizes.Large, text.Size); }
static string GetVariantsDefinitions(GameXmlDefinition definition) { StringBuilder builder = new StringBuilder (); foreach (GameXmlDefinitionVariant variant in definition.Variants) { builder.AppendLine ("\tvariant = new GameXmlDefinitionVariant ();"); if (String.IsNullOrEmpty (variant.Tip) == false) builder.AppendLine (String.Format ("\tvariant.Tip = Catalog.GetString (\"{0}\");", variant.Tip)); builder.AppendLine ("\tvariants.Add (variant);"); } return builder.ToString (); }
public void BasicGameDefinition() { factory = new GamesXmlFactory (); factory.Read ("test_games.xml"); definitions = factory.Definitions; definition = definitions [0]; Assert.AreEqual ("Clock Rotation", definition.Name); Assert.AreEqual (0, definition.Variants.Count); Assert.AreEqual (GameTypes.LogicPuzzle, definition.Type); Assert.AreEqual (GameDifficulty.Medium | GameDifficulty.Master, definition.Difficulty); Assert.AreEqual ("Rationale text", definition.Rationale.String); Assert.AreEqual ("How many degrees rotates the minute hand of a clock?", definition.Question.String); Assert.AreEqual ("How many degrees rotates the minute hand of a clocks?", definition.Question.PluralString); Assert.AreEqual ("[rslt]", definition.AnswerText); }
public void Read(string file) { GameXmlDefinition game; string name, str, plural; bool processing_variant = false; int variant = 0; OptionDrawingObject option = null; DrawingObject last_drawing_object = null; string last_context = null; if (read == true) return; try { StreamReader stream = new StreamReader (file); XmlTextReaderLiteral reader = new XmlTextReaderLiteral (stream); game = null; while (reader.Read ()) { // Strings are only used because msgctxt requirement if (reader.NodeType == XmlNodeType.Text) { const string CONTEXT_GLUE = "\u0004"; string text; text = reader.ReadString (); TextDrawingObject drawing_object = (TextDrawingObject) last_drawing_object; // GetText processes msgctxt as msgctxt + context_glue + text to retrieve them drawing_object.Text = last_context + CONTEXT_GLUE + text; // If the string does not exits, return regular English string without context if (GetText.StringExists (drawing_object.Text) == false) drawing_object.Text = text; continue; } name = reader.Name.ToLower (); switch (name) { case "games": break; case "type": if (reader.NodeType != XmlNodeType.Element) break; game.Type = GameTypesDescription.FromString (reader.ReadElementString ()); break; case "game": if (reader.NodeType == XmlNodeType.Element) { game = new GameXmlDefinition (); } else if (reader.NodeType == XmlNodeType.EndElement) { games.Add (game); } break; case "_name": if (reader.NodeType != XmlNodeType.Element) break; game.Name = reader.ReadElementString (); break; case "difficulty": if (reader.NodeType != XmlNodeType.Element) break; str = reader.ReadElementString (); game.Difficulty = GameDifficultyDescription.FromString (str); break; case "svg": if (reader.NodeType != XmlNodeType.Element) break; ImageDrawingObject draw_image = new ImageDrawingObject (); if (processing_variant) game.Variants[variant].AddDrawingObject (draw_image); else game.AddDrawingObject (draw_image); draw_image.Filename = reader.GetAttribute ("file"); str = reader.GetAttribute ("x"); if (String.IsNullOrEmpty (str) == false) draw_image.X = Double.Parse (str, CultureInfo.InvariantCulture); else draw_image.X = 0.1; str = reader.GetAttribute ("y"); if (String.IsNullOrEmpty (str) == false) draw_image.Y = Double.Parse (str, CultureInfo.InvariantCulture); else draw_image.Y = 0.1; str = reader.GetAttribute ("width"); if (String.IsNullOrEmpty (str) == false) draw_image.Width = Double.Parse (str, CultureInfo.InvariantCulture); else draw_image.Width = 0.8; str = reader.GetAttribute ("height"); if (String.IsNullOrEmpty (str) == false) draw_image.Height = Double.Parse (str, CultureInfo.InvariantCulture); else draw_image.Height = 0.8; break; case "string": case "_string": if (reader.NodeType != XmlNodeType.Element) break; TextDrawingObject draw_string = new TextDrawingObject (); last_drawing_object = draw_string; if (option != null) { option.AddDrawingObject (draw_string); } else { if (processing_variant) game.Variants[variant].AddDrawingObject (draw_string); else game.AddDrawingObject (draw_string); } last_context = reader.GetAttribute ("msgctxt"); draw_string.Text = reader.GetAttribute ("text"); if (String.IsNullOrEmpty (draw_string.Text)) draw_string.Text = reader.GetAttribute ("_text"); str = reader.GetAttribute ("x"); if (String.IsNullOrEmpty (str) == false) draw_string.X = Double.Parse (str, CultureInfo.InvariantCulture); else draw_string.X = 0.1; str = reader.GetAttribute ("y"); if (String.IsNullOrEmpty (str) == false) draw_string.Y = Double.Parse (str, CultureInfo.InvariantCulture); else draw_string.Y = 0.1; str = reader.GetAttribute ("centered"); if (String.Compare (str, "yes", true) == 0) draw_string.Centered = true; else draw_string.Centered = false; str = reader.GetAttribute ("size"); if (String.IsNullOrEmpty (str) == false) { switch (str.ToLower ()) { case "small": draw_string.Size = TextDrawingObject.Sizes.Small; break; case "medium": draw_string.Size = TextDrawingObject.Sizes.Medium; break; case "large": draw_string.Size = TextDrawingObject.Sizes.Large; break; case "x-large": draw_string.Size = TextDrawingObject.Sizes.XLarge; break; case "xx-large": draw_string.Size = TextDrawingObject.Sizes.XXLarge; break; default: Console.WriteLine ("GameXmlFactory. Unsupported value for size attribute: {0}", str); break; } } break; case "_question": case "question": if (reader.NodeType != XmlNodeType.Element) break; // Create object if needed if (processing_variant) { if (game.Variants[variant].Question == null) game.Variants[variant].Question = new LocalizableString (); } else { if (game.Question == null) game.Question = new LocalizableString (); } plural = reader.GetAttribute ("plural"); if (String.IsNullOrEmpty (plural) == false) { // Plural if (processing_variant) { game.Variants[variant].Question.PluralString = reader.ReadElementStringAsItIs (); game.Variants[variant].Question.Value = plural; } else { game.Question.PluralString = reader.ReadElementStringAsItIs (); game.Question.Value = plural; } } else { if (processing_variant) { game.Variants[variant].Question.String = reader.ReadElementStringAsItIs (); } else game.Question.String = reader.ReadElementStringAsItIs (); } break; case "rationale": case "_rationale": if (reader.NodeType != XmlNodeType.Element) break; // Create object if needed if (processing_variant) { if (game.Variants[variant].Rationale == null) game.Variants[variant].Rationale = new LocalizableString (); } else { if (game.Rationale == null) game.Rationale = new LocalizableString (); } plural = reader.GetAttribute ("plural"); if (String.IsNullOrEmpty (plural) == false) { // Plural if (processing_variant) { game.Variants[variant].Rationale.PluralString = reader.ReadElementStringAsItIs (); game.Variants[variant].Rationale.Value = plural; } else { game.Rationale.PluralString = reader.ReadElementStringAsItIs (); game.Rationale.Value = plural; } } else { if (processing_variant) game.Variants[variant].Rationale.String = reader.ReadElementStringAsItIs (); else game.Rationale.String = reader.ReadElementStringAsItIs (); } break; case "answer": case "_answer": if (reader.NodeType != XmlNodeType.Element) break; if (processing_variant) game.Variants[variant].AnswerText = reader.ReadElementString (); else game.AnswerText = reader.ReadElementString (); break; case "_answer_show": case "answer_show": if (reader.NodeType != XmlNodeType.Element) break; if (processing_variant) game.Variants[variant].AnswerShow = reader.ReadElementString (); else game.AnswerShow = reader.ReadElementString (); break; case "answer_expression": if (reader.NodeType != XmlNodeType.Element) break; if (processing_variant) game.Variants[variant].AnswerCheckExpression = reader.ReadElementString (); else game.AnswerCheckExpression = reader.ReadElementString (); break; case "answer_checkattributes": if (reader.NodeType != XmlNodeType.Element) break; if (processing_variant) game.Variants[variant].CheckAttributes = GameAnswerCheckAttributesDescription.FromString (reader.ReadElementString ()); else game.CheckAttributes = GameAnswerCheckAttributesDescription.FromString (reader.ReadElementString ()); break; case "_tip": if (reader.NodeType != XmlNodeType.Element) break; if (processing_variant) game.Variants[variant].Tip = reader.ReadElementStringAsItIs (); else game.Tip = reader.ReadElementStringAsItIs (); break; case "variant": if (reader.NodeType == XmlNodeType.Element) { game.NewVariant (); variant = game.Variants.Count - 1; processing_variant = true; } else if (reader.NodeType == XmlNodeType.EndElement) { processing_variant = false; } break; case "variables": if (processing_variant) game.Variants[variant].Variables = reader.ReadElementString (); else game.Variables = reader.ReadElementString (); break; case "option": switch (reader.NodeType) { case XmlNodeType.Element: option = new OptionDrawingObject (); break; case XmlNodeType.EndElement: if (String.IsNullOrEmpty (option.AnswerText) && option.RandomizedOrder == false) throw new InvalidOperationException ("If the option is not randomized, you need to define an answer"); option = null; break; default: // Do any processing break; } if (option == null) break; if (processing_variant) game.Variants[variant].AddDrawingObject (option); else game.AddDrawingObject (option); option.AnswerText = reader.GetAttribute ("answer"); if (String.IsNullOrEmpty (option.AnswerText)) option.AnswerText = reader.GetAttribute ("_answer"); str = reader.GetAttribute ("x"); if (String.IsNullOrEmpty (str) == false) option.X = Double.Parse (str, CultureInfo.InvariantCulture); else option.X = 0.1; str = reader.GetAttribute ("y"); if (String.IsNullOrEmpty (str) == false) option.Y = Double.Parse (str, CultureInfo.InvariantCulture); else option.Y = 0.1; str = reader.GetAttribute ("width"); if (String.IsNullOrEmpty (str) == false) option.Width = Double.Parse (str, CultureInfo.InvariantCulture); else option.Width = 0.1; str = reader.GetAttribute ("height"); if (String.IsNullOrEmpty (str) == false) option.Height = Double.Parse (str, CultureInfo.InvariantCulture); else option.Height = 0.1; str = reader.GetAttribute ("order"); if (String.IsNullOrEmpty (str) == false) option.RandomizedOrder = true; str = reader.GetAttribute ("correct"); if (String.Compare (str, "yes", true) == 0) option.Correct = true; if (option.X + option.Width > 1 || option.Y + option.Height > 1) Console.WriteLine ("GameXmlFactory. Wrong option size. x+width and y+height cannot be larger than 1"); break; default: if (String.IsNullOrEmpty (name) == false) Console.WriteLine ("GameXmlFactory. Unsupported tag: {0}", name); break; } } reader.Close (); stream.Dispose (); read = true; GameXml.Definitions = games; } catch (Exception e) { read = true; Console.WriteLine ("GameXmlFactory. Error loading: {0}", e.Message); } }
// string [0] static string[] GetVariantsVariables(GameXmlDefinition definition) { const string exp = "([^=]+) (=) ([^!]+)"; StringBuilderIndentation builder_definitions = new StringBuilderIndentation (); StringBuilderIndentation builder_assigments = new StringBuilderIndentation (); string [] rslt = new string [2]; GameXmlDefinitionVariant variant; builder_assigments.Level = 4; for (int i = 0; i < definition.Variants.Count; i++) { Regex regex; int prev = 0, next, pos; string line, vars; Match match; variant = definition.Variants [i]; if (String.IsNullOrEmpty (variant.Variables)) continue; // Header builder_definitions.Level = 2; builder_definitions.AppendLine (String.Format ("class VariantVariables{0}", i)); builder_definitions.AppendLine ("{"); builder_definitions.Level = 3; regex = new Regex (exp, RegexOptions.IgnoreCase); vars = variant.Variables; builder_definitions.AppendLine ("Random random = new Random ();"); while (true) { pos = next = vars.IndexOf (';', prev); if (pos == -1) line = vars.Substring (prev, vars.Length - prev); else line = vars.Substring (prev, next + 1 - prev); line = line.Trim (); // Process line match = regex.Match (line); bool first_nonspace = false; StringBuilder var_name = new StringBuilder (); string var_def = match.Groups [1].ToString (); Console.WriteLine ("var_Def {0}", var_def); for (int n = var_def.Length - 1; n >= 0; n--) { if (var_def [n] == ' ' && first_nonspace == true) break; if (var_def [n] != ' ') first_nonspace = true; var_name.Insert (0, var_def [n]); } if (String.IsNullOrEmpty (line) == false) { builder_definitions.AppendLine (String.Format ("public {0};", match.Groups [1])); builder_assigments.AppendLine (String.Format ("{0} = {1}", var_name.ToString (), match.Groups [3])); } if (pos == -1) break; prev = next + 1; } // Footer builder_definitions.AppendLine (" "); builder_definitions.AppendLine (String.Format ("VariantVariables{0} ()", i)); builder_definitions.AppendLine ("{"); builder_definitions.Level = 0; builder_definitions.AppendLine (builder_assigments.ToString ()); builder_definitions.Level = 3; builder_definitions.AppendLine ("}"); builder_definitions.Level = 2; builder_definitions.AppendLine ("}"); builder_assigments.Clear (); } rslt [VarIdxDefinitions] = builder_definitions.ToString (); rslt [VarIdxAssigments] = builder_assigments.ToString (); return rslt; }
public void GameDefinitionWithVariants() { GameXmlDefinitionVariant variant; factory = new GamesXmlFactory (); factory.Read ("test_games.xml"); definitions = factory.Definitions; definition = definitions [1]; // Age Game Assert.AreEqual ("Age", definition.Name); Assert.AreEqual (2, definition.Variants.Count); Assert.AreEqual ("father_son.svg", ((definition.DrawingObjects[0]) as ImageDrawingObject).Filename); // Variant: John is 46 years old. variant = definition.Variants [0]; Assert.AreEqual (true, variant.Question.String.Contains ("John is 46 years old")); Assert.AreEqual ("[son]", variant.AnswerText); Assert.AreEqual (true, variant.Variables.Contains ("int father = 46;")); // Variant: John's age is nowadays 2 times his son's age. variant = definition.Variants [1]; Assert.AreEqual (true, variant.Question.String.Contains ("John's age is nowadays 2 times his son's age.")); Assert.AreEqual ("24", variant.AnswerText); Assert.AreEqual (true, variant.Variables.Contains ("int ago = years [idx];")); }
public void Read(string file) { GameXmlDefinition game; string name, str, plural; bool processing_variant = false; int variant = 0; OptionDrawingObject option = null; DrawingObject last_drawing_object = null; string last_context = null; if (read == true) { return; } try { StreamReader stream = new StreamReader(file); XmlTextReaderLiteral reader = new XmlTextReaderLiteral(stream); game = null; while (reader.Read()) { // Strings are only used because msgctxt requirement if (reader.NodeType == XmlNodeType.Text) { const string CONTEXT_GLUE = "\u0004"; string text; text = reader.ReadString(); TextDrawingObject drawing_object = (TextDrawingObject)last_drawing_object; // GetText processes msgctxt as msgctxt + context_glue + text to retrieve them drawing_object.Text = last_context + CONTEXT_GLUE + text; // If the string does not exits, return regular English string without context if (GetText.StringExists(drawing_object.Text) == false) { drawing_object.Text = text; } continue; } name = reader.Name.ToLower(); switch (name) { case "games": break; case "type": if (reader.NodeType != XmlNodeType.Element) { break; } game.Type = GameTypesDescription.FromString(reader.ReadElementString()); break; case "game": if (reader.NodeType == XmlNodeType.Element) { game = new GameXmlDefinition(); } else if (reader.NodeType == XmlNodeType.EndElement) { games.Add(game); } break; case "_name": if (reader.NodeType != XmlNodeType.Element) { break; } game.Name = reader.ReadElementString(); break; case "difficulty": if (reader.NodeType != XmlNodeType.Element) { break; } str = reader.ReadElementString(); game.Difficulty = GameDifficultyDescription.FromString(str); break; case "svg": if (reader.NodeType != XmlNodeType.Element) { break; } ImageDrawingObject draw_image = new ImageDrawingObject(); if (processing_variant) { game.Variants[variant].AddDrawingObject(draw_image); } else { game.AddDrawingObject(draw_image); } draw_image.Filename = reader.GetAttribute("file"); str = reader.GetAttribute("x"); if (String.IsNullOrEmpty(str) == false) { draw_image.X = Double.Parse(str, CultureInfo.InvariantCulture); } else { draw_image.X = 0.1; } str = reader.GetAttribute("y"); if (String.IsNullOrEmpty(str) == false) { draw_image.Y = Double.Parse(str, CultureInfo.InvariantCulture); } else { draw_image.Y = 0.1; } str = reader.GetAttribute("width"); if (String.IsNullOrEmpty(str) == false) { draw_image.Width = Double.Parse(str, CultureInfo.InvariantCulture); } else { draw_image.Width = 0.8; } str = reader.GetAttribute("height"); if (String.IsNullOrEmpty(str) == false) { draw_image.Height = Double.Parse(str, CultureInfo.InvariantCulture); } else { draw_image.Height = 0.8; } break; case "string": case "_string": if (reader.NodeType != XmlNodeType.Element) { break; } TextDrawingObject draw_string = new TextDrawingObject(); last_drawing_object = draw_string; if (option != null) { option.AddDrawingObject(draw_string); } else { if (processing_variant) { game.Variants[variant].AddDrawingObject(draw_string); } else { game.AddDrawingObject(draw_string); } } last_context = reader.GetAttribute("msgctxt"); draw_string.Text = reader.GetAttribute("text"); if (String.IsNullOrEmpty(draw_string.Text)) { draw_string.Text = reader.GetAttribute("_text"); } str = reader.GetAttribute("x"); if (String.IsNullOrEmpty(str) == false) { draw_string.X = Double.Parse(str, CultureInfo.InvariantCulture); } else { draw_string.X = 0.1; } str = reader.GetAttribute("y"); if (String.IsNullOrEmpty(str) == false) { draw_string.Y = Double.Parse(str, CultureInfo.InvariantCulture); } else { draw_string.Y = 0.1; } str = reader.GetAttribute("centered"); if (String.Compare(str, "yes", true) == 0) { draw_string.Centered = true; } else { draw_string.Centered = false; } str = reader.GetAttribute("size"); if (String.IsNullOrEmpty(str) == false) { switch (str.ToLower()) { case "small": draw_string.Size = TextDrawingObject.Sizes.Small; break; case "medium": draw_string.Size = TextDrawingObject.Sizes.Medium; break; case "large": draw_string.Size = TextDrawingObject.Sizes.Large; break; case "x-large": draw_string.Size = TextDrawingObject.Sizes.XLarge; break; case "xx-large": draw_string.Size = TextDrawingObject.Sizes.XXLarge; break; default: Console.WriteLine("GameXmlFactory. Unsupported value for size attribute: {0}", str); break; } } break; case "_question": case "question": if (reader.NodeType != XmlNodeType.Element) { break; } // Create object if needed if (processing_variant) { if (game.Variants[variant].Question == null) { game.Variants[variant].Question = new LocalizableString(); } } else { if (game.Question == null) { game.Question = new LocalizableString(); } } plural = reader.GetAttribute("plural"); if (String.IsNullOrEmpty(plural) == false) // Plural { if (processing_variant) { game.Variants[variant].Question.PluralString = reader.ReadElementStringAsItIs(); game.Variants[variant].Question.Value = plural; } else { game.Question.PluralString = reader.ReadElementStringAsItIs(); game.Question.Value = plural; } } else { if (processing_variant) { game.Variants[variant].Question.String = reader.ReadElementStringAsItIs(); } else { game.Question.String = reader.ReadElementStringAsItIs(); } } break; case "rationale": case "_rationale": if (reader.NodeType != XmlNodeType.Element) { break; } // Create object if needed if (processing_variant) { if (game.Variants[variant].Rationale == null) { game.Variants[variant].Rationale = new LocalizableString(); } } else { if (game.Rationale == null) { game.Rationale = new LocalizableString(); } } plural = reader.GetAttribute("plural"); if (String.IsNullOrEmpty(plural) == false) // Plural { if (processing_variant) { game.Variants[variant].Rationale.PluralString = reader.ReadElementStringAsItIs(); game.Variants[variant].Rationale.Value = plural; } else { game.Rationale.PluralString = reader.ReadElementStringAsItIs(); game.Rationale.Value = plural; } } else { if (processing_variant) { game.Variants[variant].Rationale.String = reader.ReadElementStringAsItIs(); } else { game.Rationale.String = reader.ReadElementStringAsItIs(); } } break; case "answer": case "_answer": if (reader.NodeType != XmlNodeType.Element) { break; } if (processing_variant) { game.Variants[variant].AnswerText = reader.ReadElementString(); } else { game.AnswerText = reader.ReadElementString(); } break; case "_answer_show": case "answer_show": if (reader.NodeType != XmlNodeType.Element) { break; } if (processing_variant) { game.Variants[variant].AnswerShow = reader.ReadElementString(); } else { game.AnswerShow = reader.ReadElementString(); } break; case "answer_expression": if (reader.NodeType != XmlNodeType.Element) { break; } if (processing_variant) { game.Variants[variant].AnswerCheckExpression = reader.ReadElementString(); } else { game.AnswerCheckExpression = reader.ReadElementString(); } break; case "answer_checkattributes": if (reader.NodeType != XmlNodeType.Element) { break; } if (processing_variant) { game.Variants[variant].CheckAttributes = GameAnswerCheckAttributesDescription.FromString(reader.ReadElementString()); } else { game.CheckAttributes = GameAnswerCheckAttributesDescription.FromString(reader.ReadElementString()); } break; case "_tip": if (reader.NodeType != XmlNodeType.Element) { break; } if (processing_variant) { game.Variants[variant].Tip = reader.ReadElementStringAsItIs(); } else { game.Tip = reader.ReadElementStringAsItIs(); } break; case "variant": if (reader.NodeType == XmlNodeType.Element) { game.NewVariant(); variant = game.Variants.Count - 1; processing_variant = true; } else if (reader.NodeType == XmlNodeType.EndElement) { processing_variant = false; } break; case "variables": if (processing_variant) { game.Variants[variant].Variables = reader.ReadElementString(); } else { game.Variables = reader.ReadElementString(); } break; case "option": switch (reader.NodeType) { case XmlNodeType.Element: option = new OptionDrawingObject(); break; case XmlNodeType.EndElement: if (String.IsNullOrEmpty(option.AnswerText) && option.RandomizedOrder == false) { throw new InvalidOperationException("If the option is not randomized, you need to define an answer"); } option = null; break; default: // Do any processing break; } if (option == null) { break; } if (processing_variant) { game.Variants[variant].AddDrawingObject(option); } else { game.AddDrawingObject(option); } option.AnswerText = reader.GetAttribute("answer"); if (String.IsNullOrEmpty(option.AnswerText)) { option.AnswerText = reader.GetAttribute("_answer"); } str = reader.GetAttribute("x"); if (String.IsNullOrEmpty(str) == false) { option.X = Double.Parse(str, CultureInfo.InvariantCulture); } else { option.X = 0.1; } str = reader.GetAttribute("y"); if (String.IsNullOrEmpty(str) == false) { option.Y = Double.Parse(str, CultureInfo.InvariantCulture); } else { option.Y = 0.1; } str = reader.GetAttribute("width"); if (String.IsNullOrEmpty(str) == false) { option.Width = Double.Parse(str, CultureInfo.InvariantCulture); } else { option.Width = 0.1; } str = reader.GetAttribute("height"); if (String.IsNullOrEmpty(str) == false) { option.Height = Double.Parse(str, CultureInfo.InvariantCulture); } else { option.Height = 0.1; } str = reader.GetAttribute("order"); if (String.IsNullOrEmpty(str) == false) { option.RandomizedOrder = true; } str = reader.GetAttribute("correct"); if (String.Compare(str, "yes", true) == 0) { option.Correct = true; } if (option.X + option.Width > 1 || option.Y + option.Height > 1) { Console.WriteLine("GameXmlFactory. Wrong option size. x+width and y+height cannot be larger than 1"); } break; default: if (String.IsNullOrEmpty(name) == false) { Console.WriteLine("GameXmlFactory. Unsupported tag: {0}", name); } break; } } reader.Close(); stream.Dispose(); read = true; GameXml.Definitions = games; } catch (Exception e) { read = true; Console.WriteLine("GameXmlFactory. Error loading: {0}", e.Message); } }