MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | #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 | |
| 9 | inherit "std/room"; |
| 10 | |
| 11 | #define KONTO "seercard_kontostand" |
| 12 | |
| 13 | // Prototypes |
| 14 | public void BecomesNetDead( object pl ); |
| 15 | static int _guthaben(); |
| 16 | static int _einzahlen( string str ); |
| 17 | static int _aufladen( string str ); |
| 18 | static int _kaufen( string str ); |
| 19 | |
| 20 | |
| 21 | protected 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 | |
| 111 | public void BecomesNetDead( object pl ) |
| 112 | { |
| 113 | pl->move( PATH+"seherbank", M_GO|M_NOCHECK, 0, "wird rausgeworfen", |
| 114 | "schlafwandelt herein" ); |
| 115 | } |
| 116 | |
| 117 | |
| 118 | static 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 | |
| 134 | static 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 | |
| 220 | static 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 | |
| 286 | static 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 | } |