/// <summary> /// クエストエントリーを追加する /// </summary> /// <param name="nodeEntry">クエストエントリー</param> /// <returns>追加に成功した場合は true</returns> public bool AddFlatNodeEntry(MieQuestsNodeEntry 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); } } return(true); } }
/// <summary> /// 番兵用ノードを作成する。 /// 番兵なのでToNodeは存在させない。 /// </summary> /// <param name="nodeID">番兵用ノードのNodeID</param> /// <param name="fromID">番兵用ノードのToID</param> /// <returns>番兵用ノード</returns> public static MieQuestsNodeEntry CreateStopNode(int nodeID, int fromID) { MieQuestsNodeEntry node = new MieQuestsNodeEntry( NNodeType.Unknown, nodeID, false); node.Attribute = NNodeAttribute.StopNode; node.AddFromNodeID(fromID); return(node); }
/// <summary> /// クエストリンクエントリーを追加する。追加に成功した場合は true を返す。 /// </summary> /// <param name="nodeEntry">クエストリンクエントリー</param> /// <returns>追加の成否</returns> public bool AddNodeEntry(MieQuestsNodeEntry nodeEntry) { if (this.Nodes.ContainsKey(nodeEntry.NodeID)) { //// このノードはすでに登録済みのためスキップ return(false); } else { this.Nodes.Add(nodeEntry.NodeID, nodeEntry); return(true); } }
/// <summary> /// ノードのリンク情報を構築する。 /// </summary> public void BuildLink() { HashSet <int> flatTo = new HashSet <int>(); foreach (var link in this.Links) { var fromNode = this.GetNode(link.FromeNode); //// ルートノードを登録 if (fromNode.IsRootNode) { if (this.NodeEntry.GetNode(fromNode.NodeID) != null) { //// すでに登録済み:無視。 } else { if (this.NodeEntry == null) { this.NodeEntry = fromNode; } } } //// 子ノードを登録 var toNode = this.GetNode(link.ToNode); //// リンクの無限循環を防止するため、すでにリンク先が登録されていた場合は、リンクを追加しない。 if (flatTo.Add(link.ToNode)) { //// 未登録 fromNode.AddNodeEntry(toNode); } else { //// すでに登録済みの場合は番兵ノードを追加する。 var stopNode = MieQuestsNodeEntry.CreateStopNode(link.ToNode, link.FromeNode); stopNode.AddFromNodeID(link.FromeNode); fromNode.AddNodeEntry(stopNode); } toNode.AddFromNodeID(link.FromeNode); } }