Beispieldateien

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