]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/server/verbstack.qc
Fix a code that was causing digestion to be applied to one prey at a time, rather...
[voretournament/voretournament.git] / data / qcsrc / server / verbstack.qc
1 /// This global gets set to the verb in question each time the stack manager calls verb_call\r
2 entity verb;\r
3 //.entity current_verb;\r
4 //.float verb_done;\r
5 \r
6 /// Execure this verb\r
7 #define VCM_DO     0\r
8 /// Return the value of this verb. Return VS_CALL_REMOVE to delete it.\r
9 #define VCM_EVAL   1\r
10 /// This verb is beeing removed NOW (not sent when verb_call returns VS_CALL_REMOVE)\r
11 #define VCM_REMOVE 2\r
12 \r
13 /// Verb callback\r
14 .float(float message) verb_call;\r
15 \r
16 /// Points to this verb's stack.\r
17 .entity  verbstack;\r
18 \r
19 /// Static value of this verb\r
20 .float verb_static_value;\r
21 \r
22 /// verb_call returns this when a verb in not doable\r
23 #define VS_CALL_NO        0\r
24 /// verb_call(VCM_DO) returns this when a verb is executing\r
25 #define VS_CALL_YES_DOING -1\r
26 /// verb_call(VCM_DO) returns this when a verb did execure and is done\r
27 #define VS_CALL_YES_DONE  -2\r
28 /// verb_call(VCM_DO) returns this when a verb should be deleted by the stack manager\r
29 #define VS_CALL_REMOVE    -3\r
30 \r
31 /*\r
32 void verbstack_updatechain(entity stack)\r
33 {\r
34     entity vrb, v;\r
35     if not (stack)\r
36         return;\r
37 \r
38     dprint("verbstack_updatechain\n");\r
39 \r
40     vrb = findchainentity(verbstack, stack);\r
41     if not (vrb)\r
42     {\r
43         stack.vchain = world;\r
44         return;\r
45     }\r
46 \r
47     stack.vchain = vrb;\r
48     v = vrb;\r
49 \r
50     while(vrb)\r
51     {\r
52         vrb = vrb.chain;\r
53 \r
54 \r
55     }\r
56 }\r
57 \r
58 void verbstack_remove(entity vverb)\r
59 {\r
60     entity vstack;\r
61     dprint("verbstack_remove\n");\r
62 \r
63     vstack = verb.verbstack;\r
64     remove(vverb);\r
65     vverb.verbstack = world;\r
66     verbstack_updatechain(vstack);\r
67 \r
68     //vverb.think = SUB_Remove;\r
69     //vverb.nextthink = time;\r
70 }\r
71 \r
72 void verbstack_thinkremove()\r
73 {\r
74     dprint("verbstack_thinkremove\n");\r
75     verbstack_remove(self);\r
76 }\r
77 */\r
78 \r
79 /**\r
80     Push a new verb onto the specified stack. Set vrb_life to make it time-limited.\r
81 **/\r
82 entity verbstack_push(entity stack, float(float eval) vrb_call, float val_static, float vrb_life,entity verb_owner)\r
83 {\r
84     entity vrb;\r
85 \r
86     if not(stack)\r
87         return world;\r
88 \r
89     if not(vrb_call)\r
90         return world;\r
91 \r
92     vrb                   = spawn();\r
93     vrb.owner             = verb_owner;\r
94     vrb.verbstack         = stack;\r
95     vrb.verb_call         = vrb_call;\r
96     vrb.verb_static_value = val_static;\r
97 \r
98     vrb.classname         = "verb";\r
99     stack.classname       = "verbstack";\r
100 \r
101     if(vrb_life)\r
102     {\r
103         //vrb.think     = verbstack_thinkremove;\r
104         vrb.think     = SUB_Remove;\r
105         vrb.nextthink = time + vrb_life;\r
106     }\r
107 \r
108     //verbstack_updatechain(stack);\r
109 \r
110     return vrb;\r
111 }\r
112 \r
113 /**\r
114     Find the best verb in this stack and execurte it.\r
115     ALso remove any verbs returning VS_CALL_REMOVE on VCM_EVAL or VCM_DO\r
116 **/\r
117 float verbstack_pop(entity stack)\r
118 {\r
119     entity vrb, bestverb, oldself;\r
120     float  value, bestvalue;\r
121 \r
122     oldself = self;\r
123 \r
124     vrb = findchainentity(verbstack,stack);\r
125     //vrb = stack.vchain;\r
126     //dprint("owner:", stack.owner.classname, " vsn:", stack.classname,"\n");\r
127     while(vrb)\r
128     {\r
129         //dprint("vn:", vrb.classname,"\n");\r
130         verb  = vrb;\r
131         vrb   = vrb.chain;\r
132         self  = verb.owner;\r
133         value = verb.verb_call(VCM_EVAL);\r
134 \r
135         if(value < 0)\r
136         {\r
137             if(value == VS_CALL_REMOVE)\r
138                 remove(verb);\r
139         }\r
140         else\r
141         {\r
142             if(value > bestvalue)\r
143             {\r
144                 bestverb  = verb;\r
145                 bestvalue = value;\r
146             }\r
147         }\r
148     }\r
149 \r
150     if(bestverb)\r
151     {\r
152         verb  = bestverb;\r
153         self  = verb.owner;\r
154         value = verb.verb_call(VCM_DO);\r
155 \r
156         if(value == VS_CALL_REMOVE)\r
157             remove(bestverb);\r
158     }\r
159 \r
160     self = oldself;\r
161 \r
162     return value;\r
163 }\r
164 \r
165 float verbstack_popfifo(entity stack)\r
166 {\r
167     entity oldself;\r
168     float ret;\r
169 \r
170     oldself = self;\r
171     verb = findentity(stack,verbstack,stack);\r
172     if not (verb)\r
173         ret = 0;\r
174     else\r
175     {\r
176         self = verb.owner;\r
177         ret = verb.verb_call(VCM_DO);\r
178 \r
179         if(ret == VS_CALL_REMOVE)\r
180             remove(verb);\r
181     }\r
182 \r
183     self = oldself;\r
184     return ret;\r
185 }\r
186 \r
187 /**\r
188     Find the best verb in this stack and return it.\r
189     ALso remove any verbs returning VS_CALL_REMOVE on VCM_EVAL.\r
190 **/\r
191 entity verbstack_pull(entity stack)\r
192 {\r
193     entity vrb;\r
194     entity bestverb, oldself;\r
195     float  value, bestvalue;\r
196 \r
197     oldself = self;\r
198 \r
199     vrb = findchainentity(verbstack,stack);\r
200     while(vrb)\r
201     {\r
202         self = vrb.owner;\r
203 \r
204         verb  = vrb;\r
205         vrb   = vrb.chain;\r
206         value = verb.verb_call(VCM_EVAL);\r
207 \r
208         if(value < 0)\r
209         {\r
210             if(value == VS_CALL_REMOVE)\r
211                 remove(verb);\r
212         }\r
213         else\r
214         {\r
215             if(value > bestvalue)\r
216             {\r
217                 bestverb = verb;\r
218                 bestvalue = value;\r
219             }\r
220         }\r
221     }\r
222 \r
223     self = oldself;\r
224 \r
225     return bestverb;\r
226 }\r
227 \r
228 entity verbstack_pullfifo(entity stack)\r
229 {\r
230     return findentity(stack,verbstack,stack);\r
231 }\r
232 \r
233 /**\r
234     Delete every verb on this stack, signaling them with VCM_REMOVE first.\r
235 **/\r
236 void verbstack_flush(entity stack)\r
237 {\r
238     entity vrb, oldself;\r
239 \r
240     oldself = self;\r
241 \r
242     vrb = findchainentity(verbstack,stack);\r
243     while(vrb)\r
244     {\r
245         self = vrb.owner;\r
246 \r
247         verb = vrb;\r
248         vrb  = vrb.chain;\r
249         verb.verb_call(VCM_REMOVE);\r
250         remove(verb);\r
251     }\r
252 \r
253     self = oldself;\r
254 \r
255     //stack.vchain = world;\r
256 }\r
257 \r
258 void verbstack_doverb(entity vrb)\r
259 {\r
260     float value;\r
261 \r
262     verb  = vrb;\r
263     self  = verb.owner;\r
264     value = verb.verb_call(VCM_DO);\r
265 \r
266     if(value == VS_CALL_REMOVE)\r
267         remove(vrb);\r
268 }\r