P_FISH
******


NAME
====

   P_FISH                        "fish"


DEFINIERT IN
============

   /sys/fishing.h


BESCHREIBUNG
============

   Enthaelt Einstellungen zu allem, was mit Fischen zu tun hat.
   Kann in Fischen, Raeumen und Koedern gesetzt werden. Die verfuegbaren
   Optionen und Funktionsweisen sind in den nachfolgenden Abschnitten
   aufgefuehrt.

   Fische:
   *******
   Die Property legt zusaetzliche Eigenschaften fest:

     F_NOROTTEN
       Fisch fault nicht; ggf. sollte hier auch gleich F_NOHEAL gesetzt
       werden, weil sonst eine unverderbliche tragbare Tanke erzeugt wuerde.
       Wenn sie verderben koennen, beginnen Fische nach 10 min zu verderben
       und werden danach alle 2 Minuten schlechter, d.h. reduzieren ihren
       Heilwert. Nach vier Schritten ist ein Fisch komplett vergammelt.
     F_NOTHUNGRY
       Fisch frisst Koeder nur, wenn er auch wirklich nachher an der Angel
       haengt. Ist er zu schwer fuer die Angel und reisst ab, bleibt der
       Koeder erhalten.
     F_REPLACE
       Fisch soll sich beim Einholen der Angel verwandeln, technisch:
       wenn er geclont und in die Angel bewegt wurde. Hierzu ist die
       Funktion ReplaceFish() im Fisch zu definieren, die sich um die
       Verwandlung kuemmert (z.B. Monster clonen und Fisch zerstoeren,
       Beispiel siehe unten).
     F_NOHEAL
       Fisch heilt nicht bei Verzehr.
       Wenn er heilt, ist die Heilung ist abhaengig vom Gewicht des Fisches
       und limitiert auf den Wertebereich 0-40 LP. Der maximale Heilwert
       ist bei 1280 g Gewicht erreicht und skaliert in Schritten von 32 g
       linear. Pro LP, der geheilt wird, muss der Spieler Platz fuer 3
       Food haben (ueber eat_food() realisiert). Die Heilung wird ueber
       buffer_hp() mit einer Rate von 5 LP pro Heartbeat.

   Raum (OPTIONAL):
   ****************
   Legt die Fischdichte des Gewaessers fest. Der eingestellte Wert wirkt
   sich auf die Wartezeit aus, die der Angler verbringen muss, bis ein
   Fisch anbeisst. Berechnung im Detail (alle Zahlenwerte in Sekunden):
   - Basis-Wartezeit: delay = 80
   - Die Werte von P_FISH von Raum und Koeder werden addiert:
     summe = raum->QueryProp(P_FISH) + koeder->QueryProp(P_FISH)
     -> positive Werte (Bonus) werden auf 60 begrenzt und mit Zufalls-
        komponente von <delay> abgezogen:
        delay -= random(summe)
     -> negative Werte (Malus) werden auf -300 begrenzt und mit Zufalls-
        komponente auf <delay> aufgeschlagen:
        delay += random(-summe)

   Zusaetzlich wird ein weiterer Malus auf die Wartezeit faellig, falls
   P_WATER in der Angel und/oder P_WATER im Koeder nicht zum aktuellen
   Gewaesser passen. Der Malus betraegt jeweils 60+random(60) Sekunden.

   Der Standardwert fuer P_FISH im Raum ist 0 und bedeutet 100 % Bestand.
   Positive Werte erhoehen die Dichte, negative senken sie. Positive Werte
   sollten nicht >100 sein.

   Sofern sich die Werte fuer P_FISH in den empfohlenen Grenzen bewegen,
   koennen Abzuege fuer falsches Gewaesser ueblicherweise kaum durch
   Boni auf Angel oder Koeder kompensiert werden. Ausserdem ist zu
   bedenken, dass es keine Boni fuer richtige Gewaesserwahl gibt.

   Koeder (OPTIONAL):
   ******************
   Ein Koeder kann mittels P_FISH die Fischdichte modifizieren, um hierueber
   ein besseres Beissen der Fische zu simulieren (reduziert die Wartezeit
   beim Angeln, siehe oben unter "Raum"). Wenn also der Raum einen Wert
   von -100 gesetzt hat und der Koeder +100, entspricht die Fischdichte im
   Gewaesser wieder dem Normalwert.


BEISPIEL
========

   protected void create() {
     [...]
     SetProp(P_FISH, F_REPLACE);
     [...]
   }

   // ReplaceFish() wird per call_out() mit Funktionsnamen (d.h. als String)
   // gerufen, daher muss die Sichtbarkeit public oder static sein.
   static void ReplaceFish() {
     tell_object(this_player(), break_string("Der Katzenhai glitscht Dir
       "aus der Hand und streift seine Haut ab. Vor Dir steht eine "
       "niedliche, schwarze Katze!", 78));
     tell_room(environment(this_player()), break_string(
       this_player()->Name(WEM)+" glitscht ein Katzenhai aus der Hand "
       "und streift seine Haut ab. Ueberraschend steht eine niedliche, "
       "schwarze Katze vor Dir!", 78));
     object monster = clone_object("/d/irgendwo/irgendwer/mon/haikatze");
     monster->move(environment(TP), M_GO|M_SILENT);
     remove();
   }


SIEHE AUCH
==========

   Properties:   P_WATER, P_FOOD
   Basisobjekte: /std/items/fishing/fish.c, /std/items/fishing/haken.c
                 /std/items/fishing/koeder.c /std/items/fishing/angel.c
   Methoden:     GetAquarium(L), eat_food(), buffer_hp()

Zuletzt geaendert: 2020-Mar-09, Arathorn
