This tutorial intends to highlight the necessary steps to make an in-game store where the player can buy objects midgame at the cost of loosing some loot. Also, it is a learning tutorial, and will not tell you how to do the store straight off, 'mistakes' are made along the way as I felt it would be more logical this way. The end product will allow the purchasing of items until the player runs out of money, then the store has to shut. I already have worked out a better system that does not shut, but that is more complicated still.
This tutorial is for ADVANCED dromed users, who are fairly comfortable with basic-intermediate dromed operation. A basic working knowledge of sources/receptrons is assumed and there will not be much hand-holding.
IMPORTANT: the system involves assign a source/receptron relay system on to the Avatar Garrett so that he can interface with objects via that method, (essentially a custom stim source, and a receptron a Garret that bounces the stim back to the object that gave it) and so needs a custom gamesys with such a system on it. See tutorial on teleporting garrett for details on how to do this, or download the level with my gamesys included or simply the gamesys itself, once you have the .gam file, copy it to your thief directory and within dromed use the command 'set_gamesys actreact' and then save your mission normally to register the change. If successful, the dark.gam on the status bar should change to actreact.gam.
The tutorial starts from a basic level with all necessary scripts, starting points loaded. Also, it is a learning tutorial, and will not tell you how to do the store straight off, 'mistakes' are made along the way as I felt it would be more logical this way.
The first step is to set up your 'buying' stand. Within your basic level, create a table, and put the object you wish to be 'bought' on top of it. In this tutorial to start with I am going to buy a bread loaf. Also, place a marker called 'StoreTarg' where you want the objects to appear from once they have been bought. The object on the table is a store copy, and will not actually be picked up by the player.
Rename the loaf to 'BLoaf' for future reference, and add->Scripts, then delete the eat food script. Create a tall blue room. (A blue room is an area that is otherwise impossible to get to, it will be useful to see what is going on in the room at the moment, so create them next to your main room) This room is essentially going to be used for a kind of disposal chute, when the player uses the loaf we will create a copy of the loaf we are going to give at the top of this room, and when it hits the bottom it will be teleportedto the marker in front of the player. The first step to do this is to create a marker at the top of this blue room, name it 'StartChute', and then to create a banner at the bottom under this marker and to rotate so an object falling from the marker will eventually hit it. Any object is viable for this, but a banner is nice and big as standard, and doesn't have any scripts associated with it that could slow the game down. Create a mini-blue room as an object store, this room will contain the master copy of our loaf. Create another loaf now, and name it MasterLoaf, but there is a problem with this that we will discover later.
Go back to the loaf on the table, and change its frob properties [Add->frobinfo] so that when you frob it doesn't move to your inventory but the loaf can still be frobed - change the frobinfo so it only says script under World frob. Now, we need to add a source/receptron tags to get the object to interface with player in stimulus terms. If you are using the totality.gam provided, just give the loaf a source, stimulus TotalityStim of level 10, engaged on contact, Frob in World only. Now add a receptron, TotalityStim, min of 0, no max. For the effect, select Create Object, target object MasterLoaf and agent object StartChute. This now means that when you frob the loaf on the table, a bread loaf clone will appear at the top of the chute room. If you go into game mode, and if you can get to your blue room, you'll notice that it doesn't actually fall. For this to work it must be able to fall, so change the Master Loaf so that it has Physics->Model->attributes, and this should engage gravity.
The next step is to assign a receptron to the banner, Totality Stim, min 0 and max 5, and a Teleport Object Effect, target object is Source, agent object is StoreTarg. This will set it up so that when any TotalityStim source hits the banner it will be teleported to the table marker. Add the TotalStim source to the MasterLoaf now, Totalitytim, Contact, Collision, intensity 3. Go into the game and try it.
It doesn't work.
What is happening is that the TotalityStim source is not being copied when the loaf is created. You can see this by saving your level, and then executing the command 'set game_mode_backup 0'. This tells dromed not to reset your level after returning to dromed, and allows you to see what state the level is in when you leave it. Be warned though, that saving after doing this could result in instabilities, so after checking what you want, reload and set the backup back to 1. In this case, you want to frob the loaf on the table, and then exit out and have a look at the loaf now lying on the banner. It has no source even though we added one to the template loaf. Remember to 'set game_mode_backup 1' and reload your level.
This is no problem, just modify the gamesys and add the source there.. Create a new archetype under the original loaf named 'BuyLoaf' (click on the normal loaf entry then add) When the screen pops up add the TotalityStin source, contact collision only intensity 3, while we are here we may as well give the archetype basic physics properties as well so it falls. Now save the gamesys. If you are using the one at the start of the tutorial just File, Save Gamesys and overwrite it. Delete the previous MasterLoaf, and create a new one from our new template, and name it MasterLoaf again. As we deleted it, our receptron on the table loaf has gone, recreate it with the same settings as before. Now when you try it frobing the loaf will create a new one at the top of the chute, it will fall and hit the banner, and then be teleported in front of you!
Now, create a a reasonably sized blue room, create a rotating door about midway height horizontally (bank 90 so that it opens downwards), making sure that it has plenty of room to open. Name it Purse. Edit its properties so that it has lots of max hitpoints, as many as the theretical max loot tally, I shall use 1500 and give it a slay result of terminate(Add->Game->DamgeModel for both). Then set its current hitpoints to 10. This door will hopefully mirror the amount of loot the player has, so we better give the player some loot to start with. Create a stack of coins in the object blue room, and link the starting point to the stack via the contains link, and change the loot value to equal 10, (Add->DarkGamesys->Loot). Now Garett has some money to spend, and now it gets complicated.
Create a flower pot on top of the door, named OutCheck. Create another banner on the floor underneath both the flower pot and the door, call it EngageBlock. Now, we need a marker created slightly above the centre of the first banner. Do this and name it 'TargBlock', and in the Blue Object room create a third banner, named 'KillObject', and rotate so that it is like the other two banners (Make sure that MasterLoaf won't fall onto it otherwise it will trigger the receptron we are about to add)). Give the KillObject banner a receptron, TotalityStim, min 0 max 5 effect is to Destroy Object, target Source. Add a receptron to the second banner, EngageBlock, min 0 max 12, but with the a Teleport Object effect instead, target is KillObject and agent is TargBlock. So, when the second banner triggers it will teleport the third banner in front of the first, and it will destroy any loaf that falls on it. Now, give the flower pot a totality source, intensity 3, engaged on contact, collision. If you check this by manually forcing the pot and banner to collide, you'll notice that the indeed the KillObject banner is teleported, but it resets to its default banking, ie vertical. Edit the effect for the teleport receptront of the second banner that teleports KillObject, by clicking on edit effect under the receptron. Then type in 90 under the bank option. Now, we need to link in the buying process to losing the hitpoints on the door
. To do this, create another receptron on the loaf on the
table with the same settings as the previous one, but for the effect choose
damage object, and Target of purse, edit the effect, and select damage
type 1, and then set how much you want your loaf to cost in 'Then Add'
box. For this tutorial I chose 3. Now, you will be able to buy three loafs,
and then the door will be destroyed and the blocking banner will teleport.
Of course, as yet the players loot total will not go down, so lets fix
that. Create a new object archetype, under the Treasure->Swag->LucreLoot->
heading, called Receipt, and Add Shape->ModelName of 'hamscrol' (like
a receipt) and add a negatvie loot value of -3. Remember to add this to
the the actual Receipt archetype not the others. Add physics settings
so it can fall,also, give it a TotalityStim source, intensity 7 (note
the 7), propgator contact so that it can go through our teleport chute
routine. Save the gamesys (or you could wait a bit as we are going to
change it again, but it is good practice to save)
Unfortunately, you can't teleport the loaf to the inventory, as the PlayerFrob command effectively eats the loaf rather than picks it up. Now, you can buy three loafs, but when your total gets down to 0 you can no longer buy any!!! One important thing to note, is that the time taken for the flower pot to hit its banner has to be less than the time taken for the chute to complete its cycle, otherwise you might be able to get into negative loot.
This is the first stage, the next is to link every piece of loot in your level so that when you pick it up, it heals the door slightly. Lets create some more coins stacks in a chest on the other side of the room. Create a silver stack and link it to the chest via the contains link As the stacks will be in the chest, we will need to add the soucr/receptron to the chest not the stacks themselves as that is what the player frobs.. All 'tresure' will have to be linked like this (See UPDATE at end), or you could specify only coins to decrease the work you have to do. Add a Totality source/receptron system to the chest. For the source, intensity 5, on Contact Frob in World only . Receptron, no max, Damage Object, target Purse, edit effect 'then add' negative numbers to heal the door. This number should represent the money gained by the player when the object is picked up either directlry or indirectly. For one silver coin stack, it's -12. For two in a chest it would be -24. When you now open the chest it heals the door. Go in and try it.
Can you guess the problem? Whenever you use the chest, it always heals the door, even though your loot total hasn't increased. This happens as we have set the healing process to trigger when the chest is frobbed. How do we get around this one? Well, we somehow need to terminate the healing process after it has been intialised once and the easiest way of doing that is to destroy the object, but we don't really want the chest to disappear. Instead create a marker near the chest named 'OpenCheck'. Add the receptron to the marker with the same settings as before, healing the door -12 points. Now, also add another receptron with the effect of destroy object, with the target being 'me' ie the marker itself. Now, go back to the chest and edit the receptron so that when it is triggered it Stimulates Object, target OpenCheck, stimulus TotalityStim, Then Add 6. When the chest is now triggered, it transfers the coins to your inventory, triggers the marker, which then heals the door and destroys itself severying the healing link.
Unfortunately, the system still has its limitations. One thing to bear in mind is the timing of the chute, if it is too long then the player can rapidly click to beat the system, fix this by increasing the drop, though still making sure that when the door is destroyed the system stops. But the major limitation is that once the door has been destroyed, the links are effectively removed, so there is no way of re-initialising the system.
In other words, once you have run out of money, that is it:-( Even though you may be disappointed, it can still be used in game as a temporary store. You could have a vendor, manning the stall (which would make sense), who get's annoyed at you when you run out of money and kicks you out of his shop and locks up. See attatched example file for this, ignore the room with the levers and inverters, it is simply there to handle the portcullis shutting. The technique is also good for other counter usage, and doesn't even need to be as complicated. For instance, it can be easily modified to limit the number of knockouts that you can do on a level, or the amount of times you do anything that can be linked to the system, which is just about anything.
If you REALLY want a permanant in game store, then look at the next tutorial.
If you need help, write me, firstname.lastname@example.org or go to the Forum, http://www.ttlg.com. And if you don't want to be labeled as a newbie, use the Forum's search function first!