Abbrechen eines Bewegungsereignisses anhand eines Giftzwerges
![]()
// 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 ;-) } |
| Start » Magierhandbuch » Dokumentation » Programmierbeispiele » Giftzwerg | |
|
| |