Krankheiten, Gifte und Flueche
==============================

     Einmal abgesehen vom einfachen Setzen von P_POISON im Spieler lassen 
     sich Gifte und Krankheiten auch als Objekte ausprogrammieren, die dem 
     Spieler in mehr oder weniger regelmaessigen Abstaenden Lebenspunkte 
     abziehen. Auch Flueche koennen nicht nur als P_CURSED in Waffen und 
     Ruestungen, sondern auch als Objekte vorliegen und dem Spieler das 
     Leben schwermachen.

     Um ein Objekt als Gift zu kennzeichnen, wird die Klasse CL_POISON 
     gesetzt, fuer eine Krankheit ist CL_DISEASE und fuer einen Fluch 
     CL_CURSE zu setzen (mit AddClass, siehe dort). Zusaetzlich wird die 
     Schwere der Erkrankung bzw. Vergiftung in der Property P_LEVEL 
     abgelegt, wobei P_LEVEL einen Wert zwischen 1 und 100 haben sollte. 
     Mitglieder der Klerikergilde und andere Heiler koennen dann je nach 
     P_LEVEL den betroffenen Spieler mehr oder weniger gut heilen. (Kleriker 
     koennen CL_POISON-Vergiftungen heilen, einige Heiler jedoch nicht.)

     Eine eindeutige Unterscheidung zwischen Giften, Krankheiten und 
     Fluechen zu treffen, ist schwer, denn die Grenzen verschwimmen. 
     Trotzdem hier eine grobe Klassifizierung:

     Gifte: 
        bringt der Spieler sich meist selbst bei (in dem er z.B. einen 
        giftigen Pilz isst). Oft auch sind die Stellen, wo ein Spieler 
        sich vergiften kann, beim Forschen erkennbar, so dass eine 
        Vergiftung umgangen werden kann.

        Bei Giften wird durch das Heilen der Klerikergilde der Level des 
        Giftobjekts abhaengig vom Erfolg gesenkt. Ist der Level <= 0, wird 
        das Objekt vom Kleriker-Spellbook entfernt. Heiler-NPCs sollten das
        aehnlich machen. Logisch waere es daher, den Schaden, den das
        Objekt macht, vom momentanen Level abhaengig zu machen.

     Krankheiten:
        werden dem Spieler durch Fremdeinwirkung beigebracht, auch durch
        Ansteckung bei einem anderen Spieler oder NPC.
        
        Bei ansteckenden Krankheiten ist auf die Ansteckrate zu achten
        und darauf, dass die Krankheit mit der Zeit auch wieder ausstirbt.
        Also entweder bei jeder Generation der Krankheit das 
        Ansteckungsrisiko senken oder einmal infizierte Spieler 
        immunisieren. Es sollten sich 2 idelnde Spieler nicht immer wieder
        gegenseitig bis in alle Ewigkeit anstecken koennen. Auch ist darauf 
        zu achten, dass Netztote nicht angesteckt werden koennen bzw.
        Netztote niemanden anstecken, da sich sonst die Krankheit im 
        Netztotenraum verbreiten kann.

        Das Heilen geschieht im Kleriker-Spellbook wie bei Gift, oder
        bei Heiler-NPCs.

     Flueche: 
        werden wie Krankheiten durch Fremdeinwirkung beigebracht (der 
        Spieler wird halt verflucht). Vorsicht: Nicht P_CURSED im 
        Spielerobjekt setzen! 
        
        Die Wirkung von Fluechen ist oft nicht auf einfaches Abziehen von 
        Lebenspunkten beschraenkt, sondern der Spieler kann z.B. 
        nicht mehr richtig sprechen (Sprachfluch ueber P_PERM_STRING), 
        ist in der Bewegung eingeschraenkt oder greift wahllos NPCs an.

        Hier ist das Entfluchen durch einen Kleriker anders. Findet das 
        Spellbook ein CL_CURSE-Objekt im Inv des Spielers, wird gegen 
        das Level des Objekt gewuerfelt. Bei Erfolg wird das Objekt 
        entfernt, bei Misserfolg passiert nichts! Es wird also nicht die
        Fluchstufe reduziert.

        Als Anhaltspunkte fuer den Level:
        - < Level 10 sind einfach zu entfluchen
        - 10-20 sind fuer kleine Kleriker schon enorm schwierig
          fuer max. Kleriker gut zu entfluchen.
        - ueber 20 gelingt es auch einem max. Kleriker nicht immer
          beim ersten Mal.
        - ab 30 muss der max. Kleriker schon mal tanken gehen
        - Ueber Level 40 liegt die Chance schon im Promillebereich!!!
        - Level 100 laesst sich ueberhaupt nicht mehr entfluchen.
        Will man dem Spieler also eine reelle (und nicht nur 
        mathematische) Chance lassen, sollte der Fluchlevel unter 40 
        bleiben.

    Das Schadensobjekt selbst ist unsichtbar, meist autoload und loest die 
    Schadensfunktion z.B. ueber Callouts oder den Reset aus.


BEISPIEL:

     Hier ein Beispiel fuer einen Giftpilz 
     -------------------------------------
     
     #pragma strong_types

     inherit "/std/thing";

     #include "../pfad.h"

     protected void create() {
       if ( !clonep(this_object()) ) {
         set_next_reset(-1);
         return;
       }
       ::create();

       SetProp(P_SHORT, 0);
       SetProp(P_INVIS, 1);
       SetProp(P_LONG, 0);
       SetProp(P_NODROP, 1);
       SetProp(P_NEVERDROP, 1);
       SetProp(P_AUTOLOADOBJ, 1);
       SetProp(P_WEIGHT, 0);
       SetProp(P_NAME, "Pilzvergiftung");
       SetProp(P_KILL_NAME, "Eine Pilzvergiftung");
       SetProp(P_GENDER, FEMALE);
       SetProp(P_LEVEL, 10);
       call_out("next_step", 2);
       AddClass(CL_POISON);
     }

     void next_step() {
       object pl = environment(this_object());
       if ( !objectp(pl) || !query_once_interactive(pl) ||
            pl->QueryProp(P_GHOST) ) {
         remove(1);
         return ;
       }
       call_out("next_step", 5);
       if ( interactive(pl) ) {
         tell_object(pl,
           "Dein Bauch schmerzt. Du windest Dich in Kraempfen.\n");
         if ( environment(pl) )
           tell_room(environment(pl), pl->Name(WER)+" windet sich vor "
             "Schmerzen am Boden.\n", ({ pl }));
         pl->do_damage(QueryProp(P_LEVEL)*2 + random(10), this_object());
       }
     }

 SIEHE AUCH:
    P_POISON, P_MAX_POISON, P_POISON_DELAY
    P_CURSED, P_PERM_STRING

 LETZTE AeNDERUNG:
   18.08.2019, Arathorn
