Beispieldateien

Ein Pferd, dem man Äpfel geben kann

----------


inherit "npc";

#include <properties.h>               // allgemeine Makros definieren
#include <moving.h>                   // nun die für das Bewegen 
#include <events.h>                   // und die für die Ereignisse
#include <living/body.h>              // für den Körperbau

// Deklaration der Funktionen, die durch listen_event angemeldet 
// werden.
void apfel_bekommen(mapping data, string type, int prio);
void irgendwas_bekommen(mapping data, string type, int prio);

void create()
{
  if (!clonep()) return;
  ::create();

  create_default_npc(15);

  SetProp(P_NAME, "Pferd");
  SetProp(P_PLURAL, "Pferde");
  SetProp(P_LONG,
    "Ein ganz normales Pferd. Du kannst ihm einen Apfel geben.");

  SetProp(P_WEIGHT, 11900);
  SetProp(P_HANDS, ({" mit seinen Hufen", 150}));

  AddId("pferd", "pferde");

  // Wir wollen 2 Sachen machen:
  // 1. Wenn wir einen Apfel bekommen, "essen" wir ihn. -> Reagieren
  listen_event(ET_GIVE, EPRIO_REACT, #'apfel_bekommen);
  // 2. Wenn es kein Apfel ist, wollen wirs net haben. -> Abbruch
  listen_event(ET_GIVE, EPRIO_CANCEL, #'irgendwas_bekommen);
}



void apfel_bekommen(mapping data, string type, int prio)
{
  // Erstmal ein paar allgemeine Checks. Gibts das Mapping und existiert
  // das zu bewegende Objekt (E_MOVE_OBJ)?
  if (!mappingp(data) || !data[E_MOVE_OBJ]) return;

  // Bin ich das Ziel? Nein? -> Abbruch
  if (data[E_MOVE_DEST] != this_object()) return;

  // Es muß schon ein Apfel sein. Dazu prüfen wir, ob der bewegte Gegenstand
  // eine Id "apfel" hat. Wenn nicht -> Abbruch
  if (!(data[E_MOVE_OBJ]->id("apfel"))) return;

  // Nun sollte alles zu unsrer Zufriedenheit sein.
  // *mampf*
  tell_room(environment(), "Das Pferd frisst den Apfel.\n");

  // Wenn er gegessen wurde, existiert er nicht mehr. Wir zerstören ihn.
  data[E_MOVE_OBJ]->remove(1);

  // Das wars.
}



void irgendwas_bekommen(mapping data, string type, int prio)
{
  // Auch hier erst ein paar allgemeine Checks. Wir wollen auf das zu 
  // bewegende Objekt (E_MOVE_OBJ) zugreifen und dem agierenden Spieler (E_ACTOR)
  // einen Text ausgeben. Beide Felder im Mapping brauchen wir also.
  if (!mappingp(data) || !data[E_MOVE_OBJ] || !data[E_ACTOR]) return;

  // Sind wir das Ziel?
  if (data[E_MOVE_DEST] != this_object()) return;

  // Wenns kein Apfel ist, geben wir eine Meldung an den agierenden Spieler
  // aus und brechen das ganze mit cancel_event() ab.
  if (!(data[E_MOVE_OBJ]->id("apfel"))) 
  {
    tell_object(data[E_ACTOR], "Was soll denn das Pferd mit "+
      data[E_MOVE_OBJ]->name(WEM, NAME_DEF)+"?\n");
    cancel_event();
  }
}