/* Example of a basic NPC, written by Hobbes, updated by Sandoz */
inherit NPC_OBJ;
/* NPC_OBJ is a large but needed file and holds the advanced npc
* handling stuff which you don't have to think about. Inheriting this
* saves memory and you don't have to write it again for your npc.
* (Why invent the wheel twice?)
*/
#include <armoury.h>
/* This file is needed if you want to add clothes, weapons and armoury
* from /obj/clothes, /obj/weapons and /obj/armoury respectively.
*/
object comb;
/* If you want to equip your NPC from other directories, you need to
* define the objects and clone them separately. See below.
*/
void setup() {
set_name( "ralph" );
/* set_name() is the name the npc will be refered with. It's almost
* always a noun or a name from the short. It's always in lowercase.
*/
set_short( "Ralph the spotted giraffe" );
/* set_short() is what the player will see when the npc is in the
* same room.
*/
add_property( "determinate", "" );
/* This property also helps giving nice outputs. Determinates such as
* "a" and "an" are handled automatically without the property. The
* line above sets the determinate to none. Unique npcs with names
* should have the none determinate, while npcs like the librarian
* should have "the " (note the space).
*/
add_adjective( "spotted" );
/* All relevant adjectives should be given using add_adjective.
* Adjectives in the short _must_ be given since the player ought at
* least be able to reference an object by its short, e.g. - , - ,
* "old", "green", "blue", ({ "wooden", "wood" }), ({ "chocolate",
* "choc" }), "short", "shiny".
*/
set_main_plural("Ralph the spotted giraffes");
/* This sets what you see when there are more than one of them in the
* room.
*/
add_plural(( { "ralphs", "giraffes" } ));
/* Sets the plural which you can call them by. Note that the system
* automatically adds one plural for you: the plural of the name once
* you have called set_name().
* This may look weird in some cases though. A prime example for items
* are the plural of "roof" is found to be "rooves", so the correct
* plural must be given, e.g. add_plural( "roofs" );
*/
add_alias(( { "giraffe", "Ralph" } ));
/* This is simply another name which you can refer the NPC with.
* Players can type "look ralph" as well as "look Ralph".
*/
set_long( "This is Ralph the spotted giraffe. He is just an example in "
"this file so I won't describe him although I should. Well, "
"okay then... He's like any normal giraffe except for his cool "
"black specs and mop fringe. He is coolnes personified.\n" );
/* The set_long() is what you see when you look at the NPC. It should
* be detailed and interesting. Don't just describe what they are.
* Describe what they look like as well.
*/
add_property( "unique", 1 );
/* The unique property does the following. First it lets you set the
* NPCs own stats. If you don't include this, it will use the race
* object's numbers. Second, an unique NPC gives reduced exp when killed
* (it will be logged in /log/DEATHS, and be informed to the creators).
* Third, the NPC will be on the bounty system.
*/
basic_setup( "horse", 15, 1 );
/* Sets the race, level and the gender for the NPC.
* We'll use horse as there is no giraffe race at the moment. Look
* in /std/races/ for possible races to choose from. The race handles
* bits like attacks, stats and body parts. A crocodile has a tail
* while a a dwarf has not, for example.
* By setting the level of the NPC we can roughly set how much experience
* the NPC should give.
* Finally, we set the gender of the NPC. This can either be a number -
* ( 0 = it, 1 = male, 2 = female ), or a word - "male", "female".
*/
set_height( 300 );
/* Height in centimeters. (This can usually be left out.)
*/
set_weight( 1600 );
/* 1 unit of weight is about equal to 50 grams or 1/9lb for all you hairy
* wombles out there. (This can usually be left out.)
*/
set_al( -500 );
/* Sets the alignment of the NPC. 0 is neutral, the more positive number,
* the more evil the NPC is. Ralph is a really nice guy, so we set his
* alignment to a negative number.
*/
set_con(18);
set_dex(18);
set_str(16);
set_wis(15);
set_int(15);
/* Well, this is the way to set the stats manually. It will be the race's
* default if you don't include these and the unique property.
*/
add_move_zone( "Short" );
add_move_zone( "Filigree" );
/* This defines where Ralph is allowed to walk. Short- and Filigree Street
* have these 'set_zones()' respectively.
*/
set_move_after( 50, 60 );
/* This sets the time delay in seconds between when the monster wanders, in
* this case: sometime between 50 and 60 seconds.
*/
load_chat( 90, ({
3, "@grin",
3, "@high5 $lname$",
2, "@bless $lname$",
1, "@moonwalk",
1, "'Far out man.",
1, ({ "'Hey, if it isn't $lname$!",
"'You're looking cool as usual!" }),
1, ":tells you: Hey my man! Watcha up to?",
1, "'That's cool.",
1, "'Chillin' out here, are we?",
1, "@ruffle $lname$",
1, "@wink $lname$",
2, ":does a really complicated tap dance manoeuvre.",
1, "'Let's do something wild and crazy...",
1, ({ "'Yoho, how's it hangin'?",
"'I'm in a darn good mood today!" }),
1, ":tells you: Ouch man, where the heck did you find those clothes?"
}) );
/* This loads up the default chat messages. The chance is the chance in
* 1000 that one of the messages will show up every heart_beat whilst not
* in combat. The number infront of the chat is designed to allow you to
* make some messages much more likely to be said than others.
* The character the chat begins with defines the following:
* @ Soul command
* ' Say.
* " Loud say.
* : Emote.
* default echo.
* $lname$ is a random player in the room.
*/
load_a_chat( 100, ({
1, "'Wait till Hobbes hears about this!",
1, "'It's SO uncool to fight!",
1, "@scream",
1, "You can't believe you're fighting such a nice creature as Ralph.",
1, ":seems to wish he was somewhere else."
}) );
/* Load_a_chat is just the same as load_chat above, except this is used
* when the NPC is in combat.
*/
ARMOURY->request_item("meat cleaver", 80+random(20))->move(this_object());
ARMOURY->request_item("gigantic dog collar", 100)->move(this_object());
ARMOURY->request_item("straw hat", 80)->move(this_object());
/* These lines automatically clone stuff from the /obj/ directories.
* You must have <armoury.h> included (see above).
* The number sets the condition (percentage) of the object.
* Notice that you don't need the underscores in the names and clothes
* requested from the armoury.
*/
comb = clone_object("/d/am/items/comb");
comb->move( this_object() );
/* And this clones and moves the the object we defined at the top of the
* file. If possible, always try to use the armoury.
*/
init_equip();
/* This makes the NPC equip the armoury he has been given.
*/
} /* setup() */
/* Most of the functions are explained further in help files, do
* "help load_chat" for example. See also "help setup".
*/