Top MUD Sites

Main
Home
About this Site
MUD Forums
MUD Articles
MUD Reviews
TMS Rules
Our Affiliates
Advertise with Us
Feedback

Top MUD Sites
Add your MUD
Edit your MUD
Sites 1-20
Sites 21-40
Sites 41-60
Sites 61-80
Sites 81-100

BAT Mud

Articles Section
How to Make Quests "Cheat Proof"

When I first started to make Quests, I was very trusting and naive. I actually thought that the players would do the Quest once and then walk away happily with their reward, and that would be it.

Needless to say, I soon found out otherwise. The players immediately started to abuse the Quests. They'd steal the quest item that they just gave to a mob back, to be able to give it again, they'd summon the Quest mob to Recall to save a few steps, they'd do the same Quest over and over again to collect the tokens, they'd sell or give away the Quest equipment, etc. And naturally they told everybody else in the mud how to do it too.

So gradually we learnt how to make the Quests practically cheat proof. It took a lot of time and effort, and a lot of whining from the players, when they suddenly found themselves deprived of their favourite little cheat game. And there may still be some things we've missed, but we've come a long way since we started.

In this paper I've put together a few methods that you could use, to prevent the Quests from being abused. Again the script examples I use are from DG_scripts, so those of you using mob_progs, will have to figure out the equivalents in your syntax.

First of all there are some basic precautions that you should employ, unless you want all Quests to be abused.

1. The first measure would be to make the Quest mob go away and purge itself directly after the Quest is completed. In this way the Quest can only be done again the next time the zone resets, which should take at least an hour or two.
2. Make sure that all Quest mobs are set as !summon, !charm etc, or the lazy players will just summon them to Recall to save a few steps.
3. If the Quest involves receiving an item from the mob in return for something you give him, make sure that the mob junks that object at first possible chance, so the player can't steal it back and give it again. Or just set an AWARE flag on the mob, if you want him to keep the item for a while, to make it look good. You can make the room PEACEFUL too, which will also prevent stealing.
4. If the mobs gives the reward in return for something you say or do, make sure it cannot be got several times by repeating the phrase or action.

A Quest is only really hard the first time you do it. The second time it may still involve some time and effort, but all the brainwork is already done. So naturally the really BIG award should only be given once. There are several ways of handling this, depending on the type of Quest and reward:

The easiest one, which doesn't need any support neither in code nor in scripts, is to make the item that the Questor receives not the actual Reward, but a 'Note to immortals'. You need to have a specific Quest Master imm, who receives the notes, exchanges them for the actual reward and at the same time keeps a list of all the players that fulfilled the Quest. Actually I think this is the method preferred by the mortals, since most of them like interacting with imms - it makes them feel important. Provided of course that the Quest Imm is on line enough, so they can get to him.

You can also instruct the Quest Master to ask some basic questions about the Quest, to stop the 'Black Market' in Quest notes that sometimes develops. If the player who presents the note cannot answer these questions satisfyingly, he obviously didn't do the quest himself. If you wish to be very meticulous, you could also check for their isps, so they don't create multis just to cash in the Quest reward. All of this takes some time though, especially if you have hundreds of players, and it needs the responsible Imm to be on line quite a while too. So it may be better to resort to methods run by code or scripts.

Personally I never bother with checking isps. If the Quest are put in reasonably remote zones, with some dangers on the way, they'd have to work up the strength of the new char before being able to go there. And for the Quests in low level zones that are easily accessible, the reward should be so small that it doesn't really matter if they do it several times.

You can also make a script stopping low level players from entering the Quest zone:

if %actor.level% > 30
  wait 1
  %send% %actor.name%  Someone tells you, 'Welcome to the Quest Castle, %actor.name%!'
else
  wait 1
  %send% %actor.name% Someone tells you, 'You are too young to get in here, mate!'
  %teleport% %actor.name% 3001
endif

But there are also ways to make scripts, which restrict the Quests in different ways, for instance:
1. Stop the same player from doing the same Quest more than once
2. Give out a lesser reward after the first time the Quest is performed
3. Set it so that only the player who actually performed the Quest can use the reward

We use all three methods in 4D, depending on the circumstances. I'll give examples of scripts for all these options below. The if-checks most likely need some code support to be implemented, if this isn't already in your mud. Of course the entire restriction bit could just as well be set in code too, but since the scripts run pretty smoothly, we've chosen this method. It also means that the Builders can finish their zones on their own, without asking for code support all the time.

