Пример #1
0
	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);
	}
Пример #2
0
	public HamTimelineNode AddConsequenceNode()
	{
		int id = this.IDCount++;
		HamTimelineNode node = new HamConsequenceNode(id);
		this.Nodes[id] = node;
		this.NodeLinkageDirty = true;
		return node;
	}
Пример #3
0
    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();  
    }
Пример #4
0
    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();
    }
Пример #5
0
    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);
            }
        }
    }