blob: ca464d5c049e7ab91153acb32456cfab92ac47e5 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001/*
2 Ein Beispiel-NPC (von Zesstra, angelehnt an Boings bspmon1.c)
3*/
4
5// Diese Pragmas sorgen dafuer, dass der Driver darauf achtet, dass bei
6// Funktionsargumenten, -Rueckgabewerten und teilweise bei Zuweisung von
7// Werten an Variablen der richtige Datentyp verwendet wird (z.b. kein string
8// anstelle eines int verwendet wird). Sollte in keinem Objekt fehlen.
9#pragma strong_types, save_types, rtt_checks
10// Einige Warnungen werden als Fehler betrachtet (empfohlen)
11#pragma pedantic, range_check
12// Schaltet bestimmte Warnungen ein (empfohlen)
13#pragma warn_deprecated, warn_empty_casts, warn_missing_return
14#pragma warn_function_inconsistent
15
16// Erbt den Standard-NPC / das Standard-Monster
17inherit "/std/npc";
18
19// Inkludiert Definitionen fuer Properties und einige Konstanten
20#include <properties.h>
21#include <language.h>
22#include <class.h> // Konstanten fuer AddClass()
23
24// create() wird beim Erzeugen des Objekt vom Driver gerufen und initialisiert
25// diesen NPC. Es bekommt kein Argument, gibt keinen Wert zurueck (Typ: void)
26// und kann nicht von ausserhalb des Objektes gerufen werden (protected).
27protected void create()
28{
29 // Nicht vergessen, ohne das geht nichts. Fuehrt das create() des geerbten
30 // /std/npc aus und initialisiert den Standard-NPC.
31 ::create();
32
33/* Die Kurzbeschreibung wird zum Beispiel angezeigt wenn man in einen Raum
34 mit dem Monster reinlaeuft */
35 SetProp(P_SHORT, "Rotaugenvampir");
36
37/* Beim Anschauen des Monsters wird die long-description angezeigt,
38 * Zeilenumbruch nach Bedarf nach 78 Zeichen. */
39 SetProp(P_LONG, break_string(
40 "Ein finster aussehender Rotaugenvampir.",78));
41
42/* Ein Name muss sein, da sonst z.B. im Todesfall 'Leiche von 0' daliegt */
43 SetProp(P_NAME, "Rotaugenvampir");
44 SetProp(P_NAME_ADJ,"ausgemergelt");
45
46/* Das Geschlecht des Monsters. Als Geschlechter sind */
47/* die in <language.h> definierten Symbole NEUTER, MALE */
48/* und FEMALE zulaessig. */
49 SetProp(P_GENDER, MALE);
50
51/* Ein Monster braucht mindestens eine ID, unter der man es ansprechen kann */
52/* Es kann aber auch mehrere verschiedene ID's haben. */
53 AddId( ({"vampir","rotaugenvampir"}) );
54
55/* Zuerst sollte man dem Monster einen Grundlevel geben. */
56/* Setzt Standardwerte fuer P_LEVEL, P_MAX_HP (Lebenspunkte), P_MAX_SP
57 * (Magiepunkte), P_HANDS, P_BODY, P_XP und die Attribute A_STR, A_INT, A_DEX
58 * und A_CON. Alle koennen spaeter noch geaendert werden.
59 */
60 create_default_npc( 25 );
61
62/* Nun machen wir es etwas widerstandsfaehiger, indem wir P_BODY setzen. */
63/* Nie P_TOTAL_AC oder P_AC setzen, P_TOTAL_AC wird automatisch berechnet */
64/* und P_AC ist nur fuer Ruestungen da. */
65 SetProp(P_BODY, 55);
66
67/* Das Monster schlaegt mit blossen Haenden zu, also wird P_HANDS gesetzt. */
68/* Auch hier weder P_TOTAL_WC noch P_WC setzen. */
69 SetProp(P_HANDS, ({" mit seinen Haenden", 135}));
70/* ^ dieses Leerzeichen ist wichtig */
71/* Beim Kampf erscheint nun: 'Das Monster greift Dich mit seinen Haenden an' */
72/* 135 entspricht der Waffenklasse */
73
74/* Gesinnung des Monsters, 0 ist neutral, negativ boese und positiv gut */
75 SetProp(P_ALIGN, -100); /* etwas boese, aber nichts besonderes */
76
77/* Die Rasse des Monsters */
78 SetProp(P_RACE, "Vampir");
79
80/* Erfahrungspunkte des Monsters, beim Tod erhaelt der 'Killer' ein */
81/* hundertstel dieses Wertes. Schon im Kampf erhaelt man bei jedem */
82/* Schlag weapon_class*schaden/10 punkte (weapon_class hier 55), also */
83/* insgesamt weapon_class*hit_points/10. */
84/* Ab 200000 gibt der NPC einen Stufenpunkt, ab 600000 2 Stufenpunkte */
85 SetProp(P_XP, 130000);
86
87/* Die Groesse des Monsters in cm. Dies wird bei einigen Kampfbefehlen */
88/* ausgewertet, sowie bei einigen Identifikationsspruechen von Gilden.
89 * Irgendwas zwischen 170 und 190 cm. */
90 SetProp(P_SIZE, 170 + random(21));
91
92/* Ein Gewicht (in Gramm) sollte der NPC haben, irgendwas zwischen 40 und 48
93 * kg.
94 */
95 SetProp(P_WEIGHT, 40000 + random(8000));
96
97/* Weitere Werte: P_(MAX)_FOOD, P_(MAX)_DRINK, P_(MAX)_ALCOHOL, */
98/* P_MSGIN, P_MSGOUT, P_MMSGIN, P_MMSGOUT, P_MAX_HANDS */
99
100/* Spezielle Infos (fuer den Identifiziere-Spruch) */
101 SetProp(P_INFO, break_string(
102 "Der Rotaugenvampir laesst sich vielleicht mit Knoblauch vertreiben.",
103 78));
104
105/* NPC koennen einer Klasse angehoeren und Waffen koennten z.B. gegen
106 * bestimmte Klassen/Rassen besonders (in)effektiv sein.
107 */
108 AddClass(({CL_VAMPIRE,CL_UNDEAD}));
109
110/* Resistenzen (negativ) und Anfaelligkeiten (positiv) */
111 SetProp(P_RESISTANCE_STRENGTHS, ([
112 DT_BLUDGEON:0.2,DT_RIP:0.2,
113 DT_MAGIC: -0.2, DT_COLD: -0.1, DT_TERROR: -0.8 ]) );
114
115// Wer hat den Spieler gekillt und was sagt man dann?
116 SetProp(P_KILL_NAME,"Ein Rotaugenvampir");
117 SetProp(P_KILL_MSG,({"Grossartig %s! Ein weiteres Opfer fuer Zesstra!",
118 MSG_SAY}));
119
120 // beschwerde auf -moerder
121 SetProp(P_MURDER_MSG,"Du steckst doch mit Jof im Bunde, %s!");
122 SetProp(P_DIE_MSG," bricht stoehnend zusammen.\n");
123
124 // Auch NPC sollten Details haben:
125 AddDetail( ({"augen","augenlider","lider"}), break_string(
126 "Der Rotaugenvampir schaut Dich mit weit aufgerissenen, rot "
127 "schimmernden Augen wild an.",78));
128 // ...
129
130 // riecht der nach was? -> AddSmells()
131
132 // Kann man den nach was fragen? -> AddInfo().
133
134}
135