Ejemplo n.º 1
0
    public static void appendEffects(XmlDocument doc, XmlNode effectsNode, Effects effects)
    {
        // Add every effect
        foreach (AbstractEffect effect in effects.getEffects())
        {
            XmlElement effectElement  = null;
            XmlNode    conditionsNode = null;

            if (effect.getType() != EffectType.RANDOM_EFFECT)
            {
                effectElement = buildEffectNode(effect, doc);
            }
            else
            {
                RandomEffect randomEffect = (RandomEffect)effect;
                effectElement = doc.CreateElement("random-effect");
                effectElement.SetAttribute("probability", randomEffect.getProbability().ToString());

                XmlElement posEfElement = null;
                XmlElement negEfElement = null;

                if (randomEffect.getPositiveEffect() != null)
                {
                    posEfElement = buildEffectNode(randomEffect.getPositiveEffect(), doc);
                    effectElement.AppendChild(posEfElement);
                    if (randomEffect.getNegativeEffect() != null)
                    {
                        negEfElement = buildEffectNode(randomEffect.getNegativeEffect(), doc);
                        effectElement.AppendChild(negEfElement);
                    }
                }
            }
            // Create conditions for current effect
            conditionsNode = ConditionsDOMWriter.buildDOM(effect.getConditions());
            doc.ImportNode(conditionsNode, true);
            // Add the effect
            effectsNode.AppendChild(effectElement);

            // Add conditions associated to that effect
            effectsNode.AppendChild(conditionsNode);
        }
    }
Ejemplo n.º 2
0
    public static XmlNode buildDOM(Player player)
    {
        XmlNode playerNode = null;

        // Create the necessary elements to create the DOM
        XmlDocument doc = Writer.GetDoc();

        // Create the root node
        playerNode = doc.CreateElement("player");

        // Append the documentation (if avalaible)
        if (player.getDocumentation() != null)
        {
            XmlNode playerDocumentationNode = doc.CreateElement("documentation");
            playerDocumentationNode.AppendChild(doc.CreateTextNode(player.getDocumentation()));
            playerNode.AppendChild(playerDocumentationNode);
        }

        // Append the resources
        foreach (ResourcesUni resources in player.getResources())
        {
            XmlNode resourcesNode = ResourcesDOMWriter.buildDOM(resources, ResourcesDOMWriter.RESOURCES_CHARACTER);
            doc.ImportNode(resourcesNode, true);
            playerNode.AppendChild(resourcesNode);
        }

        // Create the textcolor
        XmlElement textColorNode = doc.CreateElement("textcolor");

        textColorNode.SetAttribute("showsSpeechBubble", (player.getShowsSpeechBubbles() ? "yes" : "no"));
        textColorNode.SetAttribute("bubbleBkgColor", player.getBubbleBkgColor());
        textColorNode.SetAttribute("bubbleBorderColor", player.getBubbleBorderColor());

        // Create and append the frontcolor
        XmlElement frontColorElement = doc.CreateElement("frontcolor");

        frontColorElement.SetAttribute("color", player.getTextFrontColor());
        textColorNode.AppendChild(frontColorElement);

        // Create and append the bordercolor
        XmlElement borderColoElement = doc.CreateElement("bordercolor");

        borderColoElement.SetAttribute("color", player.getTextBorderColor());
        textColorNode.AppendChild(borderColoElement);

        // Append the textcolor
        playerNode.AppendChild(textColorNode);

        foreach (Description description in player.getDescriptions())
        {
            // Create the description
            XmlNode descriptionNode = doc.CreateElement("description");

            // Append the conditions (if available)
            if (description.getConditions() != null && !description.getConditions().isEmpty())
            {
                XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(description.getConditions());
                doc.ImportNode(conditionsNode, true);
                descriptionNode.AppendChild(conditionsNode);
            }

            // Create and append the name, brief description and detailed description
            XmlElement nameNode = doc.CreateElement("name");
            if (description.getNameSoundPath() != null && !description.getNameSoundPath().Equals(""))
            {
                nameNode.SetAttribute("soundPath", description.getNameSoundPath());
            }
            nameNode.AppendChild(doc.CreateTextNode(description.getName()));
            descriptionNode.AppendChild(nameNode);

            XmlElement briefNode = doc.CreateElement("brief");
            if (description.getDescriptionSoundPath() != null && !description.getDescriptionSoundPath().Equals(""))
            {
                briefNode.SetAttribute("soundPath", description.getDescriptionSoundPath());
            }
            briefNode.AppendChild(doc.CreateTextNode(description.getDescription()));
            descriptionNode.AppendChild(briefNode);

            XmlElement detailedNode = doc.CreateElement("detailed");
            if (description.getDetailedDescriptionSoundPath() != null &&
                !description.getDetailedDescriptionSoundPath().Equals(""))
            {
                detailedNode.SetAttribute("soundPath", description.getDetailedDescriptionSoundPath());
            }
            detailedNode.AppendChild(doc.CreateTextNode(description.getDetailedDescription()));
            descriptionNode.AppendChild(detailedNode);

            // Append the description
            playerNode.AppendChild(descriptionNode);
        }

        // Create the voice tag
        XmlElement voiceNode = doc.CreateElement("voice");

        // Create and append the voice name and if is alwaysSynthesizer
        voiceNode.SetAttribute("name", player.getVoice());
        if (player.isAlwaysSynthesizer())
        {
            voiceNode.SetAttribute("synthesizeAlways", "yes");
        }
        else
        {
            voiceNode.SetAttribute("synthesizeAlways", "no");
        }

        // Append the voice tag

        playerNode.AppendChild(voiceNode);

        return(playerNode);
    }
