blob: a1dc82ae4b4c698fddc5d145c98424d18ed2c1f7 [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
MG Mud User88f12472016-06-24 23:31:02 +020010
11#define ANZ 3
12#include <properties.h>
13#include <bank.h>
14#include <defines.h>
15
16inherit "/std/thing/properties";
17inherit "/std/room/items";
18
19private nosave object *all;
20private nosave mapping all2;
21private nosave object shop;
22private nosave int sum;
23private nosave int store_percent_left;
24
25static int _set_store_percent_left()
26{
27 return store_percent_left=ZENTRALBANK->_query_store_percent_left();
28}
29
30public void _register_shop(object ob)
31{
32 shop=ob;
33}
34
35protected void create()
36{
37 seteuid(getuid());
38 properties::create();
39 items::create();
40 _set_store_percent_left();
41 SetProp(P_MIN_STOCK, 20); // immer eine Reserve fuer unsere Anfaenger...
42}
43
44protected void create_super() {
45 set_next_reset(-1);
46}
47
48public int MayAddObject(object ob)
49{ return 1; }
50
51protected varargs void remove_multiple(int limit, mixed fun) {}
52
53static int _query_store_consume()
54// da 0 = 20 ist, ist kein default initialisieren im create noetig!!!
55{
56 int consum;
57 consum=100-Query(P_STORE_CONSUME);
58 if (consum<0 || consum >=100) // consum = 100, wenn P_STORE_CONSUM = 0
59 return 70;
60 return consum;
61}
62
63static int _set_store_consume(int consum) /* 1 <= consum <= 100 */
64{
65 if (consum<1 || consum>100) return -1;
66 return (100-(int)Set(P_STORE_CONSUME, consum));
67}
68
69static int _query_min_stock()
70{
71 int stock;
72 stock=Query(P_MIN_STOCK);
73 if (stock<0) return 0;
74 return stock;
75}
76
77private void update_money() {
78 if (sum) {
79 if (!shop)
80 ZENTRALBANK->PayIn(sum);
81 else
82 shop->_add_money(sum);
83 }
84 sum=0;
85}
86
87protected void RemoveObjectFromStore(object ob) {
88 // Alle Funktionen die ausserhalb aufgerufen werden, werden "gecatcht"
89 catch(sum+=ob->QueryProp(P_VALUE)*store_percent_left/100; publish);
90 catch(ob->remove(); publish);
91 if (ob) destruct(ob); // Objekt auf jeden Fall zerstoeren
92}
93
94protected void aufraeumen() {
95 int i, size;
96 object ob;
97 string element;
98
99 if (!pointerp(all)) return;
100 if (!mappingp(all2)) all2=([]);
101 size=sizeof(all);
102 for (i=(size<=50 ? 0 : size-50); i<size; i++) {
103 if (!objectp(ob=all[i])) continue;
104 if (object_name(ob)[0..2]=="/d/" || object_name(ob)[0..8]=="/players/")
105 element=BLUE_NAME(ob);
106 else
107 catch(element=ob->short()+BLUE_NAME(ob); publish);
108 if (all2[element]++>ANZ)
109 RemoveObjectFromStore(ob);
110 }
111 if (size<=50) {
112 all=0; // Speicher freigeben...
113 all2=0;
114 update_money();
115 } else {
116 all=all[0..size-51];
117 call_out(#'aufraeumen,2);
118 }
119}
120
heull0017e6d28e2017-08-17 17:16:35 +0200121public void reset()
122{
123 int i, to;
Arathorn61e4ae92018-02-13 20:13:57 +0100124 < <int|<string|string*>|object|mapping>* >* itemlist;
125
MG Mud User88f12472016-06-24 23:31:02 +0200126 items::reset();
127 _set_store_percent_left();
128
heull0017e6d28e2017-08-17 17:16:35 +0200129 all=all_inventory();
130 if (!all || !sizeof(all))
131 {
MG Mud User88f12472016-06-24 23:31:02 +0200132 all=0; // Speicher freigeben
133 return;
134 }
heull0017e6d28e2017-08-17 17:16:35 +0200135 itemlist=QueryProp(P_ITEMS);
136 if (sizeof(itemlist))
137 {
138 // Elemente ohne konkretes Objekt (Index 0 im Wertearray fuer den Key)
139 // ausfiltern.
Zesstra900e5e62018-01-07 23:24:13 +0100140 itemlist=filter(itemlist, #'[, 0);
141 all-=map(itemlist,
Arathorn61e4ae92018-02-13 20:13:57 +0100142 function object(<int|<string|string*>|object|mapping>* arr)
heull0017e6d28e2017-08-17 17:16:35 +0200143 {
Zesstra900e5e62018-01-07 23:24:13 +0100144 return arr[0];
heull0017e6d28e2017-08-17 17:16:35 +0200145 });
Zesstra900e5e62018-01-07 23:24:13 +0100146
heull0017e6d28e2017-08-17 17:16:35 +0200147 if (!sizeof(all))
148 {
MG Mud User88f12472016-06-24 23:31:02 +0200149 all=0; // Speicher freigeben
150 return;
151 }
152 }
153
154 i=sizeof(all)-1;
155 to=i*QueryProp(P_STORE_CONSUME)/100;
heull0017e6d28e2017-08-17 17:16:35 +0200156 to=max(to,QueryProp(P_MIN_STOCK));
MG Mud User88f12472016-06-24 23:31:02 +0200157 // Hinterer Teil des Inventories wird zerstoert, also alle aelteren
158 // und somit vermutlich selten gekaufte Objekte
heull0017e6d28e2017-08-17 17:16:35 +0200159 for (;i>=to;--i)
160 {
MG Mud User88f12472016-06-24 23:31:02 +0200161 RemoveObjectFromStore(all[i]);
heull0017e6d28e2017-08-17 17:16:35 +0200162 }
MG Mud User88f12472016-06-24 23:31:02 +0200163 all2=([]);
164 call_out(#'aufraeumen,random(10));
165 update_money();
166}
167
168//dieser Raum wird sich nie per clean_up() zerstoeren, daher geben wir
169//0 zurueck, damit der Driver clean_up() nicht mehr ruft.
170int clean_up(int refcount) { return 0; }
171
172static int _query_current_money()
173{
174 return sum;
175}
176