Beispieldateien

Modifizieren und Reagieren bei einem Soul-Ereignis anhand eines Gebisses

----------


// Ein Gebiß, das verschiedene Verben verändert, wenn man es trägt,
// aber auch Reaktionen auf Verben ausloest

// by Sunrise@Wunderland 2000


#pragma strong_types

inherit "armour";

#include <properties.h>     // die grundlegenden Properties
#include <living/soul.h>    // für ET_SOUL im Speziellen
#include <events.h>         // für Events allgemein
#include <combat.h>         // die Rüstungsproperties
#include <defines.h>        // Makros fürr this_object() etc.

// Deklaration der Funktionen
void zaehne_zeigen(mixed data, string type, int prio);
void ogott(mixed data, string type, int prio);
void umhimmelswillen(object actor, int fern);

object owner;

void create()
{
  if (!clonep()) return;
  ::create();

  SetProp(P_NAME, "Gebiss");
  SetProp(P_PLURAL, "Gebisse");
  SetProp(P_DESCR, "aus Kojotenzaehnen");
  SetProp(P_NAME_ADJ, "kuenstlich");
  SetProp(P_ARMOUR_TYPE, AT_MISC);
  SetProp(P_WEAR_MSG, ({ 
    "Du schiebst Dir das kuenstliche Gebiss zwischen die Zaehne und verziehst "
    "ein paarmal probeweise das Gesicht. Jo, es scheint zu sitzen.",
    (:PL->name(WER, NAME_AUTO|NAME_CAP)+" schiebt sich heimlich etwas in den Mund." :) }));
  SetProp(P_UNWEAR_MSG, ({ 
    "Du nimmst das kuenstliche Gebiss wieder aus dem Mund.",
    (: PL->name(WER, NAME_AUTO|NAME_CAP)+" nimmt etwas aus dem Mund." :) }));

  AddId(({"gebiss", "kojotenzahngebiss", "zaehne", "zahnersatz", "\nmagiekundigen_kleidung", "\nsm_armour"}),
        ({"gebisse", "kojotenzahngebisse", "zaehne", "zahnersatz"}));
  SetProp(P_ADJECTIVES, ({"kuenstlich", "kuenstliches", "kuenstliche", "kuenstlichen"}));

  SetProp(P_LONG, 
    "Das kuenstliche Gebiss hat vier spitze Kojotenzaehnen. Es sieht "
    "sicherlich gefaehrlich aus, wenn Du es traegst.");
  AddDetail(({"zahn", "zaehne", "kojotenzahn", "kojotenzaehne", "eckzahn", "eckzaehne", 
    "kojoteneckzaehne", "kojoteneckzahn"}),
    "Vier spitze Eckzaehne, die sicherlich mal einem Kojoten gute Dienste geleistet haben, "
    "stecken in dem Harz. Sie sind lang und schauerlich anzusehen. Sicherlich kann man "
    "jemanden gut erschrecken, wenn man das Gebiss traegt und die Zaehne bleckt.");
  AddDetail(({"kojote", "dienst", "dienste"}),
    "Die Zaehne gehoerten wohl mal einem Kojoten, aber der wird wohl schon tot sein und sie "
    "nicht mehr brauchen.");

  // Bei einigen Verben ändern wir den Text (d.h. wir modifizieren -> MODIFY)
  listen_event(ET_SOUL, EPRIO_MODIFY, "zaehne_zeigen");

  // Bei anderen lassen wir die Zuschauer und Opfer nur erschrecken (d.h. wir reagieren -> REACT)
  listen_event(ET_SOUL, EPRIO_REACT, "ogott");
}

// diese Funktion wird aufgerufen und abgefragt, wenn ein Spieler angeschaut wird. Wir geben einen speziellen
// Text aus.
// Das Ergebnis sieht dann etwa so aus:
// Das ist Gast1.
// Sie hat irgendetwas im Mund.   <<<- Das macht diese Funktion.
// Sie ist absolut fit.
// Gast1 hat keine Kleidung an, keine Waffe gezueckt und traegt ein kuenstliches
// Gebiss.
string extra_look()
{
  if ((owner = environment()) && (interactive(owner)) && QueryProp(P_WORN) == owner)
    return(capitalize(owner->QueryPronoun(WER))+" hat irgendetwas im Mund.\n");
}


