Beispieldateien

Eine Kuckucksuhr mit Sequenz

----------

// Ein Raum, in dem eine Sequenz ablaeuft, sobald ein Spieler
// an der Kette zieht. Die Sequenz kann zur gleichen Zeit nur 1mal laufen
// und geht an alle im Raum. Sie bricht ab, sobald der Ausloeser den Raum
// verlaesst.

// 09.04.2003 by Sunrise@Wunderland

inherit "room";

#include <properties.h>


int ziehen();     // diese Funktion wird durch das Kommando aufgerufen und
                  // startet die Sequenz
void sequenz(object zieher, int zaehler);

void create()
{
  ::create();

  SetProp(P_LIGHT, 1);
  SetProp(P_INT_SHORT, "Vor einem Haeuschen");
  SetProp(P_INT_LONG, "Ein eigenartiges Haeuschen haengt hier an einer "
    "ueberdimensionalen Wand. Es hat ein spitzes Dach und eine viereckige "
    "Tuer aus Holz. Aus dem Boden des Haeuschens haengen zwei lange Ketten "
    "herab, die mit zapfenaehnlichen Gewichten bestueckt sind.");

  AddDetail(({"kette", "ketten"}),
    "Dich juckt es regelrecht in den Fingern, einmal daran zu ziehen.");

  AddCmd("zieh|ziehe&kette|ketten", #'ziehen, "Woran willst Du ziehen?");
}

int ziehen()
{
  if (find_call_out("sequenz") != -1)
  {
    write("An der Kette wurde doch gerade eben schon gezogen.\n");
    return 1;
  }

  write("Du ziehst an der Kette und wartest gespannt.\n");
  say(this_player()->name(WER, NAME_DEF|NAME_CAP)+
    " zieht an der Kette und wartet gespannt.\n");

  // starte die Sequenz in 2 Sekunden, mit dem this_player()
  // als Zieher und Zaehler 0
  call_out("sequenz", 2, this_player(), 0);
  return 1;
}


void sequenz(object zieher, int zaehler)
{
  string text;

  // Wir wollen eine 5stufige Sequenz ausgeben mit verschiedenen Texten
  // fuer Zieher und Zuschauer. Diese ordnen wir in 2 Arrays.
  // Spaeter werten wir die Texte mit parse_mess aus.
  // Auf die Eintraege von Arrays kann man bequem ueber den Index zugreifen.
  // Zu beachten ist dabei, dass der Index mit 0 anfaengt. Hier wurde er zur
  // Verdeutlichung als Kommentar an die jeweiligen Array-Felder geschrieben.
  // zieher_texte[4] ist also "Krabumm"
  string *zieher_texte = ({
    // 0
    "Knarrr. Ploetzlich oeffnet sich die Holztuer des Haeuschens und ein "
    "missgelaunter hoelzerner Vogel stuermt daraus hervor.",
    // 1
    "Klack, klack, klack, rennt er einmal rund um sein Haeuschen, haelt dann "
    "auf der Spitze des Daches und schaut Dich empoert an.",
    // 2
    "'&&WER&&, was soll denn das? Wieso laesst Du mich nicht in Ruhe schlafen?' "
    "kraechzt der Vogel empoert. Irgendwie schaemst Du Dich ...",
    // 3
    "Dann rennt er noch eine Runde um sein Haus und verschwindet mit einem "
    "missgelaunten Blick auf Dich wieder hinter seiner Tuer.",
    // 4
    "Krabumm."});

  string *zuschauer_texte = ({
    // 0
    "Knarrr. Ploetzlich oeffnet sich die Holztuer des Haeuschens und ein "
    "missgelaunter hoelzerner Vogel stuermt daraus hervor.",
    // 1
    "Klack, klack, klack, rennt er einmal rund um sein Haeuschen, haelt dann "
    "auf der Spitze des Daches und schaut &&WEN&& empoert an.",
    // 2
    "Dann schimpft und zetert er, dass &&WER&& ganz rot vor Scham wird.",
    // 3
    "Nach einer weiteren Runde rund um sein Haus, verschwindet mit einem "
    "missgelaunten Blick auf &&WEN&& wieder hinter seiner Tuer.",
    // 4
    "Krabumm."});



  // wenn der Spieler inzwischen ausgeloggt ist (ende) oder nicht mehr im
  // Raum ist beenden wir das gleich
  // Und geben evtl. noch einen Text fuer die anderen aus.
  if (!objectp(zieher) || environment(zieher) != this_object())
  {
    tell_room(this_object(), "Du wischst Dir verbluefft ueber die Augen.\n"
      "Hast Du getraeumt?");
    return;
  }

  // parse_mess ersetzt &&WEN&& etc. durch den Namen des Ziehers
  text = parse_mess(zieher_texte[zaehler], zieher);
  tell_object(zieher,  break_string(text));

  text = parse_mess(zuschauer_texte[zaehler], zieher);
  tell_room(this_object(), break_string(text), ({zieher}));


  // Wenn der Zaehler < 4 ist, erhoehen wir den Zaehler um 1
  // und rufen die Funktion erneut auf - mit einem Delay von 6 Sekunden
  if (zaehler < 4)
  {
    zaehler ++;
    call_out("sequenz", 6, zieher, zaehler);
  }
}