1. Introduction to Monsters
  2. How do I make a monster?
  3. Fleshing out your monster
  4. Additional Functions
  5. Special Attack

  1. Introduction to Monsters

    All monsters must include the following lines: inherit MONSTER; void setup() { } The line inherit MONSTER; is the base for all monsters. This gives your monster abilities like descriptions, combat etc. Without this your monster will not load. Just about all of your monster code will go inside the {}'s in setup. Make your monster code (and all code for that matter) as clean as possible. Indent! ( The 'I' command within ed does indentation.)

    How do I make a monster?

    The most basic monster is like this: inherit
    MONSTER; void_setup() { set_in_room_desc( "A monster"); set_name( "The monster" ); set_id("monster"); set_long("This is a really ugly monster!"); setup_monster("humanoid", 2, "fighter"); }


    USAGE: set_in_room_desc(string str) This is what players see when they walk into a room. It is up to you if you use articals (like "a" and "the"). Usually the first word is capitalized.


    USAGE: set_name(string str) This string of words is seen at various times such as when the monster emotes something. You will need to play with the articals and capitalization to decide what you like best. set_name( "The monster" );


    USAGE: set_id(string array str...) set_id( "monster","it","other id","another id" ); This is what the players use to identify the monster. This is also what the game uses to identify the monster in some cases. It should be in all lower case. The id's you set up should be logical and be comprised of anything the players will try to type to identify the monster. I see this happen to much in the mud: Player types look in the mud, see 'a rock lies here'. The player then types la rock, and the mud doesn't know what the player is trying to look at because the wizard set the in room desc to 'rock' and the id's to 'stone'. The point is to be careful with your id's, we don't want the players to have to guess at what the items are. Another very important note with respect to set_id, and
    set_adj The _first_ argument passed to set_id will become the 'primary id'. Combined with the 'primary adj' they compose the 'primary name' of the item. This is the name that you typically see used in the mud.


    USAGE: set_long(string str) When a player looks at a monster, this is part of what he will see. This helps the player picture the monster, so don't be skimpy on the description (like this example is!). set_long("this is a monster");


    USAGE: setup_monster(string type, int level, string guild) This is the meat of the monster. The first variable in this function defines what type of monster you have. To see the possible monster types from inside the mud type 'monsters'. Pick whichever arguement best fits your monster. If none seem to fit, select "other". Keep in mind that monsters of the same level will still vary slightly based on there race. For example, a level 20 dragon will be harder to fight than a level 20 humanoid, and will also give more experience. The second variable is the monster's level. On Islands of Myth, the monsters can vary from level 1 on up to level 50. You might need to play with your monster's level to get it where you want it. The following commands should help you when you are trying to determine what level to make your monster: 1) mhits - Gives you a list of the hitpoints for that type for each monster level. 2) mworth - Gives you a list of the monster's exp worth for that type of monster at each level. 3) deeplook - After coding your monster, clone it then use this command to get some of the specifics on your monster. The third variable is the basic guild of your monster. This will control the default spells and skills used by your monster. If you do not include this variable, the game will pick any spells and skills (which is just fine for some types of monsters). the other options are: "fighter", "caster", and "none." With "none" your monster will not do any any spells or skills (good for animals or if you are adding custom spells and skills).

    "Fleshing out" your Monster

    Well, your monster is pretty boring. Lets make a more exciting monster and add some new functions to him. The following functions should be used in most monsters.
    MONSTER; void setup() { set_in_room_desc( "Dudly, the big and ugly orc" ); set_name("Dudly"); set_id("dudly"); add_id("orc"); set_adj("big"); add_adj("ugly"); set_long("You look up and Dudly...and up and up and up! You have never " "seen such a massive monster! His legs are as thick as tree trunks " "and his arms are thick enough to crush an iron rod! He is not a " "good looking fellow, however. His lower jaw juts out to show a row of " "long, yellow teeth. You doubt that mouth can be used for normal speech. " "His pig-eyes are too close together and you doubt there is much " "thought behind them."); set_alignment(-200); set_gender(1); setup_monster( "humanoid", 2); /*note: no defined guild*/ }


    USAGE: add_id(string str) This adds an id to your monster. This does not affect the primary id. So if you do the following: set_id("foo","foo2"); add_id("foo3"); Your monster still has a primary id of foo. Note that if you want you can do this all through set_id(). Just remember that the first ID listed is the 'primary ID.


    USAGE: set_adj(string array str...) English 101 - Adjectives are any word that describes a noun. Ugly dog, fat dog, young dog, pretty dog, innocent dog, lustful dog, crazy dog, etc. are examples of an adjective and its noun (in this case, "dog"). As with
    set_id(), set_adj() can take a list of adj's. Again the first one specified is the 'primary' adjective. This gets combined with the primary id to form the primary name. If your monster has an adjective in its set_in_room_desc(), you should include an add_adj(""); line to your code. This allows a player to walk into the room and type "kill big orc". Players may use any combination of adjectives and IDs to identify your monster. set_adj("big","ugly","fat");


    USAGE: add_adj(string array str...) Just like with IDs, if your monster has more than one adjective, you should include all of the adjectives by using this function. You can use it as many times as you would like. If you prefer you can pass them all through set_adj() keeping in mind the first is the primary adj. add_adj() has no affect on the primary adj. add_adj("ugly");


    USAGE: set_alignment(int i) This defines how good or evil your monster is. Alignment range from -1000 to 1000. Negative numbers are more evil while positive numbers are more saintly. The two extremes (-1000 and 1000) should be used rarely and probably only for quest or eq monsters. Note in many examples and many monsters in the game you will see 2 numbers passed to set_alignment(). Please ignore those, the second number was removed as it was just to confusing and really served no purpose, and all the monsters havent been fixed.


    USAGE: set_gender(int i) This makes it so the player does not have to look under the monster's tail to see if it is a boy or a girl. The possible arguments are as follows: 0 - genderless 1 - male 2 - female

    Additional Functions


    USAGE: add_a_weapon(string str, int wield) add_a_weapon("path",1) This function adds a weapon to the monster. The first arguement is the file name. The second arguement defines if the monster should be wielding the weapon or not, 1 means the monster should be wielding it and 0 means the monster should only have the weapon in his inventory.


    USAGE: add_a_armor(string str, int wield) add_a_armor("/wiz/hysteria/armors/chainmail.c", 1); This is the same thing as add_a_weapon() but it is specific for worn armor. Again, the first arguement is the complete file name. The second defines if the monster should be wearing the armor or not. 1 is worn and 0 is not worn.


    USAGE: add_a_object(string str, int wield) add_a_object("/wiz/hysteria/objects/rose.c"); This allows you to place an object besides armor or weapons in the monster's inventory.


    USAGE: set_str_modifier(int i); This function allows you to alter the combat strength of your monster. You can increase the combat strength by using positive numbers or decreased by using negitive numbers. Notice: This should be used very rarely and if you use it, please make sure your area reviewer is aware that you used it.


    USAGE: not sure if this is used anymore This function increases the number of arms a monster has. This will increase the number of weapons he can wield and the number of times he hits. This is already defined in the monster's race but can be overloaded using this function.


    USAGE: set_no_disarm(int percent) set_no_disarm(50); The players have a skill called "disarm" which will strip the monster of his weapon. This function can be added to monsters to decrease the chances of that skill working. The higher the number, the more likely the player's skill will fail. The maximum number is 100.


    USAGE: set_kill_min_level_limit(int i) set_kill_min_level_limit(30); If you don't want newbies dying to your monster, you can set the level a player must be before he can kill the monster. In this example, a level 29 player would not be able to kill this monster, but a level 31 would be able to.


    USAGE: set_kill_max_level_limit(int i) set_kill_max_level_limit(20); If you don't want highbies mowing over your newbie monsters, you make your monster unkillable by highbies by using this function. In this example, players over level 20 would not be able to kill this monster.


    USAGE: set_kill_min_level_limit_msg(string str) set_kill_min_level_limit_msg("You are too small to attack the orc!\n"); This message will be sent to the newbie when he tries to kill your monster if his level is under the monster's min level limit.


    USAGE: set_kill_max_level_limit_msg(string str) set_kill_max_level_limit_msg("You are too small to attack the orc!\n"); This message will be sent to anyone that is too high of a level to kill your monster.


    USAGE: add_resitance(string type, int amount) add_resistance( "magical", 30); This will add 30% more magical resistance onto what the monster has already.


    USAGE: add_spell(string str, int chance_to_cast, int chance_of_success,string target ) add_spell("fireball", 50, 90); This function lets you add a spell to your monster. The first variable is the name of the spell. It should be in all lower case. The second variable is the % chance that at any point a monster will start casting the spell. If you set it at 100, then every available time, the monster will try casting this spell. The third variable is the % of success. In this case, The monster would have a 90% chance of succeeding each time he casts this spell. There is a fourth variable. It is the target. By not defining it, like in this example, we are going to the default target which is the target the monster is killing. The other possibilities are: "none" "random" - The monster randomly picks any player in its environment. Example: add_spell("fireball", 30, 95, "random"); Notice: If your spell is a heal spell or any other type of spell that is cast on the monster itself, then the target has to be set as "none".


    USAGE: add_skill(string str, int chance_to_cast, int chance_of_success,string target ) add_skill("punch", 30, 85); This acts the exact same way as


    USAGE: track(int percent) track(40); All monsters have the ability to follow a player out of the room. If you want to increase this ability, you can use this function. In this example, the monster would have a 40% chance of tracking the player when the player flees the room. If you don't want your monster leaving the room, you must add: track(0); to the monster file in the setup()


    USAGE: add_block(string exit) add_block( "north" ); This line makes it so a monster will not allow a player to leave the room through a certain exit, forcing the player to kill the monster before he can go through the exit. *** You must inherit M_BLOCKEXITS as well as
    MONSTER; for this to work.


    USAGE: set_block_action(mixed stuff) set_block_action( "The orc grunts and won't let you pass.\n"); This is used when your monster is blocking an exit. The player will get this message when he attempts to go through an exit that is blocked by that monster. You can also do other nasty stuff to the players as well, rather than displaying a message you can do set_block_action( (: my_function :) ) and have my_function do whatever you want as long as it returns 1 to block, 0 to let the player through. *** You must inherit M_BLOCKEXITS as well as
    MONSTER; for this to work.


    USAGE: set_aggressive(mixed foo) set_aggressive(90); This line will make your monster aggressive to a player when he enters the room. The number represents the % chance that the monster will try to attack the player when he enters the room. You can also use a function pointer to allow the monster to either do nasty things to the player, or perhaps he is aggressive based on race, or worth etc. %^BOLD%^%^RED%^NOTICE:%^RESET%^ You must inherit M_AGGRESSIVE; for this to work!


    USAGE: set_aggressive(mixed foo) set_aggressive(90);


    USAGE: set_creator(string who) set_creator("zifnab") This sets the creator (you) so when a player types "creator orc" the game will know how to answer. This helps the players know who to praise or report bugs to.


    USAGE: set_monster_damage(mapping damages) set_monster_damage( ([ "physical": 50, "fire" : 20, "cold" : 30]) ); This function alters the partitioning of damage types made by a monster in unarmed combat. Usually monsters always do physical, however this allows the coder to set other damage types. Notice, the damage type must be a valid damage type (see the damage types listed under resistances) and the total of the coefficients (in this case, 50 + 20 + 30) must equal 100.

    Special Attack

    Sometimes you want your monster to have a special attack. The following is just an example. However, pretty much anything within the realm of reasonability is possible. Specials can be targetted to any player or just the tank (it defaults to the tank). They don't have to deal damage. They can heal the mosnter, for example. Anything is possible and they help to individualize your monster. This code should be written outside the setup()
    int special_attack(object target) { if(environment(target) != environment(this_object())) return; **** The above checks to make sure the target is in the same **** room as the monster. Otherwise, the special will bug if **** the player leaves the room. if(90 < random(100)) { this_object()->targetted_action("The orc lifts his heavy arm and bashes $t!\n"); **** The above is the message your special will give to the **** targets in the room. return 200 + random(100); /* return the damage to be done */ } return 0; }