blob: a339d273b6486c8a4d17fc337db639a560417e3b [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;
MG Mud User88f12472016-06-24 23:31:02 +020065
66 if (!pointerp(arg))
67 return;
68 for (i=sizeof(arg)-1;i>=0;i--)
69 if (pointerp(x=arg[i]) &&
70 sizeof(x)>=3 &&
71 stringp(x[0]) &&
72 stringp(x[1]) &&
73 intp(x[2])) {
74 InsertSensitiveObjectToList(ob,x[0],x[1],x[2],x[3..]);
75 call_other(ME,SENS_INSERT_PREFIX+x[0],ob,x[1],x[2],x[3..]);
76 }
77}
78
79varargs void insert_sensitive_inv(object ob, string key,
80 int threshold, mixed *opt) {
81 // Diese Funktion sucht, ob beim Hinzufuegen eines sensitiven Objekts
82 // schon ein Objekt da ist, dass dieses ausloest.
83 // z.B. (dynamit, feuer, 100, opt_dynamit) sorgt fuer
84 // dynamit->trigger_sensitive_inv(fackel,feuer,120,opt_fackel,opt_dynamit)
85 // wenn eine Fackel vorher mit Wert 120 eingetragen war.
86 mixed a,x;
87 int i;
88
89 if (!pointerp(a=QueryProp(P_SENSITIVE_INVENTORY_TRIGGER)) ||
90 !objectp(ob))
91 return;
92 for (i=sizeof(a)-1;i>=0;i--)
93 if (pointerp(x=a[i]) &&
94 x[SENS_KEY]==key &&
95 x[SENS_THRESHOLD]>threshold && // Ist der Ausloeser gross genug?
96 objectp(x[SENS_OBJECT]) &&
97 environment(x[SENS_OBJECT])==environment(ob))
98 ob->trigger_sensitive_inv(x[SENS_OBJECT],x[SENS_KEY],x[SENS_THRESHOLD],
99 x[SENS_OPT],opt);
100 // Zuerst Trigger-Optionen, dann Optionen des sensitiven Objekts
101}
102
103varargs void insert_sensitive_inv_trigger(object ob, string key,
104 int threshold, mixed *opt) {
105 // Diese Funktion sucht, ob ein sensitives Objekt im Inventory ist,
106 // das durch dieses Objekt ausgeloest wird.
107 // z.B. (fackel, feuer, 120, opt_fackel) sorgt fuer
108 // dynamit->trigger_sensitive_inv(fackel,feuer,120,opt_fackel,opt_dynamit)
109 // wenn Dynamit mit Wert<120 eingetragen war
110 mixed a,x;
111 int i;
112
113 if (!pointerp(a=QueryProp(P_SENSITIVE_INVENTORY)) ||
114 !objectp(ob))
115 return;
116 for (i=sizeof(a)-1;i>=0;i--)
117 if (pointerp(x=a[i]) &&
118 x[SENS_KEY]==key &&
119 x[SENS_THRESHOLD]<threshold && // Ausloeser gross genug?
120 objectp(x[SENS_OBJECT]) &&
121 environment(x[SENS_OBJECT])==environment(ob) &&
122 closurep(x[SENS_CLOSURE]))
123 funcall(x[SENS_CLOSURE],
124 ob,key,threshold,opt,x[SENS_OPT]);
125 // Zuerst Trigger-Optionen, dann Optionen des sensitiven Objekts
126}