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

Wie man die Traenke jetzt genau versteckt bleibt dem betreffenden Magier
ueberlassen, es sollte halt insgesamt ein breites Spektrum von sehr leicht
zu finden bis fast unmoeglich abgedeckt sein.
Fuer das Orakel der Hochebene sollte dann ein entsprechender Spruch
vorbereitet werden, nicht zu kryptisch aber doch orakleig.

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.


Mein 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.
 
SIEHE AUCH:
    Weitere Dateinamen mit Beispielen fuer Trankverstecke kann man der
    Datei /etc/traenke entnehmen.

    Befehl:    traenke (fuer Magier zum Einschalten des Findens von ZTs)

10. August 2015 Gloinson
