blob: b39de0e00487973521bff60bb4bce69fa9ec643d [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001#include "../haus.h"
2
3inherit "std/thing";
4inherit "/p/service/wargon/sm/statemachine";
5
6#include "/p/service/wargon/sm/statemachine.h"
7#include <properties.h>
8#include <moving.h>
9
10#define STATE_IDLE 0
11#define STATE_GENERATING 1
12
13#define SIG_INIT 0
14#define SIG_GENERATE 1
15#define SIG_DONE 2
16
17private string dump(int haus, int final);
18private void enterGenerating(string ow, object env, int nr, int fin, int all);
19private void doGenerating(string ow, object env, int nr, int fin, int all);
20
21create()
22{
23 if (!clonep(this_object())) return;
24 thing::create();
25 statemachine::create();
26
27 SetProp( P_NAME, "Hausmeister");
28 SetProp( P_SHORT, "Ein Hausmeister" );
29 SetProp( P_LONG,
30 "Dies ist der Hausmeister aller Seherhaeuser. Er hilft Wurzel bei der\n"
31 +"Verwaltung der Haeuser.\n"
32 +"Der Hausmeister hat einen blauen Kittel an und eine Abrissbirne gezueckt.\n" );
33 SetProp( P_GENDER,MALE);
34 SetProp( P_NOGET, 1);
35
36 AddId( "hausmeister" );
37
38 AddState(STATE_IDLE, 0, 0);
39 AddState(STATE_GENERATING, #'doGenerating, 0);
40
41 AddTransition(SM_INVALID, SIG_INIT, STATE_IDLE);
42 AddTransition(STATE_IDLE, SIG_GENERATE, STATE_GENERATING, #'enterGenerating);
43 AddTransition(STATE_GENERATING, SIG_GENERATE, STATE_GENERATING, #'enterGenerating);
44 AddTransition(STATE_GENERATING, SIG_DONE, STATE_IDLE);
45
46 StateTransition(SIG_INIT);
47
48 AddCmd( "generiere", "generieren" );
49 AddCmd( ({ "reiss", "reisse" }), "abreissen" );
50 AddCmd( "verlege", "verlegen" );
51}
52
53static int
54bewege(mixed dest, int flags, string msg1, string msg2)
55{
56 int ret;
57
58 tell_room(environment(), capitalize(name(WER))+" "+msg1+".\n");
59 if ((ret = move(dest, flags)) == 1)
60 tell_room(environment(), capitalize(name(WER))+" "+msg2+".\n");
61
62 return ret;
63}
64
65static int generieren(string str)
66{
67 object env;
68 int nr, fin, all;
69 string ow, *parm;
70
71 env = environment(this_player());
72
73 notify_fail( "Syntax: generiere <name> [<nr>] [soft | ganz]\n" );
74
75 if (!str || str == "")
76 return 0;
77
78 parm = old_explode(str, " ");
79 fin = 1;
80
81 switch (sizeof(parm)) {
82 case 3:
83 if (parm[2] == "soft")
84 fin = 0;
85 case 2:
86 if (parm[1] == "soft")
87 fin = 0;
88 else if (parm[1] == "ganz") {
89 ow = parm[0];
90 nr = (VERWALTER)->HausProp(ow, HP_ROOMS);
91 str = ow+"raum"+nr;
92 all = 1;
93 break;
94 }
95 else {
96 nr = to_int(parm[1]);
97 str = parm[0]+"raum"+parm[1];
98 ow = parm[0];
99 break;
100 }
101 case 1:
102 ow = parm[0];
103 nr = -1;
104 str = ow+"haus";
105 break;
106 default:
107 return 0;
108 }
109 if (file_size(HAUSSAVEPATH+ow+".o")<0) {
110 write( "Es gibt kein '"+str+"'!\n");
111 return 1;
112 }
113 StateTransition(SIG_GENERATE, ({ow, env, nr, fin, all }) );
114 return 1;
115}
116
117static void enterGenerating(string ow, object env, int nr, int fin, int all)
118{
119 string str;
120
121 if (nr >= 0)
122 str = ow+"raum"+nr;
123 else
124 str = ow+"haus";
125
126 bewege(PATH+str, M_NOCHECK, "geht zur Arbeit", "kommt an");
127 tell_room(environment(),
128 Name(WER)+" zueckt einen Block, sieht sich alles genau an und macht\n"
129 +"sich hin und wieder Notizen. Dann nickt er zufrieden und steckt seinen\n"
130 "Block wieder weg.\n" );
131}
132
133static void doGenerating(string ow, object env, int nr, int fin, int all)
134{
135 object gen;
136 string str, out;
137
138 gen = clone_object(PATH+"tools/generator");
139 out = gen->dump(environment(), fin, ({ ow, env, nr, fin, all }));
140
141 if (nr >= 0)
142 str = ow+"raum"+nr;
143 else
144 str = ow+"haus";
145
146 bewege(env, M_NOCHECK, "geht zu seinem Auftraggeber zurueck", "kommt an");
147 write( "Der Hausmeister sagt: Ich habe '"+str+"' in die Datei\n"
148 +"Der Hausmeister sagt: '"+out+"' geschrieben, Chef!\n");
149}
150
151void
152GenerationDone(string ow, object env, int nr, int fin, int all)
153{
154 if (all)
155 {
156 if (nr > 0)
157 {
158 call_out("StateTransition", 1,
159 SIG_GENERATE, ({ ow, env, nr-1, fin, 1 }) );
160 }
161 else
162 {
163 call_out("StateTransition", 1,
164 SIG_GENERATE, ({ ow, env, -1, fin, 0 }) );
165 }
166 }
167 else
168 {
169 StateTransition(SIG_DONE, ({ ow, env, -1, fin, 0 }) );
170 }
171}
172
173static int abreissen(string str)
174{
175 object haus, env;
176 string ich, msg;
177
178 if (!str || str == "" || sscanf(str, "%s ab",str) != 1) {
179 notify_fail( "Syntax: reisse <name> ab\n" );
180 return 0;
181 }
182 str = lower_case(str);
183 if (!(haus = VERWALTER->FindeHaus(str))) {
184 write( capitalize(str)+" hat kein Haus!\n" );
185 return 1;
186 }
187 ich = capitalize(name(WER));
188 env = environment();
189 bewege(environment(haus), M_NOCHECK, "geht zur Arbeit", "kommt an");
190 msg = haus->Name(WER);
191
192 if (VERWALTER->LoescheHaus(str) == -1) {
193 tell_room(environment(), ich+" versucht vergeblich, ein Haus abzureissen.\n" );
194 msg = "Der Abrissversuch ist fehlgeschlagen, Chef!\n";
195 }
196 else {
197 tell_room(environment(), ich+" betaetigt eine Sirene.\n"+msg+" wird von "+name(WEM)+" eingeebnet.\n");
198 msg = msg+" ist abgerissen, Chef!\n";
199 if (haus) haus->remove();
200 }
201 bewege(env, M_NOCHECK, "geht zu seinem Auftraggeber zurueck", "kommt an");
202 write( "Der Hausmeister sagt: "+msg);
203 return 1;
204}
205
206static int verlegen(string str)
207{
208 string name, von, nach;
209 object haus;
210 int ret;
211
212 if (!str || sscanf(str, "%s nach %s", name, nach) != 2) {
213 notify_fail( "Syntax: verlege <name> nach <ziel>\n" );
214 return 0;
215 }
216 if (nach == "hier")
217 nach = object_name(environment(this_player()));
218
219 name = lower_case(name);
220
221 if (!(haus = VERWALTER->FindeHaus(name))) {
222 write( "Der Hausmeister sagt: "+capitalize(name)+" hat kein Haus!\n" );
223 return 1;
224 }
225 von = object_name(environment(haus));
226 ret = VERWALTER->VerlegeHaus(name, von, nach);
227 write( "Der Hausmeister sagt: " );
228 switch(ret) {
229 case -111:
230 write( "Das hast Du nicht zu bestimmen!\n" );
231 break;
232 case -3:
233 write( "Der Zielraum laesst sich nicht laden! Verlegen abgebrochen!\n" );
234 break;
235 case -4:
236 write( "Im Zielraum kann nicht gebaut werden!\n" );
237 break;
238 case -5:
239 write( "Im Haus von "+capitalize(name)+" gibt es noch Ausgaenge in andere Haeuser!\n");
240 break;
241 case 1:
242 write( "OK, Chef, ich habe das Haus verlegt!\n" );
243 break;
244 }
245 return 1;
246}
247