About limiting taken Objects [Solved]
Wallanda
29 May 2019, 16:50I'm fairly new to Quest and coding in general, and probably getting ahead of myself with this...
I'm trying to make a sort of RPG, but I hit a wall trying to figure out how to limit the things the player can take before moving on.
Like, I want them to pick 2 things from a selection of items and once they do - force them to the next stage of the story with those items in their inventory.
Thanks for any help in advance!
devilmaymoan
29 May 2019, 19:09there is probably a better way to do this but you could trigger a menu that asks which combination of objects they want to take.
object 1+2
1+3
2+3
and once the selection is made move the 2 object to the player inventory and then move the player to the next room
would look something like this
objchoice = split("hat and vest;vest and glove;hat and glove", ";")
ShowMenu ("What do you want to take?", objchoice, false) {
switch (result) {
case ("vest and glove") {
msg ("you chose the vest and glove.")
MoveObject (glove, player)
MoveObject (vest, player)
MoveObject (player, room2)
}
case ("hat and glove") {
msg ("you chose the hat and glove.")
MoveObject (hat, player)
MoveObject (glove, player)
MoveObject (player, room2)
}
case ("hat and vest") {
msg ("you chose the hat and vest.")
MoveObject (hat, player)
MoveObject (vest, player)
MoveObject (player, room2)
}
}
}
devilmaymoan
29 May 2019, 19:16you can script that in the room1 description and put the 3 object in a object or hidden room. when the player make a choice he will receive the items and be moved to room 2 .
there is no chance of him taking anything since the object are not there with him in the room.
mrangel
29 May 2019, 21:39If it's objects in the first room, then I'd say put a custom "take" command in that room. It will run instead of the default take command as long as the player is in that room.
I'd copy the pattern from the built-in take command, to make sure it matches all the same cases. And then give it a script like this:
// A list of objects - in case there's objects in the room that can't be taken
limited_objects = Split("bell;book;candle;hat;tea")
// how many the player can take:
objects_to_take = 3
// take the object they've selected
DoTake (object, false)
// check if they've got too many objects
foreach (obj, limited_objects) {
if (Contains (game.pov, GetObject (obj))) {
objects_to_take = objects_to_take - 1
}
}
if (objects_to_take < 0) {
msg ("This shouldn't be possible, but you've taken too many objects. Please drop one.")
}
else if (objects_to_take = 0) {
msg ("That's it!")
MoveObject (game.pov, the next room)
}
else {
msg ("You can take " + objects_to_take + " more objects.")
}
Wallanda
30 May 2019, 08:55Update:
Alright, so
-
devilmaymoan's option works, but there's way too many combinations for the game screen. I'm having the player choose from several weapons and there's quite a number of them.
I'll explore that code a little more and, if anything, I'll chop down the number of given weapons for comfort. -
mrangel's looks to be exactly what I need, but when I try to configure it with my own objects and rooms the game shows ''Error compiling expression 'object': Unknown object or variable 'object' ''.
It might be that it's messing with my code to give the player a shortsword if they choose to err ''take/pick'' ransack the Swords pile. Once again, I'm a noob, still learning stuff.

Io
30 May 2019, 16:01mrangel's looks to be exactly what I need, but when I try to configure it with my own objects and rooms the game shows ''Error compiling expression 'object': Unknown object or variable 'object' ''.
I don't think you're supposed to actually put 'object'. Put the name of the object in question.
mrangel
30 May 2019, 16:18Hmm… I'm not quite sure, but I would assume the pattern for that command is something like ^(get|take|pick up) (?<object>.+)$
if it's a regular expression? object
should be defined.
It might be that it's messing with my code to give the player a shortsword if they choose to err ''take/pick'' ransack the Swords pile.
That's why I called DoTake
to do the actual picking up; so that objects with custom take scripts still work fine.
If you've got any other commands which cause the player to gain items, you'd presumably want to change those too.
XanMag
30 May 2019, 19:11Here’s what I have done in the past (and I will clarify if needed (just ask)):
I create a integer counter that subtracts from 2. Then I subtract one from that counter if an item is picked up and add one to the counter if the item is dropped. Once two items are picked up the counter reaches zero and I put an if counter equal to zero script on the take command as well prohibiting the player from picking up of a third item.
This works well given that you either close the room, remove the items in question, close the shop... basically you would need to prevent the player from carrying things wherever they want, dropping them, and picking up more than a second item.
Sounds like it might be messy but it is the method that works for me. Let me know if you need to see examples or code.
jmnevil54
30 May 2019, 19:21Do you want to know how I've done it? I 've created an attribute, like player.items = 0
and everytime you take an object, add one to it player.items = player.items + 1
.
Then you change the take object's command to a different script.
if (player.items > 9) {
player.items = player.items + 1
add to inventory (object)
}
else {
msg ( "You are carrying too many items." )
You will need to change the drop command's code as well, to subtract one item from the attribute. player.items = player.items - 1
Edit: Needed to add ` things
Wallanda
01 Jun 2019, 16:22I took another look over mrangel's suggestion. I thought I figured it out, but now the problems are:
- When I Play the game and choose the Swords pile it says '' You can't choose it.''
- Meanwhile for the other piles it drops an ''Error running script: Too many parameters passed to DoTake function - 10 passed, but only 2 expected'' ok nvm solved that somehow
Now I just have all the choices giving me the result that I can't choose them...
Edit: Apparently there was a Verb with ''"You can't choose " + object.article + "." Expression, which I don't remember creating. Alright, well, obviously I'm loosing my mind here.
Taking out the Verb it now prints that it doesn't understand my command in that room so I'm at a loss
mrangel
01 Jun 2019, 22:58What is the pattern for your custom take command?
If it's saying that it doesn't understand your command, possibly the pattern isn't matching the command you typed.
Can you show us the game? Might be easier to find the issue that way.
Wallanda
02 Jun 2019, 09:25Oh wait! It works!
There WAS a mistake in the take command pattern I had set. The facepalm was mighty...
The correct pattern that now let's the whole thing work:
take #object#; get #object#; pick up #object#; Choose #object#
Thanks, mrangel!