Inheritance: GameXmlDefinitionVariant
Beispiel #1
0
        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);
        }
Beispiel #2
0
    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 ();
    }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
    // 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;
    }
Beispiel #6
0
        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];"));
        }
Beispiel #7
0
        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);
            }
        }