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 in verschiedenen Formen zum Pruefen der
      Restriktionen angegeben werden, siehe execute_anything().
      Das kann nuetzlich sein, um andere Restriktionen zu pruefen,
      wie das Bestehen von Miniquests oder andere Faehigkeiten/Flags.
      Ist der Test nicht bestanden, gibt die Funktion einen String zurueck.
    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.
    SQ_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

03. Januar 2014, Arathorn
