blob: 9f29340e03bfa7882c4dd9409a8a338f939234ab [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001#include <properties.h>
2#include <wizlevels.h>
3#include <defines.h>
4#include <moving.h>
5#include <bank.h>
6#include "haus.h"
7#include <money.h>
8
9inherit "std/room";
10
11#define KONTO "seercard_kontostand"
12
13// Prototypes
14public void BecomesNetDead( object pl );
15static int _guthaben();
16static int _einzahlen( string str );
17static int _aufladen( string str );
18static int _kaufen( string str );
19
20
21protected void create()
22{
23 ::create();
24
25 SetProp( P_INDOORS, 1 );
26 SetProp( P_LIGHT, 1 );
27 SetProp( P_LOG_FILE, "report/tiamak.rep" );
28 SetProp( P_INT_SHORT, "Am Geldkartenschalter" );
29 SetProp( P_INT_LONG,
30 break_string( "Das ist also der Geldkartenschalter. Hinter einer "
31 "kaum durchsichtigen Rauchglasscheibe scheint ein "
32 "Beamter (oder zumindest irgendein Lebewesen) "
33 "geduldig zu warten. Neben dem Schalter haengt "
34 "eine Tafel.", 78 ) );
35
36 AddDetail( ({ "boden" }),
37 "Der tiefschwarze Boden gibt Dir das Gefuehl, im absoluten "
38 "Nichts zu stehen.\n" );
39 AddDetail( "gefuehl", "Kein schoenes Gefuehl.\n" );
40 AddDetail( ({ "schwarz", "schwaerze" }), "Tiefschwarz.\n" );
41 AddDetail( ({ "wand", "waende" }),
42 "Dunkle Schatten tanzen ueber die Waende.\n" );
43 AddDetail( ({ "decke" }),
44 "Sie scheint Dir in dieser unheimlichen Umgebung auf den "
45 "Kopf fallen zu\nwollen.\n" );
46 AddDetail( "umgebung", "Schau Dich doch um.\n" );
47 AddDetail( ({ "kopf" }), "Das ist der Gegenstand auf Deinem Hals.\n" );
48 AddDetail( "gegenstand", "Ich meine Deinen Kopf.\n" );
49 AddDetail( "hals", "Wenn Du Nachhilfe in Anatomie brauchst, such Dir "
50 "jemand anderen.\n" );
51 AddDetail( ({ "jemand" }), "Keiner da.\n" );
52 AddDetail( "nachhilfe", "Dazu musst Du wohl woanders suchen.\n" );
53 AddDetail( "anatomie", "Schlag es in einem Lexikon nach.\n" );
54 AddDetail( "lexikon", "Soetwas hast Du anscheinend noch nie gesehen.\n" );
55 AddDetail( ({ "nichts" }),
56 "Du bist blind!\n" );
57 AddDetail( ({ "schatten" }),
58 "Die Schatten sind nur dazu da, um Dich zu irritieren. "
59 "Und das machen sie gut.\n" );
60 AddDetail( ({ "beamte", "beamter", "beamten", "schalterbeamte",
61 "schalterbeamten", "schalterbeamter" }),
62 "Du kannst ihn nur schemenhaft hinter der Rauchglasscheibe "
63 "des Schalters er-\nkennen. Die Umrisse scheinen allerdings "
64 "zu keiner Lebensform zu gehoeren,\nderer Du Dich erinnern "
65 "koenntest.\n" );
66 AddDetail( ({ "scheibe", "glasscheibe", "rauchglas", "rauchglasscheibe" }),
67 "Ein schemenhafter Beamter sitzt dahinter.\n" );
68 AddDetail( ({ "umrisse" }),
69 "Sie sind aeusserst beunruhigend.\n" );
70 AddDetail( ({ "lebensform", "schemen", "lebewesen" }),
71 "Du moechtest gar nicht wissen, um was es sich dabei "
72 "handelt.\n" );
73 AddDetail( ({ "schalter", "geldkartenschalter" }),
74 "An diesem Schalter kannst Du die beruehmte"
75 " Seer-Card (TM) erwerben sowie\nDein Konto aufladen.\n" );
76 AddDetail( ({ "konto", "karte", "geldkarte", "card", "seercard",
77 "seer-card" }), "Wie das geht, steht auf der Tafel.\n" );
78 AddDetail( "tafel", "Du kannst sie lesen.\n" );
79
80 AddSmells( SENSE_DEFAULT, "Es riecht nach altem Staub.\n" );
81 AddSmells( "staub", "Hier lagern sicher viele alte Akten.\n" );
82 AddSmells( "akten", "Die riechen dann irgendwann nach Staub.\n" );
83
84 AddSounds( SENSE_DEFAULT, "Direkt vor dem Schalter ist es erstaunlich "
85 "ruhig.\nGeradezu ehrfurchtsvoll ruhig.\n" );
86 AddSounds( ({ "schalter", "ruhe", "ehrfurcht" }),
87 "Ob das am Schalterbeamten liegt?\n" );
88 AddSounds( ({ "beamter", "beamten", "schalterbeamter", "schalterbeamten" }),
89 "Ist er ueberhaupt noch da?\n" );
90
91 AddReadDetail( ({ "tafel", "preisliste" }),
92 "Preisliste:\n"
93 "================================================="
94 "=====================\n\n"
95 "Neue Geldkarte .................................."
96 "...... 10000 Muenzen\n"
97 "Syntax: kaufe geldkarte\n\n"
98 "Einzahlungen auf das Geldkarten-Konto ..........."
99 "...... 10% Gebuehren\n"
100 "Syntax: zahle <n> muenzen ein\n"
101 "oder lade karte auf\n\n" );
102
103 AddCmd( ({ "zahl", "zahle" }), "_einzahlen" );
104 AddCmd( ({ "lad", "lade" }), "_aufladen" );
105 AddCmd( ({ "kaufe", "kauf" }), "_kaufen" );
106
107 AddExit( "raus", PATH+"seherbank" );
108}
109
110
111public void BecomesNetDead( object pl )
112{
113 pl->move( PATH+"seherbank", M_GO|M_NOCHECK, 0, "wird rausgeworfen",
114 "schlafwandelt herein" );
115}
116
117
118static int _guthaben()
119{
120 mixed wert;
121
122 if ( !(this_player()->Query(KONTO, F_MODE) & SAVE) )
123 this_player()->Set( KONTO, SAVE, F_MODE_AS );
124
125 wert = this_player()->Query( KONTO, F_VALUE );
126
127 if ( !intp(wert) || wert < 0 || wert > 100000 )
128 return this_player()->Set( KONTO, 0, F_VALUE );
129
130 return wert;
131}
132
133
134static int _einzahlen( string str )
135{
136 int n, guthaben, gebuehr;
137 string dummy;
138 object ob;
139
140 if ( !this_player() || this_player() != this_interactive() )
141 return 0;
142
143 if ( !str || !stringp(str) || sscanf( str, "%d %s", n, dummy ) != 2 ||
144 dummy != "muenzen ein" )
145 return notify_fail( "Syntax: zahle <n> muenzen ein\n" ), 0;
146
147 if ( !IS_SEER(this_player()) )
148 return notify_fail( break_string("Werd doch erstmal Seher.", 78, "Der "
149 "Schalterbeamte grinst ueberheblich: "
150 ) ), 0;
151
152 if ( n < 1000 )
153 return notify_fail( break_string("Mit so kleinen Betraegen fangen "
154 "wir erst gar nicht an. Du musst "
155 "schon mindestens 1000 "
156 "Muenzen einzahlen.", 78,
157 "Der Schalterbeamte grummelt: ") ), 0;
158
159 guthaben = this_player()->QueryMoney();
160
161 // Man kann sein Konto natuerlich nicht mit dem Geld vom Konto aufladen ;-)
162 if ( ob = present( "\ngeldkarte", this_player() ) )
163 guthaben -= ob->QueryProp( P_AMOUNT );
164
165 if ( guthaben < n )
166 return notify_fail( break_string("Du hast ja gar nicht soviel Geld!",
167 78, "Der Schalterbeamte faucht "
168 "Dich an: ") ), 0;
169
170 if ( (guthaben = _guthaben()) == 100000 )
171 return notify_fail( break_string( "Deine Seer-Card (TM) ist bereits "
172 "maximal aufgeladen. Mehr als "
173 "100.000 Muenzen koennen damit aus "
174 "technischen Gruenden nicht "
175 "verwaltet werden.", 78,
176 "Der Schalterbeamte sagt: " ) ), 0;
177
178 gebuehr = to_int(n / 11.0 + 0.5);
179 n -= gebuehr;
180
181 if ( guthaben + n > 100000 )
182 return notify_fail( break_string("Tut mir leid, aber so hohe Betraege "
183 "kann die Geldkarte nicht verwalten.\n"
184 "Du kannst die Seer-Card (TM) mit "
185 "maximal 100.000 Muenzen aufladen. "
186 "Ausgehend von Deinem momentanen "
187 "Guthaben von " +
188 to_string(guthaben) + " Muenzen "
189 "wuerde Dich das (inkl. unserer "
190 "Verwaltungsgebuehren) " +
191 to_string(to_int((100000-guthaben) *
192 1.1 + 0.5)) +
193 " Muenzen kosten.\n"
194 "Um Dir die Rechnerei zu ersparen, "
195 "kannst Du auch einfach \"lade karte "
196 "auf\" benutzen, um Deine Geldkarte "
197 "maximal aufzuladen.", 78,
198 "Der Schalterbeamte sagt: ",
199 BS_LEAVE_MY_LFS) ), 0;
200
201 if ( objectp(ob) ){
202 write( "Du zeigst Deine Geldkarte kurz vor.\n" );
203 // notwendig, da sonst das Geld evtl. von der Karte selber abgebucht
204 // wird, falls sie als oberstes im Inv steht
205 this_player()->Set( KONTO, 0, F_VALUE );
206 }
207
208 this_player()->AddMoney( -(n + gebuehr) );
209 ZENTRALBANK->PayIn( gebuehr );
210 this_player()->Set( KONTO, guthaben + n, F_VALUE );
211
212 write( break_string( "Okay, Deine Geldkarte hat nun ein Guthaben von "
213 "insgesamt " + to_string(_guthaben()) + " Muenzen.",
214 78, "Der Schalterbeamte sagt: " ) );
215
216 return 1;
217}
218
219
220static int _aufladen( string str )
221{
222 int n, guthaben, gebuehr;
223 string dummy;
224 object ob;
225
226 if ( !this_player() || this_player() != this_interactive() )
227 return 0;
228
229 if ( !stringp(str) || sscanf( str, "%s auf", dummy ) != 1 ||
230 dummy != "karte" && dummy != "geldkarte" && dummy != "card" &&
231 dummy != "seercard" && dummy != "seer-card" )
232 return notify_fail( "Syntax: lade geldkarte auf\n" ), 0;
233
234 if ( !IS_SEER(this_player()) )
235 return notify_fail( break_string("Werd doch erstmal Seher.", 78, "Der "
236 "Schalterbeamte grinst ueberheblich: "
237 ) ), 0;
238
239 if ( (guthaben = _guthaben()) == 100000 )
240 return notify_fail( break_string( "Deine Seer-Card (TM) ist bereits "
241 "maximal aufgeladen. Mehr als "
242 "100.000 Muenzen koennen damit aus "
243 "technischen Gruenden nicht "
244 "verwaltet werden.", 78,
245 "Der Schalterbeamte sagt: " ) ), 0;
246
247 n = this_player()->QueryMoney();
248
249 // Man kann sein Konto natuerlich nicht mit dem Geld vom Konto aufladen ;-)
250 if ( ob = present_clone( SEHERKARTE, this_player() ) )
251 n -= ob->QueryProp( P_AMOUNT );
252
253 if ( (gebuehr = to_int( (100000 - guthaben) * 1.1 + 0.5 )) < n )
254 n = gebuehr;
255
256 gebuehr = to_int( n / 11.0 + 0.5 );
257 n -= gebuehr;
258
259 if ( n + gebuehr < 1000 )
260 return notify_fail( break_string("Mit so kleinen Betraegen fangen "
261 "wir erst gar nicht an. Du musst "
262 "schon mindestens 1000 "
263 "Muenzen einzahlen.", 78,
264 "Der Schalterbeamte grummelt: ") ), 0;
265
266 if ( objectp(ob) ){
267 write( "Du zeigst Deine Geldkarte kurz vor.\n" );
268 // notwendig, da sonst das Geld evtl. von der Karte selber abgebucht
269 // wird, falls sie als oberstes im Inv steht
270 this_player()->Set( KONTO, 0, F_VALUE );
271 }
272
273 this_player()->AddMoney( -(n + gebuehr) );
274 ZENTRALBANK->PayIn( gebuehr );
275 this_player()->Set( KONTO, guthaben + n, F_VALUE );
276
277 write( break_string( "Du zahlst " + to_string(n+gebuehr) + " Muenzen ein "
278 "und erhoehst Dein Guthaben damit auf " +
279 to_string(_guthaben()) + " Muenzen insgesamt.", 78,
280 "Der Schalterbeamte sagt: " ) );
281
282 return 1;
283}
284
285
286static int _kaufen( string str )
287{
288 if ( !this_interactive() || this_player() != this_interactive() )
289 return 0;
290
291 if ( str != "geldkarte" && str != "karte" && str != "card" &&
292 str != "seercard" && str != "seer-card" )
293 return notify_fail( "Syntax: kaufe geldkarte\n" ), 0;
294
295 if ( !IS_SEER(this_player()) )
296 return notify_fail( break_string("Werd doch erstmal Seher.", 78, "Der "
297 "Schalterbeamte grinst ueberheblich: "
298 ) ), 0;
299
300 if ( this_player()->QueryMoney() < 10000 )
301 return notify_fail( break_string("Du hast nicht genug Geld bei!",
302 78, "Der Schalterbeamte faucht "
303 "Dich an: ") ), 0;
304
305 object ob = clone_object( SEHERKARTE );
306 this_player()->AddMoney(-10000);
307 ZENTRALBANK->PayIn(10000);
308
309 if ( ob->move( this_player(), M_GIVE ) != 1 ){
310 write( "Der Schalterbeamte grummelt: Du kannst die Geldkarte nicht "
311 "mehr tragen.\nDer Schalterbeamte wirft Dir Deine Seer-Card "
312 "(TM) veraechtlich vor die Fuesse.\n" );
313 // trotzdem einmal in's Inv des Spielers bewegen, damit die Karte
314 // auf seinen Namen registriert wird
315 ob->move( this_player(), M_GIVE|M_NOCHECK );
316 // dann auf den Boden legen
317 ob->move( this_object(), M_PUT );
318 }
319 else
320 write( "Der Beamte haendigt Dir eine Seer-Card (TM) aus.\n" );
321
322 write( break_string( "Der Schalterbeamte macht Dich noch darauf "
323 "aufmerksam, dass Deine Seer-Card (TM) immer erst dann als "
324 "Zahlungsmittel in Anspruch genommen wird, wenn Deine in Boersen oder "
325 "in klingender Muenze mitgefuehrte Barschaft aufgebraucht sein "
326 "sollte - egal, was davon sich oben im Inventar befindet.\n"
327 "Was immer das auch heissen soll.", 78, 0, BS_LEAVE_MY_LFS ) );
328
329 this_player()->Set( KONTO, SAVE, F_MODE_AS );
330
331 return 1;
332}