----- How to Make a Monster ----- Welcome to the LRPG Monster-Making tutorial. This text is designed to ease the pain of learning how to create and customize beasties for use with the LambdaMOO RPG. If you have any comments on its effectiveness, feel free to mail Quinn@LambdaMOO. -- That little ~ thing Throughout this tutorial (and in GM code and discussion *lists) you'll see something like `~monster'. The tilde means that the word refers to a property on $local.rpg (#46@LambdaMOO). To find the exact number of that object, type `@d #46.'. For example: >@d #46.dungeon |.dungeon Grand_Master (#2693) r c #258 |-------------------------------- finished------------------------------- ~dungeon is #258 (on LambdaMOO). --- Terms monster -- Any Non-Player Character (NPC) dungeon -- Any LRPG-ready room. Usually a kid of ~dungeon. --- i-props The first thing you'll probably want to do with your monster (after @describing it, of course), is set some of its attributes. Working attributes in LRPG are stored not on the character itself, but on the character's voodoo doll. The properties on the voodoo doll are, in many cases, accompanied by an i-prop on the monster. An i-prop is so named because the property's name is that of the corresponding voo-doo doll attribute, preceded by an "i". When your monster is born (:birthed), all the properties on it are looped through. When an i-prop is found, the appropriate of property on your monsters voodoo doll is set to that value. For example, let's you want a a monster, "Fred". You decide Fred is your typical lummox-- muscles all over, especially between the ears. Here's what you'd do: >@create #259 named Fred |You now have Fred with object number #62642 and parent generic monster (#259). >@desc Fred as "A big dumb ox. You'd be very afraid if he didn't look so damn stupid." |Description for Fred (#62642) set. >@set Fred.istr to 18 |You change the "istr" property of Fred (#62642) to 18. >@set Fred.iint to 6 |You change the "iint" property of Fred (#62642) to 6. When you birth Fred, he'll have a strength of 18 and an IQ of 6. --- Summary of verbs on ~monster - ~monster:birth Bring a monster to life. You'll want to call this when you've set all the appropriate stats on your beastie and are ready to unleash it on the hapless masses. If the value of your monster's `gestate' property is greater than 0, it will be automatically birthed that many seconds after it dies. - ~monster:duty This verb prepares your beastie for its new life. Grabs its stuff, readies weapons and armour, and sends it home. Don't bother dutying a monster if you've already :birthed it. :birth does this for you. Duty a monster when its already alive and you want to start it out fresh. - ~monster:abort Kill the monster's doll, making it non-LRPG. - ~monster:act This verb is called whenever someone :invites an action in an LRPG room. Its useful for programming special combat behaviour into your monster. Be sure to pass(@args) after you're finished doing whatever you're doing, else your monster won't attack when it's supposed to. - ~monster:procrastinate This verb is called when by :act when your monster isn't attacking anyone. It is a simple hook for random actions on a monster. For example: @verb fred:procrastinate tnt @prog fred:procrastinate if (random(10) == 1) this:do("say Man I be itchin' for a fight."); endif return pass(@args); .. The :do verb simply processes a line of text and makes your monster perform it as if it had typed it in. So--with the above verb, every now and then between fights Fred would grumble about wanting to rumble. The random check is so it doesn't happen all too often. Remember that every RPG action in an LRPG room will trigger :invite, which in turn triggers :act. Note the final line. As always, remember to pass(@args). - ~monster:look_self and ~monster:look_gear If your monster's `animal' property is true, its contents won't be shown when a player looks at it. - ~monster:look_health Shows the general physical, mental, and emotional condition of the monster. - ~monster:cancel_rebirth Cancels your monsters rebirth, forked from :die. You probably shouldn't be calling this. - ~monster:"notify_*" LRPG has a simple `event' system which notifies your monster of important events in its environment. See the help on one of the following verbs for details. notify_aggression -- Combat begins. notify_attack -- An attack has taken place. notify_death -- Someone has died. notify_exit -- Someone has left the room. notify_arrival -- Someone has entered the room. notify_payment -- Someone has given your monster some cash. These verbs are called whenever the given events happen in an LRPG room in which your monster is located. Many possible uses. Here's one: @prop fred.buddies {} @verb fred:notify_attack tnt "rx" @prog fred:notify_attack "You fight Fred's buddy, you gonna hafta fight Fred."; rpg = $local.rpg; "$local.rpg contains a lot of useful GM utilities."; if (!rpg:trusted(caller_perms()) "The verb's been called by a non-GM. Grr."; return E_PERM; endif punk = args[1]; wimp = args[2]; "args[1] is the attacker, args[2] the defender. See the help on ~monster."; if (!(wimp in this.buddies)) "The defending wimp isn't a buddy, so let `em die. ;)"; return pass(@args); endif doll = this.doll; "The `doll' property contains the `voodoo doll' of your monster (if any)."; already_fighting = doll:get_att("aggressor"); "The `aggressor' property on a voodoo doll contains a list of who its character is currently attacking."; if (punk in already_fighting) "Fred's already attacking the punk."; return pass(@args); endif this:do(":growls at " + punk.name + ". \"You BaStaRd!!!\""); "Fred utters a mad war cry."; doll:set_att("aggressor", setadd(already_fighting, punk)); "Add the punk to the `aggressor' list of Fred's doll. Now Fred will attack the punk when his turn comes."; return pass(@args); .. Looking at ~monster:notify_attack, you'll see that it does nothing. But you still want to pass(@args), in case you choose to @chparent to some other monster class that DOES do something."; - ~monster:armour Hack this to provide special armour for your monster. An easier way is to just set its `nat_prot' (natural protection) property to some value. See the verb for a list of arguments passed. It is called primarily by the verb of the same name on ~doll, which in turn is called from :receive_damage. - ~monster:acceptable The generic monster's :acceptable verb prevents players from teleporting unwanted items inside of it. If you'd like your monster to carry non-LRPG items, you may have to hack this verb to allow it. At least make sure you stick them in its `mine' list, which is a list of items the monster is birthed with, and which it regards as its own. - ~monster:get_body_area_name There are seven standard body area objects in LRPG. If you'd like to have different names for them, you can either: a) Change your monster's `locations' property to be a seven-element list of custom names. b) Hack the :get_body_area_name verb to return a name in a more intelligent way. c) Make your own body area objects, add a property called `ibody_areas' to your monster, and fill it with those body areas. The generic body area is ~body_area. See that object for more details. - ~monster:go_home Send your monster to the room or exit specified by its `home' property. A neat LRPG gimmick is to make your monster's `home' an exit. Instead of just blindly appearing in a room, it will smoothly move through that exit into its destination. - ~monster:set_mine This verb sets what objects you'd like your monster to be birthed and equipped with. It's much easier to use the @set-mine verb on the Dr Moreau FO (see the end of this document for its number). Here's an example: >@set-mine Fred to studded leather jacket,leather chaps,two handed club |Fred (#62642) set to be dutied with studded leather jacket (#15531), leather chaps (#51053), and two handed club (#62590). - ~monster:check_mine ~monster:prime_mine ~monster:equip_mine These three verbs validate and prepare the items in your monsters `mine' list. :check_mine Validates the minelist. If some of the objects in the minelist have been looted, this verb retrieves the unique ones and creates new generics for the others. Replacements are reflected in a new `mine' list. :prime_mine Sets the condition of your monster's items to the value of its `mine_quality' property. This is by default 100, or 100% effectiveness. Some monsters (an impoverished barbarian, for example) might have substandard equipment. This should be reflected in those items, so they aren't looted and sold as if they were new. A monster that drops a lot of stuff and is easy to kill should probably be using substandard equipment, if only for preserving game balance. :equip_mine Equips your monster with the objects in the mine list, after they have been processed by its sister verbs above. Armour is worn and weapons are wielded. - ~monster:die This kills your monster. You won't usually want to call this verb manually, but you may want to hack it for special behaviour upon its death. Remember to pass(@args) in your verb, else you may have a zombie on your hands. - ~monster:announce_death This verb announces your monster's death to the room. By default, it uses the `die_words' property, which you can @edit to your tastes. - ~monster:set_corpse If you'd like your monster to leave a corpse (containing its loot) when it expires, there are two useful values which you can set through this verb: #xxxx -- A custom descendant of ~corpse. 1 -- A generic corpse created when your monster is killed and destroyed when it is rebirthed. If you choose the latter option, you can describe the disposable corpse by setting your @corpse message, or by hacking the :corpse_msg verb. - ~monster:get_corpse This grabs the corpse used by your monster, if any. - ~monster:deposit_remains If your monster has a corpse, this verb drops it into the monster's location and places all loot inside. If no corpse, the verb just drops the stuff in the room. - ~monster:rot_corpse This is called from :duty, and just rots the corpse that was left behind when your monster was killed. --------------------------------end tutorial------------------------------ If you have further questions about building with LRPG, feel free to mail them to the *GMs list described below, or to ask one of the other GMs online (find `em with the @gms command on the bovine familiar fo). Don't be angry or feel neglected if a GM doesn't answer right away. Many times we're deep in though or in some mad creative frenzy. Sometimes we're just off using the bathroom or something. I hope this'll help you better understand the inner workings of the LambdaMOO RPG. It's been around a quite a while, and it's getting better all the time. Enjoy! - QUINN - quinn@DUS.Mountain.Net - Last updated 01-DEC-93 0735. --- Features (see help on each for details, @addfeature to add them) -- General tools for all LRPG players -- bovine familiar fo (#15870) RPG Feature Object (#6610 ) -- General tools for GMS -- fo of godlike powers (#51994) GM Feature Object (#37377) Dr Moreau FO (#5011 ) --- Mailing lists (@subcribe each) *RPG-Stuph -- General player discussion. *RPG-Doco -- Documentation/discussion of GM developments. *GMs -- General GameMaster discussion. *RPG-Dev -- Announcements of changes to the LRPG core.