blob: 00a048bc1a095bb39ab0a0a75af01923ab9016e2 [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
heull0017e6d28e2017-08-17 17:16:35 +0200122public void reset()
123{
124 int i, to;
Zesstra900e5e62018-01-07 23:24:13 +0100125 < <int|<string|string*>|object>* >* itemlist;
MG Mud User88f12472016-06-24 23:31:02 +0200126
127 items::reset();
128 _set_store_percent_left();
129
heull0017e6d28e2017-08-17 17:16:35 +0200130 all=all_inventory();
131 if (!all || !sizeof(all))
132 {
MG Mud User88f12472016-06-24 23:31:02 +0200133 all=0; // Speicher freigeben
134 return;
135 }
heull0017e6d28e2017-08-17 17:16:35 +0200136 itemlist=QueryProp(P_ITEMS);
137 if (sizeof(itemlist))
138 {
139 // Elemente ohne konkretes Objekt (Index 0 im Wertearray fuer den Key)
140 // ausfiltern.
Zesstra900e5e62018-01-07 23:24:13 +0100141 itemlist=filter(itemlist, #'[, 0);
142 all-=map(itemlist,
143 function object(<int|<string|string*>|object>* arr)
heull0017e6d28e2017-08-17 17:16:35 +0200144 {
Zesstra900e5e62018-01-07 23:24:13 +0100145 return arr[0];
heull0017e6d28e2017-08-17 17:16:35 +0200146 });
Zesstra900e5e62018-01-07 23:24:13 +0100147
heull0017e6d28e2017-08-17 17:16:35 +0200148 if (!sizeof(all))
149 {
MG Mud User88f12472016-06-24 23:31:02 +0200150 all=0; // Speicher freigeben
151 return;
152 }
153 }
154
155 i=sizeof(all)-1;
156 to=i*QueryProp(P_STORE_CONSUME)/100;
heull0017e6d28e2017-08-17 17:16:35 +0200157 to=max(to,QueryProp(P_MIN_STOCK));
MG Mud User88f12472016-06-24 23:31:02 +0200158 // Hinterer Teil des Inventories wird zerstoert, also alle aelteren
159 // und somit vermutlich selten gekaufte Objekte
heull0017e6d28e2017-08-17 17:16:35 +0200160 for (;i>=to;--i)
161 {
MG Mud User88f12472016-06-24 23:31:02 +0200162 RemoveObjectFromStore(all[i]);
heull0017e6d28e2017-08-17 17:16:35 +0200163 }
MG Mud User88f12472016-06-24 23:31:02 +0200164 all2=([]);
165 call_out(#'aufraeumen,random(10));
166 update_money();
167}
168
169//dieser Raum wird sich nie per clean_up() zerstoeren, daher geben wir
170//0 zurueck, damit der Driver clean_up() nicht mehr ruft.
171int clean_up(int refcount) { return 0; }
172
173static int _query_current_money()
174{
175 return sum;
176}
177