// 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?
}
|