// Die Funktion zum Modifizieren des Ereignisses
void zaehne_zeigen(mixed data, string type, int prio) 
{
  string *verben1;
  // Wir wollen nur von diesen Verben die Verbtexte verändern.
  verben1 = ({"gaehne", "grinse", "lache", "laechle", "pruste", "rotfl", "schreie", "singe"});

  if (data[E_ACTOR] != environment()) return;                 // Ich bin nicht im Inventar des Akteurs
  if (data[E_ACTOR] != QueryProp(P_WORN)) return;             // Der Akteur hat mich nicht "angezogen"
  if (member(verben1, data[E_SOUL_VERB]) == -1) return; // Es ist keines der obigen Verben 

  // Die Verbtexte sind im Feld E_SOUL_TEXT enthalten
  // dieses ist wiederrum ein Array mit verschiedenen Einträgen (siehe man ET_SOUL),
  // von denen uns nur die Ausgabetexte fuer die Zuschauer (S_TEXT_OTHER) und
  // das Ziel der Interaktion (S_TEXT_VICTIM) interessieren
  // @@Name@@ wird hierbei automagisch ersetzt durch den großgeschriebenen
  // Namen des Akteurs. @@adverb@@ ist das verwendete Adverb. Wenn keins 
  // angegeben ist es "", sonst wird automatisch ein Leerzeichen 
  // vorangestellt: " adverb".
  // Bei Fernverben wird hier auch der Text 'in der Ferne' eingefügt.
  // (Weitere Schlüsselworte sind im Souldaemon beschrieben (/global/handler/soul.c)
  data[E_SOUL_TEXT][S_TEXT_OTHER] = "@@Name@@ oeffnet@@adverb@@ "
    "den Mund und laesst ein paar riesige Eckzaehne sehen! *grusel* Du "
    "erschrickst tierisch.";
  data[E_SOUL_TEXT][S_TEXT_VICTIM]= "@@Name@@ oeffnet@@adverb@@ "
    "den Mund und laesst ein paar riesige Eckzaehne sehen! *grusel* Du "
    "erschrickst tierisch.";

// Beim Akteur ändert sich hier gar nichts.
// Für das Opfer sieht es so aus:
// Sunrise oeffnet den Mund und laesst ein paar riesige Eckzaehne sehen!
// *grusel* Du erschrickst tierisch.
}




// Wir reagieren auf die Ausuebung bestimmter Verben
void ogott(mixed data, string type, int prio)
{
  string *verben2;
  object victim, actor;
  // Um diese Verben gehts:
  verben2 = ({"knabbere", "knutsche", "kuesse", "liebe"});

  if ((!data[E_SOUL_VICTIM]) || (!data[E_ACTOR])) return;     // Es gibt weder Akteur noch Ziel?
                                                              // sicher ist sicher :o)

  if (data[E_ACTOR] != environment()) return;                 // Ich bin nicht im Inventar des Akteurs
  if (data[E_ACTOR] != QueryProp(P_WORN)) return;             // Der Akteur hat mich nicht "angezogen"
  if (member(verben2, data[E_SOUL_VERB]) == -1) return; // Es ist keines der obigen Verben 

  victim = data[E_SOUL_VICTIM];
  actor = data[E_ACTOR];

  tell_object(victim, break_string(
    "Ploetzlich zuckst Du erschrocken zusammen. Hast Du da nicht gerade ganz lange spitze Zaehne "
    "gefuehlt? Ist "+actor->name(WER, NAME_AUTO)+" zum Werwolf geworden?"));
  tell_object(actor, break_string(
    victim->name(WER, NAME_AUTO|NAME_CAP)+" zuckt ploetzlich erschrocken zusammen. Ob "+
    victim->QueryPronoun(WER)+" Deine Kojotenzaehne gespuert hat?"));
  tell_room(environment(victim),
  victim->name(WER, NAME_AUTO|NAME_CAP)+" zuckt ploetzlich erschrocken zusammen.\n", ({actor, victim}));

  // Ein bißchen verzögert soll noch die Erschreckens-Meldung kommen.
  // Es könnte als Fernverb benutzt worden sein
  // Auskunft darüber gibt ein Eintrag im Mapping data: E_SOUL_FLAGS
  call_out("umhimmelswillen", 1, data[E_ACTOR], data[E_SOUL_FLAGS]&REMOTE);
}


// Die Funktion wird durch void ogott() aufgerufen und muß ebenfalls void sein.
// Von der aufrufenden Funktion bekommen wir den Akteur übergeben und ob das
// Verb als Fernverb benutzt wurde.
void umhimmelswillen(object actor, int fern)
{
  object *ob;
  string *str;  

  if (!actor) return; // falls inzwischen ausgeloggt o.ä.

  // Je nachdem, ob das Ziel im gleichen Raum stand oder nicht (Fernverb ja/nein),
  // ist die Erschreckensmeldung anders.
  if (fern)
    tell_object(actor, "Jemand erschrickt furchtbar in der Ferne.\n");
  else 
    tell_object(actor, "Die Umstehenden erschrecken furchtbar.\n");

// Jetzt sieht das ganze beim Akteur so aus:
// >knabbere pepsi
// Du knabberst aus der Ferne an Pepsis Ohr.
// Pepsi zuckt ploetzlich erschrocken zusammen. Ob sie Deine Kojotenzaehne
// gespuert hat?
// >Jemand erschrickt furchtbar in der Ferne. 
// Und beim "Opfer":
// Sunrise knabbert aus der Ferne an Deinem Ohr.
// Ploetzlich zuckst Du erschrocken zusammen. Hast Du da nicht gerade ganz lange
// spitze Zaehne gefuehlt? Ist Sunrise zum Werwolf geworden?

}