blob: ca464d5c049e7ab91153acb32456cfab92ac47e5 [file] [log] [blame]
/*
Ein Beispiel-NPC (von Zesstra, angelehnt an Boings bspmon1.c)
*/
// Diese Pragmas sorgen dafuer, dass der Driver darauf achtet, dass bei
// Funktionsargumenten, -Rueckgabewerten und teilweise bei Zuweisung von
// Werten an Variablen der richtige Datentyp verwendet wird (z.b. kein string
// anstelle eines int verwendet wird). Sollte in keinem Objekt fehlen.
#pragma strong_types, save_types, rtt_checks
// Einige Warnungen werden als Fehler betrachtet (empfohlen)
#pragma pedantic, range_check
// Schaltet bestimmte Warnungen ein (empfohlen)
#pragma warn_deprecated, warn_empty_casts, warn_missing_return
#pragma warn_function_inconsistent
// Erbt den Standard-NPC / das Standard-Monster
inherit "/std/npc";
// Inkludiert Definitionen fuer Properties und einige Konstanten
#include <properties.h>
#include <language.h>
#include <class.h> // Konstanten fuer AddClass()
// create() wird beim Erzeugen des Objekt vom Driver gerufen und initialisiert
// diesen NPC. Es bekommt kein Argument, gibt keinen Wert zurueck (Typ: void)
// und kann nicht von ausserhalb des Objektes gerufen werden (protected).
protected void create()
{
// Nicht vergessen, ohne das geht nichts. Fuehrt das create() des geerbten
// /std/npc aus und initialisiert den Standard-NPC.
::create();
/* Die Kurzbeschreibung wird zum Beispiel angezeigt wenn man in einen Raum
mit dem Monster reinlaeuft */
SetProp(P_SHORT, "Rotaugenvampir");
/* Beim Anschauen des Monsters wird die long-description angezeigt,
* Zeilenumbruch nach Bedarf nach 78 Zeichen. */
SetProp(P_LONG, break_string(
"Ein finster aussehender Rotaugenvampir.",78));
/* Ein Name muss sein, da sonst z.B. im Todesfall 'Leiche von 0' daliegt */
SetProp(P_NAME, "Rotaugenvampir");
SetProp(P_NAME_ADJ,"ausgemergelt");
/* Das Geschlecht des Monsters. Als Geschlechter sind */
/* die in <language.h> definierten Symbole NEUTER, MALE */
/* und FEMALE zulaessig. */
SetProp(P_GENDER, MALE);
/* Ein Monster braucht mindestens eine ID, unter der man es ansprechen kann */
/* Es kann aber auch mehrere verschiedene ID's haben. */
AddId( ({"vampir","rotaugenvampir"}) );
/* Zuerst sollte man dem Monster einen Grundlevel geben. */
/* Setzt Standardwerte fuer P_LEVEL, P_MAX_HP (Lebenspunkte), P_MAX_SP
* (Magiepunkte), P_HANDS, P_BODY, P_XP und die Attribute A_STR, A_INT, A_DEX
* und A_CON. Alle koennen spaeter noch geaendert werden.
*/
create_default_npc( 25 );
/* Nun machen wir es etwas widerstandsfaehiger, indem wir P_BODY setzen. */
/* Nie P_TOTAL_AC oder P_AC setzen, P_TOTAL_AC wird automatisch berechnet */
/* und P_AC ist nur fuer Ruestungen da. */
SetProp(P_BODY, 55);
/* Das Monster schlaegt mit blossen Haenden zu, also wird P_HANDS gesetzt. */
/* Auch hier weder P_TOTAL_WC noch P_WC setzen. */
SetProp(P_HANDS, ({" mit seinen Haenden", 135}));
/* ^ dieses Leerzeichen ist wichtig */
/* Beim Kampf erscheint nun: 'Das Monster greift Dich mit seinen Haenden an' */
/* 135 entspricht der Waffenklasse */
/* Gesinnung des Monsters, 0 ist neutral, negativ boese und positiv gut */
SetProp(P_ALIGN, -100); /* etwas boese, aber nichts besonderes */
/* Die Rasse des Monsters */
SetProp(P_RACE, "Vampir");
/* Erfahrungspunkte des Monsters, beim Tod erhaelt der 'Killer' ein */
/* hundertstel dieses Wertes. Schon im Kampf erhaelt man bei jedem */
/* Schlag weapon_class*schaden/10 punkte (weapon_class hier 55), also */
/* insgesamt weapon_class*hit_points/10. */
/* Ab 200000 gibt der NPC einen Stufenpunkt, ab 600000 2 Stufenpunkte */
SetProp(P_XP, 130000);
/* Die Groesse des Monsters in cm. Dies wird bei einigen Kampfbefehlen */
/* ausgewertet, sowie bei einigen Identifikationsspruechen von Gilden.
* Irgendwas zwischen 170 und 190 cm. */
SetProp(P_SIZE, 170 + random(21));
/* Ein Gewicht (in Gramm) sollte der NPC haben, irgendwas zwischen 40 und 48
* kg.
*/
SetProp(P_WEIGHT, 40000 + random(8000));
/* Weitere Werte: P_(MAX)_FOOD, P_(MAX)_DRINK, P_(MAX)_ALCOHOL, */
/* P_MSGIN, P_MSGOUT, P_MMSGIN, P_MMSGOUT, P_MAX_HANDS */
/* Spezielle Infos (fuer den Identifiziere-Spruch) */
SetProp(P_INFO, break_string(
"Der Rotaugenvampir laesst sich vielleicht mit Knoblauch vertreiben.",
78));
/* NPC koennen einer Klasse angehoeren und Waffen koennten z.B. gegen
* bestimmte Klassen/Rassen besonders (in)effektiv sein.
*/
AddClass(({CL_VAMPIRE,CL_UNDEAD}));
/* Resistenzen (negativ) und Anfaelligkeiten (positiv) */
SetProp(P_RESISTANCE_STRENGTHS, ([
DT_BLUDGEON:0.2,DT_RIP:0.2,
DT_MAGIC: -0.2, DT_COLD: -0.1, DT_TERROR: -0.8 ]) );
// Wer hat den Spieler gekillt und was sagt man dann?
SetProp(P_KILL_NAME,"Ein Rotaugenvampir");
SetProp(P_KILL_MSG,({"Grossartig %s! Ein weiteres Opfer fuer Zesstra!",
MSG_SAY}));
// beschwerde auf -moerder
SetProp(P_MURDER_MSG,"Du steckst doch mit Jof im Bunde, %s!");
SetProp(P_DIE_MSG," bricht stoehnend zusammen.\n");
// Auch NPC sollten Details haben:
AddDetail( ({"augen","augenlider","lider"}), break_string(
"Der Rotaugenvampir schaut Dich mit weit aufgerissenen, rot "
"schimmernden Augen wild an.",78));
// ...
// riecht der nach was? -> AddSmells()
// Kann man den nach was fragen? -> AddInfo().
}