
Zaubertraenke fuer Magier
=========================

Wie man die Traenke jetzt genau versteckt, bleibt dem betreffenden Magier
ueberlassen, es sollte nur insgesamt ein breites Spektrum von sehr leicht
zu finden bis fast unmoeglich abgedeckt sein.

Fuer das Orakel der Hochebene muss dann ein entsprechender Spruch
vorbereitet werden, nicht zu kryptisch aber doch orakelig. Wichtig ist auch,
dass der Spruch nicht in Dateien oder Code festgehalten wird. Gerade im
modernen Workflow mit Git ist darauf zu achten, da hier auch temporaere
Kommentare oder Dateien wieder hergestellt werden koennten; am besten haelt
man den Spruch also fest, in dem man sich selbst im Mud eine Mail schickt oder
ihn an einem sonstwie sicheren Ort verwahrt.

Die zufaellige Auswahl an zugeordneten Zaubertraenken wird beim ersten
Einloggen des Spielers festgelegt.

Die Raeume, in denen Traenke versteckt werden (und es duerfen nur Raeume
sein), werden in 8 Listen eingeteilt, je nach Schwierigkeitsgrad. Der haengt
natuerlich von der Lage (so ist ein Trank in einem monsterwimmelnden
Labyrinth schwieriger zu erreichen, als einer auf der Hochebene), und von
dem Versteck selbst ab.

Questraeume, die nur im Rahmen der Quest erreichbar sind, sind ungeeignet.

Darueber hinaus muessen aufgrund eines EM-Beschlusses alle Zaubertraenke in
der Normalwelt angeschlossen bzw. ueber diese erreichbar sein. Zaubertraenke,
die nur ueber die Parawelt erreichbar sind, werden daher nicht genehmigt.


BEISPIEL
--------

Ein Standardbeispiel fuer ein Versteck ist immer folgendes:

> schaue
blablablabla .... Ein Schreibtisch steht in der Ecke. ... blablabla

> unt schreibtisch
Er hat eine Schublade.

> oeffne schublade
Du oeffnest die Schublade.

> unt schublade
In der Schublade enteckst Du ein paar Papiere.

> unt papiere
Beim Rumwuehlen in den Papieren entdeckst Du einen kleinen Zaubertrank, den
Du sofort trinkst.

Dann kommt die Auswahlsequenz, welche Eigenschaft man erhoehen will.

In diesem Fall reichen Details, Details mit Closure und eine Kommando fuer
"oeffne" aus. Etwa wie folgt:

  void create() {
    [...]
    SetProp(P_INT_LONG, ... Ein Schreibtisch steht in der Ecke ...);

    AddDetail(({"tisch", "schreibtisch"}),
      "Er hat eine Schublade.");

    AddCmd("oeffne&schublade", #'action_oeffne,
           "Was moechtest du oeffnen.");
  }

  private int action_oeffne() {
    tell_object(this_player(), "Du oeffnest die Schublade.\n");
    tell_room(this_object(), this_player()->Name()+
                             " oeffnet eine Schublade.\n", ({this_player()}));

    AddDetail("schublade",
              "In der Schublade entdeckst du ein paar Papiere.\n");
    AddDetail("papiere", #'detail_papiere);
  }

  // Zaubertrankgebendes Detail
  private string detail_papiere() {
    if (this_player()->FindPotion(
        break_string("Beim Rumwuehlen in den Papieren entdeckst Du einen "
                     "kleinen Zaubertrank, den Du sofort trinkst.", 78)))
      return "";
      // Es muss ein String zurueckgegeben werden, da man sonst
      // die Fehlermeldung "Sowas siehst du hier nicht." bekommt
    else
      return "Die Papiere sind alle unbeschriftet.\n";
  }

  // Aufraeumen des Raumes
  void reset() {
    if(!sizeof(filter(all_inventory(this_object()), #'interactive))) {
      RemoveDetail("papiere");
      RemoveDetail("schublade");
    }
    ::reset();
  }

FindPotion() gibt 1 zurueck, wenn der Spieler den Zaubertrank finden darf.

Wer also Traenke verstecken will, macht sowas in der Art und meldet dann den
Raum persoenlich oder per Post bei den Erzmagiern bzw. seinem aktiven
Regionsmagier an. Diese sollten dann auch den zugehoerigen Spruch erhalten,
welcher, wie oben erwaehnt, ja nicht im Code oder in einer dabeiliegenden
Datei stehen sollte.

SIEHE AUCH:
    Weitere Dateinamen mit Beispielen fuer Trankverstecke kann man der
    Datei /etc/traenke entnehmen.

    FindPotion - die Funktion, mit welcher man den Trank im Code einbaut
    traenke    - Magierbefehl zum Einschalten des Findens von ZTs

LETZTE AeNDERUNG:
  19. Nov. 2020, Arathorn
