Dokumentation zu: eat_and_drink(L)

HR Image


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)


Start » Magierhandbuch » Docu » Lfun » Eat_and_drink Letzte Generierung: 25.04.2021, 01:58
Email an: mud@wl.mud.de
Valid HTML 4.01!