blob: 2b7032c12be74f078868472df19086f9ec7ebc43 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001
Zesstra953f9972017-02-18 15:37:36 +01002shadow()
3********
MG Mud User88f12472016-06-24 23:31:02 +02004
5
Zesstra953f9972017-02-18 15:37:36 +01006FUNKTION
7========
MG Mud User88f12472016-06-24 23:31:02 +02008
Zesstra953f9972017-02-18 15:37:36 +01009 object shadow(object ob, int flag)
MG Mud User88f12472016-06-24 23:31:02 +020010
MG Mud User88f12472016-06-24 23:31:02 +020011
Zesstra953f9972017-02-18 15:37:36 +010012ARGUMENTE
13=========
MG Mud User88f12472016-06-24 23:31:02 +020014
Zesstra953f9972017-02-18 15:37:36 +010015 object ob - das vom shadow betroffene Objekt
16 int flag - 0 fuer eine Shadow-Existenzabfrage
17 1 fuer Shadow durch previous_object()
MG Mud User88f12472016-06-24 23:31:02 +020018
MG Mud User88f12472016-06-24 23:31:02 +020019
Zesstra953f9972017-02-18 15:37:36 +010020BESCHREIBUNG
21============
MG Mud User88f12472016-06-24 23:31:02 +020022
Zesstra953f9972017-02-18 15:37:36 +010023 Wenn <flag> nicht 0 ist, wird das aktuelle Objekt dem Objekt obj
24 als Shadow uebergeworfen. Bei Erfolg wird das geshadowte Objekt
25 zurueckgegeben, sonst 0.
26 Wenn <flag> 0 ist, wird entweder 0 oder das geshadowte Objekt
27 zurueck gegeben.
MG Mud User88f12472016-06-24 23:31:02 +020028
Zesstra953f9972017-02-18 15:37:36 +010029 Wenn ein Objekt A ein Objekt B beschattet, werden alle call_other() fuer
30 B auf A umgeleitet. Wenn die an B gerufene Funktion in A existiert, so
31 wird sie in A gerufen, bei Nichtexistenz in B.
32 A ist das einzige Objekt, welche die beschatteten Funktionen mit
33 call_other() in B aufrufen kann, selbst B kann nicht per call_other()
34 diese Funktion rufen.
35 Alle intern verwendeten Funktionen arbeiten jedoch weiterhin normal.
MG Mud User88f12472016-06-24 23:31:02 +020036
Zesstra953f9972017-02-18 15:37:36 +010037 Das aufrufende Objekt muss vom Master-Objekt die Erlaubnis haben,
38 als Shadow zu wirken.
MG Mud User88f12472016-06-24 23:31:02 +020039
Zesstra953f9972017-02-18 15:37:36 +010040 Es gibt folgende Kriterien fuer eine erfolgreiche Beschattung:
41 - das zu beschattende Objekt ob:
42 - ist weder ein access_rights-Objekt noch ein ROOT-Objekt
43 - gibt beim Aufruf von query_prevent_shadow(beschatter) eine 0
44 zurueck
45 - beschattet selbst niemanden
46 - hat kein '#pragma no_shadow' gesetzt
47 - der Beschatter:
48 - wird nicht selbst (direkt) beschattet
49 - beschattet noch niemanden (sonst folgt direkter Abbruch)
50 - hat kein environment()
51 - definiert/beschattet keine Methode, die im beschatteten Objekt ob
52 als nomask definiert ist
MG Mud User88f12472016-06-24 23:31:02 +020053
Zesstra953f9972017-02-18 15:37:36 +010054 Beschattet man ein Objekt A mit einem Objekt B und dann das Objekt A
55 zusaetzlich mit einem Objekt C, so wird eine Beschattungshierarchie
56 erstellt:
MG Mud User88f12472016-06-24 23:31:02 +020057
Zesstra953f9972017-02-18 15:37:36 +010058 B macht shadow(A, 1)
59 B->A
60 C macht shadow(A, 1)
61 C->B->A
MG Mud User88f12472016-06-24 23:31:02 +020062
MG Mud User88f12472016-06-24 23:31:02 +020063
Zesstra953f9972017-02-18 15:37:36 +010064BEISPIELE
65=========
MG Mud User88f12472016-06-24 23:31:02 +020066
Zesstra953f9972017-02-18 15:37:36 +010067 // wenn: B beschattet A, dann
68 shadow(find_object(A), 0) == B
MG Mud User88f12472016-06-24 23:31:02 +020069
Zesstra953f9972017-02-18 15:37:36 +010070
71 // 3 Objekte beschatten in Hierarchie (liegt auch im Pfad)
72 --- aa.c ---
73 void fun() {
74 printf("%O [a] fun()\n", this_object());
75 }
76
77 void fun3() {
78 printf("%O [a] fun3()\n", this_object());
79 }
80
81 --- bb.c ---
82 int fun() {
83 printf("%O [b] fun()\n", this_object());
84 find_object("/doc/beispiele/shadow/aa")->fun();
85 }
86
87 void fun2() {
88 printf("%O [b] fun2()\n", this_object());
89 find_object("/doc/beispiele/shadow/aa")->fun3();
90 this_object()->fun3();
91 }
92
93 void do_shadow(object target) { shadow(target, 1); }
94
95 --- cc.c ---
96 int fun() {
97 printf("%O [c] fun()\n", this_object());
98 find_object("/doc/beispiele/shadow/aa")->fun();
99 }
100
101 void fun3() {
102 printf("%O [c] fun3()\n", this_object());
103 }
104
105 void do_shadow(object target) { shadow(target, 1); }
106
107 // darauf arbeitender Code
108
109 object a, b, c;
110
111 destruct("/doc/beispiele/shadow/aa");
112 a = load_object("/doc/beispiele/shadow/aa");
113 destruct("/doc/beispiele/shadow/bb");
114 b = load_object("/doc/beispiele/shadow/bb");
115 destruct("/doc/beispiele/shadow/cc");
116 c = load_object("/doc/beispiele/shadow/cc");
117
118 b->do_shadow(a);
119 c->do_shadow(a);
120 printf("--- a->fun() ---\n");
121 a->fun();
122 printf("--- b->fun() ---\n");
123 b->fun();
124 printf("--- c->fun() ---\n");
125 c->fun();
126 printf("--- b->fun2() ---\n");
127 b->fun2();
128
129 // ... und seine Ausgabe:
130
131 --- a->fun() ---
132 /doc/beispiele/shadow/cc [c] fun()
133 /doc/beispiele/shadow/bb [b] fun()
134 /doc/beispiele/shadow/aa [a] fun()
135 --- b->fun() ---
136 /doc/beispiele/shadow/cc [c] fun()
137 /doc/beispiele/shadow/bb [b] fun()
138 /doc/beispiele/shadow/aa [a] fun()
139 --- c->fun() ---
140 /doc/beispiele/shadow/cc [c] fun()
141 /doc/beispiele/shadow/bb [b] fun()
142 /doc/beispiele/shadow/aa [a] fun()
143 --- b->fun2() ---
144 /doc/beispiele/shadow/bb [b] fun2()
145 /doc/beispiele/shadow/aa [a] fun3()
146 /doc/beispiele/shadow/cc [c] fun3()
147
148 // Der erste Aufruf von b::fun2() in a findet sofort a::fun3()! Der
149 // Driver nimmt an, dass alle Shadows ab c bei Rufen von b nach a
150 // schon ihre Chance hatten.
151 // Der zweite Aufruf allerdings ist auf b und wird beim Durchgeben
152 // an a von c uebernommen.
153
154
155SIEHE AUCH
156==========
157
158 Generell: shadow(E)
159 Rechte: query_allow_shadow(M), query_prevent_shadow(L)
160 Informationen: query_shadowing(E)
161
1628.Aug 2007 Gloinson