blob: 50c85e3003edbf1f4f4aeb955c6b2bf52cb462d2 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// npc/sequencer.c -- Scripte und Trigger fuer NPCs :)
4//
5// $Id: sequencer.c 7526 2010-04-02 00:01:26Z Arathorn $
6
7// seq2.c
8// Version 2.0 des Sequencers von Don Rumata 28.06.93
9//
10// Sinn:
11// Bereitstellung von Funktionen, ddamit ein npc mehrere Befehle
12// bei Eintritt eines bestimmten Ereignisses nacheinander
13// automatisch durchfuehrt.
14//
15// Ereignisse:
16// TellEvent: Es wird etwas in dem Raum, in dem der npc sich
17// befindet, gesagt.
18// GiveEvent: Es wird dem npc etwas gegeben.
19//
20// Programm:
21// Ein Programm ist eine Liste von Befehlen.
22// Jeder Befehl ist eine Liste, bestehend aus einem Kommando
23// und einer Zahl.
24// Das Kommendo wird aehnlich der Befehle, die ein Spieler ein-
25// gibt ausgefuehrt.
26// Vorsicht: NPCs koennen nur einen Teil der Befehle, die ein
27// Spieler kann, dafuer aber immer 'echo' und 'emote'.
28// Die Zahl gibt die Anzahl der Sekunden an, in der der naechste
29// Befehl ausgefuehrt wird.
30//
31// Funktionen:
32// RegisterTell( funktion, programm )
33// Wenn dem npc etwas gesagt wird, so wird die gesagte Meldung
34// an die Funktion uebergeben. Gibt die Funktionen nicht 0
35// zurueck, wird das Programm gestartet.
36// RegisterGive( funktion, programm )
37// Wird dem npc etwas gegeben, so wird das Objekt an die
38// Funktion uebergeben. Gibt die Funktion nicht 0 zurueck, so
39// wird das Programm gestartet.
40// Load( programm )
41// Starte das angegebene Programm.
42//
43// give_notify() gibt eine 1 zurueck, wenn das Objekt akzeptiert
44// wurde. (Es muss - falls gewuenscht - dann von Hand zuruech-
45// gegeben werden. (give_obj(ob,this_player())) in der Funk.)
46// mittels add_action() kann man im create() ds NPCs eigene
47// Verben fuer den NPC einfuehren.
48//
49// Es kann immer nur eine Funktion (egal ob Tell oder Give) angemeldet
50// sein. Es kann immer nur ein Programm gleichzeitig laufen.
51//
52// Ideen und Bugreports an Rumata
53
54string givefun, tellfun;
55mixed *program;
56int isRunning;
57
58// zur sicherheit nicht von aussen aufrufbar !!!!
59static string RegisterGive( string fun, mixed prog )
60{
61 if( isRunning ) return 0;
62 program = prog;
63 tellfun = 0;
64 return givefun = fun;
65}
66
67// zur sicherheit nicht von aussen aufrufbar !!!!
68static string RegisterTell( string fun, mixed prog )
69{
70 if( isRunning ) return 0;
71 program = prog;
72 givefun = 0;
73 return tellfun = fun;
74}
75
76// zur sicherheit nicht von aussen aufrufbar !!!!
77static void Start()
78{
79 if( isRunning || !objectp(this_object())) return;
80 isRunning = 1;
81 call_out( "nextStep", 0, 0 );
82}
83
84static void Load( mixed prog )
85{
86 if( isRunning ) return;
87 program = prog;
88 Start();
89}
90
91public void catch_tell( string str )
92{
93 if( isRunning || previous_object()==this_object()) return;
94 if( stringp(tellfun) && call_other( this_object(), tellfun, str ) )
95 Start();
96}
97
98int give_notify( object ob )
99{
100 if( isRunning ) return 0;
101 if( stringp(givefun) && call_other( this_object(), givefun, ob ) )
102 {
103 Start();
104 return 1;
105 }
106 return 0;
107}
108
109static void nextStep( int line )
110{
111 if( !isRunning ) return;
112 if( line >= sizeof( program ) )
113 {
114 isRunning = 0;
115 return;
116 }
117 command( process_string( program[line][0] ) );
118 if( !isRunning || !objectp(this_object()) ) return;
119 call_out( "nextStep", program[line][1], line+1 );
120}
121
122mixed QueryProg()
123{
124 return program[0..];
125}