blob: ae5bb96299088c90ad8a821cd9009156e4953361 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001/************************************************************************************
2Vitrine fuer die Pokale
3Autor: Miril
4letzte Aenderung:
505.09.2011
6************************************************************************************/
7
8#include <properties.h>
9#include <defines.h>
10#include <wizlevels.h>
11#include "/d/ebene/miril/fraternitas/fraternitas.h"
12#include "/d/ebene/miril/fraternitas/trophy.h"
13#pragma strong_types,rtt_checks
14#include "/d/seher/haeuser/moebel/moebel.h"
15#include "/d/seher/haeuser/haus.h"
16
17inherit LADEN("swift_std_container");
18
19string besitzer;
20int staub;
21string *trophynamen;
22
23static string my_long();
24static string staub_descr();
25void GetTrophyDetails();
26string *GetAllTrophyNames();
27void NeueDetails();
28
29protected void create()
30{
31 if (!clonep(this_object())){
32 set_next_reset(-1);
33 return;
34 }
35 set_next_reset(86400);
36 ::create();
37 besitzer="";
38 staub=0;
39 SetProp(P_NAME,"Vitrine");
40 SetProp(P_SHORT,"Eine Vitrine");
41 Set(P_LONG,#'my_long,F_QUERY_METHOD);
42 SetProp(P_GENDER,FEMALE);
43 SetProp(P_MATERIAL,([MAT_GLASS:50,MAT_EBONY:50]));
44 SetProp(P_VALUE,10000);
45 SetProp(P_WEIGHT,500000);
46 SetProp(P_MAX_OBJECTS,0);
47 SetProp(P_MAX_WEIGHT,0);
48 SetProp(H_FURNITURE,1);
49 SetProp(P_NOGET,"Die Vitrine ist viel zu schwer.\n");
50 SetProp("cnt_version_obj",2);
51 GetTrophyDetails();
52 AddId(({"\nmiril_pokal_vitrine","vitrine"}));
53
54 NeueDetails();
55
56 AddCmd(({"saeubere","saeuber","reinige","reinig","mach","mache"}),
57 "saeuber_cmd");
58
59 AddCmd(({"stelle","stell"}),"stell_cmd");
60 RemoveCmd(({"serlaube"}));
61
62}
63
64void reset(){
65 ++staub;
66 set_next_reset(86400);
67 ::reset();
68 return;
69}
70
71void SetBesitzer(string uid,string uuid){
72 besitzer=uuid;
73 GetTrophyDetails();
74 return;
75}
76
77string QueryBesitzer(){
78 return besitzer;
79}
80
81void NeueDetails(){
82 AddDetail(({"holz","ebenholz"}),BS("Die Vitrine besteht teilweise "
83 "aus Ebenholz. Tueren, Deckel und Einlegeboeden sind aus Glas."));
84 AddDetail(({"tueren","tuer","glastueren","glastuer","deckel"}),BS(
85 "Durch das Glas kannst Du ins Innere der Vitrine gucken."));
86 AddDetail(({"inneres","gegenstaende","gegenstand"}),
87 BS("Dort kann man Pokale hineinstellen, aber nicht wieder "
88 "herausnehmen."));
89 AddDetail(({"glas","scheibe","scheiben"}),
90 BS("Glas ist praktisch, solange es sauber ist: "
91 "Man kann dadurch ins Innere schauen."));
92 AddDetail(({"reihe","platz","einlegeboeden","einlegeboden","boeden",
93 "boden"}),
94 BS("Die vielen Boeden bieten Platz fuer viele Pokale!"));
95 return;
96}
97
98
99static string my_long(){
100 if(staub<21)
101 return BS(
102 "Die schlichte Vitrine aus dunklem Holz eignet sich hervorragend, um "
103 "wertvolle Gegenstaende darin auszustellen. Hinter den beiden Glastueren "
104 "siehst Du eine Reihe von Einlegeboeden, die ebenfalls aus Glas bestehen. "+
105 staub_descr());
106 else return BS(staub_descr());
107}
108
109
110static string staub_descr(){
111 string text;
112 text="";
113 switch(staub){
114 case 0..1:
115 text=
116 "Die Vitrine ist hervorragend gepflegt. Du siehst keinerlei Staub "+
117 "darin, und die Scheiben sind voellig klar.\n";
118 AddDetail(({"staub"}),BS("Keiner zu sehen."));
119 break;
120 case 2..4:
121 text=
122 "Die Vitrine ist gut gepflegt. Es liegt kaum Staub darin, und die "+
123 "Tueren sind klar.\n";
124 AddDetail(({"staub"}),BS("Man sieht nur wenig davon."));
125 break;
126 case 5..7:
127 text=
128 "Die Vitrine ist in einem ordentlichen Zustand, allerdings sammelt "+
129 "sich so langsam Staub auf den Einlegeboeden.\n";
130 AddDetail(({"staub"}),BS("So langsam koennte man die "
131 "Vitrine saeubern!"));
132 AddDetail(({"zustand"}),BS("Noch ist er ordentlich."));
133 break;
134 case 8..10:
135 text=
136 "Die Vitrine wirkt schon etwas staubig. Man erkennt auch, dass "+
137 "der ein oder andere Fingerabdruck die Tueren ziert.";
138 AddDetail(({"staub","fingerabdruck","tueren","glastueren",
139 "deckel","glastuer","tuer","zustand"}),
140 BS("Es lohnt sich jetzt schon, die Vitrine zu saeubern."));
141 break;
142 case 11..15:
143 text=
144 "Du hast den Eindruck, dass die Vitrine langsam einmal gesaeubert "+
145 "werden koennte. Die Einlegeboeden sind staubig und zahlreiche "+
146 "Fingerabdruecke sind auf den Glastueren zu sehen.";
147 break;
148 case 16..20:
149 text=
150 "Die Vitrine macht einen recht ungepflegten Eindruck. Innen ist "+
151 "sie schon sehr verstaubt und auch die Tueren sind schon recht "+
152 "dreckig geworden.";
153 AddDetail(({"staub"}),BS("Nun wird es aber wirklich Zeit, die "
154 "Vitrine zu saeubern. Sonst sieht man bald nichts mehr darin."));
155 break;
156 case 21..25:
157 text=
158 "Die Vitrine ist total zugestaubt. Ueber den Glastueren sind "+
159 "erste Spinnweben zu erkennen und die Scheiben sind schon fast "+
160 "blind von all den Fingerabdruecken unaufmerksamer Gaeste.";
161 RemoveDetail(m_indices(QueryProp(P_DETAILS)));
162 AddDetail(({"spinnweben","dreck","vitrine","glastueren","glastuer",
163 "tueren","tuer","scheibe","scheiben","deckel"}),
164 "Unter dem ganzen Dreck ist leider nichts mehr zu erkennen.\n");
165 AddDetail(({"gaeste","gast","fingerabdruck","fingerabdruecke"}),
166 "Die Gaeste sind sicher schuld an dem Dreck.\n");
167 break;
168 case 26..30:
169 text=
170 "Du kannst die Vitrine unter der dicken Staubschicht kaum noch "+
171 "erkennen und die Glastueren sind blind geworden.";
172 AddDetail(({"staubschicht","schicht"}),
173 BS("Die ist verdammt dick und undurchsichtig."));
174 break;
175 default:
176 text=
177 "Dass sich unter dieser Ansammlung von Spinnweben und Staub noch "+
178 "eine Vitrine mit Glastueren verbergen soll, kannst Du kaum glauben. "+
179 "Jedenfalls kann man durch die voellig blinden Scheiben nichts "+
180 "mehr erkennen.";
181 AddDetail(({"dreck","spinnweben","staub","ansammlung"}),"Pfui Deibel!\n");
182 }
183 return text;
184}
185
186static int saeuber_cmd(string str){
187 string text;
188 if(!str) return 0;
189 if(strstr(str,"vitrine")<0) return 0;
190 switch(staub){
191 case 0:
192 write("Das ist noch nicht noetig!\n");
193 return 1;
194 break;
195 case 1..20:
196 text="Du reinigst die Vitrine gruendlich. Das wurde auch langsam "
197 "Zeit!";
198 if(getuuid(TP)!=besitzer)
199 text+="Du fragst Dich, wieso Du fremde Moebel reinigst.";
200
201 write(BS(text));
202 say(BS(TPN+" reinigt die Vitrine gruendlich. Das wurde auch langsam "
203 "Zeit!\n"),TP);
204 staub=0; //Hier darf noch jemand helfen!
205 break;
206 case 21..30:
207 text="Du beginnst die Vitrine zu reinigen. ";
208 if(getuuid(TP)!=besitzer){
209 text+="Nach einiger Zeit fragst Du Dich, ob Du eigentlich spinnst, "+
210 "denn das ist ueberhaupt nicht Deine Vitrine. Du laesst von dem "+
211 "Vorhaben wieder ab.";
212 say(BS(TPN+" faengt kurz an, die Vitrine zu reinigen, laesst es aber "
213 "schnell wieder sein."),TP);
214 }
215 else{
216 text+="Das dauert eine ganze Weile, aber dann strahlt die Vitrine "
217 "wieder.";
218 say(BS(TPN+" beginnt die Vitrine zu reinigen. Das dauert eine ganze "
219 "Weile, aber dann strahlt sie wieder."),TP);
220 staub=0;
221 }
222 write(BS(text));
223 break;
224 default:
225 if(getuuid(TP)!=besitzer)
226 write("Das dreckige Teil fasst Du nicht an!\n");
227 else{
228 write(BS(
229 "Du schrubbst und schrubbst und es scheint kein Ende zu nehmen. "
230 "Als Du schon langsam aufgeben willst, ist so langsam ein kleiner "
231 "Erfolg zu sehen. Du nimmst Dir vor, die Vitrine in Zukunft "
232 "haeufiger zu reinigen!"));
233 say(BS(
234 TPN+" schrubbt stundenlang an der Vitrine rum, bis sie endlich "
235 "wieder richtig sauber ist."),TP);
236 staub=0;
237 }
238 }
239 if(staub==0){
240 RemoveDetail(m_indices(QueryProp(P_DETAILS)));
241 GetTrophyDetails();
242 NeueDetails();
243 }
244 return 1;
245}
246
247void GetTrophyDetails(){
248 string *trophyliste,*shorts;
249 mapping trophydetails;
250
251 shorts=({});
252
253 trophyliste=MIRIL_TROPHYMASTER->GetPlacedTrophies(besitzer);
254
255 foreach( string tr : trophyliste )
256 shorts+=({ MIRIL_TROPHYMASTER->GetTrophyShort(tr) });
257
258 shorts = sort_array(shorts, #'>);
259 if(!sizeof(shorts))
260 AddDetail(({"pokale","pokal","in vitrine"}),
261 "Bislang ist die Vitrine noch leer.\n");
262 else
263 AddDetail(({"pokale","pokal","in vitrine"}),
264 "Du siehst folgende Pokale in der Vitrine:\n"
265 +implode(shorts,".\n")+".\n");
266
267 foreach( string tr : trophyliste )
268 {
269 AddDetail( MIRIL_TROPHYMASTER->GetTrophyIds(tr),
270 BS(MIRIL_TROPHYMASTER->GetTrophyLong(tr)));
271
272 trophydetails = MIRIL_TROPHYMASTER->GetTrophyDetails(tr);
273 if ( !sizeof(trophydetails) )
274 continue;
275 foreach ( mixed det, string det_desc : trophydetails )
276 AddDetail( det, BS(det_desc) );
277 }
278 return;
279}
280
281string *GetAllTrophyNames(){
282 int i,anzahl;
283 string *trophynamen;
284
285 trophynamen=({});
286
287 foreach(string bla:MIRIL_TROPHYMASTER->GetTrophyListe())
288 trophynamen+=MIRIL_TROPHYMASTER->GetTrophyIds(bla);
289
290 return trophynamen;
291}
292
293static int stell_cmd(string str){
294 string was,identifier;
295 int resultat;
296 object ob;
297 if(!str) return 0;
298 if(strstr(str,"vitrine")<0) return 0;
299 notify_fail("Das ist nicht Deine Vitrine!\n");
300 if(getuuid(TP)!=besitzer)
301 return 0;
302 notify_fail("Die Syntax ist: stelle <gegenstand> in vitrine!\n");
303 if(sscanf(str,"%s in vitrine",was)!=1)
304 return 0;
305
306 notify_fail("Die Vitrine sollte schon offen sein.\n");
307 if(QueryProp(P_CNT_STATUS)!=CNT_STATUS_OPEN && !IS_LEARNER(TP))
308 return 0;
309 notify_fail("Du solltest die Vitrine vorher erstmal saeubern!\n");
310 if(staub>20)
311 return 0;
312 notify_fail("Das kannst Du leider nicht in die Vitrine stellen!\n");
313 if(member(GetAllTrophyNames(),lower_case(was))<0
314 && lower_case(was)!="pokal")
315 return 0;
316 notify_fail("Das hast Du nicht!\n");
317 if(!ob=present(was,TP))
318 return 0;
319 notify_fail("Das kannst Du leider nicht in die Vitrine stellen!\n");
320 if(!ob->id("\nmiril_pokal"))
321 return 0;
322
323 identifier=ob->QueryIdentifier();
324 resultat=MIRIL_TROPHYMASTER->PlaceTrophy(getuuid(TP),identifier);
325
326 notify_fail("Hier stimmt etwas nicht, sag bitte einem Erzmagier Bescheid! "
327 "Resultat="+resultat+"\n");
328 if(resultat!=1)
329 return 0;
330 write(BS("Du stellst den Pokal in die Vitrine und bewunderst ihn noch ein "
331 "wenig.\n"));
332 say(TPN+" stellt einen Pokal in die Vitrine.\n",TP);
333 GetTrophyDetails();
334 ob->remove();
335 if(ob)
336 destruct(ob);
337 return 1;
338}
339