Ejemplo n.º 3
0
    /**
     * Returns the DOM element for the chapter
     *
     * @param chapter
     *            Chapter data to be written
     * @return DOM element with the chapter data
     */

    public static XmlNode buildDOM(Chapter chapter, String zipFile, XmlDocument doc)
    {
        XmlElement chapterNode = null;

        //try {
        // Create the necessary elements to create the DOM

        /*DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance( );
         * DocumentBuilder db = dbf.newDocumentBuilder( );
         * Document doc = db.newDocument( );
         */
        // Create the root node
        chapterNode = doc.CreateElement("eAdventure");

        // Add the adaptation and assessment active profiles
        if (!chapter.getAdaptationName().Equals(""))
        {
            chapterNode.SetAttribute("adaptProfile", chapter.getAdaptationName());
        }

        // Create and append the assessment configuration
        if (!chapter.getAssessmentName().Equals(""))
        {
            chapterNode.SetAttribute("assessProfile", chapter.getAssessmentName());
        }

        // Append the scene elements
        foreach (Scene scene in chapter.getScenes())
        {
            bool    initialScene = chapter.getTargetId().Equals(scene.getId());
            XmlNode sceneNode    = SceneDOMWriter.buildDOM(scene, initialScene);
            doc.ImportNode(sceneNode, true);
            chapterNode.AppendChild(sceneNode);
        }

        // Append the cutscene elements
        foreach (Cutscene cutscene in chapter.getCutscenes())
        {
            bool    initialScene = chapter.getTargetId().Equals(cutscene.getId());
            XmlNode cutsceneNode = CutsceneDOMWriter.buildDOM(cutscene, initialScene);
            doc.ImportNode(cutsceneNode, true);
            chapterNode.AppendChild(cutsceneNode);
        }

        // Append the book elements
        foreach (Book book in chapter.getBooks())
        {
            XmlNode bookNode = BookDOMWriter.buildDOM(book);
            doc.ImportNode(bookNode, true);
            chapterNode.AppendChild(bookNode);
        }

        // Append the item elements
        foreach (Item item in chapter.getItems())
        {
            XmlNode itemNode = ItemDOMWriter.buildDOM(item);
            doc.ImportNode(itemNode, true);
            chapterNode.AppendChild(itemNode);
        }

        // Append the player element
        XmlNode playerNode = PlayerDOMWriter.buildDOM(chapter.getPlayer());

        doc.ImportNode(playerNode, true);
        chapterNode.AppendChild(playerNode);

        // Append the character element
        foreach (NPC character in chapter.getCharacters())
        {
            XmlNode characterNode = CharacterDOMWriter.buildDOM(character);
            doc.ImportNode(characterNode, true);
            chapterNode.AppendChild(characterNode);
        }

        // Append the conversation element
        foreach (Conversation conversation in chapter.getConversations())
        {
            XmlNode conversationNode = ConversationDOMWriter.buildDOM(conversation);
            doc.ImportNode(conversationNode, true);
            chapterNode.AppendChild(conversationNode);
        }

        // Append the timers
        foreach (Timer timer in chapter.getTimers())
        {
            XmlNode timerNode = TimerDOMWriter.buildDOM(timer);
            doc.ImportNode(timerNode, true);
            chapterNode.AppendChild(timerNode);
        }

        // Append global states
        foreach (GlobalState globalState in chapter.getGlobalStates())
        {
            XmlElement globalStateElement = ConditionsDOMWriter.buildDOM(globalState);
            doc.ImportNode(globalStateElement, true);
            chapterNode.AppendChild(globalStateElement);
        }

        // Append macros
        foreach (Macro macro in chapter.getMacros())
        {
            XmlElement macroElement = EffectsDOMWriter.buildDOM(macro);
            doc.ImportNode(macroElement, true);
            chapterNode.AppendChild(macroElement);
        }

        // Append the atrezzo item elements
        foreach (Atrezzo atrezzo in chapter.getAtrezzo())
        {
            XmlNode atrezzoNode = AtrezzoDOMWriter.buildDOM(atrezzo);
            doc.ImportNode(atrezzoNode, true);
            chapterNode.AppendChild(atrezzoNode);
        }

        /*} catch( ParserConfigurationException e ) {
         *      ReportDialog.GenerateErrorReport(e, true, "UNKNOWERROR");
         * }*/

        return(chapterNode);
    }
    public static XmlNode buildDOM(ResourcesUni resources, int resourcesType)
    {
        XmlElement resourcesNode = null;

        // Create the necessary elements to create the DOM
        XmlDocument doc = Writer.GetDoc();

        // Create the root node
        resourcesNode = doc.CreateElement("resources");
        resourcesNode.SetAttribute("name", resources.getName());

        // Append the conditions block (if there is one)
        if (!resources.getConditions().isEmpty())
        {
            XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(resources.getConditions());
            doc.ImportNode(conditionsNode, true);
            resourcesNode.AppendChild(conditionsNode);
        }

        // Take the array of types and values of the assets
        string[] assetTypes  = resources.getAssetTypes();
        string[] assetValues = resources.getAssetValues();
        for (int i = 0; i < resources.getAssetCount(); i++)
        {
            XmlElement assetElement = doc.CreateElement("asset");
            assetElement.SetAttribute("type", assetTypes[i]);
            assetElement.SetAttribute("uri", assetValues[i]);
            resourcesNode.AppendChild(assetElement);
        }

        // If the owner is an item
        if (resourcesType == RESOURCES_ITEM)
        {
            // If the item has no image, add the default one
            if (resources.getAssetPath("image") == null)
            {
                XmlElement assetElement = doc.CreateElement("asset");
                assetElement.SetAttribute("type", "image");
                assetElement.SetAttribute("uri", SpecialAssetPaths.ASSET_EMPTY_IMAGE);
                resourcesNode.AppendChild(assetElement);
            }

            // If the item has no icon, add the default one
            if (resources.getAssetPath("icon") == null)
            {
                XmlElement assetElement = doc.CreateElement("asset");
                assetElement.SetAttribute("type", "icon");
                assetElement.SetAttribute("uri", SpecialAssetPaths.ASSET_EMPTY_ICON);
                resourcesNode.AppendChild(assetElement);
            }
        }

        // If the owner is a scene
        if (resourcesType == RESOURCES_SCENE)
        {
            // If the item has no image, add the default one
            if (resources.getAssetPath("background") == null)
            {
                XmlElement assetElement = doc.CreateElement("asset");
                assetElement.SetAttribute("type", "background");
                assetElement.SetAttribute("uri", SpecialAssetPaths.ASSET_EMPTY_BACKGROUND);
                resourcesNode.AppendChild(assetElement);
            }
        }

        // If the owner is a scene
        if (resourcesType == RESOURCES_CUTSCENE)
        {
            // If the item has no image, add the default one
            if (resources.getAssetPath("slides") == null)
            {
                XmlElement assetElement = doc.CreateElement("asset");
                assetElement.SetAttribute("type", "slides");
                assetElement.SetAttribute("uri", SpecialAssetPaths.ASSET_EMPTY_ANIMATION);
                resourcesNode.AppendChild(assetElement);
            }
        }

        // If the owner is a character
        else if (resourcesType == RESOURCES_CHARACTER)
        {
            // For each asset, if it has not been declared attach the empty animation
            string[] assets = new string[]
            {
                "standup", "standdown", "standright", "standleft", "speakup", "speakdown", "speakright", "speakleft",
                "useright", "useleft", "walkup", "walkdown", "walkright", "walkleft"
            };
            foreach (string asset in assets)
            {
                if (resources.getAssetPath(asset) == null)
                {
                    XmlElement assetElement = doc.CreateElement("asset");
                    assetElement.SetAttribute("type", asset);
                    assetElement.SetAttribute("uri", SpecialAssetPaths.ASSET_EMPTY_ANIMATION);
                    resourcesNode.AppendChild(assetElement);
                }
            }
        }

        // If the owner is a character
        else if (resourcesType == RESOURCES_CUSTOM_ACTION)
        {
            // For each asset, if it has not been declared attach the empty animation
            string[] assets = new string[] { "buttonNormal", "buttonOver", "buttonPressed" };
            foreach (string asset in assets)
            {
                if (resources.getAssetPath(asset) == null)
                {
                    XmlElement assetElement = doc.CreateElement("asset");
                    assetElement.SetAttribute("type", asset);
                    assetElement.SetAttribute("uri", SpecialAssetPaths.ASSET_EMPTY_ICON);
                    resourcesNode.AppendChild(assetElement);
                }
            }
        }

        // if the owner is a book
        else if (resourcesType == RESOURCES_BOOK)
        {
            // For each asset, if it has not been declared attach the empty animation
            string[] assets = new string[]
            { "background" /*, "arrowLeftNormal", "arrowRightNormal", "arrowLeftOver", "arrowRightOver" */ };
            foreach (string asset in assets)
            {
                if (resources.getAssetPath(asset) == null)
                {
                    XmlElement assetElement = doc.CreateElement("asset");
                    assetElement.SetAttribute("type", asset);
                    assetElement.SetAttribute("uri", SpecialAssetPaths.ASSET_EMPTY_BACKGROUND);
                    resourcesNode.AppendChild(assetElement);
                }
            }
        }

        return(resourcesNode);
    }
Ejemplo n.º 5
0
    /**
     * Build a node from a list of actions
     *
     * @param actions
     *            the list of actions
     * @return the xml node with the list of actions
     */

    public static XmlNode buildDOM(List <Action> actions)
    {
        XmlElement actionsElement = null;


        XmlDocument doc = Writer.GetDoc();

        // Create the root node
        actionsElement = doc.CreateElement("actions");

        // Append the actions (if there is at least one)
        if (actions.Count > 0)
        {
            // For every action
            foreach (Action action in actions)
            {
                XmlElement actionElement = null;

                // Create the element
                switch (action.getType())
                {
                case Action.EXAMINE:
                    actionElement = doc.CreateElement("examine");
                    break;

                case Action.GRAB:
                    actionElement = doc.CreateElement("grab");
                    break;

                case Action.USE:
                    actionElement = doc.CreateElement("use");
                    break;

                case Action.TALK_TO:
                    actionElement = doc.CreateElement("talk-to");
                    break;

                case Action.USE_WITH:
                    actionElement = doc.CreateElement("use-with");
                    actionElement.SetAttribute("idTarget", action.getTargetId());
                    break;

                case Action.GIVE_TO:
                    actionElement = doc.CreateElement("give-to");
                    actionElement.SetAttribute("idTarget", action.getTargetId());
                    break;

                case Action.DRAG_TO:
                    actionElement = doc.CreateElement("drag-to");
                    actionElement.SetAttribute("idTarget", action.getTargetId());
                    break;

                case Action.CUSTOM:
                    actionElement = doc.CreateElement("custom");
                    actionElement.SetAttribute("name", ((CustomAction)action).getName());
                    foreach (ResourcesUni resources in ((CustomAction)action).getResources())
                    {
                        XmlNode resourcesXmlNode = ResourcesDOMWriter.buildDOM(resources,
                                                                               ResourcesDOMWriter.RESOURCES_CUSTOM_ACTION);
                        //doc.adoptXmlNode(resourcesXmlNode);
                        doc.ImportNode(resourcesXmlNode, true);
                        actionElement.AppendChild(resourcesXmlNode);
                    }
                    break;

                case Action.CUSTOM_INTERACT:
                    actionElement = doc.CreateElement("custom-interact");
                    actionElement.SetAttribute("idTarget", action.getTargetId());
                    actionElement.SetAttribute("name", ((CustomAction)action).getName());
                    foreach (ResourcesUni resources in ((CustomAction)action).getResources())
                    {
                        XmlNode resourcesXmlNode = ResourcesDOMWriter.buildDOM(resources,
                                                                               ResourcesDOMWriter.RESOURCES_CUSTOM_ACTION);
                        doc.ImportNode(resourcesXmlNode, true);
                        actionElement.AppendChild(resourcesXmlNode);
                    }
                    break;
                }

                actionElement.SetAttribute("needsGoTo", (action.isNeedsGoTo() ? "yes" : "no"));
                actionElement.SetAttribute("keepDistance", "" + action.getKeepDistance());
                actionElement.SetAttribute("not-effects", action.isActivatedNotEffects() ? "yes" : "no");

                // Append the documentation (if avalaible)
                if (action.getDocumentation() != null)
                {
                    XmlNode actionDocumentationXmlNode = doc.CreateElement("documentation");
                    actionDocumentationXmlNode.AppendChild(doc.CreateTextNode(action.getDocumentation()));
                    actionElement.AppendChild(actionDocumentationXmlNode);
                }

                // Append the conditions (if avalaible)
                if (!action.getConditions().isEmpty())
                {
                    XmlNode conditionsXmlNode = ConditionsDOMWriter.buildDOM(action.getConditions());
                    doc.ImportNode(conditionsXmlNode, true);
                    actionElement.AppendChild(conditionsXmlNode);
                }

                // Append the effects (if avalaible)
                if (!action.getEffects().isEmpty())
                {
                    XmlNode effectsXmlNode = EffectsDOMWriter.buildDOM(EffectsDOMWriter.EFFECTS, action.getEffects());
                    doc.ImportNode(effectsXmlNode, true);
                    actionElement.AppendChild(effectsXmlNode);
                }
                // Append the not effects (if avalaible)
                if (action.getNotEffects() != null && !action.getNotEffects().isEmpty())
                {
                    XmlNode notEffectsXmlNode = EffectsDOMWriter.buildDOM(EffectsDOMWriter.NOT_EFFECTS,
                                                                          action.getNotEffects());
                    doc.ImportNode(notEffectsXmlNode, true);
                    actionElement.AppendChild(notEffectsXmlNode);
                }

                // Append the action element
                actionsElement.AppendChild(actionElement);
            }
        }

        return(actionsElement);
    }
