internal static void Main() { var nodeID = NWNXDialog.GetCurrentNodeID() - (NumberOfResponsesPerPage + 3); nodeID = Math.Abs(nodeID); NWGameObject player = (_.GetPCSpeaker()); var playerID = _.GetGlobalID(player); PlayerDialog dialog = Conversation.GetActivePlayerDialog(playerID); IConversation convo = Conversation.FindConversation(dialog.ActiveDialogName); int selectionNumber = nodeID + 1; int responseID = nodeID + (NumberOfResponsesPerPage * dialog.PageOffset); if (selectionNumber == NumberOfResponsesPerPage + 1) // Next page { dialog.PageOffset = dialog.PageOffset + 1; } else if (selectionNumber == NumberOfResponsesPerPage + 2) // Previous page { dialog.PageOffset = dialog.PageOffset - 1; } else if (selectionNumber == NumberOfResponsesPerPage + 3) // Back { string currentPageName = dialog.CurrentPageName; var previous = dialog.NavigationStack.Pop(); // This might be a little confusing but we're passing the active page as the "old page" to the Back() method. // This is because we need to run any dialog-specific clean up prior to moving the conversation backwards. convo.Back(player, currentPageName, previous.PageName); // Previous page was in a different conversation. Switch to it. if (previous.DialogName != dialog.ActiveDialogName) { Conversation.Load(player, dialog.DialogTarget, previous.DialogName); dialog = Conversation.GetActivePlayerDialog(playerID); dialog.ResetPage(); dialog.CurrentPageName = previous.PageName; dialog.PageOffset = 0; // ActiveDialogName will have changed by this point. Get the new conversation. convo = Conversation.FindConversation(dialog.ActiveDialogName); convo.Initialize(); _.SetLocalInt(player, "DIALOG_SYSTEM_INITIALIZE_RAN", 1); } // Otherwise it's in the same conversation. Switch to that. else { dialog.CurrentPageName = previous.PageName; dialog.PageOffset = 0; } } else if (selectionNumber != NumberOfResponsesPerPage + 4) // End { convo.DoAction(player, dialog.CurrentPageName, responseID + 1); } }
internal static int Main() { var player = GetPCSpeaker(); var playerID = GetGlobalID(player); var dialog = Conversation.GetActivePlayerDialog(playerID); var nodeID = NWNXDialog.GetCurrentNodeIndex(); var nodeType = NWNXDialog.GetCurrentNodeType(); DialogPage page = dialog.CurrentPage; var convo = Conversation.FindConversation(dialog.ActiveDialogName); int currentSelectionNumber = nodeID + 1; bool displayNode = false; string newNodeText = string.Empty; var gender = GetGender(player); if (currentSelectionNumber == NumberOfResponsesPerPage + 1) // Next page { int displayCount = page.NumberOfResponses - (NumberOfResponsesPerPage * dialog.PageOffset); if (displayCount > NumberOfResponsesPerPage) { displayNode = true; } newNodeText = "Next"; } else if (currentSelectionNumber == NumberOfResponsesPerPage + 2) // Previous Page { if (dialog.PageOffset > 0) { displayNode = true; } newNodeText = "Previous"; } else if (currentSelectionNumber == NumberOfResponsesPerPage + 3) // Back { if (dialog.NavigationStack.Count > 0 && dialog.EnableBackButton) { displayNode = true; } newNodeText = "Back"; } else if (nodeType == DialogNodeType.Reply || nodeType == DialogNodeType.Entry) { int responseID = (dialog.PageOffset * NumberOfResponsesPerPage) + nodeID; if (responseID + 1 <= page.NumberOfResponses) { DialogResponse response = page.Responses[responseID]; if (response != null) { newNodeText = response.Text; displayNode = response.IsActive; } } } else if (nodeType == DialogNodeType.Starting) { if (GetLocalInt(player, "DIALOG_SYSTEM_INITIALIZE_RAN") != 1) { convo.Initialize(); SetLocalInt(player, "DIALOG_SYSTEM_INITIALIZE_RAN", 1); } if (dialog.IsEnding) { convo.EndDialog(); Conversation.End(player); DeleteLocalInt(player, "DIALOG_SYSTEM_INITIALIZE_RAN"); return(0); } page = dialog.CurrentPage; newNodeText = page.Header; NWNXDialog.SetCurrentNodeText(newNodeText, DialogLanguage.English, gender); return(1); } NWNXDialog.SetCurrentNodeText(newNodeText, DialogLanguage.English, gender); return(displayNode ? 1 : 0); }