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