1. Stop the same player from doing the same Quest more than once

The most obvious drawback with this method is of course that you need a lot of Quests, or your players will soon run out of entertainment. Also it is a bit of a waste, if a large part of the zones cannot be played more than once. But the main drawback is, that if the reward is a piece of good equipment there will be no way for the player to get this back, if he walks into a DT or gets looted.
So we use this option mainly for 'Riddle Quests', where the reward is a token of some sort. Once you've solved the riddles, there is no challenge left to the Quest.
What you need to do is to put a permanent - (remote) - flag on the pfile of the questor. Unlike the 'global' flag this flag stays whether the player dies, logs out or loses link.
Then you make a script for the first room of the Quest that simply transfers him to Recall, next time he tries to enter. He can of course start a new char to do it again, but if the Quest is in a high level zone, with a few aggros on the way, this won't be a big problem. Otherwise just set the script to check for the level of the player too, and transfer everybody below say level 30 to Recall.
The necessary scripts are shown below.

In the last room script, put the lines:
  set riddle1_complete 1
  remote riddle1_complete %actor.id%

In the first room of the Quest, use the following script:
if %actor.varexists(riddle1_complete)%
  wait 1
  wsend %actor.name% Someone tells you, 'You already did this quest once, mate!'
  wsend %actor.name% Someone tells you, 'Figured you'd get some easy tokens, uh?'
  wsend %actor.name% Someone grins evilly at you.
  wteleport %actor.name% 3001
else
wait 1
  wsend %actor.name%  Someone tells you, 'Welcome to the Riddle Castle, %actor.name%!'
endif

2. Give out a lesser reward after the first time the Quest is performed.

This is a very simple method and also pretty popular, since some players actually like repetitive actions. So even if you don't get more than a tenth of the initial reward, you can still collect tokens for the same Quest, if only you are persistent. Naturally you don't need nearly as much time and work either, once you figured out what to do. We even have players who set up aliases to perform a certain Quest as fast as possible, and do it every time they log on. I cannot say that I actually LIKE this, but then again, I don't care about it enough to prevent it either. If they want to do it - let them. Killing mobs to get exp is repetitive too. And after all the zones only reset every two hours, so that puts a natural restriction to things.
The script to do this could look like below:
--
if !%actor.varexists(serena)%
  set serena 1
  remote serena %actor.id%
  wait 1
  %load% obj 1201
  say Thank you so much, %actor.name%!
  say here is a reward for your trouble.
  give silvertoken %actor.name%
else
  wait 1
  say You already did this Quest before, %actor.name%!
  say So the reward will be smaller this time.
  %load% obj 1202
  give bronzetoken %actor.name%
endif
--
This will make the Quest mob Serena hand out a silver token the first time the Quest is performed, and a bronze all following. The two lines
  set serena 1
  remote serena %actor.id%
set the permanent flag on the player.

3. Set it so that only the player who actually performed the Quest can use the reward

When we first implemented this, there was a storm of complaints. Quite a few of the players left in protest, when the equipment they had bought or been presented suddenly fell off and crumbled to dust. Of course the ones that whined the loudest - or even left the mud- were the worst players, so the loss wasn't all that great. The ones that already knew how to do the Quests, were mostly pleased with the change, even if it meant they had to redo some of them. After all, it made their own achievement more worth in the eyes of others too.
The more sensible of the rest actually started to pay a bit more attention to room descs and other things, and consequently became a lot better players than before. A few of the more notorious 'Bonkers' even developed into enthusiastic Questors eventually. And eventually most of the Twinks that left returned too.

The main advantage with this method is of course that the good players get a chance to retrieve the Quest equip in case they get looted or lose it in a DT, while at the same time stopping the 'Black Market' that otherwise can develop in Quest Equipment.

The necessary scripts are shown below:

On the Quest mob set the following script when the quest is completed:
--
if !%actor.varexists(whatever)%
set whatever 1
remote whatever %actor.id%
endif
--
This sets the permanent flag on the player. Then you set a WEAR script like the one below on the object:
--
if !%actor.varexists(whatever)%
wait 1
%echoaround% %actor.name% This pathetic creature isn't worthy of using this item!
%send% %actor.name% You didn't do this Quest yourself, %actor.name%.
%send% %actor.name% So what makes you think you are worthy of the Reward?
opurge %self.name%
else
%echo% %actor.name% looks very impressive in his Shining Armour.
endif
--
This will make the equipment disappear without a trace when worn by someone, who didn't do the Quest. If you want a message to the player about it crumbling to dust, you will have to add a line with an echo about it. (This might be a good idea to do, unless you want the more paranoid players to start accusing others of stealing their most precious item).

