blob: 6f04aefc336d275a948e2ceb7eddc505be40f167 [file] [log] [blame]
// MorgenGrauen MUDlib
//
// inpc/nobank.c -- Nieder mit Bankzweities!
//
// $Id: nobank.c 8966 2014-11-19 21:41:12Z Zesstra $
#pragma strong_types
#pragma save_types
#pragma range_check
#pragma no_clone
#pragma pedantic
inherit "/std/living/moneyhandler";
#include <properties.h>
#include <attributes.h>
#include <money.h>
#define ME this_object()
int DeepQueryMoney(object ob) {
int res,i;
object *obs;
if (!ob) return 0;
res=0;obs=deep_inventory(ob);
for (i=sizeof(obs)-1;i>=0;i--)
if ((ob=obs[i]) && load_name(ob)==GELD)
res+=ob->QueryProp(P_AMOUNT);
return res;
}
int is_bank(object ob) {
int *stats,geld;
if (!ob || !query_once_interactive(ob)) return 0;
stats=({ob->QueryAttribute(A_STR),
ob->QueryAttribute(A_INT),
ob->QueryAttribute(A_DEX),
ob->QueryAttribute(A_CON),
0});
stats[4]=stats[1]+stats[2]+stats[3];
geld=DeepQueryMoney(ob);
if (stats[0]>=10
&& stats[4]<stats[0]
&& geld>5000
&& ob->QueryProp(P_XP)<300000
&& ob->QueryProp(P_QP)<300)
return geld;
return 0;
}
int DeepTransferMoney(object pl, int amount) {
object *obs,ob;
int act,trans,i;
if (!pl || amount<=0)
return 0;
if (pl->QueryMoney()>=amount) {
pl->AddMoney(-1*amount);
trans=amount;
} else {
obs=deep_inventory(pl);trans=0;
for (i=sizeof(obs)-1;i>=0;i--) {
if ((ob=obs[i]) && load_name(ob)==GELD) {
act=ob->QueryProp(P_AMOUNT);
if (act<=0) continue;
if (act>=amount) { // mehr Geld als benoetigt?
ob->SetProp(P_AMOUNT,act-amount); // abziehen
trans+=amount;
amount=0; // nichts mehr benoetigt
break; // also auch ende
}
amount-=act;
trans+=act;
ob->remove(); // abziehen was da ist
}
}
}
log_file("stolen_money",
sprintf("%s %O: %O (%O)\n",ctime(time())[4..15],pl,trans,ME));
AddMoney(trans);
return trans;
}
varargs int TestAndTransfer(object ob, int trans, string msg) {
int geld,abzug;
if ((geld=is_bank(ob))<=0) return 0;
if (trans<0)
abzug=(geld*trans)/-100; // Prozentsatz
else
abzug=trans; // fester Abzug
if (abzug>geld) abzug=geld;
if (abzug<=0) return 0;
abzug=DeepTransferMoney(ob,abzug);
if (abzug<=0) return 0;
if (msg && ob)
tell_object(ob,sprintf(msg,abzug));
return abzug;
}