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? } |
| Start » Magierhandbuch » Dokumentation » Programmierbeispiele » Gebiss | |
|
| |