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 AddConsequenceNode() { int id = this.IDCount++; HamTimelineNode node = new HamConsequenceNode(id); this.Nodes[id] = node; this.NodeLinkageDirty = true; return node; }
private void OperationEditing(HamConsequenceNode node, int index) { HamOperation oper = node.Operations[index]; GUILayout.BeginVertical(Style("box")); // Variable Selection / Creation if (GUILayout.Button((oper.VariableID == HamTimeline.InvalidID) ? "---" : this.activeTimeline.Variables[oper.VariableID].Name)) { GenericMenu menu = new GenericMenu(); foreach (HamTimelineVariable v in this.activeTimeline.Variables.Values) { menu.AddItem( new GUIContent(v.Name), (v.ID == oper.VariableID), (userData) => { oper.SetVariable(this.activeTimeline, (int)userData); }, v.ID ); } for (int i = 0; i < (int)VariableType.NumTypes; ++i) { VariableType varType = (VariableType)i; string varLabel = varType.ToString(); menu.AddItem( new GUIContent("Add New " + varLabel + " Variable"), false, () => { ModalTextWindow.Popup("New " + varLabel + " Name", (name) => { HamTimelineVariable newVar = this.activeTimeline.AddVariable(name, varType); oper.SetVariable(this.activeTimeline, newVar.ID); }); } ); } menu.ShowAsContext(); } // Operation Selection if (GUILayout.Button(oper.Operator.ToString())) { GenericMenu menu = new GenericMenu(); for (int i = 0; i < (int)VariableOperation.NumOperations; ++i) { int thisIndex = i; menu.AddItem( new GUIContent(((VariableOperation)i).ToString()), (VariableOperation)i == oper.Operator, (userData) => { oper.Operator = (VariableOperation)userData; }, thisIndex ); } menu.ShowAsContext(); } // Value Setting if (oper.VariableID != HamTimeline.InvalidID) { VariableValueField(oper.Operand); } GUILayout.EndVertical(); }
private void ConsequenceNodeEditing(HamConsequenceNode node) { GUILayout.Label("Consequence Node", Style("SubTitle")); GUILayout.BeginVertical(); for (int i = 0; i < node.Operations.Count; ++i) { OperationEditing(node, i); } GUILayout.BeginHorizontal(Style("box")); if (GUILayout.Button("Add Operation", Style("FlexButton"))) { node.AddOperation(); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); }
private void RenderConsequenceNode(Vector2 nodePosition, Vector2 offset, HamConsequenceNode node) { // Node title GUILayout.BeginVertical(); GUILayout.BeginHorizontal(Style("ConsequenceNode")); GUILayout.Label("(" + node.ID + ") Consequence"); GUILayout.EndHorizontal(); // Operations area GUILayout.BeginHorizontal(Style("GenericNode"), GUILayout.ExpandHeight(true)); for (int i = 0; i < node.Operations.Count; ++i) { GUILayout.Label(node.Operations[i].Label(this.activeTimeline)); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); if (node.NextNodeID != HamTimeline.InvalidID) { #if LINKAGE_DEBUG Debug.Log("Node " + node.ID + " transitions to " + node.NextNodeID); #endif HamTimelineNode nextNode = this.activeTimeline.Nodes[node.NextNodeID]; Vector2 nextNodePosition = GetOverviewPosition(nextNode); Vector2 outputPosition = nodePosition + offset + new Vector2(0f, kNodeSizeY / 2f); Vector2 inputPosition = nextNodePosition + offset - new Vector2(0f, kNodeSizeY / 2f); Color connectionColor = Color.white; if (this.selection.NodeSelected(node.ID)) { connectionColor = Color.green; } else if (this.selection.NodeSelected(node.NextNodeID)) { connectionColor = Color.red; } this.connections.Add(new NodeConnection(outputPosition, inputPosition, connectionColor)); } 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, 0); } } }