zesstra | 42fd8bf | 2016-06-27 22:04:14 +0200 | [diff] [blame] | 1 | /* |
| 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 | |
| 6 | Dieser urspruengliche mnpc wurde von mir weiterentwickelt und stark |
| 7 | optimiert. Er ist gedacht um relativ einfach, effiziente Laufnpcs zu |
| 8 | programmieren und erspart einem dadurch das Rad erneut erfinden zu muessen. |
| 9 | Der Urspruengliche mnpc.c von Sir liegt fuer interessierte weiterhin in |
| 10 | +d/unterwelt/std/mnpc.sir. |
| 11 | |
| 12 | Die Eigenschaften im Ueberblick: |
| 13 | |
| 14 | MNPC_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 | |
| 22 | MNPC_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 | |
| 27 | MNPC_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 | |
| 37 | MNPC_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 | |
| 44 | MNPC_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 | |
| 75 | Nun 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 | |
| 99 | Dieser NPC laeuft durch den Glockenwald und sobald er einen Spieler trifft, |
| 100 | verfolgt er diesen, bis zum Rande des Glockenwaldes. Wenn ein Spieler ihn |
| 101 | angreift, bleibt er automatisch stehen. Die Spieler sind nur in Raeumen |
| 102 | sicher, in denen sich eine Elster befindet, denn diese Raeume betritt der |
| 103 | NPC nicht. |