/// <summary> /// 会話エントリーを追加する /// </summary> /// <param name="nodeEntry">会話リンクエントリー</param> /// <returns>追加に成功した場合は true</returns> public bool AddFlatNodeEntry(MieConversationNodeEntry nodeEntry) { if (this.FlatNodes.ContainsKey(nodeEntry.NodeID)) { //// このノードはすでに登録済み。 return(false); } else { //// FlatNodeに追加する。 this.FlatNodes.Add(nodeEntry.NodeID, nodeEntry); //// ルートノードを抽出 if (nodeEntry.IsRootNode) { if (this.NodeEntry == null) { this.NodeEntry = nodeEntry; } else { var msg = $"Duplicate root node({nodeEntry.NodeID})."; logger.Error(msg); throw new Exception(msg); } } return(true); } }
/// <summary> /// ノードのリンク情報を構築する。 /// 1.各ノードに FronID と ToID を設定する。 /// 2.登録済みリンクノードは無限循環防止のためStopNodeに差し替える。 /// </summary> public void BuildLink() { HashSet <int> flatTo = new HashSet <int>(); this.Links .OrderBy(link => link.FromeNode) .ThenBy(link => link.ToNode) .ToList() .ForEach(link => { var fromNode = this.GetNode(link.FromeNode); var toNode = this.GetNode(link.ToNode); //// 親ノードに子ノードを登録 if (flatTo.Add(link.ToNode)) { //// 未登録の子ノードは追加する。 fromNode.AddNodeEntry(toNode); } else { //// 登録済みの子ノードは追加せず、StopNode(番兵ノード)に差し替える。 //// (リンクの無限循環を防止するため) var stopNode = MieConversationNodeEntry.CreateStopNode(link.ToNode, link.FromeNode); stopNode.AddFromNodeID(link.FromeNode); fromNode.AddNodeEntry(stopNode); } //// 子ノードに親ノードを設定する。 toNode.AddFromNodeID(link.FromeNode); }); }
/// <summary> /// 会話リンクエントリーを追加する。追加に成功した場合は true を返す。 /// </summary> /// <param name="nodeEntry">会話リンクエントリー</param> /// <returns>追加の成否</returns> public bool AddNodeEntry(MieConversationNodeEntry nodeEntry) { if (this.Nodes.ContainsKey(nodeEntry.NodeID)) { //// このノードはすでに登録済みのためスキップ return(false); } else { this.Nodes.Add(nodeEntry.NodeID, nodeEntry); return(true); } }
/// <summary> /// 番兵用ノードを作成する。 /// 番兵なのでToNodeは存在させない。 /// </summary> /// <param name="nodeID">番兵用ノードのNodeID</param> /// <param name="fromID">番兵用ノードのToID</param> /// <returns>番兵用ノード</returns> public static MieConversationNodeEntry CreateStopNode(int nodeID, int fromID) { MieConversationNodeEntry node = new MieConversationNodeEntry( NNodeType.Unknown, nodeID, default(Guid), default(Guid), false, false); //// 番兵を設定 node.Attribute = NNodeAttribute.StopNode; node.AddFromNodeID(fromID); return(node); }