blob: 1fc29c2121579a5525be100522da2b5f5a79a105 [file] [log] [blame]
AddExtraLook()
**************
FUNKTION
========
varargs int AddExtraLook(string look, [int duration, string key,
string lookende, object ob]);
DEFINIERT IN
============
/std/living/description.c
ARGUMENTE
=========
string look:
* String, der in der Langbeschreibung des Lebewesens
zusaetzlich ausgegeben wird.
* zu rufender Funktionsname, wenn 'ob' angegeben ist
int duration:
* > 0: Dauer der Gueltigkeit des Extralooks in Sekunden.
* 0: Unbegrenzt gueltiger Eintrag. Rebootfest.
* < 0: Bis Ende/Reboot bestehender Eintrag.
string key:
Schluesselwort, unter dem der Eintrag registriert wird und mit
dem man diesen auch mittels RemoveExtraLook() entfernen kann.
Sollte eindeutig sein! Ist 'key' nicht angeben, wird der
Objektname (object_name()) des setzenden Objekts benutzt.
string lookende:
* String, der an das Lebewesen (nur bei Spielern) ausgegeben
wird, wenn der eingetragene Extralook abgelaufen ist.
* zu rufender Funktionsname, wenn 'ob' angegeben ist
object ob:
Ein Objekt, an dem die in 'look' und 'lookende' abgelegten
Methoden bei Abfrage oder Ablauf aufgerufen werden. Die Methoden
bekommen das Living uebergeben und muessen selbst umgebrochene
Strings zurueckgeben.
BESCHREIBUNG
============
Der Extralook erscheint in der Langbeschreibung des Lebewesens.
Texte dafuer koennen mit dieser Funktion hinzugefuegt und verwaltet
werden. Wenn ihr nicht ohnehin unbedingt ein Objekt IM Spieler
ablegt (wie zB eine Ruestung mit einem Extralook) (1), dann ist
diese Methode bevorzugt zu verwenden.
Ueber die Angabe eines 'ob' koennen Looks auch dynamisch erstellt
werden, dabei werden dann 'look' bzw. 'lookende' als Methoden am
Objekt gerufen. (1) Ein so fuer AddExtraLook verwendetes Objekt
'ob' muss nicht wie bisher ueblich im Inv des Spieler liegen!
Direkt angegebene Texte (also nicht von einem Objekt 'ob' bezogen)
werden durch replace_personal() gefiltert und unter Beibehaltung
existierender Umbrueche auf 78 Zeichen umgebrochen.
BEMERKUNGEN
===========
* Die Meldung von <lookende> bzw. der Funktionsaufruf erfolgt,
wenn der Extralook der Lebewesen das erste Mal nach Ablauf der
Gueltigkeit aufgerufen wird.
* Das uebergbene Objekt sollte fuer permanente Eintraege eine
Blueprint sein, da Clones irgendwann (spaetestens mit Reboot)
zerstoert werden und der Eintrag dann bei Abfrage automatisch
geloescht wird.
* Folgerung: Clone-Objekte koennen fuer selbst beschraenkt
temporaere Extralooks benutzt werden.
RUECKGABEWERTE
==============
Siehe auch /sys/living/description.h fuer Konstanten.
* 1, falls der Eintrag erfolgreich registriert wurde.
* < 0 sonst.
* -1: <key> war nicht gueltig und es konnte keiner ermittelt
werden.
* -2: <look> war kein gueltiger String.
* -3: <duration> war kein Integer.
* -4: unter <key> gibt es schon einen Eintrag.
BEISPIELE
=========
// (1) einfacher Eintrag, "fuer die Ewigkeit"
living->AddExtraLook("@WER1 hat den Drachengott der SSP besiegt.");
// (2) Eintrag der nach 1h automatisch weg ist.
living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600);
// (3) Eintrag mit bestimmten Schluessel, damit man ihn wieder entfernen kann
living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600,
"humni_marmeladen_look");
// (4) Mit "Ende"-Meldung, aber kein eigener Schluessel
living->AddExtraLook("@WER1 ist patschnass.", 1200, 0,
"Du bist endlich wieder trocken. Puuh.");
// (5) Mit Objekt, welches den Extralook dynamisch erzeugt
living->AddExtraLook("get_my_special_extralook", 3600, 0, 0,
this_object());
// In diesem Fall muss this_object() natuerlich die Funktion
// "get_my_special_extralook()" definieren, die einen String zurueckgibt
// (6) Mit Objekt, welches den Extralook dynamisch erzeugt
// Hier wird explizit die Blueprint uebergeben, der Extralook ist also
// rebootfest.
living->AddExtraLook("get_my_special_extralook", 3600, 0,
"extralookende", blueprint(this_object()));
// Mit Objekt, was den Extralook und die Endemeldung dynamisch erzeugt
// und keine festgelegte Existenzdauer hat, sondern sich aufgrund
// eigener Konditionen entsorgt
void set_extra_look(object living) {
object dyntemplook = clone_object("/path/to/some/object");
if(living->AddExtraLook("get_my_special_extralook", 0,
object_name(dyntemplook),
0, dyntemplook) == XL_OK)
dyntemplook->SetProp(P_INTERNAL_EXTRA_LOOK, living);
else
dyntemplook->remove();
}
// entsprechendes Objekt:
varargs int remove(int silent) {
object ob = QueryProp(P_INTERNAL_EXTRA_LOOK);
// wenn der Spieler da ist, entfernen wir den Look regulaer
if(objectp(ob))
ob->RemoveExtraLook(object_name(this_object()));
return ::remove(silent);
}
void reset() {
if(!random(10))
remove();
else
::reset();
}
SIEHE AUCH
==========
Verwandt:
RemoveExtraLook(), P_INTERNAL_EXTRA_LOOK, HasExtraLook()
Sonstiges:
replace_personal(), break_string()
Fuer Spielerobjekte:
P_EXTRA_LOOK
5. Juni 2017 Gloinson