Ein grauer Umhang
![]()
// Da der Umhang ziemlich lang ist, kann man ihn nur anziehen, wenn man // gross; genug ist. Und beim Anziehen hat er eine spezielle // Anziehmeldung. inherit "std/armour"; #include <properties.h> #include <combat.h> #include <thing/material.h> // Wir brauchen extra Makros fuer den Event. Hier sind sie definiert. #include <events.h> // Die Funktion, die vom Event aufgerufen werden soll void zu_gross(mixed data, string type); // Prototypen string msg_zuschauer(); // Funktionen, die wir erst benutzen und // erst danach definieren, brauchen einen // Prototyp, sonst bricht der Compiler ab, // weil er die Funktion noch nicht kennt. // Prototypen bestehen aus der Funktions- // definition, gefolgt durch Semikolon void create() { // Speichersparen // d.h. wenn es kein Clone ist (nur unsere Blueprint bzw. Vorlage), dann // wird der Rest des create() nicht ausgeführt if (!clonep()) return; // MUSS SEIN! Das ist der Aufruf des ererbten create() aus der // Standardrüstung." ::create(); // Der Name der Rüstung: SetProp(P_NAME, "Umhang"); // Die Pluralform: SetProp(P_PLURAL, "Umhaenge"); // Es soll ein grauer Umhang sein, also muessen wir ein // Adjektiv für den Namen setzen: SetProp(P_NAME_ADJ, "grau"); // Aus Adjektiv und Name wird dann die Kurzbeschreibung des // Gegenstandes gebildet: // In diesem Fall: "Ein grauer Umhang". Den Artikel kann man, // wenn man will, auch unterdrücken durch das Setzen von P_ARTICLE. // Die Langbeschreibung des Umhanges: SetProp(P_LONG, "Es ist ein langer grauer Umhang aus einem feinen Wollstoff."); // Der Umhang besteht ganz aus Baumwolle, also sollten wir das auch // als Material angeben. // (Für dieses Property wurde oben material.h includet.) SetProp(P_MATERIAL, MAT_COTTON); // Das grammatikalische Geschlecht des Umhangs SetProp(P_GENDER, MALE); // Der Umhang soll als Umhang ansprechbar sein // (Die Id "ruestung" bekommt jede von /std/armour" erbende // Ruestung automagisch.): AddId("umhang", "umhaenge"); // Nun soll der Umhang nicht nur als Umhang, sondern auch als grauer // Umhang erkannt werden. Dazu müssen wir die Adjektivformen auch // noch bekanntgeben: AddAdjective(({"grau", "grauer", "grauen", "grauem", "graue", "graues"})); // Der Umhang wiegt auch etwas. SetProp(P_WEIGHT, 250); // Seine Sperrigkeit: SetProp(P_BULKINESS, 50); // Der Wert des Umhangs in Bernsteinen SetProp(P_VALUE, 200); // Und jetzt die rein rüstungsspezifischen Eigenschaften, // für die wir oben combat.h includet haben: // Der Ruestungstyp (hier ein Umhang): SetProp(P_ARMOUR_TYPE, AT_CLOAK); // Die Ruestungsklasse des Umhanges. Bitte beachte dazu die // Richtlinie waffen_ruestungen! SetProp(P_AC, 7); // Noch ein wenig detailierte Beschreibung: AddDetail(({"wolle", "stoff", "wollstoff"}), "Die Wolle ist ganz weich und warm."); // Wir wollen eigene Anziehmeldungen ausgeben // sowohl fuer den Spieler als auch fuer die Zuschauer. Fuer den // Spieler koennen wir das ohne Probleme gleich tun. Fuer die Zuschauer // brauchen wir Informationen über des Spieler. Deswegen geben // wir eine Closure an, die uns spaeter den entsprechenden Text // zurueckgibt SetProp(P_WEAR_MSG, ({ "Du schluepfst in den grauen Umhang und wickelst ihn fest " "um Deinen Bauch.", #'msg_zuschauer})); // Wir melden uns beim Eventhandler an. // Wir lauschen dem Event ET_WEAR, weil die Robe eine // Ruestung ist, mit der Prioritaet EPRIO_CANCEL, weil wir // nur abbrechen wollen. Und geben die // Funktion abbrechen als aufzurufende Funktion an. listen_event(ET_WEAR, EPRIO_CANCEL, #'zu_gross); } void zu_gross(mixed data, string type) { // Die Daten, die ein Event uebergibt, sind von Event zu Event // unterschiedlich. In den Hilfsseiten zu den einzelnen Events // sind sie jeweils aufgefuehrt. // Wenn die anzuziehende Ruestung nicht diese Robe ist, brechen wir ab if (data[E_WEAR_ARMOUR] != this_object()) return; // Wenn es keinen Akteur gibt, brechen wir auch ab if (!data[E_ACTOR]) return; // Wenn der Spieler kleiner als 1,80m ist, ist er fuer den Umhang zu // klein // P_SIZE gibt uns die Koerpergroesse zurueck if (data[E_ACTOR]->QueryProp(P_SIZE) < 180) // cancel_event bricht das Anziehen ab und gibt den uebergebenen String // als Fehlermeldung an den Akteur aus. // break_string bricht den Text auf Terminalfensterbreite (77 Zeichen) um cancel_event(break_string("Der Umhang ist viel zu gross fuer Dich, Du " "wuerdest hinfallen.")); // Achtung! Wenn beim Abbruch mehr als nur diese eine Textausgabe an den // Akteur erfolgen soll, muss dem Event noch zusaetzlich mit EPRIO_C_HANDLE // gelauscht werden, und das dann dort passieren. Siehe dazu auch // ruestung3.c } // Die Meldung, die die Zuschauer bekommen, wenn jemand den Umhang anzieht string msg_zuschauer() { return this_player()->name(WER, NAME_DEF|NAME_CAP)+" schluepft in einen " "grauen Umhang und wickelt ihn eng um "+ this_player()->QueryPossPronoun(MALE, WEN, 0)+" Bauch."; // this_player() ist dabei immer der agierende Spieler. // name() gibt uns seinen Namen zurueck, entsprechend den Flags, die wir // angeben. WER heisst hier im Nominativ, NAME_DEF mit bestimmtem Artikel // und NAME_CAP mit dem ersten Buchstaben grossgeschrieben (Der Name soll // am Satzanfang stehen). // QueryPossPronoun() erzeugt ein Possesivpronomen. Hier wollen wir, je // nachdem, ob der Spieler maennlich oder weiblich ist, ein "ihren" oder // "seinen" bekommen. Dafuer geben wir Geschlecht, Fall, und Singular oder // Plural des nachfolgenden Substantives an (hier der Bauch). } |
| Start » Magierhandbuch » Dokumentation » Programmierbeispiele » Grauer Umhang 1 | |
|
| |