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 AddDialogNode(int sceneID, int speakerID, string dialog, List<int> characters = null) { int id = this.IDCount++; HamTimelineNode node = new HamDialogNode(id, sceneID, speakerID, dialog, characters); this.Nodes[id] = node; this.NodeLinkageDirty = true; return node; }
private void RenderDialogNode(Vector2 nodePosition, Vector2 offset, HamDialogNode node) { GUILayout.BeginVertical(); GUILayout.BeginHorizontal(Style("DialogNode")); GUILayout.Label("(" + node.ID + ") Dialog"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(Style("GenericNode")); GUILayout.Label(this.activeTimeline.Scenes[node.SceneID].Name); GUILayout.EndVertical(); GUILayout.BeginVertical(Style("GenericNode")); GUILayout.Label(this.activeTimeline.Characters[node.SpeakerID].Name); GUILayout.EndVertical(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(Style("GenericNode"), GUILayout.ExpandHeight(true)); GUILayout.Label(node.Dialog); GUILayout.EndHorizontal(); 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)); } 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, 0); } } }
private void DialogNodeEditing(HamDialogNode node) { GUILayout.Label("Dialog Node", Style("SubTitle")); // Node Editing GUILayout.BeginVertical(Style("box")); GUILayout.BeginHorizontal(GUILayout.MaxWidth(300)); GUILayout.Label("Scene"); if (GUILayout.Button(this.activeTimeline.Scenes[node.SceneID].Name)) { GenericMenu menu = new GenericMenu(); foreach (HamScene scene in this.activeTimeline.Scenes.Values) { menu.AddItem( new GUIContent(scene.Name), (scene.ID == node.SceneID), (userData) => { node.SceneID = (int)userData; }, scene.ID ); } menu.ShowAsContext(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUILayout.MaxWidth(300)); GUILayout.Label("Speaker"); if (GUILayout.Button(this.activeTimeline.Characters[node.SpeakerID].Name)) { GenericMenu menu = new GenericMenu(); foreach (HamCharacter character in this.activeTimeline.Characters.Values) { menu.AddItem( new GUIContent(character.Name), (character.ID == node.SpeakerID), (userData) => { node.SpeakerID = (int)userData; }, character.ID ); } menu.ShowAsContext(); } GUILayout.EndHorizontal(); GUILayout.Label("Dialog Content"); node.Dialog = GUILayout.TextArea(node.Dialog); GUILayout.Label("Characters Present"); for (int i = 0; i < node.CharacterIDs.Count; ++i) { HamCharacter c = this.activeTimeline.Characters[node.CharacterIDs[i]]; GUILayout.BeginHorizontal(GUILayout.MaxWidth(200)); GUILayout.Label(c.Name); if (GUILayout.Button("-", Style("SmallButton"))) { node.CharacterIDs.Remove(c.ID); } GUILayout.EndHorizontal(); } if (GUILayout.Button("Add Character")) { GenericMenu menu = new GenericMenu(); foreach (HamCharacter character in this.activeTimeline.Characters.Values) { if (!node.CharacterIDs.Contains(character.ID)) { menu.AddItem( new GUIContent(character.Name), false, (userData) => { node.CharacterIDs.Add((int)userData); }, character.ID ); } } menu.ShowAsContext(); } GUILayout.EndVertical(); }