STANDARD KLASSE:
	"/std/thing" 

BENUTZUNG:
	inherit "/std/thing";

	#include <thing.h>
	#include <properties.h>

PROPERTIES:
	<thing/commands>
		P_COMMANDS	-- Befehle assoziiert mit dem Objekt
	<thing/description>
		P_NAME		-- Name
		P_NAME_ADJ	-- Namensadjektiv
		P_SHORT		-- Kurzbeschreibung
		P_LONG		-- Langbeschreibung
		P_IDS		-- Identifikatoren (Feld von Zeichenketten)
		P_ADJECTIVES	-- Adjektive zur Beschreibung
	<thing/language>
		P_ARTICLE	-- Artikel des Objekts
		P_GENDER	-- Geschlecht des Objekts
	<thing/moving>
		P_NODROP	-- Kann nicht fallengelassen werden
		P_NOGET		-- Kann nicht genommen werden
	<thing/properties>
		P_UID		-- User ID
		P_EUID		-- Effektive User ID
	<thing/restrictions>
		P_WEIGHT	-- Gewicht des Objekts
		P_TOTAL_WEIGHT	-- Gewicht inklusive des Inhalts
	
MAKROS:
	<thing/properties>
		F_VALUE		-- Propertywert
		F_MODE		-- Propertymodus umschalten
		F_MODE_AS	-- Propertymodus setzen
		F_MODE_AD	-- Propertymodus loeschen
		  SAVE		  -- Property wird gespeichert
		  PROTECTED	  -- Property is geschuetzt
		  SECURED	  -- Property kann nie mehr geaendert werden
		  NOSETMETHOD	  -- Property besitzt keine Setzfunktion
		F_SET_METHOD	-- Funktion zum setzen der Property
		F_QUERY_METHOD	-- Funktion zum lesen der Property
	<thing/language>
		MALE, FEMALE, NEUTER 	-- Geschlechter
		WER, WESSEN, WEM, WEN 	-- Fall
		RAW 			-- fuer Namen ohne Artikel
		SINGULAR, PLURAL 	-- Zeiten
	
FUNKTIONEN:
	"/std/thing/commands":
		varargs void AddCmd(mixed cmd, mixed func, int flag);
		varargs void RemoveCmd(mixed cmd);
	"/std/thing/description":
		varargs int id(string str, int lvl);
		void AddId(mixed str);
		void AddAdjective(mixed str);
		string name(int casus,int demon);
	"/std/thing/language":
		varargs string QueryArticle(int casus, int dem, int force);
		varargs int SuggestArticle(string id);
		varargs string QueryPossPronoun(mixed what, int casus, 
		                                int number);
		string QueryPronoun(int casus);
		varargs string QueryDu(int casus,int gender, int zahl);
		string QueryGenderString();
		varargs string DeclAdj(string adj, int casus, int demon);
	"/std/thing/properties":
		varargs mixed Set(string name, mixed Value, int Type); 
		varargs mixed Query(string name, int Type);
		mixed SetProp(string name, mixed Value);
		mixed QueryProp(string name);
		void SetProperties(mapping props);
		mapping QueryProperties();
	"/std/thing/moving":
		int move(mixed dest,int method);
		varargs int remove();

