Beispieldateien

Einfache Räume

----------

// Ein einfacher Raum mit Tag/Nacht-Raummeldungen
// ------------------------------------
// 05.06.2007 Sunrise@Wunderland

inherit "std/room"; // Standard-Raum erben

#include <properties.h> // wichtige Properties holen
#include <uhr.h>        // fuer die Bestimmung der Tageszeit

string meine_meldungen(); // Das ist der Prototyp fuer die Funktion,  
                          // die uns dann die Raummeldungen ausgibt

void create()
{
  // Der Standard-Raum braucht auch sein create()
  // NIEMALS VERGESSEN!
  ::create();
  // Der Raum ist draussen:
  SetProp(P_INDOORS, 0);
  // Der Raum ist immer hell, tagsueber durch die Sonne, 
  // nachts durch Sterne und Mond
  SetProp(P_LIGHT, 2);
  // die Kurzbeschreibung des Raumes
  SetProp(P_INT_SHORT, "Auf einem Dach");
  // die Langbeschreibung des Raumes, die man auch via "schau" sieht
  SetProp(P_INT_LONG, "Du stehst auf dem Dach des wohl hoechsten "
    "Gebaeudes der Smaragdenstadt. Die Sonne brennt auf Dich herab.");
  // die Langbeschreibung des Raumes in der Nacht
  SetProp(P_INT_LONG_NIGHT, "Du stehst auf dem Dach des wohl hoechsten "
    "Gebaeudes der Smaragdenstadt. Ueber Dir sind nur noch "
    "der Mond und die Sterne.");

  // ein paar Details
  AddDetail(({"boden", "dach"}), // Einen Boden sollte es immer geben
    "Du stehst auf dem Dach. Pass auf, dass Du nicht herunterfaellst. ");
  // Details koennen sowohl einen Text fuer den Tag als auch 
  // einen Text fuer die Nacht haben
  AddDetail(({"sonne"}),
    "Die Sonne steht hoch am Himmel.", // Tag-Detail
    "Nachts scheint keine Sonne.");     // Nacht-Detail
  AddDetail(({"mond"}),
    "Der Mond schlaeft gerade.",
    "Der Mond schaut auf Dich herab.");
  AddDetail(({"sterne"}),
    "Tagsueber siehst Du die Sterne nicht.",
    "Viele Sterne funkeln am Himmel.");
  AddDetail("himmel",
    "Die Sonne steht hoch am Himmel.",
    "Der Mond und die Sterne funkeln am Himmel.");
  // und weitere Details nach dem gleichen Schema

  // wir geben eine Meldung aller 60 Sekunden aus
  // da wir diese Meldungen, je nachdem ob es Tag oder Nacht ist, 
  // verschieden haben wollen, machen wir das ueber eine 
  // extra Funktion meine_meldungen()
  AddRoomMessage(#'meine_meldungen, 60);
}

// Chats sind vom Typ string
string meine_meldungen()
{
  // zuerst legen wir verschiedene Meldungen fuer tagsueber und nachts fest.
  // immer die gleiche Meldung ist ja auf die Dauer langweilig
  // am besten legen wir diese Meldungen in zwei Variablen vom Typ Array
  // Ein Array ist nichts anderes 
  // als eine Liste von Werten gleichen Typs, z.B. Strings (i.e. Texte)
  // Auf die einzelnen Werte eines Arrays kann man ueber den Index zugreifen. 
  // Dieser beginnt bei 0 und endet bei n-1, wobei n die Groesse des Arrays ist.
  // Beispiel: ein Array ({"eins", "zwei", "drei"}) hat die Groesse drei. 
  // Der Index laeuft also von 0 (fürs 1. Element) bis 2 (fürs letzte Element).

  // ok, das Array mit den Raummeldungen fuer den Tag:
  // Arrays werden durch ein * gekennzeichnet und den Variablentyp, den sie enthalten
  // in diesem Fall also *string, da es ein Array aus Texten
  string* tag = ({
    "Die Sonne scheint heiss auf Dich herab.",
    "Langsam wirds Dir warm.",
    "Ob sich die Katze auf dem heissen Blechdach genauso gefuehlt hat?",
    "Ein wenig Schatten waer jetzt gut."});

  // und nun die Texte fuer die Nacht
  string* nacht = ({
    "Einer der Sterne funkelt besonders hell.",
    "Der Mond schaut ernst auf Dich herab.",
    "Ein klitzekleiner Stern winkt Dir zu.",
    "War das eben eine Sternschnuppe? Schnell, wuensch Dir etwas!",
    "Langsam wird Dir kalt."});

  // ist es Tag oder Nacht?
  if (UHR->IsNight()) // es ist Nacht
  {
    // die Groesse des Arrays mit den Nachtmeldungen
    int i = sizeof(nacht); 

    // jetzt wuerfeln wir einen zufaelligen Wert zwischen 0 und i-1 aus
    // random() macht netter Weise genau das
    i = random(i); 
    // damit ist i jetzt mindestens 0 und hoechstens 4 
    // (Die Groesse des nacht-Arrays ist 5.)
    
    // und jetzt geben wir den Wert mit dem ausgewuerfelten Index aus:
    return nacht[i];
  }

  else // es ist Tag
  {
    // Das Gleiche was wir oben in 3 Zeilen gemacht haben, geht auch 
    // in einer Zeile. Das ist aber etwas schwerer zu verstehen, 
    // da die einzelnen Funktionen nun ineinander geschachtelt werden.
    // Es ist keine Schande es erneut wie oben zu schreiben. Aber 
    // zur Erklaerung hier auch die Kurzform:
    return tag[random(sizeof(tag))];
  }
}

// BEMERKUNG:
// Natuerlich kann man sich das sizeof() auch sparen 
// und einfach 4 bzw. 5 hinschreiben.
// Aber, dann muss der Zahlenwert angepasst werden, 
// wenn jemand spaeter noch ein paar 
// neue Meldungen dazu schreibt.