I’m trying to use “Does the player mean” to disambiguate conversation using ask / tell.
What I’ve got is something like this:
Does the player mean asking the security guard about the secret plans: it is very unlikely.
(There is a conversation subject which also contains the word “secret”.)
But though the syntax looks fine to me, Inform refuses to compile it giving the error “You wrote ‘Does the player mean asking the security guard about the secret plans’, which seems to introduce a rule taking effect only if the action is ‘asking the security guard about the secret plans’. But that did not make sense as a description of an action. I am unable to place this rule into any rulebook.”
Am I doing something wrong, or is this just beyond the scope of what “does the player mean” can do?
(The names have been changed to avoid giving spoilers for my new game.)
I think the action ‘asking it about’ can only be followed by a [text], not an object name (quite different) so you might try
Does the player mean asking the security guard about "secret plans"
However, I am not sure that the ‘Does the player mean’ function can work with a [text] in the action description, because [text] can be so many different things. Inform tends to prefer exact matches when [text] is involved.
Come to think of it, you might not need to disambiguate anything, as Inform does, with respect to matching texts, prefer exact matches. Only if the player types “secret plans”, “the secret plans”, “plans” or “the plans” (you do have all of these options in your conversation table with the guard, don’t you?) verbatim, will Inform match it with the secret plans.
I’m pretty sure the “Does the player mean” activity only works on objects/things. IFaddicted’s example will compile (though it arguably shouldn’t), but it won’t do anything, because snippets of text aren’t parsed the way objects with synonyms are.
If you want to disambiguate conversation topics, you’ll have to rewrite the ask/tell rules so that they accept actual objects in the world model. (That is, “secret plans” is an actual object that can be referred to by the player as “secret”, “plans”, or some combination thereof, and is in scope for the ask/tell actions.) This is not a trivial task, although I expect there are extensions that will get you there.
What mikegentry said - Eric Eve did a lot of the heavy lifting with ask/tell conversation madness in his suite of conversation extensions for I7 - especially making “topics” as nouns that can be discussed. I believe Eric’s stuff is all available in the official Inform 7 IDE library under the extensions tab.
(IFaddicted speaking)I didn’t realize that there was an extension for this–thanks for mentioning it!
I forgot to mention that I am in fact using Eric Eve’s conversation extensions, and I completely omitted to read the section on disambiguation in Conversation Frameworks. My apologies, and thanks for reminding me.
I remain slightly confused as to how ASK SOMEONE ABOUT works, given that it applies to both text tokens and objects, but my immediate problem has been solved, thank you.
Ah! That would explain the problem!
Inform can parse both “ASK [someone] ABOUT [text]” and “ASK [someone] ABOUT [something]”, but they need to map to different internal action names. “Asking someone about” is used only for the text version. I believe the object version is either “querying someone about” or “interrogating someone about” but without the extensions on hand I can’t check.
Okay, this is pretty strange. With regard to the above problem, imagine that “secret plans” is something we don’t want to ask about, and “secret garden” is something we do. I added this code, and it worked for exactly two days:
[code]Does the player mean quizzing about something conversation-preferred: it is very likely.
Definition: a thing is conversation-preferred:
if it is the secret garden, decide yes;
It now does nothing at all.
I even added the following:
Does the player mean quizzing about the secret plans: it is very unlikely.
Still the ambiguation question comes up.
I have made no major changes other than to add a couple of extensions, Consolidated Multiple Actions by John Clemens and Hypothetical Questions by Jesse McGrew, which I have since removed because they crashed the game. All other changes were purely cosmetic and had nothing to do with this part of the game. Is there anything I could have done that might stop disambiguation from working?
I am baffled.
Edit: I have just added the lines from the documentation about implicit-quizzing and normal service has been restored. Either this is something that has been added in a later version of Conversation Framework, or I am going mad, or it is 1 AM and I should really stop coding and go to bed. Either way - problem solved!
I hope I’m not missing your point, but disambiguation is actually meant to weight what the parser will automatically choose when the player types something that could go either way. It doesn’t prevent the player from using something they type in directly. So if you have “secret plans” and “dinner plans” you don’t want the parser to inadvertently reveal a thing’s existence “Do you mean the secret plans or the dinner plans?” if the player types in PONDER PLANS. If they type PONDER SECRET PLANS, disambiguation won’t prevent the player from doing so. I believe there are built-in disambiguation rules in effect that might be preventing your “does the player mean” from firing, such as the parser prefers an in-scope item rather than one across the map as the winning result. Topics, however, usually all have to be in scope anyway since a topic isn’t a thing that needs to be physically available to be interacted with.
Could you go at another angle and instead of blocking “secret plans” via disambiguation, set a knows_about_secret_plans truth state and gate it that way? Your characters could simply refuse to acknowledge they exist until the truth flag is set.
Another possible method to do this is to use the Epistemology extension, also by Eric Eve (which I believe is built into the install). You should read the docs, but it gives everything “seen/unseen” and “familiar/unfamiliar” flags which then lets the author test whether an object is “known” or “unknown” based on whether the player has seen it physically, or been informed about it indirectly - “Now the Holy Grail is familiar.” - even if they haven’t encountered it.
It’s possible if you’re using Conversation Framework that it calls to include Epistemology within that extension and you can use it already. It might be as simple as:
Instead of quizzing it about an unknown thing:
say "I'm not sure what you want to ask about."
I just looked and it may be even as simple as verifying whether the action name is “quizzing about” or “quizzing it about”.