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