blob: 2a713dcfdcd75824f44ee52b568d11fc6131e6a3 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// trading_price.c -- Preisverhalten von Laeden und Haendlern
4//
5// $Id: trading_price.c,v 3.3 2002/06/09 19:51:40 Tilly Exp $
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
11#define NEED_PROTOTYPES
12#include <thing/properties.h>
13#include <bank.h>
14
15#undef NEED_PROTOTYPES
16#include <properties.h>
17
18// TODO: langfristig zu private aendern?
19nosave int buyfact, shop_percent_left, mymoney, wantto, last;
20private nosave int wantthresh, maxnum;
21
22varargs int SetTradingData(int money, int factor, int maxobs)
23{
24 if (extern_call() && previous_object() != this_object())
25 log_file("ZENTRALBANK",sprintf("INITIALIZE: %O got (%d,%d,%d) from %O (%O)\n",
26 this_object(), money,factor,maxobs,
27 previous_object(),this_player()));
28
29 if (money < 1000)
30 money = 1000;
31
32 last=wantto=mymoney=money;
33 wantthresh=wantto/2;
34 if (wantthresh < 5000)
35 wantthresh = 5000;
36
37 if (factor < 100)
38 buyfact = 300;
39 else
40 buyfact = factor;
41
42 if (maxobs < 1)
43 maxnum=3;
44 else
45 maxnum=maxobs;
46
47 return mymoney;
48}
49
50void SetBuyFact(int i)
51{
52 buyfact=i*100;
53}
54
55varargs int QueryBuyFact(object client)
56{
57 return buyfact;
58}
59
60int InflateSellValue(int value, int cnt)
61{
62 cnt-=maxnum;
63 if (cnt<0) cnt=0;
64 return value-(value*cnt)/(cnt+25);
65}
66
67int TruncateSellValue(int value)
68{
69 if (value > 500) {
70 value-=500;
71 value = ((1000*value)/(value+1000))+500;
72 }
73 return value;
74}
75
76int ObjectCount(object ob)
77{
78 return objectp(ob); // 0 oder 1
79}
80
81varargs int QueryValue(object ob, int value, object client)
82{
83 value=TruncateSellValue(InflateSellValue(value,ObjectCount(ob)));
84 if (3*value>mymoney)
85 {
86 log_file("LADEN",sprintf("Out of money: %O for %O (%s)\n",this_object(),
87 this_player(),dtime(time())[5..]));
88 value=mymoney/3;
89 }
90 if (value<0) value=0;
91
92 /* Preisverfall von beschaedigtenObjekten gleich hier festlegen */
93
94 if(value && ob->QueryProp(P_DAMAGED))
95 {
96 if(ob->QueryProp(P_WC) || ob->QueryProp(P_AC))
97 {
98 value = (6 * (value / 10));
99 }
100 else
101 {
102 value = (4 * (value / 10));
103 }
104 }
105
106 return value;
107}
108
109varargs int QuerySellValue(object ob, object client)
110{
111 return QueryValue(ob,ob->QueryProp(P_VALUE),client);
112}
113
114varargs int QueryBuyValue(mixed ob, object client)
115{
116 // Mit Runden.
117 return (ob->QueryProp(P_VALUE)*QueryBuyFact(client) + 50)/100;
118}
119
120protected void create()
121{
122 SetProp(P_SHOP_PERCENT_LEFT, 0);
123 SetTradingData(50000,300,3);
124}
125
126protected void create_super() {
127 set_next_reset(-1);
128}
129
130void reset()
131{
132 SetProp(P_SHOP_PERCENT_LEFT, 0);
133
134 if (last/3>mymoney)
135 wantto=wantto*110/100;
136 else
137 if (last/2<mymoney)
138 wantto=wantto*85/100;
139 if (wantto<wantthresh) wantto=wantthresh+500;
140 if (wantto>1500000) wantto=1500000;
141 if (wantto<mymoney)
142 {
143 ZENTRALBANK->PayIn(mymoney-wantto);
144 mymoney=wantto;
145 } else
146 mymoney+=ZENTRALBANK->WithDraw(wantto-mymoney);
147 last=mymoney;
148}
149
150void _add_money(int i) {
151 if (extern_call() && previous_object() != this_object())
152 log_file("ZENTRALBANK",sprintf("%s: TRANSFER: %O got %d from %O\n",
153 strftime("%H:%M"), this_object(), i, previous_object()));
154 mymoney+=i;
155}
156
157int _set_shop_percent_left(int dummy) {
158 return shop_percent_left=ZENTRALBANK->_query_shop_percent_left();
159}
160
161int _query_shop_percent_left() {
162 return shop_percent_left;
163}
164
165int _query_current_money() {
166 return mymoney;
167}
168
169int _query_wantto() {
170 return wantto;
171}
172
173