Der Potionmaster (/secure/potionmaster)
=======================================

BESCHREIBUNG

    Funktion: Verwaltung der Zaubertraenke, die Spieler finden koennen.

    Zaubertraenke koennen von beliebigen Objekten im Spiel vergeben werden.
    Jeder Spruch ist in einer eigenen Datei in /secure/ARCH/ZT hinterlegt,
    wobei der Dateiname das allgemeine Format <nr>.zt haben muss. <nr>
    entspricht hierbei der ZT-Nummer.

    Die Tips zu den Traenken werden vom Orakel /room/orakel ausgegeben,
    sofern der Spieler genug Stufenpunkte fuer einen neuen Spruch erspielt
    hat (siehe hierzu "hilfe zt"). Die Tips werden dabei aus den o.g. Dateien
    eingelesen. Der ZT wird von dem vergebenden Objekt durch Aufruf von
    FindPotion(string msg) im Spielerobjekt gutgeschrieben.

    In dieser Datei sind die Funktionen des Potionmasters dokumentiert.
    Inhalt:

    1. Zaubertraenke eintragen und aktivieren/deaktivieren
    2. Zaubertraenke in eine Liste einsortieren
    3. Zaubertraenke verlegen
    4. Daten zu Zaubertraenken abfragen
    5. Ein neuer ZT: Was tun?
    6. Format der Zaubertrank-Tips
    7. Wo finde ich eigentlich?
    8. Verschiedenes


FUNKTIONEN

1. Zaubertraenke eintragen und aktivieren/deaktivieren

   int AddPotionroom(string room, int list)
      Der Raum <room> wird als neuer ZT-Fundort eingetragen und in die Liste
      mit der Nummer <list> eingefuegt. room muss hierbei der load_name() 
      des Objekts sein, unt <list> darf Werte von 0 bis 7 haben. Der ZT
      wird dabei aktiviert.
      
      Rueckgabewerte:
      <num> Nummer des naechsten neuen ZTs, <num-1> ist die Nummer des
            neu eingetragenen ZTs.
      -1    Zugriff verweigert
      -2    <room> kein String, <list> ist nicht im Bereich 0-7
      -3    <room> ist nicht ladbar
      -4    <room> vergibt schon einen (anderen) ZT
      -6    Datei mit ZT-Spruch (/secure/ARCH/ZT/<num>.zt) existiert nicht.

   int ActivateRoom(string room)
      Der ZT im Raum <room> wird aktiviert, d.h. er kann aktiv von dem Raum
      vergeben werden. Technisch wird er aus der Liste der inaktiven ZTs
      ausgetragen. <room> muss hierbei der load_name() des Raumes sein.

      Rueckgabewerte:
      <num>  Nummer des aktivierten ZTs
      -1     Zugriff verweigert
      -5     ungueltiger ZT (Raum ist nicht als ZT-Objekt eingetragen)
      -8     <room> ist bereits aktiviert

   int DeactivateRoom(string room)
      Der ZT im Objekt <room> wird deaktiviert, d.h. er kann nicht mehr
      von dem Objekt vergeben werden. Technisch wird er in die Liste der
      inaktiven ZTs eingetragen. <room> muss hierbei der load_name() des
      Raumes sein.

      Rueckgabewerte:
      <num>  Nummer des geaenderten ZTs
      -1     Zugriff verweigert
      -5     ungueltiger ZT
      -9     <room> ist bereits inaktiv

2. Zaubertraenke in eine Liste einsortieren

   int SetListNr(string room, int list)
      Traegt den Zaubertrank in Raum <room> in die Liste <list> ein. 
      <room> muss hierbei der load_name() des Objekts sein.

      Rueckgabewerte:
      <num>  Nummer des geaenderten ZTs
      -1     Zugriff verweigert
      -5     ungueltiger ZT
      -7     <list> ausserhalb der zugelassenen Werte, d.h. <0 oder >7

3. Zaubertraenke verlegen

   int ChangeRoomPath(string old, string new)
      Der Zaubertrank in Raum <old> wird in den Raum <new> umgetragen.

      Rueckgabewerte:
      <num> Nummer des erfolgreich geaenderten Zaubertranks
      -1    Zugriff verweigert
      -2    <new> oder <old> oder beide sind keine Strings
      -3    <old> vergibt keinen ZT, es gibt also nichts zu verlegen, oder
            <new> ist nicht ladbar, dorthin kann also nicht verlegt werden
      -4    <new> hat schon einen Zaubertrank

