AUTOR MG, den 22.08.92, Don Rumata
This file is part of the Morgengrauen-Mudlib from Jof and Rumata
VERSION 1.1
AKTUALISIERT: MG, den 14.10.93, Chris
VERSION 1.2
AKTUALISIERT: WL, den 16.09.94, Troy
THEMA BENNENUNG VON OBJEKTEN IM MorgenGrauen
INHALT:
I. Einleitung
II. Funktonen, die alle Objekte besitzen muessen
III. Unterstuetzung der Funktionen durch die MG_mudlib
IV. Benennung von Raeumen
V. Benennung von Monstern
VI. Adjektive
I. EINLEITUNG
Jedes Objekt in der Mudlib muss auf folgende Weisen identifiziert
werden koennen:
1.) Es muss einen Namen haben, der innerhalb eines Satzes das
Objekt bezeichnen kann (gilt nicht fuer Raeume).
2.) Es muss eine Kurzbeschreibung besitzen.
3.) Es muss eine ausfuehrliche Beschreibung besitzen.
4.) Es muss eine Menge von Synonymen ("ids") kennen, mit denen
ein Spieler das Objekt "ansprechen" kann (nicht Raeume).
II. FUNKTIONEN, DIE DIE ALLE OBJEKTE BESITZEN MUESSEN
Jedes Objekt in MorgenGrauen sollte folgende Funktionen
implementiert haben:
1.) name( fall, dem )
Diese Funktion soll den Namen des Objektes im jeweiligen
Fall mit Artikel (wenn es einen besitzt) zurueckgeben,
sodass der Rueckgabewert in einen Satz eingearbeitet werden
kann.
"fall" dient zur Deklination des Objektnamens.
Hierbei gelten fuer die Faelle folgende Werte:
Fall Wert #define (mit #include <properties.h>)
NOMINATIV 0 WER (kann auch weggelassen werden)
GENITIV 1 WESSEN
DATIV 2 WEM
AKKUSATIV 3 WEN
"dem" bestimmt, welche Artikel benutzt werden sollen.
Moegliche Werte fuer "dem":
0 Benutze unbestimmte Artikel (Normalfall).
1 Benutze bestimmte Artikel.
2 Benutze bestimmte Artikel, wenn sich mit dem Objekt
kein gleichartiges Objekt im selben Raum befindet,
sonst benutze einen unbestimmten.
Statt der 2 kann auch ein String uebergeben werden.
In diesem Fall wird getestet, ob sich ein Objekt mit
dem String als id im selben Raum befindet.
2.) short()
Diese Funktion liefert eine Beschreibung, die ausgegeben
wird, wenn der Raum, in dem das Objekt sich befindet,
betrachtet wird.
3.) long()
Diese Funktion liefert eine Beschreibung, die ausgegeben
wird, wenn das Objekt angeschaut wird. Im Unterschied zur
2.4.5 Mudlib wird die Beschreibung jedoch nicht ausgegeben,
sondern als return-Wert zurueckgegeben.
4.) id( str )
Diese Funktion soll 1 zurueckgeben, wenn str eine Zeichen-
folge ist, die das Objekt bezeichnen koennte. Diese Zeichen-
folge wird in kleinen Buchstaben uebergeben.
5.) _query_invis()
Wenn ein Objekt unsichtbar ist, soll es beim Aufruf dieser
Funktion 1 zurueckgeben. Sichtbare Objekte brauchen diese
Funktion nicht zu implementieren.
III. UNTERSTUETZUNG DER FUNKTIONEN DURCH DIE MG_MUDLIB
Wenn ein eigenes Objekt aus den Standartobjekten abgeleitet
wird, sind alle diese Funktionen bereits fertig definiert.
Es muessen beim Erzeugen der Objekte nur noch die entspechenden
Werte mitgeteilt werden. Dieses geschieht mit folgenden Funk-
tionen, die am besten in create() aufgerufen werden.
1.) SetProp( P_NAME, string );
In name() wird der uebergebene String dekliniert und automatisch
mit Artikeln versehen. Diese Funktion bedenkt auch Faelle, an
die ihr wahrscheinlich nie gedacht habt. Der Genitiv von der
Lahme ist zB des Lahmen! Auch fuer andere Faelle bietet diese
Funktion maechtige Unterstuetzung.
Wenn der String nicht mit Artikeln versehen werden soll, so kann
man das mittels des Aufrufs "SetProp( P_ARTICLE, 0 )" tun.
Damit die Funktion name() ueberhaupt den richtigen Artikel
auswaehlen kann, muss man mit "SetProp( P_GENDER, gender)" das
Gechlecht des Objektes bekannt machen. Als gender kann man
MALE (Wert 1), FEMALE (Wert 2) und NEUTER (Wert 0, Normalfall)
verwenden.
Ist das Objekt unsichtbar, so darf string trotzdem nicht 0 sein;
stattdessen ist "SetProp( P_INVIS, 1 )" aufzurufen. (Die Zeile
"#include <properties.h>" nicht vergessen. :-)
Da dieses Verfahren sehr fehleranfaellig ist, ist fuer den Namen
ein Array von Namen zulassen, sodass fuer jeden Fall ein Wort
uebergeben werden kann. Beispiel.:
SetProp( P_NAME, ({ "Mensch", "Menschen", "Menschen", "Menschen" }) );
2.) SetProp( P_SHORT, string )
In short() wird der uebergebene String ausgegeben. Mittels des
process_string-Mechanismus (siehe /doc/efun/process_string)
koennen auch variable Teile in dem String vorkommen.
string braucht fuer unsichtbare Objekte nicht auf 0 gesetzt
werden. Ist das Objekt jedoch staendig unsichtbar (z.B. ein
Fluch, etc.), dann setzt man am besten P_SHORT auf 0. Man
braucht sich dann nicht um P_INVIS zu kuemmern.
3.) SetProp( P_LONG, string )
Dito.
4.) AddId( string ); oder
AddId( ({ string1, string2, ..., stringn }) );
Nehme den/die String/s in die Menge der Zeichenketten auf, auf die
die eingebaute id-Funktion mit 1 antworten soll, bzw. fuege die
Menge von Strings den P_IDS hinzu. Bitte nicht SetProp(P_IDS,...)
verwenden.
5.) *** obsolete: funktioniert NUR bei Spielern; von hier ***
Es reicht, SetProp( P_INVIS, 1 ) aufzurufen, wenn das
Objekt unsichtbar wird, und SetProp( P_INVIS, 0 ), wenn es wieder
sichtbar wird (sofern es diesen Zustand aendert, siehe P_SHORT).
*** bis hier ***
Fuer alle anderen Objekte (ausser Spielern) muss man P_SHORT auf 0
(die Zahl Null) setzen (der Leerstring "" erzeugt ein "Nichts
besonderes".
IV. BENENNUNG VON RAEUMEN
Bei Raeumen wird die long() bzw. short()-Beschreibung nur dann
benutzt, wenn der Raum *von aussen* angeschaut wird. Fuer eine
Beschreibung des Raumen von Innen sind folgende Funktionen
bereitgestellt:
1.) SetProp( P_INT_SHORT, string );
Gebe eine Beschreibung des Raumes fuer den "kurz"-Modus aus.
2.) SetProp( P_INT_LONG, string );
Gebe eine ausfuehrliche Beschreibung des Raumes zurueck.
Wenn man in dem Raum spezielle Vorrichtungen *einfach* einbauen
moechte, dann hilft oft auch in Raeumen:
1.) SetProp( P_NAME, string ); und
2.) Setprop( P_GENDER, int );
Als Beispiel nehme man folgendes an: Der Raum sei das obere Ende
eines Schachtes. Innerhalb der Beschreibung oder der Details
taucht ein Haken auf, an dem der Spieler ein Seil (/obj/seil)
befestigen koennen soll. Um dies relativ *billig* zu modellieren,
genuegt es, dem Raum den P_NAME "Haken" und das P_GENDER MALE zu
geben (sowie die laut Seil noetigen Funktionen einzubauen). Da
Namen von Raeumen selten bis gar nicht verwendet werden, stoert
dieses Property nicht im Geringsten. Im angesprochenen Fall kann
es nuetzlich sein dem Raum mittels AddId die Id "haken" zu geben.
Dann kann der Spieler wirklich "binde seil an haken" eingeben.
V. BENENNUNG VON MONSTERN
Es ist wichtig, das Monster nicht denselben Namen wie Spieler
haben. Deshalb gibt es eine Liste von reservierten Namen fuer
Monster. Die Liste kann man unter /secure/BANISH anschauen.
Hierbei ist zu beachten, dass die Regelung NUR fuer den Aufruf
der Funktion set_living_name("name") notwendig ist. Diese
Funktion setzt einen "lebenden" Namen, so dass das Monster z.B.
getranst werden kann.
Um einen neuen Namen in die Liste einzutragen, muss man seinen
Regionsmagier bescheid sagen, wie das Monster heissen soll und
eine Begruendung fuer den Namen. Dieser wird dann den Namen
reservieren, oder bescheid geben, wenn das nicht geht.
Dazu fuehrt der Regionsmagier den Befehl "banish name begruendung"
in der Abenteurergilde aus.
VI. ADJEKTIVE
Um den Namen evtl. noch etwas farbiger zu gestalten oder eine
Unterscheidungsmoeglichkeit grundsaetzlich gleichartiger Objekte
zu bieten, gibt es noch die Adjektive. Hierzu stehen zwei
Funktionen zur Verfuegung:
1.) SetProp(P_NAME_ADJ,"grundform") oder
SetProp(P_NAME_ADJ,
({"grundform1","grundform2",...,"grundformn"}) )
Mit dieser Funktion setzt man ein oder mehrere sogenannte
Namensadjektive, die bei jeder Ausgabe des Namens mittels name()
mitdekliniert und mit ausgegeben werden. Beispiel:
...
SetProp(P_NAME,"Ork");
SetProp(P_GENDER,MALE);
SetProp(P_NAME_ADJ,"fies");
...
Bei Aufruf von name(WESSEN,1) fuer den Ork wird z.B. "des fiesen
Orks" zurueckgegeben. Mehrere im Array angegebene Adjektive werden
als Aufzaehlung vorangestellt.
Hiermit kann man das Objekt aber NICHT mit z.B. "toete fiesen ork"
ansprechen. Dazu dient die naechste Funktion:
2.) AddAdjective("adj") oder
AddAdjective( ({ "adj1","adj2",...,"adjn" }) );
Dieser Funktion muessen die DEKLINIERTEN Adjektive uebergeben
werden. Im obigen Fall also:
AddAdjective( ({ "fieser","fiesen","fiesem","fiese"}) );
Man beachte, dass alle moeglichen Faelle einzeln uebergeben
werden. Sonst wuerden Konstrukte wie "toete fieser ork"
auftreten.
Mit Hilfe dieser beiden Funktionen kann man nun z.B. mehrere
Orks in einen Raum stellen, die unterschiedliche Adjektive
haben und dadurch eindeutig identifizierbar sind. Trotzdem
funktioniert natuerlich die "alte" Methode mit z.B.
"unt ork 2".
MERKE: Adjektive werden NICHT ausgegeben, wenn das Property
P_ARTICLE auf 0 (die Zahl Null) gesetzt wurde. In diesem Fall
werden SOWOHL Artikel ALS AUCH Adjektive weggelassen.
|