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
|