blob: af33a5cba951428d1d4c15226bd3793bf5bd4aac [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001
Zesstra953f9972017-02-18 15:37:36 +01002RegisterHelperObject()
3**********************
MG Mud User88f12472016-06-24 23:31:02 +02004
MG Mud User88f12472016-06-24 23:31:02 +02005
Zesstra953f9972017-02-18 15:37:36 +01006FUNKTION
7========
MG Mud User88f12472016-06-24 23:31:02 +02008
Zesstra953f9972017-02-18 15:37:36 +01009 int RegisterHelperObject(object helper, int type,
10 string|closure callback);
MG Mud User88f12472016-06-24 23:31:02 +020011
MG Mud User88f12472016-06-24 23:31:02 +020012
Zesstra953f9972017-02-18 15:37:36 +010013DEFINIERT IN
14============
MG Mud User88f12472016-06-24 23:31:02 +020015
Zesstra953f9972017-02-18 15:37:36 +010016 /std/living/helpers.c
MG Mud User88f12472016-06-24 23:31:02 +020017
MG Mud User88f12472016-06-24 23:31:02 +020018
Zesstra953f9972017-02-18 15:37:36 +010019ARGUMENTE
20=========
MG Mud User88f12472016-06-24 23:31:02 +020021
Zesstra953f9972017-02-18 15:37:36 +010022 object helper
23 Das Objekt, das bei einem Lebewesen als Hilfsobjekt registriert
24 werden soll. Das Objekt muss sich dazu nicht im Inventar des
25 Lebewesens befinden.
26 int type
27 Helfertyp, einer der in /sys/living/helpers.h definierten Typen:
28 - HELPER_TYPE_AERIAL fuer die Flug-/Segelunterstuetzung
29 - HELPER_TYPE_AQUATIC fuer Tauchunterstuetzung
30 string|closure callback
31 Closure oder Funktionsname als String; dies ist die Funktion, die im
32 Objekt helper gerufen wird, um abzufragen, ob es sich aktuell fuer
33 zustaendig erklaert oder nicht.
34
35
36BESCHREIBUNG
37============
38
39 Das Objekt "helper" wird als Hilfsobjekt fuer bestimmte Aktivitaeten wie
40 zum Beispiel Fliegen oder Tauchen registriert.
41
42
43
44 Die als Callback uebergebene Funktion wird bei der Abfrage der
45 P_*_HELPERS-Properties (siehe unten) aufgerufen und deren
46 Rueckgabewert in der Property vermerkt.
47
48
49
50 Der Rueckgabewert der Callback-Methode muss im Wertebereich
51 0..10000 liegen, wobei ein Wert von 0 bedeutet, dass das Hilfsobjekt
52 sich gerade nicht zustaendig fuehlt. Bei den Werten >0 ist es dem
53 abfragenden Objekt ueberlassen, wie es diese Daten bewertet.
54
55 Die Funktion muss existieren und public sein, d.h. von aussen gerufen
56 werden koennen.
57
58
59
60 Die Funktion bekommt das Spielerobjekt und das abfragende Objekt als
61 Parameter uebergeben.
62
63
64HINWEIS
65=======
66
67 Es ist ein Unterschied, ob sich ein Objekt via UnregisterHelperObject()
68 als Helfer austraegt, oder ob der Aufruf der Callback-Funktion eine
69 0 zurueckgibt. Im letzteren Fall ist das Objekt nach wie vor
70 registriert und kann trotzdem vom abfragenden Objekt als
71 funktionsfaehig angesehen werden.
72
73
74RUECKGABEWERTE
75==============
76
77 1 Objekt wurde erfolgreich registriert (HELPER_SUCCESS)
78 -1 angegebenes Hilfsobjekt existiert nicht (HELPER_NO_CALLBACK_OBJECT)
79 -2 angegebenes Hilfsobjekt ist bereits fuer diese Art der
80 Unterstuetzung registriert (HELPER_ALREADY_LISTED)
81
82
83BEISPIELE
84=========
85
86 a) Eine luftgefuellte Blase will sich als Tauch-Helfer am Spieler
87 anmelden und ist zustaendig, solange sich noch Luft in ihr befindet:
88
89 int luft = 5; // globale Variable z.B. fuer Luftinhalt von 5 Atemzuegen
90
91 // Registrierung im Spielerobjekt
92 if ( TP->RegisterHelperObject(ME, HELPER_TYPE_AQUATIC,
93 "DivingCallback") == HELPER_SUCCESS ) {
94 tell_object(TP, "Du kannst jetzt mit Hilfe der Luftblase unter Wasser "
95 "atmen.\n");
96 }
97
98 // hier koennen natuerlich auch noch komplexere Dinge ablaufen, z.B.
99 // wenn ein Wert zurueckgegeben werden soll, der nicht nur 0 oder 1 ist.
100 public int DivingCallback(object player, object caller) {
101 return (environment(ME)==player && luft>0);
102 }
103
104 b) Ein Spieler befindet sich in einem Raum mit einem steilen Abhang, den
105 man hinunterspringen kann. Dies geht aber nur dann gefahrlos, wenn es
106 Hilfsobjekte gibt, die den (Segel)flug erlauben:
107
108 // cmd_springen() sei die Funktion, die bei der Eingabe des Befehls durch
109 // den Spieler aufgerufen wird.
110 static int cmd_springen(string str) {
111 [...]
112 // Property abfragen
113 mapping helpers = TP->QueryProp(P_AERIAL_HELPERS);
114 // Liste der Werte fuer die einzelnen Unterstuetzungsobjekte ermitteln
115 int *values = m_values(helpers,0);
116 // Spieler schonmal runterbewegen, die Folgen seines Handelns spuert
117 // er dann, wenn er unten angekommen ist.
118 TP->move(zielraum, M_GO|M_SILENT);
119 // "helpers" ist immer ein Mapping, das pruefen wir nicht extra.
120 // Wenn die Liste der Objekte noch mindestens ein Element enthaelt,
121 // nachdem alle unzustaendigen Hilfsobjekte (Rueckgabewert der
122 // Callback-Funktion == 0) rausgerechnet wurden, existiert mindestens
123 // ein geeignetes Hilfsobjekt.
124 if ( sizeof(values-({0})) ) {
125 tell_object(TP, "Sanft segelst Du den Hang hinab.\n");
MG Mud User88f12472016-06-24 23:31:02 +0200126 }
Zesstra953f9972017-02-18 15:37:36 +0100127 else {
128 tell_object(TP, BS("Todesmutig springst Du den Hang hinab und "
129 "schlaegst hart unten auf. Du haettest vielleicht daran denken "
130 "sollen, Dir geeignete Hilfsmittel fuer so eine Aktion zu "
131 "besorgen.");
132 TP->Defend(800, ({DT_BLUDGEON}), ([SP_NO_ACTIVE_DEFENSE:1]), ME);
MG Mud User88f12472016-06-24 23:31:02 +0200133 }
Zesstra953f9972017-02-18 15:37:36 +0100134 return 1;
135 }
MG Mud User88f12472016-06-24 23:31:02 +0200136
MG Mud User88f12472016-06-24 23:31:02 +0200137
Zesstra953f9972017-02-18 15:37:36 +0100138SIEHE AUCH
139==========
MG Mud User88f12472016-06-24 23:31:02 +0200140
Zesstra953f9972017-02-18 15:37:36 +0100141 Funktionen: UnregisterHelperObject()
142 Properties: P_HELPER_OBJECTS, P_AERIAL_HELPERS, P_AQUATIC_HELPERS
143 Sonstiges: /sys/living/helpers.h
MG Mud User88f12472016-06-24 23:31:02 +0200144
14505.02.2015 Arathorn