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