MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // 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 | |
| 12 | inherit "/std/living/moneyhandler"; |
| 13 | |
| 14 | #include <properties.h> |
| 15 | #include <attributes.h> |
| 16 | #include <money.h> |
| 17 | #define ME this_object() |
| 18 | |
| 19 | int 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 | |
| 31 | int 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 | |
| 52 | int 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 | |
| 85 | varargs 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 | } |