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