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. |
Zesstra | 9ad5b11 | 2019-10-17 22:54:48 +0200 | [diff] [blame] | 30 | Die minimale Verzoegerung eines MNPC ist jedoch ein __HEART_BEAT_INTERVAL__ |
| 31 | (aktuell 2s). |
| 32 | |
| 33 | ACHTUNG: |
zesstra | 42fd8bf | 2016-06-27 22:04:14 +0200 | [diff] [blame] | 34 | 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! |
Zesstra | 9ad5b11 | 2019-10-17 22:54:48 +0200 | [diff] [blame] | 37 | 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. |
zesstra | 42fd8bf | 2016-06-27 22:04:14 +0200 | [diff] [blame] | 41 | |
| 42 | MNPC_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 | |
Bugfix | 883419f | 2021-01-23 20:58:58 +0100 | [diff] [blame] | 49 | MNPC_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 | |
zesstra | 42fd8bf | 2016-06-27 22:04:14 +0200 | [diff] [blame] | 53 | MNPC_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 | |
Bugfix | 883419f | 2021-01-23 20:58:58 +0100 | [diff] [blame] | 82 | 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 |
Zesstra | c45fbcb | 2021-05-07 12:04:40 +0200 | [diff] [blame^] | 85 | 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. |
Bugfix | 883419f | 2021-01-23 20:58:58 +0100 | [diff] [blame] | 90 | 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 | |
Zesstra | c45fbcb | 2021-05-07 12:04:40 +0200 | [diff] [blame^] | 94 | |
zesstra | 42fd8bf | 2016-06-27 22:04:14 +0200 | [diff] [blame] | 95 | /***************************************************************************/ |
| 96 | |
| 97 | Nun 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 | |
| 121 | Dieser NPC laeuft durch den Glockenwald und sobald er einen Spieler trifft, |
| 122 | verfolgt er diesen, bis zum Rande des Glockenwaldes. Wenn ein Spieler ihn |
| 123 | angreift, bleibt er automatisch stehen. Die Spieler sind nur in Raeumen |
| 124 | sicher, in denen sich eine Elster befindet, denn diese Raeume betritt der |
| 125 | NPC nicht. |