| RegisterHelperObject() |
| ********************** |
| |
| |
| FUNKTION |
| ======== |
| |
| int RegisterHelperObject(object helper, int type, |
| string|closure callback); |
| |
| |
| DEFINIERT IN |
| ============ |
| |
| /std/living/helpers.c |
| |
| |
| ARGUMENTE |
| ========= |
| |
| object helper |
| Das Objekt, das bei einem Lebewesen als Hilfsobjekt registriert |
| werden soll. Das Objekt muss sich dazu nicht im Inventar des |
| Lebewesens befinden. |
| int type |
| Helfertyp, einer der in /sys/living/helpers.h definierten Typen: |
| - HELPER_TYPE_AERIAL fuer die Flug-/Segelunterstuetzung |
| - HELPER_TYPE_AQUATIC fuer Tauchunterstuetzung |
| string|closure callback |
| Closure oder Funktionsname als String; dies ist die Funktion, die im |
| Objekt helper gerufen wird, um abzufragen, ob es sich aktuell fuer |
| zustaendig erklaert oder nicht. |
| |
| |
| BESCHREIBUNG |
| ============ |
| |
| Das Objekt "helper" wird als Hilfsobjekt fuer bestimmte Aktivitaeten wie |
| zum Beispiel Fliegen oder Tauchen registriert. |
| |
| |
| |
| Die als Callback uebergebene Funktion wird bei der Abfrage der |
| P_*_HELPERS-Properties (siehe unten) aufgerufen und deren |
| Rueckgabewert in der Property vermerkt. |
| |
| |
| |
| Der Rueckgabewert der Callback-Methode muss im Wertebereich |
| 0..10000 liegen, wobei ein Wert von 0 bedeutet, dass das Hilfsobjekt |
| sich gerade nicht zustaendig fuehlt. Bei den Werten >0 ist es dem |
| abfragenden Objekt ueberlassen, wie es diese Daten bewertet. |
| |
| Die Funktion muss existieren und public sein, d.h. von aussen gerufen |
| werden koennen. |
| |
| |
| |
| Die Funktion bekommt das Spielerobjekt und das abfragende Objekt als |
| Parameter uebergeben. |
| |
| |
| HINWEIS |
| ======= |
| |
| Es ist ein Unterschied, ob sich ein Objekt via UnregisterHelperObject() |
| als Helfer austraegt, oder ob der Aufruf der Callback-Funktion eine |
| 0 zurueckgibt. Im letzteren Fall ist das Objekt nach wie vor |
| registriert und kann trotzdem vom abfragenden Objekt als |
| funktionsfaehig angesehen werden. |
| |
| |
| RUECKGABEWERTE |
| ============== |
| |
| 1 Objekt wurde erfolgreich registriert (HELPER_SUCCESS) |
| -1 angegebenes Hilfsobjekt existiert nicht (HELPER_NO_CALLBACK_OBJECT) |
| -2 angegebenes Hilfsobjekt ist bereits fuer diese Art der |
| Unterstuetzung registriert (HELPER_ALREADY_LISTED) |
| |
| |
| BEISPIELE |
| ========= |
| |
| a) Eine luftgefuellte Blase will sich als Tauch-Helfer am Spieler |
| anmelden und ist zustaendig, solange sich noch Luft in ihr befindet: |
| |
| int luft = 5; // globale Variable z.B. fuer Luftinhalt von 5 Atemzuegen |
| |
| // Registrierung im Spielerobjekt |
| if ( TP->RegisterHelperObject(ME, HELPER_TYPE_AQUATIC, |
| "DivingCallback") == HELPER_SUCCESS ) { |
| tell_object(TP, "Du kannst jetzt mit Hilfe der Luftblase unter Wasser " |
| "atmen.\n"); |
| } |
| |
| // hier koennen natuerlich auch noch komplexere Dinge ablaufen, z.B. |
| // wenn ein Wert zurueckgegeben werden soll, der nicht nur 0 oder 1 ist. |
| public int DivingCallback(object player, object caller) { |
| return (environment(ME)==player && luft>0); |
| } |
| |
| b) Ein Spieler befindet sich in einem Raum mit einem steilen Abhang, den |
| man hinunterspringen kann. Dies geht aber nur dann gefahrlos, wenn es |
| Hilfsobjekte gibt, die den (Segel)flug erlauben: |
| |
| // cmd_springen() sei die Funktion, die bei der Eingabe des Befehls durch |
| // den Spieler aufgerufen wird. |
| static int cmd_springen(string str) { |
| [...] |
| // Property abfragen |
| mapping helpers = TP->QueryProp(P_AERIAL_HELPERS); |
| // Liste der Werte fuer die einzelnen Unterstuetzungsobjekte ermitteln |
| int *values = m_values(helpers,0); |
| // Spieler schonmal runterbewegen, die Folgen seines Handelns spuert |
| // er dann, wenn er unten angekommen ist. |
| TP->move(zielraum, M_GO|M_SILENT); |
| // "helpers" ist immer ein Mapping, das pruefen wir nicht extra. |
| // Wenn die Liste der Objekte noch mindestens ein Element enthaelt, |
| // nachdem alle unzustaendigen Hilfsobjekte (Rueckgabewert der |
| // Callback-Funktion == 0) rausgerechnet wurden, existiert mindestens |
| // ein geeignetes Hilfsobjekt. |
| if ( sizeof(values-({0})) ) { |
| tell_object(TP, "Sanft segelst Du den Hang hinab.\n"); |
| } |
| else { |
| tell_object(TP, BS("Todesmutig springst Du den Hang hinab und " |
| "schlaegst hart unten auf. Du haettest vielleicht daran denken " |
| "sollen, Dir geeignete Hilfsmittel fuer so eine Aktion zu " |
| "besorgen."); |
| TP->Defend(800, ({DT_BLUDGEON}), ([SP_NO_ACTIVE_DEFENSE:1]), ME); |
| } |
| return 1; |
| } |
| |
| |
| SIEHE AUCH |
| ========== |
| |
| Funktionen: UnregisterHelperObject(), GetHelperObject() |
| Properties: P_HELPER_OBJECTS, P_AERIAL_HELPERS, P_AQUATIC_HELPERS |
| Sonstiges: /sys/living/helpers.h |
| |
| 05.02.2015 Arathorn |