
check_restrictions()
********************


FUNKTION
========

   string check_restrictions(object pl, mapping restr)


DEFINIERT IN
============

   /std/restriction_checker.c


ARGUMENTE
=========

   object pl        geprueftes Lebewesen
   mapping restr    Mapping mit Restriktionen, s.u.


BESCHREIBUNG
============

   Die Methode wird verwendet, um Restriktionen (zum Beispiel fuer das
   Casten eines Spells) zu pruefen. Sie wird von Spellbook und
   Gildenobjekt direkt genutzt.

   Ihr wird dabei ein Spielerobjekt sowie ein Mapping mit den jeweiligen
   Restriktionen uebergeben. Die aktuell moeglichen Keys des Mappings sind
   weiter unten gelistet.


BEMERKUNGEN
===========

   Es wird bei der Rasse P_REAL_RACE geprueft. Der Tarnhelm funktioniert
   also nicht.

   Bei Erweiterungsvorschlaegen wendet euch bitte an einen EM oder
   inheritet im Zweifelsfall nach Absprache.
   NIEMALS solchen Code einfach KOPIEREN. Spaeter muss nur irgendwer
   eurem alten Code hinterherraeumen.

   Aktuelle Liste der pruefbaren Parameter:

   P_LEVEL
     Mindeststufe, die das Lebewesen besitzen muss, um die Aktion
     auszufuehren.
   P_GUILD_LEVEL
     Gildenlevel, das das Lebewesen mindestens erreicht haben muss, um die
     Aktion auszufuehren.
   SR_SEER
     Ist gesetzt, wenn das Lebewesen Seher sein muss.
     Auswertung nur fuer Interactives, NSC ignorieren das Flag.
   P_XP
     Mindestmenge an Erfahrungspunkten, die ein Lebewesen besitzen muss,
     um die Aktion auszufuehren.
   P_QP
     Mindestmenge an Abenteuerpunkten, die das Lebewesen haben muss.
   P_ALCOHOL
     Menge an Alkohol, unter der der Alkoholspiegel des Lebewesen liegen
     muss, um die Aktion noch ausfuehren zu koennen.
   P_DRINK
     Menge an Fluessigkeit, unter der der Fluessigkeitsspiegel des
     Lebewesen liegen muss, um die Aktion noch ausfuehren zu koennen.
   P_FOOD
     Beinhaltet die Menge an Nahrung, unter der der Nahrungsspiegel des
     Spielers liegen muss, um die Aktion noch ausfuehren zu koennen.
   P_DEAF
     Ist gesetzt, falls der Spieler nicht taub sein darf.
   P_FROG
     Ist gesetzt, falls der Spieler kein Frosch sein darf.
   P_BLIND
     Ist gesetzt, falls der Spieler nicht blind sein darf.
     Achtung: das ist nicht gleichbedeutend mit dem Umstand, dass er evtl.
     nichts mehr sehen kann. Auch andere Gruende (zum Beispiel Dunkelheit)
     koennen bewirken, dass ein Spieler nichts mehr sieht.
   A_INT, A_DEX, A_CON, A_STR
     Jeweilige Mindesthoehe eines Attribut, um eine Aktion ausfuehren zu
     koennen.
   SR_BAD, SR_GOOD
     Gibt an, wie [minimal] boese bzw. wie [maximal] gut ein Charakter sein
     darf, um eine Aktion ausfuehren zu koennen.
   SR_MIN_SIZE, SR_MAX_SIZE
     Gibt die minimale, bzw. die maximale Groesse an, die ein Charakter
     maximal haben darf, um eine Aktion ausfuehren zu koennen.
   SR_FREE_HANDS
     Gibt an, wieviele freie Haende ein Charakter fuer diese Aktion
     besitzen muss.
   SR_EXCLUDE_RACE
     Mitglieder aller in dieser Liste aufgefuehrten Rassen koennen
     diese Aktion nicht ausfuehren.
   SR_INCLUDE_RACE
     Mitglieder aller NICHT in dieser Liste aufgefuehrten Rassen koennen
     diese Aktion nicht ausfuehren.
   SM_RACE
     Hier kann pro Rasse ein Mapping mit besonderen (nur) fuer diese Rasse
     geltenden Einschraenkungen vorgenommen werden. Als Keys sind die
     in dieser Manpage beschriebenen Keys erlaubt, wobei SM_RACE nicht
     rekursiv ausgewertet wird.
     Der Rassenname ist gross geschrieben und "*" steht fuer alle Rassen.
   SR_EXCLUDE_GUILD
   SR_INCLUDE_GUILD
     Diese beiden Keys verhalten sich wie SR_*_RACE, nur dass hier Gilden
     genannt werden.
   SR_FUN
     Hier kann eine Funktion angegeben werden, die aufgerufen wird, um sie
     die Restriktionen zu pruefen zu lassen. Folgende Formen sind moeglich:
     - Funktionsname als String; Funktion wird an dem Objekt gerufen, das
       die Restriktion prueft, d.h. an der Ruestung/Waffe/Kleidung. Soll
       die Funktion an einem anderen Objekt gerufen werden, ist eine
       der beiden alternativen Formen zu verwenden.
     - eine Closure, wird per funcall() gerufen
     - ein Array mit dem folgenden Aufbau:
       ({ Objekt/Objektname, Funktionsname, arg_1, arg_2, ... , arg_n })

     Der aufgerufenen Funktion wird das Spielerobjekt immer als erstes
     Argument uebergeben, d.h. bei der Array-Form ggf. vor dem ersten
     Extra-Argument arg_1 eingeschoben.
     SR_FUN kann nuetzlich sein, um Restriktionen zu pruefen, die sich mit
     den anderen Optionen nicht abbilden lassen.
     Ist der Test nicht bestanden, muss die Funktion einen String zurueck-
     geben, ansonsten 0.
     Eine Besonderheit besteht beim Aufruf per call_other(), d.h. wenn
     restriction_checker.c nicht geerbt wurde und nur ein Funktionsname
     uebergeben wird. In diesem Fall, der auch bei Verwendung von
     P_RESTRICTIONS zum Tragen kommt, wird die Funktion immer am
     aufrufenden Objekt, d.h. previous_object(), gerufen.
   SR_PROP
     Hier kann ein Mapping mit Properties und zugehoerigen Werten angegeben
     werden, die jeweils auf Identitaet geprueft werden. Zusaetzlich sollte
     eine Meldung angegeben werden, die als Fehlermeldung ausgegeben wird,
     wenn der Spieler die Bedingung nicht erfuellt. Es sollte immer eine
     passende Meldung fuer den Spieler eingebaut werden. Beispiel:
     ([ SR_PROP: ([P_AUSGANG_ENTDECKT: 1; "Dein Schwert fluestert "
         "veraergert: Ich werde Dir erst dann zu Diensten sein, wenn Du "
         "Dich als wuerdig erwiesen hast!"]) ])
     Aufgrund der Meldung wird empfohlen, SR_PROP nicht in Restriktionen
     einzusetzen, die massenweise in Savefiles landen (z.B.
     Spielersavefiles).
   SR_QUEST
     Hier kann ein String-Array mit den Namen (Keys) der Quest(s) angegeben
     werden, die der Spieler bestanden haben muss, um die Aktion ausfuehren
     zu koennen.
   SR_MINIQUEST
     Hier kann entweder ein String-Array mit den Ladenamen der vergebenden
     Objekte oder ein Int-Array mit den Index-Nummern (IDs) der
     Miniquest(s) (empfohlen!) angegeben werden, die der Spieler bestanden
     haben muss, um die Aktion ausfuehren zu koennen.


