blob: 6f04aefc336d275a948e2ceb7eddc505be40f167 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// inpc/nobank.c -- Nieder mit Bankzweities!
4//
5// $Id: nobank.c 8966 2014-11-19 21:41:12Z Zesstra $
6#pragma strong_types
7#pragma save_types
8#pragma range_check
9#pragma no_clone
10#pragma pedantic
11
12inherit "/std/living/moneyhandler";
13
14#include <properties.h>
15#include <attributes.h>
16#include <money.h>
17#define ME this_object()
18
19int DeepQueryMoney(object ob) {
20 int res,i;
21 object *obs;
22
23 if (!ob) return 0;
24 res=0;obs=deep_inventory(ob);
25 for (i=sizeof(obs)-1;i>=0;i--)
26 if ((ob=obs[i]) && load_name(ob)==GELD)
27 res+=ob->QueryProp(P_AMOUNT);
28 return res;
29}
30
31int is_bank(object ob) {
32 int *stats,geld;
33
34 if (!ob || !query_once_interactive(ob)) return 0;
35 stats=({ob->QueryAttribute(A_STR),
36 ob->QueryAttribute(A_INT),
37 ob->QueryAttribute(A_DEX),
38 ob->QueryAttribute(A_CON),
39 0});
40 stats[4]=stats[1]+stats[2]+stats[3];
41 geld=DeepQueryMoney(ob);
42
43 if (stats[0]>=10
44 && stats[4]<stats[0]
45 && geld>5000
46 && ob->QueryProp(P_XP)<300000
47 && ob->QueryProp(P_QP)<300)
48 return geld;
49 return 0;
50}
51
52int DeepTransferMoney(object pl, int amount) {
53 object *obs,ob;
54 int act,trans,i;
55
56 if (!pl || amount<=0)
57 return 0;
58 if (pl->QueryMoney()>=amount) {
59 pl->AddMoney(-1*amount);
60 trans=amount;
61 } else {
62 obs=deep_inventory(pl);trans=0;
63 for (i=sizeof(obs)-1;i>=0;i--) {
64 if ((ob=obs[i]) && load_name(ob)==GELD) {
65 act=ob->QueryProp(P_AMOUNT);
66 if (act<=0) continue;
67 if (act>=amount) { // mehr Geld als benoetigt?
68 ob->SetProp(P_AMOUNT,act-amount); // abziehen
69 trans+=amount;
70 amount=0; // nichts mehr benoetigt
71 break; // also auch ende
72 }
73 amount-=act;
74 trans+=act;
75 ob->remove(); // abziehen was da ist
76 }
77 }
78 }
79 log_file("stolen_money",
80 sprintf("%s %O: %O (%O)\n",ctime(time())[4..15],pl,trans,ME));
81 AddMoney(trans);
82 return trans;
83}
84
85varargs int TestAndTransfer(object ob, int trans, string msg) {
86 int geld,abzug;
87
88 if ((geld=is_bank(ob))<=0) return 0;
89 if (trans<0)
90 abzug=(geld*trans)/-100; // Prozentsatz
91 else
92 abzug=trans; // fester Abzug
93 if (abzug>geld) abzug=geld;
94 if (abzug<=0) return 0;
95 abzug=DeepTransferMoney(ob,abzug);
96 if (abzug<=0) return 0;
97 if (msg && ob)
98 tell_object(ob,sprintf(msg,abzug));
99 return abzug;
100}