blob: 86a9fa44de970293cc01503de09628ba05c173bc [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.
30 ACHTUNG:
31 1. Diese Werte muessen gesetzt werden, _bevor_ MNPC_FLAGS
32 gesetzt werden, da die Set-Methode von MNPC_FLAGS die Anmeldung im
33 walk_master durchfuehrt. Sonst werden die Default-Werte benutzt!
34 2. Wenn diese Werte geaendert werden, sollte man die MNPC_FLAGS neu
35 setzen, um so die Neuanmeldung im walk_master auszuloesen.
36
37MNPC_WALK_TIME - Zeitangabe wie lange es dauert bis der NPC stehen bleibt
38 falls er keinen Spieler mehr trifft. Dieser Wert sollte etwa 3-10 mal so
39 gross sein, wie die durchschnittliche Laufgeschwindigkeit. Wenn der NPC
40 dann einen reset lang keinen Spieler mehr trifft, movt er wieder in
41 seinen Startraum und wartet dort auf neue Spieler.
42 Defaultmaessig 600 sek.
43
44MNPC_FLAGS - property mit einem oder mehreren gesetzten Flags
45 MNPC_WALK - ueber dieses Flag kann das laufen ein- bzw. ausgeschaltet
46 werden.
47
48 MNPC_FOLLOW_PLAYER - der NPC verfolgt die Spieler, die er trifft
49
50 MNPC_NO_WALK_IN_FIGHT - der NPC bleibt beim kaempfen und rennt nicht weg
51
52 MNPC_GO_HOME_WHEN_STOPPED - der NPC geht sofort nach Hause wenn seine
53 Zeit abgelaufen ist.
54
55 MNPC_ONLY_EXITS - der NPC benutzt beim laufen keine SpecialExits
56 Diese Funktion ist sehr wichtig, da durch SpecialExits auch Raeume
57 betreten werden koennen die nicht in MNPC_AREA erlaubt wurden! Hierauf
58 muss dann bereits bei der Gebietskonstruktion geachtet werden.
59
60 MNPC_EXACT_AREA_MATCH - Die in MNPC_AREA angebeben Filenamen werden exakt
61 geprueft, d.h. tempel1 matcht auch nur tempel1, aber nicht mehr tempel14.
62 Folge: in MNPC_AREA muessten nun _alle_ Raeume einzeln angegeben werden, die
63 betreten werden duerfen.
64
65 MNPC_NO_MOVE_HOME - Der MNPC geht im reset() nicht nach Hause, wenn er
66 laenger keinen Spielerkontakt hatte, sondern bleibt an dem Standort,
67 wo er stehen blieb.
68 Achtung: sollte dieser Raum entladen werden, wird der MNPC dort
69 zuerstoert. Der Heimatraum des MNPC sollte dafuer vorsorgen (s. AddItem).
70 Ebenso kann es passieren, dass der MNPC sehr sehr lange nicht mehr
71 loslaeuft, sollte sein Standort einsam liegen.
72
73/***************************************************************************/
74
75Nun noch ein Beispiel fuer einen Laufnpc im Glockenwald:
76
77 create()
78 {
79 ::create();
80 SetProp(MNPC_DELAY, 30);
81 SetProp(MNPC_RANDOM, 30);
82 SetProp(MNPC_FLAGS, MNPC_WALK|MNPC_FOLLOW_PLAYER|MNPC_NO_WALK_IN_FIGHT);
83 SetProp(MNPC_AREA, ({ "/d/wald/troy/glockenwald" }));
84 ...
85 }
86
87 // diese Funktion entscheidet darueber ob ein Raum betreten werden darf,
88 // oder nicht (hier wird also auch MNPC_AREA abgearbeitet). Ein
89 // Ueberschreiben dieser Funktion kann manchmal sinnvoll sein, um
90 // komplexere Bedingungen zu implementieren.
91 int PreventEnter(string file)
92 {
93 call_other(file, "???");
94 if (::PreventEnter(file) || present("elster", find_object(file)))
95 return 1;
96 return 0;
97 }
98
99Dieser NPC laeuft durch den Glockenwald und sobald er einen Spieler trifft,
100verfolgt er diesen, bis zum Rande des Glockenwaldes. Wenn ein Spieler ihn
101angreift, bleibt er automatisch stehen. Die Spieler sind nur in Raeumen
102sicher, in denen sich eine Elster befindet, denn diese Raeume betritt der
103NPC nicht.