Ejemplo n.º 6
0
    public static XmlNode buildDOM(Timer timer)
    {
        XmlElement timerElement = null;

        // Create the necessary elements to create the DOM
        XmlDocument doc = Writer.GetDoc();

        // Create the root node
        timerElement = doc.CreateElement("timer");

        // Set the time attribute
        timerElement.SetAttribute("time", timer.getTime().ToString());
        timerElement.SetAttribute("usesEndCondition", timer.isUsesEndCondition() ? "yes" : "no");
        timerElement.SetAttribute("multipleStarts", timer.isMultipleStarts() ? "yes" : "no");
        timerElement.SetAttribute("runsInLoop", timer.isRunsInLoop() ? "yes" : "no");
        timerElement.SetAttribute("showTime", timer.isShowTime() ? "yes" : "no");
        timerElement.SetAttribute("displayName", timer.getDisplayName());
        timerElement.SetAttribute("countDown", timer.isCountDown() ? "yes" : "no");
        timerElement.SetAttribute("showWhenStopped", timer.isShowWhenStopped() ? "yes" : "no");

        // Append the documentation (if avalaible)
        if (timer.getDocumentation() != null)
        {
            XmlNode timerDocumentationNode = doc.CreateElement("documentation");
            timerDocumentationNode.AppendChild(doc.CreateTextNode(timer.getDocumentation()));
            timerElement.AppendChild(timerDocumentationNode);
        }

        // Append the init conditions (if avalaible)
        if (!timer.getInitCond().isEmpty())
        {
            XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(ConditionsDOMWriter.INIT_CONDITIONS,
                                                                  timer.getInitCond());
            doc.ImportNode(conditionsNode, true);
            timerElement.AppendChild(conditionsNode);
        }

        // Append the end-conditions (if avalaible)
        if (!timer.getEndCond().isEmpty())
        {
            XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(ConditionsDOMWriter.END_CONDITIONS, timer.getEndCond());
            doc.ImportNode(conditionsNode, true);
            timerElement.AppendChild(conditionsNode);
        }

        // Append the effects (if avalaible)
        if (!timer.getEffects().isEmpty())
        {
            XmlNode effectsNode = EffectsDOMWriter.buildDOM(EffectsDOMWriter.EFFECTS, timer.getEffects());
            doc.ImportNode(effectsNode, true);
            timerElement.AppendChild(effectsNode);
        }

        // Append the post-effects (if avalaible)
        if (!timer.getPostEffects().isEmpty())
        {
            XmlNode postEffectsNode = EffectsDOMWriter.buildDOM(EffectsDOMWriter.POST_EFFECTS, timer.getPostEffects());
            doc.ImportNode(postEffectsNode, true);
            timerElement.AppendChild(postEffectsNode);
        }

        return(timerElement);
    }
