// Ein kleiner Giftzwerg, der auf das Bewegungsereignis ET_GO lauscht.
// Mit 30 Prozent Wahrscheinlichkeit stellt er ein Bein und bricht dabei
// die Bewegung ab.
// 16.06.99 Holger
inherit "std/npc";
#include <properties.h>
#include <moving.h>
#include <events.h>
#include <defines.h>
// Deklaration unserer Funktion, die durch listen_event dann aufgerufen
// wird. Die Wahl des Namens steht uns frei.
void receive_event(mixed data, string type, int prio);
void create()
{
if (!clonep()) return;
::create();
create_default_npc(5);
SetProp(P_LONG,
"Ein kleiner Giftzwerg, der nichts besseres zu tun hat, als hier "
"rumzustehen und vorbeikommende Wanderer zu aergern.");
SetProp(P_NAME, "Giftzwerg");
SetProp(P_PLURAL, "Giftzwerge");
SetProp(P_HANDS,({" mit kraeftigen Faeusten", 50}));
SetProp(P_INVINCIBLE, ({"Der kleine Giftzwerg lacht nur haemisch.",
"Der kleine Giftzwerg lacht haemisch ueber &&WEN&&."}));
AddId(({"zwerg", "giftzwerg"}), ({"zwerge", "giftzwerge"}));
// So hier melden wir uns an:
// 1. Wir wollen einen Event abbrechen:
listen_event(ET_GO, EPRIO_CANCEL, #'receive_event);
// 2. Wenn es denn geklappt hat, wollen wir auch noch etwas tun
// (boese kichern z.B.)
listen_event(ET_GO, EPRIO_C_HANDLE, #'receive_event);
}
// Und hier kommt die Meldung an, wenn einer da rumrennt
void receive_event(mixed data, string type, int prio)
{
object opfer;
// Haben wir auch das, was wir erwarten?
if (type != ET_GO || !mappingp(data) || !living(opfer = data[E_MOVE_OBJ]) ||
opfer == this_object())
return;
// natuerlich nicht, wenn Opfer invis oder nicht hier ist
if (opfer->QueryProp(P_INVIS) || !present(opfer, environment(ME)))
return;
// Wie weit sind wir schon fortgeschritten?
// Hier unterscheiden wir, nach der prioritaet mit der wir lauschen. (Wir
// haben uns mit listen_event 2x angemeldet. Einmal mit Prioritaet
// EPRIO_CANCEL fuer das Abbrechen und einmal mit EPRIO_C_HANDLE fuer das
// Reagieren nach dem Abbruch.)
switch (prio)
{
case EPRIO_CANCEL:
// wir wollen mit 30% Wahrscheinlichkeit Bein stellen und brechen die Bewegung ab
if (random(100) < 30) cancel_event(1);
// alle anderen Faelle: Wir machen nichts
else return;
break;
case EPRIO_C_HANDLE:
// In diesen Zweig kommen wir nur, wenn auch wirklich wir
// den Event abgebrochen haben - und nicht z.B. ein noch
// im Raum liegendes Falleisen ...
// nun koennen wir unsere Meldungen ausgeben
tell_room(environment(ME),
"Der kleine Giftzwerg stellt "+opfer->name(WEM, NAME_DEF)+
" ein Bein.\n", ({opfer}));
tell_object(opfer, "Der kleine Giftzwerg stellt Dir ein Bein.\n"
"Du stuerzt hin und ziehst Dir ein paar Schrammen zu.\n");
// nach einer Sekunde boese kichern
call_out("command_me", 1, "kicher boese");
// Naja, Schrammen tun weh :-)
opfer->reduce_hit_point(10);
}
// das wars auch schon ;-)
}
|