public void parseDialogueFromXML()
    {
        /* Each line in set are linked sequentically, and may be condiationally linked
         * to any line in any set within actors context. Thus we need to double check linking
         * on lines already parsed and lines not yet parsed to link to both directions */

        bool      firstLine = true;                           // ensures that set starting line is not linked to last line of other set
        ArrayList allLines  = new ArrayList();                // needed for backward linking
        ArrayList conditionalUnlinkedLines = new ArrayList(); // needed for forward linking

        XmlDocument xmlDoc = new XmlDocument();

        xmlDoc.Load("dialogue.xml");          // Peliprojekti/dialogue.xml

        XmlNodeList actors = xmlDoc.GetElementsByTagName("actor");

        foreach (XmlNode actor in actors)
        {
            actorCount++;
            dialogueCount++;

            string        actorName     = actor.Attributes["name"].Value;
            ActorDialogue actorDialogue = new ActorDialogue(actorName);

            XmlNodeList dialogueSetNodes = actor.ChildNodes;
            foreach (XmlNode dialogueSetNode in dialogueSetNodes)             // Actor's all sets
            {
                setCount++;

                firstLine = true;                 // new set started, thus first processed line is marked a first line, set to false in the end

                int         setId       = int.Parse(dialogueSetNode.Attributes["setId"].Value);
                DialogueSet dialogueSet = new DialogueSet(setId);

                XmlNodeList  dialogueLineNodes = dialogueSetNode.ChildNodes;
                DialogueLine previousLine      = null;                  // for sequential linking
                foreach (XmlNode dialogueLineNode in dialogueLineNodes) // Set's all lines
                {
                    lineCount++;

                    int    lineId = int.Parse(dialogueLineNode.Attributes["id"].Value);
                    string text   = dialogueLineNode.InnerText;

                    DialogueLine dialogueLine = new DialogueLine(text, lineId);
                    dialogueLine.setSetId(dialogueSet.getId());                     // line must know it's set for backward linking
                    allLines.Add(dialogueLine);

                    // Linking sequently lines
                    if (previousLine != null && !firstLine)                     // Don't link to previous set
                    {
                        previousLine.setNextLine(dialogueLine);
                    }

                    // look for branching token
                    if (dialogueLineNode.Attributes["branchInfo"] != null)
                    {
                        dialogueLine.setChoice(true);

                        // parse branch info
                        string   branchInfo   = dialogueLineNode.Attributes["branchInfo"].Value;
                        char[]   delimiter    = { '/' };
                        string[] values       = branchInfo.Split(delimiter);
                        int      branchSetId  = int.Parse(values[0]);
                        int      branchLineId = int.Parse(values[1]);

                        if (branchSetId > dialogueSet.getId() || branchLineId > dialogueLine.getId())
                        {
                            // Prepare for forward linking
                            dialogueLine.setBranchLinkingInfo(branchInfo);
                            conditionalUnlinkedLines.Add(dialogueLine);
                        }

                        else
                        {
                            // Perform backward linking
                            foreach (DialogueLine oldLine in allLines)
                            {
                                if (oldLine.getSetId() == branchSetId && dialogueLine.getId() == branchLineId)
                                {
                                    dialogueLine.setAltLine(oldLine);
                                    break;
                                }
                            }
                        }
                    }

                    // Try to forward link pending lines on this line

                    DialogueLine toRemove = null;                     // Remove linked conditionalLine from pending list AFTER iteration to avoid problems
                    foreach (DialogueLine conditionalLine in conditionalUnlinkedLines)
                    {
                        int branchLineId = conditionalLine.getBranchLineId();
                        int branchSetId  = conditionalLine.getBranchSetId();

                        if (branchLineId == dialogueLine.getId() &&
                            branchSetId == dialogueSet.getId())
                        {
                            conditionalLine.setAltLine(dialogueLine);
                            toRemove = conditionalLine;
                        }
                    }

                    // toRemove was linked, remove from forward linking list
                    if (toRemove != null)
                    {
                        conditionalUnlinkedLines.Remove(toRemove);                         // Iteration done, safe to remove
                    }
                    /// ---------------------------------------------------------------

                    previousLine = dialogueLine;
                    dialogueSet.addDialogueLine(dialogueLine);
                    firstLine = false;                     // new lines may be coming in same set, they are not first line
                    //print ("LINE ADDED");
                }

                actorDialogue.addDialogueSet(dialogueSet);
                //print ("SET ADDED");
            }

            //print ("DIALOGUE TO BE ADDED");
            dialogue.Add(actorDialogue.getActorName(), actorDialogue);
            //print ("DIALOGUE ADDED");
        }
    }