MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | /* |
| 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 | |
| 11 | inherit "/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 | |
| 20 | protected 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 | |
| 194 | int 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 | |