blob: 3511105785da75f7f2ed8983adb860399e8682c1 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// store.c -- Das Lager eines Ladens
4//
5// $Id: store.c 7100 2009-02-01 09:24:43Z Zesstra $
6#pragma strong_types
7#pragma save_types
8#pragma range_check
9#pragma no_clone
10#pragma pedantic
11
12#define ANZ 3
13#include <properties.h>
14#include <bank.h>
15#include <defines.h>
16
17inherit "/std/thing/properties";
18inherit "/std/room/items";
19
20private nosave object *all;
21private nosave mapping all2;
22private nosave object shop;
23private nosave int sum;
24private nosave int store_percent_left;
25
26static int _set_store_percent_left()
27{
28 return store_percent_left=ZENTRALBANK->_query_store_percent_left();
29}
30
31public void _register_shop(object ob)
32{
33 shop=ob;
34}
35
36protected void create()
37{
38 seteuid(getuid());
39 properties::create();
40 items::create();
41 _set_store_percent_left();
42 SetProp(P_MIN_STOCK, 20); // immer eine Reserve fuer unsere Anfaenger...
43}
44
45protected void create_super() {
46 set_next_reset(-1);
47}
48
49public int MayAddObject(object ob)
50{ return 1; }
51
52protected varargs void remove_multiple(int limit, mixed fun) {}
53
54static int _query_store_consume()
55// da 0 = 20 ist, ist kein default initialisieren im create noetig!!!
56{
57 int consum;
58 consum=100-Query(P_STORE_CONSUME);
59 if (consum<0 || consum >=100) // consum = 100, wenn P_STORE_CONSUM = 0
60 return 70;
61 return consum;
62}
63
64static int _set_store_consume(int consum) /* 1 <= consum <= 100 */
65{
66 if (consum<1 || consum>100) return -1;
67 return (100-(int)Set(P_STORE_CONSUME, consum));
68}
69
70static int _query_min_stock()
71{
72 int stock;
73 stock=Query(P_MIN_STOCK);
74 if (stock<0) return 0;
75 return stock;
76}
77
78private void update_money() {
79 if (sum) {
80 if (!shop)
81 ZENTRALBANK->PayIn(sum);
82 else
83 shop->_add_money(sum);
84 }
85 sum=0;
86}
87
88protected void RemoveObjectFromStore(object ob) {
89 // Alle Funktionen die ausserhalb aufgerufen werden, werden "gecatcht"
90 catch(sum+=ob->QueryProp(P_VALUE)*store_percent_left/100; publish);
91 catch(ob->remove(); publish);
92 if (ob) destruct(ob); // Objekt auf jeden Fall zerstoeren
93}
94
95protected void aufraeumen() {
96 int i, size;
97 object ob;
98 string element;
99
100 if (!pointerp(all)) return;
101 if (!mappingp(all2)) all2=([]);
102 size=sizeof(all);
103 for (i=(size<=50 ? 0 : size-50); i<size; i++) {
104 if (!objectp(ob=all[i])) continue;
105 if (object_name(ob)[0..2]=="/d/" || object_name(ob)[0..8]=="/players/")
106 element=BLUE_NAME(ob);
107 else
108 catch(element=ob->short()+BLUE_NAME(ob); publish);
109 if (all2[element]++>ANZ)
110 RemoveObjectFromStore(ob);
111 }
112 if (size<=50) {
113 all=0; // Speicher freigeben...
114 all2=0;
115 update_money();
116 } else {
117 all=all[0..size-51];
118 call_out(#'aufraeumen,2);
119 }
120}
121
122void reset() {
123 int i, to, stock;
124 mixed *itemlist;
125
126 items::reset();
127 _set_store_percent_left();
128
129 if (!(all=all_inventory()) || !sizeof(all)) {
130 all=0; // Speicher freigeben
131 return;
132 }
133 if (sizeof(itemlist=QueryProp(P_ITEMS))) {
134 itemlist=filter(itemlist, #'[, 0);
135 all-=itemlist;
136 if (!sizeof(all)) {
137 all=0; // Speicher freigeben
138 return;
139 }
140 }
141
142 i=sizeof(all)-1;
143 to=i*QueryProp(P_STORE_CONSUME)/100;
144 if ( to < (stock=QueryProp(P_MIN_STOCK)) )
145 to=stock;
146 else
147 stock=0;
148
149 // Hinterer Teil des Inventories wird zerstoert, also alle aelteren
150 // und somit vermutlich selten gekaufte Objekte
151 for (;i>=to;i--)
152 RemoveObjectFromStore(all[i]);
153 all2=([]);
154 call_out(#'aufraeumen,random(10));
155 update_money();
156}
157
158//dieser Raum wird sich nie per clean_up() zerstoeren, daher geben wir
159//0 zurueck, damit der Driver clean_up() nicht mehr ruft.
160int clean_up(int refcount) { return 0; }
161
162static int _query_current_money()
163{
164 return sum;
165}
166