Page 1 of 1

SimStatus check failed in dialogue entry script

Posted: Wed Dec 21, 2022 9:54 am
by joeylu
Hi Tony
Say that I have a conversation, has a serials dialogue entries
if I add something in the "script" input field in any dialogue entry like

Code: Select all

if (Dialog[thisID].SimStatus =="Untouched") then Variable["test"] = Variable["test"] + 1 end;
it does not work, but if I take out the simstatus condition check, the variable adds 1 correctly

I have tried restarted Unity project and deleted library, still no working

so am I doing anything wrong by checking the SimStatus in the script field? or am I missing anything from the setting?
another question is that how do I do unity debug logging from the script field? can I call Debug.Log(Dialog[thisID].SimStatus) or something similar? so I can get the status in console

tks

Re: SimStatus check failed in dialogue entry script

Posted: Wed Dec 21, 2022 11:48 am
by Tony Li
Hi,

Are there any errors or warnings in the Console window when that dialogue entry node runs?

Re: SimStatus check failed in dialogue entry script

Posted: Thu Dec 22, 2022 12:39 am
by joeylu
no error, nor warning

let me give me a few details and my debug data:

I have created a simple conversation as in the attachment screenshot
both in "How are you" and "ok" nodes, i added following script:

Code: Select all

if (Dialog[thisID].SimStatus =="Untouched") then Variable["test"] = Variable["test"] + 1 end;
the result is the variable "test" value doesn't get increased
however, if I take out the condidtion, just use

Code: Select all

Variable["test"] = Variable["test"] + 1
it works.

I also tried doing some debugs from unity script (I don't know how to add logging directly from the dialogue entry script field)

I added following line inside OnConversationLine() function

Code: Select all

Debug.Log(subtitle.dialogueEntry.outgoingLinks[0].destinationDialogueID + " : " + DialogueLua.GetSimStatus(subtitle.dialogueEntry.outgoingLinks[0].destinationConversationID, subtitle.dialogueEntry.outgoingLinks[0].destinationDialogueID));
reason I use destinationConversationID and destinationDialogueID is that in OnConversationLine() method, checking current dialogue entry simstatus always returns "WasDisplayed", guess the simstatus was updated before executing the OnConversationLine()

result of my debug is, both returns "WasOffered", even the entry hasn't played yet.

so I went back to the dialogue editor, replace the above script from condition "Untouched" to "WasOffered", still not working

lastly, if I replace the condition to "WasDisplayed", it's working, but obliviously, this is not what I want

am I missing anything? tks

Re: SimStatus check failed in dialogue entry script

Posted: Thu Dec 22, 2022 8:45 am
by Tony Li
Hi,

That all works correctly for me. I tested with "WasOffered" since blue nodes (player responses) are always marked WasOffered as soon as they're shown in a response menu. Maybe I'm failing to understand some step that we're doing differently. Would you please send a reproduction project to tony (at) pixelcrushers.com along with reproduction steps that I should follow?

Re: SimStatus check failed in dialogue entry script

Posted: Sat Dec 24, 2022 5:44 am
by joeylu
Hi Tony, I have sent you the project to support (at) pixelcrushers.com, tks

Re: SimStatus check failed in dialogue entry script

Posted: Sat Dec 24, 2022 9:43 am
by Tony Li
Thanks for sending the repro project. The dialogue entry node's Script won't run until you've clicked on the response. Since you've clicked on the response, the SimStatus will have changed to WasDisplayed. This is why you need to use WasDisplayed.

Re: SimStatus check failed in dialogue entry script

Posted: Thu Dec 29, 2022 12:27 am
by joeylu
Understood now, I was thinking to use simstatus to do the following logic:
When a response menu was chosen, conditionally check if this menu has been chosen before, if yes, don't run the script (in my case, add some value to a variable), and if no, add value to that variable.
According to your explanation, if the menu is chosen, the SimStatus will always return WasDisplayed, therefore, using SimStatus as the condition seems not possible, would you provide me some alternative ways to achieve the logic? tks

Re: SimStatus check failed in dialogue entry script

Posted: Thu Dec 29, 2022 9:08 am
by Tony Li
Hi,

Add a script with an OnConversationResponseMenu() method to your Dialogue Manager GameObject. This method is called before the response menu is shown. You can record a list of which responses haven't been chosen before. Then register a C# method with Lua that only does its work if the response is in the list of those that haven't been chosen before. Example:

Code: Select all

private List<DialogueEntry> notChosenBefore = new List<DialogueEntry>();
private DialogueEntry currentEntry;

void OnConversationResponseMenu(Response[] responses) // Called when preparing the menu.
{
    notChosenBefore.Clear();
    foreach (var response in responses)
    {
        if (DialogueLua.GetSimStatus(response.destinationEntry) != DialogueLua.WasDisplayed)
        {
            notChosenBefore.Add(reponse.destinationEntry);
        }
    }
}

void OnPrepareConversationLine(DialogueEntry entry) // Called when about to use an entry (e.g., selected from menu).
{
    currentEntry = entry;
}

void Awake()
{
    Lua.RegisterFunction(nameof(DoTheThing), this, SymbolExtensions.GetMethodInfo(() => DoTheThing()));
}

void DoTheThing()
{
    if (!notChosenBefore.Contains(currentEntry))
    {
        // do the thing
    }
}

Re: SimStatus check failed in dialogue entry script

Posted: Mon Jan 02, 2023 12:06 am
by joeylu
tks for the idea :)
one last thing, the example you gave is a slightly different against the doc for registering Lua, so I don't know how to pass parameters like in the doc example, any idea that if I can pass parameter with your SymbolExtensions.GetMethodInfo()? tks

ref: https://www.pixelcrushers.com/dialogue_ ... ripts.html

Re: SimStatus check failed in dialogue entry script

Posted: Mon Jan 02, 2023 7:39 am
by Tony Li
Yes, you can pass parameters exactly like in the docs. The example C# method that I used just happened to not have any parameters, so I didn't include any. Also, I use nameof(DoTheThing) instead of "DoTheThing" to help prevent typos. The documentation is written for maximum compatibility with older versions of Unity that use .NET versions that don't support nameof(). But either way is fine.