| 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 |