Inheritance: DrawingObject
Esempio n. 1
0
        public void DrawObjects(CairoContextEx gr, DrawingObject [] drawing_objects, int?option)
        {
            if (drawing_objects == null)
            {
                return;
            }

            foreach (DrawingObject draw_object in drawing_objects)
            {
                if (draw_object is OptionDrawingObject)
                {
                    continue;
                }

                if (draw_object is TextDrawingObject)
                {
                    string            text;
                    TextDrawingObject draw_string = draw_object as TextDrawingObject;

                    text = game_xml.CatalogGetString(draw_string.Text);
                    text = game_xml.ReplaceVariables(text);

                    switch (draw_string.Size)
                    {
                    case TextDrawingObject.Sizes.Small:
                        gr.SetPangoFontSize(0.018);
                        break;

                    case TextDrawingObject.Sizes.Medium:
                        gr.SetPangoNormalFontSize();                          // 0.022
                        break;

                    case TextDrawingObject.Sizes.Large:
                        gr.SetPangoLargeFontSize();                          // 0.0325
                        break;

                    case TextDrawingObject.Sizes.XLarge:
                        gr.SetPangoFontSize(0.06);
                        break;

                    case TextDrawingObject.Sizes.XXLarge:
                        gr.SetPangoFontSize(0.08);
                        break;

                    default:
                        throw new InvalidOperationException("Invalid value");
                    }

                    if (draw_string.Centered)
                    {
                        gr.DrawTextCentered(draw_string.X, draw_string.Y, text);
                    }
                    else
                    {
                        gr.MoveTo(draw_string.X, draw_string.Y);
                        if (option == null)
                        {
                            gr.ShowPangoText(text);
                        }
                        else
                        {
                            gr.ShowPangoText(GetOptionPrefix(text, (int)option));
                        }

                        gr.Stroke();
                    }
                }
                else if (draw_object is ImageDrawingObject)
                {
                    ImageDrawingObject image = draw_object as ImageDrawingObject;

                    if (String.IsNullOrEmpty(image.Filename) == false)
                    {
                        string         dir;
                        IConfiguration config;

                        config = ServiceLocator.Instance.GetService <IConfiguration> ();
                        dir    = config.Get <string> (ConfigurationKeys.GamesGraphics);

                        gr.DrawImageFromFile(Path.Combine(dir, image.Filename),
                                             image.X, image.Y, image.Width, image.Height);
                    }
                }
            }
        }
Esempio n. 2
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);
            }
        }
Esempio n. 3
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);
            }
        }