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, irgendwie gekennzeichnet,
             so dass eine Vergiftung umgangen werden kann.

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

     Krankheit: 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 ewig 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.

     Flueche: werden wie Krankheiten durch Fremdeinwirkung beigebracht
             (der Spieler wird halt verflucht). Ausserdem ist die Wirkung 
             von Fluechen 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!

             Als Anhaltspunkte fuer den Level:
             - < Level 10 sind einfach zu entfluche
             - 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 ueber Callouts aus.

 BEISPIEL:
     Hier ein Beispiel fuer einen Giftpilz (gefunden bei Silvana, in
     /d/dschungel/silvana/weg/obj/pilz.c):
     ----------------------------------------------------------------------
     #pragma strong_types
     #include "../pfad.h"

     inherit "/std/thing";

     void create() {
       if(!clonep(TO)) {
           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_ARTICLE,1);
       SetProp(P_LEVEL,10);
       call_out("next_step",2);
       AddClass(CL_POISON);
     }

     void next_step();

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

 SIEHE AUCH:
    P_POISON, P_CURSED, P_PERM_STRING

 LETZTE AeNDERUNG:
   11.08.2007, Zesstra