ERLAEUTERUNG:
	"/std/thing" ist eine generelle Klasse fuer Objekte aller Art.
	Es bietet generelle Funktionalitaet zur Erstellung von neuen
	Klassen und Objekten. Sie kann mittels der zur Verfuegung
	stehenden Funktionen konfiguriert werden:

	** "/std/thing/commands":
	varargs void AddCmd(mixed cmd, mixed func, int flag);
	  Um dem Objekt die Moeglichkeit zu geben, auf Befehle zu reagieren,
	  kann mit AddCmd() Kommandos definiert werden, die eine bestimmte
	  Funktion (func) aufrufen. flag entscheidet darueber, ob das Kommando
	  (cmd) abgekuerzt werden kann (flag = 1) oder nicht (flag = 0).

	varargs void RemoveCmd(mixed cmd);
	  Man kann die Kommandos jederzeit wieder mit der Funktion RemoveCmd()
	  entfernen.

	** "/std/thing/description":
	varargs int id(string str, int lvl);
	  Die Funktion id() behandelt die Identifikatoren eines Objektes, 
	  welche in der Property P_IDS gespeichert sind. Jedesmal, wenn ein
	  Objekt durch Kommandos wie "nimm", "lass fallen" etc referenziert
	  werden soll, wird id() mit dem Namen des Objektes aufgerufen. Dabei
	  werden dann die Elemente von P_IDS mit str verglichen und das Ergeb-
	  nis (WAHR/FALSCH == 1/0) zurueckgegeben. lvl ist fuer die Behandlung
	  von Lebewesen notwendig, siehe living.
	
	void AddId(mixed str);
	  Mittels dieser Funktion kann ein oder mehrere neue Identifikatoren
	  der Liste der bestehenden, Standard ist "ding", hinzugefuegt werden.

	void AddAdjective(mixed str);
	  Um den Objekten die Moeglichkeit zu geben, sich besser zu beschreiben
	  oder zur besseren Identifizierung, kann man mit AddAdjective() dem
	  Objekt naeher beschreibende Adjektive hinzufuegen. Diese sind in
	  P_ADJECTIVES gespeichert.

	string name(int casus,int demon);
	  Diese Funktion liefert den Namen des Objektes mit allen zusaetzlichen
	  Attributen im gewuenschten Fall (casus), demonstrativ (demon = 1) 
	  oder nicht demonstrativ (demon = 0).

	** "/std/thing/language":
	varargs string QueryArticle(int casus, int dem, int force);
	  Artikel im passenden Fall sowie demonst. bzw undemonst. zurueck-
	  geben. force ueberschreibt das SetArticle-Flag.

	varargs int SuggestArticle(string id);
	  Empfehle einen Artikel fuer das Objekt, getestet wird, ob ausser
	  diesem Objekt sich ein anderes Objekt mit der id im selben
	  Raum befindet.

	varargs string QueryPossPronoun(mixed what, int casus, int number);
	  Gib ein Pronomen zurueck, das ausdrueckt, das ein Objekt diesem
	  Objekt gehoert. Dabei ist what das Geschlecht des Objektes.

	string QueryPronoun( casus );
	  Er/Sie/Es u.ae. zurueckgeben.

	varargs string QueryDu(int casus,int gender, int zahl);
	  Du im passenden Fall zurueckgeben (siehe QueryArticle()).

	string QueryGenderString();
	  Gibt das Geschlecht in Worten zurueck.

	varargs string DeclAdj(string adj, int casus, int demon); 
	  Dekliniere Adjektive adj mit Casus casus.

	** "/std/thing/properties":
	varargs mixed Set(string name, mixed Value, int Type); 
	  Setze einen Wert einer Property direkt, wobei der Typ des Wertes
	  (Value) durch F_VALUE, F_MODE, F_SET_METHOD, F_QUERY_METHOD (Type)
	  angegeben wird. 
	  F_VALUE -- darf ein beliebiger Wert sein
	  F_MODE  -- muss eine Zahl sein (SAVE, PROTECTED, SECURED, 
	             NOSETMETHOD)
	  F_SET_METHOD, F_QUERY_METHOD -- 0 oder eine Closure

	varargs mixed Query(string name, int Type);
	  Lies den Wert einer Property aus. Dabei gibt Type an, welchen Wert
	  (F_VALUE, F_MODE, F_SET_METHOD, F_QUERY_METHOD) man auslesen will.

	mixed SetProp(string name, mixed Value);
	  Setze den Wert einer Property. Dabei wird, falls vorhanden, der Wert
	  noch durch die F_SET_METHOD behandelt (z.B. Typueberpruefung).
	  Dies sollte die Standardmethode zum Setzen einer Property sein!
  
	mixed QueryProp(string name);
	  Lies den Wert einer Property, wobei der eigentliche Wert durch die,
	  falls vorhanden, F_QUERY_METHOD behandelt wird. Als Beispiel dient
	  hier die Behandlung des Gesamtgewichts, welches durch Abfragen von
	  P_TOTAL_WEIGHT ausgelesen werden kann; hierbei errechnet die 
	  F_QUERY_METHOD von P+_TOTAL_WEIGHT erst das totale Gewicht.
	  Dies sollte die Standardmethode sein um eine Property auszulesen!

	void SetProperties(mapping props);
	  Diese Funktion kann die in props gespeicherten Properties im Objekt
	  unterbringen. Dabei werden schon vorher als PROTECTED oder SECURED
	  gekennzeichnete Properties NICHT ueberschrieben.

	mapping QueryProperties();
	  Liefert ein mapping, welches von SetProperties() behandelt werden
	  kann.

	** "/std/thing/moving":
	int move(mixed dest,int method);
	  Jedesmal, wenn ein Objekt bewegt werden soll, wird die Funktion
	  move() aufgerufen, welche dann das eigentliche Bewegen ausfuehrt.
	  Dazu muss der Funktion ein Ziel (dest) als Zeichenkette oder als
	  Objekt und eine Methode der Bewegung uebergeben werden.
	
	varargs int remove();
	  Wird ein Objekt zerstoert, wird die Funktion remove() aufgerufen.
	  Rueckgabewert 1 bedeutet Erfolg und 0 Misserfolg der Zerstoerung.

VERERBUNGSBAUM:
	thing
	  |-thing/commands
	  |-thing/description
	  |-thing/language
	  |-thing/moving
	  |-thing/properties
	  `-thing/restrictions

SIEHE AUCH:
	properties, closures 
