Ich habe Kobayashis Moving-NPC (mnpc) nun endgueltig auf den
callmaster umgestellt, weil Vrais Scheduler zwar eine tolle
eierlegende Wollmilchsau ist, aber viel zu viele call_outs
macht. Die Definitionen der Properties stehen in /sys/mnpc.h,
welche man mit #include <mnpc.h> einbinden kann. Zu erben
ist die Datei /std/mnpc.c.
Folgende Properties gibt es:
P_MNPC Dieses Property wird bei MNPC's automatisch gesetzt.
P_MNPC_MASTER Damit ist es moeglich, einen eigenen Master
anzugeben, wenn man nicht den default-maessig
gesetzten Master benutzen will. (lohnt nur,
wenn man auch sonst einen eigenen Master benutzt,
d.h., wenn man viele eigene mnpcs hat.)
P_MNPC_FLAGS Moegliche Flags sind:
MNPC_WALK Der MNPC laeuft im erlaubten Bereich
MNPC_INVINCIBLE Der MNPC laesst keine Angriffe zu
MNPC_FOLLOW_PLAYER Der MNPC verfolgt Spieler, die den
Raum verlassen.
MNPC_NO_TPORT Der MNPC verwendet keine M_TPORT-
Methode, sondern nur M_GO.
P_MNPC_HOME Dies ist der Raum in der MNPC teleportiert
wird, wenn es keinen gueltigen Ausgang gibt.
Default ist MNPC_DFLT_HOME == "/room/void"
P_MNPC_AREA Dies ist ein Array von strings. sie geben den
Bereich an, in den sich der MNPC bewegen darf.
(Es sind die Anfaenge der Filenamen)
Default ist ({}) =>er darf ueberall hingehen.
P_MNPC_DELAY Zeitabstand zwischen zwei Walk's (min 5 Sek.)
Default ist MNPC_DFLT_DELAY == 20 Sekunden
Hier kann eine closure uebergeben werden, die
bei Aufruf eine int zurueckliefert. Dadurch
koennen random-Zeiten erzeugt werden.
P_MNPC_ENTER Funktion, die sofort beim Betreten eines
Raumes ausgefuehrt wird.
P_MNPC_LEAVE Funktion die kurz vor Verlassen des Raumes
ausgefuehrt wird.
P_MNPC_SPECIAL_EXITS MNPC darf durch SpecialExits gehen.
Default 0 (er darf nicht)
P_MNPC_LOAD_ROOMS MNPC darf Raeume laden
Default 0 (er darf nicht)
P_MNPC_OLD_ENV Property zum Testen der Bewegung, intern
P_MNPC_LASTREV Property zum Testen der Referenz, intern (*)
Zu (*):
Wenn der MNPC 1.5 Stunden keinen Spielerkontakt hatte, bewegt er sich
in den Raum, in dem er geclont wurde (muss nicht P_MNPC_HOME sein)
Dadurch wird den Raeumen die Moeglichkeit gegeben, ihren clean_up
durchzufuehren.
Beispiel (Lachmoewe (/d/ozean/troy/kompass/mon/moewe.c))
#pragma strong_types
#include <properties.h>
#include <mnpc.h>
#include <combat.h>
#include "../files.h"
inherit "/std/mnpc";
int departure()
{
return 22+random(46);
}
void create()
{
string fn;
if(!is_clone(this_object())) return;
::create();
SetProp(P_SHORT,"Eine Lachmoewe");
SetProp(P_LONG,break_string(
"Mit seinem charakteristischen schwarzen Kopf, den silbergrauen "+
"Fluegeldecken und dem ansonsten weissen Gefieder gehoert dieser "+
"Vogel zur Gattung der Lachmoewen.",78));
SetProp(P_NAME,"Lachmoewe");
SetProp(P_GENDER,FEMALE);
SetProp(P_ALIGN,-2);
SetProp(P_RACE,"Moewe");
SetProp(P_DEFAULT_INFO,"schreit: IIIIAEEEK!!! IIIIAEEEK!!!\n");
AddId(({"moewe","lachmoewe","\ntroy_kompass_lachmoewe"}));
// hierdurch wird der clonende Raum zum Home:
SetProp(P_MNPC_HOME,
(fn=efun::explode(file_name(previous_object()),"#")[0]));
// dies setzt das Directory des clonenden Raumes als area:
SetProp(P_MNPC_AREA,
({
efun::implode(efun::explode(fn,"/")[0..<2],"/")}));
SetProp(P_MNPC_DELAY,#'departure); // siehe oben
SetProp(P_MNPC_FLAGS,MNPC_WALK | MNPC_NO_TPORT);
SetProp(P_MNPC_LOAD_ROOMS,0);
SetProp(P_MSGIN,"schwebt herein");
SetProp(P_MSGOUT,"fliegt");
SetProp(P_LEVEL,6);
SetProp(P_MAX_HP,80);
SetProp(P_HP,80);
SetProp(P_HANDS,({"mit ihrem scharfen Schnabel",65,DT_SLASH}));
SetProp(P_XP,QueryProp(P_MAX_HP)*QueryProp(P_TOTAL_WC)*5);
SetChats(25,({
capitalize(name(WER,1))+" schreit Dir laut ins Ohr.\n",
capitalize(name(WER,1))+" laesst etwas auf Dich fallen.\n",
"Du wirst von "+name(WEM,1)+" fast gestriffen.\n",
capitalize(name(WER,1))+" stuerzt sich hungrig auf ein paar Brotkruemel.\n" }));
}
|