// This file is part of UNItopia Mudlib.
// ----------------------------------------------------------------
// File:        /room/bsp/obj/kissen.c
// Description: Ein Kissen
// Author:      Unbekannt.
// Modified by:

//
//   Dies ist ein Beispielobjekt zur Illustration der Grammatikfunktionen
//

inherit "/i/item";
//	Fuer einen gewoehnlichen Gegenstand inherited (erbt) man /i/item 

inherit "/i/move";
//	Und da man es im Spiel umherbewegen will braucht man auch noch /i/move

inherit "/i/value";
//	Das Kissen soll auch noch einen Wert haben, also brauchen wir /i/value

#include <message.h>

//	create() wird beim Erschaffen des Objekts aufgerufen.
void create()
{
//	Wieder das uebliche:
   set_name("kissen");
   set_gender("saechlich");
   set_adjektiv("bequem");
   set_id("kissen");
   set_weight(1);
   set_value(10);
   set_long("Ein bequemes Sitzkissen. Man kann sich darauf setzen mit 'sitz'.");
}


//	init() wird bei Kontakt mit Lebewesen aufgerufen.
void init()
{
   add_action("sitz_funktion", "sitz");
}

//	Die Funktion zum Hinsetzen.
int sitz_funktion(string str)
{
   this_player()->send_message(
//      send_message sendet an alle im Raum ausser this_player die Meldung.
     MT_LOOK,
//      Diese Meldung kann jeder sehen, daher MT_LOOK
     MA_MOVE,
//      Hinsetzen ist eine Bewegung und das ist der Grund dieser Meldung
     wrap(Der(this_player())+" setzt sich auf "+seinen()+"."));
//	Meldung an alle anderen Spieler im Raum:
//	"Garthan setzt sich auf sein gemuetliches Kissen."
//	
//	Man benoetigt hier spezielle Grammatikfunktionen, weil man ja
//	nicht weiss, ob sich ein ER oder eine SIE (oder gar ein ES) 
//	auf das Kissen setzt!!!
//	Es koennte ja auch heissen:
//	
//	"Laura setzt sich auf ihr gemuetliches Kissen."
//	
//	Das Probelm loesen die Grammatikfunktionen intern und liefern
//	den richtigen Satzteil zurueck.
//	
//	Uebergibt man den Grammatikfunktionen ein Objekt also bei
//	Der() war das this_player(), so liefern sie den gewuenschten
//	Satzteil fuer dieses Objekt zurueck.
//	
//	Ist dagegen kein Objekt angegeben, wie bei seinen(), dann 
//	bezieht sich das auf this_object() (hier das Kissen).
//	Also: seinen() == seinen(this_object())
//	
//	Auch wenn der this_player() jetzt (seltsamerweise) ein Ork
//	waere, wuerde die Grammatikfunktion Der() das gewuenschte
//	Resultat liefern:
//	
//	"Der Ork setzt sich auf sein gemuetliches Kissen."
//	
//	Die zweite Funktion muss seinen() heissen, weil der Satzteil
//	im Akkusativ benoetigt wird ( setzt sich auf WEN? )
//	und als Namen fuer die Grammatikfunktion immer die 
//	maennlichen Formen verwendet wurden: (auf seinen ... Ast)
//	
//	seinen() sucht zusaetzlich auch noch automatisch den Besitzer
//	raus: Derjenige der das Kissen bei sich hat ist der Besitzer.
//	
//	Hat das Kissen gar kein Besitzer, so ergibt sich folgendes:
//	
//	"Garthan setzt sich auf das gemuetliche Kissen."
//	
//	KURZ: Man braucht sich um fast nichts zu kuemmern, wenn man 
//	die Grammatikfunktionen verwendet.
//	Man muss nur die richtigen Funktionsnamen (fuer den
//	maennlichen Fall) verwenden. FERTIG.
//	
//	Hier eine Auswahl an Funktionen:
//	 
//	der(), Der(), ein(), Ein(), 
//	des(), Des(), eines(), Eines(),
//	dem(), Dem(), einem(), Einem(),
//	den(), Den(), einen(), Einen()
//	sein(), seines(), seinem(), seinen(), Sein(),...
//	dein(), deines(), deinem(), ...
//	
//	Die Grammatikfunktionen fuegen Adjektive des Objekts gleich
//	in der richtigen Form in den Satzteil ein, wenn nicht anders verlangt.
//	hier: das 'gemuetlich'.
//	
//	ALLES WEITER IN: /doc/funktionsweisen/grammatik/deklin 
//	
//      Das wrap sorgt fuer einen ordentlichen Zeilenumbruch, da man nicht
//      davon ausgehen kann, dass die Meldung nur eine Zeile lang ist.

   this_player()->send_message_to(this_player(), MT_LOOK, MA_MOVE,
     wrap("Zum Testen: "+Der(this_player())+" setzt sich auf "+seinen()+"."));
//	Das gleiche nochmal explizit an Dich, zum Testen.

   this_player()->send_message_to(this_player(), MT_LOOK|MT_NOTIFY, MA_MOVE,
     wrap("Du setzt dich auf "+deinen()+"."));
//	Und die Meldung fuer den Handelnden, diesmal mit deinen()

   return 1;
}

