Need help Creating new objects in inform7
Inform doesn't handle dynamic objects very well, but they're often not the best approach anyway. Section 10.3. Dispensers and Supplies of Small Objects in the manual may be helpful.
I think the best model for this is a physical one: create a limited supply of cans in the machine. For example:
Breakroom is a room. "A run of the mill breakroom."
A soda pop is a kind of thing. The description is "A refreshing soda pop."
The soda machine is in the breakroom. It is fixed in place and transparent.
The description is "Just an average soda machine, with a large dispense
button."
There are three soda pops in the soda machine.
The dispense button is a part of the soda machine.
Instead of pushing the dispense button:
if a soda pop (called the can) is in the soda machine:
move the can to the breakroom;
say "A soda can dispenses.";
otherwise:
say "The machine is empty, so nothing happens.".
Test me with "look / x machine / push button / look / push button /
push button / push button / look".
(make the machine opaque
rather than transparent
if you prefer!). In the above, I've also tweaked the description of a soda pop -- if you just say "Blah"
rather than The description is "Blah"
after an object definition, you set the initial description (printed as part of the room description) rather than the "examine" description, which I don't think is what you want here -- and I've made the button a "part" of the machine, rather than a separate object.
The result:
Welcome
An Interactive Fiction
Release 1 / Serial number 110324 / Inform 7 build 6G60 (I6/v6.32 lib 6/12N) SD
Breakroom
A run of the mill breakroom.
You can see a soda machine (in which are three soda pops) here.
>test me
(Testing.)
>[1] look
Breakroom
A run of the mill breakroom.
You can see a soda machine (in which are three soda pops) here.
>[2] x machine
Just an average soda machine, with a large dispense button.
In the soda machine are three soda pops.
>[3] push button
A soda can dispenses.
>[4] look
Breakroom
A run of the mill breakroom.
You can see a soda pop and a soda machine (in which are two soda pops) here.
>[5] push button
A soda can dispenses.
>[6] push button
A soda can dispenses.
>[7] push button
The machine is empty, so nothing happens.
>[8] look
Breakroom
A run of the mill breakroom.
You can see three soda pops and a soda machine (empty) here.
>
I wrote an extension to do this sort of thing: https://github.com/i7/extensions/blob/master/Jesse%20McGrew/Dynamic%20Objects.i7x
To use it, you'd have to create a prototype object (say, "the original soda pop"), then use the expression a new object cloned from the original soda pop
to instantiate the new object. This is more memory-efficient than creating a large static pool of objects, but it doesn't work on the Z-machine (only Glulx) and has some caveats if your objects are complicated.
Also, think seriously about whether you really need dynamic object creation. It may be easier and less confusing for players if you just come up with a sensible reason to reject the action, like "You can't bring yourself to spend the money when you haven't even finished the last soda you bought." Having a couple thousand soda cans lying around is likely to make the game slower without adding much benefit.