Disable certain responses after they have been selected

Announcements, support questions, and discussion for the Dialogue System.
Timeslip
Posts: 39
Joined: Fri Apr 05, 2019 6:31 am

Disable certain responses after they have been selected

Post by Timeslip »

Hi Tony,

My game has a number of skill checks and these are shown, even if the player lacks the requirements to select them. For the most part, I'd like to allow players to revisit dialogue, but in the case when a response results in an action (like healing an NPC), I'd like to have that response removed. Can you offer any suggestions for this?
User avatar
Tony Li
Posts: 20638
Joined: Thu Jul 18, 2013 1:27 pm

Re: Disable certain responses after they have been selected

Post by Tony Li »

Hi,

Use the response's Conditions field for this. If the Conditions are false, the response will not be shown.

Since you only want to hide certain responses, variables are one way to do it. For example, in the Dialogue Editor's Variables section you can add a new variable named "HealedNPC".

Then configure the response node similarly to this:
  • Dialogue Text: "I heal you!"
  • Conditions: Variable["HealedNPC"] ~= true
  • Script: Variable["HealedNPC"] = true
For Conditions and Script, you don't have to type in the text manually. You can click "..." to reveal dropdown menus.

You can also register your own script methods with the Dialogue System and use them in Conditions and Script fields.
Timeslip
Posts: 39
Joined: Fri Apr 05, 2019 6:31 am

Re: Disable certain responses after they have been selected

Post by Timeslip »

Hi Tony,

Since I'm trying to show options which are not available based on the player's current stats and skills, (so the player knows there are other options), I've ticked the show invalid entries option. This seems to prevent the solution from working.
User avatar
Tony Li
Posts: 20638
Joined: Thu Jul 18, 2013 1:27 pm

Re: Disable certain responses after they have been selected

Post by Tony Li »

A short subclass of StandardDialogueUI will do the trick, as described in this post. The example in that post is for version 1.x of the Dialogue System and UnityUIDialogueUI. This version is updated for 2.x and StandardDialogueUI:

ShowInvalidResponsesExample_2019-05-24.unitypackage
Timeslip
Posts: 39
Joined: Fri Apr 05, 2019 6:31 am

Re: Disable certain responses after they have been selected

Post by Timeslip »

In reference to step 2:

2. Replaced the Unity UI Dialogue UI component with Unity UI Dialogue UI Show Invalid Responses. To do this, I changed the Inspector to Debug mode using the three-bar menu in the top right of the Inspector. Then I dragged UnityUIDialogueUIShowInvalidResponses.cs onto the Script field, replacing UnityUIDialogueUI. This replaced the script while keeping all the UI element assignments intact. Then I switched the Inspector back to Normal mode using the three-bar menu:

Which object should UnityUIDialogueUI be replaced on?
User avatar
Tony Li
Posts: 20638
Joined: Thu Jul 18, 2013 1:27 pm

Re: Disable certain responses after they have been selected

Post by Tony Li »

Hi,
Timeslip wrote: Fri May 24, 2019 11:21 amWhich object should UnityUIDialogueUI be replaced on?
The dialogue UI GameObject. It sounds like you did it perfectly. BTW, those instructions were written for Dialogue System version 1, which didn't have StandardDialogueUI. So the version 1 example and script use the older UnityUIDialogueUI. If you're using the newer StandardDialogueUI, as the built-in Dialogue Manager prefab does, use the script I provided in the updated package above.
Timeslip
Posts: 39
Joined: Fri Apr 05, 2019 6:31 am

Re: Disable certain responses after they have been selected

Post by Timeslip »

It's working now, but seems that I need to change the state of the dialogue entry field "show invalid" from true to false once the option has been selected.

This is the behaviour I'm trying to get.

[Player lacks skill to heal & character not healed] -> response is invalid, but visible
[Player has skill to heal & character not healed] -> show as valid response
[Character has been healed] -> response is invisible
Timeslip
Posts: 39
Joined: Fri Apr 05, 2019 6:31 am

Re: Disable certain responses after they have been selected

Post by Timeslip »

Nevermind, think I have it figured out. Will post again if can't figure it. Leaving this here in case it's any use to someone else. Thanks for help!

Code: Select all

DialogueEntry dialogueEntry = dialogueDatabase.GetDialogueEntry(conversationIDIn, dialogueEntryIn);
Field.SetValue(dialogueEntry.fields, "Show Invalid", false);
User avatar
Tony Li
Posts: 20638
Joined: Thu Jul 18, 2013 1:27 pm

Re: Disable certain responses after they have been selected

Post by Tony Li »

You don't have to write any code. Another solution is to set the response's Script field to:

Code: Select all

Dialog[thisID].Show_Invalid = false
Timeslip
Posts: 39
Joined: Fri Apr 05, 2019 6:31 am

Re: Disable certain responses after they have been selected

Post by Timeslip »

Still stuck on this. Getting this error message:

Code: Select all

Dialogue System: Lua code 'Dialog[thisID].Show_Invalid = false' threw exception 'Lookup of field '6' in the table element failed because the table element itself isn't in the table.'
UnityEngine.Debug:LogError(Object)
PixelCrushers.DialogueSystem.Lua:RunRaw(String, Boolean, Boolean) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/Lua/Lua Wrapper/Lua Interpreter/Lua.cs:219)
PixelCrushers.DialogueSystem.Lua:Run(String, Boolean, Boolean) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/Lua/Lua Wrapper/Lua Interpreter/Lua.cs:120)
PixelCrushers.DialogueSystem.ConversationModel:GetState(DialogueEntry, Boolean, Boolean, Boolean) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/MVC/Model/Logic/Model/ConversationModel.cs:233)
PixelCrushers.DialogueSystem.ConversationModel:GetState(DialogueEntry) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/MVC/Model/Logic/Model/ConversationModel.cs:297)
PixelCrushers.DialogueSystem.ConversationController:OnSelectedResponse(Object, SelectedResponseEventArgs) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/MVC/Controller/ConversationController.cs:257)
PixelCrushers.DialogueSystem.ConversationView:SelectResponse(SelectedResponseEventArgs) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/MVC/View/View/ConversationView.cs:454)
PixelCrushers.DialogueSystem.ConversationView:OnSelectedResponse(Object, SelectedResponseEventArgs) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/MVC/View/View/ConversationView.cs:447)
PixelCrushers.DialogueSystem.AbstractDialogueUI:OnClick(Object) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/UI/Abstract/Dialogue/AbstractDialogueUI.cs:346)
PixelCrushers.DialogueSystem.StandardDialogueUI:OnClick(Object) (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/UI/Standard/Dialogue/StandardDialogueUI.cs:215)
UnityEngine.Component:SendMessage(String, Object, SendMessageOptions)
PixelCrushers.DialogueSystem.StandardUIResponseButton:OnClick() (at Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/UI/Standard/Dialogue/StandardUIResponseButton.cs:124)
UnityEngine.EventSystems.EventSystem:Update()

This is how the dialogue entry is set up.
Image
Post Reply