FUNKTION:
int eat_and_drink(int liquid, int solid, int strength, mixed heal,
mixed heal2, mixed* msgs)
ARGUMENTE:
liquid ist die Fluessigkeitsmenge in ml
solid ist das Volumen der festen Nahrung in ml
strength ist die Menge des Alkohols in Prozent in liquid (!)
heal: Heilfaktor (Lebenspunkte) -2.0 bis 2.0 oder
direkt P_HP (int)
heal2: Heilfaktor (Magiepunkte) -2.0 bis 2.0
direkt P_SP (int)
msgs ist Array aus Arrays aus Strings fuer evt
Meldungen (Aufbau s.u.)
DEFINIERT IN:
/std/living/life.c
BESCHREIBUNG:
Aufgrund der bisherigen enormen Abweichungen von Werten bei Nahrungs-
und Fluessigekeitsaufnahmen im WL ist eat_and_drink() mehr als die
reine Uebergabe von Daten. Mit dieser Funktion werden die Auswikungen
von Essen und Trinken auf den Spieler individuell berechnet.
Hierzu werden u.a. folgende Spielerwerte herangezogen. P_WEIGHT,
P_FOOD, P_MAX_FOOD, P_DRINK, P_MAX_DRINK, P_FOOD, P_MAX_FOOD,
P_LEVEL.
Auch wenn die Manpage lang ist, es ist einfach. Im Prinzip uebergebt
Ihr nur noch die Menge und den %-Alkanteil und einen Heilungsfaktor
(Standard soll 1.0 sein) und lehnt Euch zurueck. Das wars.
Die Berechnung der Werte, die an den Spieler zurueckgegeben werden,
erfolgt nach realistischen Formeln. Demnach muessen auch die Werte
der Funktion realistische (wirkliche) Werte beinhalten.
Die Heilung (P_HP+P_SP) wird sowohl fuer den Anteil liquid und solid
getrennt berechnet, also eine uebergebene Nahrung kann beide Faktoren
beinhalten. Die Heilung beruht auf der Annahme, dass Essensaufnahme
an sich staerkt und nichtalkoholisierte Getraenke gering staerken
und alkoholisierte Getraenke am meisten staerken. Diese Annahme kann
man mit den Heal-Faktoren verstaerken oder umdrehen. Zugelassene Werte
(float) von -2.0 bis +2.0. (Default-Wert 1.0) So laesst sich im
Prinzip jeder Wert darstellen. Alternativ (nicht so gern gesehen)
gibt man fuer heal einen int-Wert an. Dieser ist dann direkt P_HP.
Bei P_SP (heal2) gehen wir davon aus, dass die reine Menge hier mehr
zu Buche schlaegt, als der Alkoholanteil)
Hier die Vorgehensweise der Funktion:
liquid und solid werden entsprechend uebergeben. Es sind durchaus
auch Speisen moeglich, die aus festen und fluessigen Bestandteilen
bestehen. Annahme bei den Werten ist, dass
P_ALCOHOL von 100 ist 3 Promill Blutalkohol
P_DRINK von 100 ist 2 Liter Fluessigkeit
P_FOOD von 100 ist 2 Kilogramm Festnahrung
Der persoenliche Wert des Blutalkohols (Promille) errechnet sich aus
dem Koerpergewicht des Spielers, seinem Level und ob er eine Grund-
lage im Magen (P_FOOD) hat.
Aenderung an P_ALCOHOL: (vereinfacht dargestellt)
l = P_LEVEL / 200
e = ( (P_FOOD * 100) / P_MAX_FOOD) / 400
pw = (0,5 + l + e)
// Errechnung Promille (1,055 = Dichte Blut, Wid-Mark-Formel)
promille = ( (gramm_alkohol * 1,055) / (P_WEIGHT * pw)
P_ALCOHOL += promille * 33
Aenderung an P_DRINK:
P_DRINK += liquid / 20;
Aenderung an P_FOOD:
P_FOOD += solid / 20;
Aenderung an P_HP:
(heal: Default-Wert 1.0, Grundlage fuer Standard-Rueckgaben)
wenn heal = float von -2.0 bis +2.0
P_HP =((abs(gramm_alkohol)*0.7) + solid/20 + liquid/30) * heal;
oder
heal ist ein int-wert
P_HP += heal
P_HP wird ueber heal_self() bzw do_damage() geaendert, bei
ungesunden Speisen kann der Spieler also sterben.
Aenderung an P_SP:
(heal2: Default-Wert 1.0, Grundlage fuer Standard-Rueckgaben)
wenn heal2 = float von -2.0 bis +2.0
P_SP =((abs(gramm_alkohol)*0.5) + solid/15 + liquid/15) * heal2;
oder
heal2 ist ein int-wert
P_SP += heal2
MELDUNGEN:
Wenn P_MAX_ALCOHOL, P_MAX_DRINK oder P_MAX_FOOD ueberschritten
werden, wird eine Meldung ausgegeben und die Funktion abgebrochen.
Diese Meldungen heissen im Folgenden *-Spieler bzw *-Raum.
Wenn der jeweilige Wert negativ wird (ausnuechterndes Getraenk zb),
so wird die *-unternull Meldung erzeugt.
Wenn angegeben wird eine Meldung erzeugt. Als Argument 'msgs' ist
hierzu ein Array aus Arrays aus Strings zu uebergeben, welches
wie folgt aufgebaut ist:
({ ({ DRINK-Spieler, DRINK-Raum, DRINK-unternull }),
({ FOOD-Spieler, FOOD-Raum, FOOD-unternull }),
({ ALCOHOL-Spieler, ALCOHOL-Raum, ALCOHOL-unternull }),
({ Erfolg-Spieler, Erfolg-Raum }) })
Die DRINK Meldungen beziehen sich auf P_DRINK, also die ersten
beiden werden jeweils ausgegeben wenn P_DRINK beim Verzehr der
Speise ueber P_DRINK_MAX ansteigen wuerde. Der dritte Text wird
an den Spieler ausgegeben, wenn der Verzehr der Speise ein
Absinken von P_DRINK auf 0 (oder kleiner) bewirkt.
FOOD und ALCOHOL wirken analog fuer P_FOOD und P_ALCOHOL.
Die Erfolgsmeldung (fuer die es keinen Standard gibt) wird an den
Spieler und/oder den Raum ausgegeben, wenn dem erfolgreichen Verzehr
nichts mehr entgegensteht, aber vor dem echten Verzehr, insbesondere
also vor dem Tod eines Spielers, wenn der Genuss der Speise
toedlich war.
Hier kann also eine Meldung der Art 'Spieler X isst Y.'
angegeben werden.
Es ist nicht moeglich eine Meldung anzugeben, die vor dem Tod
aber nur im Todesfall ausgegeben wird - bevor der Tod eintritt
ist es fuer das Objekt unmoeglich zu wissen ob der Spieler sterben
wird (evt hat er ein Todesereignis-abbrechendes Amulett).
Elemente nach 'rechts' kann man einfach weglassen, komplette
unbenutzte Subarrays durch ({}) oder Null ersetzen. Ist keine
Meldung spezifiziert, so wird ein Standard ausgegeben (nichts an
den Raum). Moechte man nur die Standards, so kann man Null oder ({})
als msgs angeben.
Die Standardmeldungen saehen wie folgt aus:
({ ({ "So viel kannst Du momentan echt nicht trinken.", "",
"Dir klebt die Zunge am Gaumen." }),
({ "Das ist viel zu viel fuer Dich!", "",
"Was rumpelt denn da in Deinem Bauch?" }),
({ "Du bist schon sturzbesoffen. Mehr geht nun wirklich nicht.",
"", "Du bist jetzt stocknuechtern." }),
({ "", "" }) })
Beispiele fuer einige Msgs-Arrays:
* Es werden nur Trinkerfolgsmeldungen hinzugefuegt, sonst Standard
({ 0, 0, 0, ({ "Du trinkst.", "Sie trinkt." }) })
* Es ist nicht moeglich innerhalb eines Sub-Arrays eine
Standardmeldung zu behalten aber weiter 'rechts' einen eigenen
Wert vorzugeben, also
({ ({ 0, "Sie will trinken ist aber zu voll }) })
funktioniert nicht wie eventuell erwartet; es wird keine Meldung
an den Spieler ausgegeben wenn sie zu voll ist (die Meldung ist
ja als Null spezifiziert).
* Komplette Eigenspezifikation (zur Vereinfachung mit Pseudocode)
fuer eine Speise:
({
// Subarray fuer Getraenk.
// Standard lassen, wird eh nicht benutzt
0,
// Subarray fuer Speise.
// Fuer Leer-Meldung Standard lassen, da hier nicht benutzt
({ "Dein Bauch ist schon vollkommen voll!",
"NAME schaut sehnsuechtig auf eine Erdbeere." }),
// Subarray fuer Alkohol. Unbenutzt, siehe Getraenk
0,
// Subarray fuer Erfolgsmeldungen
({ "Du stopfst eine Erdbeere in den Mund. Lecker!",
"NAME stopft sich eine Erdbeere in den Mund. Neidisch "
"schaust Du zu und willst auch eine." })
})
RÜCKGABEWERT:
1 bei Erfolg, 0 wenn der Spieler zu voll ist, -1 wenn der Spieler
beim Verzehr einer ungesunden Speise starb.
Waehrend der Testphase werden Argumente der Funktion und ggf
Aenderungen an den Werten an IS_LEARNINGS im Klartext ausgegeben!
BEISPIELE:
Beispiel 1: (1 Bierchen)
int eat_and_drink(330, 0, 4, 1.0, 1.0)
Beispiel 2: (1 Orangensaft)
int eat_and_drink(200, 0, 0, 1.0, 1.0)
Beispiel 3: (Eis mit Eierlikoer) Der Alk-% bezieht sich auf liquid
int eat_and_drink(20, 150, 40, 1.0, 1.0 )
Beispiel 4: (Schnitzel mit Beilagen)
int eat_and_drink(0, 500, 0, 1.0, 1.0)
Beispiel 5: P_HP,P_SP wird vorher festgelegt (nur in Ausnahmen)
int eat_and_drink(0, 500, 0, 50, 50)
SIEHE AUCH:
AddFoodOrDrink(L), heal_self(L), do_damage(L)
|