
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
