| /* |
| * 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. |