FUNKTION:
varargs void AddFoodOrDrink(string Name, mixed ids, int liquid,
int solid, int strength, float heal, float heal2,
mixed prefun, mixed postfun, mixed price, mixed msgs, int type)
IMPLEMENTIERT:
/std/pub.c
ARGUMENTE:
Name: Name der Speise auf der Speisekarte
ids: ID(s) der Speise zum Bestellen (String oder Array)
liquid: Fluessigkeitsmenge in der Speise (*)
solid: Feststoffmenge in der Speise (*)
strength: Alkoholgehalt in Prozent (*)
heal: Heilfaktor (Lebenspunkte) -2.0 bis 2.0 (*)
heal2: Heilfaktor (Magiepunkte) -2.0 bis 2.0 (*)
prefun: Funktionsname oder Closure oder Msg-Array vor Verzehr
postfun: Funktionsname oder Closure oder Msg-Array nach Verzehr
price: Preis in Grundwaehrung (int) oder Null oder Faktor (float)
msgs: Verzehrfehlschlagmeldungen (*)
type: Getraenk/Speise-Erkennung (fuer Menue)
(*) Siehe auch eat_and_drink(L) fuer naehere Beschreibung. Die
Werte werden dorthin direkt weitergegeben
BESCHREIBUNG:
Erzeugt eine Speise (oder ein Getraenk, hier wird alles 'Speise'
genannt) auf der Speisekarte der Kneipe.
Die Speise wird auf der Speisekarte unter 'Name' aufgelistet und
kann mit einer der bei 'ids' angegebenen Woerter bestellt werden.
Gibt es mehrere gleiche IDs fuer verschiedene Speisen, so wird
stets ausschliesslich die zuerst angemeldete Speise beachtet.
Die Argumente liquid, solid, strength, heal und msgs werden beim
Verzehr direkt an eat_and_drink() des Spielers uebergeben. Fuer
naehere Angaben siehe dort. Im einzelnen sind die Werte:
liquid - Fluessigkeitsgehalt der Speise in Milliliter
solid - Feststoffmenge der Speise in Gramm
strength - Alkoholgehalt des Fluessiganteils in Prozent. Kann
nur angegeben werden, wenn die Speise Alkohol enthaelt.
heal - Heilfaktor
heal2 - Heilfaktor
msgs - Meldungen beim Verzehrfehlschlag
Durch 'prefun' kann man etwas direkt vor dem Verzehr bewirken:
- Ist prefun eine Closure, so wird diese aufgerufen.
- Ist es ein String, so wird eine Funktion diesen Namens im Pub
aufgerufen. Sowohl Closure als auch Funktion erhalten als
erstes und einziges Argument den Namen der Speise.
- Als dritte Moeglichkeit kann man ein Array aus zwei Strings
ablegen ({ Meldung an Spieler, Meldung an Raum }). Die Meldungen
werden von der Lib umgebrochen, die Meldung an den Raum kann
durch &&WER&& o.ae. angereichert werden, sie durchlaeuft
parse_mess(S).
Werte in 'postfun' werden analog behandelt, jedoch direkt nach
dem Verzehr. Unterschiede bestehen in:
- Funktion bzw Closure erhaelt als erstes Argument den Namen der
Speise und einen Integer als zweites. Die Integerzahl ist 1, wenn
der Verzehr erfolgreich war, 0 wenn der Spieler die Speise nicht
verzehren konnte oder -1 wenn der Spieler beim Verzehren der
Speise starb.
- Die Meldungen in einem Array werden _nur_ dann ausgegeben, wenn
der Verzehr erfolgreich war. Misserfolgsmeldungen sind ja bereits
in msgs anzugeben. Bei einem Tod erfolgt keine Ausgabe.
Als price sollte *immer* Null angegeben werden. Dann errechnet
die Kneipe einen Preis der sich nach den Regeln des Muds an der
Heilwirkung der Speise orientiert.
Durch Angabe eines Float-Wertes kann man den Preis etwas beeinflussen.
Der automatisch errechnete Preis wird dann mit diesem Faktor multi-
pliziert. Gibt man 1.12 an, so ist diese Kneipe 12% teurer als
der Wunderlandstanderd, 0.88 hiesse 12% billiger.
Wird ein Integerwert angegeben, so ist dies direkt der Preis in
Grundwaehrung.
Der type legt fest, wo das Produkt im Menue aufgelistet wird. Der
Standardwert von Null steht fuer automatische Einsortierung.
Produkte, welche Feststoffe enthalten werden damit automagisch
Speisen. Fuer ausgefallene Getraenke (mit Feststoffen) kann man 1
angeben. Fuer Speisen komplett ohne Feststoffe sollte man 2 angeben.
BEISPIEL:
void create() {
[...]
AddFoodOrDrink("Orangenlimonade", // Name
({"orangenlimonade", "limo"}), // IDs
200, // ml Fluessigkeit
0, // g Feststoff
0, // % Alkohol
1.0, // Heilfaktor (1.0 = normal)
1.0, // Heilfaktor (1.0 = normal)
"limo", // Pre-Fun
0, // Post-Fun
0, // Preis (0 = Auto)
0); // Msgs (0 = Auto)
AddFoodOrDrink("Saft","saft", 200, 0, 0, -2.0, 1.0,"limo",
"post_gift", 0, 0);
oder:
AddFoodOrDrink("Brot", ({"brot"}), 0, 100, 0, 1.0, 1.0, 0,
({"Das Barfraeulein bringt Dir ein Brot\n",
"Das Barfraeulein bringt && ein Brot.\n"}),0,0 );
}
void limo(string getraenk) {
write("Der Ober stellt ein Glas auf den Tisch und fuellt es "
"mit "+getraenk+".\n");
}
void post_gift(string Name, int ok) {
switch (ok) {
case 1: write("Genussvoll trinkst Du es aus.\n");
break;
case 0: write("Der Ober raeumt das Glas haendereibend weg.\n");
break;
case -1: if (this_player())
write("Du hoerst den Ober in der Ferne lachen.\n");
break;
}
}
SIEHE AUCH:
eat_and_drink(L), RemoveFoodOrDrink(L)
|