blob: 95f3909db0c2578891c04af40e034822e61a1b4e [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001/*
2** Ein Beispielmonster mit div Extras (von Boing, aktualisiert von Wim+Zesstra)
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
11inherit "/std/npc";
12
13#include <properties.h>
14#include <language.h>
15#include <combat.h> // fuer die damage types
16#include <moving.h> // fuer REJECT_KEEP
17#include <class.h> // fuer AddClass
18#include <new_skills.h> // fuer SP_* bei AddSpell
19
20protected void create()
21{
22 ::create(); /* WICHTIG!!! */
23
24/* Standard-Knofiguration (Erlaeuterungen siehe bspmon1.c): */
25 SetProp(P_SHORT, "Ein Zauberer");
26 SetProp(P_LONG, "Dieser Zauberer zaubert wie wild und schwingt dabei "
27 "seinen langen Bart.\n");
28 SetProp(P_NAME, "Zauberer");
29 SetProp(P_GENDER, MALE);
30 AddId("zauberer");
31 create_default_npc(18);
32 SetProp(P_ALIGN, -700); /* Brrr, ist der boese .... */
33 SetProp(P_BODY, 125);
34 SetProp(P_HANDS, ({" mit seinem langen Bart", 185}) );
35 SetProp(P_SIZE,180);
36 SetProp(P_MAX_HANDS, 2); /* Anzahl der Haende (default ist 2) */
37 // set_living_name() setzt einen Namen, mit der der Zauberer z.B. mit einem
38 // 'finde' gefunden werden kann. Fuer die meisten NPC ist dies nicht noetig.
39 // Speziell sollte man keine generischen Bezeichnungen hier anmelden, wenn
40 // schon, dann individuelle Namen.
41 /* set_living_name("zauberer"); */
42
43/* Mit AddClass() und P_RACE wird festgelegt, in welche Gruppe von Lebe- */
44/* wesen der NPC gehoert, welche mit is_class_member(mixed str) abgefragt */
45/* werden kann. Im Minimalfall ist der NPC von der Klasse, die bei P_RACE */
46/* eingetragen ist. Mit AddClass() koennen aber noch weitere Eigen- */
47/* schaften hinzugefuegt werden. */
48
49 SetProp(P_RACE,"Superduperzauberer");
50 AddClass( ({ CL_HUMAN, CL_MAMMAL }) );
51
52/* Mit P_RESISTANCE und P_VULNERABILITY werden fixe Werte (50%) fuer */
53/* Resistenzen respektive Anfaelligkeiten gesetzt */
54/* Die Liste der moeglichen Schadensarten ist in /sys/combat.h definiert. */
55/* z.B. SetProp(P_RESISTANCE, ({ DT_MAGIC })); */
56/* SetProp(P_VULNERABILITY, ({ DT_COLD })) */
57/* */
58/* Mit P_RESISTANCE_STRENGTHS koennen Resistenzen und Anfaelligkeit */
59/* konfiguriert werden. Diese Property enthaelt ein Mapping von */
60/* von Schadensarten enthaelt. Negative Faktoren bis maximal -1.0 */
61/* (=Immunitaet) geben Resistenzen, positive Werte Anfaelligkeiten an. */
62
63 SetProp(P_RESISTANCE_STRENGTHS, ([ DT_MAGIC: -0.5, DT_COLD: 2.0]) );
64
65/* Durch diesen Befehl wird eine Waffe geclont, sofern sie nicht im Raum */
66/* herumliegt (in dem Fall wird sie vom NPC aufgehoben), und gezueckt */
67/* (definiert in /std/npc/items.c resp. /sys/npc.h) */
68
69 AddItem("/doc/beispiele/misc/bspwaffe1", CLONE_WIELD);
70/* Und noch eine Ruestung clonen und anziehen. */
71 AddItem("/doc/beispiele/misc/bspruest1", CLONE_WEAR);
72
73/* Jetzt wird gezaubert .... */
74
75/* SetProp(P_SPELLRATE,) legt die Wahrscheinlichkeit fest, mit der ein */
76/* Zauberspruch durchgefuehrt wird, hier 40% */
77 SetProp(P_SPELLRATE,40);
78
79/* Mit AddSpell() wird ein Zauberspruch hinzugefuegt. Das erste Argument */
80/* ist so etwas wie die relative Wahrscheinlichkeit des Spruchs im */
81/* Vergleich zu den anderen, hier beim ersten spruch 1 beim zweiten 2, */
82/* das heisst in 20% der Faelle wird der erste Zauberspruch genommen und */
83/* in 40% der zweite und in 60% der dritte. */
84/* Das zweite Argument ist der maximale Schaden, entsprechend der WC */
85/* einer Waffe oder P_HANDS beim waffenlosen Kampf. */
86/* Die zwei weiteren Argumente sind die Meldungen die der angegriffene */
87/* Spieler selbst und eventuelle Zuschauer erhalten. Hierbei stehen @WER, */
88/* @WEN, @WEM und @WESSEN fuer den Namen des Opfers im entsprechenden */
89/* Fall. */
90/* Das 5. Argument ist optional und gibt den Schadenstyp an, fehlt er */
91/* wird DT_MAGIC angenommen. */
92/* Im 6. Arugument kann eine Funktion stehen, die bei dem Spruch ausge- */
93/* fuehrt werden soll, */
94/* Das siebte uebergibt die Spell Parameter, hier ist wichtig, dass bei */
95/* physikalischen Schaeden auch SP_PHYSICAL_ATTACK gesetzt wird, da sonst */
96/* einige Gilden den "Zauberspruch" abwehren koennen (siehe SpellDefend) */
97
98 AddSpell(20,60,
99 " Der Zauberer wirft einen Feuerball nach Dir.\n",
100 " Der Zauberer wirft einen Feuerball nach @WEM.\n",
101 ({ DT_FIRE }) );
102 AddSpell(40,95,
103 " Der Zauberer beschwoert einen Sturm ueber deinem Kopf hervor.\n",
104 " Der Zauberer beschwoert einen Sturm ueber @WESSEN Kopf hervor.\n",
105 ({ DT_AIR, DT_LIGHTNING }) );
106 AddSpell(60,50,
107 " Der Zauberer tritt Dich hinterlistig.\n",
108 " Der Zauberer tritt nach @WEM.\n",
109 ({ DT_BLUDGEON }), 0,
110 ([SP_SHOW_DAMAGE:1, SP_PHYSICAL_ATTACK:1]) );
111
112
113/* Reden kann der Zauberer auch von alleine, hier kommen die chats: */
114
115/* Das erste Argument ist die Wahrscheinlichkeit, mit der das Monster
116 * einen Spruch bringt (weniger ist mehr!). Das zweite Argument ist die Liste
117 * der Sprueche (oder Aktionen).
118 */
119
120 SetChats(2, ({
121 "Der Zauberer laeuft im Kreis herum.\n",
122 "Der Zauberer stolpert ueber seinen Bart.\n",
123 "Der Zauberer sagt: Heh Du! Was machst Du da?\n",
124 "Der Zauberer murmelt ein paar seltsame Worte in seinen Bart.\n",
125 "Der Zauberer bricht in unkontrolliertes Gelaechter aus.\n",
126 "Der Zauberer sagt: Hast mir mal ne Mark, ey?\n",
127 "Der Zauberer sagt: Wenn ich diesen Olpp erwische ...\n",
128 "Der Zauberer zaubert ein Kaninchen aus seinem Hut.\n"
129 }) );
130
131/* Das selbe fuer Sprueche die waehrend eines Kampfes kommen sollen */
132
133 SetAttackChats(20, ({
134 "Der Zauberer macht: Buh!\n",
135 "Der Zauberer wirft mit weissen Maeusen nach Dir.\n",
136 "Der Zauberer sagt: Das war ein grosser Fehler!\n",
137 "Der Zauberer beisst Dich in den Arm.\n",
138 "Der Zauberer zaubert gruene Punkte auf deine Wange.\n",
139 "Der Zauberer verwandelt sich in eine Kroete.\n",
140 "Der Zauberer verschwindet und taucht hinter Dir wieder auf.\n"
141 }) );
142
143/* Wenn er stirbt soll eine besondere Meldung erscheinen. */
144 SetProp( P_DIE_MSG, " loest sich in Luft auf.\n" );
145/* Dann soll natuerlich auch kein Leichnam rumliegen */
146 SetProp( P_NOCORPSE, 1 );
147
148/* Nun wollen wir den Zauberer noch auf ein paar Fragen antworten lassen */
149/* AddInfo(DEFAULT_INFO,) setzt die Antwort auf alle Fragen, wo der */
150/* Schluessel nicht bekannt ist. Der Name des Zauberers wird immer vor den */
151/* String gesetzt. (SetProp(P_DEFAULT_INFO, ist obsolet und sollte nicht */
152/* mehr angewendet werden.) */
153
154 AddInfo(DEFAULT_INFO,"sagt: Keine Ahnung, von was Du redest.\n",0,
155 "sagt zu @WEM: Keine Ahnung, von was Du redest.\n");
156
157/* Die bekannten Schluessel werden mit AddInfo dazugefuegt, das erste */
158/* Argument ist das Wort (oder die Liste von Woertern), zu der der Zauberer */
159/* befragt werden kann, das zweite Argument ist die entsprechende Antwort. */
160/* ist das dritte Argument gesetzt, so wird die Antwort automatisch umge- */
161/* brochen und bekommt den Text des Arguments vor jede Zeile gestellt. */
162/* Das vierte, ebenfalls optionale, Argument wird sofern gesetzt an die */
163/* umstehenden Personen ausgegeben, dadurch laesst sich ein Fluestern oder */
164/* eine spielerabhaengige Antwort realisieren. */
165
166 AddInfo("kaninchen",
167 "sagt: Die hol ich immer aus meinem Hut.\n");
168 AddInfo("zauberei",
169 "sagt: Ich bin ein Meister der Zauberei.\n");
170 AddInfo(({"maus", "maeuse"}),
171 "sagt: Maeuse sind meine Lieblingstiere.\n");
172
173 AddInfo( ({"tier","tiere"}),
174 "Oh, hauptsaechlich beschaeftige ich mich mit Kaninchen und Maeusen.",
175 "fluestert Dir zu: ",
176 "fluestert mit @WEM.\n");
177
178/* Normalerweile nehmen Monster alles was man ihnen gibt, ohne einen Ton */
179/* zu sagen. Will man dort ein anderes Verhalten, so tut man das so: */
180/* Moeglich sind auch REJECT_GIVE (= zurueckgeben) REJECT_DROP (=fallen */
181/* lassen. */
182 SetProp( P_REJECT, ({ REJECT_KEEP, "Der Zauberer sagt: Dankeschoen.\n" }) );
183
184/* Der Zauberer kann auch zusaetzliche Verben haben, die nur er selber
185 * benutzen kann, kein anderes Living. Diese koennen mit add_action() im
186 * create eines NPC angemeldet werden (und idR NUR in dieser Funktion und NUR
187 * in Lebewesen, nicht in sonstigen Objekten! */
188 add_action("nasebohren", "bohreinnase");
189
190/* Verben, die Spieler in Gegenwart des Zauberers koennen sollen, werden */
191/* mit AddCmd angemeldet. */
192}
193
194int nasebohren( string str ) // str ist das, was hinter dem verb eingegeben wurde.
195{
196 say( "Der Zauberer bohrt mit dem Stab in seiner Nase.\n" );
197 return 1; // Verb war erfolgreich.
198}
199