blob: 4bfc96cd094351b412701df4cbe90c5ac8965407 [file] [log] [blame]
// MorgenGrauen MUDlib
//
// trading_price.c -- Preisverhalten von Laeden und Haendlern
//
// $Id: trading_price.c,v 3.3 2002/06/09 19:51:40 Tilly Exp $
#pragma strong_types
#pragma save_types
#pragma range_check
#pragma no_clone
#pragma pedantic
#define NEED_PROTOTYPES
#include <thing/properties.h>
#include <bank.h>
#undef NEED_PROTOTYPES
#include <properties.h>
// TODO: langfristig zu private aendern?
nosave int buyfact, shop_percent_left, mymoney, wantto, last;
private nosave int wantthresh, maxnum;
varargs int SetTradingData(int money, int factor, int maxobs)
{
if (extern_call() && previous_object() != this_object())
log_file("ZENTRALBANK",sprintf("INITIALIZE: %O got (%d,%d,%d) from %O (%O)\n",
this_object(), money,factor,maxobs,
previous_object(),this_player()));
if (money < 1000)
money = 1000;
last=wantto=mymoney=money;
wantthresh=wantto/2;
if (wantthresh < 5000)
wantthresh = 5000;
if (factor < 100)
buyfact = 300;
else
buyfact = factor;
if (maxobs < 1)
maxnum=3;
else
maxnum=maxobs;
return mymoney;
}
void SetBuyFact(int i)
{
buyfact=i*100;
}
varargs int QueryBuyFact(object client)
{
return buyfact;
}
int InflateSellValue(int value, int cnt)
{
cnt-=maxnum;
if (cnt<0) cnt=0;
return value-(value*cnt)/(cnt+25);
}
int TruncateSellValue(int value)
{
if (value > 500) {
value-=500;
value = ((1000*value)/(value+1000))+500;
}
return value;
}
int ObjectCount(object ob)
{
return objectp(ob); // 0 oder 1
}
varargs int QueryValue(object ob, int value, object client)
{
value=TruncateSellValue(InflateSellValue(value,ObjectCount(ob)));
if (3*value>mymoney)
{
log_file("LADEN",sprintf("Out of money: %O for %O (%s)\n",this_object(),
this_player(),dtime(time())[5..]));
value=mymoney/3;
}
if (value<0) value=0;
/* Preisverfall von beschaedigtenObjekten gleich hier festlegen */
if(value && ob->QueryProp(P_DAMAGED))
{
if(ob->QueryProp(P_WC) || ob->QueryProp(P_AC))
{
value = (6 * (value / 10));
}
else
{
value = (4 * (value / 10));
}
}
return value;
}
varargs int QuerySellValue(object ob, object client)
{
return QueryValue(ob,ob->QueryProp(P_VALUE),client);
}
varargs int QueryBuyValue(mixed ob, object client)
{
// Mit Runden.
return (ob->QueryProp(P_VALUE)*QueryBuyFact(client) + 50)/100;
}
protected void create()
{
SetProp(P_SHOP_PERCENT_LEFT, 0);
SetTradingData(50000,300,3);
}
protected void create_super() {
set_next_reset(-1);
}
void reset()
{
SetProp(P_SHOP_PERCENT_LEFT, 0);
if (last/3>mymoney)
wantto=wantto*110/100;
else
if (last/2<mymoney)
wantto=wantto*85/100;
if (wantto<wantthresh) wantto=wantthresh+500;
if (wantto>1500000) wantto=1500000;
if (wantto<mymoney)
{
ZENTRALBANK->PayIn(mymoney-wantto);
mymoney=wantto;
} else
mymoney+=ZENTRALBANK->WithDraw(wantto-mymoney);
last=mymoney;
}
void _add_money(int i) {
if (extern_call() && previous_object() != this_object())
log_file("ZENTRALBANK",sprintf("%s: TRANSFER: %O got %d from %O\n",
strftime("%H:%M"), this_object(), i, previous_object()));
mymoney+=i;
}
int _set_shop_percent_left(int dummy) {
return shop_percent_left=ZENTRALBANK->_query_shop_percent_left();
}
int _query_shop_percent_left() {
return shop_percent_left;
}
int _query_current_money() {
return mymoney;
}
int _query_wantto() {
return wantto;
}