blob: f3b41e88b33951710979386c910caf6d837deb8c [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// (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
6inherit "/std/thing";
7
8protected 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")
53public 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}