Beispieldateien

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