BEISPIELE
=========

   // #1 Levelbeschraenkung in der Abenteurergilde
   AddSpell("feuerball",20,
            ([SI_SKILLRESTR_LEARN:([P_LEVEL:15]), ...

   // #2 Glaubenstest im Klerus
   AddSpell("bete",
            ([SI_SKILLRESTR_LEARN: ([P_GUILD_LEVEL : LVL_NOVIZE,
                                     SR_FUN : #'glaubensTest ]), ...
   // mit
   static string glaubensTest(object pl) {
     if (pl->QueryProp(K_STRENGTH) < 8000)
       return ("Deine Glaubensstaerke laesst zu wuenschen uebrig!\n");
     return 0;
   }

   // #3 SM_RACE-Modifikation der Restriktionen:
   //    haertere Restriktionen fuer Zwerge
   //    - hoeheres Level
   //    - zusaetzlich A_STR pruefen
   ([P_LEVEL:15,
     A_INT:10,
     SM_RACE: (["Zwerg": ([P_LEVEL:17, A_STR:20])])])
   // ist identisch zu
   ([SM_RACE: (["*":     ([P_LEVEL:15, A_INT:10]),
                "Zwerg": ([P_LEVEL:17, A_INT:10, A_STR:20])])])


SIEHE AUCH
==========

   execute_anything(L), AddSpell (Gilde), P_RESTRICTIONS

3. Januar 2014, Arathorn