Ejemplo n.º 7
0
    public static XmlNode buildDOM(Scene scene, bool initialScene)
    {
        XmlElement sceneElement = null;

        if (scene != null)
        {
            TrajectoryFixer.fixTrajectory(scene);
        }
        // Create the necessary elements to create the DOM
        XmlDocument doc = Writer.GetDoc();

        // Create the root node
        sceneElement = doc.CreateElement("scene");
        sceneElement.SetAttribute("id", scene.getId());
        if (initialScene)
        {
            sceneElement.SetAttribute("start", "yes");
        }
        else
        {
            sceneElement.SetAttribute("start", "no");
        }

        sceneElement.SetAttribute("playerLayer", scene.getPlayerLayer().ToString());
        sceneElement.SetAttribute("playerScale", scene.getPlayerScale().ToString());

        // Append the documentation (if avalaible)
        if (scene.getDocumentation() != null)
        {
            XmlNode sceneDocumentationNode = doc.CreateElement("documentation");
            sceneDocumentationNode.AppendChild(doc.CreateTextNode(scene.getDocumentation()));
            sceneElement.AppendChild(sceneDocumentationNode);
        }

        // Append the resources
        foreach (ResourcesUni resources in scene.getResources())
        {
            XmlNode resourcesNode = ResourcesDOMWriter.buildDOM(resources, ResourcesDOMWriter.RESOURCES_SCENE);
            doc.ImportNode(resourcesNode, true);
            sceneElement.AppendChild(resourcesNode);
        }

        // Append the name
        XmlNode nameNode = doc.CreateElement("name");

        nameNode.AppendChild(doc.CreateTextNode(scene.getName()));
        sceneElement.AppendChild(nameNode);

        // Append the default inital position (if avalaible)
        if (scene.hasDefaultPosition())
        {
            XmlElement initialPositionElement = doc.CreateElement("default-initial-position");
            initialPositionElement.SetAttribute("x", scene.getPositionX().ToString());
            initialPositionElement.SetAttribute("y", scene.getPositionY().ToString());
            sceneElement.AppendChild(initialPositionElement);
        }

        // Append the exits (if there is at least one)
        if (scene.getExits().Count > 0)
        {
            XmlNode exitsElement = doc.CreateElement("exits");

            // Append every single exit
            foreach (Exit exit in scene.getExits())
            {
                // Create the exit element
                XmlElement exitElement = doc.CreateElement("exit");
                exitElement.SetAttribute("rectangular", (exit.isRectangular() ? "yes" : "no"));
                exitElement.SetAttribute("x", exit.getX().ToString());
                exitElement.SetAttribute("y", exit.getY().ToString());
                exitElement.SetAttribute("width", exit.getWidth().ToString());
                exitElement.SetAttribute("height", exit.getHeight().ToString());
                exitElement.SetAttribute("hasInfluenceArea", (exit.getInfluenceArea().isExists() ? "yes" : "no"));
                exitElement.SetAttribute("idTarget", exit.getNextSceneId());
                exitElement.SetAttribute("destinyY", exit.getDestinyY().ToString());
                exitElement.SetAttribute("destinyX", exit.getDestinyX().ToString());
                exitElement.SetAttribute("transitionType", exit.getTransitionType().ToString());
                exitElement.SetAttribute("transitionTime", exit.getTransitionTime().ToString());
                exitElement.SetAttribute("not-effects", (exit.isHasNotEffects() ? "yes" : "no"));

                if (exit.getInfluenceArea().isExists())
                {
                    exitElement.SetAttribute("influenceX", exit.getInfluenceArea().getX().ToString());
                    exitElement.SetAttribute("influenceY", exit.getInfluenceArea().getY().ToString());
                    exitElement.SetAttribute("influenceWidth", exit.getInfluenceArea().getWidth().ToString());
                    exitElement.SetAttribute("influenceHeight", exit.getInfluenceArea().getHeight().ToString());
                }

                // Append the documentation (if avalaible)
                if (exit.getDocumentation() != null)
                {
                    XmlNode exitDocumentationNode = doc.CreateElement("documentation");
                    exitDocumentationNode.AppendChild(doc.CreateTextNode(exit.getDocumentation()));
                    exitElement.AppendChild(exitDocumentationNode);
                }

                //Append the default exit look (if available)
                ExitLook defaultLook = exit.getDefaultExitLook();
                if (defaultLook != null)
                {
                    XmlElement exitLook = doc.CreateElement("exit-look");
                    if (defaultLook.getExitText() != null)
                    {
                        exitLook.SetAttribute("text", defaultLook.getExitText());
                    }
                    if (defaultLook.getCursorPath() != null)
                    {
                        exitLook.SetAttribute("cursor-path", defaultLook.getCursorPath());
                    }
                    if (defaultLook.getSoundPath() != null)
                    {
                        exitLook.SetAttribute("sound-path", defaultLook.getSoundPath());
                    }

                    if (defaultLook.getExitText() != null || defaultLook.getCursorPath() != null)
                    {
                        exitElement.AppendChild(exitLook);
                    }
                }

                // Append the next-scene structures
                foreach (NextScene nextScene in exit.getNextScenes())
                {
                    // Create the next-scene element
                    XmlElement nextSceneElement = doc.CreateElement("next-scene");
                    nextSceneElement.SetAttribute("idTarget", nextScene.getTargetId());

                    // Append the destination position (if avalaible)
                    if (nextScene.hasPlayerPosition())
                    {
                        nextSceneElement.SetAttribute("x", nextScene.getPositionX().ToString());
                        nextSceneElement.SetAttribute("y", nextScene.getPositionY().ToString());
                    }

                    nextSceneElement.SetAttribute("transitionTime", nextScene.getTransitionTime().ToString());
                    nextSceneElement.SetAttribute("transitionType", nextScene.getTransitionType().ToString());

                    // Append the conditions (if avalaible)
                    if (!nextScene.getConditions().isEmpty())
                    {
                        XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(nextScene.getConditions());
                        doc.ImportNode(conditionsNode, true);
                        nextSceneElement.AppendChild(conditionsNode);
                    }

                    //Append the default exit look (if available)
                    ExitLook look = nextScene.getExitLook();
                    if (look != null)
                    {
                        Debug.Log("SAVE 154: " + look.getExitText());
                        XmlElement exitLook = doc.CreateElement("exit-look");
                        if (look.getExitText() != null)
                        {
                            exitLook.SetAttribute("text", look.getExitText());
                        }
                        if (look.getCursorPath() != null)
                        {
                            exitLook.SetAttribute("cursor-path", look.getCursorPath());
                        }
                        if (look.getSoundPath() != null)
                        {
                            exitLook.SetAttribute("sound-path", look.getSoundPath());
                        }
                        if (look.getExitText() != null || look.getCursorPath() != null)
                        {
                            nextSceneElement.AppendChild(exitLook);
                        }
                    }

                    // Append the effects (if avalaible)
                    if (!nextScene.getEffects().isEmpty())
                    {
                        XmlNode effectsNode = EffectsDOMWriter.buildDOM(EffectsDOMWriter.EFFECTS,
                                                                        nextScene.getEffects());
                        doc.ImportNode(effectsNode, true);
                        nextSceneElement.AppendChild(effectsNode);
                    }

                    // Append the post-effects (if avalaible)
                    if (!nextScene.getPostEffects().isEmpty())
                    {
                        XmlNode postEffectsNode = EffectsDOMWriter.buildDOM(EffectsDOMWriter.POST_EFFECTS,
                                                                            nextScene.getPostEffects());
                        doc.ImportNode(postEffectsNode, true);
                        nextSceneElement.AppendChild(postEffectsNode);
                    }

                    // Append the next scene
                    exitElement.AppendChild(nextSceneElement);
                }

                if (!exit.isRectangular())
                {
                    foreach (Vector2 point in exit.getPoints())
                    {
                        XmlElement pointNode = doc.CreateElement("point");
                        pointNode.SetAttribute("x", ((int)point.x).ToString());
                        pointNode.SetAttribute("y", ((int)point.y).ToString());
                        exitElement.AppendChild(pointNode);
                    }
                }

                if (exit.getConditions() != null && !exit.getConditions().isEmpty())
                {
                    XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(exit.getConditions());
                    doc.ImportNode(conditionsNode, true);
                    exitElement.AppendChild(conditionsNode);
                }

                if (exit.getEffects() != null && !exit.getEffects().isEmpty())
                {
                    Debug.Log("SceneDOM Effects: " + exit.getEffects().getEffects().Count);
                    XmlNode effectsNode = EffectsDOMWriter.buildDOM(EffectsDOMWriter.EFFECTS, exit.getEffects());
                    doc.ImportNode(effectsNode, true);
                    exitElement.AppendChild(effectsNode);
                }

                if (exit.getPostEffects() != null && !exit.getPostEffects().isEmpty())
                {
                    Debug.Log("SceneDOM PostEffects: " + exit.getPostEffects().getEffects().Count);
                    XmlNode postEffectsNode = EffectsDOMWriter.buildDOM(EffectsDOMWriter.POST_EFFECTS,
                                                                        exit.getPostEffects());
                    doc.ImportNode(postEffectsNode, true);
                    exitElement.AppendChild(postEffectsNode);
                }

                if (exit.getNotEffects() != null && !exit.getNotEffects().isEmpty())
                {
                    Debug.Log("SceneDOM NonEffects: " + exit.getNotEffects().getEffects().Count);
                    XmlNode notEffectsNode = EffectsDOMWriter.buildDOM(EffectsDOMWriter.NOT_EFFECTS,
                                                                       exit.getNotEffects());
                    doc.ImportNode(notEffectsNode, true);
                    exitElement.AppendChild(notEffectsNode);
                }

                // Append the exit
                exitsElement.AppendChild(exitElement);
            }
            // Append the list of exits
            sceneElement.AppendChild(exitsElement);
        }

        // Add the item references (if there is at least one)
        if (scene.getItemReferences().Count > 0)
        {
            XmlNode itemsNode = doc.CreateElement("objects");

            // Append every single item reference
            foreach (ElementReference itemReference in scene.getItemReferences())
            {
                // Create the item reference element
                XmlElement itemReferenceElement = doc.CreateElement("object-ref");
                itemReferenceElement.SetAttribute("idTarget", itemReference.getTargetId());
                itemReferenceElement.SetAttribute("x", itemReference.getX().ToString());
                itemReferenceElement.SetAttribute("y", itemReference.getY().ToString());
                itemReferenceElement.SetAttribute("scale", itemReference.getScale().ToString());
                if (itemReference.getLayer() != -1)
                {
                    itemReferenceElement.SetAttribute("layer", itemReference.getLayer().ToString());
                }
                if (itemReference.getInfluenceArea().isExists())
                {
                    itemReferenceElement.SetAttribute("hasInfluenceArea", "yes");
                    InfluenceArea ia = itemReference.getInfluenceArea();
                    itemReferenceElement.SetAttribute("influenceX", ia.getX().ToString());
                    itemReferenceElement.SetAttribute("influenceY", ia.getY().ToString());
                    itemReferenceElement.SetAttribute("influenceWidth", ia.getWidth().ToString());
                    itemReferenceElement.SetAttribute("influenceHeight", ia.getHeight().ToString());
                }
                else
                {
                    itemReferenceElement.SetAttribute("hasInfluenceArea", "no");
                }

                // Append the documentation (if avalaible)
                if (itemReference.getDocumentation() != null)
                {
                    XmlNode itemDocumentationNode = doc.CreateElement("documentation");
                    itemDocumentationNode.AppendChild(doc.CreateTextNode(itemReference.getDocumentation()));
                    itemReferenceElement.AppendChild(itemDocumentationNode);
                }

                // Append the conditions (if avalaible)
                if (!itemReference.getConditions().isEmpty())
                {
                    XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(itemReference.getConditions());
                    doc.ImportNode(conditionsNode, true);
                    itemReferenceElement.AppendChild(conditionsNode);
                }

                // Append the exit
                itemsNode.AppendChild(itemReferenceElement);
            }
            // Append the list of exits
            sceneElement.AppendChild(itemsNode);
        }

        // Add the character references (if there is at least one)
        if (scene.getCharacterReferences().Count > 0)
        {
            XmlNode charactersNode = doc.CreateElement("characters");

            // Append every single character reference
            foreach (ElementReference characterReference in scene.getCharacterReferences())
            {
                // Create the character reference element
                XmlElement npcReferenceElement = doc.CreateElement("character-ref");
                npcReferenceElement.SetAttribute("idTarget", characterReference.getTargetId());
                npcReferenceElement.SetAttribute("x", characterReference.getX().ToString());
                npcReferenceElement.SetAttribute("y", characterReference.getY().ToString());
                npcReferenceElement.SetAttribute("scale", characterReference.getScale().ToString());
                if (characterReference.getLayer() != -1)
                {
                    npcReferenceElement.SetAttribute("layer", characterReference.getLayer().ToString());
                }
                if (characterReference.getInfluenceArea().isExists())
                {
                    npcReferenceElement.SetAttribute("hasInfluenceArea", "yes");
                    InfluenceArea ia = characterReference.getInfluenceArea();
                    npcReferenceElement.SetAttribute("influenceX", ia.getX().ToString());
                    npcReferenceElement.SetAttribute("influenceY", ia.getY().ToString());
                    npcReferenceElement.SetAttribute("influenceWidth", ia.getWidth().ToString());
                    npcReferenceElement.SetAttribute("influenceHeight", ia.getHeight().ToString());
                }
                else
                {
                    npcReferenceElement.SetAttribute("hasInfluenceArea", "no");
                }

                // Append the documentation (if avalaible)
                if (characterReference.getDocumentation() != null)
                {
                    XmlNode itemDocumentationNode = doc.CreateElement("documentation");
                    itemDocumentationNode.AppendChild(doc.CreateTextNode(characterReference.getDocumentation()));
                    npcReferenceElement.AppendChild(itemDocumentationNode);
                }

                // Append the conditions (if avalaible)
                if (!characterReference.getConditions().isEmpty())
                {
                    XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(characterReference.getConditions());
                    doc.ImportNode(conditionsNode, true);
                    npcReferenceElement.AppendChild(conditionsNode);
                }

                // Append the exit
                charactersNode.AppendChild(npcReferenceElement);
            }
            // Append the list of exits
            sceneElement.AppendChild(charactersNode);
        }

        // Append the exits (if there is at least one)
        if (scene.getActiveAreas().Count > 0)
        {
            XmlNode aasElement = doc.CreateElement("active-areas");

            // Append every single exit
            foreach (ActiveArea activeArea in scene.getActiveAreas())
            {
                // Create the active area element
                XmlElement aaElement = doc.CreateElement("active-area");
                if (activeArea.getId() != null)
                {
                    aaElement.SetAttribute("id", activeArea.getId());
                }
                aaElement.SetAttribute("rectangular", (activeArea.isRectangular() ? "yes" : "no"));
                aaElement.SetAttribute("x", activeArea.getX().ToString());
                aaElement.SetAttribute("y", activeArea.getY().ToString());
                aaElement.SetAttribute("width", activeArea.getWidth().ToString());
                aaElement.SetAttribute("height", activeArea.getHeight().ToString());
                if (activeArea.getInfluenceArea().isExists())
                {
                    aaElement.SetAttribute("hasInfluenceArea", "yes");
                    InfluenceArea ia = activeArea.getInfluenceArea();
                    aaElement.SetAttribute("influenceX", ia.getX().ToString());
                    aaElement.SetAttribute("influenceY", ia.getY().ToString());
                    aaElement.SetAttribute("influenceWidth", ia.getWidth().ToString());
                    aaElement.SetAttribute("influenceHeight", ia.getHeight().ToString());
                }
                else
                {
                    aaElement.SetAttribute("hasInfluenceArea", "no");
                }

                // Append the documentation (if avalaible)
                if (activeArea.getDocumentation() != null)
                {
                    XmlNode exitDocumentationNode = doc.CreateElement("documentation");
                    exitDocumentationNode.AppendChild(doc.CreateTextNode(activeArea.getDocumentation()));
                    aaElement.AppendChild(exitDocumentationNode);
                }

                // Append the conditions (if avalaible)
                if (!activeArea.getConditions().isEmpty())
                {
                    XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(activeArea.getConditions());
                    doc.ImportNode(conditionsNode, true);
                    aaElement.AppendChild(conditionsNode);
                }


                foreach (Description description in activeArea.getDescriptions())
                {
                    // Create the description
                    XmlNode descriptionNode = doc.CreateElement("description");

                    // Append the conditions (if available)
                    if (description.getConditions() != null && !description.getConditions().isEmpty())
                    {
                        XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(description.getConditions());
                        doc.ImportNode(conditionsNode, true);
                        descriptionNode.AppendChild(conditionsNode);
                    }

                    // Create and append the name, brief description and detailed description
                    XmlElement aaNameNode = doc.CreateElement("name");
                    if (description.getNameSoundPath() != null && !description.getNameSoundPath().Equals(""))
                    {
                        aaNameNode.SetAttribute("soundPath", description.getNameSoundPath());
                    }
                    aaNameNode.AppendChild(doc.CreateTextNode(description.getName()));
                    descriptionNode.AppendChild(aaNameNode);

                    XmlElement aaBriefNode = doc.CreateElement("brief");
                    if (description.getDescriptionSoundPath() != null &&
                        !description.getDescriptionSoundPath().Equals(""))
                    {
                        aaBriefNode.SetAttribute("soundPath", description.getDescriptionSoundPath());
                    }
                    aaBriefNode.AppendChild(doc.CreateTextNode(description.getDescription()));
                    descriptionNode.AppendChild(aaBriefNode);

                    XmlElement aaDetailedNode = doc.CreateElement("detailed");
                    if (description.getDetailedDescriptionSoundPath() != null &&
                        !description.getDetailedDescriptionSoundPath().Equals(""))
                    {
                        aaDetailedNode.SetAttribute("soundPath", description.getDetailedDescriptionSoundPath());
                    }
                    aaDetailedNode.AppendChild(doc.CreateTextNode(description.getDetailedDescription()));
                    descriptionNode.AppendChild(aaDetailedNode);

                    // Append the description
                    aaElement.AppendChild(descriptionNode);
                }

                // Append the actions (if there is at least one)
                if (activeArea.getActions().Count > 0)
                {
                    XmlNode actionsNode = ActionsDOMWriter.buildDOM(activeArea.getActions());
                    doc.ImportNode(actionsNode, true);

                    // Append the actions node
                    aaElement.AppendChild(actionsNode);
                }

                if (!activeArea.isRectangular())
                {
                    foreach (Vector2 point in activeArea.getPoints())
                    {
                        XmlElement pointNode = doc.CreateElement("point");
                        pointNode.SetAttribute("x", ((int)point.x).ToString());
                        pointNode.SetAttribute("y", ((int)point.y).ToString());
                        aaElement.AppendChild(pointNode);
                    }
                }

                // Append the exit
                aasElement.AppendChild(aaElement);
            }
            // Append the list of exits
            sceneElement.AppendChild(aasElement);
        }

        // Append the barriers (if there is at least one)
        if (scene.getBarriers().Count > 0)
        {
            XmlNode barriersElement = doc.CreateElement("barriers");

            // Append every single barrier
            foreach (Barrier barrier in scene.getBarriers())
            {
                // Create the active area element
                XmlElement barrierElement = doc.CreateElement("barrier");
                barrierElement.SetAttribute("x", barrier.getX().ToString());
                barrierElement.SetAttribute("y", barrier.getY().ToString());
                barrierElement.SetAttribute("width", barrier.getWidth().ToString());
                barrierElement.SetAttribute("height", barrier.getHeight().ToString());

                // Append the documentation (if avalaible)
                if (barrier.getDocumentation() != null)
                {
                    XmlNode exitDocumentationNode = doc.CreateElement("documentation");
                    exitDocumentationNode.AppendChild(doc.CreateTextNode(barrier.getDocumentation()));
                    barrierElement.AppendChild(exitDocumentationNode);
                }

                // Append the conditions (if avalaible)
                if (!barrier.getConditions().isEmpty())
                {
                    XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(barrier.getConditions());
                    doc.ImportNode(conditionsNode, true);
                    barrierElement.AppendChild(conditionsNode);
                }

                // Append the barrier
                barriersElement.AppendChild(barrierElement);
            }
            // Append the list of exits
            sceneElement.AppendChild(barriersElement);
        }

        // Add the atrezzo item references (if there is at least one)
        if (scene.getAtrezzoReferences().Count > 0)
        {
            XmlNode atrezzoNode = doc.CreateElement("atrezzo");

            // Append every single atrezzo reference
            foreach (ElementReference atrezzoReference in scene.getAtrezzoReferences())
            {
                // Create the atrezzo reference element
                XmlElement atrezzoReferenceElement = doc.CreateElement("atrezzo-ref");
                atrezzoReferenceElement.SetAttribute("idTarget", atrezzoReference.getTargetId());
                atrezzoReferenceElement.SetAttribute("x", atrezzoReference.getX().ToString());
                atrezzoReferenceElement.SetAttribute("y", atrezzoReference.getY().ToString());
                atrezzoReferenceElement.SetAttribute("scale", atrezzoReference.getScale().ToString());
                if (atrezzoReference.getLayer() != -1)
                {
                    atrezzoReferenceElement.SetAttribute("layer", atrezzoReference.getLayer().ToString());
                }

                // Append the documentation (if avalaible)
                if (atrezzoReference.getDocumentation() != null)
                {
                    XmlNode itemDocumentationNode = doc.CreateElement("documentation");
                    itemDocumentationNode.AppendChild(doc.CreateTextNode(atrezzoReference.getDocumentation()));
                    atrezzoReferenceElement.AppendChild(itemDocumentationNode);
                }

                // Append the conditions (if avalaible)
                if (!atrezzoReference.getConditions().isEmpty())
                {
                    XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(atrezzoReference.getConditions());
                    doc.ImportNode(conditionsNode, true);
                    atrezzoReferenceElement.AppendChild(conditionsNode);
                }

                // Append the atrezzo reference
                atrezzoNode.AppendChild(atrezzoReferenceElement);
            }
            // Append the list of atrezzo references
            sceneElement.AppendChild(atrezzoNode);
        }

        if (scene.getTrajectory() != null)
        {
            XmlNode trajectoryNode = TrajectoryDOMWriter.buildDOM(scene.getTrajectory());
            doc.ImportNode(trajectoryNode, true);
            sceneElement.AppendChild(trajectoryNode);
        }

        return(sceneElement);
    }
    /**
     * Returns the DOM element for the chapter
     *
     * @param chapter
     *            Chapter data to be written
     * @return DOM element with the chapter data
     */

    public static XmlElement buildDOM(AssessmentProfile profile, XmlDocument doc)
    {
        List <AssessmentRule> rules = profile.getRules();

        XmlElement assessmentNode = null;

        // Create the root node
        assessmentNode = doc.CreateElement("assessment");
        if (profile.isShowReportAtEnd())
        {
            assessmentNode.SetAttribute("show-report-at-end", "yes");
        }
        else
        {
            assessmentNode.SetAttribute("show-report-at-end", "no");
        }
        if (!profile.isShowReportAtEnd() || !profile.isSendByEmail())
        {
            assessmentNode.SetAttribute("send-to-email", "");
        }
        else
        {
            if (profile.getEmail() == null || !profile.getEmail().Contains("@"))
            {
                assessmentNode.SetAttribute("send-to-email", "");
            }
            else
            {
                assessmentNode.SetAttribute("send-to-email", profile.getEmail());
            }
        }
        // add scorm attributes
        if (profile.isScorm12())
        {
            assessmentNode.SetAttribute("scorm12", "yes");
        }
        else
        {
            assessmentNode.SetAttribute("scorm12", "no");
        }
        if (profile.isScorm2004())
        {
            assessmentNode.SetAttribute("scorm2004", "yes");
        }
        else
        {
            assessmentNode.SetAttribute("scorm2004", "no");
        }
        //add the profile's name
        assessmentNode.SetAttribute("name", profile.getName());

        XmlElement smtpConfigNode = doc.CreateElement("smtp-config");

        smtpConfigNode.SetAttribute("smtp-ssl", (profile.isSmtpSSL() ? "yes" : "no"));
        smtpConfigNode.SetAttribute("smtp-server", profile.getSmtpServer());
        smtpConfigNode.SetAttribute("smtp-port", profile.getSmtpPort());
        smtpConfigNode.SetAttribute("smtp-user", profile.getSmtpUser());
        smtpConfigNode.SetAttribute("smtp-pwd", profile.getSmtpPwd());

        assessmentNode.AppendChild(smtpConfigNode);

        // Append the assessment rules
        foreach (AssessmentRule rule in rules)
        {
            if (rule is TimedAssessmentRule)
            {
                TimedAssessmentRule tRule = (TimedAssessmentRule)rule;
                //Create the rule node and set attributes
                XmlElement ruleNode = doc.CreateElement("timed-assessment-rule");
                ruleNode.SetAttribute("id", tRule.getId());
                ruleNode.SetAttribute("importance", AssessmentRule.IMPORTANCE_VALUES[tRule.getImportance()]);
                ruleNode.SetAttribute("usesEndConditions", (tRule.isUsesEndConditions() ? "yes" : "no"));
                ruleNode.SetAttribute("repeatRule", (tRule.isRepeatRule() ? "yes" : "no"));

                //Append concept
                if (tRule.getConcept() != null && !tRule.getConcept().Equals(""))
                {
                    XmlNode conceptNode = doc.CreateElement("concept");
                    conceptNode.AppendChild(doc.CreateTextNode(tRule.getConcept()));
                    ruleNode.AppendChild(conceptNode);
                }

                //Append conditions (always required at least one)
                if (!tRule.getInitConditions().isEmpty())
                {
                    XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(ConditionsDOMWriter.INIT_CONDITIONS,
                                                                          tRule.getInitConditions());
                    doc.ImportNode(conditionsNode, true);
                    ruleNode.AppendChild(conditionsNode);
                }

                //Append conditions (always required at least one)
                if (!tRule.getEndConditions().isEmpty())
                {
                    XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(ConditionsDOMWriter.END_CONDITIONS,
                                                                          tRule.getEndConditions());
                    doc.ImportNode(conditionsNode, true);
                    ruleNode.AppendChild(conditionsNode);
                }

                // Create effects
                for (int i = 0; i < tRule.getEffectsCount(); i++)
                {
                    //Create effect element and append it
                    XmlElement effectNode = doc.CreateElement("assessEffect");

                    // Append time attributes
                    effectNode.SetAttribute("time-min", tRule.getMinTime(i).ToString());
                    effectNode.SetAttribute("time-max", tRule.getMaxTime(i).ToString());

                    //Append set-text when appropriate
                    TimedAssessmentEffect currentEffect = tRule.getEffects()[i];
                    if (currentEffect.getText() != null && !currentEffect.getText().Equals(""))
                    {
                        XmlNode textNode = doc.CreateElement("set-text");
                        textNode.AppendChild(doc.CreateTextNode(currentEffect.getText()));
                        effectNode.AppendChild(textNode);
                    }
                    //Append properties
                    foreach (AssessmentProperty property in currentEffect.getAssessmentProperties())
                    {
                        XmlElement propertyElement = doc.CreateElement("set-property");
                        propertyElement.SetAttribute("id", property.getId());
                        propertyElement.SetAttribute("value", property.getValue().ToString());
                        effectNode.AppendChild(propertyElement);
                    }
                    //Append the effect
                    ruleNode.AppendChild(effectNode);
                }

                //Append the rule
                assessmentNode.AppendChild(ruleNode);
            }
            else
            {
                //Create the rule node and set attributes
                XmlElement ruleNode = doc.CreateElement("assessment-rule");
                ruleNode.SetAttribute("id", rule.getId());
                ruleNode.SetAttribute("importance", AssessmentRule.IMPORTANCE_VALUES[rule.getImportance()]);
                ruleNode.SetAttribute("repeatRule", (rule.isRepeatRule() ? "yes" : "no"));

                //Append concept
                if (rule.getConcept() != null && !rule.getConcept().Equals(""))
                {
                    XmlNode conceptNode = doc.CreateElement("concept");
                    conceptNode.AppendChild(doc.CreateTextNode(rule.getConcept()));
                    ruleNode.AppendChild(conceptNode);
                }

                //Append conditions (always required at least one)
                if (!rule.getConditions().isEmpty())
                {
                    XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(rule.getConditions());
                    doc.ImportNode(conditionsNode, true);
                    ruleNode.AppendChild(conditionsNode);
                }

                //Create effect element and append it
                XmlNode effectNode = doc.CreateElement("assessEffect");
                //Append set-text when appropriate
                if (rule.getText() != null && !rule.getText().Equals(""))
                {
                    XmlNode textNode = doc.CreateElement("set-text");
                    textNode.AppendChild(doc.CreateTextNode(rule.getText()));
                    effectNode.AppendChild(textNode);
                }
                //Append properties
                foreach (AssessmentProperty property in rule.getAssessmentProperties())
                {
                    XmlElement propertyElement = doc.CreateElement("set-property");
                    propertyElement.SetAttribute("id", property.getId());
                    propertyElement.SetAttribute("value", property.getValue());
                    if (property.getVarName() != null)
                    {
                        propertyElement.SetAttribute("varName", property.getVarName());
                    }
                    effectNode.AppendChild(propertyElement);
                }
                //Append the effect
                ruleNode.AppendChild(effectNode);

                //Append the rule
                assessmentNode.AppendChild(ruleNode);
            }
        }

        return(assessmentNode);
    }
    /**
     * Recursive function responsible for transforming a node (and its children)
     * into a DOM structure
     *
     * @param currentNode
     *            Node to be transformed
     * @param rootDOMNode
     *            DOM node in which the elements must be attached
     */

    private static void writeNodeInDOM(ConversationNode currentNode, XmlNode rootDOMNode)
    {
        // Extract the document
        XmlDocument document = rootDOMNode.OwnerDocument;

        // If the node is a DialogueNode write the lines one after another, and then the child (or the mark if it is no
        // child)
        if (currentNode.getType() == ConversationNodeViewEnum.DIALOGUE)
        {
            // For each line of the node
            for (int i = 0; i < currentNode.getLineCount(); i++)
            {
                // Create a phrase element, and extract the actual text line
                XmlElement       phrase;
                XmlNode          conditionsNode = null;
                ConversationLine line           = currentNode.getLine(i);

                // If the line belongs to the player, create a "speak-player" element. Otherwise, if it belongs to a
                // NPC,
                // create a "speak-char" element, which will have an attribute "idTarget" with the name of the
                // non-playable character,
                // if there is no name the attribute won't be written
                if (line.isPlayerLine())
                {
                    phrase = document.CreateElement("speak-player");
                }
                else
                {
                    phrase = document.CreateElement("speak-char");
                    if (!line.getName().Equals("NPC"))
                    {
                        phrase.SetAttribute("idTarget", line.getName());
                    }
                }

                // Add the line text into the element
                phrase.InnerText = (line.getText());

                //If there is audio track, store it as attribute
                if (line.isValidAudio())
                {
                    phrase.SetAttribute("uri", line.getAudioPath());
                }
                //If there is a synthesizer valid voice, store it as attribute
                if (line.getSynthesizerVoice())
                {
                    phrase.SetAttribute("synthesize", "yes");
                }

                // Add the element to the DOM root
                rootDOMNode.AppendChild(phrase);

                // Create conditions for current effect
                conditionsNode = ConditionsDOMWriter.buildDOM(line.getConditions());
                document.ImportNode(conditionsNode, true);

                // Add conditions associated to that effect
                rootDOMNode.AppendChild(conditionsNode);
            }

            // Check if the node is terminal
            if (currentNode.isTerminal())
            {
                // If it is terminal add a "end-conversation" element
                XmlElement endConversation = document.CreateElement("end-conversation");

                // If the terminal node has an effect, include it into the DOM
                if (currentNode.hasEffects())
                {
                    // Extract the root node
                    XmlNode effect = EffectsDOMWriter.buildDOM(EffectsDOMWriter.EFFECTS, currentNode.getEffects());

                    // Insert it into the DOM
                    document.ImportNode(effect, true);
                    endConversation.AppendChild(effect);
                }

                // Add the "end-conversation" tag into the root
                rootDOMNode.AppendChild(endConversation);
            }
            else
            {
                // If the node isn't terminal, check if it performing a "go-back" (going back to the inmediatly upper
                // OptionNode)
                if (TreeConversation.thereIsGoBackTag(currentNode))
                {
                    // If it is the case, add a "go-back" element
                    rootDOMNode.AppendChild(document.CreateElement("go-back"));
                }
                else
                {
                    // Otherwise, if the node has a child, call the recursive function with the child node, and the same
                    // DOM root node
                    writeNodeInDOM(currentNode.getChild(0), rootDOMNode);
                }
            }
        }

        // If the node is a OptionNode write a "response" element, and inside it a "option" element with its content
        else if (currentNode.getType() == ConversationNodeViewEnum.OPTION)
        {
            // Create the "response" element
            XmlElement response = document.CreateElement("response");
            // Adds a random attribute if "random" is activate in conversation node data
            if (((OptionConversationNode)currentNode).isRandom())
            {
                response.SetAttribute("random", "yes");
            }
            // For each line of the node (we suppose the number of line equals the number of links, or children nodes)
            for (int i = 0; i < currentNode.getLineCount(); i++)
            {
                // Create the "option" element
                XmlElement       optionElement = document.CreateElement("option");
                ConversationLine line          = currentNode.getLine(i);
                // Create the actual option (a "speak-player" element) and add its respective text
                XmlElement lineElement = document.CreateElement("speak-player");
                lineElement.InnerText = currentNode.getLine(i).getText();

                //If there is audio track, store it as attribute
                if (line.isValidAudio())
                {
                    lineElement.SetAttribute("uri", line.getAudioPath());
                }
                //If there is a synthesizer valid voice, store it as attribute
                if (line.getSynthesizerVoice())
                {
                    lineElement.SetAttribute("synthesize", "yes");
                }

                // Insert the text line in the option node
                optionElement.AppendChild(lineElement);

                // Call the recursive function, to write in the "option" node the appropiate elements
                // Note that the root DOM node is the "option" element
                writeNodeInDOM(currentNode.getChild(i), optionElement);

                // Add the "option" element
                response.AppendChild(optionElement);
            }
            // If the terminal node has an effect, include it into the DOM
            if (currentNode.hasEffects())
            {
                // Extract the root node
                XmlNode effect = EffectsDOMWriter.buildDOM(EffectsDOMWriter.EFFECTS, currentNode.getEffects());

                // Insert it into the DOM
                document.ImportNode(effect, true);
                response.AppendChild(effect);
            }

            // Add the element
            rootDOMNode.AppendChild(response);
        }
    }
    private static XmlNode buildGraphConversationDOM(GraphConversation graphConversation)
    {
        XmlElement conversationElement = null;

        // Get the complete node list
        List <ConversationNode> nodes = graphConversation.getAllNodes();

        // Create the necessary elements to create the DOM
        XmlDocument doc = Writer.GetDoc();

        // Create the root node
        conversationElement = doc.CreateElement("graph-conversation");
        conversationElement.SetAttribute("id", graphConversation.getId());

        // For each node
        for (int i = 0; i < nodes.Count; i++)
        {
            ConversationNode node = nodes[i];

            XmlElement nodeElement    = null;
            XmlNode    conditionsNode = null;

            // If the node is a dialogue node
            if (node is DialogueConversationNode)
            {
                // Create the node element and set the nodeindex
                nodeElement = doc.CreateElement("dialogue-node");
                nodeElement.SetAttribute("nodeindex", i.ToString());
                // Adds a random attribute if "keepShowing" is activate in conversation node data
                if (((DialogueConversationNode)node).isKeepShowing())
                {
                    nodeElement.SetAttribute("keepShowing", "yes");
                }
                if (node.getEditorX() != -1)
                {
                    nodeElement.SetAttribute("editor-x", node.getEditorX().ToString());
                }
                if (node.getEditorY() != -1)
                {
                    nodeElement.SetAttribute("editor-y", node.getEditorY().ToString());
                }
                // For each line of the node
                for (int j = 0; j < node.getLineCount(); j++)
                {
                    // Create a phrase element, and extract the actual text line
                    XmlElement       phrase;
                    ConversationLine line = node.getLine(j);

                    // If the line belongs to the player, create a "speak-player" element. Otherwise, if it belongs
                    // to a NPC,
                    // create a "speak-char" element, which will have an attribute "idTarget" with the name of the
                    // non-playable character,
                    // if there is no name the attribute won't be written
                    if (line.isPlayerLine())
                    {
                        phrase = doc.CreateElement("speak-player");
                    }
                    else
                    {
                        phrase = doc.CreateElement("speak-char");
                        if (!line.getName().Equals("NPC"))
                        {
                            phrase.SetAttribute("idTarget", line.getName());
                        }
                    }

                    //If there is audio track, store it as attribute
                    if (line.isValidAudio())
                    {
                        phrase.SetAttribute("uri", line.getAudioPath());
                    }
                    //If there is a synthesizer valid voice, store it as attribute
                    if (line.getSynthesizerVoice())
                    {
                        phrase.SetAttribute("synthesize", "yes");
                    }

                    // Add the line text into the element
                    phrase.InnerText = (line.getText());

                    // Add the element to the node
                    nodeElement.AppendChild(phrase);

                    // Create conditions for current effect
                    conditionsNode = ConditionsDOMWriter.buildDOM(line.getConditions());
                    doc.ImportNode(conditionsNode, true);
                    // Add conditions associated to that effect
                    nodeElement.AppendChild(conditionsNode);
                }

                // Check if the node is terminal
                if (node.isTerminal())
                {
                    // If it is terminal add a "end-conversation" element
                    XmlElement endConversation = doc.CreateElement("end-conversation");

                    // If the terminal node has an effect, include it into the DOM
                    if (node.hasEffects())
                    {
                        // Extract the root node
                        XmlNode effect = EffectsDOMWriter.buildDOM(EffectsDOMWriter.EFFECTS, node.getEffects());

                        // Insert it into the DOM
                        doc.ImportNode(effect, true);
                        endConversation.AppendChild(effect);
                    }

                    // Add the "end-conversation" tag into the node
                    nodeElement.AppendChild(endConversation);
                }
                else
                {
                    // Otherwise, if the node has a child, add the element
                    XmlElement childElement = doc.CreateElement("child");

                    // Add the number of the child node (index of the node in the structure)
                    childElement.SetAttribute("nodeindex", nodes.IndexOf(node.getChild(0)).ToString());

                    // Insert the tag into the node
                    nodeElement.AppendChild(childElement);

                    // TODO MODIFIED
                    // If the terminal node has an effect, include it into the DOM
                    if (node.hasEffects())
                    {
                        // Extract the root node
                        XmlNode effect = EffectsDOMWriter.buildDOM(EffectsDOMWriter.EFFECTS, node.getEffects());

                        // Insert it into the DOM
                        doc.ImportNode(effect, true);
                        nodeElement.AppendChild(effect);
                    }
                }
            }

            // If the node is a option node
            if (node is OptionConversationNode)
            {
                // Create the node element and set the nodeindex
                nodeElement = doc.CreateElement("option-node");
                nodeElement.SetAttribute("nodeindex", i.ToString());
                // Adds a random attribute if "random" is activate in conversation node data
                if (((OptionConversationNode)node).isRandom())
                {
                    nodeElement.SetAttribute("random", "yes");
                }
                // Adds a random attribute if "keepShowing" is activate in conversation node data
                if (((OptionConversationNode)node).isKeepShowing())
                {
                    nodeElement.SetAttribute("keepShowing", "yes");
                }
                // Adds a random attribute if "showUserOption" is activate in conversation node data
                if (((OptionConversationNode)node).isShowUserOption())
                {
                    nodeElement.SetAttribute("showUserOption", "yes");
                }
                // Adds a random attribute if "preListening" is activate in conversation node data
                if (((OptionConversationNode)node).isPreListening())
                {
                    nodeElement.SetAttribute("preListening", "yes");
                }
                if (node.getEditorX() != -1)
                {
                    nodeElement.SetAttribute("editor-x", node.getEditorX().ToString());
                }
                if (node.getEditorY() != -1)
                {
                    nodeElement.SetAttribute("editor-y", node.getEditorY().ToString());
                }
                // Adds the x position of the options conversations node
                nodeElement.SetAttribute("x", ((OptionConversationNode)node).getX().ToString());
                // Adds a random attribute if "preListening" is activate in conversation node data
                nodeElement.SetAttribute("y", ((OptionConversationNode)node).getY().ToString());

                // For each line of the node
                for (int j = 0; j < node.getLineCount(); j++)
                {
                    // Take the current conversation line
                    ConversationLine line = node.getLine(j);

                    // Create the actual option (a "speak-player" element) and add its respective text
                    XmlElement lineElement = doc.CreateElement("speak-player");
                    lineElement.InnerText = (node.getLine(j).getText());

                    //If there is audio track, store it as attribute
                    if (line.isValidAudio())
                    {
                        lineElement.SetAttribute("uri", line.getAudioPath());
                    }
                    //If there is a synthesizer valid voice, store it as attribute
                    if (line.getSynthesizerVoice())
                    {
                        lineElement.SetAttribute("synthesize", "yes");
                    }

                    // Create conditions for current effect
                    conditionsNode = ConditionsDOMWriter.buildDOM(line.getConditions());
                    doc.ImportNode(conditionsNode, true);

                    // Create a child tag, and set it the index of the child
                    XmlElement childElement = doc.CreateElement("child");
                    childElement.SetAttribute("nodeindex", nodes.IndexOf(node.getChild(j)).ToString());

                    // Insert the text line in the option node
                    nodeElement.AppendChild(lineElement);
                    // Add conditions associated to that effect
                    nodeElement.AppendChild(conditionsNode);
                    // Insert child tag
                    nodeElement.AppendChild(childElement);
                }
                // If node has an effect, include it into the DOM
                if (node.hasEffects())
                {
                    // Extract the root node
                    XmlNode effect = EffectsDOMWriter.buildDOM(EffectsDOMWriter.EFFECTS, node.getEffects());

                    // Insert it into the DOM
                    doc.ImportNode(effect, true);
                    nodeElement.AppendChild(effect);
                }
            }

            // Add the node to the conversation
            conversationElement.AppendChild(nodeElement);
        }


        return(conversationElement);
    }
