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