This is either a very simple or very difficult request, I'm not sure which. Essentially I want to be able to do the following:
If the player types 'use hat' it will present a question: Do you mean you want to wear the hat? Yes/No and if you click yes it calls the verb: wear hat. Making the question is straight forward but I don't know how to call a verb. I can simply set hat.worn=True but it doesn't run the text 'You put on the hat'. I can add this manually but it seems like clumsy programming. I've tried the do, eval and invoke commands but not getting anywhere...
Thanks in advance!
Quest's built-in wearables system provides a function to make it easier to do this:
_DoWear (hat) UpdateArmour()
(you don't need to UpdateArmour unless you're using the armour feature of wearables)
Several of the built-in commands have functions like this to make it easier to do them from code, like
TryOpenClose (door, true) or
DoDrop (object, false). But not all of them do. And I figure that while you asked about "Running a command/verb via a script", I should also give you an answer that you can use for any command:
There's a few ways to do it; useful in different situations.
Method 1 will nearly always work, but if there's more than one hat around it will give the player a menu asking which one they meant. Just as if they'd typed that command. Methods 2-4 don't have this problem, but which one you use will be different for different commands. (For example, in my current game, method 2 will work for "eat", method 3 will work for "wear", and method 4 will work for "stab". It depends how the command was originally coded)
HandleSingleCommand ("wear hat")
params = NewDictionary() dictionary add (params, "object", hat) do (lookat, "script", params)
(this runs the 'script' attribute of the command 'lookat', putting the hat into that script's 'object' parameter. I'm using "lookat" in this example, because this method doesn't work for the default implementation of "wear")
objects_to_wear = NewObjectList() list add (objects_to_wear, hat) dictionary add (params, "object", objects_to_wear) do (wear, "script", params)
(This is the method that will work for "wear" or "take", I believe. It's for commands that can understand multiple objects)
do (hat, "wear")
(This will work if you see the verb on the "Verbs" tab when looking at the object)
Thank you so much for such a detailed reply. I wish I'd known some of this when I started programming a few months ago, my code would be a lot neater! Method 1 works perfectly, method 4 is the one I tried before but I just got the error message:
Error running script: Object reference not set to an instance of an object.
Not sure why. Anyway, thanks again! I'll try the other methods down the line if required.
Maybe worth mentioning that method 2 is the one you want if you're doing a command that has more than one parameter. For example, if you want to programatically call the command
put #object1# in #object2#, you would use:
params = NewDictionary() dictionary add (params, "object1", bunny) dictionary add (params, "object2", box) do (put, "script", params)