how to stop the "Please choose which 'object' you mean:" message?

adammadam
Hi, so say for example I have two objects one called training sword, one called David's sword. I type in "equip sword" and it comes up with

Please choose which 'sword' you mean:
1. training sword
2. david's sword

The problem I have is that I have a lot of scenery objects in the room which have many aliases so it actually says:
2. david sword, david's sword, david weapon, david's weapon etc etc for everything I could think of, and when it pops up it looks really messy.

Also this is true for any scenery object. So if someone randomly typed in "equip water" it could say
please choose which 'water' you mean:
1. lake; pond; pool etc etc
2. glass of water; water; drink; glasses of water; drinks of water; etc etc etc

And with many there, it just gets really messy. Also, if I'm making puzzles in the game, I'd rather not have the menu of options pop up but for people to have to type in specifically which thing they mean themselves.

So if I could make it so that instead it defaults to interacting with one of them of my choice, so I can for example make typing "equip sword" default to equipping the training sword rather than these menus popping up, whilst "equip david's sword" would have to be typed for it to attempt to equip that. And for every other situation like "eat water" or anything, I want to remove these menus of "please choose which water you mean" popping up.

HegemonKhan
this deals with quest's parsing of your input (which thus also includes your Command's 'pattern' box~Attribute) and the Objects' (or whatever Elements' ~ Attributes' ) 'name' (ID) String Attribute, so using spaces with shared words, causes quest to not know what you want. So, the easiest solution is to not use spaces in your 'name' (ID) String Attribute (Elements' Names). I like using underscores for the 'name' (ID) String Attributes, and then you can use the 'alias' String Attribute with spaces, instead of the ugly underscores.

--------

also a big issue:

people playing the game will likely see the 'alias' of the Object, and thus that's what they use as the input for your Command, and thus quest searches for an Object with the 'name' of that input... obviously you got a problem:

<object name="orc_1">
<alias>orc</alias>
</object>


the person only sees 'orc' and so they type in 'orc', but quest searches for an Object having the 'name' of 'orc', but it can't find any, as there's an 'orc_1', but no 'orc' for an Object's 'name' Attribute.

and, maybe from your comment, the quest then will search for all objects' 'alias' Attributes on its own (which would be cool ~ I never dealt with testing this), but then if you got multiple Objects with the same 'alias', then its going to ask you which Object you meant:

<object name="orc_1">
<alias>orc</alias>
</object>

<object name="orc_2">
<alias>orc</alias>
</object>


quest: did you want 'orc_1' or 'orc_2', as they both have the 'alias' of 'orc', but "I_the_quest engine_lol" needs to know which (or multiple or all) Object(s) you wanted? (as unfortunately I_the_quest_engine_lol am not telepathic yet... though if you hold still... my metalic tentacle electrodes will attach or stab into to your head, and then I can read~learn your brain activity, and be 'telepathic'... and be in control over you too... muwhaha!)

I address this issue in the coding example below

--------

you can use the scripting to try to help, but it gets complex~advanced... for example:

(I haven't worked with the 'alt' ~ 'alternative names' Attribute, so I'm not sure if this also is involved with your issue)

