MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // (c) by Padreic (Padreic@mg.mud.de) |
| 2 | |
| 3 | #include <properties.h> // wieder unsere allgemeinen Propertys |
| 4 | #include <moving.h> // einige Defines zum Bewegen von Objekten (s.u.) |
| 5 | |
| 6 | inherit "/std/thing"; |
| 7 | |
| 8 | protected void create() |
| 9 | { |
| 10 | ::create(); |
| 11 | // Objekt ueber seine Properties beschreiben... |
| 12 | SetProp(P_SHORT, "Ein Rubbellos"); |
| 13 | SetProp(P_LONG, |
| 14 | "Du kannst dieses Los aufrubbeln um zu sehen, ob Du einen grossen " |
| 15 | "Schatz\ngewonnen hast.\n"); |
| 16 | SetProp(P_NAME, "Rubbellos"); |
| 17 | SetProp(P_ARTICLE, 1); // ist eigentlich bereits Defaultwert |
| 18 | SetProp(P_GENDER, NEUTER); |
| 19 | SetProp(P_VALUE, 1000); |
| 20 | SetProp(P_WEIGHT, 500); |
| 21 | SetProp(P_INFO, "Deine Gewinnchancen bei diesen Losen sind nicht " |
| 22 | "sonderlich gut.\n"); |
| 23 | SetProp(P_MAGIC, 0); // (einfach nur, um mal alle Properties zu benutzen) |
| 24 | AddId("los"); // noch eine id angeben... |
| 25 | |
| 26 | // Mit Hilfe dieser neuen wichtigen Funktion ist es moeglich, Befehle zu |
| 27 | // definieren, ueber die man irgendetwas ausloesen koennen soll: |
| 28 | // Und zwar wird sobald ein Spieler den Befehl rubble oder rubbel |
| 29 | // benutzt, die Funktion _rubbeln() hier im Objekt aufgerufen. Da diese |
| 30 | // Funktion bisher ja noch nicht definiert ist, muss diese natuerlich |
| 31 | // auch noch programmiert werden. |
| 32 | AddCmd(({"rubble", "rubbel"}), "_rubbeln"); |
| 33 | } |
| 34 | |
| 35 | // Diese Funktion sieht gleich um einiges komplexer aus als die Funktionen |
| 36 | // create(), init() und reset(), die bisher benutzt wurden. |
| 37 | // Das static am Anfang erklaert nur, dass diese Funktion nicht von aussen, |
| 38 | // sondern nur von innerhalb des Objektes aufgerufen werden kann. |
| 39 | // Das "int" anstelle des "void" bedeutet, dass die Funktionen ein Ergebnis |
| 40 | // zurueckliefert. Da diese Funktion in Verbindung mit AddCmd() benutzt |
| 41 | // wird, hat dieser Rueckgabewert auch eine besondere Bedeutung: |
| 42 | // Eine 1 bedeutet, dass der Befehl fertig abgearbeitet wurde. |
| 43 | // Eine 0 bedeutet, das Objekt konnte mit dem Befehl nichts anfangen, der |
| 44 | // Gamedriver muss also noch in weiteren Objekten anfragen, die der |
| 45 | // Spieler bei sich traegt. |
| 46 | // Der String 'str', den die Funktion als Parameter uebergeben bekommt, |
| 47 | // enthaelt das, was der Spieler ausser dem eigentlichen Verb eingegeben |
| 48 | // hat (Woerter wie 'und', 'ein', 'der', 'die', 'das' ... werden hierbei |
| 49 | // zuvor herausgefiltert) |
| 50 | // Bsp.: rubbel los -> _rubbeln("los") |
| 51 | // rubbel katze -> _rubbeln("katze") |
| 52 | // rubbel los auf -> _rubbeln("los auf") |
| 53 | public int _rubbeln(string str) |
| 54 | { |
| 55 | // Die Funktion notify_fail() ist wieder eine Funktion des Gamedrivers: |
| 56 | // Und zwar ist es moeglich hier eine Meldung anzugeben, die anstelle |
| 57 | // eines "Wie bitte?" kommt, falls kein Objekt den Befehl richtig |
| 58 | // abgearbeitet hat. |
| 59 | notify_fail("Syntax: rubbel los auf\n"); // eigentlich efun::notify_fail() |
| 60 | |
| 61 | // Wenn der uebergebene String ungleich "los auf" ist, dann fuehlt sich |
| 62 | // das Objekt nicht angesprochen, kann das Verb also nicht komplett |
| 63 | // abarbeiten und gibt deshalb eine 0 zurueck. |
| 64 | if (str!="los auf") return 0; |
| 65 | |
| 66 | // Auch die Funktion random() ist wieder eine Funktion des Gamedriver: |
| 67 | // Und zwar liefert sie eine ganzzahlige Zufallszahl zwischen 0 und n-1 |
| 68 | // (wobei n die uebergebene Zahl ist). In diesem Fall also zwischen |
| 69 | // 0 und 99. |
| 70 | if (random(100)<92) { // sollte diese Zahl < 92 sein, dann tue Folgendes: |
| 71 | write("Du rubbelst das Los auf. Leider war es jedoch nur eine Niete.\n" |
| 72 | +"Veraergert laesst Du das Los deshalb fallen.\n"); |
| 73 | } |
| 74 | else { // sollte die Zahl nicht < 92 gewesen sein, dann tue Folgendes: |
| 75 | object ob; // bereitstellen einer Hilfsvariablen |
| 76 | |
| 77 | write("Du rubbelst das Los auf und strahlst vor Freude. Es war der " |
| 78 | +"absolute Hauptgewinn.\nSofort kommt ein Bote herein und " |
| 79 | +"ueberreicht Dir Deinen Gewinn.\n"); |
| 80 | |
| 81 | // Mit clone_object() kann man ein beliebiges Objekt Clonen, indem man |
| 82 | // einfach den entsprechenden Filenamen als Parameter uebergibt. |
| 83 | ob=clone_object("/doc/beispiele/Praxis-Kurs/juwelen"); |
| 84 | |
| 85 | // Nun kommen gleich 3 neue Dinge auf einmal... |
| 86 | // Mit -> wird eine Funktion in einem anderen Objekt aufgerufen |
| 87 | // (alternativ auch: call_other(ob,move,this_player(), M_GET); ) |
| 88 | // Die Funktion, die hierbei aufgerufen werden soll, heisst move(). |
| 89 | // Diese Funktion ist in allen Objekten definiert, die /std/thing erben. |
| 90 | // Somit koennen wir also fest davon ausgehen, dass sie auch in unseren |
| 91 | // Juwelen vorhanden ist. |
| 92 | // this_player() ist eine sehr wichtige Gamedriver-Funktion, da sie |
| 93 | // uns das Lebewesen zurueckliefert, das gerade aktiv durch einen Befehl |
| 94 | // den aktuellen Funktionsaufruf gestartet hat. |
| 95 | // M_GET ist lediglich ein Define, das in moving.h definiert ist. |
| 96 | // Naeheres hierzu findet man auch in <man move>. |
| 97 | ob->move(this_player(), M_GET); |
| 98 | // ACHTUNG: um dieses Beispiel simpel zu halten, wird hier darauf |
| 99 | // verzichtet, zu pruefen, ob diese Bewegung ueberhaupt funktioniert |
| 100 | // hat. Normalerweise muss man in diesem Fall (misslungene Bewegung) |
| 101 | // eine Fehlerbehandlung durchfuehren (z.B. ob wieder entfernen, |
| 102 | // Meldung an den Spieler ausgeben). |
| 103 | } |
| 104 | |
| 105 | // Die Funktion say() gibt an alle Spieler im Raum des aktiven Spielers |
| 106 | // eine Nachricht aus, aber nicht an den betroffenen Spieler selbst! |
| 107 | // Die Funktion Name(), die hier im Spieler aufgerufen wird, wertet |
| 108 | // dessen Propertie P_NAME aus und dekliniert den Namen im angegebenen |
| 109 | // Fall. |
| 110 | say(this_player()->Name(WER)+" rubbelt ein Los auf.\n"); |
| 111 | |
| 112 | // Und nun soll sich das Objekt selbst entfernen (zerstoeren). |
| 113 | remove(); |
| 114 | |
| 115 | // Da der Befehl ja komplett abgearbeitet wurde, geben wir eine 1 |
| 116 | // zurueck. |
| 117 | return 1; |
| 118 | } |