Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
        }