4. Daten zu Zaubertraenken abfragen

   mixed QueryPotionData(int num)
      Abfrage der Daten zu dem ZT mit der Nummer <num>. Ausgegeben wird ein
      Mapping der Form ([ num : Raumpfad; Listennummer ])

   int QueryInactivePotions()
      Liefert ein Array mit den Nummern der aktuell deaktivierten ZTs zurueck.

   int QueryActive(mixed potion)
      Gibt zu einer ZT-Nummer oder einem Raumpfad an, ob der betreffende ZT
      aktiv ist oder nicht. Wenn ja, wird die entsprechende ZT-Nummer
      zurueckgegeben.
      
      Rueckgabewerte:
      <num> Nummer des abgefragten ZTs
      -1    Zugriff verweigert
      -5    ungueltiger ZT
      -11   ZT ist nicht aktiv
   
   string GetFilenameByNumber(int nr)
      Abfrage des Dateinamens zu Zaubertrank Nummer <nr>.
      
      Rueckgabewerte:
      <num> Nummer des abgefragten ZTs
      -1    Zugriff verweigert
      -5    ungueltiger ZT

   int HasPotion(object obj)
      Abfrage der Zaubertranknummer, die von dem Objekt <obj> vergeben wird.
      
      Rueckgabewerte:
      <num> Nummer des abgefragten ZTs
      -1    Zugriff verweigert
      -3    Raum vergibt keinen ZT

   int GetListByNumber(int nr)
      Abfrage der Liste aktiver ZTs, in der der ZT mit der Nummer <nr>
      eingetragen ist.
      Rueckgabe: Nummer der Liste, in der der ZT enthalten ist, sonst -5.

   int GetInactListByNumber(int nr)
      Abfrage der Liste inaktiver ZTs, in der der ZT mit der Nummer <nr>
      eingetragen ist.
      Rueckgabe: Nummer der Liste, in der der ZT enthalten ist, sonst -10.

5. Ein neuer ZT: Was tun?

   AddPotionRoom(newroom, liste) aufrufen. Wenn ein Fehler auftritt, muss
   noch der ZT-Tip in dem unter 6. beschriebenen Format hinterlegt werden.
   Der zu verwendende Dateiname ist in der Fehlermeldung angegeben.

6. Format der Zaubertrank-Tips

   Ein Beispiel mit zwei Tips fuer denselben Zaubertrank:

   Die Zaubermaus wollts wohl verstecken,
   Im Buecherwald sollst nichts entdecken,
   Denn Trinkgenuss ist dort verpoent,
   So ist mans auch RL gewoehnt.
   XXXXX
   Der Raum ist prall und star gefuellt,
   Mit viel Papier, das gern verhuellt
   In Zauberbuchform manches Od,
   Das hilft Dir dann aus Deiner Not.
   %%%%%

   Die Prozentzeichen sind das Endezeichen, danach koennen eventuelle
   Kommentare stehen. XXXXX ist das Trennzeichen zwischen zwei Tips
   zum selben ZT. Auswirkung ist, dass der Spieler bei jedem Aufruf
   seiner Zaubertrank-Liste zufaellig einen Spruch aus der Liste 
   angezeigt bekommt.

7. Wo finde ich eigentlich?

   - die Zaubertrank-Tips:           /secure/ARCH/ZT/*.zt
   - die Gesamtliste der ZTs:        /secure/ARCH/POTIONS.dump
   - das Savefile des Potionmasters: /secure/ARCH/potions.o
   - das Logfile fuer Aenderungen:   /log/ARCH/POTIONS_MOD.log

8. Verschiedenes

   mixed TipLesen(int nr)
      Das Orakel auf der Hochebene ruft die Zaubertrank-Tipps ab, diese
      werden von der Platte gelesen und als String an das Orakel 
      zurueckgeliefert.
   int DumpList()
      Die Komplettliste der ZTs in das Dumpfile /secure/ARCH/POTIONS.dump
      schreiben.

SIEHE AUCH:
   Spielerbefehle: zaubertraenke
   Magierbefehle:  traenke
   Properties:     P_POTIONROOMS, P_KNOWN_POTIONROOMS
   Anleitung:      wiz/zaubertraenke
   ZT finden:      FindPotion(L)

2013-Mai-30 Arathorn

