blob: a2c4d9eee0f3e180ef11d0808d458b79bae84afb [file] [log] [blame]
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