Ejemplo n.º 11
0
    public static XmlNode buildDOM(Item item)
    {
        XmlElement itemElement = null;


        // Create the necessary elements to create the DOM
        XmlDocument doc = Writer.GetDoc();

        // Create the root node
        itemElement = doc.CreateElement("object");
        itemElement.SetAttribute("id", item.getId());
        itemElement.SetAttribute("returnsWhenDragged", (item.isReturnsWhenDragged() ? "yes" : "no"));

        //v1.4
        if (item.getBehaviour() == Item.BehaviourType.NORMAL)
        {
            itemElement.SetAttribute("behaviour", "normal");
        }
        if (item.getBehaviour() == Item.BehaviourType.ATREZZO)
        {
            itemElement.SetAttribute("behaviour", "atrezzo");
        }
        if (item.getBehaviour() == Item.BehaviourType.FIRST_ACTION)
        {
            itemElement.SetAttribute("behaviour", "first-action");
        }
        itemElement.SetAttribute("resources-transition-time", item.getResourcesTransitionTime().ToString());
        //v1.4

        // Append the documentation (if avalaible)
        if (item.getDocumentation() != null)
        {
            XmlNode itemDocumentationNode = doc.CreateElement("documentation");
            itemDocumentationNode.AppendChild(doc.CreateTextNode(item.getDocumentation()));
            itemElement.AppendChild(itemDocumentationNode);
        }

        // Append the resources
        foreach (ResourcesUni resources in item.getResources())
        {
            XmlNode resourcesNode = ResourcesDOMWriter.buildDOM(resources, ResourcesDOMWriter.RESOURCES_ITEM);
            doc.ImportNode(resourcesNode, true);
            itemElement.AppendChild(resourcesNode);
        }

        foreach (Description description in item.getDescriptions())
        {
            // Create the description
            XmlNode descriptionNode = doc.CreateElement("description");

            // Append the conditions (if available)
            if (description.getConditions() != null && !description.getConditions().isEmpty())
            {
                XmlNode conditionsNode = ConditionsDOMWriter.buildDOM(description.getConditions());
                doc.ImportNode(conditionsNode, true);
                descriptionNode.AppendChild(conditionsNode);
            }

            // Create and append the name, brief description and detailed description and its soundPaths
            XmlElement nameNode = doc.CreateElement("name");

            if (description.getNameSoundPath() != null && !description.getNameSoundPath().Equals(""))
            {
                nameNode.SetAttribute("soundPath", description.getNameSoundPath());
            }
            nameNode.AppendChild(doc.CreateTextNode(description.getName()));
            descriptionNode.AppendChild(nameNode);

            XmlElement briefNode = doc.CreateElement("brief");
            if (description.getDescriptionSoundPath() != null && !description.getDescriptionSoundPath().Equals(""))
            {
                briefNode.SetAttribute("soundPath", description.getDescriptionSoundPath());
            }
            briefNode.AppendChild(doc.CreateTextNode(description.getDescription()));
            descriptionNode.AppendChild(briefNode);

            XmlElement detailedNode = doc.CreateElement("detailed");
            if (description.getDetailedDescriptionSoundPath() != null &&
                !description.getDetailedDescriptionSoundPath().Equals(""))
            {
                detailedNode.SetAttribute("soundPath", description.getDetailedDescriptionSoundPath());
            }
            detailedNode.AppendChild(doc.CreateTextNode(description.getDetailedDescription()));
            descriptionNode.AppendChild(detailedNode);

            // Append the description
            itemElement.AppendChild(descriptionNode);
        }

        // Append the actions (if there is at least one)
        if (item.getActions().Count > 0)
        {
            // Create the actions node
            XmlNode actionsNode = ActionsDOMWriter.buildDOM(item.getActions());
            doc.ImportNode(actionsNode, true);
            // Append the actions node
            itemElement.AppendChild(actionsNode);
        }



        return(itemElement);
    }