Ein Ball zum Werfen
![]()
// Dieser Ball besitzt eine schon komplexere Funktion für das Werfen. // Wir leiten aus dem Standard-Objekt der Mudlib ab. inherit "std/thing"; // Diese Headerfile enthalten alle nötigen Defines, um // unser Objekt zu implementieren. Insbesondere sind dies // die Propertienamen und Defines für die Bewegung von // Objekten. #include <properties.h> #include <moving.h> // JEDES Objekt muß diese Funktion implementiert haben. // Sie wird vom Mudtreiber aufgerufen, wenn eine Instanz // des Objektes erzeugt werden soll. void create() { if (!clonep()) return; // Ein Objekt ist dann kein 'clonep', wenn es sich nur // um eine Blueprint (sozusagen eine Objektvorlage) handelt. // Um Speicher zu sparen wird das 'create' für Blueprints // nicht ausgeführt. ::create(); // Hiermit rufen wir das aus dem inheriteten Objekt geerbte // 'create' auf. Dies ist ABSOLUT notwendig, da dort wichtige // Initialisierungen durchgeführt werden. AddId(({"ball", "strandball", "\n_bsp_strandball"}), ({"baelle", "strandbaelle"})); // Mit AddId wird angegeben, unter welchen Bezeichnungen dieses // Objekt vom Spieler angesprochen werden kann. Hier sollte man // immer genügend viele Angaben machen, damit die Spieler nicht // lange nach der richtigen Bezeichnung suchen müssen. // Die Id "\n_bsp_strandball" ist für eine eindeutige Kenn- // zeichnung des Objektes gedacht. das '\n' wird als 'newline' // behandelt und kann von Spielern nicht eingegeben werden. SetProp(P_NAME, "Standball"); SetProp(P_PLURAL, "Strandbaelle"); SetProp(P_GENDER, MALE); SetProp(P_ARTICLE, ART_AUTO); // Diese Angaben ermöglichen es der Mudlib, das Objekt stets // richtig zu deklinieren. P_NAME stellt den Namen des Objektes // im Singular, P_PLURAL den für den Plural dar. // Das grammatikalische Geschlecht des Objektes ist männlich, // und es wird je nach Notwendigkeit ein bestimmter oder un- // bestimmter Artikel benutzt. SetProp(P_NAME_ADJ, ({"gelb", "getuepfelt" })); AddAdjective(({"gelber", "gelbe", "gelbem", "gelben", "getuepfelter", "getuepfelte", "getuepfeltem", "getuepfelten"})); // Mit diesen Befehlen werden die Ajektive des Balles definiert. // Er soll hier gelb getüpfelt sein. Mit dem ersten Befehl werden // die Ajektive mit dem Namen dekliniert und ausgegeben. Durch den // zweiten Befehl läßt sich der Ball von Spielern auch als // "gelber ball" oder "getüpfelten ball" oder "gelbe getüpfelte // ball" ansprechen (erweiterte Id) SetProp(P_LONG, "Was fuer ein huebscher kleiner Strandball." " Wem koenntest Du ihm den mal zuwerfen?" ); // Die Property P_LONG beinhaltet die Langbeschreibung des Objektes. // Sie wird z.B. beim Untersuchen des Balles an den Spieler ausgegeben. AddDetail(({"farbe", "tupfen"}), "Der Ball ist weiss mit gelben Tupfen."); // Mit AddDetail können wir dem Ball ein paar untersuchbare Details // hinzufügen. So kann ein Spieler jetzt z.B. die Tupfen an dem // Ball untersuchen. Mit Details sollte man nie sparsam sein, denn // sie sorgen für die Atmospähre :) SetProp(P_VALUE, 50); SetProp(P_WEIGHT, 250); SetProp(P_BULKINESS, 40); // Diese Werte spezifizieren die physikalischen Eigenschafen wie // Gewicht (250 Gramm) und 'Größe' (40) des Objektes. P_VALUE // gibt den Wert des Objektes in Bernsteinen (hier 50) an. // Bei diesen Werten sollte die Verhältnismäßigkeit nicht // aus den Augen gelassen werden. AddCmd("wirf|werf|werfe", "wurf"); // Hiermit definiert man die spezielle Aktion des Werfens, welche // mit diesem Ball möglich ist. Dafür wird dann die untenstehende // Funktion "wurf" ausgeführt, falls der Spieler das Kommando // werfe, werf oder wirf eingibt. Man sollte darauf achten, daß // natürliche Sätze als Eingabe akzeptiert werden. } /*******************************************/ /* Die grundlegenden Funktionen enden hier */ /*******************************************/ // Eine Beispielaktion für den Ball. // // Diese Funktion wird aufgerufen, wenn der Spieler in der 'Nähe' // (also wenn der Ball sich im Inventory des Spielers befindet, oder // wenn sich Ball und Spieler im gleichen Container (z.B. einem Raum) // aufhalten) des Balles eines der mit AddCmd angegebenen Kommandos // benutzt. // // Derartige Funktionen haben stets die Form: // int funktionsname(string argument) // // Falls die Funktion mit dem Kommando nichts anfangen kann, so ist // 0 zurückzugeben. Wenn das Kommando erfolgreich bearbeitet wurde, // ist 1 zurückzugeben. Falls die Funktion mit 0 beendet wurde, und // kein weiteres Objekt in der Nähe des Spielers auf das benutzte // Kommando reagiert, so gibt der Treiber den mit notify_fail an- // gegebenen Fehlertext an den Spieler aus und beendet die Abarbeitung // des Kommandos. (Es wird immer das zuletzt angegebene notify_fail // verwendet!) // // Im übergebenen Argument steht der NACH dem Verb eingegebene Text // (Bei 'wirf ball zu elric' also 'ball zu elric') oder 0, falls kein // Text angegeben wurde. int wurf(string argument) { string dummy1, dummy2; string ziel; object zielObj; notify_fail("WAS willst Du WEM zuwerfen?\n"); // Diese Meldung wird ausgegeben, falls diese Funktion eine 0 // als Ergebnis hat und danach keine weitere Funktion zu diesem // Kommando aufgerufen werden konnte. if (!stringp(argument) || !strlen(argument)) return 0; // Wenn kein Argument übergeben wurde, oder das Argument nicht // vom Typ String ist, hat der Spieler nur das Kommando angegeben, // nicht aber wem er was zuwerfen will. Daher geben wir hier 0 // zurück denn ohne diese Information können wir nichts sinnvolles // tun. argument = lower_case(argument); // Hier wandeln wir den String in Kleinbuchstaben um, falls // der Spieler etwas Eigennamen groß geschrieben hat. if ((sscanf(argument, "%s %s zu", dummy1, dummy2 ) != 2) && (sscanf(argument, "%s zu %s", dummy1, dummy2) != 2)) return 0; // Wenn der string argument in keines der beiden Muster paßt, dann // kann die Funktion mit dem argument nichts anfangen. Möglich wird // durch die zweite Form auch ein "wirf elric zu ball". Sollte // jemand so etwas tippen, macht das aber auch nichts. if (id(dummy1)) ziel = dummy2; else if (id(dummy2)) ziel = dummy1; else return 0; // Welches der Argumente spricht den Ball an? Das andere muß dann // das Ziel des Balls sein. Falls keines der Argumente den Ball // bezeichnet, können wir mit dem Kommando nichts anfangen und // geben daher 0 zurück. zielObj = present(ziel, environment(this_player())); // Wir suchen ein Objekt in der Umgebung des Spielers, // welches sich durch 'ziel' angesprochen fühlt. if (!objectp(zielObj)) { tell_object(this_player(), break_string("Hier ist kein '" + capitalize(ziel) + "'.")); return 1; // Wir haben kein passendes Objekt gefunden und geben daher // eine Fehlermeldung aus. Außerdem wird 1 zurückgegeben, // da der Ball das Kommando bearbeiten konnte. Er hat zwar // kein Ziel gefunden, aber man kann ja nicht alles haben... } if (!living(zielObj)) { tell_object(this_player(), break_string("Und wie soll " + zielObj->name(WER, NAME_DEF) + " den Ball fangen?")); return 1; // Nur lebende Wesen sollen Bälle fangen können. Das Define // ART_DEF im Aufruf von name(...) erzwingt die Verwendung eines // bestimmten Artikels (der, die, das). } tell_object(this_player(), break_string(sprintf("Du wirfst %s den Ball zu.", zielObj->name(WEM, NAME_DEF)))); tell_room(environment(this_player()), break_string(sprintf("%s wirft %s einen" " Ball zu.", this_player()->name(WER, NAME_AUTO|NAME_CAP), zielObj->name(WEM, NAME_AUTO))), ({zielObj, this_player()})); tell_object(zielObj, break_string(sprintf("Hoppla, %s wirft Dir einen Ball" " zu.", this_player()->name(WER, NAME_AUTO|NAME_CAP)))); // Hier geben wir die Meldungen aus. Die erste geht an den Spieler, die // zweite an alle im Raum befindlichen außer dem Werfenden und dem Ziel // und die letzte an das Zielobjekt. if (move(zielObj, M_PUT) >= MOVE_OK) return 1; // 'move' bewegt das Objekt und das 'zielObj' und benutzt dabei die // Methode M_PUT. 'Geben' ist zwar nicht ganz der richtige Ausdruck, // kommt aber am nächsten an den Sachverhalt heran. move(environment(this_player()), M_DROP); // Falls die Bewegung zum Zielobjekt aus irgendeinem Grund nicht // klappt, so soll der Ball zu Boden fallen. tell_room(environment(this_player()), break_string(sprintf("Aber %s kann ihn nicht" " fangen und der Ball plumpst zu Boden.", zielObj->QueryPronoun(WER))), ({zielObj})); tell_object(zielObj, break_string("Aber Du kannst ihn nicht fangen. Der Ball" " plumpst zu Boden.")); // Hier geben wir nochmal Meldungen aus. Die erste an alle im Raum außer // dem Fangenden und die andere an den Fangenden. return 1; // Fertig, jetzt können wir die Funktion mit 1 (Erfolg) beenden. } |
| Start » Magierhandbuch » Dokumentation » Programmierbeispiele » Ball | |
|
| |