public static void Unpack(out HamTimelineNode node, DataUnpacker unpacker) { byte typeByte; unpacker.Unpack(out typeByte); TimelineNodeType type = (TimelineNodeType)typeByte; int id; unpacker.Unpack(out id); int numPrevIDs; unpacker.Unpack(out numPrevIDs); List<int> previousNodeIDs = new List<int>(); for (int i = 0; i < numPrevIDs; ++i) { int prevID; unpacker.Unpack(out prevID); previousNodeIDs.Add(prevID); } switch (type) { case TimelineNodeType.Dialog: node = new HamDialogNode(); break; case TimelineNodeType.Branch: node = new HamBranchNode(); break; case TimelineNodeType.Decision: node = new HamDecisionNode(); break; case TimelineNodeType.Consequence: node = new HamConsequenceNode(); break; default: node = null; return; } node.ID = id; node.Type = type; node.PreviousNodeIDs = previousNodeIDs; node.Unpack(unpacker); }
public HamTimelineNode AddDecisionNode() { int id = this.IDCount++; HamTimelineNode node = new HamDecisionNode(id); this.Nodes[id] = node; this.NodeLinkageDirty = true; return node; }
private void RenderDecisionNode(Vector2 nodePosition, Vector2 offset, HamDecisionNode node) { // Determine dimensions of various components float decisionChunkSize = kNodeSizeX / node.Decisions.Count; Vector2 ulCorner = new Vector2( nodePosition.x + offset.x - kNodeSizeX / 2f, nodePosition.y + offset.y - kNodeSizeY / 2f ); float yMax = ulCorner.y + kNodeSizeY; // Node title GUILayout.BeginHorizontal(Style("DecisionNode")); GUILayout.Label("(" + node.ID + ") Decision"); GUILayout.EndHorizontal(); if (GUI.Button(GUILayoutUtility.GetLastRect(), GUIContent.none, Style("InvisibleButton"))) { if (Event.current.button == 0) { this.selection.ClickedNode(this.activeTimeline, node); } else if (Event.current.button == 1) { RightClickNodeContext(node, -1); } } // Decision area GUILayout.BeginHorizontal(); for (int i = 0; i < node.Decisions.Count; ++i) { float decisionX = ulCorner.x + (decisionChunkSize * i); HamDecisionNode.Decision d = node.Decisions[i]; GUILayout.BeginVertical(Style("GenericNode"), GUILayout.ExpandHeight(true), GUILayout.MaxWidth(decisionChunkSize)); GUILayout.Label(d.IsDialog ? String.Format("\"{0}\"", d.DecisionText) : d.DecisionText); GUILayout.EndVertical(); if (GUI.Button(GUILayoutUtility.GetLastRect(), GUIContent.none, Style("InvisibleButton"))) { if (Event.current.button == 0) { this.selection.ClickedNode(this.activeTimeline, node); } else if (Event.current.button == 1) { RightClickNodeContext(node, i); } } if (d.NextNodeID != HamTimeline.InvalidID) { #if LINKAGE_DEBUG Debug.Log("Node " + node.ID + " transitions to " + d.NextNodeID); #endif HamTimelineNode nextNode = this.activeTimeline.Nodes[d.NextNodeID]; Vector2 nextNodePosition = GetOverviewPosition(nextNode); Vector2 inputPosition = nextNodePosition + offset - new Vector2(0f, kNodeSizeY / 2f); Vector2 outputPosition = new Vector2(decisionX + (decisionChunkSize / 2f), yMax); Color connectionColor = Color.white; if (this.selection.NodeSelected(node.ID)) { connectionColor = Color.green; } else if (this.selection.NodeSelected(d.NextNodeID)) { connectionColor = Color.red; } this.connections.Add(new NodeConnection(outputPosition, inputPosition, connectionColor)); } } GUILayout.EndHorizontal(); }
private void DecisionEditing(HamDecisionNode node, int i) { HamDecisionNode.Decision d = node.Decisions[i]; GUILayout.BeginVertical(); GUILayout.BeginVertical(Style("box")); GUILayout.Label("Decision Text"); d.DecisionText = GUILayout.TextField(d.DecisionText); d.IsDialog = GUILayout.Toggle(d.IsDialog, "Is Dialog"); GUILayout.EndVertical(); GUILayout.EndVertical(); }
private void DecisionNodeEditing(HamDecisionNode node) { GUILayout.Label("Decision Node", Style("SubTitle")); GUILayout.BeginVertical(); for (int i = 0; i < node.Decisions.Count; ++i) { DecisionEditing(node, i); } GUILayout.BeginHorizontal(Style("box")); if (GUILayout.Button("Add Decision", Style("FlexButton"))) { node.AddDecision("New Decision", false); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); }
public void AddChoice(int id, HamDecisionNode.Decision decision) { this.Choices[id] = decision; }