/// <summary> /// A tree has found to be a candidate for substitution. Apply logic. /// </summary> /// <param name="builder">Tree builder class</param> /// <param name="characterName">name of the character evolding</param> /// <param name="action">action that triggered evolution</param> /// <param name="decisionTreeToChange">Decision Tree To evolve</param> /// <returns></returns> public bool SubstituteNode(ITreeBuilder builder, string characterName, RNPC.Core.Action.Action action, string decisionTreeToChange) { var initialAction = ((Reaction)action).InitialEvent as RNPC.Core.Action.Action; if (initialAction == null) { return(false); } var substitution = _substitutionMapper.GetSubstitutableSubTreeForLeaf(action.EventName); if (substitution == null) { return(false); } var firstNode = builder.BuildTreeFromDocument(_fileController, initialAction, characterName); if (firstNode == null) { return(false); } var replacementNode = builder.BuildSubTreeFromRepository(_fileController, substitution.SubTreeName, ConfigurationDirectory.Instance.SubTreeRepository); if (replacementNode == null) { return(false); } if (!FindAndReplaceMatchingNode(firstNode, substitution, replacementNode)) { return(false); } string fileName = initialAction.ActionType + "-" + initialAction.Intent + "-" + initialAction.EventName; builder.BuildAndSaveXmlDocumentFromTree(_fileController, firstNode, fileName, characterName); return(true); }