HandleSingleCommand - take #object#

Doctor Agon
14 Nov 2017, 23:16Hi all. I need some help and guidance with the following.
In my game, I have two similarly structured routines:
The first involving a statue:
if (GetBoolean(player, "stand")) {
statue.take = true
HandleSingleCommand ("take statue")
}
else {
msg ("It is too high for you to reach.")
}
The second, involving a rope:
if (GetBoolean(this, "tiedto")) {
msg ("You can't take it.")
msg ("The rope is attached to the " + GetDisplayAlias(rope.attachedto) + ".")
}
else {
HandleSingleCommand ("take rope")
}
Both routines run as scripts on the 'Take' script of the 'Inventory' tab of the objects in question.
The first, involving the statue, works every time. The second, involving the rope, causes Quest to shut down and stop working.
Any ideas on why one works and not the other would be greatly appreciated.

DarkLizerd
15 Nov 2017, 03:43Could it be the "tiedto" and "rope.attachedto"???
The Pixie
15 Nov 2017, 08:10It is because the second gets Quest into a loop. You are doing TAKE ROPE inside the script for handling TAKE ROPE.
The script runs, and does TAKE ROPE, which causes the script to run, and does TAKE ROPE, which causes the script to run, and does TAKE ROPE, which causes the script to run, and does TAKE ROPE, which causes the script to run...
mrangel
15 Nov 2017, 11:20You missed out the this.take = true
in the second one.
Though calling HandleSingleCommand is probably a little inefficient. By the time the take script is called, it's already checked that the player has space in their inventory and everything else. So it might be easier just to move the item into the player's inventory rather than parsing the whole command again. (Or, have the tie/untie verbs (or whatever code is setting tiedto
) also set this.take
to be true or false, in which case a take script isn't really needed)

Doctor Agon
15 Nov 2017, 11:25I thought myself that Quest was in a recurring loop, and that's why it stopped working. But, if that was the case, why does the first script involving the statue work. That follows the same pattern; 'TAKE STATUE' which causes the script to run, and does 'TAKE STATUE' which causes the script to run, and does 'TAKE STATUE' which causes the script to run, and does ...etc
mrangel
15 Nov 2017, 11:35The first script works because it does statue.take = true
. Once take
is no longer that script, the script doesn't get called again.

Doctor Agon
15 Nov 2017, 21:10Yes, of course. Bangs head against fist. Thanks mrangel. I should've spotted that.
It's good to have another person check your work.