There are also ways to make scripts that stop you from giving away or getting a Quest item unless you made the quest yourself:

-------
Quest Items - Carving Knife - Give~
1 i 100
Commands:
if %victim.varexists(Q7_Completed)%
return 1
else
%send% %actor.name% A strange force looms around the knife, stopping %victim.name% from taking it.
return 0
endif

-----------
Quest Items - Carving Knife - Get~
1 g 100
Commands:
if %actor.varexists(Q5_Completed)%
return 1
else
%send% %actor.name% A strange force looms around the knife, stopping you from taking it.
return 0
endif

The ultimate problem
The methods shown above will stop most of - if not all - cheating with Quests. However, you still have to deal with the main remaining problem - the Blabbermouths. Those 'helpful' players, who will reveal the secrets of the game for different shady reasons of their own; to become popular, to show off, to get something in return, out of pure mischief, even out of spite towards the mud or some of the imms.

There is really nothing you can do about the Blabbers, unless you run a mud of Gestapo type, which snoops and logs all events. That is not my idea of a fun mud. So I prefer to live with the Blabbers. And even if you DO run a Gestapo mud, you cannot prevent it all. The players will use ICQ, chat rooms, e-mail or even web pages for their messages, and if they have reason to dislike the imps, the risk is all the greater that they'll go to extremes. I once saw a 'Cheat Page' on the net, which revealed practically all the game secrets in a pretty well known mud, and the address of that page was spread on various discussion boards. The imp in Question is no favourite of mine, but in this case my sympathies are all on his side. NOBODY deserves a low blow like that to their mud, whatever real or imagined wrongs they might have done to the persons that ran the page. The scary thing is, that once you know about such a page existing the temptation to check it out becomes all too overwhelming. I bet a majority of the active players visited that page during the time it was up, until it was stopped by the owner of the mud.

In our mud we try to deal with the Blabbers as best we can, by using 'psychological' methods. Appealing to their sense of pride over their own achievement. Asking them if they think it right, that others should get for free what they themselves had to spend hours of hard work and brainwork to acquire. Telling them that the more people that get the item, the greater is the risk that a maximum is reached, preventing them from retrieving it themselves, if need be. Uttering dire threats about purging their equip if we find out that they are blabbering, and enforcing it too when we have solid proof. Setting a CHEATER flag on blatant cases, so the Quest mob throws them out of the room next time they enter, with an insulting message.

But nothing really helps in the long run. At first the strategy works, when only a few good players know of the secrets. The good ones rarely blabber to others about what they know, because they are aware that knowledge means power. But the more players who find out how to do a certain Quest, the greater the risk becomes. Sooner or later someone starts to blabber. Someone tells his best friend, or girlfriend or Clan Leader - 'in confidence'. Pretty soon it starts to spread. The ones who have been TOLD the solutions instead of finding them out themselves are not nearly as reluctant to spread the info. Next they'll ask someone to 'tank' to get past a tough Quest mob and offer some hint in return, then they'll tell all their Clan mates, then they'll start selling or trading the hints or solutions... And so it keeps spreading, like rings on the water, until the entire mud knows and another Quest is ruined.

By then there is not much to do, except to lower the reward considerably, remove the Quest entirely, or change it so radically that everybody has to start from scratch again. Another possible measure could be to remove access temporarily to the Quest, and put it back in a few months, when most of the players have forgotten about it. But all this means that ALL the players suffer, the good ones as well as the bad. It also means more work for the eternally busy Builders... I guess there is no easy way out of this…*sigh*...

Molly O'Hara of 4 Dimensions

------------------------------
About the author:
Molly O'Hara has been a Builder for more than 4 years and has over 40 zones to her name by now. Since several years back she is the Head Builder and one of the three imps of 4 Dimensions.
4D is a Time Travel mud, specialising heavily in built-in Quests, and the mud has some of the most challenging and advanced Quests that can be found on line.
E-mail: molly.4d@swipnet.se
Address: Homepage: http://www.4d.mud-puddle.net
Mud: 209.43.5.222 port 6000