/*
 *----------------------------------------------------------------------
 * obj_geruest
 * Dieses File ist Teil der Morgengrauen-Mudlib.
 * Dieses File wird optimal formatiert, wenn Tabulatoren 4 Zeichen breit
 * sind.
 *
 * Allgemeines Geruest fuer ein Objekt. Wer eigene Objekte schreibt,
 * sollte sie nicht ganz so intensiv kommentieren wie dieses hier, aber
 * hier sollen gleichzeitig, die grundlegenden Mechanismen erlaeutert
 * werden.
 *
 * 16.08.92 Rumata
 * Ueberarbeitet am 24.08.94 von Viper
 *----------------------------------------------------------------------
 */
inherit "std/thing";            /* Leite aus den std-Objekten ab */

#include <language.h>           /* Stelle Namen der Faelle und der Geschlechter */
							/* dem Objekt zur Verfuegung. */

create()
{
	::create();
		/* Diese Zeile NIEMALS vergessen!!! */

	AddId( "ball" );        
	AddId( "strandball" );
		/* Unter diesen Bezeichnungen fuehlt der Ball sich "angesprochen" */
		/* Mann sollte mit Ids nicht sparen, damit die Spieler nicht ewig  */
		/* nur nach dem richtigen Namen eines Objektes suchen muessen. */

	SetProp( P_NAME, "Ball" );
	SetProp( P_GENDER, MALE );
	SetProp( P_ARTICLE, 1 );
		/* Diese Meldungen ermoeglichen es der Mudlib, das Objekt richtig */
		/* zu deklinieren. SetProp(P_ARTICLE, 1) kann wegfallen, da 1 Default ist. */

	SetProp( P_SHORT, "Ein bunter Ball" );
	SetProp( P_LONG, "Was fuer ein huebscher kleiner Strandball.\n"
			+"Wem koenntest Du den mal zuwerfen?\n" );
		/* Beschreibungen zur Betrachtung des Balls. */

	SetProp( P_VALUE, 10 );
	SetProp( P_WEIGHT, 250 );
		/* Bei diesen Werten sollte die Verhaeltnismaessigkeit */
		/* nicht aus den Augen gelassen werden. */
}

init()
{
	::init();
		/* NICHT VERGESSEN */
		/* Wenn keine eigenen Aktionen definiert werden sollen, so kann die */
		/* Funktion init ganz weggelassen werden. Ein init, das nur */
		/* ::init() aufruft ist ueberfluessig. */

	add_action( "wurf", "werf", 1 );
	add_action( "wurf", "wirf" );
		/* werfe, werf oder wirf jemandem den Ball zu. Man sollte darauf */
		/* achten, dass natuerliche Saetze als Eingabe akzeptiert werden. */
}

/*************************************************************************/
/************* Die grundlegenden Funktionen enden hier *******************/
/*************************************************************************/


/* Eine Beispielaktion fuer den Ball. */
wurf( argument )
{
	/* "werf ball rumata zu" wird als Argument "ball rumata zu" bekommen. */
	string arg1, arg2;
	string ziel;
	object zielObj;

	if ( sscanf( argument, "%s %s zu", arg1, arg2 ) != 2 ) return 0;
		/* Rueckgabe von 0 bedeutet, dass dieses Objekt mit der Eingabe */
		/* nichts anfangen konnte, und dass der Gamedriver das naechste */
		/* Objekt befragen soll. */

	if ( id( arg1 ) )
			/* Welches der Argumente spricht den Ball an ? */
			/* Das andere muss dann das Ziel des Balls sein. */
		ziel = arg2;
	else if ( id( arg2 ) )
		ziel = arg1;
	else
		return 0;
			/* Keines der Argumente war der Ball. */

	zielObj = present( ziel, environment() );
		/* Suche ein Objekt, das sich als Ziel angesprochen fuehlt. */

	if ( ! zielObj )
	{
		write( "Hier ist kein \"" + ziel + "\".\n" );
		return 1;
			/* Hier wird 1 zurueckgegeben, da der Ball das Kommando den  */
			/* Befehl bearbeiten konnte. Er hat zwar kein Ziel gefunden, */
			/* aber man kann ja nicht alles haben. :-) */
	}
	
	if( !living( zielObj ) )
	{
		write( "Und wie soll " + zielObj->name(WER,1) + " den Ball fangen?\n" );
		return 1;
			/* Nur lebende Wesen sollen Baelle fangen koennen. */
	}

	write( "Du wirfst " + zielObj->name(WEN,1) + " den Ball zu.\n" );
			/* Mitteilung an den Werfer */
	say( PL->name(WER,2) + " wirft " + zielObj->name(WEM,2)
		+ " einen Ball zu.\n", zielObj );
			/* Mitteilung an alle Wesem im selben Raum. */
	tell_object( zielObj, "Hoppla, " + PL->name(WER,2)
		+ " wirft Dir einen Ball zu.\n" );
			/* Mitteilung an den Beworfenen */

	if ( move( zielObj ) ) return 1;
		/* Es hat geklappt. */

	move( environment() );
		/* Im Fehlerfall soll der Ball zu Boden fallen. */

	write( "Aber " + zielObj->QueryPronoun(WER)
		+ " kann ihn nicht fangen.\nDer Ball plumpst zu Boden.\n" );
	say( "Aber " + zielObj->QueryPronoun(WER)
		+ " kann ihn nicht fangen.\nDer Ball plumpst zu Boden.\n", zielObj );
	tell_object( zielObj,
		"Aber Du kannst ihn nicht fangen.\nDer Ball plumpst zu Boden.\n" );

	return 1;
}
