From the NannyMUD documentation
2001-10-06
NAME
quests - rules on questsDESCRIPTION
DEMANDS ON NEW QUESTS * Random parts that prevents the use of scripts. * Testplay by mortal, i.e NOT only your test char or 2nd. * It must be approved before you open it. Beware, your area might be checked for Quality at this point. * The quest should be Nanny original, i.e. not exist on another MUD. * The quest should be coded in a way that keeps it alive, even after the creator has left Nanny. It should be easy to maintain and if the quest requires code from another wizard's area, the name of that wizard should be noted in files in the directories of all involved wizards, together with the nature of the link and the names of the files used. * The files used in a quest should as far as possible be kept off the game until the quest is approved. HOW TO CREATE A QUEST 1/ Start with writing a doc. (motivation, how to solve, random moments and a brief description of how to solve). Send the doc to the quest coordinator before starting to code. You will get permission to code, or ideas on how to improve the quest idea further. 2/ Code it, test it yourself, then ask permission to start testplaying. A good thing is to inform the quest coordinator the name of the test players. 3/ Get a fellow wizard to test-play the quest, preferable with his testchar. It is a good idea to snoop the tester to find even more bugs and ideas of further improvement. Ask the tester to mail comments to the quest coordinator, who will evaluate. 4/ Recode it! (If necessary) 5/ Decide, together with the quest coordinator, how many qp's it should be worth. Perhaps build a www page about the quest. 6/ Give the quest a unique name starting with your name, and write a hint that will be given to the players as information. 7/ In your castle, add code to put a quest object ("/obj/quest_obj") in the quest room ("/room/quest_room") once each reboot. 8/ Final approval given, and quest opened. PUZZLES Puzzles are here to reward the player for doing things the first time they do it. Puzzles need no approval and aren't mandatory to solve to become wizard. There are two functions to remember in /obj/player.c: set_puzzle() and query_puzzles(). See puzzles.r for more information. QUESTS A quest is a problem to solve for the mortals. NannyMUD have lots of quests and not only require the mortal to solve them to become wizard, but also to advance in levels. Any wizard may set up quests. MULTI AREA QUESTS To install a quest requiring code from several wizards areas, the responsible wizards have to consider the following things: * permission from the other wizards to use their code * control over the code used, or in some other way make the quest solvable even if one or more of the contributing wizards leave Nanny. REWARDS FOR SOLVING A QUEST A quest gives the player some quest points. You don't have to have any other reward. If you give a useful item, give it the first time only. If it's not useful, give it every time. FUNCTIONS TO REMEMBER Here is a brief list of useful functions. Take a look in the files for more details. /obj/player.c set_quest() query_quests() /obj/quest_obj.c set_name() set_hint() set_short() set_points() query_points() /obj/quest_mailer.c set_mailtext() set_other_wiz()EXAMPLE
AN EXAMPLE: THE QUEST "padrone" This example was written by Padrone once upon the time. It is still (February 6:th 1995) a valid piece of code, which shows that carefully written things will last longer. object qobj; qobj = clone_object("obj/quest_obj"); qobj->set_name("padrone"); qobj->set_hint("Padrone is sad. He built a beautiful walking "+ "castle, but a gang of pirates stole it and now "+ "he cannot find it any more. Help him to get it "+ "back!\n""+ "You don't have to be big and dangerous to solve "+ "this quest, but it's always a good idea to bring a "+ "weapon and some armour...\n"); qobj->set_short("Find Padrone's walking castle"); qobj->set_points(30); move_object(qobj, "room/quest_room"); To mark that a quest is solved, call the function "set_quest" in the player object. Example: if (this_player()->query_quests("padrone")) { write("Padrone says: What? Have you solved the quest again?\n"+ "But Ok, I won't be angry.\n"); } else { write("Padrone says: You found my castle! I am so happy!\n"); this_player()->set_quest("padrone"); }