blob: 3eab8ad6824c724f523a2c53ab9d73aa71b35b06 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001#include "haus.h"
2#include <properties.h>
3#include <moving.h>
4#include <wizlevels.h>
5
6inherit "/d/wueste/durian/behaelter";
7inherit "/p/service/wargon/mat_ed";
8inherit "/mail/nedit";
9
10static string owner;
11
12void create()
13{
14 if (!clonep(this_object())) return;
15
16 ::create();
17
18 Set(P_NAME, SAVE, F_MODE_AS);
19 Set(P_SHORT, SAVE, F_MODE_AS);
20 Set(P_LONG, SAVE, F_MODE_AS);
21 Set(P_GENDER, SAVE, F_MODE_AS);
22 Set(P_IDS, SAVE, F_MODE_AS);
23 Set(P_INVIS, SAVE, F_MODE_AS);
24 Set(P_NAME_ADJ, SAVE, F_MODE_AS);
25 Set(P_MATERIAL, SAVE, F_MODE_AS);
26 Set(H_DOORLSTAT, SAVE, F_MODE_AS);
27
28 SetProp( P_NAME, "Truhe" );
29 SetProp( P_SHORT, "Eine Truhe" );
30 SetProp( P_LONG,
31 "Eine stabile Holztruhe mit einem Sicherheitsschloss. Nur ausgewaehlte\n"
32 +"Personen duerfen die Truhe oeffnen und Sachen in ihr lagern oder aus\n"
33 +"ihr nehmen.\n" );
34 SetProp( P_GENDER, FEMALE );
35 SetProp( P_NOGET, 1 );
36 SetProp( P_IDS, ({ "truhe","holztruhe", TRUHE}) );
37 SetProp( P_MATERIAL, ([ MAT_MISC_WOOD : 100 ]) );
38 SetProp( H_DOORLSTAT, ({ "geschlossen", "geoeffnet"}) );
39
40 AddCmd( ({ "schieb","schiebe"}), "schieben" );
41 AddCmd( ({ "beschreib", "beschreibe" }), "beschreiben" );
42 AddCmd( ({ "aender", "aendere" }), "aendern" );
43}
44
45mixed
46_set_owner(string ow)
47{
48 string *na, *a;
49 int i;
50
51 if (ow && stringp(ow))
52 restore_object(HAUSSAVEPATH+ow+"truhe");
53
54 if ((na = QueryProp(P_NAME_ADJ)) && (i=sizeof(na))) {
55 for (a = ({ }), i-=1; i>=0; i--)
56 a += ({ DeclAdj(na[i], WER)[0..<2], DeclAdj(na[i], WEM)[0..<2], DeclAdj(na[i],WEN)[0..<2] });
57
58 a = m_indices(mkmapping(a));
59 if (sizeof(a))
60 AddAdjective(a);
61 }
62
63 SetZu();
64 return owner=ow;
65}
66
67string
68short()
69{
70 int open;
71 string sh, *stat;
72
73 open = (QueryProp(P_CNT_STATUS) == CNT_STATUS_OPEN);
74 sh = QueryProp(P_SHORT);
75 stat = QueryProp(H_DOORLSTAT);
76 if (!stat)
77 stat = ({ "", ""});
78 else if (strstr(sh, "%s") == -1)
79 sh += " (%s)";
80 if(QueryProp(P_INVIS)) return "";
81 return sprintf(sh, stat[offen])+".\n";
82}
83
84oeffne(string str)
85{
86 object env;
87
88 notify_fail("WAS moechtest Du oeffnen?\n");
89
90 // bin ich gemeint?
91 if (!str || present(str, environment()) != this_object())
92 return 0;
93
94 if ((env=environment()) && env->id("sehe\rhaus")) {
95 if (!env->allowed_check(this_player())) {
96 write("Du darfst "+name(WEN)+" nicht oeffnen!\n" );
97 return 1;
98 }
99 }
100 return ::oeffne(str);
101}
102
103int MayAddWeight(int w)
104{
105 return 0;
106}
107
108static int
109schieben(string richtung)
110{
111 string *aus;
112 mapping exits;
113
114 if (!environment() || (!environment()->id("sehe\rhaus")) ||
115 !environment()->tp_owner_check())
116 return 0;
117
118 notify_fail( "Syntax: schiebe <truhe> nach <richtung>\n");
119
120 if (!richtung || richtung == "")
121 return 0;
122
123 aus = old_explode(richtung, " ");
124 richtung = aus[<1];
125 if (sizeof(aus) < 3 || !id(implode(aus[0..<3]," ")))
126 return 0;
127
128 if (member(aus = m_indices(exits = environment()->QueryProp(P_EXITS)),richtung)==-1)
129 write( "Du kannst "+name(WEN,1)+" nicht nach '"+richtung+"' schieben!\n");
130 else if (!exits[richtung]->tp_owner_check())
131 write( "Du kannst "+name(WEN,1)+" nicht aus Deinem Haus hinausschieben!\n");
132 else {
133 write( "Du schiebst "+name(WEN,1)+" in einen anderen Raum. Dann kehrst\n"
134 +"Du wieder zurueck.\n");
135 say(capitalize(this_player()->name(WER))+" schiebt "+name(WEN)+" in einen anderen\n"
136 +"Raum, kehrt aber selber wieder.\n");
137 environment()->Set(H_CHEST,0);
138 environment()->Save();
139 move(exits[richtung], M_NOCHECK);
140 environment()->Set(H_CHEST,1);
141 environment()->Save();
142 }
143 return 1;
144}
145
146private string *brk(string str)
147{
148 int i;
149 string *t1, *t2;
150
151 t1 = regexplode(str, ", *");
152 for (t2 = ({}), i=sizeof(t1)-1; i>=0; i-=2)
153 t2 = ({t1[i]}) + t2;
154
155 return t2;
156}
157
158static void getShort();
159
160static int beschreiben(string str)
161{
162 string *x;
163
164 if (!str || getuid(this_player()) != owner)
165 return 0;
166
167 x = old_explode(str, " ");
168
169 if (x[<1] == "status" && !id(implode(x[0..<2]," ")))
170 return 0;
171 else if (!id(str) && (str != "truhe"))
172 return 0;
173
174 write( "Beschreibung "+name(WESSEN,1)+"\n"
175 +"Wenn die Vorgaben nicht geaendert werden sollen, einfach weiter\n"
176 +"mit <RETURN>.\n\n");
177 getShort();
178 return 1;
179}
180
181static void getShort()
182{
183 write("Geschlecht (m, w, s): ["
184 +({ "s","m","w" })[QueryProp(P_GENDER)]+"]\n]" );
185 input_to("gotGender");
186}
187
188static void gotGender(string str)
189{
190 int gen;
191 mixed name;
192
193 if (!str || str == "")
194 write("Geschlecht nicht geaendert.\n");
195 else if ((gen = member(({'s','m','w'}),str[0])) == -1) {
196 write( "Bitte nur 'm', 'w' oder 's' eingeben!\nGeschlecht:\n]");
197 input_to("gotGender");
198 return;
199 }
200 else {
201 SetProp(P_GENDER, gen);
202 write( "Das Geschlecht ist jetzt "+QueryGenderString()+".\n");
203 }
204
205 name = QueryProp(P_NAME);
206 write("Nun musst Du den Namen eingeben. Sollte der Name unregelmaessig dekliniert\n"
207 +"werden, musst Du den Namen in allen vier Faellen in der Reihenfolge Nomi-\n"
208 +"nativ, Genitiv, Dativ, Akkusativ und durch Kommata getrennt eingeben.\n"
209 +"Name: ["+(pointerp(name) ? implode(name, ", ") : name)+ "]\n]");
210 input_to("gotName");
211}
212
213static void gotName(string str)
214{
215 string *n;
216
217 if (!str || member(({ "", ".", "**", "~q"}), str) >= 0)
218 write("Name wurde nicht geaendert.\n");
219 else {
220 n = brk(str);
221
222 if (sizeof(n) == 1)
223 SetProp(P_NAME, n[0]);
224 else {
225 if (sizeof(n) > 4)
226 n = n[0..3];
227 else
228 while (sizeof(n) != 4)
229 n = n + ({ n[0] });
230 SetProp(P_NAME,n);
231 }
232 printf("Der Name ist jetzt '%s'\n", implode(n, ", "));
233 }
234 write("Du kannst jetzt noch Namensadjektive angeben. Hier darfst Du nur den Wort-\n"
235 +"stamm angeben, da die Adjektive automatisch dekliniert werden (also fuer\n"
236 +"eine 'alte Truhe' muesstest Du 'alt' angeben).\n"
237 +"Du kannst auch mehrere Adjektive, durch Kommata getrennt, angeben.\n"
238 +"Um alle Namensadjektive zu loeschen, gib bitte 'nix' ein.\n"
239 +"Namensadjektive: ["+implode(QueryProp(P_NAME_ADJ),", ")+"]\n");
240 input_to("gotAdj");
241}
242
243static void gotAdj(string str)
244{
245 string *n;
246
247 if (!str || member(({ "", ".", "**", "~q"}), str) >= 0)
248 write("Adjektive nicht geaendert.\n");
249 else {
250 n = brk(str);
251
252 if (member(n, "nix") == -1) {
253 SetProp(P_NAME_ADJ, n);
254 printf("Namensadjektive lauten %s.\n", implode(n,", "));
255 }
256 else {
257 SetProp(P_NAME_ADJ, ({}) );
258 write("Namensadjektive geloescht.\n");
259 }
260 }
261 SetProp(P_SHORT, capitalize(name(WER)));
262 write( "Die Kurzbeschreibung lautet damit:\n"+short());
263 write( "Falls das Ergebnis nicht Deinen Vorstellungen entspricht, gelangst Du\n"
264 +"mit 'n' wieder in die Geschlechtsabfrage, ansonsten geht es in der\n"
265 +"Beschreibunssequenz weiter.\n"
266 +"Stimmt die Kurzbeschreibung so? (j/n)\n]");
267 input_to("gotKurz");
268}
269
270static void gotKurz(string str)
271{
272 string art, nam, *p;
273 int gen;
274
275 if (str && sizeof(str) && str[0] == 'n') {
276 write( "Neues Spiel, neues Glueck... ;)\n");
277 getShort();
278 return;
279 }
280 write("\nIDs (durch Kommata getrennt):\n["+implode(QueryProp(P_IDS)-({TRUHE}), ",")+"]\n]");
281 input_to("gotIDs");
282}
283
284static void gotIDs(string str)
285{
286 if (!str || member( ({ "", ".", "**", "~q" }), str) >= 0 )
287 write("IDs nicht geaendert.\n");
288 else {
289 str = implode(old_explode(lower_case(str)," ")-({""})," ");
290 str = implode(old_explode(str,", "),",");
291 SetProp(P_IDS, old_explode(str, ",")+({TRUHE}));
292 write("OK, IDs lauten '"+str+"'\n");
293 }
294 write("\nBitte Langbeschreibung eingeben (Abbruch mit ~q, Ende mit . oder **):\n");
295 nedit("gotLang");
296}
297
298static void gotMat(mapping mat);
299
300static void gotLang(string str)
301{
302 if (!str || str == "")
303 write("Die Langbeschreibung wurde nicht veraendert.\n");
304 else
305 SetProp(P_LONG,implode(old_explode(str, "@@"),"**"));
306
307 write("\nBitte das Material "+name(WESSEN,1)+" bestimmen:\n"
308 "(<RETURN> falls nichts geaendert werden soll)\n\n");
309
310 EditMaterial(QueryProp(P_MATERIAL), #'gotMat, 0, ({MATGROUP_GAS,MATGROUP_EXPLOSIVE}));
311}
312
313static void gotMat(mapping mat)
314{
315 if (mappingp(mat)) {
316 SetProp(P_MATERIAL, mat);
317 write("OK.\n");
318 }
319 else
320 write("Das Material wurde nicht veraendert.\n");
321
322 save_object(HAUSSAVEPATH+owner+"truhe");
323}
324
325static int aendern(string str)
326{
327 if (getuid(this_player())!=owner || !id(str))
328 return 0;
329
330 write("Bitte Langbeschreibung aendern.\n(Abbruch mit ~q, Ende mit . oder **, Hilfe mit ~h)\n");
331 nedit("gotLang", QueryProp(P_LONG));
332 return 1;
333}
334
335void Save()
336{
337 save_object(HAUSSAVEPATH+owner+"truhe");
338}
339
340int SmartLog(string ofile, string typ, string msg, string date)
341{
342 object home;
343 string foo, bar;
344
345 write_file(REPFILE(owner), sprintf("%s von %s an der Truhe (%s):\n%s\n",
346 typ,
347 capitalize(getuid(this_player())),
348 date,
349 break_string(msg,78)));
350
351 if (IS_LEARNER(owner)) {
352 log_file("report/"+owner+".rep",
353 sprintf("MELDUNG von %s im Seherhaus, an der Truhe (%s):\n"
354 +"Bitte zur Kenntnis nehmen! (Mit dem Befehl 'meldungen') -Wargon\n",
355 capitalize(getuid(this_player())),
356 date));
357 }
358
359 home = load_object(RAUMNAME(owner,0));
360 home->Set(H_REPORT, home->Query(H_REPORT)+1);
361 home->Save();
362
363 return 1;
364}
365