blob: 5b6e2575caa541526ded1b2d7a966d889df0f648 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// container/inventory.c -- Umgang mit besonderen Objekten im Inventory
4//
5// $Id: inventory.c 6379 2007-07-20 22:32:02Z Zesstra $
6
7#pragma strict_types
8#pragma save_types
9//#pragma range_check
10#pragma no_clone
MG Mud User88f12472016-06-24 23:31:02 +020011
12#define NEED_PROTOTYPES
13
14#include <thing.h>
15#include <properties.h>
16#include <sensitive.h>
17
18#define ME this_object()
19
20void RemoveSensitiveObjectFromList(object ob, string list) {
21 mixed a,b,c;
22 int i,f;
23
24 if (!pointerp(a=QueryProp(SENS_PROP_PREFIX+list)))
25 return;
26 f=1;
27 for (i=sizeof(a)-1;i>=0;i--)
28 if (!pointerp(b=a[i]) ||
29 !sizeof(b) ||
30 !objectp(c=b[0]) ||
31 environment(c)!=ME ||
32 c==ob)
33 a[i]=f=0;
34 if (f)
35 return;
36 a-=({0});
37 if (!sizeof(a))
38 a=0;
39 SetProp(SENS_PROP_PREFIX+list,a);
40}
41
42void RemoveSensitiveObject(object ob) {
43 RemoveSensitiveObjectFromList(ob,SENSITIVE_INVENTORY);
44 RemoveSensitiveObjectFromList(ob,SENSITIVE_INVENTORY_TRIGGER);
45}
46
47varargs void InsertSensitiveObjectToList(object ob, string list, string key,
48 int threshold, mixed *opt) {
49 mixed a;
50 int i;
51
52 if (!pointerp(a=QueryProp(SENS_PROP_PREFIX+list)))
53 a=({});
54 for (i=sizeof(a)-1;i>=0;i--)
55 if (a[i][SENS_OBJECT]==ob && a[i][SENS_KEY]==key)
56 return;
57 a+=({({ob,symbol_function(SENS_TRIGGER_PREFIX+list,ob),
58 key,threshold,opt})});
59 SetProp(SENS_PROP_PREFIX+list,a);
60}
61
62void InsertSensitiveObject(object ob, mixed arg) {
63 int i;
64 mixed x;
65 mapping map_ldfied;
66
67 if (!pointerp(arg))
68 return;
69 for (i=sizeof(arg)-1;i>=0;i--)
70 if (pointerp(x=arg[i]) &&
71 sizeof(x)>=3 &&
72 stringp(x[0]) &&
73 stringp(x[1]) &&
74 intp(x[2])) {
75 InsertSensitiveObjectToList(ob,x[0],x[1],x[2],x[3..]);
76 call_other(ME,SENS_INSERT_PREFIX+x[0],ob,x[1],x[2],x[3..]);
77 }
78}
79
80varargs void insert_sensitive_inv(object ob, string key,
81 int threshold, mixed *opt) {
82 // Diese Funktion sucht, ob beim Hinzufuegen eines sensitiven Objekts
83 // schon ein Objekt da ist, dass dieses ausloest.
84 // z.B. (dynamit, feuer, 100, opt_dynamit) sorgt fuer
85 // dynamit->trigger_sensitive_inv(fackel,feuer,120,opt_fackel,opt_dynamit)
86 // wenn eine Fackel vorher mit Wert 120 eingetragen war.
87 mixed a,x;
88 int i;
89
90 if (!pointerp(a=QueryProp(P_SENSITIVE_INVENTORY_TRIGGER)) ||
91 !objectp(ob))
92 return;
93 for (i=sizeof(a)-1;i>=0;i--)
94 if (pointerp(x=a[i]) &&
95 x[SENS_KEY]==key &&
96 x[SENS_THRESHOLD]>threshold && // Ist der Ausloeser gross genug?
97 objectp(x[SENS_OBJECT]) &&
98 environment(x[SENS_OBJECT])==environment(ob))
99 ob->trigger_sensitive_inv(x[SENS_OBJECT],x[SENS_KEY],x[SENS_THRESHOLD],
100 x[SENS_OPT],opt);
101 // Zuerst Trigger-Optionen, dann Optionen des sensitiven Objekts
102}
103
104varargs void insert_sensitive_inv_trigger(object ob, string key,
105 int threshold, mixed *opt) {
106 // Diese Funktion sucht, ob ein sensitives Objekt im Inventory ist,
107 // das durch dieses Objekt ausgeloest wird.
108 // z.B. (fackel, feuer, 120, opt_fackel) sorgt fuer
109 // dynamit->trigger_sensitive_inv(fackel,feuer,120,opt_fackel,opt_dynamit)
110 // wenn Dynamit mit Wert<120 eingetragen war
111 mixed a,x;
112 int i;
113
114 if (!pointerp(a=QueryProp(P_SENSITIVE_INVENTORY)) ||
115 !objectp(ob))
116 return;
117 for (i=sizeof(a)-1;i>=0;i--)
118 if (pointerp(x=a[i]) &&
119 x[SENS_KEY]==key &&
120 x[SENS_THRESHOLD]<threshold && // Ausloeser gross genug?
121 objectp(x[SENS_OBJECT]) &&
122 environment(x[SENS_OBJECT])==environment(ob) &&
123 closurep(x[SENS_CLOSURE]))
124 funcall(x[SENS_CLOSURE],
125 ob,key,threshold,opt,x[SENS_OPT]);
126 // Zuerst Trigger-Optionen, dann Optionen des sensitiven Objekts
127}