// 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);
}
}
|