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
