public static void PlayConversation(string id) { if (xmld == null) { Init(); } string query = string.Format("//*[@id='{0}']", id); XmlElement conv = (XmlElement)xmld.SelectSingleNode(query); XmlNodeList nodes = conv.SelectNodes("*"); Conversation convModel = new Conversation(); convModel.nodes = new Node[nodes.Count]; for (int i = 0; i < nodes.Count; ++i) { XmlNode node = nodes[i]; string name = node.Name; Node nodeModel = null; if (name == "dialogue-node") { DialogNode dialogNodeModel = new DialogNode(); XmlNodeList dialogSpeaks = node.SelectNodes("*"); dialogNodeModel.speaks = new Speak[node.SelectNodes("speak-player").Count + node.SelectNodes("speak-char").Count]; int z = 0; for (int j = 0; j < dialogSpeaks.Count; ++j) { XmlNode speakNode = dialogSpeaks[j]; string speakName = speakNode.Name; if (speakName == "speak-player") { Speak speakModel = new Speak(); speakModel.text = speakNode.InnerText; dialogNodeModel.speaks[z] = speakModel; ++z; } else if (speakName == "speak-char") { Speak speakModel = new Speak(); speakModel.text = speakNode.InnerText; speakModel.isPhone = true; dialogNodeModel.speaks[z] = speakModel; ++z; } else if (speakName == "condition") { Condition conditionModel = new Condition(); XmlNodeList activesList = speakNode.SelectNodes("active"); conditionModel.actives = new string[activesList.Count]; for (int y = 0; y < activesList.Count; y++) { conditionModel.actives[y] = activesList[y].Attributes["flag"].Value; } XmlNodeList inactivesList = speakNode.SelectNodes("inactive"); conditionModel.inactives = new string[inactivesList.Count]; for (int y = 0; y < inactivesList.Count; y++) { conditionModel.inactives[y] = inactivesList[y].Attributes["flag"].Value; } dialogNodeModel.speaks[z - 1].condition = conditionModel; } else if (speakName == "child") { dialogNodeModel.nextIndex = Utils.IntParseFast(speakNode.Attributes["nodeindex"].Value); } else if (speakName == "end-conversation") { XmlNode effect = speakNode.SelectSingleNode("effect"); if (effect != null) { XmlNodeList effectsList = effect.SelectNodes("*"); dialogNodeModel.effects = new EndConvEffect[ effectsList.Count - effect.SelectNodes("condition").Count]; int m = 0; for (int x = 0; x < effectsList.Count; ++x) { XmlNode effectNode = effectsList[x]; string effectNodeName = effectNode.Name; if (effectNodeName == "activate") { ActivateFlagEffect activateFlageffect = new ActivateFlagEffect(); activateFlageffect.flag = effectNode.Attributes["flag"].Value; dialogNodeModel.effects[m] = activateFlageffect; ++m; } else if (effectNodeName == "deactivate") { DeactivateFlagEffect deactivateFlageffect = new DeactivateFlagEffect(); deactivateFlageffect.flag = effectNode.Attributes["flag"].Value; dialogNodeModel.effects[m] = deactivateFlageffect; ++m; } else if (effectNodeName == "increment") { IncrementFlagEffect eff = new IncrementFlagEffect(); eff.val = Utils.IntParseFast( effectNode.Attributes["value"].Value); eff.var = effectNode.Attributes["var"].Value; dialogNodeModel.effects[m] = eff; ++m; } else if (effectNodeName == "decrement") { DecrementFlagEffect eff = new DecrementFlagEffect(); eff.val = Utils.IntParseFast( effectNode.Attributes["value"].Value); eff.var = effectNode.Attributes["var"].Value; dialogNodeModel.effects[m] = eff; ++m; } else if (effectNodeName == "trigger-conversation") { TriggerConvEffect eff = new TriggerConvEffect(); eff.idTarget = effectNode.Attributes["idTarget"].Value; dialogNodeModel.effects[m] = eff; ++m; } else if (effectNodeName == "trigger-scene") { TriggerSceneEffect eff = new TriggerSceneEffect(); eff.idTarget = effectNode.Attributes["idTarget"].Value; dialogNodeModel.effects[m] = eff; ++m; } else if (effectNodeName == "trigger-cutscene") { TriggerCutSceneEffect eff = new TriggerCutSceneEffect(); eff.idTarget = effectNode.Attributes["idTarget"].Value; dialogNodeModel.effects[m] = eff; ++m; } else if (effectNodeName == "condition") { Condition conditionModel = new Condition(); XmlNodeList activesList = effectNode.SelectNodes("active"); conditionModel.actives = new string[activesList.Count]; for (int y = 0; y < activesList.Count; y++) { conditionModel.actives[y] = activesList[y].Attributes["flag"].Value; } XmlNodeList inactivesList = effectNode.SelectNodes("inactive"); conditionModel.inactives = new string[inactivesList.Count]; for (int y = 0; y < inactivesList.Count; y++) { conditionModel.inactives[y] = inactivesList[y].Attributes["flag"].Value; } dialogNodeModel.effects[m - 1].condition = conditionModel; } } } } else if (speakName == "effect") { XmlNodeList effectsList = speakNode.SelectNodes("*"); dialogNodeModel.effects = new EndConvEffect[ effectsList.Count - speakNode.SelectNodes("condition").Count]; int m = 0; for (int x = 0; x < effectsList.Count; ++x) { XmlNode effectNode = effectsList[x]; string effectNodeName = effectNode.Name; if (effectNodeName == "activate") { ActivateFlagEffect activateFlageffect = new ActivateFlagEffect(); activateFlageffect.flag = effectNode.Attributes["flag"].Value; dialogNodeModel.effects[m] = activateFlageffect; ++m; } else if (effectNodeName == "deactivate") { DeactivateFlagEffect deactivateFlageffect = new DeactivateFlagEffect(); deactivateFlageffect.flag = effectNode.Attributes["flag"].Value; dialogNodeModel.effects[m] = deactivateFlageffect; ++m; } else if (effectNodeName == "increment") { IncrementFlagEffect eff = new IncrementFlagEffect(); eff.val = Utils.IntParseFast( effectNode.Attributes["value"].Value); eff.var = effectNode.Attributes["var"].Value; dialogNodeModel.effects[m] = eff; ++m; } else if (effectNodeName == "decrement") { DecrementFlagEffect eff = new DecrementFlagEffect(); eff.val = Utils.IntParseFast( effectNode.Attributes["value"].Value); eff.var = effectNode.Attributes["var"].Value; dialogNodeModel.effects[m] = eff; ++m; } else if (effectNodeName == "trigger-conversation") { TriggerConvEffect eff = new TriggerConvEffect(); eff.idTarget = effectNode.Attributes["idTarget"].Value; dialogNodeModel.effects[m] = eff; ++m; } else if (effectNodeName == "trigger-scene") { TriggerSceneEffect eff = new TriggerSceneEffect(); eff.idTarget = effectNode.Attributes["idTarget"].Value; dialogNodeModel.effects[m] = eff; ++m; } else if (effectNodeName == "trigger-cutscene") { TriggerCutSceneEffect eff = new TriggerCutSceneEffect(); eff.idTarget = effectNode.Attributes["idTarget"].Value; dialogNodeModel.effects[m] = eff; ++m; } else if (effectNodeName == "condition") { Condition conditionModel = new Condition(); XmlNodeList activesList = effectNode.SelectNodes("active"); conditionModel.actives = new string[activesList.Count]; for (int y = 0; y < activesList.Count; y++) { conditionModel.actives[y] = activesList[y].Attributes["flag"].Value; } XmlNodeList inactivesList = effectNode.SelectNodes("inactive"); conditionModel.inactives = new string[inactivesList.Count]; for (int y = 0; y < inactivesList.Count; y++) { conditionModel.inactives[y] = inactivesList[y].Attributes["flag"].Value; } dialogNodeModel.effects[m - 1].condition = conditionModel; } } } } nodeModel = dialogNodeModel; } else if (name == "option-node") { OptionNode optionNodeModel = new OptionNode(); XmlAttribute randomAttr = node.Attributes["random"]; if (randomAttr != null && randomAttr.Value == "yes") { optionNodeModel.isRandom = true; } XmlNodeList optionSpeaks = node.SelectNodes("*"); optionNodeModel.options = new Option[node.SelectNodes("speak-player").Count]; int z = 0; for (int j = 0; j < optionSpeaks.Count; ++j) { XmlNode optionNode = optionSpeaks[j]; string optionName = optionNode.Name; if (optionName == "speak-player") { Option speakModel = new Option(); speakModel.text = optionNode.InnerText; optionNodeModel.options[z] = speakModel; ++z; } else if (optionName == "condition") { Condition conditionModel = new Condition(); XmlNodeList activesList = optionNode.SelectNodes("active"); conditionModel.actives = new string[activesList.Count]; for (int y = 0; y < activesList.Count; y++) { conditionModel.actives[y] = activesList[y].Attributes["flag"].Value; } XmlNodeList inactivesList = optionNode.SelectNodes("inactive"); conditionModel.inactives = new string[inactivesList.Count]; for (int y = 0; y < inactivesList.Count; y++) { conditionModel.inactives[y] = inactivesList[y].Attributes["flag"].Value; } optionNodeModel.options[z - 1].condition = conditionModel; } else if (optionName == "child") { optionNodeModel.options[z - 1].nextIndex = Utils.IntParseFast(optionNode.Attributes["nodeindex"].Value); } } nodeModel = optionNodeModel; } convModel.nodes[i] = nodeModel; } convModel.exec(); }