(I'm still having trouble with the #object#, so I use the #text#, with Commands)

(a somewhat simple partial equipment system example ~ this is a bit getting into beyond my coding + structural_complexity_design ability, lol)

<object name="claymore_object_1">
<alias>claymore</alias>
<attr name="type_of_object_string_attribute" type="string">sword</attr>
<attr name="two_handed_boolean_attribute" type="boolean">true</attr>
</object>

<object name="claymore_object_2">
<alias>claymore</alias>
<attr name="type_of_object_string_attribute" type="string">sword</attr>
<attr name="two_handed_boolean_attribute" type="boolean">true</attr>
</object>

<object name="lance_object_1">
<alias>lance</alias>
<attr name="type_of_object_string_attribute" type="string">spear</attr>
<attr name="two_handed_boolean_attribute" type="boolean">true</attr>
</object>

<object name="short_sword_object_1">
<alias>short sword</alias>
<attr name="type_of_object_string_attribute" type="string">sword</attr>
<attr name="two_handed_boolean_attribute" type="boolean">false</attr>
</object>

<object name="shield_object_1">
<alias>shield</alias>
<attr name="type_of_object_string_attribute" type="string">shield</attr>
</object>

<object name="unarmed_object_1">
<alias>unarmed</alias>
<attr name="type_of_object_string_attribute" type="string">unarmed</attr>
<attr name="two_handed_boolean_attribute" type="boolean">false</attr>
</object>

<object name="player">
<attr name="left_hand_object_attribute" type="object">unarmed_object_1</attr>
<attr name="right_hand_object_attribute" type="object">unarmed_object_1</attr>
</object>

<command name="equip_command">
<pattern>equip #text#</pattern>
<script>
temporary_stringlist_variable = NewStringList ()
equipment_variable = GetObject (text)
if (equipment_variable = null) {
foreach (object_variable, AllObjects()) {
if (object_variable.alias = text) {
list add (temporary_stringlist_variable, object_variable.name)
}
}
if (temporary_stringlist_variable = null) {
show menu ("What equipment item did you mean~want?", temporary_stringlist_variable, false) {
equipment_variable = GetObject (result)
}
}
}
if (equipment_variable = null) {
msg ("Wrong input, try again.")
} else {
if (Got (equipment_variable.name)) {
if (equipment_variable.type_of_object_string_attribute = "sword") {
if (equipment_variable.two_handed_boolean_attribute = true) {
player.left_hand_object_attribute = equipment_variable.name
player.right_hand_object_attribute = equipment_variable.name
} else if (equipment_variable.two_handed_boolean_attribute = false) {
player.right_hand_object_attribute = equipment_variable.name
}
} else if (equipment_variable.type_of_object_string_attribute = "shield") {
player.left_hand_object_attribute = equipment_variable.name
}
// etc else ifs
} else {
msg ("You don't have this equipment item in your inventory, and thus you can't equip what you don't have, silly. Try again.")
}
}
</script>
</command>


ask if you need any of this explained, as it gets into some advanced coding~if logic concepts~issues.

adammadam
it is a problem with scenery objects mostly, they dont show up in room descriptions, so it's fine if they have many aliases:

<object name="Davids_book">
<alias>david's book; davids book; david book; david's script; davids script; david script; david's paper; davids paper; david paper</alias>
</object>

etc like this. It's not a problem because it's a scenery object, so this doesnt come up in the initial room description, then when you type in any of these specific terms it knows which one you mean. But then if you also have

<object name="Janes_book">
<alias>Jane's book; janes book; jane book etc etc</alias>
</object>


It works fine when you type in "look at jane's book" or "look at David's book", it knows which one you want and works smoothly.

But if you were to type in "look at book" or "eat book" or "use book" or anything then it gives the message "please choose which 'book' you mean" and a list of options, listing all of the aliases as well.

I'd prefer if nothing happened in that case rather than the menu of which one to choose coming up, because firstly it looks bad and also I think the menu of options popping up will kind of ruin the game a bit because I'm planning to use a lot of scenery objects which you are supposed to discover for yourself by looking around, not having a menu popping up listing everything in the room which is related to a word.

Is there a way to easily just disable this feature so if you were to type in "look at book" instead of asking which book you mean, it just does nothing

HegemonKhan
you're getting into how the engine works... if you want to see and alter it safely:

in the GUI~Editor, in the lower left corner (the bottom of the 'tree of stuff' on the left side) is:

Filter -> Show Library Elements -> (toggle this on, though it's a bit difficult due to the stupid small popup box, argh, lol)

this is a toggle that shows~hides all of the built-in coding, as left grey text up in the 'tree of stuff' on the left side. click on light grey text, then on the right side, in the upper right corner, click on the 'copy' button. This protects the quest software~engine code, from you messing it up, though you'll want to back up your game file first, obviously. Good luck though on searching for what you want... maybe someone else can help you better, who knows the game engine code.

somewhere you can find the parsing coding part you want, and have it give a 'null' response, instead of asking~listing the related objects to you.

--------

again though the problem is 'book' as you got multiple things using 'book', so quest is like: "okay book... but um... WHAT BOOK?"
// this is NOT a coding issue, it's a LOGIC issue, this is just simply how our real world (and thus the coding world too) WORKS.

// it's like I got two people, named "jim" and "jill", and I want "jill" to come over to me, but I say, "hey you, come over here!". Jim and Jill look at each other and than at me, saing "um, who do you want?" and I say again, "I want you!" But they say... "who do you mean by "you?", do you mean "jim" or do you mean "jill" " ??? This is illogical.

coding in the game engine's parsing code is way beyond my ability, so you got to get someone else's help on this stuff.

------

lastly...

all those names under~as~in the 'alias' String Attribute box shouldn't be there, instead do this:

'whatever' Object -> 'Object' Tab -> 'other names' box -> add -> (and add all those names here instead)

this GUI~Editor's 'other names' is this in code:

'alt' is short for 'alternative names'

horizontally:

<object name="xxx">
<alt type="simplestringlist">xxx1;xxx2;xxx3;etc</alt>
</object>

or vertically:

<object name="xxx">
<alt type="stringlist">
<value>xxx1</value>
<value>xxx2</value>
</alt>
</object>

The Pixie
A partial solution is to modify the GenerateMenuChoices function.
foreach (obj, objects) {
if (not DictionaryContains(dictionary, obj.name) and not obj.scenery) {
dictionary add (dictionary, obj.name, GetDisplayAlias(obj))
}
}

I cannot guarantee this will not have other effects, but I think it is safe. I say partial solution as it will still bring up a menu if there is only one item that is not scenery so is not ideal.

And with many there, it just gets really messy. Also, if I'm making puzzles in the game, I'd rather not have the menu of options pop up but for people to have to type in specifically which thing they mean themselves.


Be careful ghere. There is an issue here that the player may not realise he has to do that, and might give up trying to get the specific item when he gets another instead.

adammadam
HegemonKhan wrote:
lastly...

all those names under~as~in the 'alias' String Attribute box shouldn't be there, instead do this:

'whatever' Object -> 'Object' Tab -> 'other names' box -> add -> (and add all those names here instead)


yep... even though it is working under the alias part.. it makes a lot more sense putting it in other names I'm transferring them all over now haha.


The Pixie wrote:A partial solution is to modify the GenerateMenuChoices function.
foreach (obj, objects) {
if (not DictionaryContains(dictionary, obj.name) and not obj.scenery) {
dictionary add (dictionary, obj.name, GetDisplayAlias(obj))
}
}

I cannot guarantee this will not have other effects, but I think it is safe. I say partial solution as it will still bring up a menu if there is only one item that is not scenery so is not ideal.

And with many there, it just gets really messy. Also, if I'm making puzzles in the game, I'd rather not have the menu of options pop up but for people to have to type in specifically which thing they mean themselves.


Be careful ghere. There is an issue here that the player may not realise he has to do that, and might give up trying to get the specific item when he gets another instead.



Well I might just leave it for now because I dont think I'd cope well with any other unexpected effects! And I know it might be difficult, I'm trying to make a game which is maybe difficult but also not just a "what am I thinking" game.. I want the textual descriptions or common sense to guide the player into doing the right things, looking for the right things etc and I'm going to make sure that anything the player does need is named properly yeah.

But say for example maybe the player could type "pick up book" and they could get the wrong one, because they were supposed to pick up a specific book "pick up gardening book".. so when they look at theirs after typing "pick up book" it might be a random one "cooking book".. but I think that's ok for my game to be that way, because later in the game they might realise they need a gardening book and specifically look for that in the library, whereas before they werent aware it was in there... so for many things in the game I think I want them to be specific about what they want, and there may be many scenery objects around which I dont want them finding by chance by typing stupid things like "eat book" randomly then the menu of every single book in the library popping up because you can see how that would ruin it. Right now I guess my workaround in trying to stop these "please choose which 'object' you mean" menus from popping up is just creating other objects which are related and I the player could possibly type in. So I'd just have a "book" object in the library as well.

adammadam
ok well I'm working around this right now. Is there a way to make hyperlinks for scenery show up? For example if I can have an object which is scenery, lets say a gardening book. Then an event happens, for example you talk to someone, then the gardening book is hyperlinked to you.. If that's not possible, I can see how instead you could just make the gardening book no longer be scenery at that certian point. But.. even though i can see the <scenery type="boolean">false</scenery> in code view I'm not sure of the actual command.

Like if I want the book scenery, then you talk to the librarian and she says "the book is over there" then its not scenery or is linked..

So

<speak type="script"><![CDATA[
msg ("<br/>\"The gardening book is over there! \"<br/>")



Then either gardening book <scenery type="boolean">false</scenery> however this should work idk!!...

or hyperlink the book which I have no clue about tbh but maybe either would be ok.

HegemonKhan
I don't know if a Verb's 'hyperlinks' and their pane 'buttons' are separate or not. If they're not separate, then you're going be to seeing it (scenery:false) both as a 'hyperlink' in the left side's big text pane and as a 'button' on the right side's 'whatever it is called' pane.

if they're separate (aka you can, scenery:true) and~or (If can do so) in simply using Commands+Text Processor to bypass this whole issue lol, then probably the easiest way is via the text processor commands:

http://docs.textadventures.co.uk/quest/ ... essor.html

I'm not sure if the code below actually works, as I barely understand this fancy use of Commands + ' Text Processor's commands ' (see the 'LevelLib.aslx' Level Up Library by Pixie+Jaynabonne: viewtopic.php?f=18&t=4057 )

msg ("Ah, you notice a {command:read janes book:book} out of place...")

<command name="read">
<pattern>read #text#</pattern>
<script>
if (text = "janes book") {
// blah scripting
}
</script>
</command>


-------

the generic syntax:

Object_name.Attribute_name = Value_or_Expression

as for just the scipting code of 'scenery', her's how you write it:

(hopefully I'm spelling 'scenery' correctly, lol)

the 'scenery' Attribute is just a Boolean Attribute:

Object_name.Boolean_Attribute_name = true_or_false

Object_name.scenery=true
~OR~
Object_name.scenery=false

example:

book.scenery=true
~OR~
book.scenery=false

shortened~alternative forms:

True:

book.scenery

False:

not book.scenery
// conceptually: not (true) ====> false

for example of shortened form usage (using the built-in 'switchedon' Boolean Attribute):

if (tv.switchedon) {
msg ("You watch for a bit, and then turn off the tv.")
tv.switchedon=false
} else if (not tv.switched) {
msg ("You turn on the tv and watch for a bit.")
tv.switchedon=true
}


the above shortened form is the same as its full form below:

if (tv.switchedon=true) {
msg ("You watch for a bit, and then turn off the tv.")
tv.switchedon=false
} else if (tv.switched=false) {
msg ("You turn on the tv and watch for a bit.")
tv.switchedon=true
}


--------------

and yes, this:

<scenery type="boolean">false</scenery>
~ OR (the below may not work, not sure) ~
<attr name="scenery" type="boolean">false</attr>

is the correct creation tag block

-----------

in full, the 'alias' String Attribute, looks like this as a creation tag block:

<attr name="alias" type="string">HK</attr>
~OR~
<alias type="string">HK</alias>

but this is the shortened form (for String Attributes ONLY) you always see instead:

<alias>HK</alias>

ya, it gets a bit confusing... like for some things, like the built-in 'statusattribute' String Dictionary Attribute, the '<attr name="xxx">Value_or_Expression</attr>' doesn't work, and you have to use '<Attribute_name type="xxx">Value_or_Expression</Attribute_name>', instead.

adammadam
yes this is working

Object_name.scenery=true
~OR~
Object_name.scenery=false

Thanks, I just didnt know the actual thing to put in to do this.

And the text processor commands look good

("The gardening book is over there {command:pick up gardening book}")

So I think you've told me how to do both of these things quite easily. Thanks!

adammadam
Do you know if there is also a way to stop the dropdown menus coming up for verbs.. so if theres an object which is displayed with a hyperlink, let's say it's "Dave" then I click on "Dave" and a dropdown menu appears "speak to dave", "hug dave" etc and whatever verbs I've assigned to him. But for my game, again it might ruin it a bit because it'll be too obvious what you're supposed to do to each character when every possible action you can do on them is displayed when you click on them.

Edit: Actually I just had an idea to solve this, I can put "you can see x y z" at the end of the textual room description I write, and have x y z set as scenery, so there is no hyperlink to them and so no dropdown menu.

HegemonKhan
Unless you get into the underlying code, this is otherwise what happens when you use the GUI~Editor's Verbs (an Object's Script Attribute). If you want to avoid this, just use Commands instead.

------------

maybe you can do what you want without getting into the underlying code (I haven't fully played around ~ tested, with them fully yet: I haven't been learning much about all of the built-in stuff of quest unfortunately, as I've been busy just trying to learn how to code quest stuff on my own), through the special~built-in:

'displayverbs' Stringlist Attribute
'inventoryverbs' Stringlist Attribute

http://docs.textadventures.co.uk/quest/ ... /verb.html (Verbs are technically a sub-Command, and Verbs+Commands are connected too, but I am still confused with~on this fancy stuff that I've seen done in some libraries: I think it was in Pixie's Spell Library, which is now merged with his~her Combat Library)
http://docs.textadventures.co.uk/quest/ ... mmand.html

http://docs.textadventures.co.uk/quest/ ... ments.html (middle of doc has 1-3 lines about the 'displayverbs' and 'inventoryverbs' )

http://docs.textadventures.co.uk/quest/ ... verbs.html or viewtopic.php?f=18&t=5023 (both links are to the same guide by Pixie on 'displayverbs' and 'inventoryverbs' )

also, there's (global game) options~controls in the special 'game' Game Object too:

'game' Game Object -> 'Features' Tab -> (the 'hyperlinks' and the 'in-room descriptions' options)

'game' Game Object -> 'Room Descriptions' Tab -> (the 'automatically generate room descriptions', 'show room description when entering a room', 'display hyperlinks in commands', 'automatically generate object display verbs list', and the 'room description layout' options)

and there's the individual Object's options too (I think these will override the global 'game' Game Object's options, well only for the individual Object you're setting this option for, of course):

'whatever' Object -> 'Object' Tab -> 'displayverbs' section (the two check boxes, and the two add boxes: displayverbs and inventoryverbs)

adammadam
oh wow yes I missed that.. I feel kind of stupid that my questions are all something you should be able to see easily "only display verbs from this objects tab" under options! and "automatically generate object display verbs list"

XanMag
adammadam wrote:The problem I have is that I have a lot of scenery objects in the room which have many aliases so it actually says:
2. david sword, david's sword, david weapon, david's weapon etc etc for everything I could think of, and when it pops up it looks really messy.


So... If you want "david sword" = "david's sword" = "david weapon" = etc, etc... simply put those under the object tab --> add other names instead of aliases. I am doing the the same thing with my current game. Now, if you don't want 'which sword do you mean' to come up when you have two different swords in the same room, I would use some creative language options =) I would call one of them "david's sword" and I'd call the other sword something like "training weapon" or "training rapier" or a "training cutlass", etc.

No need to over complicate!! <-- pot calling the kettle black! :lol:

Happy gaming!

XanMag

EDIT: just saw HK post. =)

HegemonKhan
further commenting: explanation

by putting that chain of variations of the alias into the 'alias' String Attribute, adamadam, literally made that chain of alias variations as a string, as the Object's 'alias' String Attribute name. Adammadam's intention of having those as separate variations of the Object's alias, just became one long alias name. So, (adammadam simply used the) Wrong Attribute, laughs. Quest uses the 'alt' Stringlist Attribute for this, not the 'alias' String Attribute.

adammadam
yeah I had all the alt names under the alias section seperated by semicolons, not in the object alternative names, although it worked this way for what I wanted as well (because all the objects are scenery, and typing in any one of the names listed in the alias section does also give you the specific thing). This did make it far worse when a menu did pop up though! But even with the alt names now in the right place, I'd rather disable the menus popping up (because the scenery objects are still supposed to be hidden for a challenge and discovered through the game!).

My fix atm is just being careful what I name things, and having extra objects all over the place, so if I have "yellow cup" (alt name yellow mug), "red cup", "green cup" etc in a room, in order to stop the menu coming up of every single cup in the room when someone types in "take cup, eat cup etc" I also have another object in the room "cup" and another "mug" etc, which are there purely to stop this menu from otherwise happening.

The only problem with this is I cant have items always named exactly how I want


For a practical example, something I will make up just now, lets say I have a shady character and he has a hidden knife on him, it's scenery so not displayed in the room description, but you can "look at knife" and see it. This is good because another character may warn you the shady character is carrying a knife, then you can look for it later on. Also there is a "hunting knife" nearby you can pick up. Now if you type in "take knife" because you wanted to pick up the hunting knife, it will say "please choose which 'object' you mean"
1. shady character's knife
2. hunting knife

And then see, the fact the shady characters knife is scenery and supposed to be "hidden" is ruined. The only solution is to rename the "hunting knife" to "knife" which just sounds more boring.

HegemonKhan
as for the 'knife' issue (the displayment of your shady character's Child Objects), I think there's a simple solution for that:

in the GUI~Editor, set your 'shady character' Object as a 'container' :

'shady character' Object -> 'Features' Tab -> check in the 'container: object is a container or surface...' to toggle on the 'container' Tab

'shady character' Object -> 'container' Tab -> (the options should be self explanatory for you)

or, figure out ~ look up, what the actual code lines (Attributes) are, and do it in code (without possibly extra unwanted Attributes that the GUI~Editor method will add to your shady character):

http://docs.textadventures.co.uk/quest/ ... ldren.html (WOW, HERE IT IS DIRECTLY, LOL)
http://docs.textadventures.co.uk/quest/ ... bject.html (this has the above link, and also scroll way down to the bottom to see the 'container types' Object Types ~ Inherited Attributes too)

Object Types and their Inherited Attributes (these are your 'Classes ~ Groups'. Object Types hold Attributes and~or other Object Types):

http://docs.textadventures.co.uk/quest/ ... /type.html
http://docs.textadventures.co.uk/quest/types.html

adammadam
oh well I know I could make the "shady person" a container, but.. if hes one where you can see the objects in it without it being open, or hes an open container or a surface.. the menu of "which knife did you mean" will still pop up if you type in "take knife".. if he's a closed container where you cant see his knife.. the menu wont pop up as now theres only one visible knife in the room.. but also "look at shady characters carving knife" (or whatever) will not work either, because its not visible now. So if I did want two objects say "carving knife" and "hunting knife" and no menu to drop down.. I just have to rename one to "knife" I think...

magano
There are 2 solutions I've found so far...
One is to use unrelated names, because the "please choose which object you mean" menu only appear for partial and full match of names (the character's knife can be named charweap1 and the hunting knife as usual or vice versa)
Two is to modify the function that governed the menu, which is CompareNames. I have tried this method before and it worked, but you need to assign the default values for ALL conflicting object names

adammadam
I see how to do it now, editing the comparenames is what I was looking for, thanks.

magano
Glad to hear that
Remember that you need to set a reference for "take knife" (which is the takeable hunting knife on the ground) and every other clashes in your game in the CompareNames function

This topic is now closed. Topics are closed after 60 days of inactivity.

Support

Forums