Beispieldateien

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 ;-)
}