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