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

