// Wenn der Spieler dieses unsichtbare Objekt im Inventar hat, spricht er
// rueckwaerts.
// Dazu modifizieren wir ET_COMM.
// Original by Gum und Sunrise@Wunderland 2001
inherit "thing";
#include <defines.h>
#include <properties.h>
#include <events.h>
#include <living/comm.h>
#include <living/soul.h>
#pragma strong_types
void reverse(mixed data, string type, int prio);
private string umdrehen(string str)
void create()
{
if (!clonep()) return;
::create();
// Das Objekt ist unsichtbar. Es soll nicht ablegbar sein und nicht durch
// Ende zu verlieren.
// Und es soll keine Id haben, mit der der Spieler es ansprechen kann. Da
// Objekte, die von /std/thing erben immer die id "ding" haben,
// benutzen wir nicht AddId sondern SetProp(P_IDS, ...).
// (Objekte ohne Namen buggen, wenn der Spieler zum Beispiel
// "lege alle ding ab" macht.
SetProp(P_NODROP, 1);
SetProp(P_NEVERDROP, 1);
SetProp(P_AUTOLOADOBJ, 1);
SetProp(P_IDS, ({"\nsprachfehler"}));
// Wir lauschen auf ET_COMM mit der Prioritaet MODIFY, da wir eines der
// Datenfelder (den Text, den der Spieler sagt) aendern wollen.
listen_event(ET_COMM, EPRIO_MODIFY, #'reverse);
}
void reverse(mixed data, string type, int prio)
{
// Wenn wir kein Mapping data bekommen haben oder kein Akteur existiert,
// brechen wir ab.
if (!mappingp(data) || !data[E_ACTOR]) return;
// Der Akteur muss der Spieler sein, in dessen Inventar wir sind - wenn
// nicht, brechen wir ab.
if (data[E_ACTOR] != environment()) return;
// Nun uebergeben wir den Text, den die Zuschauer sehen an die Funktion
// umdrehen. Das Ergebnis wird dem entsprechenden Eintrag im Mapping wieder
// zugewiesen.
data[E_COMM_TEXT][C_TEXT_OTHER] = umdrehen(data[E_COMM_TEXT][C_TEXT_OTHER]);
}
// In dieser Funktion ist der Algorithmus zum Umdrehen des Textes
private string umdrehen(string str)
{
string tmp = "";
// Wir schauen wie lang der uebergebene String ist. Und dann erstellen wir
// von hinten nach vorn aus dem String str einen neuen String tmp.
// Man kann einzelne Teile von Strings gezielt ansprechen analog wie bei
// Arrays. Dabei ist str[i..i] das Zeichen das an Position i im String steht -
// die erste Position ist 0.
for (int i = strlen(str); i--;)
tmp += str[i..i];
return tmp;
}
|