blob: bd240acd11f2c191b6015ff50d14e314feb2f638 [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
Bugfix883419f2021-01-23 20:58:58 +010049MNPC_FUNC - Funktionsname, der per call_other() gerufen wird, nachdem der
50 MNPC neuen Raum betreten hat. Der Rueckgabewert dieser Funktion wird nicht
51 ausgewertet, und der Funktion werden keine Argumente uebergeben.
52
zesstra42fd8bf2016-06-27 22:04:14 +020053MNPC_FLAGS - property mit einem oder mehreren gesetzten Flags
54 MNPC_WALK - ueber dieses Flag kann das laufen ein- bzw. ausgeschaltet
55 werden.
56
57 MNPC_FOLLOW_PLAYER - der NPC verfolgt die Spieler, die er trifft
58
59 MNPC_NO_WALK_IN_FIGHT - der NPC bleibt beim kaempfen und rennt nicht weg
60
61 MNPC_GO_HOME_WHEN_STOPPED - der NPC geht sofort nach Hause wenn seine
62 Zeit abgelaufen ist.
63
64 MNPC_ONLY_EXITS - der NPC benutzt beim laufen keine SpecialExits
65 Diese Funktion ist sehr wichtig, da durch SpecialExits auch Raeume
66 betreten werden koennen die nicht in MNPC_AREA erlaubt wurden! Hierauf
67 muss dann bereits bei der Gebietskonstruktion geachtet werden.
68
69 MNPC_EXACT_AREA_MATCH - Die in MNPC_AREA angebeben Filenamen werden exakt
70 geprueft, d.h. tempel1 matcht auch nur tempel1, aber nicht mehr tempel14.
71 Folge: in MNPC_AREA muessten nun _alle_ Raeume einzeln angegeben werden, die
72 betreten werden duerfen.
73
74 MNPC_NO_MOVE_HOME - Der MNPC geht im reset() nicht nach Hause, wenn er
75 laenger keinen Spielerkontakt hatte, sondern bleibt an dem Standort,
76 wo er stehen blieb.
77 Achtung: sollte dieser Raum entladen werden, wird der MNPC dort
78 zuerstoert. Der Heimatraum des MNPC sollte dafuer vorsorgen (s. AddItem).
79 Ebenso kann es passieren, dass der MNPC sehr sehr lange nicht mehr
80 loslaeuft, sollte sein Standort einsam liegen.
81
Bugfix883419f2021-01-23 20:58:58 +010082 MNPC_DIRECT_MOVE - Der MNPC benutzt nicht command(), sondern move() fuer
83 die Bewegung. Dies funktioniert nicht bei Special-Exits und ergibt
84 normalerweise nur bei Non-Livings Sinn, also Objekten, die so tun, als
Zesstrac45fbcb2021-05-07 12:04:40 +020085 waeren sie NPCs. Bitte darauf achten, dass P_MSGIN, P_MSGOUT, P_MMSGIN
86 und P_MMSGOUT gesetzt werden. Hierbei wird bei Non-Livings aber das
87 move() von Livings emuliert, was nicht zu ganz identischen Ergebnissen
88 fuehrt. Von der Nutzung wird *abgeraten* bzw. dringend empfohlen, vor
89 jeder Nutzung Ruecksprache mit dem EM Mudlib zu halten.
Bugfix883419f2021-01-23 20:58:58 +010090 Es muss auch sichergestellt werden, dass die geerbten Funktionen
91 moving::mnpc_move(), moving::mnpc_reset() und moving::mnpc_init() auf
92 jeden Fall gerufen werden.
93
Zesstrac45fbcb2021-05-07 12:04:40 +020094
zesstra42fd8bf2016-06-27 22:04:14 +020095/***************************************************************************/
96
97Nun noch ein Beispiel fuer einen Laufnpc im Glockenwald:
98
99 create()
100 {
101 ::create();
102 SetProp(MNPC_DELAY, 30);
103 SetProp(MNPC_RANDOM, 30);
104 SetProp(MNPC_FLAGS, MNPC_WALK|MNPC_FOLLOW_PLAYER|MNPC_NO_WALK_IN_FIGHT);
105 SetProp(MNPC_AREA, ({ "/d/wald/troy/glockenwald" }));
106 ...
107 }
108
109 // diese Funktion entscheidet darueber ob ein Raum betreten werden darf,
110 // oder nicht (hier wird also auch MNPC_AREA abgearbeitet). Ein
111 // Ueberschreiben dieser Funktion kann manchmal sinnvoll sein, um
112 // komplexere Bedingungen zu implementieren.
113 int PreventEnter(string file)
114 {
115 call_other(file, "???");
116 if (::PreventEnter(file) || present("elster", find_object(file)))
117 return 1;
118 return 0;
119 }
120
121Dieser NPC laeuft durch den Glockenwald und sobald er einen Spieler trifft,
122verfolgt er diesen, bis zum Rande des Glockenwaldes. Wenn ein Spieler ihn
123angreift, bleibt er automatisch stehen. Die Spieler sind nur in Raeumen
124sicher, in denen sich eine Elster befindet, denn diese Raeume betritt der
125NPC nicht.