Dokumentation zu: restriktionen(WL)

HR Image


KONZEPT:
        Restriktionen mit /std/restrictor.c & /sys/restrictor.h

AUTOR:
        Holger@Wunderland (10.11.1998)

EINLEITUNG:
        Erklaert werden sollen die Moeglichkeiten des Restriktors und 
        die Properties/Defines die er verarbeiten kann. Grundsaetzlich kann
        der Restriktor fuer alle moeglichen Aufgaben herangezogen werden,
        der Schwerpunkt liegt aber auf den Gildenleveln und der Vergabe von
        Fertigkeiten in den Gilden.

GRUNDSAETZLICH, WAS KANNER?
        Der Restriktor hat im Grunde nur 2 wichtige Funktionen:

            string check_restrictions(object pl, mapping restr, int flag)

            static varargs mixed 
            execute_anything(mixed fun, mixed arg1, mixed arg2)

        Durch das Inheriten in 'eigne' Objekte kann man beide Funktionen
        nutzen. Die erste der beiden Funktionen ist fuer die Restriktionen
        wichtig. Argument 'pl' ist der Spieler, an dem die Restriktionen
        geprueft werden sollen, 'restr' ist ein Mapping, das die Restrik-
        tionen enthaelt. Sind alle Bedingungen in dem Mapping erfuellt, gibt
        die Funktion 0 zurueck, ansonsten einen String, der beschreibt, was
        nicht erfuellt ist. Ist Flag gesetzt, werden ALLE Bedingungen ge-
        liefert, die nicht erfuellt sind. Eine 3. Funktion dient zur Ausgabe
        eines Textes aller Bedingungen:

            string show_restrictions(object pl, mapping restr)

        Sie wird vor allem in /std/guild.c eingesetzt, um die Aufstiegs-
        und Fertigkeiten-Bedingungen anzuzeigen.

WIE SIEHT DAS MAPPING AUS?
        Grundsaetzlich sind die Keys Defines, die aussagen, was gecheckt
        werden soll und Element 0 ist dann der zu ueberpruefende Wert.

        Folgende Properties verarbeitet der Restriktor direkt:
          P_LEVEL, P_GUILD_LEVEL, P_XP, P_QP, P_ALCOHOL, P_DRINK, P_FOOD,
          P_QUESTS, P_SIZE, P_WEIGHT, P_GENDER

        Weiterhin kennt er folgende Attribute:
          A_INT, A_DEX, A_STR, A_CON

        Und letztlich gibts noch ein paar eigne Defines:
          R_EXCLUDE_RACE, R_INCLUDE_RACE, R_GOOD, R_BAD, R_FREE_HANDS,
          R_SEER, R_EXPLORED, R_MONEY, R_QP, R_QP_MAX, R_ABILITIES,
          R_TALLER, R_SMALLER, R_HEAVIER, R_LIGHTER, R_KERBEN,
          R_DIFF_KERBEN, R_QUOTE_ABIL, R_EXPLORED_SEER, R_PROC_KERBEN

        Ein spezielles Define ist R_FUN, das eine Funktion enthalten kann,
        die aufgerufen wird. Als Argumente werden der aktuelle Spieler
        uebergeben und ein Flag. Dieses Flag ist 0, wenn die Restriktionen
        an dem Spieler ueberprueft werden sollen und 1, wenn die Restrik-
        tionen nur gezeigt werden sollen - also noch kein konkreter Test
        durchgefuehrt werden soll. (Also 0 ist der Normalzustand und 1
        waere das Flag etwa, wenn der Spieler 'zeige beitrittskosten' oder
        aehnliches in der Gilde aufruft)
        Liefert sie 0, wird normal fortgefahren, liefert sie einen String,
        wird abgebrochen und der String zurueckgegeben. R_FUN sowie alle
	anderen Defines duerfen pro Level_mapping natuerlich nur einmal
	vorkommen. Wenn also mehrere Sachen extra pro Level gecheckt
	werden sollen, muessen diese zusammengefasst werden in einer R_FUN.

WARUM DIE EIGNEN DEFINES?
        Bei den meisten Werten, lassen sich Properties direkt miteinander
        vergleichen. Zum Beispiel P_XP. Steht im Mapping beispielsweise:
          ([ P_XP : 488 ])
        wird direkt der P_XP-Wert des Spielers mit 488 verglichen. Das geht
        aber nicht immer, wie zum Beispiel bei der Ueberpruefung, ob der 
        Spieler eine bestimmte Menge Geld hat, und deshalb wurden eigne 
        Defines eingefuehrt. Bei anderen ist eine prozentuale Restriktion
        'nutzvoller', als eine absolute Angabe. Auch hier werden eigne
        Defines benutzt.

