Morgengrauner Dokumentation
Dateipfad: /home/mud/mudlib/doc//wiz/giftKrankheiten, 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
zurück zur Übersicht