Ein grauer Umhang 2
![]()
// Ein grauer Umhang // Dies ist der gleiche Umhang wie ruestung2.c, // nur dass er noch etwas kaputt geht beim nicht-erfolgreichen Anziehen. // Hier sind nur die Event-Funktionalitäten extra kommentiert. Für mehr // Informationen bitte bei ruestung2.c schauen. inherit "std/armour"; #include <properties.h> #include <combat.h> #include <thing/material.h> #include <events.h> // Funktionen, die vom Event aufgerufen werden sollen, // muessen vorher deklariert werden void zu_gross(mixed data, string type); void kaputtgehen(mixed data, string type); void create() { if (!clonep()) return; ::create(); SetProp(P_NAME, "Umhang"); SetProp(P_PLURAL, "Umhaenge"); SetProp(P_NAME_ADJ, "grau"); SetProp(P_LONG, "Es ist ein langer grauer Umhang aus einem feinen Wollstoff."); SetProp(P_MATERIAL, MAT_COTTON); SetProp(P_GENDER, MALE); AddId("umhang", "umhaenge"); SetProp(P_ADJECTIVES, ({"grau", "grauer", "grauen", "grauem", "graue", "graues"})); SetProp(P_WEIGHT, 250); SetProp(P_BULKINESS, 50); SetProp(P_VALUE, 200); SetProp(P_ARMOUR_TYPE, AT_CLOAK); SetProp(P_AC, 7); AddDetail(({"wolle", "stoff", "wollstoff"}), "Die Wolle ist ganz weich und warm."); // Wir melden uns beim Eventhandler an. // Wir lauschen dem Event ET_WEAR, // weil die Robe eine Ruestung ist und angezogen werden soll, mit der // Prioritaet ET_CANCEL, weil wir abbrechen wollen. Und geben die // Funktion abbrechen als aufzurufende Funktion an. listen_event(ET_WEAR, EPRIO_CANCEL, #'zu_gross); // Dazu melden wir uns nochmals mit der Prioritaet EPRIO_C_HANDLE an, // weil wir auf den Abbruch auch noch reagieren wollen. listen_event(ET_WEAR, EPRIO_C_HANDLE, #'kaputtgehen); } // Diese Funktion wird mit der Prioritaet zum Eventabbruch aufgerufen. // In ihr darf auch nichts weiter passieren, als dieses Abbrechen. Alles, // was darueber hinaus geht (also Reaktionen auf den Abbruch) muss // mit einer anderen Priorität geschehen. Hier ist das in der // Funktion kaputtgehen realisiert. void zu_gross(mixed data, string type) { // Die Daten, die ein Event übergibt, sind von Event zu Event unterschiedlich. // In den Hilfsseiten zu den einzelnen Events sind sie jeweils aufgeführt. // 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 (78 Zeichen) um cancel_event(break_string("Der Umhang ist viel zu gross fuer Dich, Du " "wuerdest hinfallen.")); } // Diese Funktion wird nur mit der Priorität (d.h. Wichtigkeit, Rangfolge) // EPRIO_C_HANDLE aufgerufen und nur, wenn dieses Objekt selbst das abbrechende // Objekt war. Hier können Reaktionen auf einen Abbruch (z.B. Textausgaben // an den Raum etc.) erfolgen. void kaputtgehen(mixed data, string type) { int zustand; // 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, haben wir das Anziehen // abgebrochen (oben in der Funktion zu_gross) // Hier koennen wir nun den Umhang ein wenig kaputt machen if (data[E_ACTOR]->QueryProp(P_SIZE) < 180) { // Der Zustand der Ruestung, d.h. wie lang sie noch haelt ... zustand = QueryProp(P_LIFETIME); // nun reduzieren wir den mal um ein Viertel zustand = zustand/4*3; // und setzen ihn neu SetProp(P_LIFETIME, zustand); } } |
| Start » Magierhandbuch » Dokumentation » Programmierbeispiele » Grauer Umhang 2 | |
|
| |