MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // block.c -- Hier sammeln sich die Raten fuer das Seherhaus |
| 2 | // |
| 3 | // (c) 1994 Wargon@MorgenGrauen |
| 4 | // |
| 5 | // $Id: block.c,v 1.2 2003/11/15 13:56:01 mud Exp $ |
| 6 | // |
| 7 | #include <properties.h> |
| 8 | #include <language.h> |
| 9 | #include <moving.h> |
| 10 | #include <combat.h> |
| 11 | #include "haus.h" |
| 12 | |
| 13 | inherit "std/clothing"; |
| 14 | |
| 15 | private nosave int shadowing; |
| 16 | |
| 17 | create() |
| 18 | { |
| 19 | if (!clonep(this_object())) return; |
| 20 | |
| 21 | ::create(); |
| 22 | |
| 23 | SetProp( P_SHORT, "Der MG MASTER-BLOCK" ); |
| 24 | SetProp( P_NAME, "MASTERBLOCK" ); |
| 25 | SetProp( P_WEIGHT, 100 ); |
| 26 | SetProp( P_GENDER, MALE ); |
| 27 | SetProp( P_NODROP, 1 ); |
| 28 | SetProp( P_NEVERDROP, 1 ); |
| 29 | // wenn es keinen TP gibt, muss das Ding per SetProp(P_AUTOLOADOBJ) |
| 30 | // konfiguriert werden, nicht hier. Zesstra, 20.10.2007 |
| 31 | if (objectp(this_player())) |
| 32 | Set( P_AUTOLOADOBJ, ({ 0, this_player()->QueryProp(P_AGE) + MAX_TIME, |
| 33 | MAX_TIME/2, B_EP }) ); |
| 34 | Set( P_AUTOLOADOBJ, SECURED, F_MODE ); |
| 35 | SetProp( P_NOBUY, 1 ); |
| 36 | SetProp(P_MATERIAL, MAT_MARBLE); |
| 37 | |
| 38 | SetProp(P_WEAR_FUNC, this_object()); |
| 39 | SetProp(P_REMOVE_FUNC, this_object()); |
| 40 | |
| 41 | AddId( ({ "block", "masterblock", "master-block", "MG MASTER-BLOCK", "mg master-block", "\n block" }) ); |
| 42 | |
| 43 | AddCmd( "", "remindMe", 1); |
| 44 | } |
| 45 | |
| 46 | int query_prevent_shadow(object ob) |
| 47 | { |
| 48 | HLOG("SHADOW", sprintf("%s, von %O im Block.\n",dtime(time())[5..], ob)); |
| 49 | return 1; |
| 50 | } |
| 51 | |
| 52 | int |
| 53 | WearFunc(object me) |
| 54 | { |
| 55 | if (!shadowing && (Query(P_AUTOLOADOBJ)[V_FLAGS] & B_ACTIVE) ) { |
| 56 | clone_object("/std/player/shadows/block_shadow"); |
| 57 | shadowing = 1; |
| 58 | } |
| 59 | return 1; |
| 60 | } |
| 61 | |
| 62 | int |
| 63 | RemoveFunc(object me) |
| 64 | { |
| 65 | // manchmal gibts keinen TP und machmal ist TP nicht der Spieler, der den |
| 66 | // Block traegt. |
| 67 | if (this_player() && this_player() == environment()) { |
| 68 | shadowing = 0; |
| 69 | this_player()->SeherHatGenug(); |
| 70 | return 1; |
| 71 | } |
| 72 | return 0; |
| 73 | } |
| 74 | |
| 75 | static int |
| 76 | _query_value() |
| 77 | { |
| 78 | return( Query(P_AUTOLOADOBJ)[0] ); |
| 79 | } |
| 80 | |
| 81 | static int |
| 82 | _query_cursed() |
| 83 | { |
| 84 | return 0; |
| 85 | } |
| 86 | |
| 87 | static int |
| 88 | _set_schwer(int schwer) |
| 89 | { |
| 90 | int *al; |
| 91 | |
| 92 | al = Query(P_AUTOLOADOBJ); |
| 93 | if (schwer && !(al[V_FLAGS] & B_FAST)) { |
| 94 | al[V_DLINE] -= MAX_TIME/2; |
| 95 | al[V_WTIME] /= 2; |
| 96 | al[V_FLAGS] |= B_FAST; |
| 97 | } |
| 98 | else if (!schwer && (al[V_FLAGS] & B_FAST)) { |
| 99 | al[V_DLINE] += MAX_TIME/2; |
| 100 | al[V_WTIME] *= 2; |
| 101 | al[V_FLAGS] &= ~B_FAST; |
| 102 | } |
| 103 | Set( P_AUTOLOADOBJ, al[0..]); |
| 104 | return al[V_FLAGS] & B_FAST; |
| 105 | } |
| 106 | |
| 107 | static int |
| 108 | _query_schwer() |
| 109 | { |
| 110 | return (Query(P_AUTOLOADOBJ)[V_FLAGS] & B_FAST); |
| 111 | } |
| 112 | |
| 113 | static mixed |
| 114 | _set_autoloadobj(mixed al) |
| 115 | { |
| 116 | object ti; |
| 117 | |
| 118 | if ((ti = this_interactive()) && old_explode(object_name(ti),"#")[0] != "/secure/login") |
| 119 | HLOG("SET_AL",sprintf("Block: TI = %O, ENV = %O\n",this_interactive(), environment())); |
| 120 | |
| 121 | /* Kompatibilitaet... */ |
| 122 | if (pointerp(al) && !(al[V_FLAGS] & B_EP)) { |
| 123 | al[V_MONEY] *= 4; |
| 124 | al[V_FLAGS] |= B_EP; |
| 125 | } |
| 126 | return Set(P_AUTOLOADOBJ, al); |
| 127 | } |
| 128 | |
| 129 | static string |
| 130 | _query_long() |
| 131 | { |
| 132 | int *al; |
| 133 | int laufzeit, einzahlung; |
| 134 | int ratenhoehe; |
| 135 | string ret; |
| 136 | |
| 137 | al = Query(P_AUTOLOADOBJ); |
| 138 | ret = "Dies ist der MG MASTER-BLOCK. Er besteht aus massivem Marmor, um die Sicher-\n" |
| 139 | +"heit der eingezahlten Rate zu gewaehrleisten. Mit einem Goldkettchen versehen,\n" |
| 140 | +"kann man ihn tragen wie ein Amulett. Dies ist auch noetig, wenn auf den Block\n" |
| 141 | +"eingezahlt werden soll.\n"; |
| 142 | |
| 143 | ratenhoehe = RATENHOEHE; |
| 144 | if (al[V_FLAGS] & B_EXTEND) |
| 145 | ratenhoehe += (RATENHOEHE*6)/10; |
| 146 | laufzeit = 2*(al[V_DLINE]-this_player()->QueryProp(P_AGE)); |
| 147 | einzahlung = al[V_MONEY]; |
| 148 | |
| 149 | if (laufzeit < 0) |
| 150 | ret += "Leider hast Du die Zahlung dieser Rate verpasst!\n"; |
| 151 | else { |
| 152 | if (einzahlung >= ratenhoehe) |
| 153 | ret += "Er ist vollstaendig mit der Rate gefuellt.\n"; |
| 154 | else |
| 155 | ret += sprintf( "Du hast bis jetzt %d (von %d) Punkten eingezahlt.\n", einzahlung, ratenhoehe ); |
| 156 | |
| 157 | ret += time2string("Diese Rate muss bis in %h %H, %m %M und %s %S abbezahlt sein!\n", laufzeit); |
| 158 | } |
| 159 | return ret; |
| 160 | } |
| 161 | |
| 162 | static int |
| 163 | remindMe() |
| 164 | { |
| 165 | int noch, next, *al, ratenhoehe; |
| 166 | object vertrag; |
| 167 | |
| 168 | al = Query(P_AUTOLOADOBJ); |
| 169 | next = al[V_WTIME]; |
| 170 | ratenhoehe = RATENHOEHE; |
| 171 | if (al[V_FLAGS] & B_EXTEND) |
| 172 | ratenhoehe += (RATENHOEHE*6)/10; |
| 173 | |
| 174 | if (al[V_MONEY] < ratenhoehe) { |
| 175 | noch = al[V_DLINE]-this_player()->QueryProp(P_AGE); |
| 176 | if (noch >= 0) { |
| 177 | if (next > noch) { |
| 178 | call_out("doRemind", 0, this_player(), time2string( "Die naechste Rate wird in %h %H, %m %M und %s %S faellig!\n", 2*noch)); |
| 179 | do next -= WARN_TIME; while (next>0 && next>noch); |
| 180 | if (next < 0) |
| 181 | next = 0; |
| 182 | al[V_WTIME] = next; |
| 183 | Set(P_AUTOLOADOBJ, al[0..]); |
| 184 | } |
| 185 | } |
| 186 | else { |
| 187 | if (al[V_FLAGS] & B_EXTEND) { |
| 188 | string s; |
| 189 | |
| 190 | write( "Du hast die Strafrate nicht bezahlt!\n" ); |
| 191 | if (vertrag = present( "sehe\rvertrag", this_player())) { |
| 192 | write( "Damit verfaellt auch Dein Bausparvertrag! Und das im wahrsten Sinne des\nWortes...\n" ); |
| 193 | vertrag->remove(); |
| 194 | } |
| 195 | s = "Block: "+getuid(this_player())+" hat ueberzogen... ;)\n"; |
| 196 | HLOG(getuid(this_player()), s); |
| 197 | HLOG("BANK.LOG", s); |
| 198 | remove(1); |
| 199 | } |
| 200 | else { |
| 201 | write( "Du hast die letzte Ratenzahlung verpasst!\n" |
| 202 | +"Die Ratenhoehe erhoeht sich um die Strafgebuehr.\n" ); |
| 203 | al[V_FLAGS] |= B_EXTEND; |
| 204 | if (al[V_FLAGS] & B_FAST) { |
| 205 | al[V_DLINE] += MAX_TIME/4; |
| 206 | al[V_WTIME] = MAX_TIME/8; |
| 207 | } |
| 208 | else { |
| 209 | al[V_DLINE] += MAX_TIME/2; |
| 210 | al[V_WTIME] = MAX_TIME/4; |
| 211 | } |
| 212 | Set( P_AUTOLOADOBJ, al[0..]); |
| 213 | } |
| 214 | } |
| 215 | } |
| 216 | |
| 217 | return 0; |
| 218 | } |
| 219 | |
| 220 | int |
| 221 | Gutschreiben(int money) |
| 222 | { |
| 223 | int back, ratenhoehe; |
| 224 | mixed al; |
| 225 | |
| 226 | if (!QueryProp(P_WORN)) // Zum Gutschreiben muss der Block getragen werden! |
| 227 | return money; |
| 228 | |
| 229 | al = Query(P_AUTOLOADOBJ); |
| 230 | back = 0; |
| 231 | |
| 232 | ratenhoehe = RATENHOEHE; |
| 233 | if (al[V_FLAGS] & B_EXTEND) |
| 234 | ratenhoehe += (RATENHOEHE*6)/10; |
| 235 | |
| 236 | if (old_explode(object_name(previous_object()),"#")[0] != "/std/player/shadows/block_shadow") { |
| 237 | mixed env; |
| 238 | |
| 239 | env = environment(); |
| 240 | if (env) |
| 241 | env = getuid(env); |
| 242 | else |
| 243 | env = "BANK.LOG"; |
| 244 | HLOG(env, sprintf("Block: Gutschrift von aussen (%d EP), TI = %O)!\n", money, this_interactive())); |
| 245 | } |
| 246 | al[V_MONEY] += money; |
| 247 | if (al[V_MONEY] >= ratenhoehe) { // genug eingezahlt... |
| 248 | back = al[V_MONEY]-ratenhoehe; |
| 249 | al[V_MONEY] = ratenhoehe; |
| 250 | al[V_FLAGS] &= ~B_ACTIVE; |
| 251 | money -= back; |
| 252 | call_out("blockVoll",0,environment()); |
| 253 | } |
| 254 | |
| 255 | Set(P_AUTOLOADOBJ, al[0..]); |
| 256 | |
| 257 | return back; |
| 258 | } |
| 259 | |
| 260 | void |
| 261 | blockVoll(object pl) |
| 262 | { |
| 263 | tell_object(pl, "Der Block fuer diese Rate ist jetzt voll!\n"); |
| 264 | pl->SeherHatGenug(); // shadow entfernen |
| 265 | } |
| 266 | |
| 267 | void |
| 268 | doRemind(object pl, string str) |
| 269 | { |
| 270 | tell_object(pl, str); |
| 271 | } |
| 272 | |
| 273 | protected int PreventMove(object dest, object oldenv, int method) { |
| 274 | if (previous_object() && previous_object()->QueryBuyFact()) // Im Laden... |
| 275 | return ME_CANT_BE_DROPPED; |
| 276 | return ::PreventMove(dest, oldenv, method); |
| 277 | } |
| 278 | |
| 279 | protected void NotifyMove(object dest, object oldenv, int method) { |
| 280 | |
| 281 | if (oldenv || (object_name(previous_object()) != PATH+"sb_antrag" && |
| 282 | object_name(previous_object()) != PATH+"sb_einzahlung" && |
| 283 | object_name(previous_object()) != object_name(dest))) |
| 284 | HLOG("MOVING", sprintf("Block: von %O -> %O mit %O (%O)\n", |
| 285 | environment(), dest, |
| 286 | previous_object(), getuid(previous_object()))); |
| 287 | |
| 288 | return ::NotifyMove(dest, oldenv, method); |
| 289 | } |
| 290 | |
| 291 | int |
| 292 | remove(int silent) |
| 293 | { |
| 294 | if (clonep(this_object()) && environment()) |
| 295 | environment()->SeherHatGenug(); |
| 296 | |
| 297 | return ::remove(silent); |
| 298 | } |
| 299 | |
| 300 | // $Log: block.c,v $ |
| 301 | // Revision 1.2 2003/11/15 13:56:01 mud |
| 302 | // MAT_MARBLE |
| 303 | // |
| 304 | // Revision 1.1.1.1 2000/08/20 20:22:42 mud |
| 305 | // Ins CVS eingecheckt |
| 306 | // |
| 307 | // Revision 1.4 1994/12/17 15:56:58 Wargon |
| 308 | // Etwas mehr Sicherheit gegen Zugriffe von aussen. |
| 309 | // |
| 310 | // Revision 1.3 1994/10/21 09:50:20 Wargon |
| 311 | // long()->_query_long() |
| 312 | // Shadow wird nur aktiv, wenn der Block gezueckt ist. |
| 313 | // |
| 314 | // Revision 1.2 1994/10/09 21:04:27 Wargon |
| 315 | // Man kann jetzt einstellen, ob der Block zu einem leichten, aber |
| 316 | // teureren oder zu einem schweren, aber billigeren Vertrag gehoert. |
| 317 | // Falls man eine Rate verpasst hat, verfaellt damit auch der Ver- |
| 318 | // trag. |
| 319 | // Gutgeschrieben wird nur, wenn der Block gezueckt ist. |
| 320 | // Gutschreiben() liefert ueberzaehliges Geld zurueck. |
| 321 | // |
| 322 | // Revision 1.1 1994/10/07 14:35:34 Wargon |
| 323 | // Initial revision |
| 324 | // |