Beispieldateien

Ein Sprachfehler

----------


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