blob: 9dfc91ceaddd6ac4fced41f7841e6b864a076ec1 [file] [log] [blame]
zesstra42fd8bf2016-06-27 22:04:14 +02001/*
2 * Der ultimative NPC : mnpc.c (C) by Sir Lunch a lot
3 * $Id: mnpc.c,v 1.1 1993/10/12 16:23:07 djc Exp djc $
4 */
5
6Dieser urspruengliche mnpc wurde von mir weiterentwickelt und stark
7optimiert. Er ist gedacht um relativ einfach, effiziente Laufnpcs zu
8programmieren und erspart einem dadurch das Rad erneut erfinden zu muessen.
9Der Urspruengliche mnpc.c von Sir liegt fuer interessierte weiterhin in
10+d/unterwelt/std/mnpc.sir.
11
12Die Eigenschaften im Ueberblick:
13
14MNPC_AREA - In diesem Feld stehen die Raeume, in denen der NPC herumlaufen
15 kann, ({}) bedeutet, das der NPC ueberall hin kann (bitte nur mit
16 aeusserster Vorsicht und Absprache des RMs benutzen!!!).
17 Bsp.: SetProp(MNPC_AREA, ({ "/d/ebene/room/ak_str" }));
18 Dieser NPC kann ueber saemtliche Raeume der Akademiestrasse laufen, also
19 z.b. in einen Raum mit dem Filenamen /d/ebene/room/ak_str1
20 aber auch in alle Raeume in einem Verzeichnis /d/ebene/room/ak_str/*
21
22MNPC_HOME - der Startraum des NPCs in den er spaeter ggf. auch wieder
23 zurueckkehrt. Setzt man diese Property nicht, wird versucht, den Ort des
24 Clonens zu erraten/bestimmen, aber wenn man sicher gehen moechte, dass der
25 MNPC das Home hat, was man denkt, sollte man es explizit setzen.
26
27MNPC_DELAY und. MNPC_RANDOM
28 MNPC_DELAY + random(MNPC_RANDOM) ergibt den Abstand zwischen zwei
29 Bewegungen des NPCs.
Zesstra9ad5b112019-10-17 22:54:48 +020030 Die minimale Verzoegerung eines MNPC ist jedoch ein __HEART_BEAT_INTERVAL__
31 (aktuell 2s).
32
33 ACHTUNG:
zesstra42fd8bf2016-06-27 22:04:14 +020034 1. Diese Werte muessen gesetzt werden, _bevor_ MNPC_FLAGS
35 gesetzt werden, da die Set-Methode von MNPC_FLAGS die Anmeldung im
36 walk_master durchfuehrt. Sonst werden die Default-Werte benutzt!
Zesstra9ad5b112019-10-17 22:54:48 +020037 2. Wenn diese Werte geaendert werden, muss eine Neuanmeldung im
38 walk_master erfolgen. Hierzu muss entweder MNPC_WALK in MNPC_FLAGS
39 geloescht (und bis zum naechsten Walk gewartet werden) oder es muss
40 Stop(), gefolgt von RegisterWalker() gerufen werden.
zesstra42fd8bf2016-06-27 22:04:14 +020041
42MNPC_WALK_TIME - Zeitangabe wie lange es dauert bis der NPC stehen bleibt
43 falls er keinen Spieler mehr trifft. Dieser Wert sollte etwa 3-10 mal so
44 gross sein, wie die durchschnittliche Laufgeschwindigkeit. Wenn der NPC
45 dann einen reset lang keinen Spieler mehr trifft, movt er wieder in
46 seinen Startraum und wartet dort auf neue Spieler.
47 Defaultmaessig 600 sek.
48
49MNPC_FLAGS - property mit einem oder mehreren gesetzten Flags
50 MNPC_WALK - ueber dieses Flag kann das laufen ein- bzw. ausgeschaltet
51 werden.
52
53 MNPC_FOLLOW_PLAYER - der NPC verfolgt die Spieler, die er trifft
54
55 MNPC_NO_WALK_IN_FIGHT - der NPC bleibt beim kaempfen und rennt nicht weg
56
57 MNPC_GO_HOME_WHEN_STOPPED - der NPC geht sofort nach Hause wenn seine
58 Zeit abgelaufen ist.
59
60 MNPC_ONLY_EXITS - der NPC benutzt beim laufen keine SpecialExits
61 Diese Funktion ist sehr wichtig, da durch SpecialExits auch Raeume
62 betreten werden koennen die nicht in MNPC_AREA erlaubt wurden! Hierauf
63 muss dann bereits bei der Gebietskonstruktion geachtet werden.
64
65 MNPC_EXACT_AREA_MATCH - Die in MNPC_AREA angebeben Filenamen werden exakt
66 geprueft, d.h. tempel1 matcht auch nur tempel1, aber nicht mehr tempel14.
67 Folge: in MNPC_AREA muessten nun _alle_ Raeume einzeln angegeben werden, die
68 betreten werden duerfen.
69
70 MNPC_NO_MOVE_HOME - Der MNPC geht im reset() nicht nach Hause, wenn er
71 laenger keinen Spielerkontakt hatte, sondern bleibt an dem Standort,
72 wo er stehen blieb.
73 Achtung: sollte dieser Raum entladen werden, wird der MNPC dort
74 zuerstoert. Der Heimatraum des MNPC sollte dafuer vorsorgen (s. AddItem).
75 Ebenso kann es passieren, dass der MNPC sehr sehr lange nicht mehr
76 loslaeuft, sollte sein Standort einsam liegen.
77
78/***************************************************************************/
79
80Nun noch ein Beispiel fuer einen Laufnpc im Glockenwald:
81
82 create()
83 {
84 ::create();
85 SetProp(MNPC_DELAY, 30);
86 SetProp(MNPC_RANDOM, 30);
87 SetProp(MNPC_FLAGS, MNPC_WALK|MNPC_FOLLOW_PLAYER|MNPC_NO_WALK_IN_FIGHT);
88 SetProp(MNPC_AREA, ({ "/d/wald/troy/glockenwald" }));
89 ...
90 }
91
92 // diese Funktion entscheidet darueber ob ein Raum betreten werden darf,
93 // oder nicht (hier wird also auch MNPC_AREA abgearbeitet). Ein
94 // Ueberschreiben dieser Funktion kann manchmal sinnvoll sein, um
95 // komplexere Bedingungen zu implementieren.
96 int PreventEnter(string file)
97 {
98 call_other(file, "???");
99 if (::PreventEnter(file) || present("elster", find_object(file)))
100 return 1;
101 return 0;
102 }
103
104Dieser NPC laeuft durch den Glockenwald und sobald er einen Spieler trifft,
105verfolgt er diesen, bis zum Rande des Glockenwaldes. Wenn ein Spieler ihn
106angreift, bleibt er automatisch stehen. Die Spieler sind nur in Raeumen
107sicher, in denen sich eine Elster befindet, denn diese Raeume betritt der
108NPC nicht.