blob: 86a9fa44de970293cc01503de09628ba05c173bc [file] [log] [blame]
/*
* Der ultimative NPC : mnpc.c (C) by Sir Lunch a lot
* $Id: mnpc.c,v 1.1 1993/10/12 16:23:07 djc Exp djc $
*/
Dieser urspruengliche mnpc wurde von mir weiterentwickelt und stark
optimiert. Er ist gedacht um relativ einfach, effiziente Laufnpcs zu
programmieren und erspart einem dadurch das Rad erneut erfinden zu muessen.
Der Urspruengliche mnpc.c von Sir liegt fuer interessierte weiterhin in
+d/unterwelt/std/mnpc.sir.
Die Eigenschaften im Ueberblick:
MNPC_AREA - In diesem Feld stehen die Raeume, in denen der NPC herumlaufen
kann, ({}) bedeutet, das der NPC ueberall hin kann (bitte nur mit
aeusserster Vorsicht und Absprache des RMs benutzen!!!).
Bsp.: SetProp(MNPC_AREA, ({ "/d/ebene/room/ak_str" }));
Dieser NPC kann ueber saemtliche Raeume der Akademiestrasse laufen, also
z.b. in einen Raum mit dem Filenamen /d/ebene/room/ak_str1
aber auch in alle Raeume in einem Verzeichnis /d/ebene/room/ak_str/*
MNPC_HOME - der Startraum des NPCs in den er spaeter ggf. auch wieder
zurueckkehrt. Setzt man diese Property nicht, wird versucht, den Ort des
Clonens zu erraten/bestimmen, aber wenn man sicher gehen moechte, dass der
MNPC das Home hat, was man denkt, sollte man es explizit setzen.
MNPC_DELAY und. MNPC_RANDOM
MNPC_DELAY + random(MNPC_RANDOM) ergibt den Abstand zwischen zwei
Bewegungen des NPCs.
ACHTUNG:
1. Diese Werte muessen gesetzt werden, _bevor_ MNPC_FLAGS
gesetzt werden, da die Set-Methode von MNPC_FLAGS die Anmeldung im
walk_master durchfuehrt. Sonst werden die Default-Werte benutzt!
2. Wenn diese Werte geaendert werden, sollte man die MNPC_FLAGS neu
setzen, um so die Neuanmeldung im walk_master auszuloesen.
MNPC_WALK_TIME - Zeitangabe wie lange es dauert bis der NPC stehen bleibt
falls er keinen Spieler mehr trifft. Dieser Wert sollte etwa 3-10 mal so
gross sein, wie die durchschnittliche Laufgeschwindigkeit. Wenn der NPC
dann einen reset lang keinen Spieler mehr trifft, movt er wieder in
seinen Startraum und wartet dort auf neue Spieler.
Defaultmaessig 600 sek.
MNPC_FLAGS - property mit einem oder mehreren gesetzten Flags
MNPC_WALK - ueber dieses Flag kann das laufen ein- bzw. ausgeschaltet
werden.
MNPC_FOLLOW_PLAYER - der NPC verfolgt die Spieler, die er trifft
MNPC_NO_WALK_IN_FIGHT - der NPC bleibt beim kaempfen und rennt nicht weg
MNPC_GO_HOME_WHEN_STOPPED - der NPC geht sofort nach Hause wenn seine
Zeit abgelaufen ist.
MNPC_ONLY_EXITS - der NPC benutzt beim laufen keine SpecialExits
Diese Funktion ist sehr wichtig, da durch SpecialExits auch Raeume
betreten werden koennen die nicht in MNPC_AREA erlaubt wurden! Hierauf
muss dann bereits bei der Gebietskonstruktion geachtet werden.
MNPC_EXACT_AREA_MATCH - Die in MNPC_AREA angebeben Filenamen werden exakt
geprueft, d.h. tempel1 matcht auch nur tempel1, aber nicht mehr tempel14.
Folge: in MNPC_AREA muessten nun _alle_ Raeume einzeln angegeben werden, die
betreten werden duerfen.
MNPC_NO_MOVE_HOME - Der MNPC geht im reset() nicht nach Hause, wenn er
laenger keinen Spielerkontakt hatte, sondern bleibt an dem Standort,
wo er stehen blieb.
Achtung: sollte dieser Raum entladen werden, wird der MNPC dort
zuerstoert. Der Heimatraum des MNPC sollte dafuer vorsorgen (s. AddItem).
Ebenso kann es passieren, dass der MNPC sehr sehr lange nicht mehr
loslaeuft, sollte sein Standort einsam liegen.
/***************************************************************************/
Nun noch ein Beispiel fuer einen Laufnpc im Glockenwald:
create()
{
::create();
SetProp(MNPC_DELAY, 30);
SetProp(MNPC_RANDOM, 30);
SetProp(MNPC_FLAGS, MNPC_WALK|MNPC_FOLLOW_PLAYER|MNPC_NO_WALK_IN_FIGHT);
SetProp(MNPC_AREA, ({ "/d/wald/troy/glockenwald" }));
...
}
// diese Funktion entscheidet darueber ob ein Raum betreten werden darf,
// oder nicht (hier wird also auch MNPC_AREA abgearbeitet). Ein
// Ueberschreiben dieser Funktion kann manchmal sinnvoll sein, um
// komplexere Bedingungen zu implementieren.
int PreventEnter(string file)
{
call_other(file, "???");
if (::PreventEnter(file) || present("elster", find_object(file)))
return 1;
return 0;
}
Dieser NPC laeuft durch den Glockenwald und sobald er einen Spieler trifft,
verfolgt er diesen, bis zum Rande des Glockenwaldes. Wenn ein Spieler ihn
angreift, bleibt er automatisch stehen. Die Spieler sind nur in Raeumen
sicher, in denen sich eine Elster befindet, denn diese Raeume betritt der
NPC nicht.