Hi there,
I have a fairly complex situation I can't figure out...
I'm setting up an item "on click" conversation. It's a bed, and it'll have three options:
- Sleep
- Playing the guitar
- Exit
What I want is that if the conditions for an option aren't met, it should mark the menu entry as invalid, using its assigned Em tag and setting the button to non-interactable.
But... I also want the menu text being different when invalid, and that's the tricky part.
The Sleep option was easy. As I only want it to check if it's the evening or not, I just needed do this...:
...and set up the same conditional, setting the valid one to not show when invalid:
...and they're evaluated in that order. All good.
The problem that I have is with the other option...
Let's say that I have an... ahem, 'Guitar Skills' stat, and an "Inspiration" stat. Now, I want that if the character doesn't have enough guitar skills, the menu text in that option is "??? (not enough skill)".
And later on, when she reaches the required skill, another check is made to see if she has enough Inspiration points, to actually play. And if she doesn't, the menu text would turn into "Play the guitar (not enough inspiration), and also be shown as invalid.
Only if both stat requirements are met, the menu text "Play the guitar" should be shown as a valid button to press.
So, I tried doing the same as before, putting the Guitar Skills check on the top, then the Inspiration check next, and finally the valid option that should appear only when both stats are enough.
The problem is, even if the Guitar Skill check is done at first, the Inspiration check overwrites the Guitar Skill, which should always take precedence because I want to keep a secret the... instrument she's gonna play until she has the skill.
So, I went and inverted both skill check nodes, so the Guitar Skills are the second. But now I have the issue that if she has enough skill, but NOT enough inspiration, the third valid option is not shown, and the second one "??? (not enough skill)" is shown as a valid button to press.
And that's my roadblock...: I'm adding nodes that I ONLY want to show up when they're invalid.
Or in other words: I'd need the opposite to the field 'Show Invalid'. That is, a 'Show Valid' field I could set to false in those <put here what you would have needed> menu text entries.
Is what I want to do so complex that I indeed would need that field? Or this could be done in another way? I'm really confused...
Multiple stat conditions with multiple menu texts, all in one button.
Multiple stat conditions with multiple menu texts, all in one button.
Unity 2019.4.9f1
Dialogue System 2.2.15
Dialogue System 2.2.15
Re: Multiple stat conditions with multiple menu texts, all in one button.
In this case, it might be easier to manually mark nodes as invalid -- for example, by putting a special tag of your choosing such as "{invalid}" in the text and processing it at runtime. Your conversation might look like this:
Or, if you want to organize it into groups, like this:
Either way, notice that it doesn't use [position=#] tags, and the invalid responses have "{invalid}" in their text. Instead, you can use a script like this to process the responses before they're shown:
HandleInvalidTags.cs
The nodes' Conditions are set so that they're true if they should be shown (even if they're invalid). For example, the "{invalid}Guitar (not inspired)" node's Conditions require that the player has the guitar skill but her inspiration is too low.
Or, if you want to organize it into groups, like this:
Either way, notice that it doesn't use [position=#] tags, and the invalid responses have "{invalid}" in their text. Instead, you can use a script like this to process the responses before they're shown:
HandleInvalidTags.cs
Code: Select all
using UnityEngine;
using PixelCrushers.DialogueSystem;
public class HandleInvalidTags : MonoBehaviour
{
public void OnConversationResponseMenu(Response[] responses)
{
// If any responses' text contains "{invalid}", make the response invalid:
foreach (Response response in responses)
{
string text = response.formattedText.text;
if (text.Contains("{invalid}"))
{
text = text.Replace("{invalid}", string.Empty); // Remove "{invalid}"
// This next line applies the Em Tag For Invalid Responses formatting:
text = string.Format("[em{0}]{1}[/em{0}]", (int)DialogueManager.displaySettings.inputSettings.emTagForInvalidResponses, text);
response.formattedText.text = FormattedText.Parse(text).text;
response.enabled = false; // This means it's invalid and not clickable.
}
}
}
}
Re: Multiple stat conditions with multiple menu texts, all in one button.
Hi Tony,
I'm afraid I don't fully understand.
I've added the script to the DS Controller game object, then I've set two groups with child entries, and set them up like this..:
Now, this paragraph is the one I don't understand...:
Also set up the rest of the {invalid} tagged nodes like that (checking for a "not enough xxx" condition and setting them up to show them if invalid.
But this is what I get when both stats are at zero and it is the evening...:
That is, the only node not showing up is the one that doesn't meet their conditions and its 'Show Invalid' field is set to False (Play guitar).
It should have shown just "Sleep", "??? (Skill 10+)", and "Exit".
And if I try with all nodes set 'Show Invalid' to False, only "Sleep" and "Exit" nodes are shown.
So, I guess this could be a combo of me not having interpreted your instructions correctly, and maybe the 'HandleInvalidTags' script not being applied (?).
I'm afraid I don't fully understand.
I've added the script to the DS Controller game object, then I've set two groups with child entries, and set them up like this..:
Now, this paragraph is the one I don't understand...:
I've set that that node in particular like this...:
Also set up the rest of the {invalid} tagged nodes like that (checking for a "not enough xxx" condition and setting them up to show them if invalid.
But this is what I get when both stats are at zero and it is the evening...:
That is, the only node not showing up is the one that doesn't meet their conditions and its 'Show Invalid' field is set to False (Play guitar).
It should have shown just "Sleep", "??? (Skill 10+)", and "Exit".
And if I try with all nodes set 'Show Invalid' to False, only "Sleep" and "Exit" nodes are shown.
So, I guess this could be a combo of me not having interpreted your instructions correctly, and maybe the 'HandleInvalidTags' script not being applied (?).
Unity 2019.4.9f1
Dialogue System 2.2.15
Dialogue System 2.2.15
Re: Multiple stat conditions with multiple menu texts, all in one button.
Hi,
Here's an example:
DS_AbeliusInvalidExample_2021-10-20.unitypackage
The scene has input fields that you can set for Skill and Inspiration, and a toggle for Night/Day. Then click Start Conversation. (The condition for Guitar is Skill > 0 and Inspiration >= 50.)
Note that the Dialogue Manager's 'Include Invalid Responses' is UNticked. Instead, the HandleInvalidTags scripts converts any responses whose text contains "{Invalid}" into invalid responses before showing them in the menu.
Here's an example:
DS_AbeliusInvalidExample_2021-10-20.unitypackage
The scene has input fields that you can set for Skill and Inspiration, and a toggle for Night/Day. Then click Start Conversation. (The condition for Guitar is Skill > 0 and Inspiration >= 50.)
Note that the Dialogue Manager's 'Include Invalid Responses' is UNticked. Instead, the HandleInvalidTags scripts converts any responses whose text contains "{Invalid}" into invalid responses before showing them in the menu.
Re: Multiple stat conditions with multiple menu texts, all in one button.
Oh lol, that was the issue.
I had 'Include Invalid Responses' checked in the DS Controller.
Now it's working flawlessly and pretty. Thank you!
Unity 2019.4.9f1
Dialogue System 2.2.15
Dialogue System 2.2.15
Re: Multiple stat conditions with multiple menu texts, all in one button.
Glad to help!
If you're relying on 'Include Invalid Entries' elsewhere, you can keep that checkbox ticked on the Dialogue Manager and override its value for this specific conversation by setting the overrides in the conversation's properties.
If you're relying on 'Include Invalid Entries' elsewhere, you can keep that checkbox ticked on the Dialogue Manager and override its value for this specific conversation by setting the overrides in the conversation's properties.