UND WIE GENAU FUNKTIONIEREN DIE DEFINES?
        Im folgenden werden alles Defines (Keys) und deren Wirkung im 
        Restriktionen-Mapping beschrieben ([ KEY : X ]):

        P_LEVEL        - Spieler muss mind. Spielerlevel X haben
        R_SEER         - Spieler muss Seher sein
        P_GUILD_LEVEL  - Spieler muss mind. Gildenlevel X haben
        P_XP           - Spieler muss mind. X Erfahrungspunkte haben
        P_QP           - Spieler muss mind. X Questpunkte haben
        R_QP           - Spieler muss mind. X Prozent QPs fuer Seherlevel haben
        R_QP_MAX       - Spieler muss mind. X Prozent ALLER Questpunkte haben
        P_ALCOHOL      - Spieler darf nicht mehr Alkohol als X haben
        P_DRINK        - Spieler darf nicht mehr als X getrunken haben
        P_FOOD         - Spieler darf nicht mehr als X gegessen haben
        P_QUESTS       - Spieler alle im Array X befindlichen Quest geloest
                         haben.
                         Bsp: ([ P_QUESTS : ({15}) ]) // Geistheilung

        R_TALLER       - Spieler muss mind. R_TALLER cm. gross sein
        R_SMALLER      - Spieler darf nicht mehr als R_SMALLER cm. gross sein
        R_HEAVIER      - Spieler muss mind. R_HEAVIER Gramm wiegen
        R_LIGHTER      - Spieler darf nicht mehr als R_LIGHTER Gramm wiegen

        A_INT          - Spieler muss mind. Intelligenz X haben
        A_DEX          - Spieler muss mind. Geschicklichkeit X haben
        A_STR          - Spieler muss mind. Kraft X haben
        A_CON          - Spieler muss mind. Ausdauer X haben

        R_EXCLUDE_RACE - Array aus kleingeschriebenen 'ausgeschlossenen' Rassen
                         Bsp: ([R_EXCLUDE_RACE: ({"marrane", "elf"}) ])
                         Spieler _darf kein_ Marrane oder Elf sein.
        R_INCLUDE_RACE - Array aus kleingeschriebenen 'eingeschlossenen' Rassen
                         Bsp: ([R_INCLUDE_RACE: ({"marrane", "elf"}) ])
                         Spieler _muss_ ein Marrane oder Elf sein.
        R_GOOD         - Spieler muss _besseres_ Align als X haben!
        R_BAD          - Spieler muss _schlechteres_ Align als X haben.
        R_FREE_HANDS   - Spieler muss X freie Haende haben.
        R_EXPLORED     - Spieler muss mind. X Prozent (!) aller Forschungs-
                         punkte im Mud haben. (0-100)
        R_EXPLORED_SEER- Spieler muss mind. X Prozent (!) aller Forschungs-
                         punkte die fuer Seher noetig sind haben (0-100)
                         Es sind auch Werte >100 erlaubt aber nicht erwuenscht
                         SeherFP's = max 45% aller Forschungspunkte im Mud
                         (dh. der Wert darf 222 nicht ueberschreiten)
        R_MONEY        - Spieler muss soviel Geld in 'Grundeinheiten' dabei
                         haben. Welches Geld des Spielers gezaehlt wird,
                         haengt von P_CURRENCY des Objektes ab
                         Bsp.: P_CURRENCY ist CT_WUNDERLAND
                               ([ R_MONEY: 123 ])
                         Spieler muss mind. 123 Bernsteine oder mehr an
                         Geld dabei haben. Entscheidend ist nur der Wert!
        R_ABILITIES    - X ist ein Mapping aus Fertigkeiten, die der Spieler
                         zu einer bestimmten Promillezahl beherrschen muss.
                         Keys sind die Namen der Fertigkeiten, Values die 
                         noetigen Probabilities. Bsp.:
                         ([ R_ABILITIES : (["feuerball":200, "pfeil":0]) ])
                         Der Spieler muss 'feuerball' zu 20% beherrschen und
                         'pfeil' muss er zumindest gelernt haben.
        R_QUOTE_ABIL   - Ist ein Array aus 2 bis 4 Eintraegen:
			 ({ int quote,     // Promillequote
                            string *abils, // Fertigkeiten
			    string fail,   // Fehlermeldung
			    string msg })  // Anzeigemeldung
			 Damit kann man realisieren, dass der Spieler einen
			 bestimmten Durchschnitt seiner Fertigkeiten be-
			 herrscht. quote=500 heisst: Der Spieler muss die in
			 'abils' angegebenen Fertigkeiten zu durchschnittlich
			 50% beherrschen. Erreicht er es nicht, wird 'fail'
			 ausgegeben, oder eine Standardmeldung, wenn es nicht
			 gesetzt wurde. 'msg' wird angezeigt, wenn der Test
			 ueber show_restrictions() (in der Gilde "liste 
			 erhoehen") laeuft. Wurde es nicht angegeben, wird
			 eine (ziemlich simple) Standardmeldung angezeigt.
        R_KERBEN       - Wenn das ein Integer ist, muss der Spieler mind. 
                         R_KERBEN auf dem kerbholz haben. Wenn R_KERBEN ein
                         Mapping ist, nach dem Format: ([ name : anzahl ]),
                         dann muss er von allen Eintraegen mind. die ange-
                         gebene Anzahl haben.
        R_DIFF_KERBEN  - Der Spieler muss mind. R_DIFF_KERBEN verschiedene
                         Monster auf dem Kerbholz haben
        R_PROC_KERBEN  - Prozent verschiedener Kerben von allen moeglichen
                         verschiedenen Kerben
        R_FUN          - kann eine Funktion enthalten, die aufgerufen wird
                         um eventuell eigne, spezielle Tests durchzufuehren,
                         fuer die der Restriktor standardmaessig nicht ausge-
                         legt ist. Als Argumente werden der Spieler und ein
                         int-Flag uebergeben. Ist das Flag 0 und die Funktion
                         liefert evebfalls 0, gilt die Restriktion als er-
                         fuellt und es wird normal fortgefahren. Liefert sie
                         einen String, wird abgebrochen und der String zu-
                         rueckgegeben. Ist flag==1 wird nur der Text ausge-
                         geben und nicht abgebrochen. Dies dient zum Bei-
                         spiel dazu, die Restriktionen anzuzeigen. Man kann
                         also in Abhaengigkeit vom Flag unterschiedliche
                         (allgemeinere Texte zum Anzeigen) ausgeben.
			 ACHTUNG: Pro Level darf R_FUN natuerlich nur einmal
			 vorkommen. Also alle 'Extra-Restriktionen' muessen
			 in einer Funktion pro Level zusammengefasst werden.
       (R_ITEMS)       - NICHT IMPLEMENTIERT (Hat jemand ne Idee wie?)

ICH WILL MAL EIN BEISPIEL
        Nehmen wir an der Spieler soll 5000 Erfahrungspunkte haben, 10240
        Geldeinheiten bei sich haben, ein Align ueber 500 haben, die Annie-
        quest geloest haben und Fertigkeit 'feuerball' zu 45% beherrschen.
        Das Mapping saehe so aus:

        mapping x;
        x = ([
                P_XP       : 5000,
                R_MONEY    : 10240,
                R_GOOD     : 500,
                P_QUESTS   : ({15}), // Geistheilung
                R_ABILITIES: ([ "feuerball" : 450 ]),
            ]);

        Checken wuerde man jetzt das Mapping 'x' wie folgt:

        string ret;
        if( ret = check_restrictions(player, x) ) {
           write(ret);
           return;
        }
        write(player->name(WER)+" erfuellt alle Bedingungen.\n");

        Das Beispiel muesste sich eigentlich selbst erklaeren, wenn die
        Funktion etwas zurueckgibt, dann ist der Check schief gegangen,
        ansonsten ist es geglueckt.

SIEHE AUCH:
        gildenlevel(WL), mappings(LPC), P_GUILD_SKILLS, P_GUILD_LEVEL,
        P_LEVEL, P_XP, P_QP, P_ALCOHOL, P_DRINK, P_FOOD, P_QUESTS,
        P_ATTRIBUTES, P_ALIGN, P_RACE


Start » Magierhandbuch » Docu » Konzepte » Restriktionen Letzte Generierung: 25.04.2021, 01:58
Email an: mud@wl.mud.de
Valid HTML 4.01!