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